运维或者 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

dashboard1

然后,安装插件。

Grafana 提供了插件功能,用户和开发者可以选择自己定制的插件来展示监控数据。在这里我选择的是 Grafana 官网的 Node Exporter for Prometheus 插件。

进入网站 https://grafana.com/grafana/dashboards 点击这个插件,记下 ID 号 11074。

返回 http://localhost:3000/dashboard/import,import 这个 插件即可。之后就会看到下面这样的监控画面:

dashboard1

测试

接下来跑一些计算量大的程序,想从 Grafana 看到陡峭的曲线 :-)

我选择了一个CNN卷积神经网络训练识别验证码的程序,没有 GPU 只有 CPU,用 TensorFlow 训练应该挺烧 CPU。

开始训练之后我就去睡觉了,因为看别人说一般训练要花很长时间。

谁知第二天早上起来一看监控,只用了 2 个小时就结束了。

dashboard1

测试了几次,验证码识别的准确率还是不错的。

$ python3 model_test.py

验证码正确值: 5041  模型预测值: ['5041'] 正确与否: True
验证码正确值: 1219  模型预测值: ['1229'] 正确与否: False
验证码正确值: 7751  模型预测值: ['7751'] 正确与否: True
验证码正确值: 5985  模型预测值: ['5985'] 正确与否: True

参考资料