|
@@ -3,19 +3,27 @@ import moment from 'moment';
|
|
|
import { saveAs } from 'file-saver';
|
|
import { saveAs } from 'file-saver';
|
|
|
|
|
|
|
|
const DEFAULT_DATETIME_FORMAT = 'YYYY-MM-DDTHH:mm:ssZ';
|
|
const DEFAULT_DATETIME_FORMAT = 'YYYY-MM-DDTHH:mm:ssZ';
|
|
|
|
|
+const POINT_TIME_INDEX = 1;
|
|
|
|
|
+const POINT_VALUE_INDEX = 0;
|
|
|
|
|
|
|
|
-export function exportSeriesListToCsv(seriesList, dateTimeFormat = DEFAULT_DATETIME_FORMAT, excel = false) {
|
|
|
|
|
|
|
+export function convertSeriesListToCsv(seriesList, dateTimeFormat = DEFAULT_DATETIME_FORMAT, excel = false) {
|
|
|
var text = (excel ? 'sep=;\n' : '') + 'Series;Time;Value\n';
|
|
var text = (excel ? 'sep=;\n' : '') + 'Series;Time;Value\n';
|
|
|
_.each(seriesList, function(series) {
|
|
_.each(seriesList, function(series) {
|
|
|
_.each(series.datapoints, function(dp) {
|
|
_.each(series.datapoints, function(dp) {
|
|
|
- text += series.alias + ';' + moment(dp[1]).format(dateTimeFormat) + ';' + dp[0] + '\n';
|
|
|
|
|
|
|
+ text +=
|
|
|
|
|
+ series.alias + ';' + moment(dp[POINT_TIME_INDEX]).format(dateTimeFormat) + ';' + dp[POINT_VALUE_INDEX] + '\n';
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
|
|
+ return text;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+export function exportSeriesListToCsv(seriesList, dateTimeFormat = DEFAULT_DATETIME_FORMAT, excel = false) {
|
|
|
|
|
+ var text = convertSeriesListToCsv(seriesList, dateTimeFormat, excel);
|
|
|
saveSaveBlob(text, 'grafana_data_export.csv');
|
|
saveSaveBlob(text, 'grafana_data_export.csv');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-export function exportSeriesListToCsvColumns(seriesList, dateTimeFormat = DEFAULT_DATETIME_FORMAT, excel = false) {
|
|
|
|
|
- var text = (excel ? 'sep=;\n' : '') + 'Time;';
|
|
|
|
|
|
|
+export function convertSeriesListToCsvColumns(seriesList, dateTimeFormat = DEFAULT_DATETIME_FORMAT, excel = false) {
|
|
|
|
|
+ let text = (excel ? 'sep=;\n' : '') + 'Time;';
|
|
|
// add header
|
|
// add header
|
|
|
_.each(seriesList, function(series) {
|
|
_.each(seriesList, function(series) {
|
|
|
text += series.alias + ';';
|
|
text += series.alias + ';';
|
|
@@ -24,14 +32,15 @@ export function exportSeriesListToCsvColumns(seriesList, dateTimeFormat = DEFAUL
|
|
|
text += '\n';
|
|
text += '\n';
|
|
|
|
|
|
|
|
// process data
|
|
// process data
|
|
|
|
|
+ seriesList = mergeSeriesByTime(seriesList);
|
|
|
var dataArr = [[]];
|
|
var dataArr = [[]];
|
|
|
var sIndex = 1;
|
|
var sIndex = 1;
|
|
|
_.each(seriesList, function(series) {
|
|
_.each(seriesList, function(series) {
|
|
|
var cIndex = 0;
|
|
var cIndex = 0;
|
|
|
dataArr.push([]);
|
|
dataArr.push([]);
|
|
|
_.each(series.datapoints, function(dp) {
|
|
_.each(series.datapoints, function(dp) {
|
|
|
- dataArr[0][cIndex] = moment(dp[1]).format(dateTimeFormat);
|
|
|
|
|
- dataArr[sIndex][cIndex] = dp[0];
|
|
|
|
|
|
|
+ dataArr[0][cIndex] = moment(dp[POINT_TIME_INDEX]).format(dateTimeFormat);
|
|
|
|
|
+ dataArr[sIndex][cIndex] = dp[POINT_VALUE_INDEX];
|
|
|
cIndex++;
|
|
cIndex++;
|
|
|
});
|
|
});
|
|
|
sIndex++;
|
|
sIndex++;
|
|
@@ -46,6 +55,44 @@ export function exportSeriesListToCsvColumns(seriesList, dateTimeFormat = DEFAUL
|
|
|
text = text.substring(0, text.length - 1);
|
|
text = text.substring(0, text.length - 1);
|
|
|
text += '\n';
|
|
text += '\n';
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ return text;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * Collect all unique timestamps from series list and use it to fill
|
|
|
|
|
+ * missing points by null.
|
|
|
|
|
+ */
|
|
|
|
|
+function mergeSeriesByTime(seriesList) {
|
|
|
|
|
+ let timestamps = [];
|
|
|
|
|
+ for (let i = 0; i < seriesList.length; i++) {
|
|
|
|
|
+ let seriesPoints = seriesList[i].datapoints;
|
|
|
|
|
+ for (let j = 0; j < seriesPoints.length; j++) {
|
|
|
|
|
+ timestamps.push(seriesPoints[j][POINT_TIME_INDEX]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ timestamps = _.sortedUniq(timestamps.sort());
|
|
|
|
|
+
|
|
|
|
|
+ for (let i = 0; i < seriesList.length; i++) {
|
|
|
|
|
+ let seriesPoints = seriesList[i].datapoints;
|
|
|
|
|
+ let seriesTimestamps = _.map(seriesPoints, p => p[POINT_TIME_INDEX]);
|
|
|
|
|
+ let extendedSeries = [];
|
|
|
|
|
+ let pointIndex;
|
|
|
|
|
+ for (let j = 0; j < timestamps.length; j++) {
|
|
|
|
|
+ pointIndex = _.sortedIndexOf(seriesTimestamps, timestamps[j]);
|
|
|
|
|
+ if (pointIndex !== -1) {
|
|
|
|
|
+ extendedSeries.push(seriesPoints[pointIndex]);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ extendedSeries.push([null, timestamps[j]]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ seriesList[i].datapoints = extendedSeries;
|
|
|
|
|
+ }
|
|
|
|
|
+ return seriesList;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+export function exportSeriesListToCsvColumns(seriesList, dateTimeFormat = DEFAULT_DATETIME_FORMAT, excel = false) {
|
|
|
|
|
+ let text = convertSeriesListToCsvColumns(seriesList, dateTimeFormat, excel);
|
|
|
saveSaveBlob(text, 'grafana_data_export.csv');
|
|
saveSaveBlob(text, 'grafana_data_export.csv');
|
|
|
}
|
|
}
|
|
|
|
|
|