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

前言

在前文中我们已经介绍了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进行二次开发。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
opentelemetry-javaagent.jar 是一个用于自动化和 Java 应用程序的分布式跟踪的工具。我们可以使用自定义 instrument 来扩展其功能。 自定义 instrument 可以帮助我们实现一些自定义的行为,例如,我们可以在代码中插入额外的标记信息,或者在特定的函数或方法中加入额外的追踪逻辑。 要实现自定义 instrument,我们需要进行以下步骤: 1. 创建一个 Java 类,并继承 `OtelInstrumenter` 类。这是一个由 OpenTelemetry 提供的接口,用于定义自定义 instrument 的行为。 2. 在该类中,我们需要实现 `applyInstrumentation` 方法。该方法会被调用来应用自定义的 instrument 到目标应用程序中。 3. 在 `applyInstrumentation` 方法中,我们可以使用 OpenTelemetry 提供的 API 来修改目标应用程序的代码,例如,在特定的函数或方法调用前后插入追踪代码。 4. 编译并打包自定义 instrument 的代码,并将其作为 `-javaagent` 参数传递给 `opentelemetry-javaagent.jar`。当目标应用程序启动时,这个自定义 instrument 会被加载和应用。 通过使用自定义 instrument,我们可以根据自己的需求对目标应用程序的代码进行修改和增强。这样,我们就能够更好地实现跟踪和监控,并获得更加详细和准确的跟踪数据。 总结起来,opentelemetry-javaagent.jar 提供了一种灵活和可扩展的方式来实现自定义 instrument。我们可以通过创建自定义 instrument 类,并在其中实现特定的逻辑来修改目标应用程序的代码,从而实现更精确和详细的分布式跟踪。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值