diff --git a/public/app/plugins/datasource/prometheus/datasource.ts b/public/app/plugins/datasource/prometheus/datasource.ts
index 235198b21ba..e3f5cc474f5 100644
--- a/public/app/plugins/datasource/prometheus/datasource.ts
+++ b/public/app/plugins/datasource/prometheus/datasource.ts
@@ -99,6 +99,7 @@ export class PrometheusDatasource {
var query: any = {};
query.expr = this.templateSrv.replace(target.expr, options.scopedVars, self.interpolateQueryExpr);
query.requestId = options.panelId + target.refId;
+ query.instant = target.instant;
var interval = this.templateSrv.replace(target.interval, options.scopedVars) || options.interval;
var intervalFactor = target.intervalFactor || 1;
@@ -114,7 +115,11 @@ export class PrometheusDatasource {
}
var allQueryPromise = _.map(queries, query => {
- return this.performTimeSeriesQuery(query, start, end);
+ if (!query.instant) {
+ return this.performTimeSeriesQuery(query, start, end);
+ } else {
+ return this.performInstantQuery(query, end);
+ }
});
return this.$q.all(allQueryPromise).then(responseList => {
@@ -129,7 +134,11 @@ export class PrometheusDatasource {
result.push(self.transformMetricDataToTable(response.data.data.result));
} else {
for (let metricData of response.data.data.result) {
- result.push(self.transformMetricData(metricData, activeTargets[index], start, end));
+ if (response.data.data.resultType === 'matrix') {
+ result.push(self.transformMetricData(metricData, activeTargets[index], start, end));
+ } else if (response.data.data.resultType === 'vector') {
+ result.push(self.transformInstantMetricData(metricData, activeTargets[index]));
+ }
}
}
});
@@ -156,6 +165,11 @@ export class PrometheusDatasource {
return this._request('GET', url, query.requestId);
}
+ performInstantQuery(query, time) {
+ var url = '/api/v1/query?query=' + encodeURIComponent(query.expr) + '&time=' + time;
+ return this._request('GET', url, query.requestId);
+ }
+
performSuggestQuery(query, cache = false) {
var url = '/api/v1/label/__name__/values';
@@ -317,6 +331,9 @@ export class PrometheusDatasource {
// Populate rows, set value to empty string when label not present.
_.each(md, function(series) {
+ if (series.value) {
+ series.values = [series.value];
+ }
if (series.values) {
for (i = 0; i < series.values.length; i++) {
var values = series.values[i];
@@ -340,6 +357,13 @@ export class PrometheusDatasource {
return table;
}
+ transformInstantMetricData(md, options) {
+ var dps = [], metricLabel = null;
+ metricLabel = this.createMetricLabel(md.metric, options);
+ dps.push([parseFloat(md.value[1]), md.value[0] * 1000]);
+ return { target: metricLabel, datapoints: dps };
+ }
+
createMetricLabel(labelData, options) {
if (_.isUndefined(options) || _.isEmpty(options.legendFormat)) {
return this.getOriginalMetricName(labelData);
diff --git a/public/app/plugins/datasource/prometheus/metric_find_query.js b/public/app/plugins/datasource/prometheus/metric_find_query.js
index a33044fddf6..6bfd324cd6e 100644
--- a/public/app/plugins/datasource/prometheus/metric_find_query.js
+++ b/public/app/plugins/datasource/prometheus/metric_find_query.js
@@ -95,9 +95,7 @@ function (_) {
PrometheusMetricFindQuery.prototype.queryResultQuery = function(query) {
var end = this.datasource.getPrometheusTime(this.range.to, true);
- var url = '/api/v1/query?query=' + encodeURIComponent(query) + '&time=' + end;
-
- return this.datasource._request('GET', url)
+ return this.datasource.performInstantQuery({ expr: query }, end)
.then(function(result) {
return _.map(result.data.data.result, function(metricData) {
var text = metricData.metric.__name__ || '';
diff --git a/public/app/plugins/datasource/prometheus/partials/query.editor.html b/public/app/plugins/datasource/prometheus/partials/query.editor.html
index 9b06d4116f4..98fd01eee15 100644
--- a/public/app/plugins/datasource/prometheus/partials/query.editor.html
+++ b/public/app/plugins/datasource/prometheus/partials/query.editor.html
@@ -45,6 +45,8 @@
+
+