【问题标题】:Percentile with spring boot and micrometer带弹簧靴和千分尺的百分位数
【发布时间】:2020-04-01 09:13:35
【问题描述】:

我正在使用 Spring boot 2 编写一个应用程序。我的方法尝试生成值,直到该值是唯一的。每个唯一生成的值都会添加到缓存中。通常,它应该在第一次尝试时生成值,但应用程序运行的次数越多 - 生成的值越有可能重复,并且需要再次生成它。

我想要指标,显示tryToGenerate 值的百分位数。

假设我的代码如下所示:

public void generateUniqueValue() {

  String value;
  int tryToGenerate = 0;
  do {
     tryToGenerate ++
     value = generateRandom();
     boolean unique = isUniqueValue(value);

  } while (!unique);

  addGeneratedValueToCache(value);   
}

我正在使用千分尺,但不知道应该从什么开始。因为为了计算百分位数,我需要存储的不是单个值,而是值的数组

【问题讨论】:

    标签: java spring-boot spring-micrometer


    【解决方案1】:

    要确定isUniqueValue(..) 的结果,您已经存储了使用的值。您可以使用该存储来创建适当的指标。

    假设您将每个使用的值存储在一个名为usedIds 的列表中。此外,假设您正在生成一个介于 0 和 1000 之间的唯一数字。

    在这种情况下,您可以编写这样的方法:

    public float getPercentageUsed() {
        return (float) usedIds.size() / 1000;
    }
    

    现在您可以创建一个Gauge 来将此值添加到指标中。假设用于生成唯一值的类称为UniqueValueService,它是一个合适的 Spring bean。在这种情况下,您可以像这样创建Gauge bean:

    @Bean
    public Gauge uniqueValueUsedGauge(MeterRegistry registry, UniqueIdService service) {
        return Gauge
            .builder("unique-values-used", service::getPercentageUsed)
            .baseUnit("%")
            .description("Percentage of possible unique values that have been used")
            .register(registry);
        }
    

    编辑:看来我误解了你的问题。如果您想获得tryToGenerate 的直方图,以查看在第一次、第二次或第 n 次尝试中成功的次数,您可以使用DistributionSummary。例如:

    @Bean
    public DistributionSummary summary(MeterRegistry registry) {
        return DistributionSummary
            .builder("unique-value-attempts")
            .sla(1, 5, 10)
            .publishPercentileHistogram()
            .register(registry);
    }
    

    在本例中,它将计算在第 1 次、第 5 次或第 10 次尝试中成功调用的次数。

    在您的服务中,您现在可以自动连接DistributionSummary,在循环结束时,您可以像这样使用它:

    do {
        tryToGenerate++
        value = generateRandom();
        boolean unique = isUniqueValue(value);
      } while (!unique);
    distributionSummary.record(tryToGenerate); // Add this
    

    现在您可以使用/actuator/metrics/unique-value-attempts.histogram?tag=le:1 查看第一次尝试成功调用的次数。第 5 次和第 10 次尝试也是如此。

    【讨论】:

    • 这不是我正在寻找的确切内容,因为我想知道实数,生成值的频率不是唯一的。比方说,由于糟糕的生成器实现,它总是给出相同的伪随机数序列。
    • 但是让我补充一下,这个指标总比没有好,所以我想我会使用它
    • @a3dsfcv 我误解了你的问题。我认为DistributionSummary 在这种情况下可能更有用。我已经用一个例子编辑了我的答案。
    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2018-02-14
    • 2014-09-27
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多