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;
|
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,
|
||||||
|
@ -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