查看!使用Node-RED可视化Prometheus的指标

你好,我是@dz_,我叫大平和美。

这是Node-RED Advent Calendar 2017的第11天文章。

序言 – 开篇

由于Node-RED的仪表板简便实用,我尝试将其用于基础设施监控!

我会使用Node-RED接收 Prometheus 的度量并进行可视化,尝试一下与Grafana结合是标准做法。(只提供一种选项)

代码示例

我把这次写的代码发布在这里了。我们将以这段代码为基础继续讨论。

    dzeyelid/nodered-prometheus-sample

准备

在 Docker 上设置环境

由于Node-RED和Prometheus均提供Docker镜像,我们将使用它们。

    • Node-RED : Running under Docker

 

    Using Docker – Installation | Prometheus

我使用docker-compose配置了这些。

version: "3"
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./docker/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
  nodered:
    image: nodered/node-red-docker
    container_name: nodered
    volumes:
      - ./data:/data
      - ./nodes:/nodes
    ports:
      - "1880:1880"
    links:
      - prometheus

prometheus.yml 是 Prometheus 的配置文件,参考这个 Getthing Started 的内容而来。

    Configuring Prometheus to monitor itsel – Getting started | Prometheus

当准备完以上的内容后,会启动容器实例。

docker-compose up -d

现在,您可以访问Node-RED编辑器和Prometheus的简易GUI。

項目URLNode-RED エディタhttp://localhost:1880Prometheus の簡易GUIhttp://localhost:9090

准备Node-RED仪表板。

之后,为了能够使用Node-RED的仪表板功能,您可以通过「工具箱管理」>「添加节点」选项,添加node-red-dashboard节点。

    node-red-dashboard – Node-RED

理解 Prometheus 的度量指标。

Promeheus 使用一个称为Exporter 的组件来收集指标数据。有关数据格式的详细信息请参考此处。

    Text format details – Exposition formats | Prometheus

大致理解的情况是这样的。

metric_name{label_name1="label_value1", label_name2="label_value2", ... } value

标签可以嵌套,还有一些带有时间戳的模式,但我将省略它们。

创建一个简化版的流程。

首先,我尝试建立了一个简单的流程。您可以选择任意的指标并将其可视化。

    1. 在中国本地化时可以这样翻译:

使用inject节点进行定期执行
使用http request节点获取Prometheus的指标数据
使用split节点将数据按行分割,并使用switch节点根据想要获取的参数选择指标数据
通过组合split和switch节点获取指标数据
将数据输入到仪表盘的ui_chart节点中

样本流程

这是一个表示 Prometheus 自身发出的 go_goroutines 指标在仪表盘上展示的样本代码。

[{"id":"e8b15b7b.923128","type":"inject","z":"8f3a7677.4b1d08","name":"","topic":"","payload":"","payloadType":"date","repeat":"10","crontab":"","once":false,"x":132.00000762939453,"y":239.00003242492676,"wires":[["7b270a3d.128be4"]]},{"id":"7b270a3d.128be4","type":"http request","z":"8f3a7677.4b1d08","name":"","method":"GET","ret":"txt","url":"http://prometheus:9090/metrics","tls":"","x":318.00001525878906,"y":238.76392364501953,"wires":[["af09abb4.c607f8"]]},{"id":"af09abb4.c607f8","type":"split","z":"8f3a7677.4b1d08","name":"split by \\n","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":147.0000114440918,"y":313.33336544036865,"wires":[["579d6691.276068"]]},{"id":"40e71a0.454c7e8","type":"debug","z":"8f3a7677.4b1d08","name":"","active":true,"console":"false","complete":"true","x":333.00000381469727,"y":513.444465637207,"wires":[]},{"id":"579d6691.276068","type":"switch","z":"8f3a7677.4b1d08","name":"get go_goroutiens","property":"payload","propertyType":"msg","rules":[{"t":"regex","v":"^go_goroutines .*$","vt":"str","case":false}],"checkall":"true","outputs":1,"x":336.38890838623047,"y":313.2222099304199,"wires":[["b058c01d.d3354"]]},{"id":"b058c01d.d3354","type":"split","z":"8f3a7677.4b1d08","name":"split by space","splt":" ","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":166.3888931274414,"y":388.2222385406494,"wires":[["cc0b7c3f.10cc6"]]},{"id":"cc0b7c3f.10cc6","type":"switch","z":"8f3a7677.4b1d08","name":"get index[1]","property":"parts.index","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"num"}],"checkall":"true","outputs":1,"x":156.38890838623047,"y":457.2222385406494,"wires":[["ddbb5c4f.b44eb","40e71a0.454c7e8"]]},{"id":"ddbb5c4f.b44eb","type":"ui_chart","z":"8f3a7677.4b1d08","name":"","group":"215d19a8.9edbb6","order":0,"width":0,"height":0,"label":"chart","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"1","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":332.38891983032227,"y":456.7778215408325,"wires":[[],[]]},{"id":"215d19a8.9edbb6","type":"ui_group","z":"","name":"go_goroutines","tab":"356225f4.ea84ea","disp":true,"width":"10"},{"id":"356225f4.ea84ea","type":"ui_tab","z":"","name":"Prometheus","icon":"dashboard"}]
image.png

1. 点数 shù)
2. 分数 shù)
3. 得分 (dé
4. 积分 (jī
5. 点

您可以在Node-RED服务器中指定HTTP请求节点的URL以进行访问。

这次,在 http request 节点中,指定的 URL 不是 http://localhost:9090/metrics,而是 http://prometheus:9090/metrics。

在中国能本地化重述如下:
具体意思是,localhost:9090是从执行机器上查看Prometheus的URL,因此在Node-RED中看不见。因此,在前面提到的docker-compose.yml中,我们在nodered容器中链接到prometheus容器,以便通过prometheus:9090进行访问。

这次是关于Docker的情况,但如果是云端的话,例如在设置虚拟网络和安全组等配置时,可能需要确保路由的设置。

尽管如此,通过交换机节点提取指标的能力还不够…

我试着制作了一下,但是这个流程结构如果处理复杂的指标就很麻烦呢…。

好的!让我们自己制作一个节点试试!?

尝试创建 Prometheus 的指标分析节点(改进版)

其实我从来没有自己制作过节点,所以我想借此机会尝试一下。关于制作节点的方法,请参考这里。

    Node-RED日本ユーザ会 : Nodeの作成

自行编写的节点 node-red-contrib-parser-prom-metrics 的规范是什么?

自定义节点已根据通过 http_request 节点获取的 /metrics 结果进行输入,并将其转换为以下 JSON 结构的规范。

{
    "name": "<metric_name>",
    "value": <value>,
    "labels": {
        "label_name1": "label_value1",
        "label_name2": "label_value2",
        ...
    }
}

请参考前面提到的代码示例中的 nodes/parser-prom-metrics 的代码。

样品流程

好的,作为示例,我试着展示了 http_requests_total 的多个数据在一个图表中。节点的配置也变得简单了!

[{"id":"df1a33e9.993f5","type":"inject","z":"78d9cc24.3c55a4","name":"","topic":"","payload":"","payloadType":"date","repeat":"10","crontab":"","once":false,"x":154,"y":77.23610877990723,"wires":[["951f8fda.3b733"]]},{"id":"951f8fda.3b733","type":"http request","z":"78d9cc24.3c55a4","name":"","method":"GET","ret":"txt","url":"http://prometheus:9090/metrics","tls":"","x":340.00000762939453,"y":77,"wires":[["22dfb0e0.c8f01"]]},{"id":"22dfb0e0.c8f01","type":"parser-prom-metrics","z":"78d9cc24.3c55a4","name":"","x":151.388916015625,"y":153.23609733581543,"wires":[["209317b4.e62488"]]},{"id":"63747b53.8c22c4","type":"switch","z":"78d9cc24.3c55a4","name":"filter by http_requests_total","property":"payload.name","propertyType":"msg","rules":[{"t":"eq","v":"http_requests_total","vt":"str"}],"checkall":"true","outputs":1,"x":206.38889694213867,"y":235.01391696929932,"wires":[["fb01d069.8a2c3","9ffbd8dc.2f92d8"]]},{"id":"209317b4.e62488","type":"split","z":"78d9cc24.3c55a4","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":322.3888931274414,"y":152.01390266418457,"wires":[["63747b53.8c22c4"]]},{"id":"9f300d6.7394af","type":"ui_chart","z":"78d9cc24.3c55a4","name":"prometheus","group":"a815aaaf.67adb8","order":0,"width":0,"height":0,"label":"handler=pometheus only","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":548.3888893127441,"y":326.7917261123657,"wires":[[],[]]},{"id":"4702d48b.49a73c","type":"change","z":"78d9cc24.3c55a4","name":"","rules":[{"t":"move","p":"payload.labels.handler","pt":"msg","to":"topic","tot":"msg"},{"t":"move","p":"payload.value","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":335.388916015625,"y":326.1250047683716,"wires":[["9f300d6.7394af","6cd20ad5.0a2794"]]},{"id":"fb01d069.8a2c3","type":"switch","z":"78d9cc24.3c55a4","name":"prometheus","property":"payload.labels.handler","propertyType":"msg","rules":[{"t":"eq","v":"prometheus","vt":"str"}],"checkall":"true","outputs":1,"x":151.3888931274414,"y":326.66667079925537,"wires":[["4702d48b.49a73c"]]},{"id":"61338a91.013f44","type":"ui_chart","z":"78d9cc24.3c55a4","name":"http_requests_total","group":"9e8c057f.89f1f8","order":0,"width":0,"height":0,"label":"other handler","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":570.9999465942383,"y":461.0000066757202,"wires":[[],[]]},{"id":"a70e5931.6cd578","type":"change","z":"78d9cc24.3c55a4","name":"","rules":[{"t":"move","p":"payload.labels.handler","pt":"msg","to":"topic","tot":"msg"},{"t":"move","p":"payload.value","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":335.99999618530273,"y":461.3332862854004,"wires":[["61338a91.013f44","6cd20ad5.0a2794"]]},{"id":"6cd20ad5.0a2794","type":"debug","z":"78d9cc24.3c55a4","name":"","active":true,"console":"false","complete":"payload","x":549,"y":370.99997901916504,"wires":[]},{"id":"9ffbd8dc.2f92d8","type":"switch","z":"78d9cc24.3c55a4","name":"exclude prometheus","property":"payload.labels.handler","propertyType":"msg","rules":[{"t":"neq","v":"prometheus","vt":"str"}],"checkall":"true","outputs":1,"x":185.16666412353516,"y":396,"wires":[["a70e5931.6cd578"]]},{"id":"a815aaaf.67adb8","type":"ui_group","z":"","name":"http_requests_total (prometheus)","tab":"6832eea4.26d3","order":2,"disp":true,"width":"12"},{"id":"9e8c057f.89f1f8","type":"ui_group","z":"","name":"http_requests_total","tab":"6832eea4.26d3","order":1,"disp":true,"width":"12"},{"id":"6832eea4.26d3","type":"ui_tab","z":"","name":"Prometheus","icon":"dashboard"}]
image.png

积分

启用自定义节点

由于本次使用现有的容器映像,因此需要一些技巧才能启用自定义节点。其中一种方法是要以 root 权限运行 npm link,所以我们做了以下对应处理。

docker exec -it --user=root nodered /bin/bash

# nodered コンテナの中で npm link で相互にリンクさせます
cd /nodes/parser-prom-metrics && npm link
cd /usr/src/node-red && npm link node-red-contrib-parser-prom-metrics
exit

docker restart nodered

当Node-RED容器重新启动完成后,自定义节点应该可用。

在仪表盘的UI图表上显示多个图表。

如果您以这种格式输入数据,您可以显示多个图表。请参考文档以获取详细信息。

    node-red-dashboard/Charts.md at master · node-red/node-red-dashboard
{
    "msg": {
        "topic": "<データのラベル>",
        "payload": <値>
    }
}

结语 – 结尾处

由于使用现有的节点制作出来的效果并不太好,所以尝试着制作了一些定制化的节点。与简易版相比,现在看起来更加精致,我感到非常满意!

无论如何,这样玩也是一种很好的学习方式!?

bannerAds