Skip to content

Prometheus-基础

官网:https://prometheus.io/

下载地址: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-部署

部署服务端

安装

bash
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文件

bash
# 创建程序用户
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

bash
# 下载包
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/metrics

nginx-prometheus-exporter

bash
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_exporter

mysqld_exporter

bash
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.gz

JMX Exporter

bash
wget wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.19.0/jmx_prometheus_javaagent-0.19.0.jar

prometheus.yml 解析

配置文件核心结构

Prometheus 的配置文件主要包含以下四个核心部分,有些配置还可能包含 remote_writeremote_read(远程读写配置):

配置块核心作用
global定义全局默认值,如抓取间隔、超时时间等
alerting配置与 Alertmanager 的连接,用于发送告警
rule_files指定告警规则和记录规则的文件路径
scrape_configs定义监控任务和目标发现方式(最复杂部分)

全局配置(global)

global 部分定义了 Prometheus server 的全局行为,这些设置可作为各 job 的默认值。

yaml
global:
  scrape_interval: 15s      # 默认抓取指标的频率
  evaluation_interval: 15s  # 评估告警规则的频率
  scrape_timeout: 10s       # 每次抓取的超时时间
  external_labels:          # 添加到所有时间序列的外部标签,用于多集群标识
    cluster: "k8s-prod"
    region: "us-west-1"

生产建议

  • scrape_intervalevaluation_interval 建议设置相同值(如 15s),以避免规则评估时数据不完整。
  • scrape_timeout 必须小于 scrape_interval
  • 使用 external_labels 为所有指标添加集群、环境等标识,便于在多集群环境中聚合数据。

告警配置(alerting)

alerting 部分配置 Prometheus 如何将触发的告警发送给 Alertmanager。

yaml
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)的文件路径,支持通配符 *

yaml
rule_files:
  - "rules/alerts.yml"       # 告警规则文件
  - "rules/recording.yml"    # 记录规则文件
  - "rules/k8s/*.yml"        # 支持通配符

规则文件示例 (rules/alerts.yml):

yaml
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 必须是唯一的。

yaml
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 和端口。适用于目标数量固定且变化不频繁的环境。

    yaml
    static_configs:
      - targets: ['192.168.1.10:9100', '192.168.1.11:9100']
        labels: # 可为此组目标添加公共标签
          region: 'east'
  • 文件服务发现(file_sd_configs):从 JSON 或 YAML 文件动态加载目标列表,Prometheus 会定期检查文件变化。适用于非 Kubernetes 环境的动态服务发现。

    yaml
    file_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 用法示例

yaml
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__

完整生产级配置示例

以下是一个整合了上述要点的生产环境常用配置示例:

yaml
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) # 删除高基数标签