1 背景
最近团队开发了许多新的服务,这些服务都需要做指标的可视化监控,于是考虑使用Prometheus来实现,Prometheus是一个用于事件监控和告警的开源软件。本文是Prometheus的实践篇,主要总结了Prometheus的实践操作。主要考虑要先将它用起来,接下来会再总结一篇相关的原理文章。
2 安装及启动Prometheus
点击这里从官网直接下载Linux版的安装包,上传至Linux服务器上之后解压:tar xvfz prometheus-2.25.0.linux-amd64.tar.gz
并且进入目录cd prometheus-2.25.0.linux-amd64
我们可以查看一下Prometheus的版本信息:
将Prometheus运行起来:./prometheus --config.file=prometheus.yml
运行Prometheus时需要指定配置文件:prometheus.yml
我们看一下这个文件的内容:
后面我们会用到global和scrape_configs,我们主要看一下:
global:
scrape_interval 表示 Prometheus 多久从指标服务端口抓取一次数据
evaluation_interval 表示多久检测一次告警规则,并进行相应告警
scrape_configs:
job_name表示我们要监控的主体名称
statis_configs的targets表示我们要监听的服务的IP及端口,也就是说,服务会从该端口向Prometheus提供指标数据
3 安装及使用Grafana
3.1 安装Grafana
虽然Prometheus自带的有可视化系统,但是相较于它,Grafana作为可视化监控系统会功能更强大,界面更美观。所以,我们将Prometheus作为数据采集器,将Grafana作为可视化监控系统来做数据指标的可视化。
我们使用Docker安装方式对Grafana进行安装:docker run -d -p 3000:3000 grafana/grafana
运行该命令,Grafana就安装好了。如果服务器的3000端口被占用,可以对冒号前的”3000″进行修改,以使用其他端口进行服务。如:docker run -d -p xxx:3000 grafana/grafana
比如我这里就是在三天前在3001启动了该服务
3.2 使用Grafana
安装完成之后,我们可以访问http://localhost:3000/
进入到Grafana的登录界面,用户名和密码默认为admin、admin。
然后我们就可以选择我们希望被可视化的数据源了。这里,我们被可视化的数据源为Prometheus:
这里我们重点要填3个地方:
其中Access表示Grafana访问数据源的方式。如果可以直接通过浏览器访问,那么则选择Browser;否则,如果是需要通过Grafana的服务端来访问数据源的URL,则选择Server。
3.3 查看Prometheus的性能数据来进行Grafana测试
Prometheus的数据源配置好了之后,我们就可以配置dashboard来查看数据源的监控数据了。
Prometheus自带的有自身的监控服务,我们可以直接使用:
导入Prometheus的dashboard之后,我们可以在这里查看一下已导入的dashboard:
Prometheus的监控可视化图表:
4 使用Prometheus和Grafana做服务器监控可视化
我们已经了解到,Grafana只是一个用于从数据源获取数据并做可视化的系统,而Prometheus是Grafana的数据源之一。
Prometheus是一个监控系统,它的数据指标也需要从一个服务中获取。而真正用于采集数据指标,并将数据指标通过端口暴露给Prometheus采集的服务叫做Exporter。
这个Exporter可以自己写,用于定制自己的数据采集。也可以直接使用Prometheus官方提供的Exporter。官方提供的Exporter都是开箱即用的。我们先来试用一下,用官方的服务器指标监控Exporter以及MySQL指标监控Exporter。看看官方的Exporter都是如何即刻使用的,后续再进一步介绍如何定制自己的数据采集服务。
Prometheus的整体架构图如下:
(图片来自Prometheus官网)
4.1 官方Exporter使用
4.1.1 服务器指标监控
4.1.1.1 Exporter运行
服务器指标监控Exporter可以从我们的Linux服务器中采集到一些关键指标用于可视化
接下来,我们就从官网下载并运行该Exporter
在Linux中依次执行以下命令:
wget https://github.com/prometheus/node_exporter/releases/download/v1.1.1/node_exporter-1.1.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.1.1.linux-amd64.tar.gz
cd node_exporter-1.1.1.linux-amd64
./node_exporter
执行之后,不出意外,我们可以看到上图所示服务执行起来了
该Exporter暴露9100端口、metrics路径给Prometheus,用于数据指标采集。
我们可以访问下/metrics路径,看看能否正常获取到服务器指标:
可以看到,我们已经可以正常获取到服务器的指标了。
接下来,我们就应该考虑如何将Exporter的端口添加进Prometheus的配置了。这样,Prometheus才能从该Exporter中采集到指标数据。
4.1.1.2 Exporter指标采集
前面说过,Prometheus的配置文件是其目录下的prometheus.yml
文件。
我们将服务端口添加进scrape_configs
配置中即可:
修改配置完成后,我们对Prometheus进行重启,或者发送HUP信号(killall HUP prometheus
),让Prometheus重新加载配置:
这样,Prometheus就可以从node_exporter这个官方Exporter中采集到该服务器的监控指标了。
4.1.1.3 配置Grafana面板从而可视化指标
我们已经通过Prometheus从Exporter中获取到了指标数据,接下来,我们就应该在Grafana中配置一下面板,从而将采集到的服务器指标数据做可视化。
import用于导入一个新的可视化面板
可以看到,我们可以从Grafana官网导入一个现成的面板。
进入Grafana的dashboard页面:
我们可以直接使用上图所示的Node Exporter Full面板用于可视化服务器的指标数据。也可以在上图所示的搜索框中搜索自己想用的面板。
这里我们使用Node Exporter Full面板,点击进入,可以看到页面:
可以看到,这个面板的数据源就是Prometheus,且这个dashboard的ID为1860。我们将这个ID填入Grafana的import的输入框中。
数据源选择Prometheus。可以看到可视化页面:
该界面展示的就是我的服务器的指标监控数据了。
4.1.2 MySQL指标监控
收集MySQL的指标数据进行可视化的流程与上述的服务器指标监控类似,这里就简单描述一下。
首先,还是要先下载并运行MySQL的Exporter。
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz
tar xvfz mysqld_exporter-0.12.1.linux-amd64.tar.gz
cd mysqld_exporter-0.12.1.linux-amd64
与服务器指标数据监控的不同之处在于,MySQL指标监控的Exporter在运行之前必须要配置一下服务器连接MySQL的方式。这里,我们通过配置环境变量DATA_SOURCE_NAME
的方式进行MySQL连接。格式如下:export DATA_SOURCE_NAME='root:rootmysql@(localhost:3306)/'
配置完环境变量后,即可启动MySQL的Exporter:
然后,我们像Node_Exporter一样,在Prometheus的配置文件中配置一下MySQL的Exporter的IP以及端口:
更新Prometheus配置后,我们可以在Prometheus的Dashboard官网中找一个MySQL的面板导入,可以看到最终的可视化界面如下:
4.2 使用go-kit实现自己的Exporter服务
4.2.1 定义指标和标签
假设我们现在做了一个服务,该服务会接收外部的请求,我们需要知道一段时间内某个客户端(client_id)请求某个接口的次数。这是一个非常常见的统计需求。
go-kit的包为:"github.com/go-kit/kit/metrics/prometheus"
,这里我们重命名为kitprometheus
primetheus的go工具包为:"github.com/prometheus/client_golang/prometheus"
,这里我们重命名为stdprometheus
我们使用go-kit创建一个指标和标签的代码如下:
appidGetFieldKeys := []string{"method", "client_id"}
appidGetRequestCount := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "namespace_name",
Subsystem: "subsystem_name",
Name: "metrics_name",
Help: "Number of client_id get received.",
},appidGetFieldKeys )
这样,我们就创建了一个指标为:namespace_name_subsystem_name_metrics_name,标签为[method, client_id]的数据。
当然,Prometheus不仅提供了用于统计次数的Counter,还有一些其他的统计类型。详见Prometheus官网文档。
4.2.2 统计数据
我们定义好了指标以及标签后,就可以进行数据统计了。
比如,我们收到了一次client_id为”123″的请求,那么,我们就应该在调用真正的处理函数之前先进行一次数据的统计。
func MethodName(c *gin.Context) {
client_id := c.Query("client_id")
defer func(begin time.Time) {
lvs = []string{"method", "AccessToken", "client_id", client_id}
appidGetRequestCount .With(lvs...).Add(1)
}(time.Now())
AccessToken(c)
return
}
这样,我们就做好了client_id的一次接口请求统计,并且对应的方法为AccessToken。如果这次传入的client_id参数为123,那么,我们就完成了一次方法为AccessToken,client_id为123的一次请求统计。
最后,我们通过某个服务端口的/metrics路径对Prometheus提供我们的指标数据,
Prometheus访问/metrics路径即可获取到我们的统计数据了。
"github.com/prometheus/client_golang/prometheus/promhttp"
r := gin.Default()
r.GET("/metrics", gin.WrapH(promhttp.Handler()))
这里,我们也可以通过直接访问该路由查看所有的指标数据:
Prometheus也提供了一套查询语言PromQL
方便进行各个数据的查询。
比如:
我们将/metrics的端口添加到Prometheus的配置文件中后(前面描述过,这里不再赘述),在Grafana添加一个面板
使用PromQL查询出我们希望看到的可视化界面
实际上,前面所描述的官方Exporter所对应的可视化图表,就是各种PromQL查询的结果,只是官方做了一系列的封装罢了,所以看起来比较漂亮。我们也可以详细研究下Grafana面板的使用方法,从而用我们采集到的各种指标做出更多更直观的图表。
5 总结
本文先介绍了Prometheus以及Grafana的功能与使用方法。然后通过官方Exporter来介绍该如何用Prometheus实现一个最简单的监控界面。最后简单的介绍了如何通过编写业务代码的方式来定制自己服务的Exporter,从而实现用Prometheus和Grafana来做服务指标的监控可视化。本文是入门实践篇,以后会再总结一篇原理篇。