From 0c77a2fe9e233119d8d9c1850131a2481db9e335 Mon Sep 17 00:00:00 2001 From: Jonathan Shook Date: Wed, 20 Dec 2023 17:16:31 -0600 Subject: [PATCH] factor client metrics checker into component attachment --- .../core/lifecycle/session/NBSession.java | 98 +------ .../session/NBSessionSafetyMetrics.java | 253 ++++++++++++++++++ 2 files changed, 255 insertions(+), 96 deletions(-) create mode 100644 engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/session/NBSessionSafetyMetrics.java diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/session/NBSession.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/session/NBSession.java index e7cab4a5e..0b26dc7d1 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/session/NBSession.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/session/NBSession.java @@ -16,7 +16,6 @@ package io.nosqlbench.engine.core.lifecycle.session; -import io.nosqlbench.nb.api.components.core.NBComponentProps; import io.nosqlbench.nb.api.engine.activityimpl.ActivityDef; import io.nosqlbench.nb.api.engine.metrics.instruments.NBFunctionGauge; import io.nosqlbench.nb.api.engine.metrics.instruments.NBMetricGauge; @@ -45,7 +44,7 @@ import java.util.function.Function; */ public class NBSession extends NBBaseComponent implements Function, ExecutionResult>, NBTokenWords { private final static Logger logger = LogManager.getLogger(NBSession.class); - private final ClientSystemMetricChecker clientMetricChecker; +// private final ClientSystemMetricChecker clientMetricChecker; private final Map containers = new ConcurrentHashMap<>(); @@ -64,31 +63,11 @@ public class NBSession extends NBBaseComponent implements Function, Ex labelContext.getLabels() .and("session", sessionName) ); - - this.clientMetricChecker = new ClientSystemMetricChecker(this, NBLabels.forKV(), 10); - registerLoadAvgMetrics(); - registerMemInfoMetrics(); -// registerDiskStatsMetrics(); - registerNetworkInterfaceMetrics(); - registerCpuStatMetrics(); - clientMetricChecker.start(); + new NBSessionSafetyMetrics(this); bufferOrphanedMetrics = true; } - /** - * Notes on scenario names: - *
    - *
  • If none are provided, then all cmds are implicitly allocated to the "default" scenario.
  • - *
  • If the name "default" is provided directly, then this is considered an error.
  • - *
  • Otherwise, the most recently set scenario name is the one in which all following commands are run.
  • - *
  • - *
- * - * @param cmds - * the function argument - * @return - */ public ExecutionResult apply(List cmds) { // TODO: add container closing command @@ -124,79 +103,6 @@ public class NBSession extends NBBaseComponent implements Function, Ex } - private void registerLoadAvgMetrics() { - LoadAvgReader reader = new LoadAvgReader(); - if (!reader.fileExists()) - return; - - NBFunctionGauge load1m = create().gauge("loadavg_1min", reader::getOneMinLoadAverage); - clientMetricChecker.addMetricToCheck(load1m, 50.0); - - NBFunctionGauge load5m = create().gauge("loadavg_5min", reader::getFiveMinLoadAverage); - clientMetricChecker.addMetricToCheck(load5m, 50.0); - - NBFunctionGauge load15m = create().gauge("loadavg_15min", reader::getFifteenMinLoadAverage); - clientMetricChecker.addMetricToCheck(load15m, 50.0); - // add checking for CPU load averages; TODO: Modify thresholds - - } - - private void registerMemInfoMetrics() { - MemInfoReader reader = new MemInfoReader(); - if (!reader.fileExists()) - return; - - NBMetricGauge memTotalGauge = create().gauge("mem_total", reader::getMemTotalkB); - NBMetricGauge memUsedGauge = create().gauge("mem_used", reader::getMemUsedkB); - NBMetricGauge memFreeGauge = create().gauge("mem_free", reader::getMemFreekB); - NBMetricGauge memAvailableGauge = create().gauge("mem_avaialble", reader::getMemAvailablekB); - NBMetricGauge memCachedGauge = create().gauge("mem_cache", reader::getMemCachedkB); - NBMetricGauge memBufferedGauge = create().gauge("mem_buffered", reader::getMemBufferskB); - // add checking for percent memory used at some given time; TODO: Modify percent threshold - clientMetricChecker.addRatioMetricToCheck(memUsedGauge, memTotalGauge, 90.0, false); - - NBMetricGauge swapTotalGauge = create().gauge("swap_total", reader::getSwapTotalkB); - NBMetricGauge swapFreeGauge = create().gauge("swap_free", reader::getSwapFreekB); - NBMetricGauge swapUsedGauge = create().gauge("swap_used", reader::getSwapUsedkB); - } - - private void registerDiskStatsMetrics() { - DiskStatsReader reader = new DiskStatsReader(); - if (!reader.fileExists()) - return; - - for (String device : reader.getDevices()) { - create().gauge(device + "_transactions", () -> reader.getTransactionsForDevice(device)); - create().gauge(device + "_kB_read", () -> reader.getKbReadForDevice(device)); - create().gauge(device + "_kB_written", () -> reader.getKbWrittenForDevice(device)); - } - } - - private void registerNetworkInterfaceMetrics() { - NetDevReader reader = new NetDevReader(); - if (!reader.fileExists()) - return; - for (String iface : reader.getInterfaces()) { - create().gauge(iface + "_rx_bytes", () -> reader.getBytesReceived(iface)); - create().gauge(iface + "_rx_packets", () -> reader.getPacketsReceived(iface)); - create().gauge(iface + "_tx_bytes", () -> reader.getBytesTransmitted(iface)); - create().gauge(iface + "_tx_packets", () -> reader.getPacketsTransmitted(iface)); - } - } - - private void registerCpuStatMetrics() { - StatReader reader = new StatReader(); - if (!reader.fileExists()) - return; - NBMetricGauge cpuUserGauge = create().gauge("cpu_user", reader::getUserTime); - NBMetricGauge cpuSystemGauge = create().gauge("cpu_system", reader::getSystemTime); - NBMetricGauge cpuIdleGauge = create().gauge("cpu_idle", reader::getIdleTime); - NBMetricGauge cpuIoWaitGauge = create().gauge("cpu_iowait", reader::getIoWaitTime); - NBMetricGauge cpuTotalGauge = create().gauge("cpu_total", reader::getTotalTime); - // add checking for percent of time spent in user space; TODO: Modify percent threshold - clientMetricChecker.addRatioMetricToCheck(cpuUserGauge, cpuTotalGauge, 50.0, true); - } - private NBBufferedContainer getContext(String name) { return containers.computeIfAbsent( name, diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/session/NBSessionSafetyMetrics.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/session/NBSessionSafetyMetrics.java new file mode 100644 index 000000000..e8a9d50c1 --- /dev/null +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/session/NBSessionSafetyMetrics.java @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2023 nosqlbench + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.nosqlbench.engine.core.lifecycle.session; + +import io.nosqlbench.engine.core.clientload.*; +import io.nosqlbench.nb.api.components.core.NBBaseComponent; +import io.nosqlbench.nb.api.components.core.NBComponent; +import io.nosqlbench.nb.api.components.core.NBComponentMetrics; +import io.nosqlbench.nb.api.engine.metrics.instruments.MetricCategory; +import io.nosqlbench.nb.api.engine.metrics.instruments.NBFunctionGauge; +import io.nosqlbench.nb.api.engine.metrics.instruments.NBMetricGauge; +import io.nosqlbench.nb.api.labels.NBLabels; + +public class NBSessionSafetyMetrics extends NBBaseComponent { + + public NBSessionSafetyMetrics(NBSession parent) { + super(parent, NBLabels.forKV()); + ClientSystemMetricChecker metricsChecker = registerSessionSafetyMetrics(parent); + metricsChecker.start(); + } + + private ClientSystemMetricChecker registerSessionSafetyMetrics(NBSession nbSession) { + ClientSystemMetricChecker metricsChecker = new ClientSystemMetricChecker( + this, + NBLabels.forKV(), + 10 + ); + registerLoadAvgMetrics(metricsChecker); + registerMemInfoMetrics(metricsChecker); +// registerDiskStatsMetrics(); + registerNetworkInterfaceMetrics(metricsChecker); + registerCpuStatMetrics(metricsChecker); + return metricsChecker; + } + + private void registerCpuStatMetrics(ClientSystemMetricChecker metricsChecker) { + StatReader reader = new StatReader(); + if (!reader.fileExists()) + return; + NBMetricGauge cpuUserGauge = create().gauge( + "cpu_user", + reader::getUserTime, + MetricCategory.Internals, + "" + ); + NBMetricGauge cpuSystemGauge = create().gauge( + "cpu_system", + reader::getSystemTime, + MetricCategory.Internals, + "" + ); + NBMetricGauge cpuIdleGauge = create().gauge( + "cpu_idle", + reader::getIdleTime, + MetricCategory.Internals, + "" + ); + NBMetricGauge cpuIoWaitGauge = create().gauge( + "cpu_iowait", + reader::getIoWaitTime, + MetricCategory.Internals, + "" + ); + NBMetricGauge cpuTotalGauge = create().gauge( + "cpu_total", + reader::getTotalTime, + MetricCategory.Internals, + "" + ); + // add checking for percent of time spent in user space; TODO: Modify percent threshold + metricsChecker.addRatioMetricToCheck( + cpuUserGauge, + cpuTotalGauge, + 50.0, + true + ); + } + + private void registerDiskStatsMetrics(ClientSystemMetricChecker metricsChecker) { + DiskStatsReader reader = new DiskStatsReader(); + if (!reader.fileExists()) + return; + + for (String device : reader.getDevices()) { + create().gauge( + device + "_transactions", + () -> reader.getTransactionsForDevice(device), + MetricCategory.Internals, + "" + ); + create().gauge(device + "_kB_read", + () -> reader.getKbReadForDevice(device), + MetricCategory.Internals, + "" + ); + create().gauge(device + "_kB_written", + () -> reader.getKbWrittenForDevice(device), + MetricCategory.Internals, + "" + ); + } + } + + private void registerNetworkInterfaceMetrics(ClientSystemMetricChecker metricsChecker) { + NetDevReader reader = new NetDevReader(); + if (!reader.fileExists()) + return; + for (String iface : reader.getInterfaces()) { + create().gauge( + iface + "_rx_bytes", + () -> reader.getBytesReceived(iface), + MetricCategory.Internals, + "" + ); + create().gauge( + iface + "_rx_packets", + () -> reader.getPacketsReceived(iface), + MetricCategory.Internals, + "" + ); + create().gauge( + iface + "_tx_bytes", + () -> reader.getBytesTransmitted(iface), + MetricCategory.Internals, + "" + ); + create().gauge( + iface + "_tx_packets", + () -> reader.getPacketsTransmitted(iface), + MetricCategory.Internals, + "" + ); + } + } + + private void registerLoadAvgMetrics(ClientSystemMetricChecker metricsChecker) { + LoadAvgReader reader = new LoadAvgReader(); + if (!reader.fileExists()) + return; + + NBFunctionGauge load1m = create().gauge( + "loadavg_1min", + reader::getOneMinLoadAverage, + MetricCategory.Internals, + "the 1 minute load average of the test client client" + ); + metricsChecker.addMetricToCheck(load1m, 50.0); + + NBFunctionGauge load5m = create().gauge( + "loadavg_5min", + reader::getFiveMinLoadAverage, + MetricCategory.Internals, + "the 5 minute load average of the test client client" + ); + metricsChecker.addMetricToCheck(load5m, 50.0); + + NBFunctionGauge load15m = create().gauge( + "loadavg_15min", + reader::getFifteenMinLoadAverage, + MetricCategory.Internals, + "the 15 minute load average of the test client" + ); + metricsChecker.addMetricToCheck(load15m, 50.0); + // add checking for CPU load averages; TODO: Modify thresholds + + } + + private void registerMemInfoMetrics(ClientSystemMetricChecker metricsChecker) { + MemInfoReader reader = new MemInfoReader(); + if (!reader.fileExists()) + return; + + NBMetricGauge memTotalGauge = create().gauge( + "mem_total", + reader::getMemTotalkB, + MetricCategory.Internals, + "" + + ); + NBMetricGauge memUsedGauge = create().gauge( + "mem_used", + reader::getMemUsedkB, + MetricCategory.Internals, + "" + ); + NBMetricGauge memFreeGauge = create().gauge( + "mem_free", + reader::getMemFreekB, + MetricCategory.Internals, + "" + ); + NBMetricGauge memAvailableGauge = create().gauge( + "mem_available", + reader::getMemAvailablekB, + MetricCategory.Internals, + "" + ); + NBMetricGauge memCachedGauge = create().gauge( + "mem_cache", + reader::getMemCachedkB, + MetricCategory.Internals, + "" + ); + NBMetricGauge memBufferedGauge = create().gauge( + "mem_buffered", + reader::getMemBufferskB, + MetricCategory.Internals, + "" + ); + // add checking for percent memory used at some given time; TODO: Modify percent threshold + metricsChecker.addRatioMetricToCheck( + memUsedGauge, + memTotalGauge, + 90.0, + false + ); + + NBMetricGauge swapTotalGauge = create().gauge( + "swap_total", + reader::getSwapTotalkB, + MetricCategory.Internals, + "" + ); + NBMetricGauge swapFreeGauge = create().gauge( + "swap_free", + reader::getSwapFreekB, + MetricCategory.Internals, + "" + ); + NBMetricGauge swapUsedGauge = create().gauge( + "swap_used", + reader::getSwapUsedkB, + MetricCategory.Internals, + "" + ); + } + + +}