在前文中我们已经介绍了OpenTelemetry
的种种使用方式,然后真的当大家们自己接入的时候可能会有这样的问题“接入调用链需要引入 sdk,我们线上应用这么多要改到猴年马月啊”,然后不禁开始怀疑起了人生,然后对于接入调用链也没有最开始那么积极。
确实如上面所说 SDK 的形式很多时候对于已经在线上稳定运行的应用来说是一个不小的改造负担,不仅麻烦而且后续升级困难,如果 SDK 有 bug,后续的修复也成为了难题。但是调用链技术发展到当下已经比较成熟了,对于 Java 来说,Java Agent 技术就可以帮助实现调用链的无侵入式接入。
Java Agent
一般可以被称为探针,是一种可以在 Java 应启动前和运行中修改应用的字节码的技术。通过在启动项中添加-javaagent:path/to/agent.jar
来制定使用特定的 Agent。
使用Java Agent
可以无侵入式的对应用代码进行修改,而应用本身可以不用进行任何的修改。而且因为Java Agent
是基于字节码的修改,因此非常适合应用在 AOP 的领域。具体的Java Agent
的细节就不在此讨论了,后续大家有兴趣我可以另写一篇相关的介绍文章。
opentelemetry-java-instrumentation是一个隶属于 OpenTelemetry 系列的项目,这个项目就是一个基于Java Agent
来实现无侵入式OpenTelemetry
接入的官方 Agent 项目。使用方法非常简单:
java -javaagent:path/to/opentelemetry-javaagent.jar -jar myapp.jar
复制代码
将opentelemetry-javaagent.jar
下载下来,然后使用上述指令就能够运行,在启动成功后OpenTelemetry
就能够直接接入成功,而不用对应用本身的代码进行任何的修改。
虽然只要接入 Agent 然后简单启动就算是接入成功了,但是实际上这样是远远不够的。需要进行一些配置来让我们的调用链能够完成完整的接入。
首先我们在前面的文章里面提到过了,客户端产生的数据最终还是要发送到服务端的采集器进行统一收集整理,这样才能够处理出完整的调用链的信息。因此实际上我们需要在客户端配置服务端Collector
的地址。
Agent 内部默认的 collector 地址是http://localhost:4317
,我们配置自己的采集器地址。
Trace
,Metrics
和Logs
的采集器地址均可以自行配置,在此处我们以Trace
配置来举例:
otel.traces.exporter
用来配置数据输出的exporter
,此处默认是otlp
,但是jaeger
,zipkin
等等也在支持的范围之内,可以根据自己的需求进行配置。
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
简单理解为插件。
Agent 的调用链的强大的采集数据能力说白了就是一个又一个的Instrumentation
来支撑起来的。每一个不同的 SDK 都需要定制Instrumentation
来支持其调用链的能力。OpenTelemetry
丰富的Instrumentation
库为完整的调用链能力赋予了巨大的可用性。这个是目前支持的库的列表
如果你想要在日志中直接绑定并且看到TraceId
和SpanId
可以借助Logger
的MDC
能力。
在 Agent 中默认开启了日志的Instrumentation
组件,其中的MDC
相关组件实现了 trace 信息传递的能力,因此可以直接使用%mdc{trace_id} %mdc{span_id} %mdc{trace_flags}
来输出 trace 的相关信息。
例如在 logback 中可以这么写(%mdc
和%X
等价):
复制代码
在这个篇章中我们简单的介绍了OpenTelemetry Java Instrumentation
的使用,实际上这个项目支持了不少自定义的扩展能力。在下一个篇章中,会着重介绍如何在OpenTelemetry Java Instrumentation
进行二次开发。