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

std::getline 在遇到 eof 时抛出

即使 prometheus 源显示变量,也无法在 grafana 中获取数据

意外的EOF;期待元素 <attribute> 的关闭标记

Unexpected EOF 远程主机强迫关闭了一个现有的连接 如何处理