一、Prometheus架构

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

Prometheus怎么监控数据-1

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

而针对云原生应用则不需要起一个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

Prometheus怎么监控数据-2

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