Prometheus 指标类型
指标类型一般分为四类:
Counter 计数器,用于保存计数型数据,如网站访问量等。
Gauge 仪表盘,用于存储有着起伏特征的指标数据,如空间空闲大小等。
Histogram 直方图,在一段时间范围内对数据进行采样,并将其计入可配置的存储中,后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。
Summary ,Histogram的扩展类型,用于表示一段时间内的数据采样结果(通常是请求持续时间或响应大小等),但它直接存储了分位数(通过客户端计算,然后展示出来),而不是通过区间计算。
Counter 计数器
基于Counter 计数器设计Springboot相关代码,模拟用户请求访问量
@GetMapping("/metrics/count")public String count() {Counter.builder("metrics_request_count").tags("apiCode", "test").description("Count of requests").register(meterRegistry).increment();return "Hello World";}
相关命令:
//查询当前的总计数值
metrics_request_count_total//一段时间内的增长率
increase(metrics_request_count_total[1m])
Gauge 仪表盘
基于Gauge仪表盘设计Springboot相关代码,模拟统计在线用户数量
// 用于 Gauge 的动态值(模拟在线用户数)private final AtomicInteger onlineUsers = new AtomicInteger(0);// 用于 Histogram 和 Summary 的随机耗时生成器private final Random random = new Random();@GetMapping("/metrics/gauge")public String gauge() {if (random.nextBoolean()) {onlineUsers.incrementAndGet();}else {onlineUsers.decrementAndGet();}Gauge.builder("metrics_user_online_count", onlineUsers, AtomicInteger::get).tags("apiCode", "test").description("当前用户数").register(meterRegistry);return "Hello World";}
相关命令:
// 当前数量
metrics_user_online_count//最大值
max(metrics_user_online_count)//增长量
increase(metrics_user_online_count[10m])
Histogram 直方图、Summary
参考文档:深入理解和使用 Prometheus 的 Histogram 指标类型 - 知乎
基于Histogram设计Springboot相关代码,模拟统计接口响应耗时
@GetMapping("/metrics/Histogram")public String histogram() throws InterruptedException {// 1. 构建 Timer,设置自定义 bucket 边界(单位:秒)Timer requestDurationTimer = Timer.builder("api_request_duration_seconds").tags("api", "myApi") // 标签用于区分接口.description("Timer for API request durations").publishPercentiles(0.5, 0.95, 0.99) // 发布百分位数(50th、95th、99th).distributionStatisticBufferLength(60) // 缓冲区大小(影响 bucket 数量).serviceLevelObjectives( // 自定义 bucket 边界(必须按升序排列)Duration.ofMillis(50), // 0.05 秒Duration.ofMillis(100), // 0.1 秒Duration.ofMillis(200), // 0.2 秒Duration.ofMillis(500), // 0.5 秒Duration.ofSeconds(1) // 1 秒).register(meterRegistry); // 注册到 MeterRegistry// 2. 模拟随机耗时(50~500 毫秒)Random random = new Random();int durationMs = 50 + random.nextInt(450);Thread.sleep(durationMs);// 3. 记录耗时到 Timer(单位:毫秒)requestDurationTimer.record(durationMs, TimeUnit.MILLISECONDS);return "Hello World";
相关命令:
//查询 Histogram 的桶(bucket)数据
api_request_duration_seconds_bucket//请求的总数
api_request_duration_seconds_count//所有请求的总时间
api_request_duration_seconds_sum//histogram_quantile 是 Prometheus 中一个非常强大的函数,可以用来计算 Histogram 的某个百分位数值(例如 50th、95th 百分位等)
histogram_quantile(0.95, sum(rate(api_request_duration_seconds_bucket[5m])) by (le))//这个查询会返回过去 5 分钟内各个桶的请求数量,by (le) 表示按桶的标签进行分组
sum(rate(api_request_duration_seconds_bucket[5m])) by (le)//这个查询会返回过去 5 分钟内,api_request_duration_seconds_bucket 中小于 0.5 秒的请求数量
sum(rate(api_request_duration_seconds_bucket{le="0.5"}[5m]))//这个查询会返回过去 5 分钟内的请求总数
sum(rate(api_request_duration_seconds_count[5m]))//这个查询会返回过去 5 分钟内请求的总耗时(单位:秒)
sum(rate(api_request_duration_seconds_sum[5m]))//这个查询会计算过去 5 分钟内请求的平均耗时
sum(rate(api_request_duration_seconds_sum[5m])) / sum(rate(api_request_duration_seconds_count[5m]))
Histogram和Summary的区别