如何不使用instrumentation通过OpenTelemetry手动采集JVM与系统指标
OpenTelemetry 手动采集JVM及宿主机指标方案
实现逻辑
OpenTelemetry 原生提供了独立的JVM、系统指标采集扩展,完全不需要依赖自动Instrumentation埋点能力,你可以100%自主控制需要采集的指标范围、维度、采集频率,使用逻辑和你之前熟悉的Micrometer自定义Binder注册模式高度一致,适配成本极低。
具体操作步骤(以Java栈为例)
- 第一步:引入独立的指标扩展依赖,不需要引入任何自动埋点相关的包,扩展包内预置了全量的JVM、宿主机指标采集实现,包括内存、GC、类加载、CPU、磁盘、网络、进程状态等所有Micrometer支持的同类指标。
- 第二步:初始化MeterProvider时按需注册采集器,你想要采集哪些指标就注册对应的采集器实例,不需要的完全不用开启,避免冗余指标产生。同时可以给注册的采集器自定义全局标签、指标过滤规则,完全匹配你的自定义测量需求。
- 第三步:配置对应指标导出器,采集到的指标可以按你的需求导出到Prometheus、OTel Collector等任意后端,原有Micrometer体系下的Grafana大盘只需要做少量指标名映射就可以直接复用。
示例代码
// 初始化MeterProvider SdkMeterProvider meterProvider = SdkMeterProvider.builder() // 配置指标导出规则,示例为暴露Prometheus端口拉取 .registerMetricReader(PeriodicMetricReader.create(PrometheusHttpServer.create(9464))) // 按需注册需要的采集器,不需要的直接注释即可 .register(new JvmMemoryMetrics()) // JVM内存指标 .register(new JvmGcMetrics()) // GC相关指标 .register(new SystemCpuMetrics()) // 宿主机CPU指标 .register(new ProcessCpuMetrics()) // 应用进程CPU指标 .register(new DiskMetrics()) // 磁盘相关指标 .build(); // 绑定到OpenTelemetry实例 OpenTelemetry otel = OpenTelemetrySdk.builder() .setMeterProvider(meterProvider) .buildAndRegisterGlobal();
其他语言栈的实现逻辑完全一致,官方均提供了对应语言的系统指标独立扩展包,均支持手动注册采集器的用法,不需要接入自动埋点能力。
内容的提问来源于stack exchange,提问作者dsinczak
相关产品推荐
相关产品推荐

