package com.griddynamics.jagger.dbapi.provider; import com.google.common.collect.Multimap; import com.griddynamics.jagger.dbapi.dto.MetricNameDto; import com.griddynamics.jagger.dbapi.dto.TaskDataDto; import com.griddynamics.jagger.dbapi.parameter.DefaultMonitoringParameters; import com.griddynamics.jagger.dbapi.parameter.GroupKey; import com.griddynamics.jagger.dbapi.util.CommonUtils; import com.griddynamics.jagger.dbapi.util.DataProcessingUtil; import com.griddynamics.jagger.dbapi.util.FetchUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceException; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Created by kgribov on 4/7/14. */ @Component public class CustomMetricNameProvider implements MetricNameProvider { private Logger log = LoggerFactory.getLogger(CustomMetricNameProvider.class); private EntityManager entityManager; private FetchUtil fetchUtil; private Map<GroupKey, DefaultMonitoringParameters[]> monitoringPlotGroups; @PersistenceContext public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } @Autowired public void setFetchUtil(FetchUtil fetchUtil) { this.fetchUtil = fetchUtil; } @Resource public void setMonitoringPlotGroups(Map<GroupKey, DefaultMonitoringParameters[]> monitoringPlotGroups) { this.monitoringPlotGroups = monitoringPlotGroups; } /** * Fetch custom metrics names from database * * @param tests tests data * @return set of MetricNameDto representing name of metric */ @Override public Set<MetricNameDto> getMetricNames(List<TaskDataDto> tests) { Set<MetricNameDto> metrics = new HashSet<>(); final long temp = System.currentTimeMillis(); metrics.addAll(getCustomMetricsNamesNewModel(tests)); metrics.addAll(getCustomTestGroupMetricsNamesNewModel(tests)); log.debug("{} ms spent for fetching {} custom metrics", System.currentTimeMillis() - temp, metrics.size()); return metrics; } private Set<MetricNameDto> getCustomMetricsNamesNewModel(List<TaskDataDto> tests) { try { Set<Long> taskIds = CommonUtils.getTestsIds(tests); List<Object[]> metricDescriptionEntities = getMetricNames(taskIds); if (metricDescriptionEntities.isEmpty()) { return Collections.emptySet(); } Set<MetricNameDto> metrics = new HashSet<>(metricDescriptionEntities.size()); for (Object[] mde : metricDescriptionEntities) { for (TaskDataDto td : tests) { if (td.getIds().contains((Long) mde[2])) { String metricName = (String) mde[0]; MetricNameDto metricNameDto = new MetricNameDto(td, metricName, (String) mde[1], MetricNameDto.Origin.METRIC); metrics.add(metricNameDto); break; } } } return metrics; } catch (PersistenceException e) { log.debug("Could not fetch data from MetricSummaryEntity: {}", DataProcessingUtil.getMessageFromLastCause(e)); return Collections.emptySet(); } } private Set<MetricNameDto> getCustomTestGroupMetricsNamesNewModel(List<TaskDataDto> tests) { try { Set<Long> taskIds = CommonUtils.getTestsIds(tests); Multimap<Long, Long> testGroupMap = fetchUtil.getTestGroupIdsByTestIds(taskIds); List<Object[]> metricDescriptionEntities = getMetricNames(testGroupMap.keySet()); metricDescriptionEntities = CommonUtils.filterMonitoring(metricDescriptionEntities, monitoringPlotGroups); if (metricDescriptionEntities.isEmpty()) { return Collections.emptySet(); } Set<MetricNameDto> metrics = new HashSet<>(metricDescriptionEntities.size()); // add test-group metric names for (Object[] mde : metricDescriptionEntities) { for (TaskDataDto td : tests) { Collection<Long> allTestsInGroup = testGroupMap.get((Long) mde[2]); if (CommonUtils.containsAtLeastOne(td.getIds(), allTestsInGroup)) { metrics.add(new MetricNameDto(td, (String) mde[0], (String) mde[1], MetricNameDto.Origin.TEST_GROUP_METRIC)); } } } return metrics; } catch (PersistenceException e) { log.debug("Could not fetch test-group data from MetricSummaryEntity: {}", DataProcessingUtil.getMessageFromLastCause(e)); return Collections.emptySet(); } } /** * @param taskIds TaskData ids * @return list of objects {MetricDescription.id, MetricDescription.dysplayName, TaskData.id} */ private List<Object[]> getMetricNames(Set<Long> taskIds) { if (taskIds.isEmpty()) { return Collections.emptyList(); } return entityManager.createQuery( "select mse.metricDescription.metricId, mse.metricDescription.displayName, mse.metricDescription.taskData.id " + "from MetricSummaryEntity as mse where mse.metricDescription.taskData.id in (:taskIds)") .setParameter("taskIds", taskIds) .getResultList(); } }