如何使用千分尺创建水桶

Ali*_*sam 1 java metrics spring-boot prometheus micrometer

我对 Micrometer 的了解还相当少,所以我将首先介绍我实际上想要实现的目标。

目的

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

结果示例

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

我想到了什么

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

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

我在想千分尺内是否可以有某种桶支撑,如下所示:

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

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

Jon*_*oni 5

检查文档并阅读有关维度和标签的信息: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
    }
}
Run Code Online (Sandbox Code Playgroud)

这会产生 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
Run Code Online (Sandbox Code Playgroud)

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

  • 总计是多少: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)但这可能会阻止您分别查询年份和月份。