prometheus 服务器抛出数据不以 #EOF 结尾
Posted
技术标签:
【中文标题】prometheus 服务器抛出数据不以 #EOF 结尾【英文标题】:prometheus server throwing data does not end with # EOF 【发布时间】:2021-05-16 07:48:38 【问题描述】:我正在使用此处EXPOSITION FORMATS 指定的基于简单文本的展示格式来展示我的应用程序指标。 我的 http 端点的输出如下
user@host-ubuntu:~/scripts$ curl -X GET http://172.17.0.23:8181/rest/metrics
# HELP my_new_metric my_new_metric
# TYPE my_new_metric gauge
my_new_metriccontainer_id="xyz",container_name="blah",instance="abc",job="blah" 0
user@host-ubuntu:~/scripts$
HELP、TYPE 和 metric 后面有换行符 我的 https 服务器的 java 代码如下
public String metrics()
return "# HELP my_new_metric my_new_metric\n" +
"# TYPE my_new_metric gauge\n" +
"my_new_metriccontainer_id=\"xyz\",container_name=\"blah\",instance=\"abc\",job=\"blah\" 0\n";
但是 Prometheus 服务器正在记录以下警告并且我的指标没有被收集。
level=warn ts=2021-02-12T14:45:16.377Z caller=scrape.go:972 component="scrape manager"
scrape_pool=kubernetes-pods target=http://172.17.0.23:8181/rest/metrics
msg="append failed" err="data does not end with # EOF"
如何将 EOF 添加到我的字符串?我错过了什么明显的东西吗?
【问题讨论】:
我不知道 Prometheus,但在我看来,您正在以# COMMAND argument ...
的形式发送命令,例如您正在发送# HELP
和# TYPE
这两个命令,并且您应该按字面意思理解错误消息,即将它读作data does not end with "# EOF"
,这意味着您需要额外的一行"# EOF\n"
感谢您的建议,但问题是 HTTP 响应标头错误。问题现已解决。
【参考方案1】:
问题是我缺少 REST 接口上的 @javax.ws.rs.Produces(MediaType.TEXT_PLAIN)
注释,并且默认情况下,http 响应标头将响应标记为八位字节字符串。
添加注释后问题得到解决。
【讨论】:
【参考方案2】:添加produces = "text/plain"
:
@GetMapping(value = "/metrics", produces = "text/plain")
【讨论】:
以上是关于prometheus 服务器抛出数据不以 #EOF 结尾的主要内容,如果未能解决你的问题,请参考以下文章
org.eclipse.jetty.io.EofException:上传大文件时抛出早期 EOF
MIME::Lite 在包升级后在命令通道错误上抛出意外的 EOF