【问题标题】:Spring Boot Micrometer metrics for MongoDBMongoDB 的 Spring Boot Micrometer 指标
【发布时间】:2020-07-14 10:45:31
【问题描述】:

我用的是spring boot 2.2.5 + micrometer 1.3.5 + starter-data-mongodb

在“io.micrometer.core.instrument.binder.mongodb”下,我可以看到 2 个类 CommandListener 和 ConnectionPoolListener。我想知道它们的用途是什么?

在执行器指标端点中,mongo 指标不可用。

如何在执行器中启用 mongodb 的指标?例如, actuator 自动显示 RabbitMQ 的几个指标。在 MongoDB 的情况下,我也期待类似的东西。 我应该创建自己的指标吗?

【问题讨论】:

  • 在 AbstractMongoEventListener - onBeforeConvert & onAfterConvert 中启动/停止计时器是否是一个好习惯

标签: mongodb spring-boot spring-boot-actuator spring-micrometer


【解决方案1】:

为了让 Spring Boot 应用其 AutoConfiguration,我建议使用定制器模式:

科特林:

@Configuration
class MongoConfiguration {

    @Bean
    fun mongoClientSettingsBuilderCustomizer(meterRegistry: MeterRegistry) =
        MongoClientSettingsBuilderCustomizer {
           it.addCommandListener(MongoMetricListener(meterRegistry))}
}

Java:

@Configuration
public class MongoConfiguration {

   @Bean
   public MongoClientSettingsBuilderCustomizer mongoClientSettingsBuilderCustomizer(MeterRegistry meterRegistry) {
        return builder -> builder.addCommandListener(new MongoMetricsCommandListener(meterRegistry));
   }

}

请注意,您目前在指标中既不会看到与 spring 数据存储库的关系,也不会看到与 mongo 集合的关系。 see open issue


编辑(2021 年 7 月 30 日):

问题已得到修复,因此您可能会在当前版本中获得收集指标。

【讨论】:

    【解决方案2】:

    添加这些侦听器并不像我想象的那么简单,它完全取决于您用于配置 Spring Data MongoDB 的属性。

    集成的关键是自定义用于创建MongoClient的com.mongodb.MongoClientSettings实例。如Connecting to MongoDB with Spring

    所述,有多种方法可以这样做

    以下是一个基于 Spring Boot 2.3 的工作示例(从我们的应用程序中简化),假设您使用 spring.data.mongodb.uri 来指定应用程序中的连接字符串。属性。

    package com.example.demo;
    
    import com.mongodb.ConnectionString;
    import com.mongodb.MongoClientSettings;
    import io.micrometer.core.instrument.MeterRegistry;
    import io.micrometer.core.instrument.binder.mongodb.MongoMetricsCommandListener;
    import io.micrometer.core.instrument.binder.mongodb.MongoMetricsConnectionPoolListener;
    import org.springframework.boot.autoconfigure.mongo.MongoProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.mongodb.core.MongoClientFactoryBean;
    
    @Configuration
    public class MongoConfiguration {
    
        @Bean
        public MongoClientFactoryBean mongoClientFactoryBean(MongoProperties properties, MeterRegistry meterRegistry) {
            MongoClientFactoryBean mongoClientFactoryBean = new MongoClientFactoryBean();
    
            mongoClientFactoryBean.setConnectionString(new ConnectionString(properties.getUri()));
    
            MongoClientSettings settings = MongoClientSettings.builder()
                    .addCommandListener(new MongoMetricsCommandListener(meterRegistry))
                    .applyToConnectionPoolSettings(builder ->
                            builder.addConnectionPoolListener(new MongoMetricsConnectionPoolListener(meterRegistry)))
                    .build();
            mongoClientFactoryBean.setMongoClientSettings(settings);
    
            return mongoClientFactoryBean;
        }
    
    }
    

    不幸的是,configuring MongoDB from Spring Boot 2.2 to 2.3 中有很多内容。如果您不能使用 Spring Boot 2.3 并且您被困在向后移植到 2.2 中,请告诉我。

    【讨论】:

      【解决方案3】:

      简答

      使用addCommandListener 创建一个MongoClientOptions bean,您就可以开始了。

      @Configuration
      public class MongoConfiguration {
          @Autowired
          private MeterRegistry meterRegistry;
      
          @Bean
          public MongoClientOptions myMongoClientOptions() {
              return MongoClientOptions.builder()
      .addCommandListener(new MongoMetricsCommandListener(meterRegistry)).build();
          }
      
      }
      

      @chargue 的回答不适用于特定版本的spring-data-mongodb。因为org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration 用MongoClientOptions 初始化MongoClient,而不是MongoClientSettings。它可能适用于较新版本的spring-data-mongodb cuz MongoClientSettings 是根据 mongodb 的文档推荐的方式。

          @Bean
          @ConditionalOnMissingBean(type = { "com.mongodb.MongoClient", "com.mongodb.client.MongoClient" })
          public MongoClient mongo(MongoProperties properties, ObjectProvider<MongoClientOptions> options,
                  Environment environment) {
              return new MongoClientFactory(properties, environment).createMongoClient(options.getIfAvailable());
          }
      

      确保 prometheus 和 micrometer 设置正确。您应该在 prometheus 端点中看到 mongo 指标,如下所示:

      # HELP process_cpu_usage The "recent cpu usage" for the Java Virtual Machine process
      # TYPE process_cpu_usage gauge
      process_cpu_usage{application="",} 0.004362672325272289
      # HELP mongodb_driver_commands_seconds_max Timer of mongodb commands
      # TYPE mongodb_driver_commands_seconds_max gauge
      mongodb_driver_commands_seconds_max{application="",cluster_id="60b0d12d73b6df671cb4d882",command="find",server_address="",status="SUCCESS",} 34.684200332
      mongodb_driver_commands_seconds_max{application="",cluster_id="60b0d12d73b6df671cb4d882",command="buildInfo",server_address="",status="SUCCESS",} 0.263514375
      # HELP mongodb_driver_commands_seconds Timer of mongodb commands
      # TYPE mongodb_driver_commands_seconds summary
      mongodb_driver_commands_seconds_count{application="",cluster_id="60b0d12d73b6df671cb4d882",command="find",server_address="",status="SUCCESS",} 1.0
      mongodb_driver_commands_seconds_sum{application="",cluster_id="60b0d12d73b6df671cb4d882",command="find",server_address="",status="SUCCESS",} 34.684200332
      mongodb_driver_commands_seconds_count{application="",cluster_id="60b0d12d73b6df671cb4d882",command="buildInfo",server_address="",status="SUCCESS",} 1.0
      mongodb_driver_commands_seconds_sum{application="",cluster_id="60b0d12d73b6df671cb4d882",command="buildInfo",server_address="",status="SUCCESS",} 0.263514375
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-07
        • 1970-01-01
        • 2020-12-20
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        相关资源
        最近更新 更多