广告服务
此服务根据上下文键确定要为用户投放的适当广告。广告将是商店中提供的产品。
自动仪表化
该服务依赖于 OpenTelemetry Java 代理自动检测 gRPC 等库,并配置 OpenTelemetry SDK。代理通过 -javaagent 命令行参数传递到进程中。命令行参数通过 Dockerfile 中的 JAVA_TOOL_OPTIONS 添加,并在自动生成的 Gradle 启动脚本中使用。
ENV JAVA_TOOL_OPTIONS=-javaagent:/app/opentelemetry-javaagent.jar
追踪
为自动仪表化的 Span 添加属性
在自动仪表化代码的执行过程中,您可以从上下文中获取当前的 Span。
Span span = Span.current();
要将属性添加到 Span,可以使用 Span 对象上的 setAttribute。在 getAds 函数中,向 Span 添加了多个属性。
span.setAttribute("app.ads.contextKeys", req.getContextKeysList().toString());
span.setAttribute("app.ads.contextKeys.count", req.getContextKeysCount());
添加跨度事件
要将事件添加到 Span,可以使用 Span 对象上的 addEvent。在 getAds 函数中,捕获到异常时会添加一个带属性的事件。
span.addEvent("Error", Attributes.of(AttributeKey.stringKey("exception.message"), e.getMessage()));
设置 Span 状态
如果操作结果是错误,则应使用 Span 对象上的 setStatus 相应地设置 Span 状态。在 getAds 函数中,捕获到异常时会设置 Span 状态。
span.setStatus(StatusCode.ERROR);
创建新跨度
可以使用 Tracer.spanBuilder("spanName").startSpan() 创建和启动新的 Span。新创建的 Span 应使用 Span.makeCurrent() 设置到上下文中。getRandomAds 函数将创建一个新的 Span,将其设置为上下文,执行操作,最后结束 Span。
// create and start a new span manually
Tracer tracer = GlobalOpenTelemetry.getTracer("ad");
Span span = tracer.spanBuilder("getRandomAds").startSpan();
// put the span into context, so if any child span is started the parent will be set properly
try (Scope ignored = span.makeCurrent()) {
Collection<Ad> allAds = adsMap.values();
for (int i = 0; i < MAX_ADS_TO_SERVE; i++) {
ads.add(Iterables.get(allAds, random.nextInt(allAds.size())));
}
span.setAttribute("app.ads.count", ads.size());
} finally {
span.end();
}
指标
初始化指标
与创建 Span 类似,创建指标的第一步是初始化 Meter 实例,例如 GlobalOpenTelemetry.getMeter("ad")。然后,使用 Meter 实例上可用的各种构建器方法来创建所需的指标工具,例如:
meter
.counterBuilder("app.ads.ad_requests")
.setDescription("Counts ad requests by request and response type")
.build();
当前生成的指标
请注意,下面所有指标的名称在 Prometheus/Grafana 中显示时,. 字符会被转换为 _。
自定义指标
目前提供以下自定义指标
app.ads.ad_requests:广告请求计数器,具有描述请求是否使用上下文键进行了定位以及响应是定位广告还是随机广告的维度。
自动检测的指标
应用程序可用的自动检测指标如下
日志
广告服务使用 Log4J,它由 OTel Java 代理自动配置。
它将跟踪上下文包含在日志记录中,从而实现日志与跟踪的相关性。