WEBKT

老 Java 应用迁移 OpenTelemetry 的平滑过渡:Log4j 和 JMX 指标的桥接方案

38 0 0 0

在将单体 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。

步骤:

  1. 部署 JMX Exporter: 将 JMX Exporter 作为 Java Agent 附加到遗留应用上。
  2. 配置 JMX Exporter: 定义需要暴露的 JMX 指标。
  3. 配置 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,减少手动配置的工作量。
架构师李工 Java监控微服务迁移

评论点评