private InfluxdbCanaryMetricSetQueryConfig queryConfig(String measurement, List<String> fieldsList) { InfluxdbCanaryMetricSetQueryConfig queryConfig = InfluxdbCanaryMetricSetQueryConfig.builder().metricName(measurement).fields(fieldsList).build(); return queryConfig; }
private List<String> handleFields(InfluxdbCanaryMetricSetQueryConfig queryConfig) { List<String> fields = queryConfig.getFields(); if (CollectionUtils.isEmpty(fields)) { if(fields == null) { fields = new ArrayList<>(); } fields.add(ALL_FIELDS); } return fields; }
private static StringBuilder addGroupByQuery(StringBuilder queryBuilder, PrometheusCanaryMetricSetQueryConfig queryConfig) { List<String> groupByFields = queryConfig.getGroupByFields(); if (!CollectionUtils.isEmpty(groupByFields)) { queryBuilder.append(" by ("); String sep = ""; for (String elem : groupByFields) { queryBuilder.append(sep); queryBuilder.append(elem); sep = ","; } queryBuilder.append(")"); } return queryBuilder; }
.builder() .metricName(metricName) .labelBindings(labelBindings) .groupByFields(groupByFields); prometheusCanaryMetricSetQueryConfigBuilder.resourceType(resourceType); prometheusCanaryMetricSetQueryConfigBuilder.customInlineTemplate(customFilter); .builder() .name(metricSetName) .query(prometheusCanaryMetricSetQueryConfigBuilder.build()) .build();
@Override public String buildQuery(String metricsAccountName, CanaryConfig canaryConfig, CanaryMetricConfig canaryMetricConfig, CanaryScope canaryScope) throws IOException { PrometheusCanaryMetricSetQueryConfig queryConfig = (PrometheusCanaryMetricSetQueryConfig)canaryMetricConfig.getQuery(); PrometheusCanaryScope prometheusCanaryScope = (PrometheusCanaryScope)canaryScope; String resourceType = StringUtils.hasText(queryConfig.getResourceType()) ? queryConfig.getResourceType() : prometheusCanaryScope.getResourceType(); String customFilter = QueryConfigUtils.expandCustomFilter( canaryConfig, queryConfig, prometheusCanaryScope, new String[]{"project", "resourceType", "scope", "location"}); if (!StringUtils.isEmpty(customFilter) && customFilter.startsWith("PromQL:")) { String promQlExpr = customFilter.substring(7); log.debug("Detected complete PromQL expression: {}", promQlExpr); return promQlExpr; } else { StringBuilder queryBuilder = new StringBuilder(queryConfig.getMetricName()); queryBuilder = addScopeFilter(queryBuilder, prometheusCanaryScope, resourceType, queryConfig, customFilter); queryBuilder = addAvgQuery(queryBuilder); queryBuilder = addGroupByQuery(queryBuilder, queryConfig); log.debug("query={}", queryBuilder); return queryBuilder.toString(); } }
@Override public String buildQuery(String metricsAccountName, CanaryConfig canaryConfig, CanaryMetricConfig canaryMetricConfig, CanaryScope canaryScope) { SignalFxScopeConfiguration scopeConfiguration = signalFxScopeConfigurationMap.get(metricsAccountName); SignalFxCanaryScope signalFxCanaryScope = (SignalFxCanaryScope) canaryScope; SignalFxCanaryMetricSetQueryConfig queryConfig = (SignalFxCanaryMetricSetQueryConfig) canaryMetricConfig.getQuery(); String aggregationMethod = Optional.ofNullable(queryConfig.getAggregationMethod()).orElse("mean"); List<QueryPair> queryPairs = Optional.ofNullable(queryConfig.getQueryPairs()).orElse(new LinkedList<>()); return SimpleSignalFlowProgramBuilder .create(queryConfig.getMetricName(), aggregationMethod, scopeConfiguration) .withQueryPairs(queryPairs) .withScope(signalFxCanaryScope) .build(); }
graphiteCanaryMetricSetQueryConfigBuilder = GraphiteCanaryMetricSetQueryConfig.builder(); graphiteCanaryMetricSetQueryConfigBuilder.metricName(metricName); .query(graphiteCanaryMetricSetQueryConfigBuilder.build()) .build();
.builder() .metricName(metricName) .build();
public String build() { StringBuilder program = new StringBuilder("data('").append(metricName).append("', filter="); List<String> filters = new LinkedList<>(); if (queryPairs.size() > 0) { filters.add(queryPairs.stream() .map(qp -> String.format(FILTER_TEMPLATE, qp.getKey(), qp.getValue())) .collect(Collectors.joining(" and "))); } filters.addAll(filterSegments); if (!filters.isEmpty()) { program.append(String.join(" and ", filters)); } program.append(")"); program.append('.').append(aggregationMethod) .append("(by=['") .append(String.join("', '", scopeKeys)) .append("'])"); program.append(".publish()"); return program.toString(); } }
@Override public String buildQuery(String metricsAccountName, CanaryConfig canaryConfig, CanaryMetricConfig canaryMetricConfig, CanaryScope canaryScope) throws IOException { GraphiteCanaryMetricSetQueryConfig queryConfig = (GraphiteCanaryMetricSetQueryConfig) canaryMetricConfig.getQuery(); String query = queryConfig.getMetricName(); if (!Strings.isNullOrEmpty(canaryScope.getScope())) { query = query.replace(SCOPE_VARIABLE, canaryScope.getScope()); } if (!Strings.isNullOrEmpty(canaryScope.getLocation())) { query = query.replace(LOCATION_VARIABLE, canaryScope.getLocation()); } log.debug("Query sent to graphite: {}.", query); return query; }
private CanaryMetricConfigWithResults queryMetric(CanaryMetricConfig metric, AtlasCanaryScope scope) { long step = Duration.ofSeconds(scope.getStep()).toMillis(); long start = scope.getStart().toEpochMilli() / step * step; long end = scope.getEnd().toEpochMilli() / step * step; long count = (end - start) / step; AtlasCanaryMetricSetQueryConfig atlasMetricSetQuery = (AtlasCanaryMetricSetQueryConfig)metric.getQuery(); AtlasResults results = AtlasResults.builder() .id("dummyId") .start(start) .end(end) .label("dummyLabel") .query(atlasMetricSetQuery.getQ() + "," + scope.cq()) .step(step) .type("timeseries") .data(TimeseriesData.dummy("array", count)) .build(); return CanaryMetricConfigWithResults.builder() .canaryMetricConfig(metric) .atlasResults(Collections.singletonList(results)) .build(); }
private void validateManadtoryParams(InfluxdbCanaryMetricSetQueryConfig queryConfig, CanaryScope canaryScope) { if (StringUtils.isEmpty(queryConfig.getMetricName())) { throw new IllegalArgumentException("Measurement is required to query metrics"); } if (null == canaryScope) { throw new IllegalArgumentException("CanaryScope is missing"); } if (null == canaryScope.getStart() || null == canaryScope.getEnd()) { throw new IllegalArgumentException("Start and End times are required"); } }
@Override public String buildQuery(String metricsAccountName, CanaryConfig canaryConfig, CanaryMetricConfig canaryMetricConfig, CanaryScope canaryScope) { DatadogCanaryMetricSetQueryConfig queryConfig = (DatadogCanaryMetricSetQueryConfig)canaryMetricConfig.getQuery(); return queryConfig.getMetricName() + "{" + canaryScope.getScope() + "}"; }
@Test @UseDataProvider("locationScopeProvider") public void test_that_the_program_builder_builds_the_expected_program_when_location_is_provided( SignalFxCanaryScope scope, SignalFxScopeConfiguration scopeConfiguration) { String metricName = "request.count"; String aggregationMethod = "mean"; SimpleSignalFlowProgramBuilder builder = SimpleSignalFlowProgramBuilder .create(metricName, aggregationMethod, scopeConfiguration); builder.withQueryPair(new QueryPair("app", "cms")); builder.withQueryPair(new QueryPair("response_code", "400")); builder.withQueryPair(new QueryPair("uri", "/v2/auth/iam-principal")); builder.withScope(scope); String expected = "data('request.count', filter=" + "filter('app', 'cms') " + "and filter('response_code', '400') " + "and filter('uri', '/v2/auth/iam-principal') " + "and filter('version', '1.0.0') " + "and filter('region', 'us-west-2') " + "and filter('env', 'production'))" + ".mean(by=['env', 'region', 'version']).publish()"; assertEquals(expected, builder.build()); }
public String build(InfluxdbCanaryMetricSetQueryConfig queryConfig, CanaryScope canaryScope) { validateManadtoryParams(queryConfig, canaryScope); StringBuilder query = new StringBuilder(); addBaseQuery(queryConfig.getMetricName(), handleFields(queryConfig), query); addTimeRangeFilter(canaryScope, query); addScopeFilter(canaryScope, query); log.debug("Built query: {}", query.toString()); return query.toString(); }
@Test public void test_that_the_program_builder_builds_the_expected_program_with_extra_scope_qp_pairs() { String metricName = "request.count"; String aggregationMethod = "mean"; SignalFxCanaryScope scope = new SignalFxCanaryScope(); SignalFxScopeConfiguration scopeConfiguration = new SignalFxScopeConfiguration(); scope.setScope("1.0.0"); scope.setScopeKey("version"); scope.setExtendedScopeParams(ImmutableMap.of( "env", "production", "region", "us-west-2", "_scope_key", "version")); SimpleSignalFlowProgramBuilder builder = SimpleSignalFlowProgramBuilder .create(metricName, aggregationMethod, scopeConfiguration); builder.withQueryPair(new QueryPair("app", "cms")); builder.withQueryPair(new QueryPair("response_code", "400")); builder.withQueryPair(new QueryPair("uri", "/v2/auth/iam-principal")); builder.withScope(scope); String expected = "data('request.count', filter=" + "filter('app', 'cms') " + "and filter('response_code', '400') " + "and filter('uri', '/v2/auth/iam-principal') " + "and filter('version', '1.0.0') " + "and filter('env', 'production') " + "and filter('region', 'us-west-2'))" + ".mean(by=['env', 'region', 'version']).publish()"; assertEquals(expected, builder.build()); }
@Test public void test_that_the_program_builder_builds_the_expected_program_no_location_key() { String metricName = "request.count"; String aggregationMethod = "mean"; SignalFxCanaryScope scope = new SignalFxCanaryScope(); SignalFxScopeConfiguration scopeConfiguration = new SignalFxScopeConfiguration(); scope.setScope("1.0.0"); scope.setScopeKey("version"); scope.setExtendedScopeParams(ImmutableMap.of( "env", "production", "_scope_key", "version")); SimpleSignalFlowProgramBuilder builder = SimpleSignalFlowProgramBuilder .create(metricName, aggregationMethod, scopeConfiguration); builder.withQueryPair(new QueryPair("app", "cms")); builder.withQueryPair(new QueryPair("response_code", "400")); builder.withQueryPair(new QueryPair("uri", "/v2/auth/iam-principal")); builder.withScope(scope); String expected = "data('request.count', filter=" + "filter('app', 'cms') " + "and filter('response_code', '400') " + "and filter('uri', '/v2/auth/iam-principal') " + "and filter('version', '1.0.0') " + "and filter('env', 'production'))" + ".mean(by=['env', 'version']).publish()"; assertEquals(expected, builder.build()); }
@Test public void test_that_the_program_builder_builds_the_expected_program_1_qp() { String metricName = "request.count"; String aggregationMethod = "mean"; SignalFxCanaryScope scope = new SignalFxCanaryScope(); SignalFxScopeConfiguration scopeConfiguration = new SignalFxScopeConfiguration(); scope.setScope("1.0.0"); scope.setScopeKey("version"); scope.setExtendedScopeParams(ImmutableMap.of( "env", "production", "_scope_key", "version")); SimpleSignalFlowProgramBuilder builder = SimpleSignalFlowProgramBuilder .create(metricName, aggregationMethod, scopeConfiguration); builder.withQueryPair(new QueryPair("app", "cms")); builder.withScope(scope); String expected = "data('request.count', filter=" + "filter('app', 'cms') " + "and filter('version', '1.0.0') " + "and filter('env', 'production'))" + ".mean(by=['env', 'version']).publish()"; assertEquals(expected, builder.build()); }