通过Prometheus和Grafana监控Linux进程


【编者的话】本文介绍了如何通过Prometheus以及Grafana监控Linux系统中进程的资源使用率。

不论你是Linux系统管理员还是DevOps工程师,你都会花很多时间来追踪服务的性能指标。

有时,你可能会遇到运行速度非常慢的实例,但你找不到任何引发问题的线索。有时,你可能往实例发送top或者htop等远程命令却得不到任何响应。有时,你可能遇到一些简单的性能瓶颈,但你却无法用简单快捷的方式识别它。如果你想和更多Prometheus技术专家交流,可以加我微信liyingjiese,备注『加群』。群里每周都有全球各大公司的最佳实践以及行业最新动态
1.png



假如我们拥有完整的仪表板可以帮助我们跟踪一般的性能指标以及单个进程,事情会变得怎么样呢?参考:http://grafana.devconnected.co ... %3D5s
2.png

本教程的目标是为Linux系统管理员构建一个完整的监控仪表板。

你将学到什么?

在正式进入技术之旅之前,让我们快速浏览一下你将要学习的内容:
  • 了解目前Unix系统中监控进程性能最好的方式;
  • 学会怎么安装Prometheus v2.9.2Pushgateway v0.8.0Grafana v6.2
  • 构建一个简单的bash脚本将监控数据暴露给Pushgateway;
  • 构建一个完整的Grafana仪表盘,包括最新的面板,如'Gauge'和'Bar Gauge';
  • 进阶:实现ad-hoc过滤器,用以跟踪单个进程或实例。


现在我们已经对将要学习的所有内容进行了概述,接下来让我们先介绍一下Unix系统目前存在的内容。

Unix进程基础监控

对于Unix系统的进程监控,方法有很多。最常用的可能是'top'命令。

Top命令提供了系统性能指标的一个概览,例如当前的CPU使用率,当前的内存使用率,以及每个进程的一些指标。Top命令是系统管理员最经常使用的命令,当发现系统有性能瓶颈时,第一个运行的命令就是它。
3.png

Top命令可读性已经比较好了,不过还有个命令可读性更好,那就是htop。Htop提供与top相同的功能集(CPU,内存,运行时间……),但是以更丰富的色彩提供。Htop也提供反应当前系统使用率的仪表
4.png

有了这两个命令,为什么我们还需要构建其他方式来监控进程呢?主要的原因是系统可用性:如果系统过载,你可能无法对实例进行物理或远程访问。通过外部化进程监控,你可以在不访问机器的情况下分析导致停机的原因。

另一个原因就是进程会频繁地被创建和杀死,通常就是内核自身。这种情况下,运行top命令就太慢了,以至于你获取不到任何信息用来排查系统引发性能问题的原因,然后你将深入到内核日志中进行排查。而通过监控仪表盘,你可以进行简单地回溯,查看引发问题的进程是哪一个。

既然你已经知道我们为什么要构建这个仪表板,那么让我们看一下构建它的整体架构。
5.png

监控架构

在查看我们使用的架构之前,我们希望得到以下解决方案:
  • 资源占用少:不要耗费我们主机太多的资源;
  • 易于实施:一种不需要大量时间来实例化的解决方案;
  • 可扩展:如果我们想监控其他主机,能够快速有效地完成。


这些是我们在本教程中将要牢记的要点。今天我们将使用的监控架构如下:
6.png

整体架构有四个不同的组件:
  • 一个bash脚本,用来定期向Pushgateway发送监控数据;
  • Pushgateway:监控数据缓存器,是各个脚本推送数据的目标;
  • Prometheus:实例化一个时序数据库用来存储监控数据,Prometheus将把Pushgateway作为目标,用以检索和存储数据;
  • Grafana:一个监控工具仪表盘,使用PromQL从Prometheus中获取数据并可视化展现这些数据。


对Prometheus非常熟悉的人,应该已经知道Prometheus会抓取HTTP实例公开的指标数据并存储它们。

在我们的例子中,bash脚本的生命周期非常短,并且它不会为Prometheus公开任何HTTP实例。这就是我们为什么要使用Pushgateway,它专门为短生命周期任务而设计。Pushgateway会缓存从脚本收集到的监控数据,并将它们暴露给Prometheus。
7.png

8.png

安装不同的工具

现在你已经了解了我们的应用程序中发生了什么,接下来让我们安装所需的不同工具。

安装Pushgateway

为了安装Pushgateway,只需要运行一个简单wget命令获取最新版本的安装包。
wget https://github.com/prometheus/pushgateway/releases/download/v0.8.0/pushgateway-0.8.0.linux-amd64.tar.gz

获取到压缩包后,进行解压并在pushgateway目录下运行可执行文件。
> tar xvzf pushgateway-0.8.0.linux-amd64.tar.gz
> cd pushgateway-0.8.0.linux-amd64/   
> ./pushgateway & 

运行之后,Pushgateway将以后台进程进行运行。
me@schkn-ubuntu:~/softs/pushgateway/pushgateway-0.8.0.linux-amd64$ ./pushgateway &

[1] 22806
me@schkn-ubuntu:~/softs/pushgateway/pushgateway-0.8.0.linux-amd64$ 
INFO[0000] Starting pushgateway (version=0.8.0, branch=HEAD, revision=d90bf3239c5ca08d72ccc9e2e2ff3a62b99a122e)  source="main.go:65"INFO[0000] Build context (go=go1.11.8, user=root@00855c3ed64f, date=20190413-11:29:19)  source="main.go:66"INFO[0000] Listening on :9091.                           source="main.go:108"

现在,Pushgateway将监听9091端口收集监控数据。

安装Prometheus

在Prometheus官网的'Getting Started'章节,可以在 https://prometheus.io/download/上获取对应你操作系统的安装包,通过wget命令进行下载。
wget https://github.com/prometheus/prometheus/releases/download/v2.9.2/prometheus-2.9.2.linux -amd64.tar.gz

同样,获取到安装包后,解压并切换到Prometheus目录下。
> tar xvzf prometheus-2.9.2.linux-amd64.tar.gz
> cd prometheus-2.9.2.linux-amd64/

如前所述,Prometheus会定期向目标抓取数据,目标(本文中为Pushgateway)需要通过Prometheus的配置文件进行配置。
> vi prometheus.yml

在'global'段,将'scrape_interval'修改为1秒。
global:
scrape_interval:     1s # Set the scrape interval to every 1 second.

在'scrape_configs'段,在'targets'里添加一个条目。
static_configs:
        - targets: ['localhost:9090', 'localhost:9091']

退出vi,保存配置后运行Prometheus的可执行文件。验证Prometheus是否正常运行,可以访问地址http://localhost:9090/graph。如果可以进入Prometheus的Web控制台,说明已经正常运行。同样,为了验证Pushgateway是否正常运行,可以在Prometheus web控制台上点击'Status' > 'Targets'。
9.png

安装Grafana

最后,我们将安装Grafana v6.2,访问https://grafana.com/grafana/download/beta

和之前下载方式一样,使用wget命令。
> wget https://dl.grafana.com/oss/release/grafana_6.2.0-beta1_amd64.deb> sudo dpkg -i grafana_6.2.0-beta1_amd64.deb

现在你已经解压了deb包,Grafana在你主机上将作为一个Service进行运行。
> sudo systemctl status grafana-server
● grafana-server.service - Grafana instance
Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2019-05-09 10:44:49 UTC; 5 days ago
 Docs: http://docs.grafana.org

你可以访问http://localhost:3000来验证Grafana是否正常运行。现在你的主机上已经运行了Grafana,接下来将Prometheus配置为数据源,配置方式如下图:
10.png

点击'Save and Test'来确保数据源运行正常。
11.png

构建bash脚本获取监控数据

接下来的任务就是构建一个简单bash脚本用来获取监控数据,例如每个进程的CPU使用率和内存使用率。脚本之后可以定义成crontab任务每秒运行一次。

完成任务的方式有很多,你可以每秒运行一次top命令,用sed解析它的输出并把数据发送到Pushgateway。top的问题在于它提供的是随时间推移的平均数据,这并不是我们想要的。取而代之,我们将使用ps命令,准确地说是ps aux命令。
12.png

该命令展示了每个进程的CPU和内存使用率,并将进程运行的命令展示在最后,这是我们想要的数据。

在进行下一步之前,我们先看下Pushgateway期望的输入格式是什么。Pushgateway和Prometheus类似,使用的是键值对:key对应的是监控指标项,value对应的监控指标值。以下是一些例子:
13.png

如你所见,第一种方式简单描述的是CPU使用率,而第二种方式描述的是Java进程的CPU使用率。添加labels可以更加准确地描述你的监控指标项

有了这些信息后,我们就可以构建最终的脚本了。总结一下,我们的脚本将执行ps aux命令,解析并转换它的输出结果,然后将数据通过上述语法格式发送到Pushgateway。

创建一个脚本文件并添加必要的权限:
> touch better-top
> chmod u+x better-top
> vi better-top

脚本内容如下:
#!/bin/bash
z=$(ps aux)
while read -r z
do
var=$var$(awk '{print "cpu_usage{process=\""$11"\", pid=\""$2"\"}", $3z}');
done <<< "$z"
curl -X POST -H  "Content-Type: text/plain" --data "$var
" http://localhost:9091/metrics/job/top/instance/machine

如果你想使用相同的脚本获取内存使用率,可以简单地把'cpu_usage'标签换成'memory_usage',以及将$3z改成$4z。

所以,上述脚本将做什么呢?首先,它执行ps aux命令;然后,它循环将每行数据转换成打了label的键值对;最终,把所有键值对连在一起通过curl命令发送给Pushgateway。

简单吧?如你所见,脚本收集到我们所有进程的监控数据,但它只运行一次。我们可以简单地通过sleep命令每隔一秒运行它一次。之后,你可以创建一个Service来每秒运行一次(通过Systemd)。
> while sleep 1; do ./better-top; done;

对Systemd感兴趣吗?另一篇教程是关于如何通过Chronograf监控它们,参考:Monitoring systemd services in realtime with Chronograf

现在我们的监控数据发给了Pushgetway,让我们看看Prometheus Web控制台是否能够展现这些数据。访问http://localhost:9090,在'Expression'中输入'cpu_usage',你将在浏览器中看到所有监控数据。
14.png

15.png

通过Grafana构建最佳仪表盘

现在我们的监控数据已经存放在了Prometheus,我们可以通过简单地构建一个Grafana仪表盘来可视化它们。

我们将使用Grafana v6.2中最新的面板:垂直和水平的条形仪表,圆形仪表和经典折线图。我们将通过4小节分别描述不同仪表的构建,你可以根据自己的兴趣和需求看对应的部分。
16.png

构建圆形仪表

在我们的面板中,圆形仪表如下所示:
17.png

现在,我们将聚焦在进程的CPU使用率,配置方式可以简单复用到内存使用率。使用这些面板,我们将追踪两个指标:所有进程的当前CPU使用率以及平均CPU使用率。

为了获取这些数据,我们将在Prometheus实例上执行PromQL查询。什么是PromQL?PromQL是专门为Prometheus设计的查询语言。和在InfluxDB实例中使用InfluxQL(或者IFQL)类似,PromQL查询语句能够使用一些函数聚合数据,例如sum、平均值以及标准差等。PromQL的语法很简单,我们将在面板中进行使用。

获取当前整体CPU使用率

为了获取当前整体CPU使用率,我们将使用PromQL sum函数。在给定的时刻,总CPU使用率仅仅是个别用法的总和,如下所示:
18.png


获取平均CPU使用率

对于平均CPU使用率,只需要简单地使用PromQL avg函数,如下所示:
19.png

构建水平仪表

水平仪表是在Grafana v6.2中增加的内容。我们使用这个面板的目的是展示系统中资源使用top10的进程。我们将使用topk 函数来获取指标数据中top k个数据。和之前类似,我们将设置一些阈值来标记那些使用过多资源的进程,如下所示:
20.png

构建垂直仪表

垂直仪表和水平仪表非常类似,我们只需要在Grafana可视化面板中调整方向参数即可。我们将通过这个面板监控内存使用率,查询语句稍微有点不同,如下所示:
21.png

构建折线图

折线图在Grafana中已经使用很久了,我们将使用这个面板来构建一个历史视图,观察我们的进程如何随时间进行演变。

以下情况推荐使用折线图:
  • 你过去曾遇到过一些中断问题,并希望调查当时哪些进程处于活跃状态。
  • 某个进程已经死亡,但你希望在事件发生之前了解其行为。


在进行故障排查时,特别需要查看整体全貌(尤其是最近在Grafana Loki中添加的)。配置过程如下所示:
22.png

至此,我们完成了所有仪表盘的配置。你可以按照你想要的方式来安排它们,或者从我们构造的内容中获得参考。
23.png

进阶:使用ad hoc过滤器探索数据

实时数据很有趣,但当你能够探索数据时,真正的价值就来了。

在进阶部分,我们不会使用'Explore'函数,我们将使用ad hoc过滤器。使用Grafana,你可以定义与图形关联的变量。这些变量有许多不同的选项:例如,你可以为数据源定义一个变量,这样在查询中就可以动态切换数据源。

在我们的示例中,我们将简单使用ad hoc过滤器来探索数据。
24.png

点击上图中的按钮,然后点击左侧菜单栏的'Variables',然后点击'New',如下所示:
25.png

如上所述,ad hoc过滤器会自动应用于以Prometheus数据源为目标的仪表板。回到我们的仪表板,看一下仪表板的左上角。
26.png

现在假设你想要获取系统中某个进程的性能数据,以Prometheus自身为例,只需要导航到过滤器并相应地查看仪表板更新。
27.png

现在你对主机中Prometheus进程的行为有一个直观的了解了。你甚至可以回头看看这个进程的历史行为。
28.png

总结

通过本教程,现在你对Prometheus和Grafana提供的内容有了更好的了解。你知道了如何为一个主机构建完整的监控仪表盘,但这只是监控整个Unix实例集群中的一小步。

DevOps监控绝对是一个有趣的主题,但如果你做错了,可能会变成一场噩梦。这正是我们编写这些文章并构建这些仪表板的原因:帮助你拥有这些工具所提供的最高效率。

我们相信通过有用的示例可以增强伟大的技术,你呢?

原文链接:Monitoring Linux Processes using Prometheus and Grafana(翻译:肖远昊)

0 个评论

要回复文章请先登录注册