grafana/public/app/plugins/panel/timeseries/migrations.test.ts
Torkel Ödegaard b62e87f753
TimeSeries: Render thresholds as lines and areas (#33357)
* TimeSeries: First take on uplot thresholds rendering

* Updating theme for color picker and fixing issues

* Updating theme for color picker and fixing issues

* Minor progress

* Added test dashboard

* Adding transparent and text colors to color picker and making them visible

* Good progress on migrations

* Fixed selected issue in color picker

* Fixes

* migration fix

* Fixed test

* Fixing line rendering and refactoring

* Minor ordering fix

* fixed test

* Draw thresholds before axes & series and other tweaks

* Update packages/grafana-ui/src/components/uPlot/config/UPlotThresholds.ts

Co-authored-by: Dominik Prokop <dominik.prokop@grafana.com>

Co-authored-by: Dominik Prokop <dominik.prokop@grafana.com>
2021-05-04 13:03:35 +02:00

752 lines
14 KiB
TypeScript

import { PanelModel } from '@grafana/data';
import { graphPanelChangedHandler } from './migrations';
describe('Graph Migrations', () => {
it('simple bars', () => {
const old: any = {
angular: {
bars: true,
},
};
const panel = {} as PanelModel;
panel.options = graphPanelChangedHandler(panel, 'graph', old);
expect(panel).toMatchSnapshot();
});
it('stairscase', () => {
const old: any = {
angular: stairscase,
};
const panel = {} as PanelModel;
panel.options = graphPanelChangedHandler(panel, 'graph', old);
expect(panel).toMatchSnapshot();
});
it('twoYAxis', () => {
const old: any = {
angular: twoYAxis,
};
const panel = {} as PanelModel;
panel.options = graphPanelChangedHandler(panel, 'graph', old);
expect(panel).toMatchSnapshot();
});
it('stepped line', () => {
const old: any = {
angular: stepedColordLine,
};
const panel = {} as PanelModel;
panel.options = graphPanelChangedHandler(panel, 'graph', old);
expect(panel).toMatchSnapshot();
});
it('legend', () => {
const old: any = {
angular: legend,
};
const panel = {} as PanelModel;
panel.options = graphPanelChangedHandler(panel, 'graph', old);
expect(panel).toMatchSnapshot();
});
describe('stacking', () => {
test('simple', () => {
const old: any = {
angular: stacking,
};
const panel = {} as PanelModel;
panel.options = graphPanelChangedHandler(panel, 'graph', old);
expect(panel).toMatchSnapshot();
});
test('groups', () => {
const old: any = {
angular: stackingGroups,
};
const panel = {} as PanelModel;
panel.options = graphPanelChangedHandler(panel, 'graph', old);
expect(panel).toMatchSnapshot();
});
});
describe('thresholds', () => {
test('Only gt thresholds', () => {
const old: any = {
angular: {
thresholds: [
{
colorMode: 'critical',
fill: true,
line: false,
op: 'gt',
value: 80,
yaxis: 'left',
},
{
colorMode: 'warning',
fill: true,
line: false,
op: 'gt',
value: 50,
yaxis: 'left',
},
],
},
};
const panel = {} as PanelModel;
panel.options = graphPanelChangedHandler(panel, 'graph', old);
expect(panel.fieldConfig.defaults.custom.thresholdsStyle.mode).toBe('area');
expect(panel.fieldConfig.defaults.thresholds?.steps).toMatchInlineSnapshot(`
Array [
Object {
"color": "transparent",
"value": -Infinity,
},
Object {
"color": "orange",
"value": 50,
},
Object {
"color": "red",
"value": 80,
},
]
`);
});
test('gt & lt thresholds', () => {
const old: any = {
angular: {
thresholds: [
{
colorMode: 'critical',
fill: true,
line: true,
op: 'gt',
value: 80,
yaxis: 'left',
},
{
colorMode: 'warning',
fill: true,
line: true,
op: 'lt',
value: 40,
yaxis: 'left',
},
],
},
};
const panel = {} as PanelModel;
panel.options = graphPanelChangedHandler(panel, 'graph', old);
expect(panel.fieldConfig.defaults.custom.thresholdsStyle.mode).toBe('line+area');
expect(panel.fieldConfig.defaults.thresholds?.steps).toMatchInlineSnapshot(`
Array [
Object {
"color": "orange",
"value": -Infinity,
},
Object {
"color": "transparent",
"value": 40,
},
Object {
"color": "red",
"value": 80,
},
]
`);
});
test('Only lt thresholds', () => {
const old: any = {
angular: {
thresholds: [
{
colorMode: 'warning',
fill: true,
line: true,
op: 'lt',
value: 40,
yaxis: 'left',
},
],
},
};
const panel = {} as PanelModel;
panel.options = graphPanelChangedHandler(panel, 'graph', old);
expect(panel.fieldConfig.defaults.custom.thresholdsStyle.mode).toBe('line+area');
expect(panel.fieldConfig.defaults.thresholds?.steps).toMatchInlineSnapshot(`
Array [
Object {
"color": "orange",
"value": -Infinity,
},
Object {
"color": "transparent",
"value": 40,
},
]
`);
});
});
});
const stairscase = {
fieldConfig: {
defaults: {
custom: {},
unit: 'areaF2',
displayName: 'DISPLAY NAME',
},
overrides: [],
},
aliasColors: {},
dashLength: 10,
fill: 5,
fillGradient: 6,
legend: {
avg: true,
current: true,
max: true,
min: true,
show: true,
total: true,
values: true,
alignAsTable: true,
},
lines: true,
linewidth: 1,
nullPointMode: 'null',
options: {
alertThreshold: true,
},
pointradius: 2,
seriesOverrides: [],
spaceLength: 10,
steppedLine: true,
thresholds: [],
timeRegions: [],
title: 'Panel Title',
tooltip: {
shared: true,
sort: 0,
value_type: 'individual',
},
type: 'graph',
xaxis: {
buckets: null,
mode: 'time',
name: null,
show: true,
values: [],
},
yaxes: [
{
$$hashKey: 'object:42',
format: 'short',
label: null,
logBase: 1,
max: null,
min: null,
show: false,
},
{
$$hashKey: 'object:43',
format: 'short',
label: null,
logBase: 1,
max: null,
min: null,
show: true,
},
],
yaxis: {
align: false,
alignLevel: null,
},
timeFrom: null,
timeShift: null,
bars: false,
dashes: false,
hiddenSeries: false,
percentage: false,
points: false,
stack: false,
decimals: 1,
datasource: null,
};
const twoYAxis = {
yaxes: [
{
label: 'Y111',
show: true,
logBase: 10,
min: '0',
max: '1000',
format: 'areaMI2',
$$hashKey: 'object:19',
decimals: 3,
},
{
label: 'Y222',
show: true,
logBase: 1,
min: '-10',
max: '25',
format: 'degree',
$$hashKey: 'object:20',
decimals: 2,
},
],
xaxis: {
show: true,
mode: 'time',
name: null,
values: [],
buckets: null,
},
yaxis: {
align: false,
alignLevel: null,
},
lines: true,
fill: 1,
linewidth: 1,
dashLength: 10,
spaceLength: 10,
pointradius: 2,
legend: {
show: true,
values: false,
min: false,
max: false,
current: false,
total: false,
avg: false,
},
nullPointMode: 'null',
tooltip: {
value_type: 'individual',
shared: true,
sort: 0,
},
aliasColors: {},
seriesOverrides: [
{
alias: 'B-series',
yaxis: 2,
dashLength: 5,
dashes: true,
spaceLength: 8,
},
],
thresholds: [],
timeRegions: [],
targets: [
{
refId: 'A',
},
{
refId: 'B',
},
],
fillGradient: 0,
dashes: true,
hiddenSeries: false,
points: false,
bars: false,
stack: false,
percentage: false,
steppedLine: false,
timeFrom: null,
timeShift: null,
datasource: null,
};
const stepedColordLine = {
aliasColors: {
'A-series': 'red',
},
dashLength: 10,
fieldConfig: {
defaults: {
custom: {},
},
overrides: [],
},
fill: 5,
gridPos: {
h: 9,
w: 12,
x: 0,
y: 0,
},
id: 2,
legend: {
avg: false,
current: false,
max: false,
min: false,
show: true,
total: false,
values: false,
},
lines: true,
linewidth: 5,
maxDataPoints: 20,
nullPointMode: 'null',
options: {
alertThreshold: true,
},
pluginVersion: '7.4.0-pre',
pointradius: 2,
renderer: 'flot',
seriesOverrides: [],
spaceLength: 10,
steppedLine: true,
thresholds: [],
timeRegions: [],
title: 'Panel Title',
tooltip: {
shared: true,
sort: 0,
value_type: 'individual',
},
type: 'graph',
xaxis: {
buckets: null,
mode: 'time',
name: null,
show: true,
values: [],
},
yaxes: [
{
$$hashKey: 'object:38',
format: 'short',
label: null,
logBase: 1,
max: null,
min: null,
show: true,
},
{
$$hashKey: 'object:39',
format: 'short',
label: null,
logBase: 1,
max: null,
min: null,
show: true,
},
],
yaxis: {
align: false,
alignLevel: null,
},
bars: false,
dashes: false,
fillGradient: 0,
hiddenSeries: false,
percentage: false,
points: false,
stack: false,
timeFrom: null,
timeShift: null,
datasource: null,
};
const legend = {
aliasColors: {
'A-series': 'red',
},
dashLength: 10,
fieldConfig: {
defaults: {
custom: {},
},
overrides: [],
},
fill: 5,
gridPos: {
h: 9,
w: 12,
x: 0,
y: 0,
},
id: 2,
legend: {
avg: true,
current: true,
max: false,
min: false,
show: true,
total: true,
values: true,
alignAsTable: true,
},
lines: true,
linewidth: 5,
maxDataPoints: 20,
nullPointMode: 'null',
options: {
alertThreshold: true,
},
pluginVersion: '7.4.0-pre',
pointradius: 2,
renderer: 'flot',
seriesOverrides: [],
spaceLength: 10,
steppedLine: true,
thresholds: [],
timeRegions: [],
title: 'Panel Title',
tooltip: {
shared: true,
sort: 0,
value_type: 'individual',
},
type: 'graph',
xaxis: {
buckets: null,
mode: 'time',
name: null,
show: true,
values: [],
},
yaxes: [
{
$$hashKey: 'object:38',
format: 'short',
label: null,
logBase: 1,
max: null,
min: null,
show: true,
},
{
$$hashKey: 'object:39',
format: 'short',
label: null,
logBase: 1,
max: null,
min: null,
show: true,
},
],
yaxis: {
align: false,
alignLevel: null,
},
bars: false,
dashes: false,
fillGradient: 0,
hiddenSeries: false,
percentage: false,
points: false,
stack: false,
timeFrom: null,
timeShift: null,
datasource: null,
};
const stacking = {
aliasColors: {
'A-series': 'red',
},
dashLength: 10,
fieldConfig: {
defaults: {
custom: {},
},
overrides: [],
},
fill: 5,
gridPos: {
h: 9,
w: 12,
x: 0,
y: 0,
},
id: 2,
legend: {
avg: true,
current: true,
max: false,
min: false,
show: true,
total: true,
values: true,
alignAsTable: true,
},
lines: true,
linewidth: 5,
maxDataPoints: 20,
nullPointMode: 'null',
options: {
alertThreshold: true,
},
pluginVersion: '7.4.0-pre',
pointradius: 2,
renderer: 'flot',
seriesOverrides: [],
spaceLength: 10,
steppedLine: true,
thresholds: [],
timeRegions: [],
title: 'Panel Title',
tooltip: {
shared: true,
sort: 0,
value_type: 'individual',
},
type: 'graph',
xaxis: {
buckets: null,
mode: 'time',
name: null,
show: true,
values: [],
},
yaxes: [
{
$$hashKey: 'object:38',
format: 'short',
label: null,
logBase: 1,
max: null,
min: null,
show: true,
},
{
$$hashKey: 'object:39',
format: 'short',
label: null,
logBase: 1,
max: null,
min: null,
show: true,
},
],
yaxis: {
align: false,
alignLevel: null,
},
bars: false,
dashes: false,
fillGradient: 0,
hiddenSeries: false,
percentage: false,
points: false,
stack: true,
timeFrom: null,
timeShift: null,
datasource: null,
};
const stackingGroups = {
aliasColors: {
'A-series': 'red',
},
dashLength: 10,
fieldConfig: {
defaults: {
custom: {},
},
overrides: [],
},
fill: 5,
gridPos: {
h: 9,
w: 12,
x: 0,
y: 0,
},
id: 2,
legend: {
avg: true,
current: true,
max: false,
min: false,
show: true,
total: true,
values: true,
alignAsTable: true,
},
lines: true,
linewidth: 5,
maxDataPoints: 20,
nullPointMode: 'null',
options: {
alertThreshold: true,
},
pluginVersion: '7.4.0-pre',
pointradius: 2,
renderer: 'flot',
seriesOverrides: [
{
alias: 'A-series',
stack: 'A',
},
{
alias: 'B-series',
stack: 'A',
},
],
spaceLength: 10,
steppedLine: true,
thresholds: [],
timeRegions: [],
title: 'Panel Title',
tooltip: {
shared: true,
sort: 0,
value_type: 'individual',
},
type: 'graph',
xaxis: {
buckets: null,
mode: 'time',
name: null,
show: true,
values: [],
},
yaxes: [
{
$$hashKey: 'object:38',
format: 'short',
label: null,
logBase: 1,
max: null,
min: null,
show: true,
},
{
$$hashKey: 'object:39',
format: 'short',
label: null,
logBase: 1,
max: null,
min: null,
show: true,
},
],
yaxis: {
align: false,
alignLevel: null,
},
bars: false,
dashes: false,
fillGradient: 0,
hiddenSeries: false,
percentage: false,
points: false,
stack: true,
timeFrom: null,
timeShift: null,
datasource: null,
};