forked from grafana/grafana
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request grafana#3472 from mtanda/prometheus_query_template
(prometheus) templating by query result
- Loading branch information
Showing
6 changed files
with
230 additions
and
119 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 2 additions & 0 deletions
2
public/app/plugins/datasource/prometheus/metric_find_query.d.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
declare var test: any; | ||
export default test; |
125 changes: 125 additions & 0 deletions
125
public/app/plugins/datasource/prometheus/metric_find_query.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
define([ | ||
'lodash', | ||
'moment', | ||
], | ||
function (_, moment) { | ||
'use strict'; | ||
|
||
function PrometheusMetricFindQuery(datasource, query) { | ||
this.datasource = datasource; | ||
this.query = query; | ||
} | ||
|
||
PrometheusMetricFindQuery.prototype.process = function() { | ||
var label_values_regex = /^label_values\(([^,]+)(?:,\s*(.+))?\)$/; | ||
var metric_names_regex = /^metrics\((.+)\)$/; | ||
var query_result_regex = /^query_result\((.+)\)$/; | ||
|
||
var label_values_query = this.query.match(label_values_regex); | ||
if (label_values_query) { | ||
if (label_values_query[2]) { | ||
return this.labelValuesQuery(label_values_query[2], label_values_query[1]); | ||
} else { | ||
return this.labelValuesQuery(label_values_query[1], null); | ||
} | ||
} | ||
|
||
var metric_names_query = this.query.match(metric_names_regex); | ||
if (metric_names_query) { | ||
return this.metricNameQuery(metric_names_query[1]); | ||
} | ||
|
||
var query_result_query = this.query.match(query_result_regex); | ||
if (query_result_query) { | ||
return this.queryResultQuery(query_result_query[1]); | ||
} | ||
|
||
// if query contains full metric name, return metric name and label list | ||
return this.metricNameAndLabelsQuery(this.query); | ||
}; | ||
|
||
PrometheusMetricFindQuery.prototype.labelValuesQuery = function(label, metric) { | ||
var url; | ||
|
||
if (!metric) { | ||
// return label values globally | ||
url = '/api/v1/label/' + label + '/values'; | ||
|
||
return this.datasource._request('GET', url).then(function(result) { | ||
return _.map(result.data.data, function(value) { | ||
return {text: value}; | ||
}); | ||
}); | ||
} else { | ||
url = '/api/v1/series?match[]=' + encodeURIComponent(metric); | ||
|
||
return this.datasource._request('GET', url) | ||
.then(function(result) { | ||
return _.map(result.data.data, function(metric) { | ||
return { | ||
text: metric[label], | ||
expandable: true | ||
}; | ||
}); | ||
}); | ||
} | ||
}; | ||
|
||
PrometheusMetricFindQuery.prototype.metricNameQuery = function(metricFilterPattern) { | ||
var url = '/api/v1/label/__name__/values'; | ||
|
||
return this.datasource._request('GET', url) | ||
.then(function(result) { | ||
return _.chain(result.data.data) | ||
.filter(function(metricName) { | ||
var r = new RegExp(metricFilterPattern); | ||
return r.test(metricName); | ||
}) | ||
.map(function(matchedMetricName) { | ||
return { | ||
text: matchedMetricName, | ||
expandable: true | ||
}; | ||
}) | ||
.value(); | ||
}); | ||
}; | ||
|
||
PrometheusMetricFindQuery.prototype.queryResultQuery = function(query) { | ||
var url = '/api/v1/query?query=' + encodeURIComponent(query) + '&time=' + (moment().valueOf() / 1000); | ||
|
||
return this.datasource._request('GET', url) | ||
.then(function(result) { | ||
return _.map(result.data.data.result, function(metricData) { | ||
var text = metricData.metric.__name__ || ''; | ||
delete metricData.metric.__name__; | ||
text += '{' + | ||
_.map(metricData.metric, function(v, k) { return k + '="' + v + '"'; }).join(',') + | ||
'}'; | ||
text += ' ' + metricData.value[1] + ' ' + metricData.value[0] * 1000; | ||
|
||
return { | ||
text: text, | ||
expandable: true | ||
}; | ||
}); | ||
}); | ||
}; | ||
|
||
PrometheusMetricFindQuery.prototype.metricNameAndLabelsQuery = function(query) { | ||
var url = '/api/v1/series?match[]=' + encodeURIComponent(query); | ||
|
||
var self = this; | ||
return this.datasource._request('GET', url) | ||
.then(function(result) { | ||
return _.map(result.data.data, function(metric) { | ||
return { | ||
text: self.datasource.getOriginalMetricName(metric), | ||
expandable: true | ||
}; | ||
}); | ||
}); | ||
}; | ||
|
||
return PrometheusMetricFindQuery; | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.