factor client metrics checker into component attachment

This commit is contained in:
Jonathan Shook 2023-12-20 17:16:31 -06:00
parent cbc9e5484f
commit 0c77a2fe9e
2 changed files with 255 additions and 96 deletions

View File

@ -16,7 +16,6 @@
package io.nosqlbench.engine.core.lifecycle.session; 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.activityimpl.ActivityDef;
import io.nosqlbench.nb.api.engine.metrics.instruments.NBFunctionGauge; import io.nosqlbench.nb.api.engine.metrics.instruments.NBFunctionGauge;
import io.nosqlbench.nb.api.engine.metrics.instruments.NBMetricGauge; 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<List<Cmd>, ExecutionResult>, NBTokenWords { public class NBSession extends NBBaseComponent implements Function<List<Cmd>, ExecutionResult>, NBTokenWords {
private final static Logger logger = LogManager.getLogger(NBSession.class); private final static Logger logger = LogManager.getLogger(NBSession.class);
private final ClientSystemMetricChecker clientMetricChecker; // private final ClientSystemMetricChecker clientMetricChecker;
private final Map<String, NBBufferedContainer> containers = new ConcurrentHashMap<>(); private final Map<String, NBBufferedContainer> containers = new ConcurrentHashMap<>();
@ -64,31 +63,11 @@ public class NBSession extends NBBaseComponent implements Function<List<Cmd>, Ex
labelContext.getLabels() labelContext.getLabels()
.and("session", sessionName) .and("session", sessionName)
); );
new NBSessionSafetyMetrics(this);
this.clientMetricChecker = new ClientSystemMetricChecker(this, NBLabels.forKV(), 10);
registerLoadAvgMetrics();
registerMemInfoMetrics();
// registerDiskStatsMetrics();
registerNetworkInterfaceMetrics();
registerCpuStatMetrics();
clientMetricChecker.start();
bufferOrphanedMetrics = true; bufferOrphanedMetrics = true;
} }
/**
* Notes on scenario names:
* <UL>
* <LI>If none are provided, then all cmds are implicitly allocated to the "default" scenario.</LI>
* <LI>If the name "default" is provided directly, then this is considered an error.</LI>
* <LI>Otherwise, the most recently set scenario name is the one in which all following commands are run.</LI>
* <LI></LI>
* </UL>
*
* @param cmds
* the function argument
* @return
*/
public ExecutionResult apply(List<Cmd> cmds) { public ExecutionResult apply(List<Cmd> cmds) {
// TODO: add container closing command // TODO: add container closing command
@ -124,79 +103,6 @@ public class NBSession extends NBBaseComponent implements Function<List<Cmd>, 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) { private NBBufferedContainer getContext(String name) {
return containers.computeIfAbsent( return containers.computeIfAbsent(
name, name,

View File

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