老 Java 应用迁移 OpenTelemetry 的平滑过渡:Log4j 和 JMX 指标的桥接方案
在将单体 Java 应用拆分为微服务并迁移到 Kubernetes 的过程中,可观测性是一个至关重要的环节。对于新服务,我们可以轻松地使用 Spring Boot + Prometheus + Zipkin 构建完善的监控体系。然而,遗留系统往往还在使用 Log4j 和自定义 JMX 指标,这给统一监控带来了挑战。本文将探讨如何将这些遗留系统无缝集成到 OpenTelemetry 生态中,实现新旧服务的可观测性统一。
问题:新旧监控体系的割裂
新服务采用 OpenTelemetry,数据格式和采集方式与旧服务基于 Log4j 和 JMX 的监控体系格格不入。这导致:
- 监控数据孤岛: 无法在同一个面板中查看所有服务的指标和追踪信息。
- 运维复杂性增加: 需要维护两套不同的监控系统。
- 排错困难: 跨服务调用链的追踪变得复杂,难以定位性能瓶颈。
解决方案:桥接 Log4j 和 JMX 指标到 OpenTelemetry
为了解决这个问题,我们需要找到一种方法,将 Log4j 的日志和 JMX 指标转换为 OpenTelemetry 能够理解的数据格式,并将其发送到 OpenTelemetry Collector。以下是两种常用的方法:
1. Log4j -> OpenTelemetry:使用 Log4j Appender
可以编写一个自定义的 Log4j Appender,将日志事件转换为 OpenTelemetry 的 Span 或 Event,并将其发送到 OpenTelemetry Collector。
- 优点: 无需修改现有代码,只需添加 Appender 配置。
- 缺点: 需要编写自定义 Appender,有一定的开发工作量。
示例 (伪代码):
public class OpenTelemetryAppender extends AppenderSkeleton {
private OtlpGrpcSpanExporter exporter;
@Override
protected void append(LoggingEvent event) {
Span span = Tracer.getDefaultTracer().spanBuilder(event.getLoggerName()).startSpan();
span.addEvent(event.getRenderedMessage());
span.end();
}
@Override
public void close() {
exporter.shutdown();
}
@Override
public boolean requiresLayout() {
return false;
}
}
配置 log4j.xml:
<appender name="OpenTelemetry" class="com.example.OpenTelemetryAppender">
</appender>
<root>
<level value="INFO" />
<appender-ref ref="OpenTelemetry" />
</root>
2. JMX -> OpenTelemetry:使用 OpenTelemetry Collector JMX Metric Receiver
OpenTelemetry Collector 提供了一个 JMX Metric Receiver,可以定期从 JMX Exporter 获取指标数据,并将其转换为 OpenTelemetry 的 Metric。
- 优点: 利用 OpenTelemetry Collector 的强大功能,简化数据采集流程。
- 缺点: 需要部署 JMX Exporter,并配置 OpenTelemetry Collector。
步骤:
- 部署 JMX Exporter: 将 JMX Exporter 作为 Java Agent 附加到遗留应用上。
- 配置 JMX Exporter: 定义需要暴露的 JMX 指标。
- 配置 OpenTelemetry Collector: 使用 JMX Metric Receiver 接收 JMX Exporter 的数据。
OpenTelemetry Collector 配置示例:
receivers:
jmx:
endpoint: "localhost:5555" # JMX Exporter 暴露的端口
# ... 其他配置
processors:
batch:
exporters:
prometheus:
endpoint: "0.0.0.0:8889" # Prometheus 抓取数据的端口
service:
pipelines:
metrics:
receivers: [jmx]
processors: [batch]
exporters: [prometheus]
总结
通过 Log4j Appender 和 OpenTelemetry Collector JMX Metric Receiver,我们可以将遗留 Java 应用的 Log4j 日志和 JMX 指标桥接到 OpenTelemetry 生态中,实现新旧服务的可观测性统一。 这为后续的微服务迁移和 Kubernetes 部署奠定了坚实的基础,提升了运维效率和问题排查能力。 在实际操作中,还需要根据具体的应用场景和监控需求进行调整和优化。例如,可以考虑使用 OpenTelemetry 的 SDK 来直接收集指标和追踪数据,而不是依赖 Log4j 和 JMX。
下一步
- 深入研究 OpenTelemetry Collector 的配置选项,以满足更复杂的数据采集需求。
- 探索使用 OpenTelemetry 的 Trace Context Propagation,实现跨服务调用链的追踪。
- 考虑使用 OpenTelemetry 的 Agent 自动进行 instrumentation,减少手动配置的工作量。