1、Prometheus 介绍
Prometheus是一个开源的系统监控和警报工具包,最初由SoundCloud开发并开源。它专注于在大规模分布式系统中收集时间序列数据,例如服务器指标、应用程序性能数据等。Prometheus具有高度灵活的查询语言PromQL,能够实时查询收集的数据,并支持强大的图形化展示和警报功能。它通常与Grafana等工具配合使用,用于可视化和分析监控数据。
1.1安装就不详细说明了
bash
# 1、包安装
[root@ubuntu2204 ~]#apt -y install prometheus
# 2、二进制安装
下载包,安装就可以了(不会可以私信我)
# 3、容器安装
#直接启动容器
[root@ubuntu:~]# apt install docker.io
[root@ubuntu:~]# docker pull prom/prometheus
[root@ubuntu:~]# docker run -d --name prometheus -p 9090:9090 prom/prometheus
#用自己的配置文件启动容器
#把容器里的配置文件复制出来,自己修改一下(定制容器)
[root@ubuntu:~]# docker cp prometheus:/etc/prometheus/prometheus.yml .
[root@ubuntu:~]# docker run -d --name prometheus -p 9090:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
2、Prometheus 组件
1、Prometheus Server
Prometheus Server 是核心组件,负责收集和存储时间序列数据,执行数据查询、聚合和存储。它可以通过 HTTP 协议暴露指标和查询 API,并通过配置的数据源定期抓取数据。
2、PromQL (Prometheus Query Language)
PromQL 是 Prometheus 的查询语言,用于从 Prometheus 中获取和分析时间序列数据。它支持丰富的操作符和函数,允许用户执行复杂的数据查询和聚合操作。
3、Exporters
Exporters 是用于从各种系统和服务中收集指标数据的组件。它们作为中间件,将数据转换成 Prometheus 可以理解的格式,并通过 HTTP 端点暴露给 Prometheus Server。常见的 Exporters 包括 Node Exporter、cAdvisor、Blackbox Exporter 等,每个用于不同类型的系统或服务监控。
4、Alertmanager
Alertmanager 是用于处理和管理 Prometheus 生成的警报的组件。它能够根据配置的规则对接收到的警报进行路由、抑制和通知处理,并支持多种通知方式(如电子邮件、企业微信、钉钉 等)。
5、Pushgateway
Pushgateway 是一种中介服务,用于短期作业和临时任务的指标收集。它允许客户端将指标推送到 Pushgateway,然后由 Prometheus Server 定期抓取这些指标。适用于一些短生命周期的任务,如批处理作业或定时任务。
6、Grafana Integration
虽然不是 Prometheus 自身的组件,但 Grafana 是一个流行的开源数据可视化和监控工具,广泛与 Prometheus 集成。Grafana 提供了强大的仪表板和查询功能,可以直观地展示 Prometheus 收集的指标数据。
3、PromQL
Prometheus Query Language (PromQL) 是一种强大的查询语言,用于从Prometheus服务器中检索和处理时间序列数据。它支持许多操作和函数,使得用户可以灵活地分析和聚合监控数据。
bash
1、基本查询:使用指标名称和可选的标签过滤器来检索时间序列数据。
示例:up{job="node"} 表示检索所有 job 标签为 "node" 的 up 指标数据。
-------------------------------------------------------------------------------------
2、聚合函数:PromQL 提供各种聚合函数,如 sum、avg、min、max 等,用于计算时间序列数据的汇总值。
示例:avg(rate(http_requests_total[5m])) 表示计算最近5分钟内 HTTP 请求速率的平均值。
-------------------------------------------------------------------------------------
3、操作符:支持数学和逻辑操作符,如 +、-、*、/、==、!= 等,用于在查询中进行计算和比较。
示例:node_memory_MemTotal_bytes - node_memory_MemFree_bytes 表示计算内存总量和空闲内存之间的差异。
-------------------------------------------------------------------------------------
4、范围选择:通过时间范围选择符号 [ ] 和 { },可以指定查询的时间范围和步长。
示例:rate(http_requests_total{job="api"}[5m]) 表示计算最近5分钟内 API job 的 HTTP 请求速率。
-------------------------------------------------------------------------------------
5、向量匹配:支持根据标签匹配的方式对多个时间序列进行操作和过滤。
示例:sum(rate(http_requests_total{job=~"api|frontend"}[5m])) 表示计算 API 和 frontend job 的 HTTP 请求速率之和。
4、Prometheus 标签管理
标签(Labels)是对时间序列数据进行维度化和区分的重要元素。有效的标签管理可以帮助你组织和查询监控数据。
bash
1、标签基础:
标签键(Label Key):标签的名称部分,例如 job、instance。
标签值(Label Value):与标签键关联的具体值,例如 node-exporter, localhost:9090。
2、标签在查询中的作用:
标签允许你对时间序列进行分类和过滤,例如通过 job="node-exporter" 来选择所有与 Node Exporter 相关的时间序列数据。
3、标签最佳实践:
选择合适的标签:选择具有代表性和描述性的标签键和值,这样可以更容易地组织和理解数据。
避免过多标签:尽量避免定义过多的标签,以免增加查询和存储的复杂性。
标签命名规范:建立良好的标签命名规范,例如使用小写字母、下划线或短划线分隔单词,以确保一致性和可读性。
------------------------------------------------------------------------------------
示例
1.定义和配置标签
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
labels:
environment: 'prod' # 标签
datacenter: 'us-east-1' # 标签
2.在查询中使用标签
up{job="node", environment="prod"}
3.标签在告警规则中的使用
groups:
- name: example
rules:
- alert: InstanceDown
expr: up{job="node"} == 0
for: 5m
labels:
severity: 'critical'
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "Instance {{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
在这个例子中,如果某个 job 是 node 的实例 up 指标值为 0 并且持续5分钟,将会触发 InstanceDown 告警
5、告警通知
Prometheus 的告警通知系统基于 Alertmanager 来管理告警的处理和发送。
bash
1、配置告警规则
在 Prometheus 的配置文件(例如 prometheus.yml)中,定义一个告警规则文件,并在告警规则文件中定义告警规则:
rule_files:
- 'alert.rules.yml'
groups:
- name: example
rules:
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: 'critical'
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "Instance {{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
alert 定义了告警名称 InstanceDown。
expr 定义了触发告警的条件:当 up 指标为 0 时。
for 定义了触发告警的持续时间:条件满足 5 分钟后触发告警。
labels 定义了告警的标签,用于标识告警的严重程度等信息。
annotations 定义了告警的附加信息,例如摘要和描述。
-------------------------------------------------------------------------------------
2、配置 Alertmanager
global:
resolve_timeout: 5m
route:
receiver: 'default'
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receivers:
- name: 'default'
email_configs:
- to: '[email protected]'
from: '[email protected]'
smarthost: 'smtp.example.com:587'
auth_username: '[email protected]'
auth_identity: '[email protected]'
auth_password: 'your-password'
global 配置了全局设置,例如告警解决的超时时间。
route 定义了告警的路由规则,包括接收器、分组方式、等待时间、重复间隔等。
receivers 定义了告警的接收器,这里配置了一个电子邮件接收器。
-------------------------------------------------------------------------------------
3、 将 Prometheus 与 Alertmanager 集成
alerting:
alertmanagers:
- static_configs:
- targets:
- 'localhost:9093' # Alertmanager 的地址
6、服务发现
Prometheus 的服务发现(Service Discovery)功能使得它可以自动发现和监控目标服务,而无需手动配置所有监控目标。这对于动态和大规模的环境(如Kubernetes、Consul、EC2等)特别有用。
- 静态配置(Static Configuration)
- DNS 服务发现(DNS Service Discovery)
- 文件服务发现(File Service Discovery)
- Consul 服务发现(Consul Service Discovery)
1、静态配置
bash
静态配置是最简单的服务发现方式,直接在Prometheus配置文件中指定目标服务。
prometheus.yml:
scrape_configs:
- job_name: 'static'
static_configs:
- targets: ['localhost:9090', 'localhost:9100']
2、DNS 服务发现
bash
通过DNS服务发现,可以根据DNS记录动态发现目标。
scrape_configs:
- job_name: 'dns'
dns_sd_configs:
- names:
- 'my-service.example.com' # 需要解析的 DNS 名称
type: 'A' # DNS 记录类型 (A 记录)
port: 9100 # 目标服务的端口
3、文件服务发现
bash
通过文件服务发现,可以将目标列表放在一个文件中,Prometheus会定期检查该文件的变化。
targets.json:
[
{
"targets": ["localhost:9090", "localhost:9100"],
"labels": {
"env": "prod"
}
}
]
prometheus.yml:
scrape_configs:
- job_name: 'file'
file_sd_configs:
- files:
- 'targets.json'
4、Consul 服务发现
bash
Consul 是一个服务网格解决方案,Prometheus可以通过它来发现服务。
scrape_configs:
- job_name: 'consul'
consul_sd_configs:
- server: 'localhost:8500'
services: []
7、各种 Exporter
Prometheus的exporter是用于导出不同系统和服务的监控指标的组件。exporter通过特定的接口或协议收集系统的性能数据,并以Prometheus可以读取的格式暴露这些数据。
1、Node_exporter
bash
# 做如下实现,需提前安装 node_exporter
# 官网下载安装
https://github.com/prometheus/node_exporter/releases
--collector.systemd #显示当前系统中所有的服务状态信息
--collector.systemd.unit-include #仅仅显示符合条件的systemd服务条目
--collector.systemd.unit-exclude #显示排除列表范围之外的服务条目
1、修改 node_exporter 的配置文件
[root@node01:~]# vim /lib/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/node_exporter/bin/node_exporter --collector.systemd --collector.systemd.unit-include=".*(ssh|mysql|node_exporter|nginx).*" #包含nginx,ssh,mysql,node_exporter
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
User=prometheus
Group=prometheus
[Install]
WantedBy=multi-user.target
#重启node_exporter服务
systemctl daemon-reload
systemctl restart node_exporter.service
2、修改 Prometheus 配置
#修改prometheus的配置文件,让它自动过滤文件中的节点信息
[root@prometheus:~]# vim /usr/local/prometheus/conf/prometheus.yml
scrape_configs:
- job_name: "node_exporter_service"
static_configs:
- targets: ["node01.zgh.org:9100"]
#重启服务
systemctl reload prometheus.service