/*
* Copyright (c) 2010-2012 Grid Dynamics Consulting Services, Inc, All Rights Reserved
* http://www.griddynamics.com
*
* This library is free software; you can redistribute it and/or modify it under the terms of
* the Apache License; either
* version 2.0 of the License, or any later version.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.griddynamics.jagger.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.apache.commons.lang3.StringUtils.removePattern;
/**
* Class is used in chassis, web UI server and web UI client
* to use it in web UI client - keep it simple (use only standard java libraries)
*/
public class StandardMetricsNamesUtil {
private static final Logger log = LoggerFactory.getLogger(StandardMetricsNamesUtil.class);
public static final String THROUGHPUT_TPS = "Throughput, tps";
public static final String THROUGHPUT = "Throughput";
public static final String LATENCY_SEC = "Latency, sec";
public static final String LATENCY_STD_DEV_SEC = "Latency std dev, sec";
public static final String ITERATIONS_SAMPLES = "Iterations, samples";
public static final String SUCCESS_RATE = "Success rate";
public static final String DURATION_SEC = "Duration, sec";
public static final String TIME_LATENCY_PERCENTILE = "Time Latency Percentile";
public static final String VIRTUAL_USERS = "Virtual users";
// aggregators ids
public static final String SUCCESS_RATE_AGGREGATOR_OK_ID = "Success rate";
public static final String SUCCESS_RATE_AGGREGATOR_FAILED_ID = "Number of fails";
public static final String AVERAGE_AGGREGATOR_ID = "avg";
public static final String CUMULATIVE_AGGREGATOR_ID = "cumulative";
public static final String MAX_AGGREGATOR_ID = "max";
public static final String MIN_AGGREGATOR_ID = "min";
public static final String STANDARD_DEVIATION_AGGREGATOR_ID = "std_dev";
public static final String SUM_AGGREGATOR_ID = "sum";
public static final String THROUGHPUT_ID = "throughput";
public static final String LATENCY_ID = "avgLatency";
public static final String SUCCESS_RATE_ID = "successRate";
public static final String DURATION_ID = "duration";
public static final String ITERATION_SAMPLES_ID = "samples";
public static final String VIRTUAL_USERS_ID = "Jagger.Threads";
// Combinations (metric + aggregator)
public static final String SUCCESS_RATE_OK_ID = SUCCESS_RATE_ID + "-" + SUCCESS_RATE_AGGREGATOR_OK_ID;
public static final String SUCCESS_RATE_FAILED_ID = SUCCESS_RATE_ID + "-" + SUCCESS_RATE_AGGREGATOR_FAILED_ID;
public static final String LATENCY_MAX_AGG_ID = LATENCY_ID + "-" + MAX_AGGREGATOR_ID;
public static final String LATENCY_MIN_AGG_ID = LATENCY_ID + "-" + MIN_AGGREGATOR_ID;
public static final String LATENCY_AVG_AGG_ID = LATENCY_ID + "-" + AVERAGE_AGGREGATOR_ID;
public static final String LATENCY_STD_DEV_AGG_ID = LATENCY_ID + "-" + STANDARD_DEVIATION_AGGREGATOR_ID;
// Percentiles
public static final String LATENCY_PERCENTILE_ID_REGEX = LATENCY_ID + "-\\S+%";
public static String getLatencyMetricId(double latencyKey) {
return LATENCY_ID + "-" + latencyKey + "%";
}
public static String getLatencyMetricDisplayName(double latencyKey) {
return LATENCY_SEC + " " + latencyKey + "%";
}
public static Double parseLatencyPercentileKey(String metricName) {
String start = LATENCY_ID + "-";
String stop = "%";
return Double.parseDouble(metricName.substring(
metricName.indexOf(start) + start.length(),
metricName.indexOf(stop)
));
}
// standard monitoring metric names
public static final String MON_CPULA_1 = "mon_cpula_1";
public static final String MON_CPULA_5 = "mon_cpula_5";
public static final String MON_CPULA_15 = "mon_cpula_15";
public static final String MON_GC_MINOR_TIME = "mon_gc_minor_time";
public static final String MON_GC_MAJOR_TIME = "mon_gc_major_time";
public static final String MON_GC_MINOR_UNIT = "mon_gc_minor_unit";
public static final String MON_GC_MAJOR_UNIT = "mon_gc_major_unit";
public static final String MON_MEM_RAM = "mon_mem_ram";
public static final String MON_MEM_TOTAL = "mon_mem_total";
public static final String MON_MEM_USED = "mon_mem_used";
public static final String MON_MEM_ACTUAL_USED = "mon_mem_actual_used";
public static final String MON_MEM_FREE_PRCNT = "mon_mem_free_prcnt";
public static final String MON_MEM_ACTUAL_FREE = "mon_mem_actual_free";
public static final String MON_MEM_FREE = "mon_mem_free";
public static final String MON_TCP_EST = "mon_tcp_est";
public static final String MON_TCP_LISTEN = "mon_tcp_listen";
public static final String MON_SYNC_RECEIVED = "mon_sync_received";
public static final String MON_INBOUND_TOTAL = "mon_inbound_total";
public static final String MON_OUTBOUND_TOTAL = "mon_outbound_total";
public static final String MON_DISK_READ_BYTES = "mon_disk_read_bytes";
public static final String MON_DISK_WRITE_BYTES = "mon_disk_write_bytes";
public static final String MON_DISK_SERVICE_TIME = "mon_disk_service_time";
public static final String MON_DISK_QUEUE_SIZE_TOTAL = "mon_disk_queue_size_total";
public static final String MON_CPU_USER = "mon_cpu_user";
public static final String MON_CPU_SYS_PRCNT = "mon_cpu_sys_prcnt";
public static final String MON_CPU_IDLE_PRCNT = "mon_cpu_idle_prcnt";
public static final String MON_CPU_WAIT = "mon_cpu_wait";
public static final String MON_CPU_COMBINED = "mon_cpu_combined";
public static final String MON_HEAP_INIT = "mon_heap_init";
public static final String MON_HEAP_USED = "mon_heap_used";
public static final String MON_HEAP_COMMITTED = "mon_heap_committed";
public static final String MON_HEAP_MAX = "mon_heap_max";
public static final String MON_NONHEAP_INIT = "mon_nonheap_init";
public static final String MON_NONHEAP_USED = "mon_nonheap_used";
public static final String MON_NONHEAP_COMMITTED = "mon_nonheap_committed";
public static final String MON_NONHEAP_MAX = "mon_nonheap_max";
public static final String MON_THREAD_COUNT = "mon_thread_count";
public static final String MON_THREAD_PEAK_COUNT = "mon_thread_peak_count";
public static final String MON_FILE_DESCRIPTORS = "mon_file_descriptors";
// User scenarios sections
public static class IdContainer {
private final String scenarioId;
private final String stepId;
private final String metricId;
public IdContainer(String scenarioId, String stepId, String metricId) {
this.scenarioId = scenarioId;
this.stepId = stepId;
this.metricId = metricId;
}
public String getScenarioId() {
return scenarioId;
}
public String getStepId() {
return stepId;
}
public String getMetricId() {
return metricId;
}
}
public static final String USER_SCENARIO_ID = "US_";
public static final String US_STEP_ID = "_STNN";
public static final String US_METRIC_ID = "METR_";
public static final String USER_SCENARIO_REGEXP_WITH_GROUPS = "^.*" + USER_SCENARIO_ID + "(.*)" + US_STEP_ID + "\\d+_(.*)_" + US_METRIC_ID + "(.*)(-.*)?$";
public static final Pattern USER_SCENARIO_PATTERN = Pattern.compile(USER_SCENARIO_REGEXP_WITH_GROUPS);
public static final String IS_SCENARIO_REGEXP = "^.*" + USER_SCENARIO_ID + ".*" + US_STEP_ID + "\\d+.*";
public static final Pattern IS_SCENARIO_PATTERN = Pattern.compile(IS_SCENARIO_REGEXP);
private static final String SCENARIO_STEP_REGEXP_TEMPLATE = "^.*" + USER_SCENARIO_ID + "%s" + US_STEP_ID + "\\d+_%s.*$";
private static final String SCENARIO_REGEXP_TEMPLATE =
"(^.*" + USER_SCENARIO_ID + "%s" + US_STEP_ID + ".*$)|(^.*%s.*(-" + SUM_AGGREGATOR_ID + "|-" +
SUCCESS_RATE_AGGREGATOR_OK_ID + "|-" + SUCCESS_RATE_AGGREGATOR_FAILED_ID + ").*$)";
public static final String DISPLAY_NAME_REGEXP = "^.*(" + ITERATIONS_SAMPLES + "|" + LATENCY_SEC + "|" + SUCCESS_RATE + ").*";
public static final Pattern DISPLAY_NAME_PATTERN = Pattern.compile(DISPLAY_NAME_REGEXP);
private static final String SCENARIO_STEP_METRIC_REGEXP_TEMPLATE = "^.*" + USER_SCENARIO_ID + "{scenario_id}" + US_STEP_ID + "\\d+_{step_id}_" + US_METRIC_ID + "{metric_id}(-.*)?$";
public static String generateScenarioStepId(String scenarioId, String stepId, Integer stepIndex) {
// both scenario and scenario steps will have same format of ids
// scenario: US_[scenarioId]_STNN0_[scenarioId]
// step: US_[scenarioId]_STNN[1...N]_[stepId]
return USER_SCENARIO_ID + scenarioId + US_STEP_ID + stepIndex + "_" + stepId + "_";
}
public static String generateScenarioId(String scenarioId) {
return generateScenarioStepId(scenarioId, scenarioId, 0);
}
public static String generateMetricId(String id, String metricId) {
return id + US_METRIC_ID + metricId;
}
public static String generateMetricDisplayName(String displayName, String metricDisplayName) {
return displayName + " " + metricDisplayName;
}
public static Boolean isBelongingToScenario(String metricNodeId) {
return IS_SCENARIO_PATTERN.matcher(metricNodeId).matches();
}
public static IdContainer extractIdsFromGeneratedIdForScenarioComponents(String generatedId) {
Matcher matcher = USER_SCENARIO_PATTERN.matcher(generatedId);
if (matcher.matches()) {
String scenarioId = matcher.group(1);
String stepId = matcher.group(2);
String metricId = matcher.group(3);
return new IdContainer(scenarioId, stepId, metricId);
}
log.warn("Generated id '{}' doesn't match user scenario regexp '{}'. Will return null.", generatedId, USER_SCENARIO_REGEXP_WITH_GROUPS);
return null;
}
public static String extractDisplayNameFromGenerated(String generatedDisplayName) {
if (DISPLAY_NAME_PATTERN.matcher(generatedDisplayName).matches()) {
return removePattern(generatedDisplayName, " (" + LATENCY_SEC + "|" + ITERATIONS_SAMPLES + "|" + SUCCESS_RATE + ") \\[.*\\]");
}
log.warn("Generated display name '{}' doesn't match regexp '{}'. Will return null.", generatedDisplayName, DISPLAY_NAME_REGEXP);
return null;
}
public static String generateScenarioRegexp(String scenarioId) {
return String.format(SCENARIO_REGEXP_TEMPLATE, scenarioId, scenarioId);
}
public static String generateScenarioStepRegexp(String scenarioId, String stepId) {
return String.format(SCENARIO_STEP_REGEXP_TEMPLATE, scenarioId, stepId);
}
public static String generateScenarioStepMetricRegexp(String scenarioId, String stepId, String metricId) {
return SCENARIO_STEP_METRIC_REGEXP_TEMPLATE.replace("{scenario_id}", Pattern.quote(scenarioId))
.replace("{step_id}", Pattern.quote(stepId))
.replace("{metric_id}", Pattern.quote(metricId));
}
}