Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes 的项目。
作为新一代的监控框架,Prometheus 具有以下特点:
需要指出的是,由于数据采集可能会有丢失,所以 Prometheus 不适用对采集数据要 100% 准确的情形。但如果用于记录时间序列数据,Prometheus 具有很大的查询优势,此外,Prometheus 适用于微服务的体系架构。
Prometheus 生态圈中包含了多个组件,其中许多组件是可选的:
下图为 Prometheus 官方文档中的架构图:
从上图可以看出,Prometheus 的主要模块包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及图形界面。
其大概的工作流程是:
下面将对 Prometheus 中的数据模型,metric 类型以及 instance 和 job 等概念进行介绍,以便读者在 Prometheus 的配置和使用中可以有一个更好的理解。
数据模型
Prometheus 中存储的数据为时间序列,是由 metric 的名字和一系列的标签(键值对)唯一标识的,不同的标签则代表不同的时间序列。
四种 Metric 类型
Prometheus 客户端库主要提供四种主要的 metric 类型:
Counter
例如,查询 http_requests_total{method="get", job="Prometheus", handler="query"} 返回 8,10 秒后,再次查询,则返回 14。
Gauge
例如:go_goroutines{instance="172.17.0.2", job="Prometheus"} 返回值 147,10 秒后返回 124。
Histogram
Summary
instance 和 jobs
instance: 一个单独 scrape 的目标, 一般对应于一个进程。
jobs: 一组同种类型的 instances(主要用于保证可扩展性和可靠性)
当 scrape 目标时,Prometheus 会自动给这个 scrape 的时间序列附加一些标签以便更好的分别,例如: instance,job。
下面是我在项目中部署的Prometheus 以及 Grafana:
[root ~]# kubectl get all | grep prometheus
pod/prometheus-xxxx-alertmanager-645885fd75-bc8j9 2/2 Running 0 5h
pod/prometheus-xxxx-kube-state-metrics-7b559f45bb-rpm86 1/1 Running 0 5h
pod/prometheus-xxxx-node-exporter-287jr 1/1 Running 0 5h
pod/prometheus-xxxx-node-exporter-667t2 1/1 Running 0 5h
pod/prometheus-xxxx-node-exporter-s9wt7 1/1 Running 0 5h
pod/prometheus-xxxx-pushgateway-65f8bd6966-9nqtq 1/1 Running 0 5h
pod/prometheus-xxxx-server-679488788d-xhmtz 2/2 Running 0 5h
service/glusterfs-dynamic-prometheus-xxxx-alertmanager ClusterIP xx.xxx.xx.213 1/TCP 5h
service/glusterfs-dynamic-prometheus-xxxx-server ClusterIP xx.xxx.xx.212 1/TCP 5h
service/prometheus-xxxx-alertmanager NodePort xx.xxx.xx.252 80:30200/TCP 5h
service/prometheus-xxxx-kube-state-metrics ClusterIP None 80/TCP 5h
service/prometheus-xxxx-node-exporter ClusterIP None 9100/TCP 5h
service/prometheus-xxxx-pushgateway ClusterIP xx.xxx.xx.197 9091/TCP 5h
service/prometheus-xxxx-server NodePort xx.xxx.xx.148 80:30100/TCP 5h
daemonset.apps/prometheus-xxxx-node-exporter 3 3 3 3 3 5h
deployment.apps/prometheus-xxxx-alertmanager 1 1 1 1 5h
deployment.apps/prometheus-xxxx-kube-state-metrics 1 1 1 1 5h
deployment.apps/prometheus-xxxx-pushgateway 1 1 1 1 5h
deployment.apps/prometheus-xxxx-server 1 1 1 1 5h
replicaset.apps/prometheus-xxxx-alertmanager-645885fd75 1 1 1 5h
replicaset.apps/prometheus-xxxx-kube-state-metrics-7b559f45bb 1 1 1 5h
replicaset.apps/prometheus-xxxx-pushgateway-65f8bd6966 1 1 1 5h
replicaset.apps/prometheus-xxxx-server-679488788d 1 1 1 5h
[root ~]# kubectl get all | grep grafana
pod/grafana-5469bc849d-7rrhn 1/1 Running 0 5h
service/grafana NodePort xx.xxx.xxx.112 80:30000/TCP 5h
deployment.apps/grafana 1 1 1 1 5h
replicaset.apps/grafana-5469bc849d 1 1 1 5h
Dashboard: