跳到主要内容

MongoDB 指标监控

DeepSeek V3 中英对照 MongoDB MongoDB Metrics Instrumentation

MongoDB 是一个现代化的数据库,支持事务、搜索、分析和移动用例,具有灵活的文档数据模型和统一的查询接口。

下面你可以找到一个如何使用 Micrometer 对 MongoDB 进行监控的示例。

提示

要添加更多功能,例如分布式追踪,请考虑使用 Spring Data MongoDB,它在底层使用了 Micrometer Observation

以下你可以找到命令执行的指标示例。

// Setting up instrumentation
registry = new SimpleMeterRegistry();
MongoClientSettings settings = MongoClientSettings.builder()
.addCommandListener(new MongoMetricsCommandListener(registry))
.applyToClusterSettings(builder -> builder.hosts(singletonList(new ServerAddress(host, port)))
.addClusterListener(new ClusterListener() {
@Override
public void clusterOpening(ClusterOpeningEvent event) {
clusterId.set(event.getClusterId().getValue());
}
}))
.build();
mongo = MongoClients.create(settings);

// Usage example
mongo.getDatabase("test").getCollection("testCol").insertOne(new Document("testDoc", new Date()));

Tags tags = Tags.of("cluster.id", clusterId.get(), "server.address", String.format("%s:%s", host, port),
"command", "insert", "database", "test", "collection", "testCol", "status", "SUCCESS");
assertThat(registry.get("mongodb.driver.commands").tags(tags).timer().count()).isEqualTo(1);
java

以下你可以找到一个连接池的指标示例。

// Setting up instrumentation
MeterRegistry registry = new SimpleMeterRegistry();
MongoMetricsConnectionPoolListener connectionPoolListener = new MongoMetricsConnectionPoolListener(registry,
e -> Tags.of("cluster.id", e.getServerId().getClusterId().getValue(), "server.address",
e.getServerId().getAddress().toString(), "my.custom.connection.pool.identifier", "custom"));
MongoClientSettings settings = MongoClientSettings.builder()
.applyToConnectionPoolSettings(
builder -> builder.minSize(2).addConnectionPoolListener(connectionPoolListener))
.applyToClusterSettings(builder -> builder.hosts(singletonList(new ServerAddress(host, port)))
.addClusterListener(new ClusterListener() {
@Override
public void clusterOpening(@NonNull ClusterOpeningEvent event) {
clusterId.set(event.getClusterId().getValue());
}
}))
.build();
MongoClient mongo = MongoClients.create(settings);

// Usage example
mongo.getDatabase("test").createCollection("testCol");

Tags tags = Tags.of("cluster.id", clusterId.get(), "server.address", String.format("%s:%s", host, port),
"my.custom.connection.pool.identifier", "custom");

assertThat(registry.get("mongodb.driver.pool.size").tags(tags).gauge().value()).isEqualTo(2);
assertThat(registry.get("mongodb.driver.pool.checkedout").gauge().value()).isZero();
assertThat(registry.get("mongodb.driver.pool.checkoutfailed").counter().count()).isZero();
assertThat(registry.get("mongodb.driver.pool.waitqueuesize").gauge().value()).isZero();

mongo.close();
java