使用Mimir remote-write接口遇err-mimir-missing-metric-name错误求助
使用Mimir Remote Write上报自定义指标时遇到
err-mimir-missing-metric-name错误 已在标签列表中包含__name__: example_metric,但仍收到该错误,无法定位问题。
操作步骤
- 下载三个proto文件:mimir.proto、gogoproto/gogo.proto、google/protobuf/descriptor.proto
- 安装编译工具:
npm install -g protoc-gen-js,执行编译命令:protoc --js_out=import_style=commonjs,binary:. mimir.proto gogo.proto descriptor.proto生成CommonJS模块 - 从
mimir_pb.js导入WriteRequest,构造包含uuid、status标签的example_metric指标请求对象 - 调用
serializeBinary序列化,用snappy压缩后发送POST请求,请求头如下:"Content-Encoding": "snappy" "Content-Type": "application/x-protobuf" "X-Prometheus-Remote-Write-Version": "0.1.0"
序列化前的WriteRequest对象
{ "timeseriesList": [ { "labelsList": [ { "name": "__name__", "value": "example_metric" }, { "name": "status", "value": "up" }, { "name": "uuid", "value": "c4a1d53b-454e-434d-8f93-11f0e9e0d10a" } ], "samplesList": [ { "timestampMs": 1735044676736, "value": 1.1 } ], "exemplarsList": [], "histogramsList": [] } ], "source": 0, "metadataList": [ { "type": 0, "metricFamilyName": "example_metric", "help": "", "unit": "" } ], "skipLabelValidation": false, "skipLabelCountValidation": false }
环境信息
- libprotoc 3.21.12
- Ubuntu 24
- NodeJS v18.20.5
问题解答
1. 是否存在操作疏漏导致无法成功上报?
有几个潜在疏漏点:
- Proto字段命名错误:你构造的对象中使用
timeseriesList、labelsList这类字段名,需确认是否与proto定义完全匹配。Mimir的WriteRequest中时间序列字段为timeseries,gogo protobuf生成的JS代码中,重复字段的访问器是getTimeseriesList()/setTimeseriesList(),但构造对象时应直接用timeseries而非timeseriesList。字段名错误会导致序列化后服务端无法解析标签数据,触发缺失__name__的错误。 - Metadata字段干扰:请求中加入的
metadataList可能干扰指标解析,尝试移除该字段后重新测试。 - Snappy压缩异常:若压缩过程损坏protobuf数据,服务端无法解析标签也会返回错误。可先去掉
Content-Encoding头,不压缩发送请求,验证序列化后的protobuf本身是否有效。
2. 如何定位问题在客户端还是服务端?
- 客户端验证:
- 将序列化后的protobuf数据保存到文件,用
protoc --decode=mimirpb.WriteRequest mimir.proto命令解码,检查输出是否包含正确的__name__标签。若解码后看不到标签,说明客户端序列化过程有问题。 - 使用官方Prometheus remote write客户端发送相同指标,若能成功上报,说明自定义客户端存在问题。
- 将序列化后的protobuf数据保存到文件,用
- 服务端验证:
- 查看Mimir的
distributor组件日志,开启debug级别日志后,会打印请求的详细解析信息,包括是否解析到__name__标签。 - 用tcpdump或wireshark抓包,解码原始请求数据,确认服务端收到的数据包中是否包含
__name__标签。若抓包能看到标签但服务端仍报错,说明服务端验证逻辑或配置有问题。
- 查看Mimir的
3. 能否在Mimir内部调试请求消息以了解验证逻辑?
可以通过以下方式调试:
- 开启Debug日志:修改Mimir配置,将
distributor组件的日志级别设为debug,重启服务后,日志会输出每个WriteRequest的标签提取、验证等详细过程。 - 修改Mimir代码:若能编译Mimir,可在
pkg/distributor/write_handler.go和pkg/mimirpb/validate.go文件的验证逻辑中添加额外日志,打印当前处理的标签列表,明确验证失败的原因。 - 启用调试端点:部分Mimir版本提供
/debug/pprof或/api/v1/status等端点,开启相关配置后可查看请求处理状态。
内容的提问来源于stack exchange,提问作者Alex Bondarev
相关产品推荐
相关产品推荐

