一、Prometheus架构¶
Prometheus 生态系统由多个组件组成,其中架构图如下:

关于每个组件的用途如下:
- Prometheus Server(Prometheus 服务器):Prometheus Server 是核心组件,负责数据的采集、存储和查询。它定期通过 HTTP 协议从各种目标(例如应用程序、服务、系统)中拉取指标数据。拉取的时间序列数据存储在本地的时间序列数据库中。Prometheus Server 还暴露了一个 HTTP API,供用户通过 PromQL 查询语言对时间序列数据进行查询和聚合
- Exporter(出口器): Exporter 是用于将第三方系统或服务的监控数据转换成 Prometheus 可以理解的格式的中间组件。Exporter 通常是一个单独的进程或服务,与待监控的目标系统紧密集成。通过向 Prometheus Server 提供指标数据,Exporter 允许 Prometheus 监控更多类型的目标。
- Push Gateway(推送网关): Push Gateway 是一种特殊的 Exporter,用于解决短期任务的监控场景。例如,如果有一些短暂运行的任务(如批处理任务),这些任务结束后,它们的指标数据将不再可用。在这种情况下,任务可以将其指标数据推送到 Push Gateway 中,并且 Prometheus Server 可以定期从 Push Gateway 中拉取这些数据。
- 时间序列数据库: Prometheus Server 使用本地时间序列数据库来存储采集的指标数据。这些数据以适合高效查询的方式存储,Prometheus Server 可以根据时间范围、标签等条件来快速检索和聚合数据。
- PromQL(Prometheus 查询语言): PromQL 是 Prometheus 的查询语言,允许用户执行灵活的查询、过滤和聚合时间序列数据。用户可以使用 PromQL 来创建自定义的监控指标、警报条件和仪表盘。
- 警报规则: Prometheus 允许用户定义警报规则,当满足特定条件时触发警报通知。这些规则可以基于时间序列数据的值或其他条件来设置。警报通知可以通过电子邮件、Slack 等渠道发送给相关团队,帮助及时响应和处理问题。
- Grafana : Prometheus 可以与 Grafana 或其他可视化工具集成,用于创建图表、仪表盘和可视化监控数据。这样用户可以更直观地了解系统和应用程序的性能和运行状况
- Service Discovery:用来发现监控目标的自动发现,常用的有基于 Kubernetes、 Consul、Eureka、文件的自动发现等。
- Alertmanager:Prometheus 生态用于告警的组件,Prometheus Server 会将告警发 送给 Alertmanager,Alertmanager 根据路由配置,将告警信息发送给指定的人或 组。Alertmanager 支持邮件、Webhook、微信、钉钉、短信等媒介进行告警通知
二、Prometheus怎么监控数据¶
从Prometheus的架构中了解到,Prometheus通常采用Pull的形式来拉取数据,也就意味着被监控应用只要有一个能获取到监控数据的接口,就可以采集到监控数据。
基于云原生理念开发的程序自己会暴露Metrics接口,就像Kubernetes本身的组件、Etcd等,都有一个/metrics接口,Prometheus只需要请求这个接口即可获取到相关数据;基于非云原生理念开发的程序自己不会暴露Metrics接口,一般通过Exporter采集非云原生应用的内部数据,它可以通过某些机制(比如调用接口、执行客户端命名)来获取内部一些比较重要的数据,然后将其转换成Prometheus能够识别的数据,并且由Exporter暴露/metrics,然后Prometheus就可以采集到由Exporter暴露的非云原生应用的内部运行状态。
目前比较常用的 Exporter 工具如下:
| 类型 | Exporter |
|---|---|
| 数据库 | MySQL Exporter, Redis Exporter, MongoDB Exporter, MSSQL Exporter |
| 硬件 | Apcupsd Exporter,IoT Edison Exporter, IPMI Exporter, Node Exporter |
| 消息队列 | Beanstalkd Exporter, Kafka Exporter, NSQ Exporter, RabbitMQ Exporter |
| 存储 | Ceph Exporter, Gluster Exporter, HDFS Exporter, ScaleIO Exporter |
| HTTP 服务 | Apache Exporter, HAProxy Exporter, Nginx Exporter |
| API 服务 | AWS ECS Exporter, Docker Cloud Exporter, Docker Hub Exporter, GitHub Exporter |
| 日志 | Fluentd Exporter, Grok Exporter |
| 监控系统 | Collectd Exporter, Graphite Exporter, InfluxDB Exporter, Nagios Exporter, SNMP Exporter |
| 其它 | Blackbox Exporter, JIRA Exporter, Jenkins Exporter, Confluence Exporter |
上面安装完成后,因为是daemonset,会在每个节点上起一个node-exporter
[root@k8s-master01 manifests]# kubectl get svc -n monitoring | grep node-exporter
node-exporter ClusterIP None <none> 9100/TCP 5h30m
[root@k8s-master01 manifests]# netstat -nltp | grep 9100
tcp 0 0 127.0.0.1:9100 0.0.0.0:* LISTEN 22594/node_exporter
tcp 0 0 192.168.1.31:9100 0.0.0.0:* LISTEN 18958/kube-rbac-pro
通过9100端口获取监控数据
[root@k8s-master01 manifests]# curl 127.0.0.1:9100/metrics

说明:回显内容太多,只截取了一部分
而针对云原生应用则不需要起一个node-exporter ,比如kubelet,直接通过/metrics获取数据
[root@k8s-master01 manifests]# netstat -nltp | grep kubelet
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 1932/kubelet
tcp6 0 0 :::10250 :::* LISTEN 1932/kubelet
tcp6 0 0 :::10255 :::* LISTEN 1932/kubelet
kubelet 的 10250 端口用于与 Kubernetes 控制平面和管理工具进行交互,而 10255 端口用于提供节点和 Pod 的只读信息给监控和监测工具。
[root@k8s-master01 manifests]# curl 127.0.0.1:10255/metrics

说明:回显内容太多,只截取了一部分