运维或者 SRE 部门经常会弄一个大屏幕展示各种系统状态,看上去很好玩,于是我也用类似的开源软件监控一下家里的主机。
整个过程非常简单,主要是安装三个软件 Node exporter,Prometheus,Grafana。
Node exporter
既然要展示系统状态,那么第一步就是要获得系统的状态数据,比如 CPU 使用率,内存使用率,网络流量等。
Prometheus 官方提供了一个使用 go 语言编写的程序 node_exporter,直接下载项目主页上 release 里的二进制即可。node_exporter 最好直接安装在物理主机上,因为这样才能采集到最准确的数据。
运行 node_exporter 以后,会自动启动一个 http server 并且监听 9100 端口,如果有 client 过来访问, server 返回主机的监控信息。比如:
$ curl http://localhost:9100/metrics
node_network_transmit_packets_total{device="veth126cb08"} 28859
node_network_transmit_packets_total{device="veth1276a16"} 1383
node_network_transmit_packets_total{device="veth749c501"} 1.108492e+06
返回信息的格式是符合 Prometheus 定义的标准的,因此 Prometheus 能够处理并以简单的图标的形式展现这些数据。
看到这里大家应该不难想到,如果我自己写一个程序 HelloWorld,并且把程序的状态按照一定的格式导出,那么同样可以通过 Prometheus + Grafana 展现。
Prometheus
Prometheus 是一个功能齐全的数据库,还提供了 PromSQL 语言方便用户查询,以及一个简单的网页前端。
最简单快捷的方式当然是启动一个容器,唯一需要注意的是把配置文件 prometheus.yml
挂载到容器的 /etc/prometheus/
目录下。
$ docker run -d -p 9090:9090 \
-v /home/prometheus/:/etc/prometheus/ prom/prometheus
配置文件中需要在 scrape_configs
部分添加 noder exporter 的 IP 地址和端口。
# my global config
global:
scrape_interval: 15s
evaluation_interval: 15s
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
- job_name: 'your name'
static_configs:
- targets: ['192.168.31.15:9100']
容器启动以后,通过浏览器访问 http://localhost:9090
,能看到一个功能齐全,但画面略显简陋的网页端。 要达到传说中那样的 fancy 界面,还需要配合 Grafana。
Grafana
同样,也是用容器的形式运行 Grafana
$ docker run -d -p 3000:3000 grafana/grafana
启动之后,浏览器访问 http://localhost:3000
,输入默认用户名和密码 admin/admin。
接下来,首先是告诉 Grafana 去哪儿获取数据,从上面的步骤可以看出,系统的监控信息都存在了 Prometheus 里面,因此在 Add data source
里添加 http://localhost:9090
。
然后,安装插件。
Grafana 提供了插件功能,用户和开发者可以选择自己定制的插件来展示监控数据。在这里我选择的是 Grafana 官网的 Node Exporter for Prometheus 插件。
进入网站 https://grafana.com/grafana/dashboards 点击这个插件,记下 ID 号 11074。
返回 http://localhost:3000/dashboard/import
,import 这个 插件即可。之后就会看到下面这样的监控画面:
测试
接下来跑一些计算量大的程序,想从 Grafana 看到陡峭的曲线 :-)
我选择了一个CNN卷积神经网络训练识别验证码的程序,没有 GPU 只有 CPU,用 TensorFlow 训练应该挺烧 CPU。
开始训练之后我就去睡觉了,因为看别人说一般训练要花很长时间。
谁知第二天早上起来一看监控,只用了 2 个小时就结束了。
测试了几次,验证码识别的准确率还是不错的。
$ python3 model_test.py
验证码正确值: 5041 模型预测值: ['5041'] 正确与否: True
验证码正确值: 1219 模型预测值: ['1229'] 正确与否: False
验证码正确值: 7751 模型预测值: ['7751'] 正确与否: True
验证码正确值: 5985 模型预测值: ['5985'] 正确与否: True