You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prometheus中如何统计每分钟消息量及活跃客户端数(规避高基数)

解决高基数场景下的每分钟活跃客户端统计问题

针对UDP服务器的活跃客户端统计需求,由于客户端ID属于高基数维度,直接给Prometheus Counter加标签会导致时间序列爆炸,这里提供两种可行方案,首推应用层维护Gauge的方式:

方案一:应用层维护活跃客户端Gauge(推荐)

自己在服务器代码里追踪客户端的活跃状态,定时清理过期客户端并更新Gauge指标,这样只会生成一条时间序列,完全避免高基数问题。

实现思路:

  • 用字典记录每个客户端的最后活跃时间
  • 启动后台线程,定期(比如每10秒)清理超过1分钟未活跃的客户端
  • 将当前活跃客户端的数量设置为Gauge的值

代码示例:

from prometheus_client import Gauge, start_http_server
import time
from collections import defaultdict
import threading

# 定义1分钟内活跃客户端数的Gauge指标
active_clients_1min = Gauge('udp_active_clients_1min', 'Number of unique active clients in the last 1 minute')
# 存储客户端ID到最后活跃时间的映射
client_last_seen = defaultdict(float)

def process_udp_message(client_id):
    # 处理UDP消息时,更新客户端的最后活跃时间
    client_last_seen[client_id] = time.time()
    # 这里继续你的原有消息处理逻辑
    # ...

def cleanup_and_update_gauge():
    while True:
        current_time = time.time()
        # 筛选出1分钟内未活跃的客户端ID
        expired_clients = [cid for cid, last_time in client_last_seen.items() if current_time - last_time > 60]
        # 清理过期条目
        for cid in expired_clients:
            del client_last_seen[cid]
        # 更新Gauge值为当前活跃客户端数量
        active_clients_1min.set(len(client_last_seen))
        # 每10秒执行一次清理和更新
        time.sleep(10)

if __name__ == '__main__':
    # 启动Prometheus metrics服务
    start_http_server(8000)
    # 启动后台清理线程(守护线程,随主进程退出)
    cleanup_thread = threading.Thread(target=cleanup_and_update_gauge, daemon=True)
    cleanup_thread.start()
    
    # 这里启动你的UDP服务器逻辑,收到消息后解析出client_id并调用process_udp_message
    # ...

方案二:利用PromQL计算(不推荐)

如果暂时不想修改应用代码,也可以给Counter加上client标签,然后用PromQL的count_over_time和sum来统计活跃数,但不推荐这种方式——因为每个客户端都会生成独立的时间序列,会快速膨胀Prometheus的存储和查询压力。

示例PromQL(统计过去1分钟的活跃客户端数):

count(count_over_time(my_requests_total{job="your_udp_server"}[1m]) > 0)

这个查询会统计过去1分钟内有至少1条请求的客户端数量,但随着客户端数量增长,性能会急剧下降。


关键说明

Prometheus不建议用标签存储用户ID、客户端ID这类无界高基数维度,因为每个标签组合都会生成新的时间序列,长期来看会导致存储成本飙升、查询变慢甚至OOM。应用层维护Gauge的方式完全规避了这个问题,是符合最佳实践的解决方案。

内容的提问来源于stack exchange,提问作者Mario Signorino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:22:20