Метрики Spring Boot Micrometer для MongoDB

Я использую пружинный пыльник 2.2.5 + микрометр 1.3.5 + starter-data-mongodb

В разделе «io.micrometer.core.instrument.binder.mongodb» я вижу 2 класса CommandListener и ConnectionPoolListener. Я хотел бы знать, для чего они служат?

В конечной точке метрик исполнительного механизма метрики монго недоступны.

Как включить метрики для mongodb в актуаторе? Например, актуатор автоматически показывает несколько показателей RabbitMQ. Я ожидал чего-то подобного и в случае с MongoDB. Должен ли я создавать свои собственные метрики?


person Winster    schedule 02.04.2020    source источник
comment
Рекомендуется ли запускать / останавливать таймер в AbstractMongoEventListener - onBeforeConvert и onAfterConvert   -  person Winster    schedule 18.05.2020


Ответы (3)


Добавление этих слушателей не так просто, как я думал, и очень зависит от того, какие свойства вы используете для настройки Spring Data MongoDB.

Ключом к интеграции является настройка экземпляра com.mongodb.MongoClientSettings, который используется для создания MongoClient. Есть несколько возможностей сделать это, как описано в Подключение к MongoDB с помощью Spring

Ниже приведен рабочий пример (упрощенный по сравнению с нашим приложением) на основе Spring Boot 2.3, в котором предполагается, что вы используете spring.data.mongodb.uri для указания строки подключения в своем application.properties.

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;
    }

}

К сожалению, многое в настройке MongoDB с Spring Boot 2.2 на 2.3. Если вы не можете использовать Spring Boot 2.3 и застряли в бэкпорте на 2.2, дайте мне знать.

person Adrian Gygax    schedule 26.05.2020

Чтобы включить Spring Boot, применяя его автоконфигурацию, я предлагаю использовать шаблон настройщика:

@Configuration
public class MongoConfiguration {

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

}

Обратите внимание, что в настоящее время вы не увидите в метриках отношения ни к хранилищу данных Spring, ни к коллекции mongo. см. открытую проблему

person chrgue    schedule 30.06.2020

Короткий ответ

Создайте MongoClientOptions bean с addCommandListener, и все готово.

@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 инициализирует MongoClient с MongoClientOptions, а не MongoClientSettings. Это может работать в более новой версии spring-data-mongodb, потому что 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());
    }

Убедитесь, что прометей и микрометр настроены правильно. Вы должны увидеть показатели mongo в конечной точке prometheus, как показано ниже:

# 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
person yadance nick    schedule 30.05.2021