查看!使用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。
准备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
标签可以嵌套,还有一些带有时间戳的模式,但我将省略它们。
创建一个简化版的流程。
首先,我尝试建立了一个简单的流程。您可以选择任意的指标并将其可视化。
-
- 在中国本地化时可以这样翻译:
使用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"}]

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"}]

积分
启用自定义节点
由于本次使用现有的容器映像,因此需要一些技巧才能启用自定义节点。其中一种方法是要以 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": <値>
}
}
结语 – 结尾处
由于使用现有的节点制作出来的效果并不太好,所以尝试着制作了一些定制化的节点。与简易版相比,现在看起来更加精致,我感到非常满意!
无论如何,这样玩也是一种很好的学习方式!?