可观测性后端【免费下载链接】metrics:chart_with_upwards_trend: Capturing JVM- and application-level metrics. So you know whats going on.项目地址https://gitcode.com/gh_mirrors/met/metrics点击查看免费下载导读metrics-collectd是 Metrics 生态中专门用于对接 Collectd 的官方集成模块其核心类CollectdReporter允许你的 Java 应用通过 Collectd 二进制协议将MetricRegistry中注册的 Gauge、Counter、Meter、Histogram、Timer 等指标持续流式推送到 Collectd 服务器。读完本文你将掌握完整的接入步骤、CollectdReporter.Builder全量配置项、指标到 Collectd 数据点的映射规则以及基于 HMAC-SHA256 签名与 AES-256 加密的安全上报方案。模块定位让指标流向 CollectdCollectd 是一个系统统计信息采集守护进程system statistics collection daemon它通过插件化方式聚合来自多台主机的数据。metrics-collectd模块提供的 CollectdReporter.java 继承自 Metrics 核心的ScheduledReporter因此具备定时调度上报的能力启动后它会按固定周期扫描注册表将最新指标值打包成 Collectd 二进制数据包经 UDP 发送给 Collectd 服务器由 Collectd 统一存储、转发到 Graphite、InfluxDB 等后端。该模块本身不依赖额外第三方运行时库仅依赖metrics-core与slf4j-api见 metrics-collectd/pom.xml在项目中引入后即可使用dependency groupIdio.dropwizard.metrics/groupId artifactIdmetrics-collectd/artifactId version${metrics.version}/version /dependency快速上手一段最小可用的接入代码原文档给出了完整的最小接入示例它清晰地展示了该模块的典型用法——先用Sender指定 Collectd 服务器地址与端口再通过CollectdReporter.forRegistry(registry)构建器逐项配置最后定时启动final Sender sender new Sender(collectd.example.com, 2007); final CollectdReporter reporter CollectdReporter.forRegistry(registry) .convertRatesTo(TimeUnit.SECONDS) .convertDurationsTo(TimeUnit.MILLISECONDS) .filter(MetricFilter.ALL) .build(sender); reporter.start(1, TimeUnit.MINUTES);对照 CollectdReporter.java 的源码可以进一步理解这段代码的每一层含义new Sender(host, port)封装了到 Collectd 服务器的 UDP 连接。Sender.java 内部使用java.nio.channels.DatagramChannelconnect()时通过InetSocketAddress解析目标地址每次上报时channel.send(buffer, address)发出数据包上报结束后disconnect()关闭通道。forRegistry(registry)返回Builder持有你要上报的MetricRegistry。convertRatesTo(TimeUnit.SECONDS)统一换算速率类指标如每秒请求数、M1/M5/M15 移动平均速率的时间单位。convertDurationsTo(TimeUnit.MILLISECONDS)统一换算时长类指标Timer 的分位数、均值、标准差的时间单位。filter(MetricFilter.ALL)指定上报过滤器MetricFilter.ALL表示注册表中所有指标都上报也可以传入自定义MetricFilter实现白名单/黑名单。build(sender)完成构建。此时如果启用了安全级别但未提供用户名/密码build()会直接抛出IllegalArgumentException见源码第 152-159 行的校验逻辑。reporter.start(1, TimeUnit.MINUTES)从ScheduledReporter继承的调度入口这里表示每隔 1 分钟上报一次start()会同时记录本次上报周期作为 Collectd 数据包中interval字段的来源源码第 216 行将period传入MetaData.Builder。CollectdReporter.Builder 配置项全览除快速上手用到的三个方法外Builder还提供了多个可选项。下表整理了 CollectdReporter.java 中所有配置方法及其默认值配置方法作用默认值withHostName(String)设置数据包中的主机名标识InetAddress.getLocalHost().getHostName()解析失败时回退为localhostscheduleOn(ScheduledExecutorService)指定定时上报使用的线程池ScheduledReporter内部创建的默认线程池shutdownExecutorOnStop(boolean)stop()时是否同时关闭传入的线程池truewithClock(Clock)自定义时钟主要用于测试时控制时间Clock.defaultClock()convertRatesTo(TimeUnit)速率单位换算TimeUnit.SECONDSconvertDurationsTo(TimeUnit)时长单位换算TimeUnit.MILLISECONDSfilter(MetricFilter)指标过滤MetricFilter.ALLdisabledMetricAttributes(SetMetricAttribute)禁用部分属性使其不被上报空集合全部上报withMaxLength(int)指标名最大长度超出部分截断63Sanitize.DEFAULT_MAX_LENGTHwithSecurityLevel(SecurityLevel)安全级别NONE/SIGN/ENCRYPTNONEwithUsername(String)/withPassword(String)签名或加密时使用的凭据空字符串其中withMaxLength与disabledMetricAttributes直接影响了数据到达 Collectd 后的形态详见下文命名净化与指标映射两节。指标类型到 Collectd 数据点的映射规则report()方法源码第 214-240 行会遍历注册表中全部指标把每个指标名作为 Collectd 的plugin插件名并为每个数值属性生成一个type gauge的type-instance数据点。具体映射逻辑见下表对应源码 CollectdReporter.javaMetrics 指标类型映射到 Collectd 的 type-instance说明Gaugevalue只接受Number类型Boolean会转为1/0其他类型如String直接跳过并打 warn 日志Countercount上报计数当前值Metercount、m1_rate、m5_rate、m15_rate、mean_rate计数 四个速率速率经convertRatesTo换算Histogramcount、max、mean、min、stddev、p50、p75、p95、p98、p99、p999快照统计量 各百分位Timer上述 Histogram 全部字段 Meter 全部字段时长类字段经convertDurationsTo换算速率类字段经convertRatesTo换算有两个实现细节值得注意type-instance 直接采用MetricAttribute的 code如m1_rate、p95见writeValue()中attribute.getCode()的调用源码第 256-260 行因此 Collectd 端看到的是统一、稳定的命名。disabledMetricAttributes可裁剪上报字段。例如测试 CollectdReporterTest.java 展示了EnumSet.of(MetricAttribute.M5_RATE, MetricAttribute.M15_RATE)后Meter 只上报count、m1_rate、mean_rate三个数据点可用于减少网络流量。另外测试用例还验证了 Gauge 的兼容性边界byte、short、int、long、float、double均可上报而字符串型 Gauge 不会产生任何数据包CollectdReporterTest.java。collectd 命名规范与 Sanitize 净化Collectd 对指标名有严格的命名约束因此该模块内置了 Sanitize.java 对名称进行净化plugin / type名称保留字符不允许出现-、/、\0空字符plugin-instance / type-instance名称保留字符不允许出现/、\0允许连字符-任何非法字符以及所有非 ASCII 字符c 128都会被替换为下划线_名称长度默认截断到 63 个字符可用withMaxLength调整。例如指标名dash-illegal.slash/illegal会被净化为dash_illegal.slash_illegal测试 CollectdReporterTest.java 同时验证了默认 63 与自定义withMaxLength(20)两种截断行为。底层协议从 ByteBuffer 到 Collectd 二进制包PacketWriter是真正的封包器。PacketWriter.java 按照 Collectd 二进制协议逐段写入HOST、TIME、PLUGIN、PLUGIN_INSTANCE、TYPE、TYPE_INSTANCE、INTERVAL元数据段随后写入VALUES段含值个数、数据类型标记gauge及 64 位双精度浮点数值。每个数据包统一分配 1024 字节的缓冲区数值部分使用小端序写入、头部使用大端序与 Collectd 服务器端解析规则保持一致。该实现同时支撑了两种安全协议签名段SIGNTYPE_SIGN_SHA256 0x0200使用HmacSHA256(password, username || packet)生成 32 字节签名随原始包一起发送保证数据完整性与来源真实性加密段ENCRYPTTYPE_ENCR_AES256 0x0210先用 SHA-1 对数据包求指纹并与包体拼接再用AES_256/OFB/NoPadding以sha256(password)为密钥加密并携带 16 字节随机 IV 与用户名防止传输中被窃听。安全上报NONE / SIGN / ENCRYPT 三级防护SecurityLevel.java 定义了三个枚举值对应无保护、签名、加密三种策略CollectdReporter.forRegistry(registry) .withHostName(app-server-01) .withSecurityLevel(SecurityLevel.ENCRYPT) .withUsername(metrics) .withPassword(s3cret) .build(sender) .start(30, TimeUnit.SECONDS);源码在build()阶段强制执行校验只要securityLevel ! NONEusername与password就必须非空否则抛出IllegalArgumentExceptionCollectdReporter.java。此外模块还提供 SecurityConfiguration.java 作为凭据的封装载体测试类 CollectdReporterSecurityTest.java 与 PacketWriterTest.java 分别验证了签名/加密包的构造与接收方解析。测试验证与进一步探索该模块的测试目录metrics-collectd/src/test/java/com/codahale/metrics/collectd提供了一个基于jcollectd的本地 UDP 接收器Receiver通过CollectdReporterTest等用例在真实端口上完成端到端验证覆盖各类型 Gauge 上报、布尔 Gauge 转换、计数器、Meter 速率、Histogram/Timer 全字段、禁用属性、命名净化与自定义最大长度。如需在本地跑通完整链路可参照测试的用法在本机用Receiver监听 25826 端口模拟 Collectd 服务器再以new Sender(localhost, 25826)构建 reporter 并调用report()或start(...)观察收包情况。生产环境中只需将Sender指向真实的 Collectd 节点默认网络协议端口为 2007并确保 Collectd 开启对应的网络插件与安全配置即可持续接收来自 JVM 与应用的实时指标。赞分享可观测性后端【免费下载链接】metrics:chart_with_upwards_trend: Capturing JVM- and application-level metrics. So you know whats going on.项目地址https://gitcode.com/gh_mirrors/met/metrics点击查看免费下载相关推荐Metrics与Collectd集成系统级与应用级监控联动方案Metrics与Collectd集成系统级与应用级监控联动方案 你是否还在为应用性能问题排查头疼当系统响应变慢时如何快速定位是JVM内存泄漏还是数据库连接可观测性后端上一篇如何用JoyAI-Image-Edit实现精准对象移动完整教程与实战案例下一篇3分钟搞定视频下载告别复杂命令行用Media Downloader轻松下载全网视频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考