From befbe298edb97cd8fdae95e9c3d272cb89767f00 Mon Sep 17 00:00:00 2001 From: Ismail Belkacim Date: Mon, 10 Nov 2025 12:05:10 +0100 Subject: [PATCH] Create MongoDB metrics supplier (#24091) * Implement mongodb metrics supplier * Add changelog --------- Co-authored-by: Florian Petersen <188503754+fpetersen-gl@users.noreply.github.com> --- changelog/unreleased/pr-24091.toml | 5 ++ .../graylog2/telemetry/TelemetryModule.java | 2 + .../suppliers/MongoDBMetricsSupplier.java | 41 +++++++++++++ .../suppliers/MongoDBMetricsSupplierTest.java | 57 +++++++++++++++++++ 4 files changed, 105 insertions(+) create mode 100644 changelog/unreleased/pr-24091.toml create mode 100644 graylog2-server/src/main/java/org/graylog2/telemetry/suppliers/MongoDBMetricsSupplier.java create mode 100644 graylog2-server/src/test/java/org/graylog2/telemetry/suppliers/MongoDBMetricsSupplierTest.java diff --git a/changelog/unreleased/pr-24091.toml b/changelog/unreleased/pr-24091.toml new file mode 100644 index 0000000000..c0bbac3b3a --- /dev/null +++ b/changelog/unreleased/pr-24091.toml @@ -0,0 +1,5 @@ +type = "a" +message = "Create metrics supplier for MongoDB." + +pulls = ["24091"] +issues = ["Graylog2/graylog-plugin-enterprise#12206"] diff --git a/graylog2-server/src/main/java/org/graylog2/telemetry/TelemetryModule.java b/graylog2-server/src/main/java/org/graylog2/telemetry/TelemetryModule.java index 6123110711..6ba5b7ebc7 100644 --- a/graylog2-server/src/main/java/org/graylog2/telemetry/TelemetryModule.java +++ b/graylog2-server/src/main/java/org/graylog2/telemetry/TelemetryModule.java @@ -21,6 +21,7 @@ import org.graylog2.plugin.PluginModule; import org.graylog2.telemetry.scheduler.TelemetrySubmissionPeriodical; import org.graylog2.telemetry.suppliers.InputsMetricsSupplier; import org.graylog2.telemetry.suppliers.OutputsMetricsSupplier; +import org.graylog2.telemetry.suppliers.MongoDBMetricsSupplier; import org.graylog2.telemetry.suppliers.ShardsMetricsSupplier; import org.graylog2.telemetry.suppliers.LookupTablesSupplier; @@ -35,6 +36,7 @@ public class TelemetryModule extends PluginModule { addTelemetryMetricProvider("Inputs Metrics", InputsMetricsSupplier.class); addTelemetryMetricProvider("Outputs Metrics", OutputsMetricsSupplier.class); + addTelemetryMetricProvider("MongoDB Metrics", MongoDBMetricsSupplier.class); addTelemetryMetricProvider("Shards Metrics", ShardsMetricsSupplier.class); addTelemetryMetricProvider("Lookup Tables Metrics", LookupTablesSupplier.class); } diff --git a/graylog2-server/src/main/java/org/graylog2/telemetry/suppliers/MongoDBMetricsSupplier.java b/graylog2-server/src/main/java/org/graylog2/telemetry/suppliers/MongoDBMetricsSupplier.java new file mode 100644 index 0000000000..71be5aa222 --- /dev/null +++ b/graylog2-server/src/main/java/org/graylog2/telemetry/suppliers/MongoDBMetricsSupplier.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2020 Graylog, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * . + */ +package org.graylog2.telemetry.suppliers; + +import com.mongodb.MongoClient; +import jakarta.inject.Inject; +import org.graylog2.database.MongoDBVersionCheck; +import org.graylog2.telemetry.scheduler.TelemetryEvent; +import org.graylog2.telemetry.scheduler.TelemetryMetricSupplier; + +import java.util.Map; +import java.util.Optional; + +public class MongoDBMetricsSupplier implements TelemetryMetricSupplier { + private final MongoClient mongoClient; + + @Inject + public MongoDBMetricsSupplier(MongoClient mongoClient) { + this.mongoClient = mongoClient; + } + + @Override + public Optional get() { + return Optional.ofNullable(MongoDBVersionCheck.getVersion(mongoClient)) + .map(version -> TelemetryEvent.of(Map.of("version", version.toString()))); + } +} diff --git a/graylog2-server/src/test/java/org/graylog2/telemetry/suppliers/MongoDBMetricsSupplierTest.java b/graylog2-server/src/test/java/org/graylog2/telemetry/suppliers/MongoDBMetricsSupplierTest.java new file mode 100644 index 0000000000..31d973996d --- /dev/null +++ b/graylog2-server/src/test/java/org/graylog2/telemetry/suppliers/MongoDBMetricsSupplierTest.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2020 Graylog, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * . + */ +package org.graylog2.telemetry.suppliers; + +import com.github.zafarkhaja.semver.Version; +import com.mongodb.MongoClient; +import org.graylog2.database.MongoDBVersionCheck; +import org.graylog2.telemetry.scheduler.TelemetryEvent; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mockStatic; + +@ExtendWith(MockitoExtension.class) +public class MongoDBMetricsSupplierTest { + @Mock + private MongoClient mongoClient; + + @InjectMocks + private MongoDBMetricsSupplier mongoDBMetricsSupplier; + + @Test + public void shouldReturnMongoDBMetrics() { + Version version = Version.of(7, 0, 24); + + try (MockedStatic mongoDBVersionCheck = mockStatic(MongoDBVersionCheck.class)) { + mongoDBVersionCheck.when(() -> MongoDBVersionCheck.getVersion(mongoClient)).thenReturn(version); + + Optional event = mongoDBMetricsSupplier.get(); + + assertTrue(event.isPresent()); + assertEquals(version.toString(), event.get().metrics().get("version")); + } + } +}