{D1} - Prometheus初识和服务部署
+++ 第一部分:Prometheus简介及一些必要的名词解释 +++
From metrics to insight
Power your metrics and alerting with the leading open-source monitoring solution.
从指标到洞察力,使用领先的开源监控解决方案为您的数据指标和警报提供助力。
什么是Prometheus?
Prometheus是一个开源系统监控和警报工具包,最初在 SoundCloud构建。自 2012 年成立以来,许多公司和组织都采用了 Prometheus,该项目拥有非常活跃的开发者和用户社区。它现在是一个独立的开源项目,独立于任何公司维护。为了强调这一点,并明确项目的治理结构,Prometheus 于 2016 年加入 云原生计算基金会,成为继Kubernetes之后的第二个托管项目。
她的主要特点是:
- 具有由度量名称和键/值对标识的时间序列数据的多维数据模型
- PromQL,一种灵活查询语言
- 不依赖分布式存储;单个服务器节点是自治的
- 时间序列收集通过 HTTP 上的拉模型进行
- 通过中间网关(pushgateway)支持推送时间序列
- 通过服务发现或静态配置发现目标
- 多种图形模式和仪表板支持
Prometheus 的架构及其一些生态系统组件
(原图可放大)
Prometheus 直接从target拉取(poll)或通过推送网关从短期作业(short-lived jobs)中抓取指标。然后将所有抓取的样本数据落盘到本地存储(或者是通过接口写入远端存储),并对这些数据依据规则进行计算,以从现有数据聚合和记录新的时间序列或生成警报。Grafana或其他API使用者可用于可视化收集的数据。
部分组件介绍:
1)Prometheus Server: 用于收集,存储和分析时间序列数据。
2)Client Library: 客户端库,检测应用程序代码,当Prometheus抓取实例的HTTP端点时,客户端库会将所有跟踪的metrics指标的当前状态发送到prometheus server端。
3)pushgateway: 各个目标主机可主动上报数据到pushgateway,然后prometheus server统一从pushgateway拉取数据。
4)exporters: prometheus支持多种exporter,通过poll方式对远端exporter采集metrics数据集,然后返回到prometheus server端。
5)Alertmanager: 从Prometheus server端接收到alerts后,会进行去重/分组/抑制,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉, slack等。
6)Grafana:监控仪表盘,可视化监控数据
数据模型
Prometheus fundamentally stores all data as time series: streams of timestamped values belonging to the same metric and the same set of labeled dimensions. Besides stored time series, Prometheus may generate temporary derived time series as the result of queries.
Prometheus 从根本上将所有数据存储为时间序列:属于
同一指标
和同一组标记
维度的时间戳值流。除了存储的时间序列,Prometheus 可能会生成临时派生的时间序列作为查询的结果。
指标名称和标签
每个时间序列都由其度量名称和称为标签的可选键值对唯一标识。 度量名称指定被测量的系统的一般特征(例如-http_requests_total接收到的 HTTP 请求的总数)。它可能包含 ASCII 字母和数字,以及下划线和冒号。它必须与正则表达式匹配[a-zA-Z_:][a-zA-Z0-9_:]*。
!注意:冒号是为用户定义的`record rule`保留的。后面性能优化部分会讲到。
标签启用 Prometheus 的维度数据模型:相同度量名称的任何给定标签组合标识该度量的特定维度实例(例如:使用该方法的所有 HTTP 请求POST到/api/tracks处理程序)。查询语言允许基于这些维度进行过滤和聚合。更改任何标签值,包括添加或删除标签,都会创建一个新的时间序列。
标签名称可能包含 ASCII 字母、数字以及下划线。它们必须与正则表达式匹配[a-zA-Z_][a-zA-Z0-9_]*。以开头的标签名称__ 保留供内部使用。标签值可以包含任何 Unicode 字符。具有空标签值的标签被认为等同于不存在的标签。
样本(Sample)
样本形成实际的时间序列数据。每个样本包括:
- 一个 float64 值
- 毫秒精度的时间戳
符号(Notation) - 或者我觉得也可以称为数据格式样例
<metric name>{<label name>=<label value>, ...}
// 如下表示具有度量名称api_http_requests_total和标签method="POST"的时间序列handler="/messages"
api_http_requests_total{method="POST", handler="/messages"}
指标类型(Metric Types)
Counter
- 计数器。用于累计值,例如记录请求次数、任务完成数、错误发生次数。一直增加,不会减少,重启进程后,会被重置。如rate()
,topk()
Gauge
- 仪表盘。用于常规数值,例如温度变化、内存使用变化。可变大,可变小,重启进程后,会被重置。如dalta()
,predict_linear()
Histogram
- 柱状图/直方图。1)在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中. 后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。2)对每个采样点值累计和(sum)。 3)对采样点的次数累计和(count)Summary
- 摘要。与Histogram类型类似,用于表示一段时间内的数据采样结果(通常是请求持续时间或响应大小等),但它直接存储了分位数(通过客户端计算,然后展示出来),而不是通过区间来计算。
后面讲解promQL用法会对以上数据类型详细说明。
作业和实例(Jobs&Instances)
在Prometheus术语中,可以抓取的端点(endpoint)称为实例
。通常对应于单个进程。具有相同目的的实例集合,例如为可伸缩性或可靠性而复制的流程,称为作业
。
自动生成的标签和时间序列
当 Prometheus 抓取一个目标时,它会自动将一些标签附加到抓取的时间序列上,用于识别抓取的目标:
- job:目标所属的已配置作业名称。
- instance:
: 被抓取的目标 URL 的一部分。
如果这些标签中的任何一个已经存在于抓取的数据中,则行为取决于honor_labels配置选项。有关更多信息,请参阅抓取配置文档 。
对于每个实例抓取,Prometheus 将样本存储在以下时间序列中:
# 如果实例是健康的,即可达,或者0如果抓取失败。up时间序列对于实例可用性监控很有用。
up{job="<job-name>", instance="<instance-id>"}:1
# scrape的持续时间。
scrape_duration_seconds{job="<job-name>", instance="<instance-id>"}
# 应用度量重新标记后剩余的样本数。
scrape_samples_post_metric_relabeling{job="<job-name>", instance="<instance-id>"}
# 目标暴露的样本数。
scrape_samples_scraped{job="<job-name>", instance="<instance-id>"}
# 本次抓取中新系列的大致数量。
scrape_series_added{job="<job-name>", instance="<instance-id>"}
好了,暂时我们先对Prometheus有个初步的认识,后面章节会进行深入剖析。下面我们进入动手环节,百闻不如一见,部署搞起来。
+++ 第二部分:Prometheus组件服务部署 +++
部署主机 | 服务列表 |
---|---|
192.168.56.11 | Prometheus / 9090 Pushgateway / 9091 Alertmanager / 9093 VictoriaMetrics / 8428(tsdb的远端存储) node_exporter / 9100 |
192.168.56.12 | node_exporter / 9100 grafana / 3000 webhook / 5000 |
为了更好熟悉各个组件的配置参数含义和方便debug,这里我们直接使用命令行模式启动程序。如果想使用systemd管理来管理服务,可以参考本文最后的systemd配置样例。
# 下载&解压二进制安装包
$ curl -L -Ss http://file.dadou.io/011100/packages.sh|bash
# 配置安装并启动
$ cd /data/monitor/prometheus
$ wget -c http://file.dadou.io/011100/prometheus-configs.zip # 下载并解压
$ nohup ./prometheus --web.enable-lifecycle \
--config.file=prometheus.yml \
--storage.tsdb.path="./data" \
--storage.tsdb.retention=7d \
--storage.tsdb.retention.size=1GB \
--web.listen-address="192.168.56.11:9090" \
--log.level=info \
--web.enable-admin-api \
--web.external-url="http://192.168.56.11:9090" > prometheus.log 2>&1 &
# 安装alertmanager
$ cd /data/monitor/alertmanager
$ wget -c http://file.dadou.io/011100/alertmanager-configs.zip # 下载并解压
$ nohup ./alertmanager --storage.path="./data/" \
--config.file=alertmanager.yml \
--web.external-url="http://192.168.56.11:9093/" > alertmanager.log 2>&1 &
# 安装node_exporter
$ cd /data/monitor/node_exporter
$ nohup ./node_exporter --web.listen-address="192.168.56.11:9100" > node_exporter.log 2>&1 &
# 安装pushgateway
$ cd /data/monitor/pushgateway && mkdir data
$ nohup ./pushgateway --persistence.file="./data" \
--persistence.interval=5m \
--web.listen-address=":9091" \
--web.telemetry-path="/metrics" > pushgateway.log 2>&1 &
# 安装victoria-metrics
$ cd /data/monitor/victoria-metrics
$ mkdir victoria-metrics-data
$ nohup ./victoria-metrics-prod \
-storageDataPath="./victoria-metrics-data" \
-httpListenAddr=127.0.0.1:8428 \
-retentionPeriod=1 > victoria-metrics.log 2>&1 &
# docker版本grafana快速安装
$ docker run -dit \
--name grafana \
-p 3000:3000 \
-v /data/monitor/grafana/:/var/lib/grafana \
grafana/grafana
也可以基于systemd来管理prom家族的各个组件,下面是prometheus的启动配置样例:
$ sudo useradd --no-create-home --shell /bin/false prometheus
$ chown prometheus:prometheus /data/monitor/prometheus
$ sudo tee /etc/systemd/system/prometheus.service <<EOF
[Unit]
Description=Prometheus Monitoring
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/data/monitor/prometheus/prometheus \
--config.file /data/monitor/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/data/monitor/prometheus/consoles \
--web.console.libraries=/data/monitor/prometheus/console_libraries
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
EOF
$ sudo systemctl daemon-reload && \
systemctl enable prometheus && \
systemctl start prometheus && \
systemctl status prometheus
正常安装完之后,可以访问Prometheus提供的webUI验证效果,如果无法访问,确认上面步骤是否正确,或者防火墙是否开放相应端口。
好了,今天我们先对Prometheus有个初步了解和部署,接下来我们在深入每个环境进行深入了解。
参考或使用文档:
- https://prometheus.io/docs/introduction/overview/
- https://awesome-prometheus-alerts.grep.to/rules.html
- https://pracucci.com/prometheus-understanding-the-delays-on-alerting.html
- https://github.com/PierreVincent/prom-http-simulator
- https://www.soulchild.cn/2168.html
- https://www.gl.sh.cn/2021/06/19/prometheus_qi_ye_wei_xin_bao_jing.html