1

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

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

假设我的代码如下所示:

public void generateUniqueValue() {

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

  } while (!unique);

  addGeneratedValueToCache(value);   
}

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

4

1 回答 1

2

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

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

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

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

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

@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在循环结束时自动装配 and ,您可以像这样使用它:

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 次尝试也是如此。

于 2019-12-07T19:10:54.623 回答