【问题标题】:How to create buckets with Micrometer如何使用千分尺创建存储桶
【发布时间】:2022-02-02 14:46:45
【问题描述】:

我对 Micrometer 的了解还比较少,所以我将首先介绍我真正想要实现的目标。

目的

  • 鉴于我在数据库表中有记录,每条记录都包含一个“creation_date”。
  • 假设客户端调用 API 来获取这些记录
  • 我想按记录的创建日期(仅月和年)分组记录被访问的​​次数

示例结果

  • 在过去 6 小时内,访问了 2021 年 1 月创建的 10 条记录
  • 在过去 12 小时内,访问了 2021 年 2 月创建的 15 条记录
  • 在上周一和上周二之间,访问了 2021 年 2 月创建的 5 条记录

我的想法

  • 每个月/年组合的计数器,每当访问同一月/年创建日期的记录时都会递增

如果我没记错的话,这种方法的问题是必须为过去和未来创建的计数器的数量。

我在想是否可以在 Micrometer 中提供某种桶支持,例如:

  • 如果访问的记录创建于 2021 年 1 月 -> 将其存储在存储桶 A(标记为 2021 年 1 月)中
  • 如果访问的记录是在 2022 年 2 月创建的 -> 将其存储在存储桶 B(标记为 2022 年 2 月)中

我不确定我是否正在寻找正确的方向来实现这一目标。非常感谢!

【问题讨论】:

  • 您很可能不想在微米范围内进行此聚合,而是在您将指标发送到的指标后端内进行。您使用的是哪个指标后端?

标签: java spring-boot prometheus metrics micrometer


【解决方案1】:

查看文档并阅读有关维度和标签的信息:https://micrometer.io/docs/concepts

如果我正确理解您的问题,您希望计数器有一个标签(标签),显示访问月份,这是一个示例:

public class TagsDemo {
    private static final SimpleMeterRegistry registry= new SimpleMeterRegistry();

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Counter accessCounter = Counter.builder("accessed")
                    .tag("year", getAccessedYear())
                    .tag("month", getAccessedMonth())
                    .register(registry);
            accessCounter.increment();
        }

        System.out.println(registry.getMetersAsString());
    }

    private static String getAccessedYear() {
        return "202" + (int)(Math.random() * 2); // 2020, 2021
    }

    private static String getAccessedMonth() {
        return "0" + ((int)(Math.random() * 2) + 1); // 01, 02
    }
}

这会产生 4 个时间序列(2020-01、2020-02、2021-01、2021-02):

accessed(COUNTER)[month='01', year='2021']; count=1.0
accessed(COUNTER)[month='02', year='2021']; count=3.0
accessed(COUNTER)[month='01', year='2020']; count=4.0
accessed(COUNTER)[month='02', year='2020']; count=2.0

在你的后端,你可以查询(我编了一个查询语言,因为我不知道你的注册表):

  • 总数是多少:sum(accessed)
  • 2021年总数是多少:sum(accessed WHERE year=2021)
  • 2021-01 的总数是多少:sum(accessed WHERE year=2021 AND month=01)

当然,您可以只添加一个标签,如.tag("date", getAccessedDate()) (2021-01) 并查询:sum(accessed WHERE date=2021-01),但这会妨碍您分别查询年份和月份。

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2016-06-21
    • 2015-02-14
    相关资源
    最近更新 更多