运维不是请客吃饭,Prometheus调优就得快准狠。今天记录我调优的一点内容。
# 烂代码
sum(rate(http_requests_total[5m]))
# 正确姿势
sum(rate(http_requests_total{cluster="prod",service!~"test-.*"}[5m]))
count()
滥用,数值计算只用sum()
rate()
和irate()
的区别:前者看趋势,后者抓毛刺当某个标签的值具备以下特征时,就会引发高基数:
error_message
(可能无限增长)用这个PromQL量化风险:
# 直接找出Top10问题指标
topk(10, count by (__name__)({__name__=~".+"}))
# 查看单个指标的时间序列数量
count({__name__="your_metric_name"})
# 按标签维度分析
count by (label_name)({__name__="your_metric_name"})
时间序列数量 | 风险等级 | 处理建议 |
---|---|---|
< 500 | 安全 | 无需处理 |
500-2000 | 警告 | 监控增长趋势 |
> 2000 | 危险 | 必须立即优化标签设计 |
tips:
动态标签死刑名单 永远不要用作指标标签:
user_id, ip, session_id, trace_id, request_id, order_no, email, phone, uuid, error_message
安全标签范例 这些标签值可控,放心使用:
status_code(如200/404/500), http_method(GET/POST), env(prod/stage/dev), region(固定机房编号)
紧急止血方案 发现高基数指标后立即执行:
# prometheus.yml 配置 metric_relabel_configs: - source_labels: [user_id] # 要清理的标签 regex: (.+) action: labeldrop # 直接丢弃该标签
# 当内存突破16GB立即告警
prometheus_tsdb_head_series > 10000000
# 查询延迟超过2秒的全给我记下来
rate(prometheus_engine_query_duration_seconds_sum{slice="query"}[1m]) > 2
# 直接分析TSDB状态
promtool tsdb analyze /data/prometheus/wal
topk(10, count by (__name__)({__name__=~".+"}))