Prometheus监控告警体系搭建:从指标采集到告警收敛全流程

监控告警体系的目标不是告警数量多,而是故障发现早、定位快、不轰炸值班人。以PrometheusGrafana、Alertmanager组成的链路,是当前最常用的开源方案。本文按指标采集、告警规则、告警收敛、可视化四个环节,说明一套可复用的监控告警体系怎么搭,并给出配置示例。

监控告警体系的指标分层:USE法与RED法

指标分两套常用模型:USE(Utilization/Saturation/Errors)看基础设施,CPU利用率、内存水位、磁盘IO饱和度、错误计数;RED(Rate/Errors/Duration)看服务,QPS、错误率、延迟分布。基础设施用USE,业务服务用RED,两套组合起来才能覆盖从机器到接口的完整链路。

Prometheus指标采集与exporter接入

Prometheus通过HTTP轮询采集指标,exporter负责把系统指标暴露成metrics接口。主机层用node_exporter,数据库用mysqld_exporter,应用层用客户端SDK上报自定义指标:

# prometheus.yml 采集配置示例
scrape_configs:
  - job_name: "node"
    static_configs:
      - targets: ["10.0.0.11:9100", "10.0.0.12:9100"]
        labels:
          env: "prod"
  - job_name: "app"
    metrics_path: "/metrics"
    static_configs:
      - targets: ["10.0.0.21:8080"]

采集频率一般设为15s;targets过多时用relabel分组,避免单个Prometheus轮询压力过大。指标命名遵循基础单位,比如node_cpu_seconds_total、http_requests_total。

告警规则编写与Alertmanager配置

告警规则写在rules文件里,Prometheus周期评估表达式,命中即生成告警。规则的for字段用于消除瞬态抖动:

groups:
  - name: node-alerts
    rules:
      - alert: HostHighCpu
        expr: 100 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) > 90
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "{{ $labels.instance }} CPU使用率超过90%"
          description: "CPU持续10分钟超过90%,请确认是否扩容。"

      - alert: InstanceDown
        expr: up == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.instance }} 已停止采集"

Alertmanager接收告警后按分组、抑制、静默策略处理。分组避免同一条故障刷屏:

route:
  group_by: ["alertname", "instance"]
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: webhook
receivers:
  - name: webhook
    webhook_configs:
      - url: "http://alert-bot:9090/send"

告警收敛:分组、抑制与静默

告警收敛三件套:分组把相同来源的告警合并成一条;抑制用根因告警覆盖衍生告警,比如宿主机宕机时抑制其上的容器告警;静默在计划变更前指定时间窗口。收敛没做好,故障期会刷上百条告警,值班人反而忽略重点。

Grafana可视化与面板组织

Grafana直接连Prometheus数据源,Dashboard按业务线分目录组织。面板使用率用Rate降低噪点,用percentiles看长尾延迟;每个面板固定时间范围,避免打开页面时加载全库数据。关键服务加”单机视图”和”集群视图”两层,故障时先看集群趋势再下钻单机。

监控告警体系搭建的常见问题

常见问题四个:指标口径不一致,CPU统计把容器与宿主机混在一起;告警规则误报率,比如磁盘告警没加prometheus规则自身排除;高基数指标拖垮存储,标签值无限增长要先在采集端裁剪;监控组件自身的HA没做,Prometheus挂掉后全链路不可见。搭建时优先把基础设施指标和核心业务RED指标做完,再做扩展链路,逐步把监控告警体系收敛成团队值班的唯一入口。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheus-jian-kong-gao-jing-ti-xi-da-jian-cong-zhi-biao/

(0)
小编小编
上一篇 2026年9月1日
下一篇 2026年9月1日

相关推荐

Prometheus监控告警体系搭建:从指标采集到Alertmanager分级路由

Prometheus架构原理与核心概念

Prometheus是云原生领域使用最广泛的监控告警系统,采用拉取式(Pull)数据采集模型,通过HTTP协议定期从目标服务抓取指标数据。核心架构包括Prometheus Server(负责采集、存储和查询)、Exporter(暴露指标端点)、Alertmanager(告警路由与去重)、Pushgateway(支持短生命周期任务的推送式采集)和Grafana(可视化面板)。所有指标以时间序列形式存储,每条数据由指标名称和一组键值对标签唯一标识。

Prometheus的四种指标类型覆盖不同监控场景:Counter单调递增计数器,适合请求总量、错误总量等累加指标;Gauge可增可减,适合当前连接数、内存使用量等瞬时值;Histogram对观测值采样并统计分布,自带分位数计算,适合请求延迟、响应大小;Summary类似Histogram但在客户端计算分位数,适合不需要聚合的独立实例。生产环境推荐Histogram用于延迟监控,Prometheus服务端聚合更灵活。

Prometheus部署与基础配置

部署Prometheus推荐使用Docker方式,配置文件通过卷挂载注入。scrape_interval控制全局抓取间隔,生产环境默认15秒,关键服务可缩短到5秒。evaluation_interval控制告警规则评估频率,建议与抓取间隔一致。scrape_configs定义采集目标,static_configs用于固定地址,kubernetes_sd_configs自动发现K8s集群中的服务端点。

# prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    cluster: 'production'
    env: 'prod'

rule_files:
  - "alert_rules/*.yml"

scrape_configs:
  - job_name: 'node-exporter'
    scrape_interval: 10s
    static_configs:
      - targets:
          - '10.0.0.1:9100'
          - '10.0.0.2:9100'
          - '10.0.0.3:9100'
        labels:
          group: 'web-servers'

  - job_name: 'api-server'
    metrics_path: /actuator/prometheus
    static_configs:
      - targets: ['10.0.1.1:8080', '10.0.1.2:8080']

远程存储方面,单机Prometheus默认本地TSDB存储,数据保留期通过–storage.tsdb.retention.time控制,默认15天。长期存储推荐对接Thanos或VictoriaMetrics,Thanos Sidecar方案将历史数据上传到对象存储,Querier组件实现跨实例全局查询。

Exporter接入与关键指标采集

Node Exporter采集主机级指标:CPU使用率、内存占用、磁盘IO、网络流量、文件系统使用率。node_cpu_seconds_total按CPU核心和模式记录CPU时间,计算使用率需要用irate函数取增量。node_memory_MemAvailable_bytes反映实际可用内存,比MemFree_bytes更准确(含可回收缓存)。node_filesystem_avail_bytes监控磁盘空间,配合node_filesystem_files_free监控inode耗尽风险。

# CPU使用率(按模式分组)
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 内存使用率
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# 磁盘使用率
(1 - node_filesystem_avail_bytes{fstype=~"ext4|xfs"} 
  / node_filesystem_size_bytes) * 100

# 磁盘IO等待时间
rate(node_disk_io_time_seconds_total[5m])

应用层指标推荐使用客户端SDK埋点。Spring Boot应用集成micrometer-registry-prometheus依赖后自动暴露JVM、线程池、HTTP请求等指标。Go应用使用prometheus/client_golang库,自定义业务指标用Counter和Histogram注册。应用指标命名规范:子系统_指标名_单位后缀,如http_requests_duration_seconds。

告警规则编写与分级策略

告警规则是监控体系的核心产出,规则质量直接决定运维团队的工作效率。告警分级分为P0(紧急,影响核心业务,5分钟内响应)、P1(严重,影响部分功能,30分钟内响应)、P2(警告,潜在风险,4小时内响应)、P3(提示,信息级别,次日处理)。for子句设置告警持续时间阈值,避免瞬时抖动触发误报。

# alert_rules/server.yml
groups:
  - name: server-alerts
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels:
          severity: P1
        annotations:
          summary: "CPU使用率超过85%"
          description: "实例 {{ $labels.instance }} CPU使用率当前 {{ $value | printf \"%.1f\" }}%"

      - alert: DiskSpaceWarning
        expr: (1 - node_filesystem_avail_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes) * 100 > 80
        for: 10m
        labels:
          severity: P2
        annotations:
          summary: "磁盘使用率超过80%"
          description: "实例 {{ $labels.instance }} 挂载点 {{ $labels.mountpoint }} 使用率 {{ $value | printf \"%.1f\" }}%"

      - alert: ServiceDown
        expr: up == 0
        for: 1m
        labels:
          severity: P0
        annotations:
          summary: "服务不可达"
          description: "目标 {{ $labels.instance }} 已停止响应超过1分钟"

Alertmanager告警路由与去重降噪

Alertmanager负责接收Prometheus推送的告警,执行去重(Dedup)、分组(Grouping)、抑制(Inhibition)和路由(Routing)后发送通知。group_by指定告警分组维度,同组告警合并为一条通知减少轰炸。inhibit_rules定义告警抑制逻辑,高级别告警触发后自动静默低级别相关告警。路由树支持按标签匹配将不同告警分发到不同接收渠道:P0告警发短信和电话,P1告警发企业微信,P2/P3告警发邮件。

# alertmanager.yml
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'cluster', 'instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'wechat-default'
  routes:
    - match:
        severity: P0
      receiver: 'sms-p0'
      repeat_interval: 5m
    - match:
        severity: P1
      receiver: 'wechat-p1'
      repeat_interval: 30m

inhibit_rules:
  - source_match:
      severity: 'P0'
    target_match:
      severity: 'P1'
    equal: ['alertname', 'instance']

receivers:
  - name: 'sms-p0'
    webhook_configs:
      - url: 'http://sms-gateway:8080/send'
  - name: 'wechat-p1'
    wechat_configs:
      - corp_id: 'your-corp-id'
        agent_id: 'your-agent-id'
        api_secret: 'your-api-secret'
  - name: 'wechat-default'
    wechat_configs:
      - corp_id: 'your-corp-id'
        agent_id: 'your-agent-id'
        api_secret: 'your-api-secret'

Grafana可视化面板搭建

Grafana作为Prometheus的前端可视化层,提供灵活的面板和仪表盘构建能力。搭建监控面板的实践步骤:配置Prometheus数据源,导入社区模板快速起步(Node Exporter Full模板ID 1860,Spring Boot模板ID 12900),根据业务指标定制面板。面板类型选择:时间序列图适合CPU、内存等时序指标,Stat面板适合单值展示(在线实例数),Table面板适合多维度对比,Heatmap面板适合延迟分布可视化。

变量(Variables)机制使面板可复用,定义instance、job、cluster等下拉变量,面板中的查询语句引用变量实现动态切换。Template变量配合Dashboard Link可在不同面板间跳转传递上下文。告警状态面板添加Alert State Panel,实时展示当前活跃告警,形成监控闭环。

Prometheus监控告警体系的价值不只在于发现故障,更在于通过SLO(Service Level Objective)指标量化服务质量。错误预算(Error Budget)概念将可用性目标转化为可度量的指标:99.9%的SLO意味着30天内允许43分钟故障时间。当错误预算消耗过快,团队优先投入稳定性建设而非新功能开发,这才是SRE稳定性工程的核心方法论。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheus-jian-kong-gao-jing-ti-xi-da-jian-cong-zhi-biao/

(0)
小编小编
上一篇 2026年8月7日
下一篇 2026年8月7日

相关推荐

Prometheus监控告警体系搭建:从指标采集到告警路由全流程

监控系统是SRE稳定性工程的基石。Prometheus作为云原生时代的监控标准,配合Grafana可视化展示和Alertmanager告警路由,构成了完整的监控告警体系。本文从架构设计、指标接入、告警规则、通知路由四个环节展开实操。

Prometheus架构与数据模型

Prometheus采用拉取(Pull)模型采集指标,主动访问各目标暴露的/metrics端点。核心组件包括:Prometheus Server负责采集存储、Alertmanager负责告警路由通知、Pushgateway用于短生命周期任务推送指标。数据存储采用时序数据库,每个指标由指标名和标签集合唯一标识。

指标类型分四种:Counter(只增不减的计数器,如请求总数)、Gauge(可增可减的仪表盘,如内存使用量)、Histogram(分桶统计,用于计算P99等百分位)、Summary(客户端预计算百分位)。选择正确的指标类型是监控数据质量的前提。

Docker Compose快速搭建监控栈

以下是Prometheus + Grafana + Alertmanager + Node Exporter的完整Docker Compose配置:

version: "3.8"
services:
  prometheus:
    image: prom/prometheus:v2.52.0
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/rules.yml:/etc/prometheus/rules.yml
      - prometheus_data:/prometheus
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
      - "--storage.tsdb.retention.time=30d"
      - "--web.enable-lifecycle"

  alertmanager:
    image: prom/alertmanager:v0.27.0
    container_name: alertmanager
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager/config.yml:/etc/alertmanager/config.yml

  grafana:
    image: grafana/grafana:11.0.0
    container_name: grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=your_password
    volumes:
      - grafana_data:/var/lib/grafana

  node-exporter:
    image: prom/node-exporter:v1.8.1
    container_name: node-exporter
    ports:
      - "9100:9100"
    pid: host

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:v0.49.1
    container_name: cadvisor
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

volumes:
  prometheus_data:
  grafana_data:

Prometheus采集配置与服务发现

prometheus.yml配置文件定义了采集目标和规则文件。静态配置适合固定数量的服务器,Kubernetes环境下推荐使用服务发现自动发现监控目标。

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: ["alertmanager:9093"]

rule_files:
  - rules.yml

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node-exporter"
    static_configs:
      - targets:
          - "192.168.1.101:9100"
          - "192.168.1.102:9100"
          - "192.168.1.103:9100"

  - job_name: "cadvisor"
    static_configs:
      - targets: ["cadvisor:8080"]

  # Kubernetes服务发现示例
  - 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: (.+)
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        target_label: __address__

relabel_configs是Prometheus采集配置的强大特性,可以在采集前对标签做增删改。上面的配置根据Pod注解决定是否采集、动态设置采集路径和端口,实现声明式监控接入。

告警规则编写与最佳实践

rules.yml中定义告警规则。好的告警规则需要满足:高信噪比(避免告警风暴)、可操作性(每条告警都对应明确的处理流程)、合理阈值(基于历史数据而非拍脑袋)。

groups:
  - name: node_alerts
    rules:
      # CPU使用率持续5分钟超过80%
      - alert: HighCPUUsage
        expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU使用率过高 {{ $labels.instance }}"
          description: "实例 {{ $labels.instance }} CPU使用率已超过80%,当前值: {{ $value }}%"

      # 内存可用率低于10%
      - alert: LowMemory
        expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 10
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "内存不足 {{ $labels.instance }}"
          description: "实例 {{ $labels.instance }} 可用内存低于10%,当前值: {{ $value }}%"

      # 磁盘空间不足
      - alert: DiskSpaceLow
        expr: (1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "磁盘空间不足 {{ $labels.instance }} {{ $labels.mountpoint }}"
          description: "挂载点 {{ $labels.mountpoint }} 使用率超过85%,当前值: {{ $value }}%"

      # 节点宕机
      - alert: NodeDown
        expr: up{job="node-exporter"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "节点宕机 {{ $labels.instance }}"
          description: "实例 {{ $labels.instance }} 已离线超过1分钟"

for字段是告警的持续时间条件。CPU瞬间飙到100%可能是正常峰值,持续5分钟超过80%才是真正的问题。expr表达式中的rate函数计算每秒变化率,[5m]指定时间窗口。

Alertmanager告警路由与通知降噪

Alertmanager负责接收Prometheus发出的告警,按路由规则分发到不同通知渠道。核心功能包括分组(grouping)、抑制(inhibition)、静默(silencing)三种降噪机制。

route:
  group_by: ["alertname", "instance"]
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: "default"
  routes:
    - matchers:
        - severity = "critical"
      receiver: "critical-webhook"
      group_wait: 0s
      repeat_interval: 1h
    - matchers:
        - severity = "warning"
      receiver: "warning-webhook"
      group_wait: 30s

inhibit_rules:
  - source_matchers:
      - severity = "critical"
    target_matchers:
      - severity = "warning"
    equal: ["instance"]
  # 如果某instance有critical告警,抑制该instance的warning告警

receivers:
  - name: "default"
    webhook_configs:
      - url: "http://192.168.1.200:5000/alert"
  - name: "critical-webhook"
    webhook_configs:
      - url: "http://192.168.1.200:5000/alert"
  - name: "warning-webhook"
    webhook_configs:
      - url: "http://192.168.1.200:5000/alert"

group_by将相同alertname和instance的告警合并为一条通知,避免告警风暴。group_wait是首次告警的等待时间,在此期间到达的同类告警合并发送。inhibit_rules实现告警抑制——当某实例已有critical级别告警时,自动屏蔽该实例的warning级别告警,确保运维人员聚焦关键问题。

通知渠道方面,Alertmanager原生支持邮件、Slack、PagerDuty、Webhook等。国内常用Webhook对接钉钉机器人或企业微信机器人。对于值班排班场景,可以接入OpsGenie或自建on-call系统,实现按值班表轮转通知。

Grafana仪表盘配置与关键面板

Grafana连接Prometheus数据源后,关键面板包括:节点资源概览(CPU、内存、磁盘、网络)、容器资源使用(cAdvisor数据)、HTTP请求QPS和延迟分布(P50/P90/P99)、错误率趋势图。推荐使用Grafana官方提供的Node Exporter Full(ID: 1860)和Kubernetes集群监控(ID: 315)仪表盘模板,导入即可使用。

监控覆盖率是衡量SRE成熟度的关键指标。一个完善的监控体系应覆盖四个黄金信号:延迟(Latency)、流量(Traffic)、错误(Errors)、饱和度(Saturation)。每个服务至少暴露这四类指标,才能在故障发生时快速定位根因。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheus-jian-kong-gao-jing-ti-xi-da-jian-cong-zhi-biao/

(0)
小编小编
上一篇 2026年8月6日
下一篇 2026年8月6日

相关推荐

Prometheus监控告警体系搭建:从指标采集到告警路由的完整实践

监控告警体系是SRE稳定性工程的基础设施。Prometheus因其多维数据模型和强大的PromQL查询语言,已成为云原生监控的事实标准。本文覆盖从指标采集、存储配置、告警规则编写到Alertmanager路由分发的完整链路。

架构设计与组件选型

一个完整的Prometheus监控体系包含以下组件:Prometheus Server负责指标采集和存储;Node Exporter采集主机级指标;Blackbox Exporter做HTTP/TCP/ICMP探测;Alertmanager负责告警去重、分组和路由分发;Grafana做数据可视化。

架构示意:

Exporter --> Prometheus Server --> Alertmanager --> 钉钉/邮件/企业IM
                 |
          Node Exporter (主机指标)
          Blackbox Exporter (HTTP探测)
          App /metrics (应用指标)

Prometheus Server安装与核心配置

使用Docker部署Prometheus,配合docker-compose管理:

# docker-compose.yml
version: '3.8'
services:
  prometheus:
    image: prom/prometheus:v2.52.0
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./rules:/etc/prometheus/rules
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=30d'
      - '--storage.tsdb.retention.size=50GB'
      - '--web.enable-lifecycle'
      
volumes:
  prometheus_data:

prometheus.yml主配置文件:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:
  - /etc/prometheus/rules/*.yml

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node'
    static_configs:
      - targets:
          - 'web-01:9100'
          - 'web-02:9100'
          - 'db-01:9100'

  - job_name: 'app'
    metrics_path: /metrics
    static_configs:
      - targets: ['app-01:8080', 'app-02:8080']

  - job_name: 'blackbox_http'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
          - https://api.example.com/health
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: target
      - target_label: __address__
        replacement: blackbox:9115

注意scrape_interval的取值策略:15秒适合大多数场景。过于频繁的采集如5秒会增加Prometheus的CPU和存储压力。对于关键指标可以通过job级override设置更短的采集间隔。

告警规则编写与PromQL实战

告警规则是监控体系的核心。规则文件示例:

# /etc/prometheus/rules/infra.yml
groups:
  - name: infra_alerts
    rules:
      - alert: HighCpuUsage
        expr: |
          100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
          team: infra
        annotations:
          summary: "CPU使用率过高: {{ $labels.instance }}"
          description: "实例 {{ $labels.instance }} CPU使用率已达 {{ $value | printf \"%.1f\" }}%"

      - alert: LowMemory
        expr: |
          (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 10
        for: 3m
        labels:
          severity: critical
          team: infra
        annotations:
          summary: "内存不足: {{ $labels.instance }}"

      - alert: DiskSpaceLow
        expr: |
          (1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} 
          / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) * 100 > 85
        for: 10m
        labels:
          severity: warning
          team: infra
        annotations:
          summary: "磁盘空间不足: {{ $labels.instance }} {{ $labels.mountpoint }}"

      - alert: ServiceDown
        expr: up == 0
        for: 1m
        labels:
          severity: critical
          team: ops
        annotations:
          summary: "服务不可达: {{ $labels.job }} {{ $labels.instance }}"

规则编写的要点:for字段设置持续时间避免瞬时波动触发告警;severity区分告警级别便于路由分发;annotations中的$value变量在告警触发时会被实际值替换;PromQL中用rate()处理counter类型指标,用avg by()做维度聚合。

应用自定义指标暴露

Prometheus的Pull模式要求应用主动暴露/metrics端点。Python应用使用prometheus_client库实现CI/CD流水线中的监控埋点:

from prometheus_client import Counter, Histogram, Gauge, generate_latest
from flask import Flask, Response

app = Flask(__name__)

REQUEST_COUNT = Counter(
    'http_requests_total', 'Total HTTP requests',
    ['method', 'endpoint', 'status']
)

REQUEST_LATENCY = Histogram(
    'http_request_duration_seconds', 'HTTP request latency',
    ['endpoint'],
    buckets=[0.01, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0]
)

@app.before_request
def before_request():
    REQUEST_LATENCY.labels(endpoint=request.path).observe(0.15)

@app.route('/metrics')
def metrics():
    return Response(generate_latest(), mimetype='text/plain')

Histogram的buckets选择需要根据实际延迟分布调整。如果大部分请求在100ms内但有少量慢请求在2-5秒,合理的buckets配置应覆盖这个范围。不要直接用默认buckets,它们针对通用场景设计,对特定业务不一定合适。

Alertmanager告警路由配置

Alertmanager负责告警的去重、分组、静默和路由。核心配置:

# alertmanager.yml
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default'
  routes:
    - match:
        severity: critical
      receiver: 'critical-webhook'
      group_wait: 10s
      repeat_interval: 1h
    - match:
        team: infra
      receiver: 'infra-webhook'
    - match_re:
        severity: 'warning|info'
      mute_time_intervals: ['offhours']
      receiver: 'default'

mute_time_intervals:
  - name: offhours
    time_intervals:
      - times:
          - start_time: '22:00'
            end_time: '09:00'
        weekdays: ['mon:fri']
        location: 'Asia/Shanghai'

receivers:
  - name: 'default'
    webhook_configs:
      - url: 'http://dingtalk-webhook:8060/dingtalk/ops/send'
        send_resolved: true
  - name: 'critical-webhook'
    webhook_configs:
      - url: 'http://dingtalk-webhook:8060/dingtalk/critical/send'
        send_resolved: true

group_by决定了哪些告警会被合并成一条通知。将alertname和instance放入group_by,同一实例的同类告警只发一条。group_wait控制首次告警的缓冲时间,在窗口期内触发的同组告警会合并发送,减少告警风暴。send_resolved: true使告警恢复时也发送通知,对运维人员确认故障修复很有用。

日志分析与指标关联

混沌工程实践中,监控指标和日志的关联分析是快速定位根因的关键。Prometheus指标告诉你什么坏了,日志告诉你为什么坏。推荐使用Loki作为日志后端,与Grafana集成实现指标和日志的联动查询:

# Panel 1: Prometheus指标(PromQL)
rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])

# Panel 2: Loki日志查询(LogQL)
{app="myapp"} |= "ERROR" | json | line_format "{{.msg}} {{.error}}"

Grafana支持在两个Panel间设置时间联动,点击指标图表的异常时段,日志Panel自动同步到同一时间范围,实现从指标异常到日志详情的快速下钻。这种关联查询能力在故障应急响应中能将平均定位时间(MTTI)缩短60%以上。

常见配置问题排查

采集目标显示down:检查目标端点是否可达、防火墙规则、Exporter是否运行。在Prometheus Web UI的Status页面可以看到每个job的采集状态和最后一次错误信息。

告警不触发:在Prometheus Web UI的Alerts页面查看规则状态。pending表示已满足表达式条件但还在for指定的等待时间内;firing表示已发送到Alertmanager。如果规则显示firing但没收到通知,检查Alertmanager的路由配置和receiver的webhook地址。

存储空间增长过快:高基数标签是主要元凶。检查是否有标签值过于离散(如user_id、request_id作为标签)。Prometheus的每个唯一标签组合都是一条独立时间序列,高基数标签会导致序列数爆炸。原则是标签值的变化频率不应超过指标采集频率。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheus-jian-kong-gao-jing-ti-xi-da-jian-cong-zhi-biao/

(0)
小编小编
上一篇 2026年8月3日
下一篇 2026年8月3日

相关推荐