写点什么

OpenTelemetry 系列 (四)| 如何使用 Java Agent 来实现无侵入的调用链

作者:骑牛上青山
  • 2022-12-25
    上海
  • 本文字数:1898 字

    阅读完需:约 6 分钟

前言

在前文中我们已经介绍了OpenTelemetry的种种使用方式,然后真的当大家们自己接入的时候可能会有这样的问题“接入调用链需要引入 sdk,我们线上应用这么多要改到猴年马月啊”,然后不禁开始怀疑起了人生,然后对于接入调用链也没有最开始那么积极。


确实如上面所说 SDK 的形式很多时候对于已经在线上稳定运行的应用来说是一个不小的改造负担,不仅麻烦而且后续升级困难,如果 SDK 有 bug,后续的修复也成为了难题。但是调用链技术发展到当下已经比较成熟了,对于 Java 来说,Java Agent 技术就可以帮助实现调用链的无侵入式接入。

Java Agent

什么是 Java Agent

Java Agent一般可以被称为探针,是一种可以在 Java 应启动前和运行中修改应用的字节码的技术。通过在启动项中添加-javaagent:path/to/agent.jar来制定使用特定的 Agent。

Java Agent 的优势

使用Java Agent可以无侵入式的对应用代码进行修改,而应用本身可以不用进行任何的修改。而且因为Java Agent是基于字节码的修改,因此非常适合应用在 AOP 的领域。具体的Java Agent的细节就不在此讨论了,后续大家有兴趣我可以另写一篇相关的介绍文章。

OpenTelemetry Java Instrumentation

介绍

opentelemetry-java-instrumentation是一个隶属于 OpenTelemetry 系列的项目,这个项目就是一个基于Java Agent来实现无侵入式OpenTelemetry接入的官方 Agent 项目。使用方法非常简单:


java -javaagent:path/to/opentelemetry-javaagent.jar -jar myapp.jar
复制代码


opentelemetry-javaagent.jar下载下来,然后使用上述指令就能够运行,在启动成功后OpenTelemetry就能够直接接入成功,而不用对应用本身的代码进行任何的修改。

启动项参数配置

虽然只要接入 Agent 然后简单启动就算是接入成功了,但是实际上这样是远远不够的。需要进行一些配置来让我们的调用链能够完成完整的接入。

collector 地址

首先我们在前面的文章里面提到过了,客户端产生的数据最终还是要发送到服务端的采集器进行统一收集整理,这样才能够处理出完整的调用链的信息。因此实际上我们需要在客户端配置服务端Collector的地址。


Agent 内部默认的 collector 地址是http://localhost:4317,我们配置自己的采集器地址。


TraceMetricsLogs的采集器地址均可以自行配置,在此处我们以Trace配置来举例:


  • otel.traces.exporter用来配置数据输出的exporter,此处默认是otlp,但是jaegerzipkin等等也在支持的范围之内,可以根据自己的需求进行配置。

  • otel.exporter.otlp.trace.endpoint用来配置具体的采集端点地址,注意此配置仅生效于otlp,如果是jaeger等其他,需要自行使用其他配置。一般来说的话:gRPC协议使用4317端口,http协议使用4318端口(建议使用gRPC

  • otel.metrics.exporter这个是metrics的配置,在此处必须要特地提醒一下,在旧版本中这个值默认为none,即不开启。但是在较新的版本中这个值默认变成了otlp,因此需要提醒下如果不需要metrics的能力,需要在新版本中将这个值手动设置为none

服务名

使用otel.service.name来配置服务的名称,此名称会在后续多次被使用到,最好进行正确的配置。

插件的开启与关闭

使用otel.instrumentation.*.enabled可以配置插件的开启与关闭,例如:otel.instrumentation.kafka.enabled可以用来配置 kafka 组件的开关。在 Agent 中内置了大量的Instrumentation(可以理解为插件或者仪器),这部分插件并不一定你全都想要,因此使用这个配置可以自定义你需要使用到的插件列表。


上述列举的都是一些你必须要重点关注到的配置,如果需要进行更多的拓展,开启更多的功能,使用更多的配置,可以参考文档

instrumentation

我们可以把instrumentation简单理解为插件。


Agent 的调用链的强大的采集数据能力说白了就是一个又一个的Instrumentation来支撑起来的。每一个不同的 SDK 都需要定制Instrumentation来支持其调用链的能力。OpenTelemetry丰富的Instrumentation库为完整的调用链能力赋予了巨大的可用性。这个是目前支持的库的列表

Logger MDC

如果你想要在日志中直接绑定并且看到TraceIdSpanId可以借助LoggerMDC能力。


在 Agent 中默认开启了日志的Instrumentation组件,其中的MDC相关组件实现了 trace 信息传递的能力,因此可以直接使用%mdc{trace_id} %mdc{span_id} %mdc{trace_flags}来输出 trace 的相关信息。


例如在 logback 中可以这么写(%mdc%X等价):


<property name="pattern" value="%d [%thread] %-5p [%c] [%F:%L] [trace=%X{trace_id:-},span=%X{span_id:-}] - %msg%n"/>
复制代码

总结

在这个篇章中我们简单的介绍了OpenTelemetry Java Instrumentation的使用,实际上这个项目支持了不少自定义的扩展能力。在下一个篇章中,会着重介绍如何在OpenTelemetry Java Instrumentation进行二次开发。


发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2021-05-18 加入

还未添加个人简介

评论

发布
暂无评论
OpenTelemetry系列 (四)| 如何使用Java Agent来实现无侵入的调用链_Java_骑牛上青山_InfoQ写作社区