Prometheus 概述
Prometheus简介
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。
Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。
2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目。
Prometheus目前在开源社区相当活跃。
Prometheus和Heapster(Heapster是K8S的一个子项目,用于获取集群的性能数据)相比功能更完善、更全面。
Prometheus性能也足够支撑上万台规模的集群。
https://prometheus.io
https://github.com/prometheus
系统架构图
基本原理
Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。
其大概的工作流程是:
Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
在Grafana图形界面中,可视化查看采集数据。
Prometheus的特性
Prometheus 特点:
• 多维数据模型:由度量名称和键值对标识的时间序列数据
• PromQL:一种灵活的查询语言,可以利用多维数据完成复杂的查询
• 不依赖分布式存储,单个服务器节点可直接工作
• 基于HTTP的pull方式采集时间序列数据
• 推送时间序列数据通过PushGateway组件支持
• 通过服务发现或静态配置发现目标
• 多种图形模式及仪表盘支持(grafana)
Prometheus的组件
Prometheus Server 主要负责数据采集和存储,提供PromQL查询语言的支持。
ClientLibrary 客户端库
Alertmanager 警告管理器,用来进行报警。
Push Gateway 短期存储指标数据。主要用于临时性的任务
Exporters 输出被监控组件信息的HTTP接口,采集已有的第三方服务监控指标并暴露metrics
Grafana 监控数据展示Web UI。
服务发现
Prometheus部署与配置文件
Prometheus部署
访问地址:
http://IP:9090
./premetheus -h 命令行常用参数:
• --config.file="prometheus.yml" #指定配置文件
• --web.listen-address= "0.0.0.0:9090" #监听地址和端口
• --log.level=info #日志级别
• --alertmanager.timeout=10s #与报警组件的超时时间
• --storage.tsdb.path="data/ " #数据目录
• --storage.tsdb.retention.time=15d # 数据保存时间,默认15天
• 二进制部署
https://prometheus.io/docs/prometheus/latest/getting_started/
二进制启动配置为系统服务管理
配置为系统服务管理
vi /usr/lib/systemd/system/prometheus.service
[Unit]
Description=prometheus
[Service]
ExecStart=/opt/monitor/prometheus/prometheus --config.file=/opt/monitor/prometheus/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start prometheus
systemctl enable prometheus
• Docker部署
https://prometheus.io/docs/prometheus/latest/installation/
错误的docker命令
docker run -d \
--name=prometheus \
-p 9090:9090 \
-v $PWD/prometheus.yml:/data/prometheus/prometheus.yml \
prom/prometheus
指定name中间不要等,看了半天才发现。也是醉了
正确的dockcer命令
docker run -d \
--name prometheus \
-p 9090:9090 \
-v $PWD/prometheus.yml:/data/prometheus/prometheus.yml \
prom/prometheus
$PWD可以写绝对路径
Prometheus配置文件
监控案例
如何监控服务?
1.自己写metrics接口,遵循数据模型
先知道怎么收集你要监控指标
集成官方的客户端或者自己数据格式,暴露出来。
2.使用社区维护的exporter(采集器,以数据模型暴露metrics接口)
部署Grafana对数据可视化
Grafana是一个开源的度量分析和可视化系统。
部署文档:
https://grafana.com/grafana/download
访问地址:
http://IP:3000
用户名/密码:admin/admin
wget方式下载二进制包太慢,可以直接在浏览器上输入下载地址,翻墙下载。会快很多…
配置为系统服务管理:
vi /usr/lib/systemd/system/grafana.service
[Unit]
Description=grafana
[Service]
ExecStart=/opt/monitor/grafana/bin/grafana-server -homepath=/opt/monitor/grafana
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start grafana
systemctl enable grafana
第一次需要重置密码
监控Linux服务器
node_exporter:用于监控Linux系统的指标采集器。
常用指标:
• CPU
• 内存
• 硬盘
• 网络流量
• 文件描述符
• 系统负载
• 系统服务
数据接口:
http://IP:9100
使用文档:https://prometheus.io/docs/guides/node-exporter/
GitHub:https://github.com/prometheus/node_exporter
https://prometheus.io/docs/instrumenting/exporters
node_exporter配置为系统服务管理systemd
配置为系统服务管理:
vi /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
[Service]
ExecStart=/usr/local/node_exporter/node_exporter -web.config=/usr/local/node_exporter/config.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start node_exporter
systemctl enable node_exporter
访问地址:
http://192.168.220.102:9100/metrics
配置prometheus.yml文件
检查配置是否正确
./promtool check config ./prometheus.yml
热加载配置文件
grafana监控
加入仪表盘
推荐id 9276
加第二台服务器
暴露的指标接口启用HTTP认证
启用HTTP认证:
vi config.yml
basic_auth_users:
prometheus: $2y$12$RC4HOCkmmupzZfgdL56XUu0zZ1sdEV be3J4NS17nybLFt54hzWO7G
#用户名: 密码
上面密码用下面命令生成:
yum install httpd-tools –y
htpasswd -nBC 12 '' | tr -d ':\n'
在指定目录创建config.yml文件,并重启exporter
浏览器basic认证
prometheus server 配置exporters的username和password
验证配置文件是否配置正确,可以热加载配置,也可以重启prometheus服务
监控系统服务运行状态
到exporter服务器上的指定路径上加入如下配置,并重启node_exporter服务:
/usr/local/node_exporter/node_exporter --web.config=/usr/local/node_exporter/config.yml -collector.systemd --collector.systemd.unit-whitelist=(docker|sshd|nginx).service
加入配置后执行如下命令重启node_exporter
systemctl daemon-reload
systemctl start node_exporter
监控Docker服务器
cAdvisor (Container Advisor) :用于收集正在运行的容器资源使用和性能信息。
项目地址:https://github.com/google/cadvisor
Docker部署cAdvisor:
docker run -d \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
访问地址
http://192.168.220.103:8080/containers/
再运行一个容器看看能不能采集到
等待一会
这个只能展示一台服务器上的docker运行情况
在Prometheus server上加上另外一台服务器的ip,并在另外一台服务器上也启动一个容器
修改配置文件,后面会加到如何实现配置的热加载。
创建一个Dashboard
label_values(up,instance)
选出处于up状态的服务
点击update
点击Save
服务过多,筛选掉没有Docker服务的服务
加入正则表达式
.*:8080
如图筛选出了有Docker服务的服务器
上面显示的是所有服务器的容器的状态,调节显示每台服务器容器的状态
监控MySQL服务器
mysql_exporter:用于收集MySQL性能信息。监听端口:9104
项目地址:https://github.com/prometheus/mysqld_exporter
#docker run -d --name db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
#docker exec -it db bash
mysql -uroot -p123456
mysql> grant PROCESS, REPLICATION CLIENT, SELECT ON *.* to 'exporter'@'%' identified by '123456';
#vi .my.cnf
[client]
user=exporter
password=123456
#./mysqld_exporter --config.my-cnf=.my.cnf
下载容器并运行
进入容器、进入mysql、授权
下载mysql exporter二进制包并解压,移到/usr/local/mysqld_exporter包下:
创建my.cnf文件,配置用户名和密码
启动mysql exporter,并指定配置文件,连接mysql
查看是否启动成功,暴露端口是否成功
配置热加载功能
编辑prometheus系统服务配置文件
开启配置热加载功能
原先的值
修改的值
调用接口实现配置热加载
配置文件更新成最新的值
dbservers服务监控也加进来了
按照之前的配置导入mysql监控的仪表盘
推荐仪表盘ID:7362
输入ID,点击load。
输入name,选择数据源,点击import。
MySQL监控
选择时间,看到最新的数据
接下来会将Prometheus自动化监控、PromQL的基本使用、监控指标标签管理、报警神器AlertManager、Grafana可视化(自制仪表盘等)。