From 0052e9d13623961b4abe3a7c18fa88030b9427d8 Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Fri, 11 Mar 2016 14:58:29 +0900 Subject: [PATCH 1/4] (cloudwatch) add ec2_instance_attribute() query --- .../datasource/cloudwatch/datasource.js | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/public/app/plugins/datasource/cloudwatch/datasource.js b/public/app/plugins/datasource/cloudwatch/datasource.js index 06c723e416a..5d093640b1e 100644 --- a/public/app/plugins/datasource/cloudwatch/datasource.js +++ b/public/app/plugins/datasource/cloudwatch/datasource.js @@ -143,7 +143,7 @@ function (angular, _, moment, dateMath, CloudWatchAnnotationQuery) { return this.awsRequest({ region: region, action: 'DescribeInstances', - parameters: { filter: filters, instanceIds: instanceIds } + parameters: { filters: filters, instanceIds: instanceIds } }); }; @@ -205,6 +205,28 @@ function (angular, _, moment, dateMath, CloudWatchAnnotationQuery) { }); } + var ec2InstanceAttributeQuery = query.match(/^ec2_instance_attribute\(([^,]+?),\s?([^,]+?),\s?([^)]+)\)/); + if (ec2InstanceAttributeQuery) { + region = templateSrv.replace(ec2InstanceAttributeQuery[1]); + var filterJson = JSON.parse(templateSrv.replace(ec2InstanceAttributeQuery[3])); + var filter = _.map(filterJson, function(f) { + return { + Name: f.slice(0, f.indexOf('=')), + Values: f.slice(f.indexOf('=') + 1).split(',') + }; + }); + var targetAttributeName = templateSrv.replace(ec2InstanceAttributeQuery[2]); + + return this.performEC2DescribeInstances(region, filter, null).then(function(result) { + var attributes = _.chain(result.Reservations) + .map(function(reservations) { + return _.pluck(reservations.Instances, targetAttributeName); + }) + .flatten().value(); + return transformSuggestData(attributes); + }); + } + return $q.when([]); }; From 25f08ddd39661b571d767a8ecae07f13cd6eca1d Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Fri, 11 Mar 2016 16:59:06 +0900 Subject: [PATCH 2/4] (cloudwatch) change parameter form of ec2_instance_attribute() --- public/app/plugins/datasource/cloudwatch/datasource.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/app/plugins/datasource/cloudwatch/datasource.js b/public/app/plugins/datasource/cloudwatch/datasource.js index 5d093640b1e..cdaeebb83b8 100644 --- a/public/app/plugins/datasource/cloudwatch/datasource.js +++ b/public/app/plugins/datasource/cloudwatch/datasource.js @@ -205,14 +205,14 @@ function (angular, _, moment, dateMath, CloudWatchAnnotationQuery) { }); } - var ec2InstanceAttributeQuery = query.match(/^ec2_instance_attribute\(([^,]+?),\s?([^,]+?),\s?([^)]+)\)/); + var ec2InstanceAttributeQuery = query.match(/^ec2_instance_attribute\(([^,]+?),\s?([^,]+?),\s?(.+?)\)/); if (ec2InstanceAttributeQuery) { region = templateSrv.replace(ec2InstanceAttributeQuery[1]); var filterJson = JSON.parse(templateSrv.replace(ec2InstanceAttributeQuery[3])); - var filter = _.map(filterJson, function(f) { + var filter = _.map(filterJson, function(values, name) { return { - Name: f.slice(0, f.indexOf('=')), - Values: f.slice(f.indexOf('=') + 1).split(',') + Name: name, + Values: values }; }); var targetAttributeName = templateSrv.replace(ec2InstanceAttributeQuery[2]); From b989e2ce37fdaa9b14f142e6c61b309123f6aa0a Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Fri, 11 Mar 2016 17:04:42 +0900 Subject: [PATCH 3/4] minor fix --- public/app/plugins/datasource/cloudwatch/datasource.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/app/plugins/datasource/cloudwatch/datasource.js b/public/app/plugins/datasource/cloudwatch/datasource.js index cdaeebb83b8..704cbd41e72 100644 --- a/public/app/plugins/datasource/cloudwatch/datasource.js +++ b/public/app/plugins/datasource/cloudwatch/datasource.js @@ -209,7 +209,7 @@ function (angular, _, moment, dateMath, CloudWatchAnnotationQuery) { if (ec2InstanceAttributeQuery) { region = templateSrv.replace(ec2InstanceAttributeQuery[1]); var filterJson = JSON.parse(templateSrv.replace(ec2InstanceAttributeQuery[3])); - var filter = _.map(filterJson, function(values, name) { + var filters = _.map(filterJson, function(values, name) { return { Name: name, Values: values @@ -217,7 +217,7 @@ function (angular, _, moment, dateMath, CloudWatchAnnotationQuery) { }); var targetAttributeName = templateSrv.replace(ec2InstanceAttributeQuery[2]); - return this.performEC2DescribeInstances(region, filter, null).then(function(result) { + return this.performEC2DescribeInstances(region, filters, null).then(function(result) { var attributes = _.chain(result.Reservations) .map(function(reservations) { return _.pluck(reservations.Instances, targetAttributeName); From 01788e86e5b63e0508924e788ea1ef9866b790db Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Fri, 11 Mar 2016 18:14:29 +0900 Subject: [PATCH 4/4] (cloudwatch) add document for new query --- docs/sources/datasources/cloudwatch.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/sources/datasources/cloudwatch.md b/docs/sources/datasources/cloudwatch.md index 4d9d8b38c1c..351b08eb2aa 100644 --- a/docs/sources/datasources/cloudwatch.md +++ b/docs/sources/datasources/cloudwatch.md @@ -64,9 +64,19 @@ Name | Description `metrics(namespace)` | Returns a list of metrics in the namespace. `dimension_keys(namespace)` | Returns a list of dimension keys in the namespace. `dimension_values(region, namespace, metric, dimension_key)` | Returns a list of dimension values matching the specified `region`, `namespace`, `metric` and `dimension_key`. +`ebs_volume_ids(region, instance_id)` | Returns a list of volume id matching the specified `region`, `instance_id`. +`ec2_instance_attribute(region, attribute_name, filters)` | Returns a list of attribute matching the specified `region`, `attribute_name`, `filters`. For details about the metrics CloudWatch provides, please refer to the [CloudWatch documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html). +The `ec2_instance_attribute` query take `filters` in JSON format. +You can specify [pre-defined filters of ec2:DescribeInstances](http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html). +Specify like `{ filter_name1: [ filter_value1 ], filter_name2: [ filter_value2 ] }` + +Example `ec2_instance_attribute()` query + + ec2_instance_attribute(us-east-1, InstanceId, { "tag:Environment": [ "production" ] }) + ![](/img/v2/cloudwatch_templating.png) ## Cost