diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/collectors/PerformanceAnalyzerMetricsCollector.java b/src/main/java/org/opensearch/performanceanalyzer/commons/collectors/PerformanceAnalyzerMetricsCollector.java index 9809827..131d393 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/collectors/PerformanceAnalyzerMetricsCollector.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/collectors/PerformanceAnalyzerMetricsCollector.java @@ -10,6 +10,9 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.opensearch.performanceanalyzer.commons.stats.CommonStats; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; +import org.opensearch.performanceanalyzer.commons.stats.metrics.StatExceptionCode; import org.opensearch.performanceanalyzer.commons.util.Util; public abstract class PerformanceAnalyzerMetricsCollector implements Runnable { @@ -30,14 +33,24 @@ public enum State { LogManager.getLogger(PerformanceAnalyzerMetricsCollector.class); private int timeInterval; private long startTime; + private String collectorName; + private MeasurementSet statLatencyMetric; + private StatExceptionCode errorMetric; protected StringBuilder value; + protected State state; private boolean threadContentionMonitoringEnabled; - protected PerformanceAnalyzerMetricsCollector(int timeInterval, String collectorName) { + protected PerformanceAnalyzerMetricsCollector( + int timeInterval, + String collectorName, + MeasurementSet statLatencyMetric, + StatExceptionCode errorMetric) { this.timeInterval = timeInterval; this.collectorName = collectorName; + this.statLatencyMetric = statLatencyMetric; + this.errorMetric = errorMetric; this.value = new StringBuilder(); this.state = State.HEALTHY; } @@ -65,17 +78,16 @@ public void setStartTime(long startTime) { public void run() { try { + long mCurrT = System.currentTimeMillis(); Util.invokePrivileged(() -> collectMetrics(startTime)); + CommonStats.WRITER_METRICS_AGGREGATOR.updateStat( + statLatencyMetric, System.currentTimeMillis() - mCurrT); } catch (Exception ex) { - // - should not be any...but in case, absorbing here - // - logging...we shouldn't be doing as it will slow down; as well as fill up the log. - // Need to - // find a way to catch these LOG.error( - "Error In Collect Metrics: {} with ExceptionCode: {}", - () -> ex.toString(), - () -> StatExceptionCode.OTHER_COLLECTION_ERROR.toString()); - StatsCollector.instance().logException(StatExceptionCode.OTHER_COLLECTION_ERROR); + "[{}] Error In Collect Metrics: {}", + () -> getCollectorName(), + () -> ex.toString()); + StatsCollector.instance().logException(errorMetric); } finally { bInProgress.set(false); } diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/collectors/StatExceptionCode.java b/src/main/java/org/opensearch/performanceanalyzer/commons/collectors/StatExceptionCode.java deleted file mode 100644 index 9b4473e..0000000 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/collectors/StatExceptionCode.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.opensearch.performanceanalyzer.commons.collectors; - -public enum StatExceptionCode { - TOTAL_ERROR("TotalError"), - - // Tracks the number of VM attach/dataDump or detach failures. - JVM_ATTACH_ERROR("JvmAttachErrror"), - - // This error is thrown if the java_pid file is missing. - JVM_ATTACH_ERROR_JAVA_PID_FILE_MISSING("JvmAttachErrorJavaPidFileMissing"), - - // The lock could not be acquired within the timeout. - JVM_ATTACH_LOCK_ACQUISITION_FAILED("JvmAttachLockAcquisitionFailed"), - - // ThreadState could not be found for an OpenSearch thread in the critical OpenSearch path. - NO_THREAD_STATE_INFO("NoThreadStateInfo"), - - // This metric indicates that we successfully completed a thread-dump. Likewise, - // an omission of this should indicate that the thread taking the dump got stuck. - JVM_THREAD_DUMP_SUCCESSFUL("JvmThreadDumpSuccessful"), - COLLECTORS_MUTED("CollectorsMutedCount"), - CLUSTER_MANAGER_METRICS_ERROR("ClusterManagerMetricsError"), - DISK_METRICS_ERROR("DiskMetricsError"), - THREAD_IO_ERROR("ThreadIOError"), - SCHEMA_PARSER_ERROR("SchemaParserError"), - JSON_PARSER_ERROR("JsonParserError"), - NETWORK_COLLECTION_ERROR("NetworkCollectionError"), - NODESTATS_COLLECTION_ERROR("NodeStatsCollectionError"), - OTHER_COLLECTION_ERROR("OtherCollectionError"), - REQUEST_ERROR("RequestError"), - REQUEST_REMOTE_ERROR("RequestRemoteError"), - READER_PARSER_ERROR("ReaderParserError"), - READER_RESTART_PROCESSING("ReaderRestartProcessing"), - RCA_SCHEDULER_RESTART_PROCESSING("RCASchedulerRestartProcessing"), - RCA_NETWORK_ERROR("RcaNetworkError"), - RCA_VERTEX_RX_BUFFER_FULL_ERROR("RcaVertexRxBufferFullError"), - RCA_NETWORK_THREADPOOL_QUEUE_FULL_ERROR("RcaNetworkThreadpoolQueueFullError"), - RCA_SCHEDULER_STOPPED_ERROR("RcaSchedulerStoppedError"), - OPENSEARCH_REQUEST_INTERCEPTOR_ERROR("OpenSearchRequestInterceptorError"), - MISCONFIGURED_OLD_GEN_RCA_HEAP_MAX_MISSING("MisconfiguredOldGenRcaHeapMaxMissing"), - MISCONFIGURED_OLD_GEN_RCA_HEAP_USED_MISSING("MisconfiguredOldGenRcaHeapUsedMissing"), - MISCONFIGURED_OLD_GEN_RCA_GC_EVENTS_MISSING("MisconfiguredOldGenRcaGcEventsMissing"), - TOTAL_MEM_READ_ERROR("TotalMemReadError"); - - private final String value; - - StatExceptionCode(String value) { - this.value = value; - } - - @Override - public String toString() { - return value; - } -} diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/collectors/StatsCollector.java b/src/main/java/org/opensearch/performanceanalyzer/commons/collectors/StatsCollector.java index 43b34c4..8a75b6d 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/collectors/StatsCollector.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/collectors/StatsCollector.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.Properties; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; @@ -25,28 +26,33 @@ import org.opensearch.performanceanalyzer.commons.metrics.MetricsConfiguration; import org.opensearch.performanceanalyzer.commons.rca.Version; import org.opensearch.performanceanalyzer.commons.stats.CommonStats; +import org.opensearch.performanceanalyzer.commons.stats.metrics.StatExceptionCode; +import org.opensearch.performanceanalyzer.commons.stats.metrics.WriterMetrics; public class StatsCollector extends PerformanceAnalyzerMetricsCollector { + private static final Logger STATS_LOGGER = LogManager.getLogger("stats_log"); + private static final Logger GENERAL_LOG = LogManager.getLogger(StatsCollector.class); public static final String COLLECTOR_NAME = "StatsCollector"; + public static String STATS_TYPE = "plugin-stats-metadata"; + private static final String LOG_ENTRY_INIT = "------------------------------------------------------------------------"; private static final String LOG_ENTRY_END = "EOE"; private static final String LOG_LINE_BREAK = "\n"; private static final double MILLISECONDS_TO_SECONDS_DIVISOR = 1000D; - private static final Logger STATS_LOGGER = LogManager.getLogger("stats_log"); - private static final Logger GENERAL_LOG = LogManager.getLogger(StatsCollector.class); private static StatsCollector statsCollector = null; - public static String STATS_TYPE = "plugin-stats-metadata"; - private final Map metadata; private Map counters = new ConcurrentHashMap<>(); + private final List defaultExceptionCodes = new Vector<>(); private Date objectCreationTime = new Date(); - private List defaultExceptionCodes = new Vector<>(); - public StatsCollector(String name, int samplingIntervalMillis, Map metadata) { - super(samplingIntervalMillis, name); + super( + samplingIntervalMillis, + name, + WriterMetrics.STAT_COLLECTOR_EXECUTION_TIME, + StatExceptionCode.STATS_COLLECTOR_ERROR); this.metadata = metadata; addRcaVersionMetadata(this.metadata); defaultExceptionCodes.add(StatExceptionCode.TOTAL_ERROR); @@ -84,6 +90,11 @@ public void collectMetrics(long startTime) { currentCounters.putIfAbsent(statExceptionCode.toString(), new AtomicInteger(0)); } + /** + * Each run StatsCollector collectMetric(scheduled every 60s) emits 2 entries. The first + * entry via {@link writeStats} writes counters and metrics, and the second {@link + * collectAndWriteRcaStats} writes timers and metrics. + */ writeStats( metadata, currentCounters, @@ -104,7 +115,7 @@ private void collectAndWriteRcaStats() { formatter.getAllMetrics()) { if (!statsReturn.isEmpty()) { logStatsRecord( - statsReturn.getCounters(), + counters = null, statsReturn.getStatsdata(), statsReturn.getLatencies(), statsReturn.getStartTimeMillis(), @@ -126,11 +137,11 @@ public void logException(StatExceptionCode statExceptionCode) { public void logStatsRecord( Map counters, - Map statsdata, + Map statsData, Map latencies, long startTimeMillis, long endTimeMillis) { - writeStats(metadata, counters, statsdata, latencies, startTimeMillis, endTimeMillis); + writeStats(metadata, counters, statsData, latencies, startTimeMillis, endTimeMillis); } private void addRcaVersionMetadata(Map metadata) { @@ -146,7 +157,6 @@ private static Map loadMetadata(String fileLocation) { try (InputStream input = new FileInputStream( PluginSettings.instance().getConfigFolderPath() + fileLocation); ) { - // load properties file props.load(input); } catch (Exception ex) { GENERAL_LOG.error( @@ -185,27 +195,22 @@ private static void writeStats( Map latencies, long startTimeMillis, long endTimeMillis) { + StringBuilder builder = new StringBuilder(); builder.append(LOG_ENTRY_INIT + LOG_LINE_BREAK); logValues(metadata, builder); + // Stats Data logValues(statsdata, builder); logTimeMetrics(startTimeMillis, endTimeMillis, builder); - Map tmpLatencies; - - if (latencies == null) { - tmpLatencies = new ConcurrentHashMap<>(); - } else { - tmpLatencies = new ConcurrentHashMap<>(latencies); - } - - tmpLatencies.put("total-time", (double) endTimeMillis - startTimeMillis); - addEntry("Timing", getLatencyMetrics(tmpLatencies), builder); - + // Timers and Counters + Optional.ofNullable(latencies) + .ifPresent( + e -> latencies.put("total-time", (double) endTimeMillis - startTimeMillis)); + addEntry("Timing", getLatencyMetrics(latencies), builder); addEntry("Counters", getCountersString(counters), builder); - builder.append(LOG_ENTRY_END); // + LOG_LINE_BREAK); - /* Setting this log level to debug (and not info) to avoid logging noisy plugin stats - logs to the console and opensearch.log file */ + + builder.append(LOG_ENTRY_END); STATS_LOGGER.debug(builder.toString()); } diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/event_process/EventLogFileHandler.java b/src/main/java/org/opensearch/performanceanalyzer/commons/event_process/EventLogFileHandler.java index 7e0bb88..17ea2b1 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/event_process/EventLogFileHandler.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/event_process/EventLogFileHandler.java @@ -22,10 +22,11 @@ import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.opensearch.performanceanalyzer.commons.metrics.ExceptionsAndErrors; +import org.opensearch.performanceanalyzer.commons.collectors.StatsCollector; import org.opensearch.performanceanalyzer.commons.metrics.PerformanceAnalyzerMetrics; -import org.opensearch.performanceanalyzer.commons.metrics.WriterMetrics; import org.opensearch.performanceanalyzer.commons.stats.CommonStats; +import org.opensearch.performanceanalyzer.commons.stats.metrics.StatExceptionCode; +import org.opensearch.performanceanalyzer.commons.stats.metrics.WriterMetrics; import org.opensearch.performanceanalyzer.commons.util.Util; public class EventLogFileHandler { @@ -109,8 +110,7 @@ public void renameFromTmpWithPrivilege(long epoch) { LOG.error("Error moving file {} to {}.", tmpPath.toString(), path.toString(), e); } } else { - CommonStats.ERRORS_AND_EXCEPTIONS_AGGREGATOR.updateStat( - ExceptionsAndErrors.WRITER_FILE_CREATION_SKIPPED, "", 1); + StatsCollector.instance().logException(StatExceptionCode.WRITER_FILE_CREATION_SKIPPED); } } @@ -190,9 +190,9 @@ public void deleteFiles(List filesToDelete) { } long duration = System.currentTimeMillis() - startTime; CommonStats.WRITER_METRICS_AGGREGATOR.updateStat( - WriterMetrics.EVENT_LOG_FILES_DELETION_TIME, "", duration); + WriterMetrics.EVENT_LOG_FILES_DELETION_TIME, duration); CommonStats.WRITER_METRICS_AGGREGATOR.updateStat( - WriterMetrics.EVENT_LOG_FILES_DELETED, "", filesDeletedCount); + WriterMetrics.EVENT_LOG_FILES_DELETED, filesDeletedCount); LOG.debug("'{}' Old writer files cleaned up.", filesDeletedCount); } diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/formatter/StatsCollectorFormatter.java b/src/main/java/org/opensearch/performanceanalyzer/commons/formatter/StatsCollectorFormatter.java index ff7f530..e2a6328 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/formatter/StatsCollectorFormatter.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/formatter/StatsCollectorFormatter.java @@ -5,35 +5,53 @@ package org.opensearch.performanceanalyzer.commons.formatter; +import static org.opensearch.performanceanalyzer.commons.stats.metrics.StatsType.LATENCIES; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSet; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; +import java.util.Objects; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.format.Formatter; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; public class StatsCollectorFormatter implements Formatter { - StringBuilder formatted; - String sep = ""; + private StringBuilder metricsBuilder; + private Map latencyMap = new HashMap<>(); + + private String sep = ""; long startTime; long endTime; public StatsCollectorFormatter() { - formatted = new StringBuilder(); + metricsBuilder = new StringBuilder(); + latencyMap.clear(); } private void format( MeasurementSet measurementSet, Statistics aggregationType, String name, Number value) { - formatted.append(sep); - formatted.append(measurementSet.getName()).append("=").append(value); + if (Objects.equals(measurementSet.getStatsType(), LATENCIES)) { + latencyMap.put(measurementSet.getName(), value.doubleValue()); + } else { + formatStat(metricsBuilder, measurementSet, aggregationType, name, value); + } + } + + private void formatStat( + StringBuilder metricsBuilder, + MeasurementSet measurementSet, + Statistics aggregationType, + String name, + Number value) { + metricsBuilder.append(sep); + metricsBuilder.append(measurementSet.getName()).append("=").append(value); if (!measurementSet.getUnit().isEmpty()) { - formatted.append(" ").append(measurementSet.getUnit()); + metricsBuilder.append(" ").append(measurementSet.getUnit()); } - formatted.append(" ").append("aggr|").append(aggregationType); + metricsBuilder.append(" ").append("aggr|").append(aggregationType); if (!name.isEmpty()) { - formatted.append(" ").append("key|").append(name); + metricsBuilder.append(" ").append("key|").append(name); } sep = ","; } @@ -60,31 +78,26 @@ public List getAllMetrics() { List list = new ArrayList<>(); StatsCollectorReturn statsCollectorReturn = new StatsCollectorReturn(this.startTime, this.endTime); - statsCollectorReturn.statsdata.put("Metrics", formatted.toString()); - list.add(statsCollectorReturn); + statsCollectorReturn.statsdata.put("Metrics", metricsBuilder.toString()); + statsCollectorReturn.latencies = new HashMap<>(latencyMap); + list.add(statsCollectorReturn); return list; } public static class StatsCollectorReturn { - private Map counters; private Map statsdata; private Map latencies; private long startTimeMillis; private long endTimeMillis; public StatsCollectorReturn(long startTimeMillis, long endTimeMillis) { - counters = new HashMap<>(); statsdata = new HashMap<>(); latencies = new HashMap<>(); this.startTimeMillis = startTimeMillis; this.endTimeMillis = endTimeMillis; } - public Map getCounters() { - return counters; - } - public Map getStatsdata() { return statsdata; } @@ -102,7 +115,7 @@ public long getEndTimeMillis() { } public boolean isEmpty() { - return counters.isEmpty() && statsdata.isEmpty() && latencies.isEmpty(); + return statsdata.isEmpty() && latencies.isEmpty(); } } } diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/metrics/ExceptionsAndErrors.java b/src/main/java/org/opensearch/performanceanalyzer/commons/metrics/ExceptionsAndErrors.java deleted file mode 100644 index 3dd6a54..0000000 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/metrics/ExceptionsAndErrors.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.opensearch.performanceanalyzer.commons.metrics; - - -import java.util.Collections; -import java.util.List; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; - -public enum ExceptionsAndErrors implements MeasurementSet { - INVALID_CONFIG_RCA_AGENT_STOPPED("InvalidConfigRCAAgentStopped"), - RCA_FRAMEWORK_CRASH("RcaFrameworkCrash"), - CONFIG_DIR_NOT_FOUND("ConfigDirectoryNotFound"), - CONFIG_OVERRIDES_SER_FAILED("ConfigOverridesSerFailed"), - WRITE_UPDATED_RCA_CONF_ERROR("WriteUpdatedRcaConfError"), - BATCH_METRICS_CONFIG_ERROR("BatchMetricsConfigError"), - MUTE_ERROR("MuteError"), - JSON_PARSER_ERROR("JsonParserError", "namedCount", Statistics.NAMED_COUNTERS), - - /** - * Aggregate metrics across RCA Graph nodes tracking failure in various staged of RCA Graph - * Execution. - */ - /** Exception thrown in operate() method, implemented by each RCA Graph node */ - EXCEPTION_IN_OPERATE("ExceptionInOperate", "namedCount", Statistics.NAMED_COUNTERS), - - /** Exception thrown in compute() method in publisher. */ - EXCEPTION_IN_COMPUTE("ExceptionInCompute", "namedCount", Statistics.NAMED_COUNTERS), - - /** When calling the MetricsDB API throws an exception. */ - EXCEPTION_IN_GATHER("ExceptionInGather", "namedCount", Statistics.NAMED_COUNTERS), - - /** Exception thrown when persisting action or flowunit when unable to write to DB */ - EXCEPTION_IN_PERSIST("ExceptionInPersist", "namedCount", Statistics.NAMED_COUNTERS), - - /** Metrics tracking PA Plugin level: 1. Errors 2. Exceptions */ - /** Tracks stale metrics - metrics to be collected is behind current bucket */ - STALE_METRICS("StaleMetrics"), - - /** Tracks the number of VM attach/dataDump or detach failures. */ - JVM_ATTACH_ERROR("JvmAttachErrror"), - - /** java_pid file is missing. */ - JVM_ATTACH_ERROR_JAVA_PID_FILE_MISSING("JvmAttachErrorJavaPidFileMissing"), - - /** Lock could not be acquired within the timeout. */ - JVM_ATTACH_LOCK_ACQUISITION_FAILED("JvmAttachLockAcquisitionFailed"), - - /** ThreadState could not be found for an OpenSearch thread in the critical OpenSearch path. */ - NO_THREAD_STATE_INFO("NoThreadStateInfo"), - - /** Thread ID is no loner exists */ - JVM_THREAD_ID_NO_LONGER_EXISTS("JVMThreadIdNoLongerExists"), - - /** This metric indicates faiure in intercepting opensearch requests at transport channel */ - OPENSEARCH_REQUEST_INTERCEPTOR_ERROR("OpenSearchRequestInterceptorError"), - - /** Metrics tracking RCA Agent level: 1. Errors 2. Exceptions */ - /** This metric indicates metric entry insertion to event log queue failed */ - METRICS_WRITE_ERROR("MetricsWriteError", "namedCount", Statistics.NAMED_COUNTERS), - - /** This metric indicates faiure in cleaning up the event log files */ - METRICS_REMOVE_ERROR("MetricsRemoveError", "namedCount", Statistics.NAMED_COUNTERS), - - /** This metric indicates faiure in cleaning up the event log files */ - METRICS_REMOVE_FAILURE("MetricsRemoveFailure", "namedCount", Statistics.NAMED_COUNTERS), - - /** This metric indicates that the writer file creation was skipped. */ - WRITER_FILE_CREATION_SKIPPED( - "WriterFileCreationSkipped", "namedCount", Statistics.NAMED_COUNTERS), - - /** This metric indicates that error occurred while closing grpc channels. */ - GRPC_CHANNEL_CLOSURE_ERROR("GrpcChannelClosureError", "namedCount", Statistics.NAMED_COUNTERS), - - /** This metric indicates that error occurred while closing grpc server. */ - GRPC_SERVER_CLOSURE_ERROR("GrpcServerClosureError", "namedCount", Statistics.NAMED_COUNTERS), - - /** This metric indicates that error occurred while closing metrics db. */ - METRICS_DB_CLOSURE_ERROR("MetricsDbClosureError", "namedCount", Statistics.NAMED_COUNTERS), - - /** When the reader encounters errors accessing metricsdb files. */ - READER_METRICSDB_ACCESS_ERRORS("ReaderMetricsdbAccessError"), - - /** This metric indicates that error occurred while closing database connection. */ - IN_MEMORY_DATABASE_CONN_CLOSURE_ERROR( - "InMemoryDatabaseConnClosureError", "namedCount", Statistics.NAMED_COUNTERS), - - /** Batch Metric relevant errors */ - BATCH_METRICS_HTTP_CLIENT_ERROR("BatchMetricsHttpClientError"), - BATCH_METRICS_HTTP_HOST_ERROR("BatchMetricsHttpHostError"), - BATCH_METRICS_EXCEEDED_MAX_DATAPOINTS("ExceededBatchMetricsMaxDatapoints"), - - /** Below track Collector specific Errors. */ - THREADPOOL_METRICS_COLLECTOR_ERROR("ThreadPoolMetricsCollectorError"), - SHARD_STATE_COLLECTOR_ERROR("ShardStateCollectorError"), - ADMISSION_CONTROL_COLLECTOR_ERROR("AdmissionControlCollectorError"), - CIRCUIT_BREAKER_COLLECTOR_ERROR("CircuitBreakerCollectorError"), - CLUSTER_MANAGER_METRICS_ERROR("ClusterManagerMetricsError"), - CLUSTER_MANAGER_NODE_NOT_UP("ClusterManagerNodeNotUp"), - CLUSTER_MANAGER_THROTTLING_COLLECTOR_ERROR("ClusterManagerThrottlingMetricsCollectorError"), - FAULT_DETECTION_COLLECTOR_ERROR("FaultDetectionMetricsCollectorError"), - CLUSTER_APPLIER_SERVICE_STATS_COLLECTOR_ERROR("ClusterApplierServiceStatsCollectorError"), - ELECTION_TERM_COLLECTOR_ERROR("ElectionTermCollectorError"), - SHARD_INDEXING_PRESSURE_COLLECTOR_ERROR("ShardIndexingPressureMetricsCollectorError"), - NODESTATS_COLLECTION_ERROR("NodeStatsCollectionError"); - - /** What we want to appear as the metric name. */ - private String name; - - /** - * The unit the measurement is in. This is not used for the statistics calculations but as an - * information that will be dumped with the metrics. - */ - private String unit; - - /** - * Multiple statistics can be collected for each measurement like MAX, MIN and MEAN. This is a - * collection of one or more such statistics. - */ - private List statsList; - - ExceptionsAndErrors(String name) { - this.name = name; - this.unit = "count"; - this.statsList = Collections.singletonList(Statistics.COUNT); - } - - ExceptionsAndErrors(String name, String unit, Statistics stats) { - this.name = name; - this.unit = unit; - this.statsList = Collections.singletonList(stats); - } - - public String toString() { - return new StringBuilder(name).append("-").append(unit).toString(); - } - - @Override - public List getStatsList() { - return statsList; - } - - @Override - public String getName() { - return name; - } - - @Override - public String getUnit() { - return unit; - } -} diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/metrics/PerformanceAnalyzerMetrics.java b/src/main/java/org/opensearch/performanceanalyzer/commons/metrics/PerformanceAnalyzerMetrics.java index ad85cca..edd9be0 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/metrics/PerformanceAnalyzerMetrics.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/metrics/PerformanceAnalyzerMetrics.java @@ -16,9 +16,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.message.ParameterizedMessage; +import org.opensearch.performanceanalyzer.commons.collectors.StatsCollector; import org.opensearch.performanceanalyzer.commons.config.PluginSettings; import org.opensearch.performanceanalyzer.commons.event_process.Event; -import org.opensearch.performanceanalyzer.commons.stats.CommonStats; +import org.opensearch.performanceanalyzer.commons.stats.metrics.StatExceptionCode; @SuppressWarnings("checkstyle:constantname") public class PerformanceAnalyzerMetrics { @@ -118,9 +119,8 @@ public static void addMetricEntry(StringBuilder value, String metricKey, long me private static void emitMetric(BlockingQueue q, Event entry) { if (!q.offer(entry)) { - CommonStats.ERRORS_AND_EXCEPTIONS_AGGREGATOR.updateStat( - ExceptionsAndErrors.METRICS_WRITE_ERROR, "", 1); LOG.debug("Could not enter metric {}", entry); + StatsCollector.instance().logException(StatExceptionCode.METRICS_WRITE_ERROR); } } @@ -175,13 +175,10 @@ public static void removeMetrics(File keyPathFile) { } try { if (!keyPathFile.delete()) { - CommonStats.ERRORS_AND_EXCEPTIONS_AGGREGATOR.updateStat( - ExceptionsAndErrors.METRICS_REMOVE_ERROR, "", 1); LOG.debug("Purge Could not delete file {}", keyPathFile); + StatsCollector.instance().logException(StatExceptionCode.METRICS_REMOVE_ERROR); } } catch (Exception ex) { - CommonStats.ERRORS_AND_EXCEPTIONS_AGGREGATOR.updateStat( - ExceptionsAndErrors.METRICS_REMOVE_ERROR, "", 1); LOG.debug( (Supplier) () -> @@ -189,8 +186,9 @@ public static void removeMetrics(File keyPathFile) { "Error in deleting file: {} for keyPath:{} with ExceptionCode: {}", ex.toString(), keyPathFile.getAbsolutePath(), - ExceptionsAndErrors.METRICS_REMOVE_ERROR.toString()), + StatExceptionCode.METRICS_REMOVE_ERROR.toString()), ex); + StatsCollector.instance().logException(StatExceptionCode.METRICS_REMOVE_ERROR); } } diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/CommonStats.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/CommonStats.java index 1d5ee72..f5e0f7b 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/CommonStats.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/CommonStats.java @@ -7,10 +7,12 @@ import java.util.Arrays; -import org.opensearch.performanceanalyzer.commons.metrics.WriterMetrics; +import org.opensearch.performanceanalyzer.commons.stats.collectors.SampleAggregator; +import org.opensearch.performanceanalyzer.commons.stats.metrics.WriterMetrics; -/* Catalog Operational Metrics class that is to be populated upon PerformanceAnalyzerApp -class load and to be used by both PA and PA-RCA. +/** + * Catalog Service Metrics class that is to be populated upon PerformanceAnalyzerApp class load and + * to be used by both PA and RCA. */ public class CommonStats { public static SampleAggregator RCA_GRAPH_METRICS_AGGREGATOR, diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/README.md b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/README.md new file mode 100644 index 0000000..cca8bf7 --- /dev/null +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/README.md @@ -0,0 +1,74 @@ +# Health of the RCA framework + +The classes in this package help you gather measurements such as latency of executions and +occurrences of events, aggregate them and then report them. + +## Measurements + +Measurements are defined in the `stats/measurements`. They are the quantities we want to measure. +Each measurement has a statistic associated with it + +### Aggregates +They do some calculations on the raw numbers without just reporting them. The supported +statistics are in the `stats/eval/impl`. New aggregates can be written and plugged in without +much effort. Currently supported statistics are: + 1. Count + 1. Max + 1. Min + 1. Mean + 1. NamedCounter + 1. Sample + 1. Sum + +With max and min you can choose to send the value along with a key and then the statistic reports +the max or the min and also the key associated with it. The way we use it here is with +calculating the max and min of latencies for calling to operate on the graph nodes. We pass +the name of the graph as the key to it. Therefore, for each run we get not only the maximum +duration to execute `operate()` across all the nodes, but also the name of the node which +took the longest. +One other statistic that deserves special mention is the `NamedCounter` type. This also takes a +key with it, and finally it gives the count of occurrences for each key. This can be handy in +cases like exception reporting. Instead of enlisting all the exceptions in the Measurement +beforehand, we just have a few, and we can use the key to specify the cause of it and get a +grouping over the common causes for which the exceptions are thrown. + + +### Samples +These are reported as they were witnessed, the raw numbers. Some examples are the JVM free + space or the current number of live threads in the rca system. + +## Emitters + +Emitters emit certain measurements. They can be found in two places - scattered all around the +code to track execution latencies and the occurrence of errors or call to an expensive +OpenSearch API. The second place is the `stats/emitters`. These are fired at every certain +interval. + +## Aggregators + +They collect the emitted metrics and may compute statistics on them if specified in the +measurement definition. + +## Reporter +Reporter asks the Aggregators for the metrics collected so far and generate reports. This is +where the concept of formatters comes in. Reporting is currently handled by `StatsCollector` class. + +### Formatters + +Formatters are classes that implement the `Formatter` interface. This is the language the +reporter and aggregators talk in. When the reporter asks for the metrics, it sends across a +formatter with it. The aggregator uses the formatter to format the measurements. Formatters are +located in `stat/format`. The formatter that comes with the repo might not suit your needs and +therefore, you might choose to write another formatter that formats the measurements in +accordance with your metric backend. + +## Extending the measurements + +If you want to add more measurements, then you can add them to one of the three categories or + even create one of your own. The three categories we have, stores metrics related to: + 1. `RcaGraphMeasurements` : Measurements related to each run of the RCA graph. + 1. `RcaFrameworkMeasurements`: Measurements are concerned with the general workings of the + framework outside of the graph execution. + 1. `ExceptionsAndErrors`: To get a count of the errors and exceptions thrown by the system. + 1. `LivenessMeasurements`: These are the list of system samples that are collected periodically + rather than on occurrence of events. diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/StatsReporter.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/StatsReporter.java index 4416f7c..06987d1 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/StatsReporter.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/StatsReporter.java @@ -8,8 +8,9 @@ import com.google.common.annotations.VisibleForTesting; import java.util.List; -import org.opensearch.performanceanalyzer.commons.formatter.Formatter; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSet; +import org.opensearch.performanceanalyzer.commons.stats.collectors.SampleAggregator; +import org.opensearch.performanceanalyzer.commons.stats.format.Formatter; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; /** * This is meant to be the registry for all the stats that are collected by the Rca framework and diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/SampleAggregator.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/collectors/SampleAggregator.java similarity index 82% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/SampleAggregator.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/collectors/SampleAggregator.java index 441a1bf..ae44314 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/SampleAggregator.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/collectors/SampleAggregator.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats; +package org.opensearch.performanceanalyzer.commons.stats.collectors; import com.google.common.annotations.VisibleForTesting; @@ -18,30 +18,32 @@ import java.util.concurrent.atomic.AtomicLong; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.opensearch.performanceanalyzer.commons.formatter.Formatter; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSet; -import org.opensearch.performanceanalyzer.commons.stats.impl.Count; -import org.opensearch.performanceanalyzer.commons.stats.impl.IStatistic; -import org.opensearch.performanceanalyzer.commons.stats.impl.Max; -import org.opensearch.performanceanalyzer.commons.stats.impl.Mean; -import org.opensearch.performanceanalyzer.commons.stats.impl.Min; -import org.opensearch.performanceanalyzer.commons.stats.impl.NamedCounter; -import org.opensearch.performanceanalyzer.commons.stats.impl.Sample; -import org.opensearch.performanceanalyzer.commons.stats.impl.Sum; -import org.opensearch.performanceanalyzer.commons.stats.vals.Value; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.Count; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.IStatistic; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.Max; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.Mean; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.Min; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.NamedCounter; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.Sample; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.Sum; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.Value; +import org.opensearch.performanceanalyzer.commons.stats.format.Formatter; +import org.opensearch.performanceanalyzer.commons.stats.listeners.IListener; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; /** * This class is mainly to collect stats between runs of the RCA framework before we can write them * using the Stats Collector. * - *

This is suitable for cases where we want to calculate statistics before we report it, e.g. the + *

This is suitable for cases where we want to calculate statistics before we report it, e.g the * RCA graph evaluation. We want to know the long pole in the Graph node execution and how much it - * deviates from the mean, but we also don't want to report the time taken by each graph node. + * deviates from the mean but we also don't want to report the time taken by each graph node. */ public class SampleAggregator { private static final Logger LOG = LogManager.getLogger(SampleAggregator.class); - /** The set of measurements it's in charge of aggregating. */ + /** The set of measurements its in charge of aggregating. */ private final MeasurementSet[] recognizedSet; /** * The idea is to be able to calculate multiple statistics for each measurement. @@ -115,10 +117,14 @@ private void init() { this.statMap = ImmutableMap.copyOf(initializer); } + public void updateStat(MeasurementSet metric, V value) { + this.updateStat(metric, "", value); + } + /** * This is called whenever the framework hits a measurement of interest. This is thread safe. * - * @param metric Determined by the Enum MeasurementType + * @param metric Determined by the {@link MeasurementSet} * @param key multiple points in the code can emit the same measurement, say RCA1 and RCA2, both * will emit a measurement how long each of them took and then this metric will determine * which of the two took the longest(Max). @@ -182,13 +188,12 @@ public void fill(Formatter formatter) { formatter.setStartAndEndTime(startTimeMillis.get(), endTime); for (Map.Entry> entry : statMap.entrySet()) { - MeasurementSet measurement = entry.getKey(); for (IStatistic statValues : entry.getValue()) { if (!statValues.isEmpty()) { - Statistics stat = statValues.type(); + Statistics aggregationType = statValues.type(); Collection values = statValues.get(); for (Value value : values) { - value.format(formatter, measurement, stat); + value.format(formatter, entry.getKey(), aggregationType); } } } diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/emitters/ISampler.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/emitters/ISampler.java new file mode 100644 index 0000000..e0756d8 --- /dev/null +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/emitters/ISampler.java @@ -0,0 +1,13 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.performanceanalyzer.commons.stats.emitters; + + +import org.opensearch.performanceanalyzer.commons.stats.collectors.SampleAggregator; + +public interface ISampler { + void sample(SampleAggregator sampleCollector); +} diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/emitters/PeriodicSamplers.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/emitters/PeriodicSamplers.java new file mode 100644 index 0000000..49d2494 --- /dev/null +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/emitters/PeriodicSamplers.java @@ -0,0 +1,62 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.performanceanalyzer.commons.stats.emitters; + + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.util.List; +import java.util.concurrent.CancellationException; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.opensearch.performanceanalyzer.commons.stats.collectors.SampleAggregator; + +public class PeriodicSamplers implements Runnable { + private static final Logger LOG = LogManager.getLogger(PeriodicSamplers.class); + private final SampleAggregator aggregator; + private final List allSamplers; + private final ScheduledExecutorService executor; + + ScheduledFuture future; + + public PeriodicSamplers( + SampleAggregator aggregator, List samplers, long freq, TimeUnit timeUnit) { + this.aggregator = aggregator; + this.allSamplers = samplers; + + this.executor = + Executors.newScheduledThreadPool( + 1, new ThreadFactoryBuilder().setNameFormat("resource-sampler-%d").build()); + this.future = this.executor.scheduleAtFixedRate(this, 0, freq, timeUnit); + startExceptionHandlingThread(); + } + + @Override + public void run() { + for (ISampler sampler : allSamplers) { + sampler.sample(aggregator); + } + } + + private void startExceptionHandlingThread() { + new Thread( + () -> { + while (true) { + try { + future.get(); + } catch (CancellationException cex) { + LOG.info("Periodic sampler cancellation requested."); + } catch (Exception ex) { + LOG.error("Resource state poller exception cause:", ex); + } + } + }) + .start(); + } +} diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/Statistics.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/Statistics.java similarity index 91% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/Statistics.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/Statistics.java index 9273c79..1e2d088 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/Statistics.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/Statistics.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats; +package org.opensearch.performanceanalyzer.commons.stats.eval; /** List of stats that are currently supported. */ public enum Statistics { diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Count.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Count.java similarity index 78% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Count.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Count.java index a5c7a75..bb3de3c 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Count.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Count.java @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.impl; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicLong; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; -import org.opensearch.performanceanalyzer.commons.stats.vals.AggregateValue; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.AggregateValue; public class Count implements IStatistic { private AtomicLong counter; diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/IStatistic.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/IStatistic.java similarity index 84% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/IStatistic.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/IStatistic.java index 35ad4bf..c49deb9 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/IStatistic.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/IStatistic.java @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.impl; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl; import java.util.Collection; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; -import org.opensearch.performanceanalyzer.commons.stats.vals.Value; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.Value; /** This is the template of the statistic classes. Max, min etc. all follow this template. */ public interface IStatistic { diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Max.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Max.java similarity index 75% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Max.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Max.java index a6de989..ca2640a 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Max.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Max.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.impl; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; /** To get the maximum observed value */ public class Max extends MinMaxCommon { diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Mean.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Mean.java similarity index 83% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Mean.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Mean.java index 33ca030..2122e68 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Mean.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Mean.java @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.impl; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl; import java.math.BigInteger; import java.util.Collections; import java.util.List; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; -import org.opensearch.performanceanalyzer.commons.stats.vals.AggregateValue; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.AggregateValue; public class Mean implements IStatistic { private BigInteger sum; diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Min.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Min.java similarity index 75% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Min.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Min.java index 00758c6..cbc30e2 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Min.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Min.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.impl; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; /** To get the minimum observed value. */ public class Min extends MinMaxCommon { diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/MinMaxCommon.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/MinMaxCommon.java similarity index 92% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/MinMaxCommon.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/MinMaxCommon.java index 96f1e1f..d9e4db6 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/MinMaxCommon.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/MinMaxCommon.java @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.impl; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl; import java.util.Collections; import java.util.List; -import org.opensearch.performanceanalyzer.commons.stats.vals.NamedAggregateValue; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.NamedAggregateValue; /** * This is a utility class that is shares methods that are used for statistics where values are diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/NamedCounter.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/NamedCounter.java similarity index 87% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/NamedCounter.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/NamedCounter.java index ca18034..b62a4a7 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/NamedCounter.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/NamedCounter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.impl; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl; import java.util.Collection; @@ -11,8 +11,8 @@ import java.util.concurrent.ConcurrentHashMap; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; -import org.opensearch.performanceanalyzer.commons.stats.vals.NamedAggregateValue; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.NamedAggregateValue; public class NamedCounter implements IStatistic { diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Sample.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Sample.java similarity index 76% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Sample.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Sample.java index e30646a..f5932c2 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Sample.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Sample.java @@ -3,13 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.impl; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl; import java.util.Collections; import java.util.List; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; -import org.opensearch.performanceanalyzer.commons.stats.vals.Value; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.Value; public class Sample implements IStatistic { private Number value; diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Sum.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Sum.java similarity index 78% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Sum.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Sum.java index fb1e52a..91053f0 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/impl/Sum.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/Sum.java @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.impl; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicLong; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; -import org.opensearch.performanceanalyzer.commons.stats.vals.AggregateValue; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.AggregateValue; public class Sum implements IStatistic { private AtomicLong sum; diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/AggregateValue.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/AggregateValue.java similarity index 80% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/AggregateValue.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/AggregateValue.java index 5ae792a..a28796a 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/AggregateValue.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/AggregateValue.java @@ -3,13 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.vals; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals; import java.util.Objects; -import org.opensearch.performanceanalyzer.commons.formatter.Formatter; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSet; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.format.Formatter; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; public class AggregateValue extends Value { private Statistics aggregationType; diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/NamedAggregateValue.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/NamedAggregateValue.java similarity index 83% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/NamedAggregateValue.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/NamedAggregateValue.java index e03e052..ff5245f 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/NamedAggregateValue.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/NamedAggregateValue.java @@ -3,13 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.vals; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals; import java.util.Objects; -import org.opensearch.performanceanalyzer.commons.formatter.Formatter; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSet; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.format.Formatter; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; public class NamedAggregateValue extends AggregateValue { private String name; diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/NamedValue.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/NamedValue.java similarity index 93% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/NamedValue.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/NamedValue.java index 5dc11d3..e5d114a 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/NamedValue.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/NamedValue.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.vals; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals; import java.util.Objects; diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/Value.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/Value.java similarity index 76% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/Value.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/Value.java index d22306f..83771a1 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/vals/Value.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/vals/Value.java @@ -3,13 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.vals; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals; import java.util.Objects; -import org.opensearch.performanceanalyzer.commons.formatter.Formatter; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSet; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.format.Formatter; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; public class Value { protected Number value; diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/formatter/DefaultFormatter.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/format/DefaultFormatter.java similarity index 78% rename from src/main/java/org/opensearch/performanceanalyzer/commons/formatter/DefaultFormatter.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/format/DefaultFormatter.java index f840e46..0054a9f 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/formatter/DefaultFormatter.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/format/DefaultFormatter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.formatter; +package org.opensearch.performanceanalyzer.commons.stats.format; import java.util.ArrayList; @@ -11,11 +11,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSet; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; -import org.opensearch.performanceanalyzer.commons.stats.vals.AggregateValue; -import org.opensearch.performanceanalyzer.commons.stats.vals.NamedAggregateValue; -import org.opensearch.performanceanalyzer.commons.stats.vals.Value; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.AggregateValue; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.NamedAggregateValue; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.Value; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; public class DefaultFormatter implements Formatter { private Map>> map; diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/formatter/Formatter.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/format/Formatter.java similarity index 90% rename from src/main/java/org/opensearch/performanceanalyzer/commons/formatter/Formatter.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/format/Formatter.java index d2ec1ef..f670ffe 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/formatter/Formatter.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/format/Formatter.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.formatter; +package org.opensearch.performanceanalyzer.commons.stats.format; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSet; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; /** * A formatter is used to get the final formatted output of an aggregation. diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/IListener.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/listeners/IListener.java similarity index 74% rename from src/main/java/org/opensearch/performanceanalyzer/commons/stats/IListener.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/listeners/IListener.java index 8409298..17f90fb 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/IListener.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/listeners/IListener.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats; +package org.opensearch.performanceanalyzer.commons.stats.listeners; import java.util.Set; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSet; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; /** * This interface is implemented by the interested parties who want to to subscribe to the diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/metrics/MeasurementSet.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/measurements/MeasurementSet.java similarity index 66% rename from src/main/java/org/opensearch/performanceanalyzer/commons/metrics/MeasurementSet.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/measurements/MeasurementSet.java index f5c15a1..a744d86 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/metrics/MeasurementSet.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/measurements/MeasurementSet.java @@ -3,11 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.metrics; +package org.opensearch.performanceanalyzer.commons.stats.measurements; import java.util.List; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.metrics.StatsType; /** This is a marker interface to bring all measurement sets under one type. */ public interface MeasurementSet { @@ -18,6 +19,13 @@ public interface MeasurementSet { */ List getStatsList(); + /** + * The statistics type for this measurement + * + * @return The type of statistics for this measurement. + */ + StatsType getStatsType(); + /** * The name of the measurement. * diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/ExceptionsAndErrors.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/ExceptionsAndErrors.java new file mode 100644 index 0000000..8cd3436 --- /dev/null +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/ExceptionsAndErrors.java @@ -0,0 +1,81 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.performanceanalyzer.commons.stats.metrics; + + +import java.util.Collections; +import java.util.List; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; + +/** + * Aggregate metrics across RCA Graph nodes tracking failure in various staged of RCA Graph + * Execution. Only add errors and exceptions which require {@link Statistics#NAMED_COUNTERS}, + * everything else goes to Counters maintained at {@link StatExceptionCode}. + */ +public enum ExceptionsAndErrors implements MeasurementSet { + + /** Exception thrown in operate() method, implemented by each RCA Graph node */ + EXCEPTION_IN_OPERATE("ExceptionInOperate", "namedCount", Statistics.NAMED_COUNTERS), + + /** Exception thrown in compute() method in publisher. */ + EXCEPTION_IN_COMPUTE("ExceptionInCompute", "namedCount", Statistics.NAMED_COUNTERS), + + /** When calling the MetricsDB API throws an exception. */ + EXCEPTION_IN_GATHER("ExceptionInGather", "namedCount", Statistics.NAMED_COUNTERS), + + /** Exception thrown when persisting action or flowunit when unable to write to DB */ + EXCEPTION_IN_PERSIST("ExceptionInPersist", "namedCount", Statistics.NAMED_COUNTERS); + + /** What we want to appear as the metric name. */ + private String name; + + /** + * The unit the measurement is in. This is not used for the statistics calculations but as an + * information that will be dumped with the metrics. + */ + private String unit; + + /** The type of the measurement, refer {@link StatsType} */ + private StatsType statsType; + + /** + * Multiple statistics can be collected for each measurement like MAX, MIN and MEAN. This is a + * collection of one or more such statistics. + */ + private List statsList; + + ExceptionsAndErrors(String name, String unit, Statistics stats) { + this.name = name; + this.unit = unit; + this.statsType = StatsType.STATS_DATA; + this.statsList = Collections.singletonList(stats); + } + + public String toString() { + return new StringBuilder(name).append("-").append(unit).toString(); + } + + @Override + public List getStatsList() { + return statsList; + } + + @Override + public StatsType getStatsType() { + return statsType; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getUnit() { + return unit; + } +} diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/StatExceptionCode.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/StatExceptionCode.java new file mode 100644 index 0000000..46692ff --- /dev/null +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/StatExceptionCode.java @@ -0,0 +1,161 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.performanceanalyzer.commons.stats.metrics; + +/** + * StatExceptionCode defines counters for various points of failure in the framework. + * + *

Note: The framework also provides the specialized 'Named Counters' at {@link + * ExceptionsAndErrors}. Named Counter take a key with it, and reports the count of occurrences for + * each key. see Note: The 'PA' in metricName is confusing, it is meant to imply threads started within RCA + * Agent. + */ + NUM_PA_THREADS_STARTED("NumberOfPAThreadsStarted"), + NUM_PA_THREADS_ENDED("NumberOfPAThreadsEnded"), + + /** + * For each thread defined in {@link + * org.opensearch.performanceanalyzer.PerformanceAnalyzerThreads}, we add a respective + * 'threadExceptionCode' metric. These metrics are emitted in catch block of {@link + * org.opensearch.performanceanalyzer.threads.ThreadProvider#createThreadForRunnable} + */ + READER_THREAD_STOPPED("ReaderThreadStopped"), + ERROR_HANDLER_THREAD_STOPPED("ErrorHandlerThreadStopped"), + GRPC_SERVER_THREAD_STOPPED("GRPCServerThreadStopped"), + WEB_SERVER_THREAD_STOPPED("WebServerThreadStopped"), + RCA_CONTROLLER_THREAD_STOPPED("RcaControllerThreadStopped"), + RCA_SCHEDULER_THREAD_STOPPED("RcaSchedulerThreadStopped"), + + MUTE_ERROR("MuteError"), + REQUEST_REMOTE_ERROR("RequestRemoteError"), + CONFIG_DIR_NOT_FOUND("ConfigDirectoryNotFound"), + CONFIG_OVERRIDES_SER_FAILED("ConfigOverridesSerFailed"), + WRITE_UPDATED_RCA_CONF_ERROR("WriteUpdatedRcaConfError"), + + /** Tracks stale metrics - metrics to be collected is behind current bucket */ + STALE_METRICS("StaleMetrics"), + + /** This metric indicates faiure in intercepting opensearch requests at transport channel */ + OPENSEARCH_REQUEST_INTERCEPTOR_ERROR("OpenSearchRequestInterceptorError"), + + /** Below tracks Metrics specific Errors. */ + THREAD_IO_ERROR("ThreadIOError"), + SCHEMA_PARSER_ERROR("SchemaParserError"), + JSON_PARSER_ERROR("JsonParserError"), + REQUEST_ERROR("RequestError"), + MISCONFIGURED_OLD_GEN_RCA_HEAP_MAX_MISSING("MisconfiguredOldGenRcaHeapMaxMissing"), + MISCONFIGURED_OLD_GEN_RCA_HEAP_USED_MISSING("MisconfiguredOldGenRcaHeapUsedMissing"), + MISCONFIGURED_OLD_GEN_RCA_GC_EVENTS_MISSING("MisconfiguredOldGenRcaGcEventsMissing"), + TOTAL_MEM_READ_ERROR("TotalMemReadError"), + + /** Below tracks Collector specific Errors. */ + DISK_METRICS_COLLECTOR_ERROR("DiskMetricsError"), + GC_INFO_COLLECTOR_ERROR("GCInfoCollectorError"), + HEAP_METRICS_COLLECTOR_ERROR("HeapMetricsCollectorError"), + MOUNTED_PARTITION_METRICS_COLLECTOR_ERROR("MountedPartitionMetricsCollectorError"), + NETWORK_COLLECTION_ERROR("NetworkCollectionError"), + OS_METRICS_COLLECTOR_ERROR("OSMetricsCollectorError"), + STATS_COLLECTOR_ERROR("StatsCollectorError"), + THREADPOOL_METRICS_COLLECTOR_ERROR("ThreadPoolMetricsCollectorError"), + SHARD_STATE_COLLECTOR_ERROR("ShardStateCollectorError"), + ADMISSION_CONTROL_COLLECTOR_ERROR("AdmissionControlCollectorError"), + CIRCUIT_BREAKER_COLLECTOR_ERROR("CircuitBreakerCollectorError"), + CLUSTER_MANAGER_METRICS_ERROR("ClusterManagerMetricsError"), + CLUSTER_MANAGER_NODE_NOT_UP("ClusterManagerNodeNotUp"), + CLUSTER_MANAGER_THROTTLING_COLLECTOR_ERROR("ClusterManagerThrottlingMetricsCollectorError"), + FAULT_DETECTION_COLLECTOR_ERROR("FaultDetectionMetricsCollectorError"), + CLUSTER_APPLIER_SERVICE_STATS_COLLECTOR_ERROR("ClusterApplierServiceStatsCollectorError"), + ELECTION_TERM_COLLECTOR_ERROR("ElectionTermCollectorError"), + SHARD_INDEXING_PRESSURE_COLLECTOR_ERROR("ShardIndexingPressureMetricsCollectorError"), + NODESTATS_COLLECTION_ERROR("NodeStatsCollectionError"), + + /** Below tracks Reader specific Errors. */ + READER_METRICSDB_ACCESS_ERRORS("ReaderMetricsdbAccessError"), + READER_PARSER_ERROR("ReaderParserError"), + READER_RESTART_PROCESSING("ReaderRestartProcessing"), + READER_METRICS_PROCESSOR_ERROR("ReaderMetricsProcessorError"), + + /** This metric indicates metric entry insertion to event log queue failed */ + METRICS_WRITE_ERROR("MetricsWriteError"), + + /** This metric indicates faiure in cleaning up the event log files */ + METRICS_REMOVE_ERROR("MetricsRemoveError"), + + /** This metric indicates faiure in cleaning up the event log files */ + METRICS_REMOVE_FAILURE("MetricsRemoveFailure"), + + /** This metric indicates that the writer file creation was skipped. */ + WRITER_FILE_CREATION_SKIPPED("WriterFileCreationSkipped"), + + /** This metric indicates that error occurred while closing grpc channels. */ + GRPC_CHANNEL_CLOSURE_ERROR("GrpcChannelClosureError"), + + /** This metric indicates that error occurred while closing grpc server. */ + GRPC_SERVER_CLOSURE_ERROR("GrpcServerClosureError"), + + /** This metric indicates that error occurred while closing metrics db. */ + METRICS_DB_CLOSURE_ERROR("MetricsDbClosureError"), + + /** This metric indicates that error occurred while closing database connection. */ + IN_MEMORY_DATABASE_CONN_CLOSURE_ERROR("InMemoryDatabaseConnClosureError"), + + /** Below tracks RCA framework specific Errors. */ + RCA_NETWORK_ERROR("RcaNetworkError"), + RCA_VERTEX_RX_BUFFER_FULL_ERROR("RcaVertexRxBufferFullError"), + RCA_NETWORK_THREADPOOL_QUEUE_FULL_ERROR("RcaNetworkThreadpoolQueueFullError"), + RCA_SCHEDULER_STOPPED_ERROR("RcaSchedulerStoppedError"), + RCA_FRAMEWORK_CRASH("RcaFrameworkCrash"), + INVALID_CONFIG_RCA_AGENT_STOPPED("InvalidConfigRCAAgentStopped"), + + /** Batch Metric relevant errors */ + BATCH_METRICS_CONFIG_ERROR("BatchMetricsConfigError"), + BATCH_METRICS_EXCEEDED_MAX_DATAPOINTS("ExceededBatchMetricsMaxDatapoints"), + BATCH_METRICS_HTTP_CLIENT_ERROR("BatchMetricsHttpClientError"), + BATCH_METRICS_HTTP_HOST_ERROR("BatchMetricsHttpHostError"); + + private final String value; + + StatExceptionCode(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +} diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/StatsType.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/StatsType.java new file mode 100644 index 0000000..635400a --- /dev/null +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/StatsType.java @@ -0,0 +1,24 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.performanceanalyzer.commons.stats.metrics; + +/** The framework supports 3 stat metric types: Counters, StatsData and Latencies. */ +public enum StatsType { + COUNTERS("Counters"), + STATS_DATA("StatsData"), + LATENCIES("Latencies"); + + private final String fieldValue; + + StatsType(String fieldValue) { + this.fieldValue = fieldValue; + } + + @Override + public String toString() { + return fieldValue; + } +} diff --git a/src/main/java/org/opensearch/performanceanalyzer/commons/metrics/WriterMetrics.java b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/WriterMetrics.java similarity index 55% rename from src/main/java/org/opensearch/performanceanalyzer/commons/metrics/WriterMetrics.java rename to src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/WriterMetrics.java index e20de75..5fc3e06 100644 --- a/src/main/java/org/opensearch/performanceanalyzer/commons/metrics/WriterMetrics.java +++ b/src/main/java/org/opensearch/performanceanalyzer/commons/stats/metrics/WriterMetrics.java @@ -3,23 +3,21 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.metrics; +package org.opensearch.performanceanalyzer.commons.stats.metrics; -import java.util.Arrays; import java.util.Collections; import java.util.List; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; public enum WriterMetrics implements MeasurementSet { /** Measures the time spent in deleting the event log files */ EVENT_LOG_FILES_DELETION_TIME( - "EventLogFilesDeletionTime", - "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + "EventLogFilesDeletionTime", "millis", StatsType.LATENCIES, Statistics.SUM), + /** Measures the count of event log files deleted */ - EVENT_LOG_FILES_DELETED( - "EventLogFilesDeleted", "count", Arrays.asList(Statistics.MAX, Statistics.SUM)), + EVENT_LOG_FILES_DELETED("EventLogFilesDeleted"), /** * Successfully completed a thread-dump. An omission of indicate thread taking the dump got @@ -31,113 +29,111 @@ public enum WriterMetrics implements MeasurementSet { COLLECTORS_MUTED( "CollectorsMutedCount", "namedCount", + StatsType.STATS_DATA, Collections.singletonList(Statistics.NAMED_COUNTERS)), COLLECTORS_SKIPPED( "CollectorSkippedCount", "namedCount", + StatsType.STATS_DATA, Collections.singletonList(Statistics.NAMED_COUNTERS)), COLLECTORS_SLOW( "CollectorSlowCount", "namedCount", + StatsType.STATS_DATA, Collections.singletonList(Statistics.NAMED_COUNTERS)), /** Tracks time taken by respective collectors to collect event metrics. */ THREADPOOL_METRICS_COLLECTOR_EXECUTION_TIME( "ThreadPoolMetricsCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), CACHE_CONFIG_METRICS_COLLECTOR_EXECUTION_TIME( "CacheConfigMetricsCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), CIRCUIT_BREAKER_COLLECTOR_EXECUTION_TIME( - "CircuitBreakerCollectorExecutionTime", - "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + "CircuitBreakerCollectorExecutionTime", "millis", StatsType.LATENCIES, Statistics.SUM), OS_METRICS_COLLECTOR_EXECUTION_TIME( - "OSMetricsCollectorExecutionTime", - "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + "OSMetricsCollectorExecutionTime", "millis", StatsType.LATENCIES, Statistics.SUM), HEAP_METRICS_COLLECTOR_EXECUTION_TIME( - "HeapMetricsCollectorExecutionTime", + "HeapMetricsCollectorExecutionTime", "millis", StatsType.LATENCIES, Statistics.SUM), + MOUNTED_PARTITION_METRICS_COLLECTOR_EXECUTION_TIME( + "MountedPartitionMetricsCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), NODE_DETAILS_COLLECTOR_EXECUTION_TIME( - "NodeDetailsCollectorExecutionTime", - "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + "NodeDetailsCollectorExecutionTime", "millis", StatsType.LATENCIES, Statistics.SUM), NODE_STATS_ALL_SHARDS_METRICS_COLLECTOR_EXECUTION_TIME( "NodeStatsAllShardsMetricsCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), NODE_STATS_FIXED_SHARDS_METRICS_COLLECTOR_EXECUTION_TIME( "NodeStatsFixedShardsMetricsCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), CLUSTER_MANAGER_SERVICE_METRICS_COLLECTOR_EXECUTION_TIME( "ClusterManagerServiceMetricsCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), CLUSTER_MANAGER_SERVICE_EVENTS_METRICS_COLLECTOR_EXECUTION_TIME( "ClusterManagerServiceEventsMetricsCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), DISKS_COLLECTOR_EXECUTION_TIME( - "DisksCollectorExecutionTime", - "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + "DisksCollectorExecutionTime", "millis", StatsType.LATENCIES, Statistics.SUM), + NETWORK_E2E_COLLECTOR_EXECUTION_TIME( + "NetworkE2ECollectorExecutionTime", "millis", StatsType.LATENCIES, Statistics.SUM), NETWORK_INTERFACE_COLLECTOR_EXECUTION_TIME( "NetworkInterfaceCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), GC_INFO_COLLECTOR_EXECUTION_TIME( - "GCInfoCollectorExecutionTime", - "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + "GCInfoCollectorExecutionTime", "millis", StatsType.LATENCIES, Statistics.SUM), FAULT_DETECTION_COLLECTOR_EXECUTION_TIME( - "FaultDetectionCollectorExecutionTime", - "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + "FaultDetectionCollectorExecutionTime", "millis", StatsType.LATENCIES, Statistics.SUM), SHARD_STATE_COLLECTOR_EXECUTION_TIME( - "ShardStateCollectorExecutionTime", - "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + "ShardStateCollectorExecutionTime", "millis", StatsType.LATENCIES, Statistics.SUM), CLUSTER_MANAGER_THROTTLING_COLLECTOR_EXECUTION_TIME( "ClusterManagerThrottlingCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), CLUSTER_APPLIER_SERVICE_STATS_COLLECTOR_EXECUTION_TIME( "ClusterApplierServiceStatsCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), ADMISSION_CONTROL_COLLECTOR_EXECUTION_TIME( "AdmissionControlCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), ELECTION_TERM_COLLECTOR_EXECUTION_TIME( - "ElectionTermCollectorExecutionTime", - "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + "ElectionTermCollectorExecutionTime", "millis", StatsType.LATENCIES, Statistics.SUM), SHARD_INDEXING_PRESSURE_COLLECTOR_EXECUTION_TIME( "ShardIndexingPressureCollectorExecutionTime", "millis", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + StatsType.LATENCIES, + Statistics.SUM), + STAT_COLLECTOR_EXECUTION_TIME( + "StatCollectorExecutionTime", "millis", StatsType.LATENCIES, Statistics.SUM), /** Tracks collector specific metrics - available/enabled/disabled and other params */ - ADMISSION_CONTROL_COLLECTOR_NOT_AVAILABLE( - "AdmissionControlCollectorNotAvailable", - "count", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + ADMISSION_CONTROL_COLLECTOR_NOT_AVAILABLE("AdmissionControlCollectorNotAvailable"), CLUSTER_MANAGER_CLUSTER_UPDATE_STATS_COLLECTOR_DISABLED( - "ClusterManagerClusterUpdateStatsCollectorDisabled", - "count", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)), + "ClusterManagerClusterUpdateStatsCollectorDisabled"), CLUSTER_MANAGER_THROTTLING_COLLECTOR_NOT_AVAILABLE( - "ClusterManagerThrottlingCollectorNotAvailable", - "count", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.SUM)); + "ClusterManagerThrottlingCollectorNotAvailable"); /** What we want to appear as the metric name. */ private String name; @@ -148,6 +144,9 @@ public enum WriterMetrics implements MeasurementSet { */ private String unit; + /** The type of the measurement, refer {@link StatsType} */ + private StatsType statsType; + /** * Multiple statistics can be collected for each measurement like MAX, MIN and MEAN. This is a * collection of one or more such statistics. @@ -155,25 +154,29 @@ public enum WriterMetrics implements MeasurementSet { private List statsList; WriterMetrics(String name) { - this.name = name; - this.unit = "count"; - this.statsList = Collections.singletonList(Statistics.COUNT); + this(name, "count", StatsType.STATS_DATA, Collections.singletonList(Statistics.COUNT)); } - WriterMetrics(String name, String unit, List stats) { + WriterMetrics(String name, String unit, StatsType statsType, Statistics stats) { + this(name, unit, statsType, Collections.singletonList(stats)); + } + + WriterMetrics(String name, String unit, StatsType statsType, List stats) { this.name = name; this.unit = unit; + this.statsType = statsType; this.statsList = stats; } - WriterMetrics(String name, String unit, Statistics stats) { - this(name, unit, Collections.singletonList(stats)); - } - public String toString() { return new StringBuilder(name).append("-").append(unit).toString(); } + @Override + public StatsType getStatsType() { + return statsType; + } + @Override public List getStatsList() { return statsList; diff --git a/src/test/java/org/opensearch/performanceanalyzer/commons/metrics/MeasurementSetTestHelper.java b/src/test/java/org/opensearch/performanceanalyzer/commons/metrics/MeasurementSetTestHelper.java deleted file mode 100644 index 089f088..0000000 --- a/src/test/java/org/opensearch/performanceanalyzer/commons/metrics/MeasurementSetTestHelper.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.opensearch.performanceanalyzer.commons.metrics; - - -import java.util.Arrays; -import java.util.List; -import org.opensearch.performanceanalyzer.commons.stats.Statistics; - -public enum MeasurementSetTestHelper implements MeasurementSet { - TEST_MEASUREMENT1( - "TestMeasurement1", - "micros", - Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.MIN)), - TEST_MEASUREMENT2("TestMeasurement2", "micros", Arrays.asList(Statistics.COUNT)), - TEST_MEASUREMENT3("TestMeasurement3", "micros", Arrays.asList(Statistics.COUNT)), - TEST_MEASUREMENT4("TestMeasurement4", "micros", Arrays.asList(Statistics.SAMPLE)), - TEST_MEASUREMENT5("TestMeasurement5", "micros", Arrays.asList(Statistics.SUM)), - TEST_MEASUREMENT6("TestMeasurement6", "micros", Arrays.asList(Statistics.NAMED_COUNTERS)), - JVM_FREE_MEM_SAMPLER("jvmFreeMemorySampler", "bytes", Arrays.asList(Statistics.SAMPLE)); - - private String name; - private String unit; - private List statsList; - - MeasurementSetTestHelper(String name, String unit, List statisticList) { - this.name = name; - this.unit = unit; - this.statsList = statisticList; - } - - public String toString() { - return name + "-" + unit; - } - - @Override - public List getStatsList() { - return statsList; - } - - @Override - public String getName() { - return name; - } - - @Override - public String getUnit() { - return unit; - } -} diff --git a/src/test/java/org/opensearch/performanceanalyzer/commons/stats/SampleAggregatorTest.java b/src/test/java/org/opensearch/performanceanalyzer/commons/stats/collectors/SampleAggregatorTest.java similarity index 85% rename from src/test/java/org/opensearch/performanceanalyzer/commons/stats/SampleAggregatorTest.java rename to src/test/java/org/opensearch/performanceanalyzer/commons/stats/collectors/SampleAggregatorTest.java index 5416f5c..7fb5d0d 100644 --- a/src/test/java/org/opensearch/performanceanalyzer/commons/stats/SampleAggregatorTest.java +++ b/src/test/java/org/opensearch/performanceanalyzer/commons/stats/collectors/SampleAggregatorTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats; +package org.opensearch.performanceanalyzer.commons.metrics.stats.collectors; import java.util.Arrays; @@ -14,15 +14,21 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.TimeUnit; import org.junit.Assert; import org.junit.Test; -import org.opensearch.performanceanalyzer.commons.formatter.DefaultFormatter; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSet; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSetTestHelper; -import org.opensearch.performanceanalyzer.commons.stats.impl.IStatistic; -import org.opensearch.performanceanalyzer.commons.stats.vals.AggregateValue; -import org.opensearch.performanceanalyzer.commons.stats.vals.NamedAggregateValue; -import org.opensearch.performanceanalyzer.commons.stats.vals.Value; +import org.opensearch.performanceanalyzer.commons.metrics.stats.measurements.MeasurementSetTestHelper; +import org.opensearch.performanceanalyzer.commons.stats.StatsReporter; +import org.opensearch.performanceanalyzer.commons.stats.collectors.SampleAggregator; +import org.opensearch.performanceanalyzer.commons.stats.emitters.ISampler; +import org.opensearch.performanceanalyzer.commons.stats.emitters.PeriodicSamplers; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.IStatistic; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.AggregateValue; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.NamedAggregateValue; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.Value; +import org.opensearch.performanceanalyzer.commons.stats.format.DefaultFormatter; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; public class SampleAggregatorTest { @@ -79,6 +85,16 @@ private boolean match( public void updateStat() { SampleAggregator sampleAggregator = new SampleAggregator(MeasurementSetTestHelper.values()); + ISampler sampler = + sampleCollector -> + sampleCollector.updateStat( + MeasurementSetTestHelper.JVM_FREE_MEM_SAMPLER, + Runtime.getRuntime().freeMemory()); + + PeriodicSamplers periodicSamplers = + new PeriodicSamplers( + sampleAggregator, Collections.singletonList(sampler), 10, TimeUnit.HOURS); + StatsReporter reporter = new StatsReporter(Collections.singletonList(sampleAggregator)); Map>> expected = new HashMap<>(); diff --git a/src/test/java/org/opensearch/performanceanalyzer/commons/stats/impl/NamedCounterTest.java b/src/test/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/NamedCounterTest.java similarity index 93% rename from src/test/java/org/opensearch/performanceanalyzer/commons/stats/impl/NamedCounterTest.java rename to src/test/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/NamedCounterTest.java index c4271ef..cea1bbe 100644 --- a/src/test/java/org/opensearch/performanceanalyzer/commons/stats/impl/NamedCounterTest.java +++ b/src/test/java/org/opensearch/performanceanalyzer/commons/stats/eval/impl/NamedCounterTest.java @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats.impl; +package org.opensearch.performanceanalyzer.commons.stats.eval.impl; import org.junit.Assert; import org.junit.Test; -import org.opensearch.performanceanalyzer.commons.stats.vals.NamedAggregateValue; +import org.opensearch.performanceanalyzer.commons.stats.eval.impl.vals.NamedAggregateValue; public class NamedCounterTest { @@ -82,7 +82,7 @@ public void concurrentCalculate() { } } - static class Th extends Thread { + class Th extends Thread { String[] arr; int start; int delta; diff --git a/src/test/java/org/opensearch/performanceanalyzer/commons/stats/IListenerTest.java b/src/test/java/org/opensearch/performanceanalyzer/commons/stats/listeners/IListenerTest.java similarity index 66% rename from src/test/java/org/opensearch/performanceanalyzer/commons/stats/IListenerTest.java rename to src/test/java/org/opensearch/performanceanalyzer/commons/stats/listeners/IListenerTest.java index f82e2f2..3fcf3e5 100644 --- a/src/test/java/org/opensearch/performanceanalyzer/commons/stats/IListenerTest.java +++ b/src/test/java/org/opensearch/performanceanalyzer/commons/stats/listeners/IListenerTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.performanceanalyzer.commons.stats; +package org.opensearch.performanceanalyzer.commons.metrics.stats.listeners; import java.util.HashSet; @@ -11,11 +11,13 @@ import java.util.concurrent.atomic.AtomicInteger; import org.junit.Assert; import org.junit.Test; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSet; -import org.opensearch.performanceanalyzer.commons.metrics.MeasurementSetTestHelper; +import org.opensearch.performanceanalyzer.commons.metrics.stats.measurements.MeasurementSetTestHelper; +import org.opensearch.performanceanalyzer.commons.stats.collectors.SampleAggregator; +import org.opensearch.performanceanalyzer.commons.stats.listeners.IListener; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; public class IListenerTest { - static class Listener implements IListener { + class Listener implements IListener { private AtomicInteger count; public Listener() { @@ -27,8 +29,8 @@ public Set getMeasurementsListenedTo() { Set set = new HashSet() { { - add(MeasurementSetTestHelper.TEST_MEASUREMENT1); - add(MeasurementSetTestHelper.TEST_MEASUREMENT2); + this.add(MeasurementSetTestHelper.TEST_MEASUREMENT1); + this.add(MeasurementSetTestHelper.TEST_MEASUREMENT2); } }; return set; @@ -49,9 +51,9 @@ public void onOccurrence() { listener, MeasurementSetTestHelper.values()); - sampleAggregator.updateStat(MeasurementSetTestHelper.TEST_MEASUREMENT4, "", 1); - sampleAggregator.updateStat(MeasurementSetTestHelper.TEST_MEASUREMENT1, "", 1); - sampleAggregator.updateStat(MeasurementSetTestHelper.TEST_MEASUREMENT2, "", 1); + sampleAggregator.updateStat(MeasurementSetTestHelper.TEST_MEASUREMENT4, 1); + sampleAggregator.updateStat(MeasurementSetTestHelper.TEST_MEASUREMENT1, 1); + sampleAggregator.updateStat(MeasurementSetTestHelper.TEST_MEASUREMENT2, 1); Assert.assertEquals(2, listener.count.get()); } diff --git a/src/test/java/org/opensearch/performanceanalyzer/commons/stats/measurements/MeasurementSetTestHelper.java b/src/test/java/org/opensearch/performanceanalyzer/commons/stats/measurements/MeasurementSetTestHelper.java new file mode 100644 index 0000000..d2cdc9a --- /dev/null +++ b/src/test/java/org/opensearch/performanceanalyzer/commons/stats/measurements/MeasurementSetTestHelper.java @@ -0,0 +1,76 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.performanceanalyzer.commons.metrics.stats.measurements; + + +import java.util.Arrays; +import java.util.List; +import org.opensearch.performanceanalyzer.commons.stats.eval.Statistics; +import org.opensearch.performanceanalyzer.commons.stats.measurements.MeasurementSet; +import org.opensearch.performanceanalyzer.commons.stats.metrics.StatsType; + +public enum MeasurementSetTestHelper implements MeasurementSet { + TEST_MEASUREMENT1( + "TestMeasurement1", + "millis", + StatsType.LATENCIES, + Arrays.asList(Statistics.MAX, Statistics.MEAN, Statistics.MIN)), + TEST_MEASUREMENT2( + "TestMeasurement2", "millis", StatsType.LATENCIES, Arrays.asList(Statistics.COUNT)), + TEST_MEASUREMENT3( + "TestMeasurement3", "millis", StatsType.LATENCIES, Arrays.asList(Statistics.COUNT)), + TEST_MEASUREMENT4( + "TestMeasurement4", "millis", StatsType.LATENCIES, Arrays.asList(Statistics.SAMPLE)), + TEST_MEASUREMENT5( + "TestMeasurement5", "millis", StatsType.LATENCIES, Arrays.asList(Statistics.SUM)), + TEST_MEASUREMENT6( + "TestMeasurement6", + "millis", + StatsType.LATENCIES, + Arrays.asList(Statistics.NAMED_COUNTERS)), + JVM_FREE_MEM_SAMPLER( + "jvmFreeMemorySampler", + "bytes", + StatsType.STATS_DATA, + Arrays.asList(Statistics.SAMPLE)); + + private String name; + private String unit; + private StatsType statsType; + private List statsList; + + MeasurementSetTestHelper( + String name, String unit, StatsType statsType, List statisticList) { + this.name = name; + this.unit = unit; + this.statsType = statsType; + this.statsList = statisticList; + } + + public String toString() { + return new StringBuilder(name).append("-").append(unit).toString(); + } + + @Override + public List getStatsList() { + return statsList; + } + + @Override + public StatsType getStatsType() { + return statsType; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getUnit() { + return unit; + } +}