Create nodes system metrics supplier (#24160)

* Implement system metrics supplier

* Add changelog

* Adjust metrics supplier to include per-node info

* Update supplier classname

* Update changelog

---------

Co-authored-by: Florian Petersen <188503754+fpetersen-gl@users.noreply.github.com>
This commit is contained in:
Ismail Belkacim
2025-11-26 11:41:15 +01:00
committed by GitHub
parent 5bf211f2eb
commit 6f71f18302
4 changed files with 151 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
type = "a"
message = 'Create metrics supplier for nodes system.'
pulls = ["24160"]
issues = ["Graylog2/graylog-plugin-enterprise#12212"]

View File

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

View File

@@ -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
* <http://www.mongodb.com/licensing/server-side-public-license>.
*/
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<TelemetryEvent> get() {
Map<String, Object> 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
) {
}
}

View File

@@ -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
* <http://www.mongodb.com/licensing/server-side-public-license>.
*/
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<TelemetryEvent> event = supplier.get();
assertTrue(event.isPresent());
var nodes = (List<NodesSystemMetricsSupplier.NodeInfo>) 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()
);
}
}