在本指南中,我们将具体相识 Prometheus 架构,以有效地明白、设置和使用 Prometheus。
Prometheus 是一个用 Golang 编写的盛行开源监控 和警报体系,可以大概网络和处理惩罚来自各种目的的指标。您还可以查询、查察、分析指标并根据阈值收到警报。
别的,在当当代界,可观察性对于每个构造都变得至关紧张,而 Prometheus 是开源范畴的关键观测工具之一。
Prometheus 架构概述
Prometheus紧张由以下部分构成:
- Prometheus Server
- Service Discovery
- Time-Series Database (TSDB)
- Targets
- Exporters
- Push Gateway
- Alert Manager
- Client Libraries
- PromQL
让我们具体看看每个组件。
Prometheus Server
Prometheus 服务器是基于指标的监控 体系的大脑。服务器的紧张工作是使用拉模子从各个目的网络指标。目的只不外是服务器、pod、端点等,我们将在下一个主题中具体先容它们。使用 Prometheus 从目的网络指标的通用术语称为抓取。
Prometheus 根据我们在 Prometheus 设置文件中给出的抓取隔断定期抓取指标。这是一个设置示例。
- global:
- scrape_interval: 15s
- evaluation_interval: 15s
- scrape_timeout: 10s
- rule_files:
- - "rules/*.rules"
- scrape_configs:
- - job_name: 'prometheus'
- static_configs:
- - targets: ['localhost:9090']
- - job_name: 'node-exporter'
- static_configs:
- - targets: ['node-exporter:9100']
- alerting:
- alertmanagers:
- - static_configs:
- - targets: ['alertmanager:9093']
复制代码 Time-Series Database (TSDB)
prometheus 吸收到的指标数据随着时间的推移而变革(CPU、内存、网络 IO 等)。它被称为时间序列数据。因此 Prometheus 使用时间序列数据库(TSDB)来存储其全部数据。默认环境下,Prometheus 以高效的格式(块)将其全部数据存储在本地磁盘中。随着时间的推移,它会压缩全部旧数据以节省空间。它还具有删除旧数据的生存战略。TSDB 具有内置的机制来管理长期生存的数据。您可以选择以下恣意数据生存战略。
- 基于时间的生存:数据将生存指定的天数。默认生存期为 15 天。
- 基于巨细的生存:您可以指定 TSDB 可以容纳的最大数据量。一旦到达这个限定,普罗米修斯将开释空间来容纳新数据。
Prometheus 还提供远程存储选项。这紧张是存储可扩展性、长期存储、备份和灾难规复等所须要的。
Prometheus Targets
Target 是 Prometheus 抓取指标的泉源。目的可以是服务器、服务、Kubernetes Pod、应用步伐端点等。
默认环境下,prometheus 会在目的的 /metrics 路径下查找指标。可以在目的设置中更改默认路径。这意味着,如果您不指定自界说指标路径,Prometheus 会在 /metrics 下查找指标。
目的设置位于 Prometheus 设置文件中的 scrape_configs 下。这是一个设置示例。
- scrape_configs:
-
- - job_name: 'node-exporter'
- static_configs:
- - targets: ['node-exporter1:9100', 'node-exporter2:9100']
-
- - job_name: 'my_custom_job'
- static_configs:
- - targets: ['my_service_address:port']
- metrics_path: '/custom_metrics'
- - job_name: 'blackbox-exporter'
- static_configs:
- - targets: ['blackbox-exporter1:9115', 'blackbox-exporter2:9115']
- metrics_path: /probe
- - job_name: 'snmp-exporter'
- static_configs:
- - targets: ['snmp-exporter1:9116', 'snmp-exporter2:9116']
- metrics_path: /snmp
复制代码 Prometheus 须要来自目的端点的特定文本格式的数据。每个指标都必须换行。通常,这些指标使用 Prometheus exporters 来袒露。Prometheus exporter 通常和 target 伴生在一起。
Prometheus Exporters
Exporter 就像在目的上运行的署理。它将指标从特定体系转换为普罗米修斯可以明白的格式。它可以是体系指标,如 CPU、内存等,也可以是 Java JMX 指标、MySQL 指标等。
默认环境下,这些转换后的指标由 Exporter 在目的的 /metrics 路径(HTTP 端点)上公开。比方,如果要监控 服务器的 CPU 和内存,则须要在该服务器上安装 Node Exporter,而且 Node Exporter 以 prometheus 指标格式在 /metrics 上公开 CPU 和内存指标。一旦 Prometheus 提取指标,它将联合指标名称、标签、值和时间戳天生结构化数据。
社区有很多 Exporters 可用,但只有此中一些得到 Prometheus 官方认可。如果您须要更多自界说收罗,则须要创建自己的导出器。Prometheus 将 Exporter 分为各个部分,比方数据库、硬件、题目跟踪器和一连集成、消息体系、存储、公开 Prometheus 指标的软件、其他第三方实用步伐等。您可以从官方文档中查察每个种别的 Exporter 列表。
在 Prometheus 设置文件中,全部 Exporter 的具体信息将在 scrape_configs 下给出。
- scrape_configs:
- - job_name: 'node-exporter'
- static_configs:
- - targets: ['node-exporter1:9100', 'node-exporter2:9100']
- - job_name: 'blackbox-exporter'
- static_configs:
- - targets: ['blackbox-exporter1:9115', 'blackbox-exporter2:9115']
- metrics_path: /probe
- - job_name: 'snmp-exporter'
- static_configs:
- - targets: ['snmp-exporter1:9116', 'snmp-exporter2:9116']
- metrics_path: /snmp
复制代码 Prometheus Service Discovery
Prometheus 使用两种方法从目的中获取指标。
- 静态设置:当目的具有静态 IP 或 DNS 端点时,我们可以使用这些端点作为目的。
- 服务发现:在大多数自动伸缩体系和 Kubernetes 平分布式体系中,目的不会有静态端点。在这种环境下,使用 prometheus 服务发现来发现目的端点,而且目的会自动添加到 prometheus 设置中。
在进一步讨论之前,让我展示一个使用 kubernetes_sd_configs 的 Prometheus 设置文件的 Kubernetes 服务发现块的小示例。
- scrape_configs:
- - job_name: 'kubernetes-apiservers'
- kubernetes_sd_configs:
- - role: endpoints
- scheme: https
- tls_config:
- ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
- bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
- relabel_configs:
- - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
- action: keep
- regex: default;kubernetes;https
复制代码 Kubernetes 是动态目的的美满示例。在这里,您不能使用静态目的方法,由于 Kubernetes 集群中的目的(pod)大概是短暂存活的。
Kubernetes 中另有基于文件的服务发现 file_sd_configs 。它实用于静态目的,但经典静态设置 static_configs 和 file_sd_configs 之间的紧张区别在于,在这种环境下,我们创建单独的 JSON 或 YAML 文件并将目的信息生存在文件中。Prometheus 将读取文件来辨认目的。
不但这两种,还可以使用各种服务发现方法,比方 consul_sd_configs(prometheus 从 consul 获取目的具体信息)、ec2_sd_configs 等。如需相识更多设置细节,请访问官方文档。
Prometheus Pushgateway
Prometheus 默认使用 pull 方式来抓取指标。然而,有些场景须要将指标推送到 prometheus。让我们举一个在 Kubernetes cronjob 上运行的批处理惩罚作业的示例,该作业每天根据某些事故运行 5 分钟。在这种环境下,Prometheus 将无法使用拉机制精确抓取服务级别指标。因此,我们须要将指标推送到 prometheus,而不是等候 prometheus 拉取指标。为了推送指标,prometheus 提供了一个名为 Pushgateway 的办理方案。它是一种中心网关。
Pushgateway 须要作为独立组件运行。批处理惩罚作业可以使用 HTTP API 将指标推送到 Pushgateway。然后 Pushgateway 在 /metrics 端点上公开这些指标。然后 Prometheus 从 Pushgateway 中抓取这些指标。
Pushgateway 将指标数据暂时存储在内存中。它更像是一个暂时缓存。Pushgateway 设置也将在 Prometheus 设置中的 scrape_configs 部分下举行设置。
- scrape_configs:
- - job_name: "pushgateway"
- honor_labels: true
- static_configs:
- - targets: [pushgateway.monitoring.svc:9091]
复制代码 要将指标发送到 Pushgateway,您须要使用 prometheus 客户端库对应用步伐插桩,或使用脚本袒露指标。
Prometheus Client Libraries
Prometheus 客户端库是可用于检测应用步伐代码的软件库,以 Prometheus 明白的方式公开指标。如果您须要自行埋点插桩或想要创建自己的Exporter,则可以使用客户端库。
一个非常好的用例是须要将指标推送到 Pushgateway 的批处理惩罚作业。批处理惩罚作业使用客户端库来埋点,以 prometheus 格式袒露指标。下面是一个 Python Client Library 的示例,它公开了名为 batch_job_records_processed_total 的自界说指标。
- from prometheus_client import start_http_server, Counter
- import time
- import random
- RECORDS_PROCESSED = Counter('batch_job_records_processed_total', 'Total number of records processed by the batch job')
- def process_record():
- time.sleep(random.uniform(0.01, 0.1))
- RECORDS_PROCESSED.inc()
- def batch_job():
-
- for _ in range(100):
- process_record()
- if __name__ == '__main__':
-
- start_http_server(8000)
- print("Metrics server started on port 8000")
- batch_job()
- print("Batch job completed")
- while True:
- time.sleep(1)
复制代码 在使用客户端库时,prometheus_client 会在 /metrics 端点上公开指标。Prometheus 拥有险些全部编程语言的客户端库,如果您想创建客户端库,也 OK。要相识更多创建指南和查察客户端库列表,您可以参考官方文档。
Prometheus Alert Manager
Alertmanager 是 Prometheus 监控体系的关键部分。它的紧张工作是根据 Prometheus 警报设置中设置的指标阈值发送警报。警报由 Prometheus 触发(注意,是由 Prometheus 历程触发原始告警)并发送到 Alertmanager。Alertmanager 对告警去重、克制、静默、分组,末了使用各类关照媒介(电子邮件、slack 等)发出告警事故。其具体功能:
- Alert Deduplicating:消除重复警报
- Grouping:将干系警报分组在一起
- Silencing:静默维护
- Routing:路由,根据严肃性将警报路由到恰当的吸收者
- Inhibition:克制,当存在中高严肃性警报时克制低严肃性警报的过程
以下是警报规则的设置示例:
- groups:
- - name: microservices_alerts
- rules:
- - record: http_latency:average_latency_seconds
- expr: sum(http_request_duration_seconds_sum) / sum(http_request_duration_seconds_count)
- - alert: HighLatencyAlert
- expr: http_latency:average_latency_seconds > 0.5
- for: 5m
- labels:
- severity: critical
- annotations:
- summary: "High latency detected in microservices"
- description: "The average HTTP latency is high ({{ $value }} seconds) in the microservices cluster."
复制代码 这是 Alertmanager 设置文件的路由设置示例:
- routes:
- - match:
- severity: 'critical'
- receiver: 'pagerduty-notifications'
- - match:
- severity: 'warning'
- receiver: 'slack-notifications'
复制代码 Alertmanager 支持大多数消息和关照体系,比方 Discord、电子邮件、Slack 等,以将警报作为关照发送给吸收者。
PromQL
PromQL 是一种机动的查询语言,可用于从 prometheus 查询时间序列指标。
译者注:这是 Prometheus 生态的重中之重,我之前写过一篇《PromQL 从入门到醒目》,只管融入了生产使用场景,读者可以下载学习。
我们可以直接从 Prometheus 用户界面使用查询,也可以使用 curl 下令通过下令行界面举行查询。
Prometheus UI
别的,当您将 prometheus 作为数据源添加到 Grafana 时,您可以使用 PromQL 来查询和创建 Grafana 仪表板,如下所示。
总结
这表明了 Prometheus 架构的紧张组件,并将给出 Prometheus 设置的根本概述,您还可以使用设置做很多事变。每个构造的需求会有所差别,而且 Prometheus 在不恻隐况(比方 VM 和 Kubernetes)中的实现也有所差别。如果您相识底子知识和关键设置,您就可以轻松地在任何平台上落地它。
本文翻译自这里。读者既然读到这里了,分析对 IT 监控这块很感爱好,如下内容大概也会对您有所资助:
- 运维监控实战条记 是我在极客时间写的一个专栏,对监控体系的方方面面都有涉及,已经有近万人学习了,您也可以试读一下。
- github.com/ccfos/nightingale 是我们开源的运维监控体系,办理 Prometheus 告警规则管理的题目,可以 star 一下收藏备用。
- FlashDuty 事故 OnCall 中央 是同一的告警分发平台,一样寻常公司都有多套监控体系(Zabbix、Prometheus、Nightingale、蓝鲸、云监控、Graylog、Skywalking、监控宝等),FlashDuty 可以对接各类监控体系,做同一的告警收敛降噪、排班、认领升级、报表统计、团队协划一功能。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |