diff --git a/changelog/unreleased/pr-24160.toml b/changelog/unreleased/pr-24160.toml new file mode 100644 index 0000000000..2784d1458c --- /dev/null +++ b/changelog/unreleased/pr-24160.toml @@ -0,0 +1,5 @@ +type = "a" +message = 'Create metrics supplier for nodes system.' + +pulls = ["24160"] +issues = ["Graylog2/graylog-plugin-enterprise#12212"] 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 6b090b8b07..a433b945ba 100644 --- a/graylog2-server/src/main/java/org/graylog2/telemetry/TelemetryModule.java +++ b/graylog2-server/src/main/java/org/graylog2/telemetry/TelemetryModule.java @@ -30,6 +30,7 @@ import org.graylog2.telemetry.suppliers.EventNotificationsMetricsSupplier; import org.graylog2.telemetry.suppliers.DashboardsMetricsSupplier; import org.graylog2.telemetry.suppliers.StreamsMetricsSupplier; import org.graylog2.telemetry.suppliers.SidecarsVersionSupplier; +import org.graylog2.telemetry.suppliers.NodesSystemMetricsSupplier; public class TelemetryModule extends PluginModule { @Override @@ -51,5 +52,6 @@ public class TelemetryModule extends PluginModule { addTelemetryMetricProvider("Dashboards Metrics", DashboardsMetricsSupplier.class); addTelemetryMetricProvider("Streams Metrics", StreamsMetricsSupplier.class); addTelemetryMetricProvider("Sidecars Version", SidecarsVersionSupplier.class); + addTelemetryMetricProvider("Nodes System Metrics", NodesSystemMetricsSupplier.class); } } diff --git a/graylog2-server/src/main/java/org/graylog2/telemetry/suppliers/NodesSystemMetricsSupplier.java b/graylog2-server/src/main/java/org/graylog2/telemetry/suppliers/NodesSystemMetricsSupplier.java new file mode 100644 index 0000000000..51ab5e3b1f --- /dev/null +++ b/graylog2-server/src/main/java/org/graylog2/telemetry/suppliers/NodesSystemMetricsSupplier.java @@ -0,0 +1,70 @@ +/* + * 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.fasterxml.jackson.annotation.JsonProperty; +import jakarta.inject.Inject; +import org.graylog2.telemetry.cluster.db.DBTelemetryClusterInfo; +import org.graylog2.telemetry.cluster.db.TelemetryClusterInfoDto; +import org.graylog2.telemetry.scheduler.TelemetryEvent; +import org.graylog2.telemetry.scheduler.TelemetryMetricSupplier; + +import java.util.Map; +import java.util.Optional; + +public class NodesSystemMetricsSupplier implements TelemetryMetricSupplier { + private final DBTelemetryClusterInfo dbTelemetryClusterInfo; + + @Inject + public NodesSystemMetricsSupplier(DBTelemetryClusterInfo dbTelemetryClusterInfo) { + this.dbTelemetryClusterInfo = dbTelemetryClusterInfo; + } + + @Override + public Optional get() { + Map metrics = Map.of( + "nodes", dbTelemetryClusterInfo.findAll().stream() + .map(this::toNodeInfo) + .toList() + ); + + return Optional.of(TelemetryEvent.of(metrics)); + } + + private NodeInfo toNodeInfo(TelemetryClusterInfoDto dto) { + return new NodesSystemMetricsSupplier.NodeInfo( + dto.nodeId(), + dto.operatingSystem(), + dto.cpuCores(), + dto.memoryTotal(), + dto.jvmHeapUsed(), + dto.jvmHeapCommitted(), + dto.jvmHeapMax() + ); + } + + public record NodeInfo( + @JsonProperty("node_id") String nodeId, + @JsonProperty("operating_system") String operatingSystem, + @JsonProperty("cpu_cores") Integer cpuCores, + @JsonProperty("memory_total") Long memoryTotal, + @JsonProperty("jvm_heap_used") Long jvmHeapUsed, + @JsonProperty("jvm_heap_committed") Long jvmHeapCommitted, + @JsonProperty("jvm_heap_max") Long jvmHeapMax + ) { + } +} diff --git a/graylog2-server/src/test/java/org/graylog2/telemetry/suppliers/SystemMetricsSupplierTest.java b/graylog2-server/src/test/java/org/graylog2/telemetry/suppliers/SystemMetricsSupplierTest.java new file mode 100644 index 0000000000..bf0ffb4e1d --- /dev/null +++ b/graylog2-server/src/test/java/org/graylog2/telemetry/suppliers/SystemMetricsSupplierTest.java @@ -0,0 +1,74 @@ +/* + * 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 org.graylog2.telemetry.cluster.db.DBTelemetryClusterInfo; +import org.graylog2.telemetry.cluster.db.TelemetryClusterInfoDto; +import org.graylog2.telemetry.fixtures.TelemetryFixtures; +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.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class SystemMetricsSupplierTest { + @Mock + private DBTelemetryClusterInfo dbTelemetryClusterInfo; + + @InjectMocks + private NodesSystemMetricsSupplier supplier; + + @Test + public void shouldReturnSystemMetrics() { + TelemetryClusterInfoDto nodeInfo1 = TelemetryFixtures.nodeInfo("node-1", true); + TelemetryClusterInfoDto nodeInfo2 = TelemetryFixtures.nodeInfo("node-1", false); + + when(dbTelemetryClusterInfo.findAll()).thenReturn(List.of(nodeInfo1, nodeInfo2)); + + Optional event = supplier.get(); + assertTrue(event.isPresent()); + + var nodes = (List) event.get().metrics().get("nodes"); + assertThat(nodes) + .hasSize(2) + .containsExactlyInAnyOrder( + toNodeInfo(nodeInfo1), + toNodeInfo(nodeInfo2) + ); + } + + private NodesSystemMetricsSupplier.NodeInfo toNodeInfo(TelemetryClusterInfoDto dto) { + return new NodesSystemMetricsSupplier.NodeInfo( + dto.nodeId(), + dto.operatingSystem(), + dto.cpuCores(), + dto.memoryTotal(), + dto.jvmHeapUsed(), + dto.jvmHeapCommitted(), + dto.jvmHeapMax() + ); + } +}