(颓废了颓废了,低产如老狗)
公司最近正在调研服务的监控方案,目前本人知道的比较流行的有zabbix和prometheus,综合的考量了一下之后决定使用prometheus,至于为什么选它,以及它和zabbix的优劣,可以看看这些文章
监控 prometheus 与zabbix对比
prometheus比zabbix好在哪点?
为什么说 Prometheus 是足以取代 Zabbix 的监控神器?
都是google上能够轻易搜到的文章,能对prometheus有一个初步的了解
Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。成立于2012年,之后许多公司和组织接受和采用prometheus,他们便将它独立成开源项目,并且有公司来运作。该项目有非常活跃的社区和开发人员,目前是独立的开源项目,任何公司都可以使用它,2016年,Prometheus加入了云计算基金会,成为kubernetes之后的第二个托管项目。google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。
我们使用prometheus的场景就是对系统服务做监控啦,接下来我们就开始在我们自己的机器上进行配置吧(过程中我会把一些踩过的坑尽量标注出来~)
配置过程中我们要时刻注意权限的问题,为了方便,我们将所有下文所有目录的拥有者均设为www-pro(这个用户自己确认一个就行了),确保权限这块不会出现异常
首先就是这两个目录:
# 可执行文件
/etc/prometheus/
# 配置文件
/var/lib/prometheus
由于 Prometheus 仅具备采集系统指标的功能,因此我们需要通过 Node Exporter 来扩展它的能力(这样的exporter非常的多,还有用于redis的,mongo的,等等,这里只用一个基本的exporter做演示)。Node Exporter 是一款收集系统 CPU、磁盘、内存用量信息并将它们公开以供抓取的工具。
github promethous release列表
我们挑最新的release版本进行下载:),记得自己点进去看看列表里的最新的那个,我这个只是在当时是最新的
wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
之后执行解压操作
tar xvf node_exporter-0.18.1.linux-amd64.tar.gz
解压后的目录中包含了可执行文件、README、以及许可证文件
我们将可执行文件node_exporter复制到/usr/local/bin
下
cp node_exporter /usr/local/bin/
好了,其他文件删除即可:)
# 创建一个服务文件
vim /etc/systemd/system/node_exporter.service
# 以下是需要编辑到文件的内容
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=www-pro
Group=www-pro
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
Node Expoter中, 收集器(Collectors
)用于搜集系统信息,一部分收集器已被开启,你可以在 README 文件中查看具体列表。如果你想要使用某些特定的收集器,可以在以上文件的 ExecStart 配置中进行定义。例如:
ExecStart=/usr/local/bin/node_exporter --collectors.enabled meminfo,hwmon,entropy
启用Node Exporter
# 重启以便能够使用新创建的服务
sudo systemctl daemon-reload
# 启动 Node Exporter
sudo systemctl start node_exporter
# 查看服务运行状态
sudo systemctl status node_exporter
查看状态,出现以下字样基本就没问题了
● node_exporter.service - Node Exporter
Loaded: loaded (/etc/systemd/system/node_exporter.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2019-10-25 15:59:17 CST; 8s ago
Main PID: 32052 (node_exporter)
CGroup: /system.slice/node_exporter.service
└─32052 /usr/local/bin/node_exporter
设置开机启动
sudo systemctl enable node_exporter
release列表
同样选取最新版进行下载:)
wget https://github.com/prometheus/prometheus/releases/download/v2.13.1/prometheus-2.13.1.linux-amd64.tar.gz
解压后,我们将可执行文件prometheus
(Promethenus主程序)以及promtool
加入到/usr/local/bin/
目录
sudo cp ./prometheus /usr/local/bin/
sudo cp ./promtool /usr/local/bin/
同样记得配置一下权限
sudo chown www-pro:www-pro /usr/local/bin/prometheus
sudo chown www-pro:www-pro /usr/local/bin/promtool
将console
,console_libraries
目录复制到/etc/prometheus
# 分别包含了 Web 接口、示例配置以及许可证文件
sudo cp -r ./consoles /etc/prometheus
sudo cp -r ./console_libraries /etc/prometheus
同样修改文件拥有者
sudo chown -R www-pro:www-pro /etc/prometheus/consoles
sudo chown -R www-pro:www-pro /etc/prometheus/console_libraries
将解压文件中的prometheus.yml
保留,将其他不再需要的下载文件删除。
到了这里,可以正式开始Prometheus基本配置了
打开之前的prometheus.yml
, 里面的内容大概长这样
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
metrics_path: '/prometheus/metrics' # 默认'/metrics', 此处需要加上前缀
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
Prometheus 的配置文件分为4个部分:
在 global 部分内,可以找到一些通用配置:
scrape_interval
用于设置 Prometheus 多久抓取一次目标(Targets)evaluation_interval
用于设置多久计算一次规则(Rules),而规则用于控制存储预先计算的数据,以及何时生成告警(Alert)在alerting部分内,包含了用于资源告警的一些配置(现在还没有)
在 rule_files 部分内,包含了 Prometheus 加载的规则文件路径(这个也暂时没有)
配置文件的最后一个部分名为 scrape_configs,包含了 Prometheus 监控的资源信息。
Exporter
) , 用于Prometheus监控它自己,我们将该任务(Job)的 scrape_interval 降低为 5 秒static_configs
的 targets
参数表示导出器的监听地址。由于是同一服务器,所以我们使用 localhost
以及 Prometheus 自己的端口 9090
scrape_configs
内定义的导出器,因此我们需要将 Node Exporter 添加至该文件,就像上文中监控 Prometheus 自己一样在加一个Exporter
- job_name: 'node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
这里再次覆盖了全局的 scrape_interval
配置并设置为 5 秒。并且 Node Exporter 与 Prometheus 运行在同一服务器,所以我们可以直接使用 localhost
以及 Node Exporter 的默认端口:9100
若是从外部服务器抓取数据,你需要使用远程服务器的 IP 地址替换 localhost
官方详细配置文档
我们将该文件放到/etc/prometheus/
并配置权限
cp prometheus.yml /etc/prometheus/
sudo chown www-pro:www-pro /etc/prometheus/prometheus.yml
由于服务器只开放了80端口,我们需要通过nginx将请求转发到本地服务,以下为一个简要的nginx配置
server {
listen 80;
server_name 47.96.186.125;
access_log /data/log/nginx/prometheus_access.log;
error_log /data/log/nginx/prometheus_error.log;
location / {
root html;
index index.html index.htm;
# proxy_pass http://127.0.0.1:9090/;
}
# location /grafana/ {
# proxy_pass http://127.0.0.1:3000/;
# }
location /prometheus/ {
proxy_pass http://127.0.0.1:9090/prometheus/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
以www-pro用户的身份运行启动命令
sudo -u www-cem /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries --web.external-url=prometheus
注意这里的--web.external-url=prometheus
配置,由于我在nginx中是这么配置的
location /prometheus/ {
proxy_pass http://127.0.0.1:9090/prometheus/;
}
多加了一个prometheus单词,所以启动prometheus时要多添加一个属性,不然就会找不到,这是个小坑~
浏览器中输入
http://你的服务器IP/prometheus/
现在应该能够看到页面了
# 该文件将会指明使用 www-cem 用户运行 Prometheus,并指定其配置文件的路径。
vim /etc/systemd/system/prometheus.service
# 以下为填入的内容
[Unit]
Description=Prometheus Monitoring
Wants=network-online.target
After=network-online.target
[Service]
User=www-cem
Group=www-cem
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.external-url=prometheus
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
之后
# 重载systemd
sudo systemctl daemon-reload
# 开机自启
sudo systemctl enable prometheus
# 启动Prometheus
sudo systemctl start prometheus
# 查看运行状态
sudo systemctl status prometheus
grafana简而言之就是能够让你监控的数据通过丰富多彩的报表进行呈现,我们这里不多讲,只聊聊其配置的过程。
官方下载链接
wget https://dl.grafana.com/oss/release/grafana-6.4.3-1.x86_64.rpm
sudo yum localinstall grafana-6.4.3-1.x86_64.rpm
同样使用nginx代理(nginx上文已配置好),需要修改/etc/grafana/
下的grafana.ini
# 找到并修改对应行
[server]
...
# 去掉对应的protocal和domain的注释
root_url = %(protocol)s://%(domain)s:/grafana
启动三连
sudo systemctl daemon-reload && sudo systemctl enable grafana-server && sudo systemctl start grafana-server
之后我们可以通过http://你的IP地址/grafana/
对grafana进行访问
我们可以为prometheus配置一些数据面板,也可以使用一些现成的模版展示prometheus的监控数据。
grafana共享数据面板模版
在监控的同时,我们需要配置告警功能以便发生问题时及时处理
组件最新版本地址
# 下载最新安装包
wget https://github.com/prometheus/alertmanager/releases/download/v$VERSION/alertmanager-0.19.0.linux-amd64.tar.gz
# 解压
tar xfv alertmanager-0.19.0.linux-amd64.tar.gz
现在在/etc/prometheus/
下新建一个alertmanager
目录,将解压出来的内容复制到alertmanager
目录下
mv alertmanager-0.19.0.linux-amd64.tar.gz/* ../alertmanager
同样修改下用户权限
sudo chown www-pro:www-pro /etc/prometheus/alertmanager/alertmanager
sudo chown www-pro:www-pro /etc/prometheus/alertmanager/data/
sudo chown www-pro:www-pro /etc/prometheus/alertmanager/alertmanager.yml
Alermanager会将数据保存到本地中,默认的存储路径为data/
, 我们可以在启动时通过添加参数改变需要读取的配置文件路径以及数据存储的路径
sudo -u www-cem /etc/prometheus/alertmanager/alertmanager --config.file /etc/prometheus/alertmanager/alertmanager.yml --storage.path /etc/prometheus/alertmanager/data/
其中, --config.file
用于指定alertmanager配置文件路径,--storage.path
用于指定数据存储路径
尝试启动,成功后我们把服务关闭,配置alertmanager系统服务启动文件
vim /usr/lib/systemd/system/alertmanager.service
# 以下是添加的文件内容
[Unit]
Description=Alertmanager
After=network.target
[Service]
Type=simple
User=www-cem
ExecStart=/etc/prometheus/alertmanager/alertmanager \
--config.file=/etc/prometheus/alertmanager/alertmanager.yml \
--storage.path=/etc/prometheus/alertmanager/data/
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动4连:)
systemctl daemon-reload
systemctl enable alertmanager.service
systemctl start alertmanager.service
systemctl status alertmanager.service
prometheus能够正确的采集系统数据,现在需要给出一个规则,使得监控过程中能够捕捉到预警信息,我们在/etc/prometheus/alertmanager/alert_rules/
目录下创建一个node-stats-alert.rules
文件,添加如下内容
groups:
- name: hostStatsAlert
rules:
- alert: InstanceDown
expr: up == 0
for: 1m
labels:
severity: page
annotations:
summary: "Instance {{$labels.instance}} down"
description: "{{$labels.instance}} of job {{$labels.job}} has been down for more than 5 minutes."
内容很简单,当实例挂掉了之后,我们就发出预警,一个基于node_exporter 的简单告警规则就完成了。
其中expr
采用的是基于PromQL(Prometheus内置的数据查询语言)的表达式,我们可以编写任意的规则来匹配想要的监控数据
我们需要将这个告警规则文件应用到prometheus中,另外目前alertmanager还没有和prometheus关联上
将alertmanager集成到prometheus中,在配置文件下加入如下内容
# /etc/prometheus/prometheus.yml
...
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093'] # 这一句是新加的
...
# /etc/prometheus/prometheus.yml
...
rule_files:
- "/etc/prometheus/alertmanager/alert_rules/node-stats-alert.rules"
...
保存退出后,重启prometheus和alertmanager服务即可
systemctl restart prometheus.service
systemctl status prometheus.service
systemctl restart prometheus.service
systemctl status prometheus.service
现在已经到了可以捕捉告警的阶段了,最后一步,我们需要将告警信息通过邮件的方式发送
备份一下/etc/prometheus/alertmanager/alertmanager.yml
后,我们将该文件内容修改如下:
global:
resolve_timeout: 5m # 超时自动解决
smtp_smarthost: 'smtp.exmail.qq.com:465' # 发件服务器
smtp_from: '[email protected]' # 发件邮箱
smtp_auth_username: '[email protected]' # 发件邮箱名称
smtp_auth_password: 'xxx' # 密码
smtp_require_tls: false
smtp_hello: 'xxx.com'
# 定义告警信息模板,这里使用的默认模版,所以不需要配置
# templates:
# - 'template/*.tmpl'
# 路由树信息
route:
group_by: ['alertname','cluster','service'] # 报警分组,没用上
group_wait: 10s # 最初即第一次等待多久时间发送一组警报的通知
group_interval: 10s # 在发送新警报前的等待时间
repeat_interval: 1h # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝
receiver: 'email-receiver' # 发送警报的接收者的名称,以下receivers name的名称
receivers:
- name: 'email-receiver'
email_configs:
- to: '[email protected]'
# html: '{{ template "test.html" . }}' # 设定邮箱的内容模板, 如果设定了模版,则可以开启此设置
headers: {Subject: "Prometheus 告警邮件"}
# 一个inhibition规则是在与另一组匹配器匹配的警报存在的条件下,使匹配一组匹配器的警报失效的规则。两个警报必须具有一组相同的标签。
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
保存退出,重启prometheus
和alertmanager
即可
至此,prometheus配置基本完成:)
上文的配置中,我们在prometheus中只有两个target
采集信息,一个是node_exporter
,另外一个是prometheus
自身
我们如果需要监控其他服务(etc. redis, mongo等), 可以按照配置node_expoter
的流程集成相应的exporter
alertmanager除了邮件告警之外,还可以配置企业微信
,slack
等告警渠道。
以上就只是讲了有关于prometheus的配置相关的东西,关于使用部分并没有提及,读者可以自行搜索学习,或许以后我也会继续更新prometheus的使用。这里建议将PromQL多熟悉熟悉,这样我们可以写出自己想要的过滤监控数据源的逻辑:)
nginx 设置prometheus和grafana的反向代理
配置 Prometheus 服务器监控和 Grafana 看板
Prometheus中的服务发现和relabel
prometheus book
Prometheus Alertmanager 基本配置
prometheus告警数据多渠道发送
Prometheus 和 Alertmanager实战配置