使用 Micrometer 同时向多个监控系统发布 Spring MVC 指标

Publish Spring MVC Metrics To Multiple Monitoring System Simultaneously Using Micrometer

我有一个用例,其中我想将我的 spring 启动 API 指标同时发布到 Datadog 和 CloudWatch。

我已将以下依赖项添加到我的 pom。

<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-statsd</artifactId>
  <version>${micrometer.version}</version>
</dependency>

<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-cloudwatch</artifactId>
  <version>${micrometer.version}</version>
</dependency>

主要应用程序class

@SpringBootApplication
public class MyApplication {
    @Bean
    MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
      return registry -> registry.config().commonTags("my-tag", "my-common-tag");
    }
}

我也在 application. properties 中添加了所有必需的属性。

我可以看到正在使用默认指标名称将指标发布到 Datadog 和 CloudWatch http.server.request 但我希望 Datadog 的指标名称不同,为此,我添加了以下 属性.

management.metrics.web.server.requests-metric-name = i.want.to.be.different

但这会更改 CloudWatch 和 Datadog 的名称。

我的问题是,我怎样才能只更改 Datadog 的默认指标名称或使两者的词不同。

Micrometer 使用在 MeterRegistry 中注册的 MeterFilter 来修改已注册的仪表。修改包括将仪表 ID 映射到不同内容的能力。

在 Spring 引导中,您可以使用 MeterRegistryCustomizer bean 将 MeterFilter 添加到注册表。您可以使用泛型来处理特定类型的注册表,例如 MeterRegistryCustomizer<DatadogMeterRegistry> 对于只对自定义 Datadog 注册表感兴趣的定制器。

综合起来,您可以使用以下 bean 将 http.server.request 仪表的 ID 映射到 i.want.to.be.different

@Bean
MeterRegistryCustomizer<DatadogMeterRegistry> datadogMeterIdCustomizer() {
    return (registry) -> registry.config().meterFilter(new MeterFilter() {

        @Override
        public Id map(Id id) {
            if ("http.server.request".equals(id.getName())) {
                return id.withName("i.want.to.be.different");
            }
            return id;
        }

    });
}