带 spring 靴子和千分尺的百分位数
Percentile with spring boot and micrometer
我正在用 Spring boot 2 编写一个应用程序。我的方法尝试生成值,直到该值是唯一的。每个唯一生成的值都会添加到缓存中。通常,它应该在第一次尝试时生成值,但是应用程序越多 运行 - 生成的值重复的机会就越大,并且需要再次生成它。
我想要指标,显示 tryToGenerate
个值的百分位数。
假设我的代码如下所示:
public void generateUniqueValue() {
String value;
int tryToGenerate = 0;
do {
tryToGenerate ++
value = generateRandom();
boolean unique = isUniqueValue(value);
} while (!unique);
addGeneratedValueToCache(value);
}
我正在使用千分尺,但不知道应该从什么开始。因为为了计算百分位数,我需要存储的不是单个值,而是值的数组
要确定 isUniqueValue(..)
的结果,您已经存储了使用的值。您可以使用该存储来创建适当的指标。
让我们假设您将每个使用过的值存储在一个名为 usedIds
的列表中。此外,假设您要生成一个介于 0 和 1000 之间的唯一数字。
在这种情况下,您可以编写如下方法:
public float getPercentageUsed() {
return (float) usedIds.size() / 1000;
}
现在您可以创建一个 Gauge
来将此值添加到指标中。假设用于生成唯一值的 class 称为 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 次尝试也可以这样做。
我正在用 Spring boot 2 编写一个应用程序。我的方法尝试生成值,直到该值是唯一的。每个唯一生成的值都会添加到缓存中。通常,它应该在第一次尝试时生成值,但是应用程序越多 运行 - 生成的值重复的机会就越大,并且需要再次生成它。
我想要指标,显示 tryToGenerate
个值的百分位数。
假设我的代码如下所示:
public void generateUniqueValue() {
String value;
int tryToGenerate = 0;
do {
tryToGenerate ++
value = generateRandom();
boolean unique = isUniqueValue(value);
} while (!unique);
addGeneratedValueToCache(value);
}
我正在使用千分尺,但不知道应该从什么开始。因为为了计算百分位数,我需要存储的不是单个值,而是值的数组
要确定 isUniqueValue(..)
的结果,您已经存储了使用的值。您可以使用该存储来创建适当的指标。
让我们假设您将每个使用过的值存储在一个名为 usedIds
的列表中。此外,假设您要生成一个介于 0 和 1000 之间的唯一数字。
在这种情况下,您可以编写如下方法:
public float getPercentageUsed() {
return (float) usedIds.size() / 1000;
}
现在您可以创建一个 Gauge
来将此值添加到指标中。假设用于生成唯一值的 class 称为 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 次尝试也可以这样做。