欢迎关注我的微信公众号:好好学技术
Prometheus(普罗米修斯)是一个开源的系统监控和报警系统。Google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。
Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。这样做非常适合虚拟化环境比如VM或者Docker 。
Prometheus应该是为数不多的适合Docker、Kubernetes环境的监控系统之一。
输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux 系统信息 (包括磁盘、内存、CPU、网络等等),具体支持的源看:https://github.com/prometheus。
高效的存储,每个采样数据占3.5 bytes左右,300万的时间序列,30s间隔,保留60天,消耗磁盘大概200G。
Prometheus Server
: 用于收集和存储时间序列数据Client Library
: 客户端库,检测应用程序代码,当Prometheus抓取实例的HTTP端点时,客户端库会将所有跟踪的metrics指标的当前状态发送到prometheus server端。Exporters
: prometheus支持多种exporter,通过exporter可以采集metrics数据,然后发送到prometheus server端,所有向promtheus server提供监控数据的程序都可以被称为exporterAlertmanager
: 从 Prometheus server 端接收到 alerts 后,会进行去重,分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉, slack等。Grafana
:监控仪表盘,可视化监控数据pushgateway
: 各个目标主机可上报数据到pushgateway,然后prometheus server统一从pushgateway拉取数据。从上图可发现,Prometheus整个生态圈组成主要包括prometheus server,Exporter,pushgateway,alertmanager,grafana,Web ui界面,Prometheus server由三个部分组成,Retrieval,Storage,PromQL
Retrieval
负责在活跃的target主机上抓取监控指标数据Storage
存储主要是把采集到的数据存储到磁盘中PromQL
是Prometheus提供的查询语言模块。1)Prometheus server可定期从活跃的(up)目标主机上(target)拉取监控指标数据,目标主机的监控数据可通过配置静态job或者服务发现的方式被prometheus server采集到,这种方式默认的pull方式拉取指标;也可通过pushgateway把采集的数据上报到prometheus server中;还可通过一些组件自带的exporter采集相应组件的数据;
2)Prometheus server把采集到的监控指标数据保存到本地磁盘或者数据库;
3)Prometheus采集的监控指标数据按时间序列存储,通过配置报警规则,把触发的报警发送到alertmanager
4)Alertmanager通过配置报警接收方,发送报警到邮件,微信或者钉钉等
5)Prometheus 自带的web ui界面提供PromQL查询语言,可查询监控数据
6)Grafana可接入prometheus数据源,把监控数据以图形化形式展示出来
环境
服务器 | 部署应用 |
---|---|
本地mac | Prometheus,Grafana,node-exporter |
centos | node-exporter |
本地机器部署Prometheus+Grafana+node-exporter,远程服务器也部署一个node-exporter。
本地机器环境搭建
# 本地创建node-exporter,生产可加上 --restart=always
docker run -d -p 9100:9100 \
-v "/Users/dongfengfan/docker/node-exporter/proc:/host/proc:ro" \
-v "/Users/dongfengfan/docker/node-exporter/sys:/host/sys:ro" \
-v "/Users/dongfengfan/docker/node-exporter/:/rootfs:ro" \
--name node-exporter \
prom/node-exporter
# 远程centos创建node-exporter,生产可加上 --restart=always
docker run -d -p 9100:9100 \
-v "/root/docker/node-exporter/proc:/host/proc:ro" \
-v "/root/docker/node-exporter/sys:/host/sys:ro" \
-v "/root/docker/node-exporter/:/rootfs:ro" \
--net="host" \
--name node-exporter \
prom/node-exporter
查看node-exporter是否部署成功
访问 http://127.0.0.1:9100/metrics
创建 prometheus.yml
global:
scrape_interval: 60s
evaluation_interval: 60s
scrape_configs:
- job_name: prometheus
static_configs:
#本地服务器加端口
- targets: ['localhost:9090']
labels:
instance: prometheus
- job_name: localhost-node-exporter
static_configs:
#监控本地服务器ip+端口,因为是本地docker启动,所以ip使用host.docker.internal
- targets: ['host.docker.internal:9100']
labels:
instance: localhost-node-exporter
- job_name: myaliyun
static_configs:
#监控远程服务器
- targets: ['139.196.45.28:9100']
labels:
instance: myaliyun
启动prometheus
docker run -d \
-p 9090:9090 \
-v /Users/dongfengfan/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
--name prometheus \
prom/prometheus
访问http://127.0.0.1:9090/targets,三个任务已经全部监控上了
mkdir /Users/dongfengfan/docker/grafana
docker run -d \
-p 3000:3000 \
--name=grafana \
-v /Users/dongfengfan/docker/grafana:/var/lib/grafana \
--name grafana \
grafana/grafana
访问 http://127.0.0.1:3000/
默认会先跳转到登录页面,默认的用户名和密码都是admin
登录之后,它会要求你重置密码。你还可以再输次admin密码
配置url为Prometheus地址,我这里因为Grafana和Prometheus都部署在本地docker,所以访问ip使用host.docker.internal
拉到最下面选择 save & test
访问地址:https://grafana.com/grafana/dashboards/8919/revisions
我下载了两个比较下有啥不同
导入数据
后面有时间再出一篇文章,如何监控mongo,redis,mysql等中间件。