From d82dba013bb61788b43e4973beb0a8924b890af2 Mon Sep 17 00:00:00 2001 From: Matt Duftler Date: Mon, 12 Mar 2018 14:31:48 -0400 Subject: [PATCH] feat(prometheus): Minor cleanup relating to K8S support. (#249) --- json-formats.md | 40 +++++++++++++++++++ .../PrometheusFetchController.java | 8 ++++ .../metrics/PrometheusMetricsService.java | 5 ++- .../StackdriverFetchController.java | 8 ++++ 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/json-formats.md b/json-formats.md index e4069380e..d1eddd95b 100644 --- a/json-formats.md +++ b/json-formats.md @@ -128,6 +128,46 @@ Atlas, Stackdriver and Prometheus are used. } } ``` +```JSON +{ + "name": "MySampleK8SPrometheusCanaryConfigWithCustomFilterTemplate", + "description": "Example Kayenta Configuration with Custom Filter Template using Prometheus for K8S", + "configVersion": "1.0", + "applications": [ + "myapp" + ], + "judge": { + "name": "dredd-v1.0", + "judgeConfigurations": { } + }, + "metrics": [ + { + "name": "cpu_usage_seconds", + "query": { + "type": "prometheus", + "metricName": "container_cpu_usage_seconds_total", + "labelBindings": [ ], + "customFilterTemplate": "my-template" + }, + "groups": ["system"], + "analysisConfigurations": { }, + "scopeName": "default" + } + ], + "templates": { + "my-template": "container_name='${container_name}'" + }, + "classifier": { + "groupWeights": { + "system": 100.0 + }, + "scoreThresholds": { + "pass": 95.0, + "marginal": 75.0 + } + } +} +``` ## Canary Data Archival Format This format is used to store the results from a specific canary run. diff --git a/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/controllers/PrometheusFetchController.java b/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/controllers/PrometheusFetchController.java index 91cd22106..90090acc3 100644 --- a/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/controllers/PrometheusFetchController.java +++ b/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/controllers/PrometheusFetchController.java @@ -92,6 +92,14 @@ public Map queryMetrics(@RequestParam(required = false) final String metricsAcco start = determineDefaultProperty(start, "start", prometheusConfigurationTestControllerDefaultProperties); end = determineDefaultProperty(end, "end", prometheusConfigurationTestControllerDefaultProperties); + if (StringUtils.isEmpty(start)) { + throw new IllegalArgumentException("Start time is required."); + } + + if (StringUtils.isEmpty(end)) { + throw new IllegalArgumentException("End time is required."); + } + String resolvedMetricsAccountName = CredentialsHelper.resolveAccountByNameOrType(metricsAccountName, AccountCredentials.Type.METRICS_STORE, accountCredentialsRepository); diff --git a/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/metrics/PrometheusMetricsService.java b/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/metrics/PrometheusMetricsService.java index 0318cd58d..a7db78570 100644 --- a/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/metrics/PrometheusMetricsService.java +++ b/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/metrics/PrometheusMetricsService.java @@ -105,9 +105,10 @@ private StringBuilder addScopeFilter(StringBuilder queryBuilder, } else if ("aws_ec2_instance".equals(resourceType)) { addEC2Filters("asg_groupName", scope, region, filters); } else { - log.warn("There is no explicit support for resourceType '" + resourceType + "'. Your mileage may vary."); + throw new IllegalArgumentException("There is no explicit support for resourceType '" + resourceType + "'. " + + "You may build whatever query makes sense for your environment via label " + + "bindings and custom filter templates."); } - // TODO(duftler): Add support for K8S resource types. } else { List customFilterTokens = Arrays.asList(customFilter.split(",")); diff --git a/kayenta-stackdriver/src/main/java/com/netflix/kayenta/stackdriver/controllers/StackdriverFetchController.java b/kayenta-stackdriver/src/main/java/com/netflix/kayenta/stackdriver/controllers/StackdriverFetchController.java index 6f5fec8f0..69e8bba5c 100644 --- a/kayenta-stackdriver/src/main/java/com/netflix/kayenta/stackdriver/controllers/StackdriverFetchController.java +++ b/kayenta-stackdriver/src/main/java/com/netflix/kayenta/stackdriver/controllers/StackdriverFetchController.java @@ -95,6 +95,14 @@ public Map queryMetrics(@RequestParam(required = false) final String metricsAcco startTimeIso = determineDefaultProperty(startTimeIso, "start", stackdriverConfigurationTestControllerDefaultProperties); endTimeIso = determineDefaultProperty(endTimeIso, "end", stackdriverConfigurationTestControllerDefaultProperties); + if (StringUtils.isEmpty(startTimeIso)) { + throw new IllegalArgumentException("Start time is required."); + } + + if (StringUtils.isEmpty(endTimeIso)) { + throw new IllegalArgumentException("End time is required."); + } + String resolvedMetricsAccountName = CredentialsHelper.resolveAccountByNameOrType(metricsAccountName, AccountCredentials.Type.METRICS_STORE, accountCredentialsRepository);