prom-client格式适配Grafana Cloud推送接口的技术咨询
问题解答
一、Grafana Cloud Prometheus推送接口格式说明
你提到的https://prometheus-prod-01-eu-west-0.grafana.net/api/prom/push接口采用Prometheus Remote Write协议,它要求的推送格式不是普通的文本或JSON,而是**Protocol Buffers(Protobuf)**二进制格式。
这个协议的核心结构是WriteRequest,包含多个TimeSeries对象,每个TimeSeries由两部分组成:
labels:键值对形式的标签集合,对应Prometheus指标的标签samples:包含timestamp(纳秒级Unix时间戳)和value(指标数值)的样本数组
由于格式是二进制protobuf,直接用prom-client输出的文本/JSON无法直接推送,你需要使用支持Remote Write的Node.js库来处理序列化和推送,比如prom-remote-write,或者基于Prometheus的protobuf定义自行实现序列化逻辑。
二、将prom-client指标转换为InfluxDB行格式
InfluxDB行格式的语法规则为:
measurement[,tag_key=tag_value...] field_key=field_value[,field_key2=field_value2...] [timestamp]
各部分含义:
measurement:对应Prometheus的指标名称tag:对应Prometheus指标的标签(可选,用于维度分组)field:指标的数值,数值直接填写,字符串需加引号timestamp:纳秒级Unix时间戳(可选,不填则默认使用接收服务器的当前时间)
转换步骤与示例
- 提取指标核心信息:从prom-client的文本输出中,跳过
# HELP和# TYPE注释行,提取实际指标行的名称、标签(如果有)和数值 - 映射为Influx格式:
- 无标签指标:比如
process_cpu_user_seconds_total 0.391,转换后:process_cpu_user_seconds_total value=0.391 1666774055000000000 - 带标签指标:比如
nodejs_active_resources{type="TTYWrap"} 3,转换后:nodejs_active_resources,type=TTYWrap value=3 1666774055000000000 - 直方图指标:比如
nodejs_gc_duration_seconds_bucket{le="0.01",kind="minor"} 1,转换后:nodejs_gc_duration_seconds_bucket,le=0.01,kind=minor value=1 1666774055000000000
- 无标签指标:比如
Node.js实现方式
你可以选择两种路径:
- 使用现成库:比如
prometheus-to-influx,它可以直接解析prom-client输出的指标文本,自动转换为Influx行格式 - 自行编写解析逻辑:通过
register.metrics()获取指标文本后,逐行处理:- 用正则表达式匹配指标名、标签段和数值
- 处理标签的键值对,替换Prometheus的
{key="value"}格式为Influx的key=value格式 - 拼接成符合要求的Influx行字符串
内容的提问来源于stack exchange,提问作者TomFree
相关产品推荐
相关产品推荐

