1. 前言
Prometheus
(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud
公司开发的。随着发展,越来越多公司和组织接受采用Prometheus
,社会也十分活跃,他们便将它独立成开源项目,并且有公司来运作。Google SRE
的书内也曾提到跟他们BorgMon
监控系统相似的实现是Prometheus
。现在最常见的Kubernetes
容器管理系统中,通常会搭配Prometheus
进行监控。
Prometheus
基本原理是通过HTTP
协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP
接口就可以接入监控系统,不需要任何SDK
或者其他的集成过程。这样做非常适合虚拟化环境比如VM
或者Docker
。
Prometheus
应该是为数不多的适合Docker
、Mesos
、Kubernetes
环境的监控系统之一。输出被监控组件信息的HTTP
接口被叫做exporter
。目前互联网公司常用的组件大部分都有exporter
可以直接使用,比如Varnish
、Haproxy
、Nginx
、MySQL
、Linux
系统信息 (包括磁盘、内存、CPU
、网络等等),具体支持的源看:https://github.com/prometheus。
与其他监控系统相比,Prometheus
的主要特点是:
- 一个多维数据模型(时间序列由指标名称定义和设置键/值尺寸)。
- 非常高效的存储,平均一个采样数据占
~3.5bytes
左右,320万的时间序列,每30秒采样,保持60天,消耗磁盘大概228G。 - 一种灵活的查询语言。
- 不依赖分布式存储,单个服务器节点。
- 时间集合通过HTTP上的PULL模型进行。
- 通过中间网关支持推送时间。
- 通过服务发现或静态配置发现目标。
- 多种模式的图形和仪表板支持。
Prometheus架构:
- 它的服务过程是这样的
Prometheus daemon
负责定时去目标上抓取metrics
(指标) 数据,每个抓取目标需要暴露一个http服务的接口给它定时抓取。 - Prometheus:支持通过配置文件、文本文件、
zookeeper
、Consul
、DNS SRV lookup
等方式指定抓取目标。支持很多方式的图表可视化,例如十分精美的Grafana
,自带的Promdash
,以及自身提供的模版引擎等等,还提供HTTP API
的查询方式,自定义所需要的输出。 - Alertmanager:是独立于
Prometheus
的一个组件,可以支持Prometheus
的查询语句,提供十分灵活的报警方式。 - PushGateway:这个组件是支持
Client
主动推送metrics
到PushGateway
,而Prometheus
只是定时去Gateway
上抓取数据。 - 大多数
Prometheus
组件都是用Go
编写的,它们可以轻松地构建和部署为静态二进制文件。访问prometheus.io
以获取完整的文档,示例和指南。
2. 安装部署
1.下载镜像:
docker pull prom/prometheus
2.启动镜像:
docker run -d --name prometheus -p 9090:9090 prom/prometheus
3.创建文件夹:
mkdir conf mkdir data chmod 777 -R data
4.拷贝配置文件:
docker cp prometheus:/etc/prometheus/prometheus.yml conf/
5.修改配置文件:
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] labels: instance: prometheus
- job_name:job的名字
- targets:metrics生产者地址
- labels:个性化标签
6.重新启动镜像:
docker stop prometheus docker rm prometheus docker run \ -p 9090:9090 \ -v $PWD/conf/prometheus.yml:/etc/prometheus/prometheus.yml \ -v $PWD/data:/prometheus \ --name prometheus \ -d prom/prometheus \ --config.file=/etc/prometheus/prometheus.yml
7.安装grafana:
docker stop grafana docker rm grafana docker run -d \ -p 3000:3000 \ --name=grafana \ -v $PWD/conf/grafana.ini:/etc/grafana/grafana.ini/grafana.ini \ -v $PWD/plugins/:/var/lib/grafana/plugins \ -e "GF_SECURITY_ADMIN_PASSWORD=admin" \ -e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource,raintank-worldping-app,grafana-piechart-panel" \ -v $PWD/data:/var/lib/grafana \ grafana/grafana
GF_SECURITY_ADMIN_PASSWORD: 设置admin管理员的默认密码
GF_INSTALL_PLUGINS:配置安装的插件
3. 各组件监控
3.1 服务器监控
1.安装运行 node-exporter:
docker run -d \ --name node-exporter \ -p 9100:9100 \ -v "/proc:/host/proc" \ -v "/sys:/host/sys" \ -v "/:/rootfs" \ --net="host" \ prom/node-exporter
2.修改prometheus的配置:
- job_name: 'node' static_configs: - targets: ['192.168.28.130:9100'] labels: env: test name: node1 instance: 192.168.28.130
3.2 MySQL监控
1.安装运行 mysqld-exporter
:
docker run -d -p 9104:9104 \ --name mysqld-exporter \ -e DATA_SOURCE_NAME="root:1q2w3e4r@(192.168.28.131:3306)/user-center" \ prom/mysqld-exporter
2.修改prometheus的配置:
- job_name: 'mysqld' static_configs: - targets: ['192.168.28.131:9104'] labels: env: test name: mysql-5.7 instance: 192.168.28.131:3306
3.3 Elasticsearch监控
1.安装 elasticsearch-exporter
插件:
cd elasticsearch-6.6.1 ./bin/elasticsearch-plugin install -b https://distfiles.compuscene.net/elasticsearch/elasticsearch-prometheus-exporter-6.6.1.0.zip
2.修改prometheus
的配置:
- job_name: elasticsearch scrape_interval: 10s metrics_path: "/_prometheus/metrics" static_configs: - targets: ['192.168.28.130:9200'] labels: env: test name: elasticsearch
3.4 Nacos监控
1.配置nacos
的application.properties
文件,暴露metrics
数据:
management.endpoints.web.exposure.include=*
2.修改prometheus
的配置:
- job_name: nacos metrics_path: "/nacos/actuator/prometheus" static_configs: - targets: ['192.168.28.130:8848'] labels: env: test name: nacos instance: 192.168.28.130:8848
3.5 Redis监控
1.安装运行 redis-exporter
docker run -d \ --name redis_exporter \ -p 9121:9121 \ oliver006/redis_exporter \ --redis.addr redis://192.168.28.130:6379
2.修改prometheus
的配置
- job_name: redis static_configs: - targets: ['192.168.28.130:9121'] labels: env: test name: redis instance: 192.168.28.130:3306
3.6 微服务监控
通过file_sd_configs
进行服务发现的配置,每次json
文件的内容发生变更,Prometheus
会自动刷新target
列表:
1.配置服务的json文件:
[ { "targets": [ "192.168.28.130:9900" ], "labels": { "job":"spring-boot-service", "env":"test", "application":"api-gateway", "instance":"192.168.28.130:9900" } }, { "targets": [ "192.168.28.130:8000" ], "labels": { "job":"spring-boot-service", "env":"test", "application":"uaa-server", "instance":"192.168.28.130:8000" } } ]
2.修改prometheus的配置:
- job_name: spring-boot-service metrics_path: "/actuator/prometheus" file_sd_configs: - files: ['/etc/prometheus/fileDdConfigs/*.json']
4. Grafana仪表盘
4.1 下载
下载地址:
- 链接: https://pan.baidu.com/s/1-z-T9TFBn_KzvggOtcAz1Q
- 提取码: 384j
4.2 告警配置
4.2.1 邮件配置
修改 grafana
文件/etc/grafana/grafana.ini
配置smtp
服务器:
host: smtp地址+端口
user: 你的邮箱地址
password: 邮箱客户端授权密码
from_address: 你的邮箱地址
4.2.2 配置邮件通知
4.2.3 Alert配置
4.2.4 注意事项
1.只有Graph
图表能配置Alert
2.使用了模板变量的查询不能配置告警
解决办法:单独配置个告警的视图,用正则匹配出所有的主机 或者 每台主机单独一个查询语句