mirror of
https://github.com/Graylog2/graylog2-server.git
synced 2026-03-13 09:32:21 +08:00
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:
5
changelog/unreleased/pr-24160.toml
Normal file
5
changelog/unreleased/pr-24160.toml
Normal file
@@ -0,0 +1,5 @@
|
||||
type = "a"
|
||||
message = 'Create metrics supplier for nodes system.'
|
||||
|
||||
pulls = ["24160"]
|
||||
issues = ["Graylog2/graylog-plugin-enterprise#12212"]
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
) {
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user