如何为OpenTelemetry hostmetricsreceiver添加自定义动态属性
问题1:attributesprocessor能否实现动态添加进程启动时间属性?
不能。
attributesprocessor的核心能力是对采集完成后已经附着在遥测数据上的属性做规则处理:包括注入固定静态值、对已有属性做重命名/正则提取/删除、按匹配条件过滤属性等,但它本身不具备主动采集系统动态运行时数据的能力,无法根据每条数据携带的进程PID实时查询系统获取对应进程的启动时间,因此满足不了这类动态属性的注入需求。
问题2:如何基于现有receiver新增这类动态采集的自定义属性?
按改造成本从低到高,有三种可落地的方案:
- 直接使用process scraper内置的进程启动时间指标
目前正式发布版本的hostmetrics process scraper默认就会采集process.start_time指标,该指标和进程PID一一绑定,值为进程启动的Unix时间戳(秒级精度)。你当前贴的最简配置运行后,在debug级别的日志输出里就能找到每个进程对应的这个指标,如果你的场景不强制要求把启动时间放在Resource属性段,直接用这个内置指标即可,不需要修改任何配置。 - 通过transform processor将内置指标转换为Resource属性
如果你必须把启动时间作为Resource属性附着在该进程的所有指标上,可以在采集管道中加入transform processor,编写简单的转换逻辑:以process.pid作为关联键,将同PID下process.start_time的指标值提取出来,设置为对应Resource的process.start_time属性即可,全程不需要额外开发。 - 开发轻量自定义processor实现定制化采集
如果内置process.start_time指标的精度、取值逻辑不符合你的业务要求,可以基于OpenTelemetry Collector的processor扩展接口开发一个轻量自定义processor:逻辑非常简单,拿到每条数据携带的process.pid属性后,调用对应操作系统的原生接口(Linux读取/proc/[pid]/stat下的进程启动字段、Windows调用系统进程查询接口、macOS调用libproc相关接口)拿到进程启动时间,再将值注入到Resource属性中即可。
注意不要用exec类接收器/处理器调用外部命令获取启动时间,分钟级采集的场景下这类方案的额外开销高,稳定性也差。
内容的提问来源于stack exchange,提问作者Keval Bhogayata
相关产品推荐
相关产品推荐

