Lewati ke isi

12 · 监控 & 可观测性

Prometheus 文档:https://prometheus.io/docs/ Grafana 文档:https://grafana.com/docs/ Loki 文档:https://grafana.com/docs/loki/latest/ Google SRE Book:https://sre.google/sre-book/table-of-contents/


1. Prometheus + Grafana 部署

# docker-compose 快速启动(本地/测试)
services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=15d'
    ports: ["9090:9090"]

  grafana:
    image: grafana/grafana:latest
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    volumes:
      - grafana_data:/var/lib/grafana
    ports: ["3000:3000"]

  loki:
    image: grafana/loki:latest
    ports: ["3100:3100"]

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log:ro
      - ./promtail-config.yml:/etc/promtail/config.yml
# prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

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

scrape_configs:
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['10.0.10.1:9100', '10.0.10.2:9100']

  - job_name: 'app-metrics'
    static_configs:
      - targets: ['api-server:8080']
    metrics_path: '/metrics'

2. 关键告警规则(iGaming)

# alerts/igaming.yml
groups:
  - name: igaming-critical
    rules:
      # API 可用性
      - alert: HighErrorRate
        expr: |
          sum(rate(http_requests_total{status=~"5.."}[5m]))
          / sum(rate(http_requests_total[5m])) > 0.01
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "5xx 错误率超过 1%"
          description: "当前错误率: {{ $value | humanizePercentage }}"

      # 赔率更新停止
      - alert: OddsUpdateStopped
        expr: rate(odds_updates_total[5m]) < 1
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "赔率更新已停止!"

      # 数据库连接池
      - alert: DBConnectionPoolExhausted
        expr: db_pool_available_connections < 5
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "数据库连接池即将耗尽"

      # Redis 内存
      - alert: RedisMemoryHigh
        expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Redis 内存使用超过 85%"

3. 关键 PromQL 查询

# API 错误率(过去5分钟)
sum(rate(http_requests_total{status=~"5.."}[5m])) 
/ sum(rate(http_requests_total[5m])) * 100

# p95/p99 响应时间
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))

# 每秒请求数(RPS)
sum(rate(http_requests_total[1m]))

# WebSocket 当前连接数
websocket_connections_total

# Redis 命令执行速率
rate(redis_commands_total[1m])

官方文档

  • Prometheus 查询语言:https://prometheus.io/docs/prometheus/latest/querying/basics/
  • Grafana Dashboard 市场:https://grafana.com/grafana/dashboards/
  • Node Exporter(服务器监控):https://github.com/prometheus/node_exporter
  • AlertManager 配置:https://prometheus.io/docs/alerting/latest/alertmanager/
  • Grafana Loki 日志:https://grafana.com/docs/loki/latest/
  • Uptime Kuma(自部署 Uptime):https://github.com/louislam/uptime-kuma

最后更新:2025-04