mirror of
https://github.com/nosqlbench/nosqlbench.git
synced 2025-02-25 18:55:28 -06:00
factor client metrics checker into component attachment
This commit is contained in:
parent
cbc9e5484f
commit
0c77a2fe9e
@ -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<List<Cmd>, ExecutionResult>, NBTokenWords {
|
||||
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<>();
|
||||
|
||||
@ -64,31 +63,11 @@ public class NBSession extends NBBaseComponent implements Function<List<Cmd>, 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:
|
||||
* <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) {
|
||||
|
||||
// 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) {
|
||||
return containers.computeIfAbsent(
|
||||
name,
|
||||
|
@ -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,
|
||||
""
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user