如何为ActiveMQ Artemis配置OpenTelemetry导出器?以Prometheus为过渡尝试
一、先搞定Prometheus过渡方案的指标抓取问题
1. 修正Prometheus插件类
你现在配置的com.redhat.amq.broker.core.server.metrics.plugins.ArtemisPrometheusMetricsPlugin是Red Hat AMQ专属插件,而你用的是Apache ActiveMQ Artemis,必须换成Apache官方的插件类:
修改broker.xml里的metrics配置段:
<metrics> <jvm-memory>true</jvm-memory> <jvm-gc>true</jvm-gc> <jvm-threads>true</jvm-threads> <netty-pool>true</netty-pool> <file-descriptors>true</file-descriptors> <processor>true</processor> <uptime>true</uptime> <logging>true</logging> <security-caches>true</security-caches> <plugin class-name="org.apache.activemq.artemis.core.server.metrics.plugins.ArtemisPrometheusMetricsPlugin"/> </metrics>
2. 启用Metrics端点
Apache Artemis的Prometheus指标默认通过/metrics路径暴露,但需要确保控制台web应用里启用了metrics模块。检查bootstrap.xml的web配置:
<web bind="http://0.0.0.0:8161" path="web"> <app url="console" war="console.war"/> <app url="metrics" war="metrics.war"/> <!-- 确保这一行存在 --> </web>
如果没有<app url="metrics" war="metrics.war"/>就加上,然后重启broker。
3. 调整Prometheus抓取任务
直接抓取正确的/metrics端点,不要再用Jolokia的JSON接口了:
- job_name: 'activemq-artemis' static_configs: - targets: ['activemq-service:8161'] metrics_path: '/metrics' basic_auth: username: 'admin' password: 'admin'
4. 备选:用Jolokia Exporter转格式
要是不想改broker配置,就得部署jolokia_exporter把Jolokia的JSON转成Prometheus能识别的文本格式:
- 启动exporter:
java -jar jolokia-jvm-1.7.1-agent.jar --host activemq-service --port 8778 --target http://admin:admin@activemq-service:8161/console/jolokia/
- 然后Prometheus抓取这个exporter的端口:
- job_name: 'activemq-jolokia' static_configs: - targets: ['jolokia-exporter:8778']
二、直接导出OpenTelemetry数据(最终方案)
既然最终目标是OTel,不如跳过Prometheus,直接用OpenTelemetry Java Agent采集,和你其他组件的架构对齐。
1. 准备OTel Java Agent
下载和你其他组件版本一致的opentelemetry-javaagent.jar,放到Artemis的部署目录里。
2. 启动Artemis时挂载Agent
如果是裸机部署,修改启动命令:
java -javaagent:/path/to/opentelemetry-javaagent.jar \ -Dotel.service.name=activemq-artemis \ -Dotel.metrics.exporter=otlp \ -Dotel.traces.exporter=otlp \ -Dotel.exporter.otlp.endpoint=http://your-otel-collector:4317 \ -Dotel.exporter.otlp.protocol=grpc \ -jar artemis-run.jar
Docker部署的话,修改Dockerfile或者docker run命令:
FROM apache/activemq-artemis:2.33.0 COPY opentelemetry-javaagent.jar /opt/artemis/ CMD ["java", "-javaagent:/opt/artemis/opentelemetry-javaagent.jar", "-Dotel.service.name=activemq-artemis", "-Dotel.metrics.exporter=otlp", "-Dotel.traces.exporter=otlp", "-Dotel.exporter.otlp.endpoint=http://otel-collector:4317", "-Dotel.exporter.otlp.protocol=grpc", "-jar", "/opt/artemis/bin/artemis-run.jar"]
3. 配置OTel Collector
确保你的OpenTelemetry Collector能接收OTLP数据,示例配置:
receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 processors: batch: exporters: # 根据需求配置后端,比如Prometheus、Jaeger等 prometheus: endpoint: "http://prometheus:9090/api/v1/write" jaeger: endpoint: "jaeger:14250" tls: insecure: true service: pipelines: traces: receivers: [otlp] processors: [batch] exporters: [jaeger] metrics: receivers: [otlp] processors: [batch] exporters: [prometheus]
排查要点
- 访问
/metrics返回404?检查metrics.war是否在Artemis的web目录,或者bootstrap.xml里有没有启用metrics app。 - OTel Agent不生效?确认Agent版本和Artemis的Java版本兼容(Artemis 2.33.0默认用Java 11,Agent支持Java 8+)。
- 网络不通?检查防火墙,确保Artemis能连到OTel Collector,Prometheus能访问Artemis的端口。
内容的提问来源于stack exchange,提问作者svanschalkwyk

