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/features/annotations/standardAnnotationSupport.t...

160 lines
4.2 KiB

import { FieldType, toDataFrame } from '@grafana/data';
import { getAnnotationsFromData } from './standardAnnotationSupport';
describe('DataFrame to annotations', () => {
test('simple conversion', async () => {
const frame = toDataFrame({
fields: [
{ type: FieldType.time, values: [1, 2, 3, 4, 5] },
{ name: 'first string field', values: ['t1', 't2', 't3', null, undefined] },
{ name: 'tags', values: ['aaa,bbb', 'bbb,ccc', 'zyz', null, undefined] },
],
});
await expect(getAnnotationsFromData([frame])).toEmitValues([
[
{
color: 'red',
tags: ['aaa', 'bbb'],
text: 't1',
time: 1,
type: 'default',
},
{
color: 'red',
tags: ['bbb', 'ccc'],
text: 't2',
time: 2,
type: 'default',
},
{
color: 'red',
tags: ['zyz'],
text: 't3',
time: 3,
type: 'default',
},
{
color: 'red',
time: 4,
type: 'default',
},
{
color: 'red',
time: 5,
type: 'default',
},
],
]);
});
test('explicit mappings', async () => {
const frame = toDataFrame({
fields: [
{ name: 'time1', values: [111, 222, 333] },
{ name: 'time2', values: [100, 200, 300] },
{ name: 'aaaaa', values: ['a1', 'a2', 'a3'] },
{ name: 'bbbbb', values: ['b1', 'b2', 'b3'] },
],
});
const observable = getAnnotationsFromData([frame], {
text: { value: 'bbbbb' },
time: { value: 'time2' },
timeEnd: { value: 'time1' },
title: { value: 'aaaaa' },
});
await expect(observable).toEmitValues([
[
{
color: 'red',
text: 'b1',
time: 100,
timeEnd: 111,
title: 'a1',
type: 'default',
},
{
color: 'red',
text: 'b2',
time: 200,
timeEnd: 222,
title: 'a2',
type: 'default',
},
{
color: 'red',
text: 'b3',
time: 300,
timeEnd: 333,
title: 'a3',
type: 'default',
},
],
]);
});
it('all valid key names should be included in the output result', async () => {
const frame = toDataFrame({
fields: [
{ name: 'time', values: [100] },
{ name: 'timeEnd', values: [200] },
{ name: 'title', values: ['title'] },
{ name: 'text', values: ['text'] },
{ name: 'tags', values: ['t1,t2,t3'] },
{ name: 'id', values: [1] },
{ name: 'userId', values: ['Admin'] },
{ name: 'login', values: ['admin'] },
{ name: 'email', values: ['admin@unknown.us'] },
{ name: 'prevState', values: ['normal'] },
{ name: 'newState', values: ['alerting'] },
{ name: 'data', values: [{ text: 'a', value: 'A' }] },
{ name: 'panelId', values: [4] },
{ name: 'alertId', values: [0] },
],
});
const observable = getAnnotationsFromData([frame]);
await expect(observable).toEmitValues([
[
{
color: 'red',
data: { text: 'a', value: 'A' },
email: 'admin@unknown.us',
id: 1,
login: 'admin',
newState: 'alerting',
panelId: 4,
prevState: 'normal',
tags: ['t1', 't2', 't3'],
text: 'text',
time: 100,
timeEnd: 200,
title: 'title',
type: 'default',
userId: 'Admin',
alertId: 0,
},
],
]);
});
it('key names that are not valid should be excluded in the output result', async () => {
const frame = toDataFrame({
fields: [
{ name: 'time', values: [100] },
{ name: 'text', values: ['text'] },
{ name: 'someData', values: [{ value: 'bar' }] },
{ name: 'panelSource', values: ['100'] },
{ name: 'timeStart', values: [100] },
],
});
const observable = getAnnotationsFromData([frame]);
await expect(observable).toEmitValues([[{ color: 'red', text: 'text', time: 100, type: 'default' }]]);
});
});