$npx -y skills add chaterm/terminal-skills --skill monitoring监控与告警
| 1 | # 监控与告警 |
| 2 | |
| 3 | ## 概述 |
| 4 | Prometheus、Grafana、告警规则配置等技能。 |
| 5 | |
| 6 | ## Prometheus |
| 7 | |
| 8 | ### 基础查询(PromQL) |
| 9 | ```promql |
| 10 | # 即时向量 |
| 11 | http_requests_total |
| 12 | http_requests_total{job="api", status="200"} |
| 13 | |
| 14 | # 范围向量 |
| 15 | http_requests_total[5m] |
| 16 | |
| 17 | # 偏移 |
| 18 | http_requests_total offset 1h |
| 19 | |
| 20 | # 聚合 |
| 21 | sum(http_requests_total) |
| 22 | sum by (job) (http_requests_total) |
| 23 | sum without (instance) (http_requests_total) |
| 24 | |
| 25 | # 速率 |
| 26 | rate(http_requests_total[5m]) |
| 27 | irate(http_requests_total[5m]) |
| 28 | |
| 29 | # 增量 |
| 30 | increase(http_requests_total[1h]) |
| 31 | |
| 32 | # 直方图分位数 |
| 33 | histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) |
| 34 | ``` |
| 35 | |
| 36 | ### 常用查询 |
| 37 | ```promql |
| 38 | # CPU 使用率 |
| 39 | 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) |
| 40 | |
| 41 | # 内存使用率 |
| 42 | (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 |
| 43 | |
| 44 | # 磁盘使用率 |
| 45 | (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 |
| 46 | |
| 47 | # 网络流量 |
| 48 | rate(node_network_receive_bytes_total[5m]) |
| 49 | rate(node_network_transmit_bytes_total[5m]) |
| 50 | |
| 51 | # HTTP 请求速率 |
| 52 | sum(rate(http_requests_total[5m])) by (status) |
| 53 | |
| 54 | # 错误率 |
| 55 | sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) |
| 56 | |
| 57 | # 延迟 P99 |
| 58 | histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) |
| 59 | ``` |
| 60 | |
| 61 | ### 配置文件 |
| 62 | ```yaml |
| 63 | # prometheus.yml |
| 64 | global: |
| 65 | scrape_interval: 15s |
| 66 | evaluation_interval: 15s |
| 67 | |
| 68 | alerting: |
| 69 | alertmanagers: |
| 70 | - static_configs: |
| 71 | - targets: |
| 72 | - alertmanager:9093 |
| 73 | |
| 74 | rule_files: |
| 75 | - "rules/*.yml" |
| 76 | |
| 77 | scrape_configs: |
| 78 | - job_name: 'prometheus' |
| 79 | static_configs: |
| 80 | - targets: ['localhost:9090'] |
| 81 | |
| 82 | - job_name: 'node' |
| 83 | static_configs: |
| 84 | - targets: ['node1:9100', 'node2:9100'] |
| 85 | |
| 86 | - job_name: 'kubernetes-pods' |
| 87 | kubernetes_sd_configs: |
| 88 | - role: pod |
| 89 | relabel_configs: |
| 90 | - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] |
| 91 | action: keep |
| 92 | regex: true |
| 93 | ``` |
| 94 | |
| 95 | ### 告警规则 |
| 96 | ```yaml |
| 97 | # rules/alerts.yml |
| 98 | groups: |
| 99 | - name: node |
| 100 | rules: |
| 101 | - alert: HighCPUUsage |
| 102 | expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 |
| 103 | for: 5m |
| 104 | labels: |
| 105 | severity: warning |
| 106 | annotations: |
| 107 | summary: "High CPU usage on {{ $labels.instance }}" |
| 108 | description: "CPU usage is {{ $value }}%" |
| 109 | |
| 110 | - alert: HighMemoryUsage |
| 111 | expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 85 |
| 112 | for: 5m |
| 113 | labels: |
| 114 | severity: warning |
| 115 | annotations: |
| 116 | summary: "High memory usage on {{ $labels.instance }}" |
| 117 | |
| 118 | - alert: DiskSpaceLow |
| 119 | expr: (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 > 85 |
| 120 | for: 5m |
| 121 | labels: |
| 122 | severity: critical |
| 123 | annotations: |
| 124 | summary: "Disk space low on {{ $labels.instance }}" |
| 125 | |
| 126 | - name: application |
| 127 | rules: |
| 128 | - alert: HighErrorRate |
| 129 | expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.05 |
| 130 | for: 5m |
| 131 | labels: |
| 132 | severity: critical |
| 133 | annotations: |
| 134 | summary: "High error rate" |
| 135 | description: "Error rate is {{ $value | humanizePercentage }}" |
| 136 | |
| 137 | - alert: HighLatency |
| 138 | expr: histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 1 |
| 139 | for: 5m |
| 140 | labels: |
| 141 | severity: warning |
| 142 | annotations: |
| 143 | summary: "High latency" |
| 144 | ``` |
| 145 | |
| 146 | ## Alertmanager |
| 147 | |
| 148 | ### 配置 |
| 149 | ```yaml |
| 150 | # alertmanager.yml |
| 151 | global: |
| 152 | smtp_smarthost: 'smtp.example.com:587' |
| 153 | smtp_from: 'alertmanager@example.com' |
| 154 | smtp_auth_username: 'alertmanager@example.com' |
| 155 | smtp_auth_password: 'password' |
| 156 | |
| 157 | route: |
| 158 | group_by: ['alertname', 'severity'] |
| 159 | group_wait: 30s |
| 160 | group_interval: 5m |
| 161 | repeat_interval: 4h |
| 162 | receiver: 'default' |
| 163 | routes: |
| 164 | - match: |
| 165 | severity: critical |
| 166 | receiver: 'pagerduty' |
| 167 | - match: |
| 168 | severity: warning |
| 169 | receiver: 'slack' |
| 170 | |
| 171 | receivers: |
| 172 | - name: 'default' |
| 173 | email_configs: |
| 174 | - to: 'team@example.com' |
| 175 | |
| 176 | - name: 'slack' |
| 177 | slack_configs: |
| 178 | - api_url: 'https://hooks.slack.com/services/xxx' |
| 179 | channel: '#alerts' |
| 180 | title: '{{ .GroupLabels.alertname }}' |
| 181 | text: '{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}' |
| 182 | |
| 183 | - name: 'pagerduty' |
| 184 | pagerduty_configs: |
| 185 | - service_key: 'xxx' |
| 186 | |
| 187 | inhibit_rules: |
| 188 | - source_match: |
| 189 | severity: 'critical' |
| 190 | target_match: |
| 191 | severity: 'warning' |
| 192 | equal: ['alertname', 'instance'] |
| 193 | ``` |
| 194 | |
| 195 | ## Grafana |
| 196 | |
| 197 | ### 数据源配置 |
| 198 | ```yaml |
| 199 | # provisioning/datasources/prometheus.yml |
| 200 | apiVersion: 1 |
| 201 | |
| 202 | datasources: |
| 203 | - name: Prometheus |
| 204 | type: prometheus |
| 205 | access: proxy |
| 206 | url: http://prometheus:9090 |
| 207 | isDefault: true |
| 208 | editable: false |
| 209 | ``` |
| 210 | |
| 211 | ### Dashboard JSON 示例 |
| 212 | ```json |
| 213 | { |
| 214 | "dashboard": { |
| 215 | "title": "Node Metrics", |
| 216 | "panels": [ |
| 217 | { |
| 218 | "title": "CPU Usage", |
| 219 | "type": "graph", |
| 220 | "targets": [ |
| 221 | { |
| 222 | "expr": "100 - (avg by (instance) (irate(node_cpu_seconds_to |