Prometheus 和 Node 导出器(以毫秒为单位)

Posted

技术标签:

【中文标题】Prometheus 和 Node 导出器(以毫秒为单位)【英文标题】:Prometheus and Node exporter in milliseconds 【发布时间】:2020-07-05 23:55:03 【问题描述】:

我有一个带有 prom-client 的 node express 应用程序来监视串行连接并将值报告给 http 端点,串行速度是 9600 波特并且正在传输一些统计信息。 Prometheus 实例配置有 10 毫秒间隔的作业,以定位该端点并获取指标。 我希望能够以至少 10 毫秒的分辨率查看此指标,但似乎 Prometheus 图形分辨率不接受小于 1 秒。 我应该怎么做才能让 Prometheus 以至少 10 毫秒的分辨率收集数据。 有我想念的配置吗? 我已经搜索了几个小时

这是我的节点 js 应用程序,串行端口侦听器正在等待 json 消息,解析它们并更新来自“prom-client”的计量指标类型以由 express 表示!

const serialPath = '/dev/tty.usbmodem14201';
const port = new SerialPort(serialPath, 
   baudRate: 9600
);
const parser = new Readline();
port.pipe(parser);
parser.on('data', (line) => 
        try 
            const obj = JSON.parse(line);
            if (obj.command !== undefined) 
                console.log(obj);
            

            if (obj.a) 
                obj.a.forEach((analog) => 
                    analogGuage.set(
                        pin: analog.i
                    , analog.v);
                )
            
         catch (ex) 
            console.log('Exception in parsing serial json:', ex);
            console.log('Exception in parsing serial json:', line);
        
    );

prometheus 每 10 毫秒调用一次的指标端点

    expressApp.get('/metrics', (req, res) => 
        const metrics = client.register.metrics();
        res.set('Content-Type', client.register.contentType);
        res.end(metrics);
    );

重要的是要提到所有这些都是针对实验性个人嵌入式系统 :) 因此,除了能够在 10 毫秒内传输和解析串行读取之外,没有任何瓶颈或性能考虑因素

因为现在 Prometheus 和节点导出器应用程序正在我的 PC 上运行,所以 10 毫秒的间隔对于 Prom 来说似乎很容易。

请帮忙。

回答编辑:所以我决定放弃 Prometheus 而不是 InfluxDB,因为这两个许可证都允许源访问,并且它们促进毫秒、纳秒监控, 但为了将来参考,9600 波特也不够,但仍然在 115200 波特率和 150 毫秒报告循环之后。还是没能显示不到 1 秒, 所以 InfluxDB 做得很漂亮,这里有一些图片: 下面是一个 30 秒的舞会窗口。在 115200 波特

在 InfluxDB 中相同的 115200baud 大约需要 10 秒

【问题讨论】:

您应该从您的 Node Express 应用程序中发布代码或至少部分代码。 @ZachB 你是对的。我猜 OP 将不得不使用 setInterval 之类的东西来发布带有 guage 值的聚合指标。 【参考方案1】:

虽然您可以将抓取间隔设置为小于一秒,但这并不是 Prometheus 的设计初衷,因为那是当时的硬实时监控,例如内核调度程序可能会导致 Prometheus 暂时停止运行并错过一些刮擦,这对于更典型的刮擦间隔不会成为问题。

如果您需要如此高分辨率,我建议您查看自定义解决方案。

【讨论】:

你的意思是 Prometheus 中有一个代码可以聚合不到 1 秒的报告?因为现在有这种方法的所有问题。以约 10 毫秒的间隔进行报废,持续时间为约 2 毫秒。但是数据似乎丢失了,为什么?这是问题 没有数据丢失,但 HTTP API 不是为返回数据而设计的。 我决定放弃 Prometheus,改用 InfluxDB,它承诺纳秒,感谢反馈

以上是关于Prometheus 和 Node 导出器(以毫秒为单位)的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus安装和配置node_exporter监控主机

在 prometheus/grafana 中触发节点导出器的时间戳太旧的警报

来自自定义导出器的 Prometheus 指标显示在 /metrics 中,但不在 /graph (k8s) 中

Kube-Prometheus-Stack 和保护外部节点导出器

Prometheus jmx 导出器模式匹配属性和项目

通过 API(Prometheus)以编程方式将目标添加到 Blackbox Exporter [关闭]