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/alerting/unified/components/rule-editor/preview.test.ts

181 lines
5.2 KiB

import { DataFrame, FieldType, MutableDataFrame } from '@grafana/data';
import { mapDataFrameToAlertPreview } from './preview';
describe('mapDataFrameToAlertPreview', () => {
it('should convert data frame fields into set of labels, state and info', () => {
const frame: DataFrame = new MutableDataFrame({
fields: [
{
name: 'severity',
type: FieldType.string,
values: ['error', 'error', 'warning', 'warning'],
},
{
name: 'node',
type: FieldType.string,
values: ['cpu-0', 'cpu-1', 'cpu-0', 'cpu-1'],
},
{
name: 'State',
type: FieldType.string,
values: ['Alerting', 'Alerting', 'Alerting', 'Alerting'],
},
{
name: 'Info',
type: FieldType.string,
values: ['value=0.34', 'value=0.2', 'value=0.1', 'value=0.66'],
},
],
});
const alertPreview = mapDataFrameToAlertPreview(frame);
expect(alertPreview.instances).toHaveLength(4);
expect(alertPreview.instances[0]).toEqual({
state: 'Alerting',
info: 'value=0.34',
labels: { severity: 'error', node: 'cpu-0' },
});
expect(alertPreview.instances[1]).toEqual({
state: 'Alerting',
info: 'value=0.2',
labels: { severity: 'error', node: 'cpu-1' },
});
expect(alertPreview.instances[2]).toEqual({
state: 'Alerting',
info: 'value=0.1',
labels: { severity: 'warning', node: 'cpu-0' },
});
expect(alertPreview.instances[3]).toEqual({
state: 'Alerting',
info: 'value=0.66',
labels: { severity: 'warning', node: 'cpu-1' },
});
});
it('should return 0 instances if there is no State field', () => {
const frame: DataFrame = new MutableDataFrame({
fields: [
{
name: 'severity',
type: FieldType.string,
values: ['error', 'warning'],
},
{
name: 'Info',
type: FieldType.string,
values: ['value=0.34', 'value=0.2'],
},
],
});
const alertPreview = mapDataFrameToAlertPreview(frame);
expect(alertPreview.instances).toHaveLength(0);
});
it('should return instances with labels if there is no Info field', () => {
const frame: DataFrame = new MutableDataFrame({
fields: [
{
name: 'severity',
type: FieldType.string,
values: ['error', 'warning'],
},
{
name: 'State',
type: FieldType.string,
values: ['Alerting', 'Alerting'],
},
],
});
const alertPreview = mapDataFrameToAlertPreview(frame);
expect(alertPreview.instances).toHaveLength(2);
expect(alertPreview.instances[0]).toEqual({
state: 'Alerting',
labels: { severity: 'error' },
});
expect(alertPreview.instances[1]).toEqual({
state: 'Alerting',
labels: { severity: 'warning' },
});
});
it('should limit number of instances to number of State values', () => {
const frame: DataFrame = new MutableDataFrame({
fields: [
{
name: 'severity',
type: FieldType.string,
values: ['critical', 'error', 'warning', 'info'],
},
{
name: 'State',
type: FieldType.string,
values: ['Alerting', 'Alerting'],
},
],
});
const alertPreview = mapDataFrameToAlertPreview(frame);
expect(alertPreview.instances).toHaveLength(2);
expect(alertPreview.instances[0]).toEqual({ state: 'Alerting', labels: { severity: 'critical' } });
expect(alertPreview.instances[1]).toEqual({ state: 'Alerting', labels: { severity: 'error' } });
});
// Just to be resistant to incomplete data in data frames
it('should return instances with labels if number of fields values do not match', () => {
const frame: DataFrame = new MutableDataFrame({
fields: [
{
name: 'severity',
type: FieldType.string,
values: ['error', 'error', 'warning', 'warning'],
},
{
name: 'node',
type: FieldType.string,
values: ['cpu-0', 'cpu-1', 'cpu-1'],
},
{
name: 'State',
type: FieldType.string,
values: ['Alerting', 'Alerting', 'Alerting', 'Alerting'],
},
{
name: 'Info',
type: FieldType.string,
values: ['value=0.34', 'value=0.2', 'value=0.66'],
},
],
});
const alertPreview = mapDataFrameToAlertPreview(frame);
expect(alertPreview.instances).toHaveLength(4);
expect(alertPreview.instances[0]).toEqual({
state: 'Alerting',
info: 'value=0.34',
labels: { severity: 'error', node: 'cpu-0' },
});
expect(alertPreview.instances[1]).toEqual({
state: 'Alerting',
info: 'value=0.2',
labels: { severity: 'error', node: 'cpu-1' },
});
expect(alertPreview.instances[2]).toEqual({
state: 'Alerting',
info: 'value=0.66',
labels: { severity: 'warning', node: 'cpu-1' },
});
expect(alertPreview.instances[3]).toEqual({
state: 'Alerting',
info: undefined,
labels: { severity: 'warning', node: undefined },
});
});
});