The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/public/app/plugins/datasource/influxdb/influx_series.js

156 lines
4.2 KiB

define([
'lodash',
'app/core/table_model',
],
function (_, TableModel) {
'use strict';
function InfluxSeries(options) {
this.series = options.series;
this.alias = options.alias;
this.annotation = options.annotation;
}
var p = InfluxSeries.prototype;
p.getTimeSeries = function() {
var output = [];
var self = this;
var i, j;
if (self.series.length === 0) {
return output;
}
_.each(self.series, function(series) {
var columns = series.columns.length;
var tags = _.map(series.tags, function(value, key) {
return key + ': ' + value;
});
for (j = 1; j < columns; j++) {
var seriesName = series.name;
var columnName = series.columns[j];
if (columnName !== 'value') {
seriesName = seriesName + '.' + columnName;
}
if (self.alias) {
seriesName = self._getSeriesName(series, j);
} else if (series.tags) {
seriesName = seriesName + ' {' + tags.join(', ') + '}';
}
var datapoints = [];
if (series.values) {
for (i = 0; i < series.values.length; i++) {
datapoints[i] = [series.values[i][j], series.values[i][0]];
}
}
output.push({ target: seriesName, datapoints: datapoints});
}
});
return output;
};
p._getSeriesName = function(series, index) {
var regex = /\$(\w+)|\[\[([\s\S]+?)\]\]/g;
var segments = series.name.split('.');
return this.alias.replace(regex, function(match, g1, g2) {
var group = g1 || g2;
var segIndex = parseInt(group, 10);
if (group === 'm' || group === 'measurement') { return series.name; }
if (group === 'col') { return series.columns[index]; }
if (!isNaN(segIndex)) { return segments[segIndex]; }
if (group.indexOf('tag_') !== 0) { return match; }
var tag = group.replace('tag_', '');
if (!series.tags) { return match; }
return series.tags[tag];
});
};
p.getAnnotations = function () {
var list = [];
var self = this;
_.each(this.series, function (series) {
var titleCol = null;
var timeCol = null;
var tagsCol = [];
var textCol = null;
_.each(series.columns, function(column, index) {
if (column === 'time') { timeCol = index; return; }
if (column === 'sequence_number') { return; }
if (!titleCol) { titleCol = index; }
if (column === self.annotation.titleColumn) { titleCol = index; return; }
if (_.includes((self.annotation.tagsColumn || '').replace(' ', '').split(","), column)) { tagsCol.push(index); return; }
if (column === self.annotation.textColumn) { textCol = index; return; }
});
_.each(series.values, function (value) {
var data = {
annotation: self.annotation,
time: + new Date(value[timeCol]),
title: value[titleCol],
tags: tagsCol.map(function(t) { return value[t]; }),
text: value[textCol]
};
list.push(data);
});
});
return list;
};
p.getTable = function() {
var table = new TableModel.default();
var self = this;
var i, j;
if (self.series.length === 0) {
return table;
}
_.each(self.series, function(series, seriesIndex) {
if (seriesIndex === 0) {
table.columns.push({text: 'Time', type: 'time'});
_.each(_.keys(series.tags), function(key) {
table.columns.push({text: key});
});
for (j = 1; j < series.columns.length; j++) {
table.columns.push({text: series.columns[j]});
}
}
if (series.values) {
for (i = 0; i < series.values.length; i++) {
var values = series.values[i];
var reordered = [values[0]];
if (series.tags) {
for (var key in series.tags) {
if (series.tags.hasOwnProperty(key)) {
reordered.push(series.tags[key]);
}
}
}
for (j = 1; j < values.length; j++) {
reordered.push(values[j]);
}
table.rows.push(reordered);
}
}
});
return table;
};
return InfluxSeries;
});