Prometheus-基础
下载地址:https://prometheus.io/download/
Prometheus 概述
Promehteus是一款近年来非常火热的容器监控系统,它使用go语言开发,设计思路来源于Google的Borgmom(一个监控容器平台的系统)。产品由前谷歌SRE MattT.Proudd发起开发,并在其加入SoundCloud公司后,与另一位工程师Julius Volz合伙推出,将其开源发布。2016年,由Google发起的原生云基金会(Cloud Native Computing Foundation)将Prometheus纳入麾下,成为该基金会继Kubernetes后第二大开源项目。Promehteus天然具有对容器的适配性,可非常方便的满足容器的监控需求,也可用来监控传统资源。近年来随着kubernetes容器平台的火爆,Prometheus的热度也在不断上升,大有超越老牌监控系统Zabbix成为No.1的趋势,目前已在众多公司得到广泛的使用。
Prometheus 特点
- 多维度数据模型
- 灵活的查询语言
- 不依赖分布式存储,单个服务器节点是自主的
- 通过基于HTTP的pull方式采集时序数据
- 可以通过中间网关进行数据推送
- 通过服务发现或者静态配置来发现目标服务对象
- 支持多种多样的图表和界面展示,比如Grafana 等
Prometheus 相关组件
- Prmoetheus Server:服务端,用于处理和存储监控数据
- Exporter:监控客户端,用于收集各类监控数据,不同的监控需求由不同的exporter处理,如node-exporter、mysql-exporter、blackbox-exporter等。
- Pushgateway:在不支持pull拉取监控数据的场景中,可通过部署Pushgateway的方式,由监控源主动上报到Promtehus。
- Alertmanager:独立组件,用于处理告警信息。
- Web-UI:Pometheus自带的web界面,可进行监控数据的展示与查询。
- 其他支持工具:Promethues项目本身提供的组件及丰富的开源工具和套件
Prometheus-部署
部署服务端
安装
wget https://github.com/prometheus/prometheus/releases/download/v3.5.0/prometheus-3.5.0.linux-amd64.tar.gz
tar xvf prometheus-3.5.0.linux-amd64.tar.gz
mv prometheus-3.5.0.linux-amd64 /usr/local/prometheus配置service文件
# 创建程序用户
useradd -Ms /sbin/nologin prometheus
chown -R prometheus:prometheus /usr/local/prometheus
# 创建管理文件
cat > /usr/lib/systemd/system/prometheus.service << 'EOF'
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/data/prometheus/data/ \
--web.listen-address=0.0.0.0:9090
Restart=always
RestartSec=30
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable prometheus --now客户端部署
node_exporter
# 下载包
wget https://github.com/prometheus/node_exporter/releases/download/v1.9.1/node_exporter-1.9.1.linux-amd64.tar.gz
tar -xvf node_exporter-1.9.1.linux-amd64.tar.gz
mv node_exporter-1.9.1.linux-amd64/node_exporter /usr/local/bin
# 验证
node_exporter --version
# 创建程序用户
useradd -Ms /sbin/nologin node_exporter
# 配置service管理文件
cat > /usr/lib/systemd/system/node_exporter.service <<"EOF"
[Unit]
Description=Node Exporter for Prometheus
Documentation=https://prometheus.io/docs/guides/node-exporter/
After=network.target
[Service]
Type=simple
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter \
--web.listen-address=0.0.0.0:9100 \
--no-collector.ipvs
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable node_exporter --now
# 验证
# 浏览器通过访问:http://localhost:9100/metricsnginx-prometheus-exporter
wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v1.0.0/nginx-prometheus-exporter_1.0.0_linux_amd64.tar.gz
tar -xzf nginx-prometheus-exporter_1.0.0_linux_amd64.tar.gz -C /usr/local/bin/
# 检测
nginx-prometheus-exporter --version
# 创建程序用户
useradd -Ms /sbin/nologin nginx_exporter
# 创建管理文件
cat > /usr/lib/systemd/system/nginx_exporter.service << 'EOF'
[Unit]
Description=NGINX Prometheus Exporter
After=network.target
[Service]
Type=simple
User=nginx_exporter
Group=nginx_exporter
ExecStart=/usr/local/bin/nginx-prometheus-exporter -nginx.scrape-uri http://localhost/nginx_status
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl start nginx_exporter
sudo systemctl enable nginx_exportermysqld_exporter
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.17.2/mysqld_exporter-0.17.2.linux-amd64.tar.gz
tar -xvf mysqld_exporter-0.17.2.linux-amd64.tar.gzJMX Exporter
wget wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.19.0/jmx_prometheus_javaagent-0.19.0.jarprometheus.yml 解析
配置文件核心结构
Prometheus 的配置文件主要包含以下四个核心部分,有些配置还可能包含 remote_write 和 remote_read(远程读写配置):
| 配置块 | 核心作用 |
|---|---|
global | 定义全局默认值,如抓取间隔、超时时间等 |
alerting | 配置与 Alertmanager 的连接,用于发送告警 |
rule_files | 指定告警规则和记录规则的文件路径 |
scrape_configs | 定义监控任务和目标发现方式(最复杂部分) |
全局配置(global)
global 部分定义了 Prometheus server 的全局行为,这些设置可作为各 job 的默认值。
global:
scrape_interval: 15s # 默认抓取指标的频率
evaluation_interval: 15s # 评估告警规则的频率
scrape_timeout: 10s # 每次抓取的超时时间
external_labels: # 添加到所有时间序列的外部标签,用于多集群标识
cluster: "k8s-prod"
region: "us-west-1"生产建议:
scrape_interval和evaluation_interval建议设置相同值(如15s),以避免规则评估时数据不完整。scrape_timeout必须小于scrape_interval。- 使用
external_labels为所有指标添加集群、环境等标识,便于在多集群环境中聚合数据。
告警配置(alerting)
alerting 部分配置 Prometheus 如何将触发的告警发送给 Alertmanager。
alerting:
alertmanagers:
- scheme: http # 协议
timeout: 10s # 连接超时时间
static_configs:
- targets: ['alertmanager:9093'] # Alertmanager 实例地址
# 支持配置多个 Alertmanager 以实现高可用
# - targets: ['alertmanager1:9093', 'alertmanager2:9093']规则文件(rule_files)
rule_files 用于指定告警规则(Alerting rules)和记录规则(Recording rules)的文件路径,支持通配符 *。
rule_files:
- "rules/alerts.yml" # 告警规则文件
- "rules/recording.yml" # 记录规则文件
- "rules/k8s/*.yml" # 支持通配符规则文件示例 (rules/alerts.yml):
groups:
- name: example-alerts
rules:
- alert: HighRequestLatency
expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 1
for: 10m
labels:
severity: warning
annotations:
summary: "High latency on {{ $labels.instance }}"修改规则文件后,需向 Prometheus 发送 SIGHUP 信号或 HTTP POST 请求到 /-/reload 端点(需启动时启用 --web.enable-lifecycle)以重载配置。
抓取配置(scrape_configs)
这是配置文件中最核心的部分,定义了 Prometheus 要监控的对象(目标)以及如何发现这些对象。
1. 基本结构
每个 job_name 必须是唯一的。
scrape_configs:
- job_name: 'prometheus' # 任务名称,会作为标签添加到抓取的所有指标中
scrape_interval: 15s # 可覆盖全局抓取间隔
metrics_path: '/metrics' # 目标暴露指标的路径,默认为 `/metrics`
scheme: 'http' # 请求协议,默认为 http
static_configs: # 静态目标配置
- targets: ['localhost:9090'] # 监控目标地址列表2. 目标发现方式
Prometheus 支持多种服务发现机制,常见的有:
静态配置(static_configs):最简单的方式,直接指定目标的 IP 和端口。适用于目标数量固定且变化不频繁的环境。
yamlstatic_configs: - targets: ['192.168.1.10:9100', '192.168.1.11:9100'] labels: # 可为此组目标添加公共标签 region: 'east'文件服务发现(file_sd_configs):从 JSON 或 YAML 文件动态加载目标列表,Prometheus 会定期检查文件变化。适用于非 Kubernetes 环境的动态服务发现。
yamlfile_sd_configs: - files: ['targets/nodes.json'] # 存储目标列表的文件 refresh_interval: 5m # 刷新间隔targets/nodes.json示例:json[ { "targets": ["192.168.1.10:9100", "192.168.1.11:9100"], "labels": { "region": "east" } } ]Kubernetes 服务发现(kubernetes_sd_configs):在 Kubernetes 环境中,Prometheus 可以自动发现 Pod、Service、Endpoint 等资源作为监控目标。这是最强大的动态发现方式。
yaml- job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod # 发现角色,可以是 node, service, pod, endpoints, ingress relabel_configs: # 通常需要配合重标签进行过滤和元数据提取 - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true
3. 重标签配置(relabel_configs)
重标签(Relabeling)是 Prometheus 一个非常强大的功能,主要用于在抓取前修改目标的标签或过滤目标。
relabel_configs:在抓取之前修改从服务发现获取的目标元数据(如__meta_*标签),常用于动态生成__address__、__metrics_path__等,或过滤不需要抓取的目标。metric_relabel_configs:在抓取之后、存储之前,对抓取到的指标本身的标签进行修改、删除或过滤,常用于删除高基数标签(如user_id)、重命名指标或丢弃不需要的指标。
常见 relabel_configs 用法示例:
relabel_configs:
# 只抓取带有特定注解的 Pod
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
# 从注解中动态设置 metrics_path
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
# 动态组合地址和端口
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__完整生产级配置示例
以下是一个整合了上述要点的生产环境常用配置示例:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_timeout: 10s
external_labels:
environment: "production"
cluster: "k8s-prod"
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager.monitoring.svc:9093']
rule_files:
- "rules/alerts.yml"
- "rules/recording.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
file_sd_configs:
- files: ['targets/nodes.json']
refresh_interval: 5m
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
metric_relabel_configs:
- action: labeldrop
regex: (user_id|trace_id) # 删除高基数标签