Prometheus简介
Prometheus是一套开源的系统监控报警框架。Prometheus作为新一代的云原生监控系统,相比传统监控监控系统(Nagios或者Zabbix)拥有如下优点。
易管理性
Prometheus: Prometheus核心部分只有一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。
Nagios: 需要有专业的人员进行安装,配置和管理,并且过程很复杂。
业务数据相关性
Prometheus:监控服务的运行状态,基于Prometheus丰富的Client库,用户可以轻松的在应用程序中添加对Prometheus的支持,从而让用户可以获取服务和应用内部真正的运行状态。
Nagios:大部分的监控能力都是围绕系统的一些边缘性的问题,主要针对系统服务和资源的状态以及应用程序的可用性。
另外Prometheus还存在以下优点:
高效:单一Prometheus可以处理数以百万的监控指标;每秒处理数十万的数据点。
易于伸缩:通过使用功能分区(sharing)+联邦集群(federation)可以对Prometheus进行扩展,形成一个逻辑集群;Prometheus提供多种语言的客户端SDK,这些SDK可以快速让应用程序纳入到Prometheus的监控当中。
良好的可视化:Prometheus除了自带有Prometheus UI,Prometheus还提供了一个独立的基于Ruby On Rails的Dashboard解决方案Promdash。另外最新的Grafana可视化工具也提供了完整的Proetheus支持,基于Prometheus提供的API还可以实现自己的监控可视化UI。
架构组成及工作流程
架构图
Prometheus Server:Prometheus Sever是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储及查询。Prometheus Server可以通过静态配置管理监控目标,也可以配合使用Service Discovery的方式动态管理监控目标,并从这些监控目标中获取数据。其次Prometheus Sever需要对采集到的数据进行存储,Prometheus Server本身就是一个实时数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。Prometheus Server对外提供了自定义的PromQL,实现对数据的查询以及分析。另外Prometheus Server的联邦集群能力可以使其从其他的Prometheus Server实例中获取数据。
Exporters:Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可以获取到需要采集的监控数据。可以将Exporter分为2类:
直接采集:这一类Exporter直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。
间接采集:原有监控目标并不直接支持Prometheus,因此需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如:Mysql Exporter,JMX Exporter,Consul Exporter等。
AlertManager:在Prometheus Server中支持基于Prom QL创建告警规则,如果满足Prom QL定义的规则,则会产生一条告警。在AlertManager从 Prometheus server 端接收到 alerts后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,webhook 等。
PushGateway:Prometheus数据采集基于Prometheus Server从Exporter pull数据,因此当网络环境不允许Prometheus Server和Exporter进行通信时,可以使用PushGateway来进行中转。通过PushGateway将内部网络的监控数据主动Push到Gateway中,Prometheus Server采用针对Exporter同样的方式,将监控数据从PushGateway pull到Prometheus Server。
工作流程
1.Prometheus server定期从配置好的jobs或者exporters中拉取metrics,或者接收来自Pushgateway发送过来的metrics,或者从其它的Prometheus server中拉metrics。
2.Prometheus server在本地存储收集到的metrics,并运行定义好的alerts.rules,记录新的时间序列或者向Alert manager推送警报。
3.Alertmanager根据配置文件,对接收到的警报进行处理,发出告警。
4.在图形界面中,可视化采集数据。
示例展示
配置文件准备
创建配置文件 prometheus.yml 并设置权限 为 777 (避免 docer容器访问时没有权限)
docker@default:/tmp/prome$ touch prometheus.yml
docker@default:/tmp/prome$ ls
client prometheus.yml server
docker@default:/tmp/prome$ chmod 777 /tmp/prome/prometheus.yml
配置文件内容 如下:
global:
scrape_interval: 15s
external_labels:
monitor: 'codelab-monitor'
scrape_configs: //
- job_name: 'prometheus'//任务名称
scrape_interval: 5s //执行间隔
static_configs:
- targets: ['localhost:9090'] //目标
上述配置 大概意思就是 定义一个任务 prometheus 每隔5秒到 localhost:9090 这个地址获取监控指标 。 localhost:9090 这个地址就是 我们将要启动的 prometheus 服务(自己监控自己)。
下载并启动prometheus服务
docker pull prom/prometheus //下载prometheus 镜像
//将我们准备好的配置文件挂载 到prometheus 容器 并使用该配置文件启动容器 绑定 端口 9090
docker run -p 9090:9090 -v /tmp/prome/prometheus.yml:/etc/prometheus/prometheus.yml -v /tmp/prome/server/first.rules:/etc/prometheus/first.rules -v /tmp/prome/data:/prometheus-data prom/prometheus
启动成功后会显示如下信息
docker@default:/tmp/prome$ docker run -p 9090:9090 -v /tmp/prome/prometheus.yml:/etc/prometheus/prometheus.yml -v /tmp/prome/server/first.rules:/etc/prometheus/first.rules -v /tmp/prome/data:/prometheus-data prom/prometheus
level=info ts=2020-01-17T07:49:37.721Z caller=main.go:294 msg="no time or size retention was set so using the default time retention" duration=15d
level=info ts=2020-01-17T07:49:37.722Z caller=main.go:330 msg="Starting Prometheus" version="(version=2.15.2, branch=HEAD, revision=d9613e5c466c6e9de548c4dae1b9aabf9aaf7c57)"
level=info ts=2020-01-17T07:49:37.722Z caller=main.go:331 build_context="(go=go1.13.5, user=root@688433cf4ff7, date=20200106-14:50:51)"
level=info ts=2020-01-17T07:49:37.723Z caller=main.go:332 host_details="(Linux 4.14.131-boot2docker #1 SMP Thu Jun 27 20:54:17 UTC 2019 x86_64 cc2d993c8732 (none))"
level=info ts=2020-01-17T07:49:37.723Z caller=main.go:333 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2020-01-17T07:49:37.724Z caller=main.go:334 vm_limits="(soft=unlimited, hard=unlimited)"
level=info ts=2020-01-17T07:49:37.726Z caller=main.go:648 msg="Starting TSDB ..."
level=info ts=2020-01-17T07:49:37.731Z caller=head.go:584 component=tsdb msg="replaying WAL, this may take awhile"
level=info ts=2020-01-17T07:49:37.733Z caller=web.go:506 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2020-01-17T07:49:37.737Z caller=head.go:632 component=tsdb msg="WAL segment loaded" segment=0 maxSegment=0
level=info ts=2020-01-17T07:49:37.740Z caller=main.go:663 fs_type=EXT4_SUPER_MAGIC
level=info ts=2020-01-17T07:49:37.741Z caller=main.go:664 msg="TSDB started"
level=info ts=2020-01-17T07:49:37.741Z caller=main.go:734 msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
level=info ts=2020-01-17T07:49:37.744Z caller=main.go:762 msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml
level=info ts=2020-01-17T07:49:37.745Z caller=main.go:617 msg="Server is ready to receive web requests."
访问服务prometheus服务
访问 http://192.168.99.100:9090/metrics (192.168.99.100为docker宿主机的ip) 可以看到该服务的监控指标,prometheus根据配置文件定时从这里获取监测值
访问 http://192.168.99.100:9090/graph 可以对收集的指标进行 监控展示