package com.griddynamics.jagger.dbapi.model.rules;
import com.griddynamics.jagger.dbapi.parameter.DefaultMonitoringParameters;
import com.griddynamics.jagger.dbapi.parameter.GroupKey;
import com.griddynamics.jagger.util.StandardMetricsNamesUtil;
import com.griddynamics.jagger.util.StandardMetricsNamesUtil.IdContainer;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.google.common.collect.Lists.newArrayList;
import static com.griddynamics.jagger.util.StandardMetricsNamesUtil.extractDisplayNameFromGenerated;
import static com.griddynamics.jagger.util.StandardMetricsNamesUtil.extractIdsFromGeneratedIdForScenarioComponents;
import static com.griddynamics.jagger.util.StandardMetricsNamesUtil.generateScenarioRegexp;
import static com.griddynamics.jagger.util.StandardMetricsNamesUtil.generateScenarioStepRegexp;
@SuppressWarnings("Duplicates")
@Component
public class TreeViewGroupRuleProvider {
private Map<GroupKey, DefaultMonitoringParameters[]> monitoringPlotGroups;
@Resource
public void setMonitoringPlotGroups(Map<GroupKey, DefaultMonitoringParameters[]> monitoringPlotGroups) {
this.monitoringPlotGroups = monitoringPlotGroups;
}
public TreeViewGroupRule provide(String rootId, String rootName, Map<String, String> scenarioComponentsIdToDisplayName) {
List<TreeViewGroupRule> firstLevelFilters = new ArrayList<>();
String filterRegex = "(" +
"^" + StandardMetricsNamesUtil.THROUGHPUT_TPS + "$|" +
"^" + StandardMetricsNamesUtil.THROUGHPUT + "$|" +
"^" + StandardMetricsNamesUtil.LATENCY_SEC + ".*" + "$|" +
"^" + StandardMetricsNamesUtil.LATENCY_STD_DEV_SEC + "$|" +
"^" + StandardMetricsNamesUtil.ITERATIONS_SAMPLES + "$|" +
"^" + StandardMetricsNamesUtil.SUCCESS_RATE + ".*" + "$|" +
"^" + StandardMetricsNamesUtil.DURATION_SEC + "$|" +
"^" + StandardMetricsNamesUtil.TIME_LATENCY_PERCENTILE + "$|" +
"^" + StandardMetricsNamesUtil.VIRTUAL_USERS + ".*" + "$" +
")";
// Filter for Jagger main metrics. Space in display name will help to keep main parameters in the
// top of alphabetic sorting
TreeViewGroupRule mainParamsFirstLevelFilter = new TreeViewGroupRule(Rule.By.DISPLAY_NAME, "main", " Main parameters", filterRegex);
firstLevelFilters.add(mainParamsFirstLevelFilter);
// Filters for Jagger monitoring parameters
for (Map.Entry<GroupKey, DefaultMonitoringParameters[]> groupKeyEntry : monitoringPlotGroups.entrySet()) {
String groupDisplayName = groupKeyEntry.getKey().getUpperName();
String regex = "";
for (DefaultMonitoringParameters defaultMonitoringParameters : groupKeyEntry.getValue()) {
// not first / first time
if (regex.length() != 0) {
regex += "|";
} else {
regex += "^.*(";
}
regex += defaultMonitoringParameters.getId();
}
regex += ").*";
firstLevelFilters.add(new TreeViewGroupRule(Rule.By.ID, groupDisplayName, groupDisplayName, regex));
}
// Filters for user scenarios
Map<String, Map<String, TreeViewGroupRule>> scenarioStepsRules = new HashMap<>();
Map<String, String> scenarioRegexps = new HashMap<>();
Map<String, String> scenarioDisplayNames = new HashMap<>();
scenarioComponentsIdToDisplayName.forEach((generatedId, generatedDisplayName) -> {
IdContainer originalIds = extractIdsFromGeneratedIdForScenarioComponents(generatedId);
String originalDisplayName = extractDisplayNameFromGenerated(generatedDisplayName);
if (originalIds != null) {
// if step
if (!originalIds.getScenarioId().equals(originalIds.getStepId())) {
String nodeId = originalIds.getScenarioId() + ":" + originalIds.getStepId();
String nodeDisplayName = originalDisplayName != null ? originalDisplayName : originalIds.getStepId();
String filter = generateScenarioStepRegexp(originalIds.getScenarioId(), originalIds.getStepId());
TreeViewGroupRule userStepFilter = new TreeViewGroupRule(Rule.By.ID, nodeId, nodeDisplayName, filter);
if (scenarioStepsRules.containsKey(originalIds.getScenarioId())) {
scenarioStepsRules.get(originalIds.getScenarioId()).put(originalIds.getStepId(), userStepFilter);
} else {
HashMap<String, TreeViewGroupRule> map = new HashMap<>();
map.put(originalIds.getStepId(), userStepFilter);
scenarioStepsRules.put(originalIds.getScenarioId(), map);
}
// if scenario
} else {
scenarioRegexps.putIfAbsent(originalIds.getScenarioId(), generateScenarioRegexp(originalIds.getScenarioId()));
scenarioDisplayNames.putIfAbsent(originalIds.getScenarioId(), originalDisplayName);
}
}
});
scenarioRegexps.forEach((scenarioId, filter) -> {
List<TreeViewGroupRule> childrenRules = newArrayList(scenarioStepsRules.get(scenarioId).values());
String displayName = scenarioDisplayNames.get(scenarioId);
firstLevelFilters.add(new TreeViewGroupRule(Rule.By.ID, scenarioId, displayName, filter, childrenRules));
});
// Root filter - will match all metrics
return new TreeViewGroupRule(Rule.By.ID, rootId, rootName, ".*", firstLevelFilters);
}
}