GH GambleHub

收集指標:Prometheus, Grafana

收集指標: Prometheus, Grafana

1)目標和框架

度量回路的任務是可靠地收集和存儲時間序列,為RCA提供快速PromQL,SLO上的差分和可理解的行。基本對:Prometheus(scrape → store → query)和Grafana(可視化,alerta,發行註釋)。對於長存儲和全局查詢-Thanos/Cortex/Mimir。

2)數據模型和語義

系列=度量名稱+標簽集(鍵=值)。
類型:counter,gauge,histogram,summary(在銷售中-通常是histogram)。

語義:
  • RED (API): 「rate」、「errors」、「duration」(直方圖)。
  • USE (ресурсы): Utilization, Saturation, Errors (CPU/RAM/Disk/Net).
  • 命名:'namespace_subsystem_metric_unit'(例如'http_server_requests_total'、'db_connections_current')。

反基數:盡量減少標簽的不同值(標簽中沒有request_id user_id)。

3)展覽和發現服務

出口商:node_exporter, kube-state-metrics, cAdvisor, DB/Forges (postgres_exporter, redis_exporter, kafka_exporter)。
專有服務:客戶端庫(Go/Java/Node/Python)→ '/metrics'。

Service Discovery: Kubernetes, EC2/ASG, Consul, static files.

基本的'prometheus。yml"(片段):
yaml global:
scrape_interval: 15s evaluation_interval: 15s scrape_configs:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs: [{ role: node }]
relabel_configs:
- action: labelmap regex: __meta_kubernetes_node_label_(.+)
- job_name: 'apps'
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]
target_label: __metrics_path__
regex: (.+)
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port]
target_label: __address__
regex: (.+)
replacement: $1
Pod's註釋:
yaml prometheus. io/scrape: "true"
prometheus. io/path: /metrics prometheus. io/port: "8080"

4)直方圖和後綴

在您的SLO下使用顯式罐:
  • Web/API:[10 ms, 25.50.00.00.400.8600]]
  • 付款/付款:添加最多5-10 s的尾巴。

PromQL p95:

promql histogram_quantile(0. 95,
sum by (le) (rate(http_request_duration_seconds_bucket[5m]))
)
使用Exemplars(如果包括):
promql histogram_quantile(0. 95,
sum by (le, route) (rate(traces_spanmetrics_duration_bucket{route="/withdraw"}[5m]))
)

5)記錄規則(記錄規則)

減少繁重的查詢,標準化SLI。

yaml groups:
- name: api_sli interval: 30s rules:
- record: job:http:success_ratio:rate5m expr: sum(rate(http_requests_total{status!~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
- record: job:http:duration_p95:5m expr: histogram_quantile(0. 95, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))

6)SLO和Alertes(多窗口燒傷)

SLO 99.9% 的成功查詢/30d。

yaml groups:
- name: slo_burn rules:
- alert: ErrorBudgetBurnHighShort expr: (1 - job:http:success_ratio:rate5m) > (1 - 0. 999) 14 for: 5m labels: { severity: critical }
annotations: { summary: "Fast burn >14x for 5m" }

- alert: ErrorBudgetBurnHighLong expr: (1 - job:http:success_ratio:rate5m) > (1 - 0. 999) 6 for: 1h labels: { severity: critical }
annotations: { summary: "Long burn >6x for 1h" }
Alertmanager(簡化):
yaml route:
receiver: pager group_by: ["service"]
receivers:
- name: pager slack_configs:
- channel: "#oncall"
send_resolved: true

7)標簽衛生和節省

標簽名稱穩定且標準化:「服務」,「env」,「region」,「route」,「code」和「version」。
限制基數:帶有「路線」的度量標準必須使用模板的http。路線'(不是完整的URL)。
Sampling邏輯-在預告片中;在指標中-沒有user_id。
發布屬性('service。版本")對於比較舊/新版本很有用。

8)擴展和HA

Prometheus-垂直和刺穿scrape-target:
  • 兩個Prometheus(A/B)剪切相同的目標(HA → alertes重復)。
  • Thanos: Sidecar to ever Prometheus, Store+Query for Global查詢和長期存儲(S3/GCS)。
  • 備選方案:Cortex/Mimir(遠程寫入、多項、水平縮放)。
遠程寫作(示例):
yaml remote_write:
- url: https://mimir. example. com/api/v1/push basic_auth: { username: tenantA, password: $MIMIR_TOKEN }
本地TSDB Retenchn:
yaml
--storage. tsdb. retention. time=15d
--storage. tsdb. max-block-duration=2h

9) Grafana: dashbords, Alerts,註釋

標準dashbords:

1.Platform Overview (SLO/RED, error-budget).

2.Route API(RPS/5xx/p95,「版本」比較)。

3.K8s Cluster/Nodes (control-plane, saturation).

4.DB/Cache/Queues (lag/locks/hit ratio/backlog).

5.Per-Release(前/後,CI版本註釋)。

Grafana Alerting:在PromQL、呼叫旋轉、靜音時間「發布窗口」上觸發。

註釋:CI用「commit」,「image」添加了發布事件。標記,引用管道。

10)Kubernetes: 一定要衡量什麼

Control-plane: `apiserver_request_total`, etcd leader/fsync, scheduler latency.

Workloads:重新啟動,「container_cpu_cfs_throttled_seconds_total」, OOM, Pending/Evicted, PDB違規。
網絡:drops,conntrack,「kube-proxy」錯誤。
配額/限制:要求vs限制,HPA/VPA,節點設置。

11) DB/緩存/隊列: 關鍵信號

PostgreSQL/MySQL: `connections`, `locks`, `deadlocks_total`, `xact_commit/rollback`, replication lag.

Redis: hit ratio, `evictions`, latency `instantaneous_ops_per_sec`.

Kafka/RabbitMQ: consumer lag, unacked, ISR, disk usage.

PromQL示例:
promql
Queue backlog sum by (topic) (kafka_consumergroup_lag)> 1000

Postgres replication lag max(pg_replication_lag_seconds) > 2

12)安全性和多重性

RBAC到Prometheus/Grafana,datasource-permishens。
ingress/組件之間的 TLS/mTLS鏈。
租戶隔離:Cortex/Mimir中單獨的Prometheus或tenant標簽;系列限制和查詢。
Alert/notification中的秘密-禁止(使用ID tiket而不是PII)。

13)與發行版和自動回滾集成

SLO規則→ AnalysisTemplate (Argo Rollouts)或CI-gate。
觸發burn-alert時,pause/rollback canary;在日誌/註釋中-版本鏈接。
通過標簽「版本」比較穩定版本和金絲雀版本。

14)典型錯誤(反模式)

標簽的失控基數(user_id,url。滿,動態鍵)。
在沒有「env」標簽的單個群集中混合prod和stage。
只有沒有RED/USE的gauge;沒有p95/p99直方圖。
Alerta在「鐵」上沒有參考SLO →噪音。
缺乏記錄規則→了「嚴重」的程序事件查詢。
沒有版本註釋→很難匹配更改和降級。

15)實施清單(0-45天)

0-10天

Node/kube-state/cAdvisor出口商;服務中的'/metrics'。
基本的RED/USE dashbords;標準直方圖罐。
啟用CI版本註釋。

11-25天

為SLI錄制規則;多窗口燃燒的艾萊塔。
HA Prometheus(雙scrape),GitOps configs的備份。
Alertmanager:路線/安靜模式/呼叫旋轉。

26-45天

遠程寫入Thanos/Cortex/Mimir,長期存儲。
基數優化,系列限制,查詢。
SLO登錄版本和自動滾回集成。

16)成熟度量

關鍵服務的RED/USE覆蓋率≥ 95%。
「重」PromQL的平均運行時間<2 c(p95),以犧牲記錄規則為代價。
有用/嘈雜的變量比>3:1。
控制下的基數:<每集群10 M活動序列,沒有爆發。
100%的發行版在Grafana中具有註釋,並在之前/之後具有度量映射。

17)有用的嗅探

stable vs canary按版本比較

promql histogram_quantile(0. 95,
sum by (le, version) (rate(http_request_duration_seconds_bucket{version=~"stable    canary"}[5m]))
)

路由上的5xx錯誤

promql topk(5,
sum by (route) (rate(http_requests_total{status=~"5.."}[5m]))
)

容器飽和度CPU

promql rate(container_cpu_cfs_throttled_seconds_total[5m]) > 0. 1

指標與跟蹤的關聯(啟用了Exemplars)

promql sum (rate (http_request_duration_seconds_bucket[5m])) by (le) # clickable to the track

18)結論

Prometheus+Grafana是指標的事實上的標準。語義和學科獲勝:RED/USE,整潔的標簽,SLO下的直方圖,記錄規則和SLO-Alerta。添加了HA和長期存儲、版本註釋以及自動回滾集成-並且您可以快速、可擴展且經濟高效的指標輪廓,從而幫助您做出銷售決策。

Contact

與我們聯繫

如有任何問題或支援需求,歡迎隨時聯絡我們。我們隨時樂意提供協助!

Telegram
@Gamble_GC
開始整合

Email 為 必填。Telegram 或 WhatsApp 為 選填

您的姓名 選填
Email 選填
主旨 選填
訊息內容 選填
Telegram 選填
@
若您填寫 Telegram,我們將在 Email 之外,同步於 Telegram 回覆您。
WhatsApp 選填
格式:國碼 + 電話號碼(例如:+886XXXXXXXXX)。

按下此按鈕即表示您同意我們處理您的資料。