当前位置: 首页 > 知识库问答 >
问题:

如何注册千分尺定时器与SLA和标签?

谢昂雄
2023-03-14

我正试图将普罗米修斯的度量标准迁移到千分尺,但现在我只能做一件事。。。

目前,我有一个普罗米修斯直方图配置如下:

private static final Histogram REQUEST_DURATION = Histogram
        .build("http_request_duration_milliseconds", "Duration in milliseconds for processing a request.")
        .labelNames("http_method", "http_status", "java_class", "java_method")
        .buckets(10, 25, 50, 100, 500, 1000)
        .register();

因此,为了切换到测微计,我将其替换为:

Timer.builder("http.request.duration")
            .description("Duration in seconds for processing a request.")
            .sla(Duration.ofMillis(10), Duration.ofMillis(25), Duration.ofMillis(50), Duration.ofMillis(100), Duration.ofMillis(500), Duration.ofMillis(1000), Duration.ofMillis(5000))
            .register(registry);

好啊让我们看看我想如何使用它。。。此刻我只是打电话

REQUEST_DURATION.labels(httpMethod, httpStatus, javaClass, javaMethod).observe(milliseconds);

所以我把这个换成了

Metrics.timer("http.request.duration",
            "http.method", httpMethod,
            "http.status", httpStatus,
            "java.class", javaClass,
            "java.method", javaMethod)
            .record(Duration.ofNanos(nanoseconds));

但现在的问题是,测微计抱怨我之前配置的度量没有这些标签。我当然知道,因为我不知道当时的值。以下是例外情况:

java.lang.IllegalArgumentExcema: Prometheus要求所有具有相同名称的仪表具有相同的标记密钥集。已经有一个包含标记键[]的现有仪表。您试图注册的计费器有键[http.method,http.status,java.class,java.method]。

好啊所以我想,然后让我们用指标指定bucket。定时器呼叫。但这不起作用,因为没有传递这些值的方法。

所以...如何为我的指标设置sla桶和标记

共有2个答案

林雅畅
2023-03-14
匿名用户

首先,最好在名称部分之间使用点分隔符。这使得度量供应商保持中立,所以如果您决定向普罗米修斯以外的公司发货,它会起作用!换句话说,最好将其记录为http.request.duration。当应用Prometheus命名约定时,它将显示为http_request_duration_seconds

如果这是Spring Boot应用程序,则可以在基于属性的仪表筛选器中声明SLA:

management.metrics.distribution.sla.http.request.duration=10ns,25ns,50ns,100ns,500ns,1000ns,5000ns

如果您使用的是Spring靴1。x、 你必须转义这里记录的名字。

另一方面,Spring已经使用名为http\u server\u requests的度量自动记录了请求持续时间。它上面没有Java类和Java方法,但是有方法和状态,还有一些其他的东西,这里没有。您有机会重写WebMvcTagsProvider,以提供其他标记(包括Java类和方法):

@Bean
WebMvcTagsProvider requestTags() {
   return customProvider; // can be extended from DefaultWebMvcTagsProvider
}

WebMvcTagsProvider#httpRequestTags有一个handler参数,您可以从中推断类型和方法。

冀耀
2023-03-14

我在千分尺松弛频道得到了答案。解决这个问题的千分尺方法不是注册度量本身,而是注册一个过滤器,如下所示:

registry.config().meterFilter(new MeterFilter() {
    @Override
    public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
        if (id.getName().equals("http.request.duration")) {
            return DistributionStatisticConfig.builder()
                    .sla(Duration.ofMillis(10).toNanos(),
                         Duration.ofMillis(25).toNanos(),
                         Duration.ofMillis(50).toNanos(), 
                         Duration.ofMillis(100).toNanos(),
                         Duration.ofMillis(500).toNanos(),
                         Duration.ofMillis(1000).toNanos(), 
                         Duration.ofMillis(5000).toNanos())
                    .build()
                    .merge(config);
        }
        return config;
    }
});

使用度量值推送度量值时。计时器(…) 如上所述,测微计将调用此过滤器并应用此处指定的所有配置。此过滤器仅在仪表初始化时调用,即度量时。计时器(…) 名称和标记第一次调用code>。所以我们不必担心这里的性能。

 类似资料:
  • 这篇题为“测微计:Spring Boot 2的新应用程序度量收集器”的博客文章提到了“维度的重要性”。 但是,它没有包括如何在Spring Boot应用程序中设置关联标签的足够示例。 现在,我正在使用Spring Boot 2的千分尺接口来提供Prometheus就绪输出,而无需进行任何基于Java的配置。例如,设置“主机”标签是否需要我编写一些代码?那会是什么样子? 以下是我的整个配置:

  • 我使用Spring靴2.1.2。释放,我尝试将测微计与CompositeMeterRegistry结合使用。我的目标是将一些选定的米发布到ElasticSearch。下面的代码显示了我的示例配置。问题是,过滤器被完全忽略(因此所有指标都被发送到ElasticSearch),尽管我可以在日志中看到它已被处理(“过滤器对仪表的回复…”行)。 奇怪的是,如果我将MeterFilter定义为Spring

  • 有没有什么简单的方法可以将千分尺计时器与网络流量控制器一起使用? 似乎@Timed只对非反应式方法有效。对于反应式,它记录非常低的时间值。 我发现了一个类似的问题:如何使用千分尺计时器记录异步方法的持续时间(返回单声道或通量),但对于这样一个常见的问题来说,答案太复杂了。 有什么想法吗?

  • 我在Spring Boot 2应用程序中使用千分尺来跟踪对象的状态。在状态更改时,调用<code>statusArrival() 这是我当前的实现: 这工作得很好,但问题是当调用此方法时,所有仪表值都会更新。我只希望更新具有给定的仪表。 输入: 电流输出: 所有仪表均已更新。 期望输出: 只有带有给定product_id标签的仪表才会更新。 我如何才能做到这一点?

  • 我对Spring很陌生,正在尝试将我的应用程序连接到麋鹿。该应用程序运行的是Spring boot 1.5.5,因此我使用的是微米遗产。我的pom看起来像这样: 每当我尝试启动我的应用程序时,我都会收到以下错误: 根本原因似乎是类io.micrometer.core.instrument.config.validate.Validated它似乎没有像它应该的那样出现在包中。对此有什么想法吗?

  • 我是一个新的使用Spring引导的度量,并从千分尺开始。在我的spring-boot应用程序中,我找不到执行计时器度量的好例子(事实是它是新的)。我使用的是spring-boot-starter-web:2.0.2.release dependency。但是在运行spring-boot服务器和启动jconsole时,我没有看到它显示度量(MBeans),所以我还显式地包含了以下依赖项: 此外,mi