mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Use the ConvertSqlTimeColumnToEpochMs function to convert any native datetime data type or epoch time (millisecond precision). Additional tests and update of existing due to timezone issues running postgres on UTC and dev environment on non-utc. Added test dashboard.
147 lines
3.5 KiB
TypeScript
147 lines
3.5 KiB
TypeScript
import _ from 'lodash';
|
|
|
|
export default class ResponseParser {
|
|
constructor(private $q) {}
|
|
|
|
processQueryResult(res) {
|
|
var data = [];
|
|
|
|
if (!res.data.results) {
|
|
return { data: data };
|
|
}
|
|
|
|
for (let key in res.data.results) {
|
|
let queryRes = res.data.results[key];
|
|
|
|
if (queryRes.series) {
|
|
for (let series of queryRes.series) {
|
|
data.push({
|
|
target: series.name,
|
|
datapoints: series.points,
|
|
refId: queryRes.refId,
|
|
meta: queryRes.meta,
|
|
});
|
|
}
|
|
}
|
|
|
|
if (queryRes.tables) {
|
|
for (let table of queryRes.tables) {
|
|
table.type = 'table';
|
|
table.refId = queryRes.refId;
|
|
table.meta = queryRes.meta;
|
|
data.push(table);
|
|
}
|
|
}
|
|
}
|
|
|
|
return { data: data };
|
|
}
|
|
|
|
parseMetricFindQueryResult(refId, results) {
|
|
if (!results || results.data.length === 0 || results.data.results[refId].meta.rowCount === 0) {
|
|
return [];
|
|
}
|
|
|
|
const columns = results.data.results[refId].tables[0].columns;
|
|
const rows = results.data.results[refId].tables[0].rows;
|
|
const textColIndex = this.findColIndex(columns, '__text');
|
|
const valueColIndex = this.findColIndex(columns, '__value');
|
|
|
|
if (columns.length === 2 && textColIndex !== -1 && valueColIndex !== -1) {
|
|
return this.transformToKeyValueList(rows, textColIndex, valueColIndex);
|
|
}
|
|
|
|
return this.transformToSimpleList(rows);
|
|
}
|
|
|
|
transformToKeyValueList(rows, textColIndex, valueColIndex) {
|
|
const res = [];
|
|
|
|
for (let i = 0; i < rows.length; i++) {
|
|
if (!this.containsKey(res, rows[i][textColIndex])) {
|
|
res.push({
|
|
text: rows[i][textColIndex],
|
|
value: rows[i][valueColIndex],
|
|
});
|
|
}
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
transformToSimpleList(rows) {
|
|
const res = [];
|
|
|
|
for (let i = 0; i < rows.length; i++) {
|
|
for (let j = 0; j < rows[i].length; j++) {
|
|
const value = rows[i][j];
|
|
if (res.indexOf(value) === -1) {
|
|
res.push(value);
|
|
}
|
|
}
|
|
}
|
|
|
|
return _.map(res, value => {
|
|
return { text: value };
|
|
});
|
|
}
|
|
|
|
findColIndex(columns, colName) {
|
|
for (let i = 0; i < columns.length; i++) {
|
|
if (columns[i].text === colName) {
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
containsKey(res, key) {
|
|
for (let i = 0; i < res.length; i++) {
|
|
if (res[i].text === key) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
transformAnnotationResponse(options, data) {
|
|
const table = data.data.results[options.annotation.name].tables[0];
|
|
|
|
let timeColumnIndex = -1;
|
|
let titleColumnIndex = -1;
|
|
let textColumnIndex = -1;
|
|
let tagsColumnIndex = -1;
|
|
|
|
for (let i = 0; i < table.columns.length; i++) {
|
|
if (table.columns[i].text === 'time') {
|
|
timeColumnIndex = i;
|
|
} else if (table.columns[i].text === 'text') {
|
|
textColumnIndex = i;
|
|
} else if (table.columns[i].text === 'tags') {
|
|
tagsColumnIndex = i;
|
|
}
|
|
}
|
|
|
|
if (timeColumnIndex === -1) {
|
|
return this.$q.reject({
|
|
message: 'Missing mandatory time column in annotation query.',
|
|
});
|
|
}
|
|
|
|
const list = [];
|
|
for (let i = 0; i < table.rows.length; i++) {
|
|
const row = table.rows[i];
|
|
list.push({
|
|
annotation: options.annotation,
|
|
time: Math.floor(row[timeColumnIndex]),
|
|
title: row[titleColumnIndex],
|
|
text: row[textColumnIndex],
|
|
tags: row[tagsColumnIndex] ? row[tagsColumnIndex].trim().split(/\s*,\s*/) : [],
|
|
});
|
|
}
|
|
|
|
return list;
|
|
}
|
|
}
|