Skip to content
Closed
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@ dependencies {
implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: "${log4jVersion}"
implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: "${log4jVersion}"


testImplementation group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.0'
testImplementation group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.0'
testImplementation group: 'org.mockito', name: 'mockito-core', version: '2.23.0'
Expand Down Expand Up @@ -124,6 +123,11 @@ configurations.each {

compileJava {
dependsOn spotlessApply
JavaVersion targetVersion = JavaVersion.toVersion(targetCompatibility);
if (targetVersion.isJava9Compatible()) {
options.compilerArgs += ["--add-exports", "jdk.attach/sun.tools.attach=ALL-UNNAMED"]
options.compilerArgs += ["--add-exports", "jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED"]
}
}

test {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.performanceanalyzer.commons;


import org.opensearch.performanceanalyzer.commons.config.ConfigStatus;
import org.opensearch.performanceanalyzer.commons.metrics_generator.OSMetricsGenerator;
import org.opensearch.performanceanalyzer.commons.metrics_generator.linux.LinuxOSMetricsGenerator;

public class OSMetricsGeneratorFactory {

private static final String OS_TYPE = System.getProperty("os.name");

public static OSMetricsGenerator getInstance() {

if (isLinux()) {
return LinuxOSMetricsGenerator.getInstance();
} else {
ConfigStatus.INSTANCE.setConfigurationInvalid();
}

return null;
}

private static boolean isLinux() {
return OS_TYPE.toLowerCase().contains("linux");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.performanceanalyzer.commons.collectors;


import java.util.Map;
import org.opensearch.performanceanalyzer.commons.OSMetricsGeneratorFactory;
import org.opensearch.performanceanalyzer.commons.jvm.ThreadList;
import org.opensearch.performanceanalyzer.commons.metrics.AllMetrics.OSMetrics;
import org.opensearch.performanceanalyzer.commons.metrics.MetricsConfiguration;
import org.opensearch.performanceanalyzer.commons.metrics.MetricsProcessor;
import org.opensearch.performanceanalyzer.commons.metrics.PerformanceAnalyzerMetrics;
import org.opensearch.performanceanalyzer.commons.metrics_generator.CPUPagingActivityGenerator;
import org.opensearch.performanceanalyzer.commons.metrics_generator.DiskIOMetricsGenerator;
import org.opensearch.performanceanalyzer.commons.metrics_generator.OSMetricsGenerator;
import org.opensearch.performanceanalyzer.commons.metrics_generator.SchedMetricsGenerator;

public class OSMetricsCollector extends PerformanceAnalyzerMetricsCollector
implements MetricsProcessor {
public static final int SAMPLING_TIME_INTERVAL =
MetricsConfiguration.CONFIG_MAP.get(ThreadList.class).samplingInterval;
private static final int KEYS_PATH_LENGTH = 1;
private StringBuilder value;
private OSMetricsGenerator osMetricsGenerator;

public enum MetaDataFields {
threadName
}

public OSMetricsCollector() {
super(SAMPLING_TIME_INTERVAL, "OSMetrics");
value = new StringBuilder();
osMetricsGenerator = OSMetricsGeneratorFactory.getInstance();
}

@Override
public void collectMetrics(long startTime) {
CPUPagingActivityGenerator threadCPUPagingActivityGenerator =
osMetricsGenerator.getPagingActivityGenerator();
threadCPUPagingActivityGenerator.addSample();

SchedMetricsGenerator schedMetricsGenerator = osMetricsGenerator.getSchedMetricsGenerator();
schedMetricsGenerator.addSample();

Map<Long, ThreadList.ThreadState> threadStates =
ThreadList.getNativeTidMap(getThreadContentionMonitoringEnabled());

DiskIOMetricsGenerator diskIOMetricsGenerator =
osMetricsGenerator.getDiskIOMetricsGenerator();
diskIOMetricsGenerator.addSample();

for (String threadId : osMetricsGenerator.getAllThreadIds()) {
value.setLength(0);
value.append(PerformanceAnalyzerMetrics.getCurrentTimeMetric())
.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.CPU_UTILIZATION)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(threadCPUPagingActivityGenerator.getCPUUtilization(threadId));

if (threadCPUPagingActivityGenerator.hasPagingActivity(threadId)) {
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.PAGING_MAJ_FLT_RATE)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(threadCPUPagingActivityGenerator.getMajorFault(threadId));
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.PAGING_MIN_FLT_RATE)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(threadCPUPagingActivityGenerator.getMinorFault(threadId));
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.PAGING_RSS)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(threadCPUPagingActivityGenerator.getResidentSetSize(threadId));
}

if (schedMetricsGenerator.hasSchedMetrics(threadId)) {
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.SCHED_RUNTIME)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(schedMetricsGenerator.getAvgRuntime(threadId));
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.SCHED_WAITTIME)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(schedMetricsGenerator.getAvgWaittime(threadId));
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.SCHED_CTX_RATE)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(schedMetricsGenerator.getContextSwitchRate(threadId));
}

ThreadList.ThreadState threadState = threadStates.get(Long.valueOf(threadId));
if (threadState != null) {
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.HEAP_ALLOC_RATE)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(threadState.heapAllocRate);
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(MetaDataFields.threadName.toString())
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(threadState.threadName);
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.THREAD_BLOCKED_TIME)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(threadState.avgBlockedTime);
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.THREAD_BLOCKED_EVENT)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(threadState.blockedCount);
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.THREAD_WAITED_TIME)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(threadState.avgWaitedTime);
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.THREAD_WAITED_EVENT)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(threadState.waitedCount);
}

if (diskIOMetricsGenerator.hasDiskIOMetrics(threadId)) {
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.IO_READ_THROUGHPUT)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(diskIOMetricsGenerator.getAvgReadThroughputBps(threadId));
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.IO_WRITE_THROUGHPUT)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(diskIOMetricsGenerator.getAvgWriteThroughputBps(threadId));
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.IO_TOT_THROUGHPUT)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(diskIOMetricsGenerator.getAvgTotalThroughputBps(threadId));
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.IO_READ_SYSCALL_RATE)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(diskIOMetricsGenerator.getAvgReadSyscallRate(threadId));
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.IO_WRITE_SYSCALL_RATE)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(diskIOMetricsGenerator.getAvgWriteSyscallRate(threadId));
value.append(PerformanceAnalyzerMetrics.sMetricNewLineDelimitor)
.append(OSMetrics.IO_TOTAL_SYSCALL_RATE)
.append(PerformanceAnalyzerMetrics.sKeyValueDelimitor)
.append(diskIOMetricsGenerator.getAvgTotalSyscallRate(threadId));
}

saveMetricValues(value.toString(), startTime, threadId);
}
}

@Override
public String getMetricsPath(long startTime, String... keysPath) {
// throw exception if keys.length is not equal to 1...which is thread ID
if (keysPath.length != KEYS_PATH_LENGTH) {
throw new RuntimeException("keys length should be " + KEYS_PATH_LENGTH);
}
return PerformanceAnalyzerMetrics.generatePath(
startTime,
PerformanceAnalyzerMetrics.sThreadsPath,
keysPath[0],
PerformanceAnalyzerMetrics.sOSPath);
}
}
Loading