mcpField
P
prometheus-configuration

prometheus-configuration

github.com/sickn33云与 DevOps48.8k182 次安装今天更新
代码仓库

关于 prometheus-configuration

用于配置 Prometheus 指标采集、告警和监控的技能,涵盖抓取发现、记录规则与验证,并注明部分引用文件未随附。

主要功能

  1. 01配置指标抓取目标
  2. 02文件与 Kubernetes 服务发现
  3. 03编写记录规则和告警规则
  4. 04验证配置与规则

适用场景

  1. 01搭建基础设施监控
  2. 02配置应用指标抓取
  3. 03为查询编写记录规则
  4. 04检查 Prometheus 配置和规则

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill prometheus-configuration

安装后在 Claude Code 中输入/prometheus-configuration确认已加载。

详细介绍

配套材料可用性

此目录副本包含以下内联指南,但不包含以下配套路径。这些是外部前提文件,并未打包在内:

  • <support-root>/assets/prometheus.yml.template
  • <support-root>/references/scrape-configs.md
  • <support-root>/references/recording-rules.md
  • <support-root>/scripts/validate-prometheus.sh

使用依赖这些路径的步骤前,请索取原始配套材料或现有安装;此目录未提供经验证的下载来源。请相对于该安装解析每个路径、检查其内容,并确认适用的许可证及执行前提。所需文件不存在时,不要运行命令,也不要声称已遵循相关流程。不要伪造缺失的脚本,也不要将名称相同但无关的文件视为等同文件。此处完整记录的独立步骤,可在用户授权范围内继续;任何依赖配套材料的步骤都应报告为不可用。

Prometheus 配置

Prometheus 设置、指标采集、抓取配置和记录规则的完整指南。

以下情况请勿使用此技能

  • 任务与 Prometheus 配置无关
  • 需要使用此范围之外的其他领域或工具

说明

  • 明确目标、约束和所需输入。
  • 应用相关最佳实践并验证结果。
  • 提供可执行的步骤和验证方法。

用途

配置 Prometheus,以全面采集指标、进行告警并监控基础设施和应用。

以下情况请使用此技能

  • 设置 Prometheus 监控
  • 配置指标抓取
  • 创建记录规则
  • 设计告警规则
  • 实现服务发现

Prometheus 架构

┌──────────────┐
│ Applications │ ← Instrumented with client libraries
└──────┬───────┘
       │ /metrics endpoint
       ↓
┌──────────────┐
│  Prometheus  │ ← Scrapes metrics periodically
│    Server    │
└──────┬───────┘
       │
       ├─→ AlertManager (alerts)
       ├─→ Grafana (visualization)
       └─→ Long-term storage (Thanos/Cortex)

安装前应固定并检查 Chart/镜像版本及其配置值。Helm 的 PVC 片段还需要合适的 StorageClass 和容量;请验证渲染后的清单。Compose 示例缺少完整配置中引用的 Alertmanager、exporter、Kubernetes API 凭据/RBAC、TLS 文件和规则挂载;请明确提供这些内容,或移除未使用的任务。请将监控 API 保持为私有,并保护标签/配置响应,避免暴露租户数据或机密信息。限制指标标签的基数,并使用 promtool 验证规则;阈值仅供参考,并非通用 SLO。若错误指标序列不存在,可能需要有意采用补零策略;流量为零时,也不应默认视为健康百分比。

安装

使用 Helm 部署到 Kubernetes
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prometheus prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --create-namespace \
  --set prometheus.prometheusSpec.retention=30d \
  --set prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.accessModes[0]=ReadWriteOnce \
  --set prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.resources.requests.storage=50Gi
Docker Compose
version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "127.0.0.1:9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=30d'

volumes:
  prometheus-data:

配置文件

prometheus.yml:

global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    cluster: 'production'
    region: 'us-west-2'

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - alertmanager:9093

# Load rules files
rule_files:
  - /etc/prometheus/rules/*.yml

# Scrape configurations
scrape_configs:
  # Prometheus itself
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # Node exporters
  - job_name: 'node-exporter'
    static_configs:
      - targets:
        - 'node1:9100'
        - 'node2:9100'
        - 'node3:9100'
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance
        regex: '([^:]+)(:[0-9]+)?'
        replacement: '${1}'

  # Kubernetes pods with annotations
  - 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__
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod

  # Application metrics
  - job_name: 'my-app'
    static_configs:
      - targets:
        - 'app1.example.com:9090'
        - 'app2.example.com:9090'
    metrics_path: '/metrics'
    scheme: 'https'
    tls_config:
      ca_file: /etc/prometheus/ca.crt
      cert_file: /etc/prometheus/client.crt
      key_file: /etc/prometheus/client.key

**参考:**参见 assets/prometheus.yml.template

抓取配置

静态目标
scrape_configs:
  - job_name: 'static-targets'
    static_configs:
      - targets: ['host1:9100', 'host2:9100']
        labels:
          env: 'production'
          region: 'us-west-2'
基于文件的服务发现
scrape_configs:
  - job_name: 'file-sd'
    file_sd_configs:
      - files:
        - /etc/prometheus/targets/*.json
        - /etc/prometheus/targets/*.yml
        refresh_interval: 5m

targets/production.json:

[
  {
    "targets": ["app1:9090", "app2:9090"],
    "labels": {
      "env": "production",
      "service": "api"
    }
  }
]
Kubernetes 服务发现
scrape_configs:
  - job_name: 'kubernetes-services'
    kubernetes_sd_configs:
      - role: service
    relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: "true"
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)

**参考:**参见 references/scrape-configs.md

记录规则

为经常查询的表达式创建预计算指标:

# /etc/prometheus/rules/recording_rules.yml
groups:
  - name: api_metrics
    interval: 15s
    rules:
      # HTTP request rate per service
      - record: job:http_requests:rate5m
        expr: sum by (job) (rate(http_requests_total[5m]))

      # Error rate percentage
      - record: job:http_requests_errors:rate5m
        expr: sum by (job) (rate(http_requests_total{status=~"5.."}[5m]))

      - record: job:http_requests_error_rate:percentage
        expr: |
          (job:http_requests_errors:rate5m / job:http_requests:rate5m) * 100

      # P95 latency
      - record: job:http_request_duration:p95
        expr: |
          histogram_quantile(0.95,
            sum by (job, le) (rate(http_request_duration_seconds_bucket[5m]))
          )

  - name: resource_metrics
    interval: 30s
    rules:
      # CPU utilization percentage
      - record: instance:node_cpu:utilization
        expr: |
          100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

      # Memory utilization percentage
      - record: instance:node_memory:utilization
        expr: |
          100 - ((node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100)

      # Disk usage percentage
      - record: instance:node_disk:utilization
        expr: |
          100 - ((node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100)

**参考:**参见 references/recording-rules.md

告警规则

# /etc/prometheus/rules/alert_rules.yml
groups:
  - name: availability
    interval: 30s
    rules:
      - alert: ServiceDown
        expr: up{job="my-app"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Service {{ $labels.instance }} is down"
          description: "{{ $labels.job }} has been down for more than 1 minute"

      - alert: HighErrorRate
        expr: job:http_requests_error_rate:percentage > 5
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High error rate for {{ $labels.job }}"
          description: "Error rate is {{ $value }}% (threshold: 5%)"

      - alert: HighLatency
        expr: job:http_request_duration:p95 > 1
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High latency for {{ $labels.job }}"
          description: "P95 latency is {{ $value }}s (threshold: 1s)"

  - name: resources
    interval: 1m
    rules:
      - alert: HighCPUUsage
        expr: instance:node_cpu:utilization > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage on {{ $labels.instance }}"
          description: "CPU usage is {{ $value }}%"

      - alert: HighMemoryUsage
        expr: instance:node_memory:utilization > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High memory usage on {{ $labels.instance }}"
          description: "Memory usage is {{ $value }}%"

      - alert: DiskSpaceLow
        expr: instance:node_disk:utilization > 90
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Low disk space on {{ $labels.instance }}"
          description: "Disk usage is {{ $value }}%"

验证

# Validate configuration
promtool check config prometheus.yml

# Validate rules
promtool check rules /etc/prometheus/rules/*.yml

# Test query
promtool query instant http://localhost:9090 'up'

**参考:**参见 scripts/validate-prometheus.sh

最佳实践

  1. 采用一致的命名方式为指标命名(prefix_name_unit)
  2. 设置合适的抓取间隔(通常为 15-60s)
  3. 对开销较大的查询使用记录规则
  4. 实现高可用性(运行多个 Prometheus 实例)
  5. 根据存储容量配置数据保留时间
  6. 使用重新标记清理指标
  7. 监控 Prometheus 本身
  8. 为大型部署实现联邦
  9. 使用 Thanos/Cortex 进行长期存储
  10. 记录自定义指标

故障排除

检查抓取目标:

curl http://localhost:9090/api/v1/targets

检查配置:

curl http://localhost:9090/api/v1/status/config

测试查询:

curl 'http://localhost:9090/api/v1/query?query=up'

参考文件

  • assets/prometheus.yml.template - 完整配置模板
  • references/scrape-configs.md - 抓取配置模式
  • references/recording-rules.md - 记录规则示例
  • scripts/validate-prometheus.sh - 验证脚本

相关技能

  • grafana-dashboards - 用于可视化
  • slo-implementation - 用于 SLO 监控
  • distributed-tracing - 用于请求追踪

限制

  • 仅当任务明确符合上述范围时,才使用此技能。
  • 请勿将输出视为针对特定环境的验证、测试或专家审查的替代品。
  • 如果缺少必要的输入、权限、安全边界或成功标准,请暂停并请求澄清。

评论

支持 Markdown