
Telegraf Jolokia2 Agent 输入插件实战通过 REST 端点采集 JMX 指标【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegrafTelegraf 的inputs.jolokia2_agent插件通过 HTTP 从 Jolokia Agent 的 REST 端点读取 JMX 指标是监控 JVM 应用Kafka、Cassandra、Tomcat、Hadoop、ZooKeeper 等最直接的采集方案。本文将完整梳理该插件的配置参数、Metric 声明语法、通配符与替换机制并结合仓库源码jolokia2_agent.go 与 plugins/common/jolokia2 公共库解释底层请求构造与点生成原理让读者既能照着配置落地也能理解数据从 MBean 到 Influx 行协议的完整链路。适用版本该插件自 Telegraf v1.5.0 起提供适用于所有平台all插件类别为 applications 与 network。插件定位从 Jolokia Agent 拉取 JMX 数据Jolokia 是一个基于 HTTP/JSON 的 JMX 桥接方案它让非 Java 程序无需理解 RMI/JMX 协议细节就可以通过标准的 REST 请求读取 JVM 内的 MBean 属性。jolokia2_agent 插件 正是 Telegraf 对接该桥接层的方式每个[[inputs.jolokia2_agent.metric]]声明都会被转换为一个 Jolokiaread请求见 client.go 中ReadRequest与jolokiaRequest结构体插件向配置的urls中的每个 Agent 端点批量 POST 这些请求请求 URL 形如http://localhost:8080/jolokia/read并自动附带ignoreErrorstrue查询参数见 client.go 的formatReadURL返回的 JSON 响应在 gatherer.go 中被转换为 Telegraf 指标并通过 Accumulator 交给后续处理器processors、聚合器aggregators和输出端outputs。从源码结构看插件将「请求编排」「客户端」「点构建」拆分为 plugins/common/jolokia2 公共包其中Gatherer、Client、PointBuilder三个组件分别负责上述三个环节jolokia2_proxy插件通过 Jolokia 代理访问内网 JVM也复用同一套实现。基础配置与全局参数# Read JMX metrics from a Jolokia REST agent endpoint [[inputs.jolokia2_agent]] # default_tag_prefix # default_field_prefix # default_field_separator . # Add agents URLs to query urls [http://localhost:8080/jolokia] # username # password # response_timeout 5s ## Optional origin URL to include as a header in the request. Some endpoints ## may reject an empty origin. # origin ## Optional TLS config # tls_ca /var/private/ca.pem # tls_cert /var/private/client.pem # tls_key /var/private/client-key.pem # insecure_skip_verify false ## Add metrics to read [[inputs.jolokia2_agent.metric]] name java_runtime mbean java.lang:typeRuntime paths [Uptime]各参数说明如下对应结构体定义见 jolokia2_agent.go参数默认值说明urls必填Jolokia Agent 的 REST 端点地址列表插件会对每个 URL 并发执行采集见下文并发模型。示例默认http://localhost:8080/jolokiausername/password空访问 Agent 端点的 HTTP 基本认证凭据。源码中会拼入 URL 的 userinfoclient.go 的formatReadURL因此不会出现在日志中避免凭据泄露response_timeout5s请求响应超时同时作用于 HTTP 传输的ResponseHeaderTimeout与http.Client.Timeoutclient.go 的NewClientorigin空作为Origin请求头发送某些端点会拒绝空 Origin需要显式设置tls_ca/tls_cert/tls_key/insecure_skip_verify–访问 HTTPS Agent 时使用的客户端 TLS 配置复用 plugins/common/tls 公共 TLS 能力default_tag_prefix空应用到所有metric声明的 tag 名前缀default_field_prefix空应用到所有metric声明的 field 名前缀default_field_separator.拼接 MBean 属性层次结构时使用的分隔符Metric 配置MBean 到指标声明的映射每个[[inputs.jolokia2_agent.metric]]声明对应一次 Jolokiaread请求用于从特定 JMX MBean 拉取遥测数据。核心字段如下键必填说明mbean是JMX MBean 的对象名ObjectName。属性键值property-key中可以包含通配符*一个声明即可拉取多个 MBeanpaths否要读取的 MBean 属性列表支持属性/子路径形式深入嵌套结构tag_keys否要从 MBean property-key 转换为 tag 的键名列表property-key 名成为 tag 名其值成为 tag 值tag_prefix否为该metric声明产生的 tag 名添加的前缀field_name否设置该指标产生 field 的名称支持$N替换field_prefix否为该metric声明产生的 field 名添加的前缀支持$N替换一个有趣的事实paths是可选的。从源码看gatherer.go 的makeReadRequests不写paths时会请求该 MBean 的全部属性——例如 Cassandra 示例中的java.lang:typeMemory就直接省略了paths。用 paths 精炼采集字段JMX 组合属性composite attribute返回的是嵌套结构paths中用/分隔属性与子路径[[inputs.jolokia2_agent.metric]] name jvm_memory mbean java.lang:typeMemory paths [HeapMemoryUsage, NonHeapMemoryUsage, ObjectPendingFinalizationCount]上述声明产出的指标注意嵌套属性被default_field_separator.展平jvm_memory HeapMemoryUsage.committed4294967296,HeapMemoryUsage.init4294967296,HeapMemoryUsage.max4294967296,HeapMemoryUsage.used1750658992,NonHeapMemoryUsage.committed67350528,NonHeapMemoryUsage.init2555904,NonHeapMemoryUsage.max-1,NonHeapMemoryUsage.used65821352,ObjectPendingFinalizationCount0 1503762436000000000深层路径的写法见 examples/java.conf例如LastGcInfo/duration、LastGcInfo/memoryUsageAfterGc会请求属性LastGcInfo的子路径并逐层拼接成LastGcInfo.duration这样的 field 名point_builder.go 的formatFieldName会把路径中的/替换为分隔符。通配符 mbean 与 tag_keys一个声明产出多条序列当mbean的属性键值使用*通配符时一次请求会命中多个 MBean配合tag_keys可将命中的属性键值固化为 tag从而拆分为不同的序列[[inputs.jolokia2_agent.metric]] name jvm_garbage_collector mbean java.lang:name*,typeGarbageCollector paths [CollectionTime, CollectionCount] tag_keys [name]由于name*同时匹配G1 Old Generation与G1 Young Generation且name被声明为 tag上述声明会产出两条指标jvm_garbage_collector,nameG1\ Old\ Generation CollectionCount0,CollectionTime0 1503762520000000000 jvm_garbage_collector,nameG1\ Young\ Generation CollectionTime32,CollectionCount2 1503762520000000000tag_prefix为 tag 名增加业务语义通配符同时匹配多个属性键时可用tag_prefix区分 tag 来源[[inputs.jolokia2_agent.metric]] name jvm_memory_pool mbean java.lang:name*,typeMemoryPool paths [Usage, PeakUsage, CollectionUsage] tag_keys [name] tag_prefix pool_上述声明会产出 6 条指标堆中各内存池 × 3 个嵌套属性每条都带不同的pool_nametag例如jvm_memory_pool,pool_nameG1\ Old\ Gen CollectionUsage.max1073741824,CollectionUsage.committed0,PeakUsage.max1073741824,PeakUsage.committed1017118720,PeakUsage.init1017118720,PeakUsage.used137032208,Usage.max1073741824,CollectionUsage.init1017118720,Usage.committed1017118720,Usage.init1017118720,Usage.used134708752,CollectionUsage.used0 1503764025000000000替换Substitution把通配符值注入 field 名field_prefix与field_name支持$1、$2形式的替换。替换值的规则为$1是 mbean 中第一个带通配符的 property-key 的实际值$2是第二个实现见 point_builder.go 的makeSubstitutionList——只有含*的 property-key 会进入替换列表applySubstitutions再按$N一一对应替换。例如[[inputs.jolokia2_agent.metric]] name kafka_topic mbean kafka.server:name*,topic*,typeBrokerTopicMetrics field_prefix $1 tag_keys [topic]这里$1代表name的匹配值$2代表topic的匹配值。上述声明为每个 Kafka topic 生成一条指标并将name的匹配值作为 field 前缀把相关字段聚合到同一条指标中kafka_topic,topicmy-topic BytesOutPerSec.MeanRate0,FailedProduceRequestsPerSec.MeanRate0,...Kafka 生产环境的完整玩法见 examples/kafka.conf例如mbean kafka.server:delayedOperation*,name*,typeDelayedOperationPurgatory同时使用field_prefix $1.与field_name $2kafka.log:name*,partition*,topic*,typeLog则用field_name $1并把topic、partition固化为 tag。默认配置作用于所有 metric 声明插件支持对所有metric声明生效的默认配置键默认值说明default_field_separator.拼接 MBean 属性名以生成 field 名时使用的字符default_field_prefix无为所有metric声明产生的 field 名添加前缀default_tag_prefix无为所有metric声明产生的 tag 名添加前缀从源码看默认值在 metric.go 的NewMetric中被应用单个metric声明的field_prefix、field_separator、tag_prefix若未显式设置则回退到对应默认值其中default_field_separator的默认值.在 jolokia2_agent.go 的init()中直接注入结构体。TLS 配置加密访问 Agent当 Agent 端点使用 HTTPS 时可按需配置双向 TLS示例见 sample.conf 注释[[inputs.jolokia2_agent]] urls [https://agent:8080/jolokia] tls_ca /var/private/ca.pem tls_cert /var/private/client.pem tls_key /var/private/client-key.pem #insecure_skip_verify false [[inputs.jolokia2_agent.metric]] name jvm_runtime mbean java.lang:typeRuntime paths [Uptime]TLS 配置由 plugins/common/tls 公共包提供统一支持insecure_skip_verify仅建议在受控环境中使用。请求与响应链路源码级工作流程了解底层实现有助于排查「请求了却没数据」的问题。以 jolokia2_agent.go 的Gather方法为主线整个链路为初始化首次采集时插件把每个metric声明转换为内部Metricmetric.go并为每个 URL 创建 HTTP 客户端含 TLS 与超时配置某个 URL 创建失败不会中断整体采集只会通过acc.AddError上报错误。并发采集对每个clients中的客户端启动一个 goroutine通过sync.WaitGroup等待全部完成——多 Agent 端点之间并行拉取见Gather中wg.Add(1)go func结构。构造请求gatherer.go 的makeReadRequests把paths解析为 Jolokiaread请求无子路径的属性合并为一批请求带/子路径的属性拆分为attribute path形式分别请求。若paths为空则请求该 MBean 的全部属性。发送与解析client.go 将请求 JSON 序列化后 POST 到agent_url/read?ignoreErrorstrue响应 JSON 逐条解析为ReadResponse同时兼容 Jolokia 1.x 的request.target与 2.x 的request.options.target位置。生成点gatherer.go 的generatePoints依据响应状态处理200正常解析404跳过MBean 不存在属正常情况其他状态码记录错误。随后 point_builder.go 的PointBuilder.Build递归展开嵌套值、应用 tag/field 前缀与$N替换。合并与输出同一metric声明的多个点按 tag 集合去重合并compactPoints最后通过acc.AddFields写入 Accumulator并自动附带jolokia_agent_urltag值为 Agent 端点 URL多个代理目标时额外添加jolokia_proxy_url见Gatherer.Gather。单元测试覆盖了上述关键路径例如 jolokia2_agent_test.go 的TestScalarValues用httptest模拟 Agent验证标量值、带属性/子路径的标量值以及mbean:test*通配符拆分多序列的行为。输出示例指标内容完全取决于metric声明。例如采集 JVM 内存池时jvm_memory_pool,pool_nameCompressed\ Class\ Space PeakUsage.max1073741824,PeakUsage.committed3145728,PeakUsage.init0,Usage.committed3145728,Usage.init0,PeakUsage.used3017976,Usage.max1073741824,Usage.used3017976 1503764025000000000 jvm_memory_pool,pool_nameCode\ Cache PeakUsage.init2555904,PeakUsage.committed6291456,Usage.committed6291456,PeakUsage.used6202752,PeakUsage.max251658240,Usage.used6210368,Usage.max251658240,Usage.init2555904 1503764025000000000 jvm_memory_pool,pool_nameMetaspace PeakUsage.init0,PeakUsage.used21852224,PeakUsage.max-1,Usage.max-1,Usage.committed22282240,Usage.init0,Usage.used21852224,PeakUsage.committed22282240 1503764025000000000字段命名遵循field_prefix 属性名( 分隔符 子路径)的规则point_builder.go 的formatFieldName因此上例中每个内存池的Usage、PeakUsage都被展平为多个Usage.*、PeakUsage.*字段。所有指标会自动带上jolokia_agent_urltag便于在多实例场景下区分数据来源。实战配置示例仓库为多种常见中间件提供了开箱即用的示例配置位于 examples 目录包括Java JVMJVM 运行时、内存、GC、线程、类加载、内存池等基础指标含LastGcInfo深层路径示例Kafkacontroller、replica_manager、purgatory、request、topics、partition 等 BrokerTopicMetrics/Log 指标并演示了$1替换、field_name $2、tag_keys组合使用以及多实例时用processors.rename/processors.regex将jolokia_agent_url改写为instancetag 的做法Cassandra通过两个插件实例name_prefix java_与name_prefix cassandra_分别采集 JVM 与 Cassandra 自身指标ActiveMQ、BitBucket、Hadoop-HDFS、JBoss、Kafka Connect、Tomcat、Weblogic、ZooKeeper。这些示例可直接作为配置起点将urls替换为实际 Agent 地址运行telegraf --config 文件 --test即可验证输出。插件也支持 Telegraf 的通用全局配置选项指标改名、tag/field 过滤、别名、插件顺序等详见 docs/CONFIGURATION.md 的 Plugins 章节。使用建议与注意事项合理使用通配符mbean通配符虽能一次声明覆盖多个 MBean但也会扩大请求与序列数量建议用tag_keys精确拆分、用paths收敛字段避免指标基数失控多实例标识jolokia_agent_url是插件自动附加的 tag单机多实例采集时建议参考 Kafka 示例用 processors 将其改写成有业务含义的instancetag响应状态语义404状态MBean 不存在会被静默跳过而其他异常状态会通过 Accumulator 上报错误排查时可结合日志关注非200/404的响应凭据安全用户名密码通过 URL userinfo 传递且不会出现在错误日志中如需更高安全要求可配合 Telegraf 的 SecretStore 能力管理敏感配置。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考