
在每家企业里,总有那么一个“遗留系统”: 运行了十几年,从 COBOL 到 Java,不停地打补丁,但从没人敢改。
它也许是银行的账本引擎、工厂的工序调度程序、物流中心的路径算法模块…… 稳定,但封闭;可用,但不可见。
问题是,当它出问题时,你什么都看不见: 系统是否卡死?哪一段代码最耗时?有没有内存泄漏?
完全不可观测,就像在黑暗中驾驶。
而今天我们要做的,是用 OpenTelemetry(简称 OTel), 仅需几条命令,不改一行代码, 就让这个“黑盒子”发光 🔦。
如果你想让一个旧系统具备“可观测性”,但又不能修改源代码, 那么 OpenTelemetry Java Agent(otel-javaagent) 就是你的秘密武器 🧠。
它是一个 自动探针(Auto Instrumentation Agent), 以 .jar 文件形式存在,比如:
opentelemetry-javaagent.jar
当你启动 Java 程序时,只要加上一句参数:
-javaagent:./opentelemetry-javaagent.jar
它就会在程序运行过程中自动注入监控逻辑, 捕获 性能指标、链路追踪、异常信息 等关键信息, 并将这些数据上报给 OpenTelemetry Collector。
📊 无需修改源代码,你就能立刻看到:
为什么它特别适合遗留系统?
因为:
对那些“没人敢动”的旧系统来说,这几乎是唯一的安全选项。
在完全不改动源代码的前提下,快速了解系统的运行健康状况。
我们利用 opentelemetry-javaagent 给 JVM 加上监控功能,只需设置环境变量:
# — 基础系统健康配置 —
export OTEL_SERVICE_NAME=legacy-part-processor
export OTEL_METRICS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4317
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_INSTRUMENTATION_RUNTIME_TELEMETRY_JAVA8_ENABLED=true
# 将 agent 附加到 JVM 启动参数里
export _JAVA_OPTIONS="-javaagent:./opentelemetry-javaagent.jar"
完成后,直接运行你的旧程序:
./legacy_app
你仍能看到原来的日志输出,例如:
[C Wrapper] Reading new Part ID: 3035
[Java Processor] Received Part ID 3035.
[Java Processor] Part ID 3035 processed successfully.
说明应用依旧正常运行。 此时,OTel Agent 正在后台收集数据。
OpenTelemetry Agent → Collector → Prometheus → Grafana
你可以在 Grafana 中创建基础监控面板(Dashboard),包含:
这样,你就能回答关键问题:
到这里,黑盒系统至少有了“生命体征”。
仅有健康指标还不够,我们还要知道: 业务处理性能到底怎样?是否存在瓶颈?
假设核心逻辑在 processData() 方法里, 我们希望测量它的耗时、调用频率与错误率。
在环境变量中加入:
export OTEL_TRACES_EXPORTER=otlp
export OTEL_INSTRUMENTATION_METHODS_INCLUDE="LegacyJavaProcessor[processData]"
这表示: 👉 自动为 LegacyJavaProcessor 类中的 processData() 方法创建追踪片段(span)。
重启应用后,追踪数据会进入 Collector, 并通过 spanmetrics 转化为指标,最后在 Grafana 中展示:
哪怕只有一点点可见性,也比彻底的盲区强得多。
通过简单地引入 opentelemetry-javaagent, 你就能做到:
✅ 零代码改动 ✅ 快速可视化系统健康状况 ✅ 自动追踪性能瓶颈 ✅ 降低运维风险,为未来重构积累数据
OpenTelemetry 不是只有“云原生”才能用。 它也能帮我们一点点地理解、修复、改进那些看似不可触碰的旧系统。(这也是为什么现在单体应用又有取代微服务的趋势的原因之一)
让可观测性从“新系统标配”, 变成“遗留系统的救命稻草”。
原文作者Lukasz Ciukaj (Splunk) | Thursday, September 04 2025https://opentelemetry.io/blog/2025/opentelemetry-for-legacy-app/