From 5d7cf54348e8b63b241bb3e81ce8c0027ef56ad3 Mon Sep 17 00:00:00 2001 From: Ivan Mikheykin Date: Thu, 18 Oct 2018 14:19:22 +0300 Subject: [PATCH] Fix panel rendering timeout - minor code cleanups --- dist/README.md | 3 ++- dist/module.js | 4 ++-- dist/module.js.map | 2 +- dist/status_heatmap_ctrl.js | 8 +++++--- dist/status_heatmap_ctrl.js.map | 2 +- src/module.js | 2 -- src/status_heatmap_ctrl.js | 5 ++++- 7 files changed, 15 insertions(+), 11 deletions(-) diff --git a/dist/README.md b/dist/README.md index 55ba3c4..b392d8d 100644 --- a/dist/README.md +++ b/dist/README.md @@ -1,7 +1,8 @@ # Statusmap panel for Grafana ![Statusmap sample panel](https://raw.githubusercontent.com/flant/grafana-statusmap/master/src/img/flant-statusmap-panel.png) -(https://raw.githubusercontent.com/flant/grafana-statusmap/master/src/img/flant-statusmap-panel-dark.png) + +![Statusmap sample panel with dark theme](https://raw.githubusercontent.com/flant/grafana-statusmap/master/src/img/flant-statusmap-panel-dark.png) ## Features diff --git a/dist/module.js b/dist/module.js index deff0e9..8a23a5a 100644 --- a/dist/module.js +++ b/dist/module.js @@ -1,13 +1,13 @@ 'use strict'; -System.register(['app/plugins/sdk', './color_legend', './status_heatmap_ctrl'], function (_export, _context) { +System.register(['app/plugins/sdk', './status_heatmap_ctrl'], function (_export, _context) { "use strict"; var loadPluginCss, StatusHeatmapCtrl; return { setters: [function (_appPluginsSdk) { loadPluginCss = _appPluginsSdk.loadPluginCss; - }, function (_color_legend) {}, function (_status_heatmap_ctrl) { + }, function (_status_heatmap_ctrl) { StatusHeatmapCtrl = _status_heatmap_ctrl.StatusHeatmapCtrl; }], execute: function () { diff --git a/dist/module.js.map b/dist/module.js.map index e9d3212..4358619 100644 --- a/dist/module.js.map +++ b/dist/module.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/module.js"],"names":["loadPluginCss","StatusHeatmapCtrl","dark","light"],"mappings":";;;;;;;;AAAQA,mB,kBAAAA,a;;AAECC,uB,wBAAAA,iB;;;;AAETD,oBAAc;AACZE,cAAM,sDADM;AAEZC,eAAO;AAFK,OAAd;;2BAOEF,iB","file":"module.js","sourcesContent":["import {loadPluginCss} from 'app/plugins/sdk';\nimport './color_legend';\nimport { StatusHeatmapCtrl } from './status_heatmap_ctrl';\n\nloadPluginCss({\n dark: 'plugins/flant-statusmap-panel/css/statusmap.dark.css',\n light: 'plugins/flant-statusmap-panel/css/statusmap.light.css'\n});\n\n\nexport {\n StatusHeatmapCtrl as PanelCtrl\n};\n"]} \ No newline at end of file +{"version":3,"sources":["../src/module.js"],"names":["loadPluginCss","StatusHeatmapCtrl","dark","light"],"mappings":";;;;;;;;AAAQA,mB,kBAAAA,a;;AACCC,uB,wBAAAA,iB;;;;AAETD,oBAAc;AACZE,cAAM,sDADM;AAEZC,eAAO;AAFK,OAAd;;2BAMEF,iB","file":"module.js","sourcesContent":["import {loadPluginCss} from 'app/plugins/sdk';\nimport { StatusHeatmapCtrl } from './status_heatmap_ctrl';\n\nloadPluginCss({\n dark: 'plugins/flant-statusmap-panel/css/statusmap.dark.css',\n light: 'plugins/flant-statusmap-panel/css/statusmap.light.css'\n});\n\nexport {\n StatusHeatmapCtrl as PanelCtrl\n};\n"]} \ No newline at end of file diff --git a/dist/status_heatmap_ctrl.js b/dist/status_heatmap_ctrl.js index 96aba20..f8c1955 100644 --- a/dist/status_heatmap_ctrl.js +++ b/dist/status_heatmap_ctrl.js @@ -1,6 +1,6 @@ 'use strict'; -System.register(['app/plugins/sdk', 'lodash', 'app/core/core', 'app/core/utils/kbn', './rendering', './options_editor', './color_mode_discrete'], function (_export, _context) { +System.register(['app/plugins/sdk', 'lodash', 'app/core/core', 'app/core/utils/kbn', './color_legend', './rendering', './options_editor', './color_mode_discrete'], function (_export, _context) { "use strict"; var MetricsPanelCtrl, _, contextSrv, kbn, rendering, statusHeatmapOptionsEditor, ColorModeDiscrete, CANVAS, SVG, VALUE_INDEX, TIME_INDEX, panelDefaults, renderer, colorSchemes, colorModes, opacityScales, StatusHeatmapCtrl; @@ -44,7 +44,7 @@ System.register(['app/plugins/sdk', 'lodash', 'app/core/core', 'app/core/utils/k contextSrv = _appCoreCore.contextSrv; }, function (_appCoreUtilsKbn) { kbn = _appCoreUtilsKbn.default; - }, function (_rendering) { + }, function (_color_legend) {}, function (_rendering) { rendering = _rendering.default; }, function (_options_editor) { statusHeatmapOptionsEditor = _options_editor.statusHeatmapOptionsEditor; @@ -109,7 +109,7 @@ System.register(['app/plugins/sdk', 'lodash', 'app/core/core', 'app/core/utils/k { name: 'Blues', value: 'interpolateBlues', invert: 'dark' }, { name: 'Greens', value: 'interpolateGreens', invert: 'dark' }, { name: 'Greys', value: 'interpolateGreys', invert: 'dark' }, { name: 'Oranges', value: 'interpolateOranges', invert: 'dark' }, { name: 'Purples', value: 'interpolatePurples', invert: 'dark' }, { name: 'Reds', value: 'interpolateReds', invert: 'dark' }, // Sequential (Multi-Hue) - { name: 'BuGn', value: 'interpolateBuGn', invert: 'dark' }, { name: 'BuPu', value: 'interpolateBuPu', invert: 'dark' }, { name: 'GnBu', value: 'interpolateGnBu', invert: 'dark' }, { name: 'OrRd', value: 'interpolateOrRd', invert: 'dark' }, { name: 'PuBuGn', value: 'interpolatePuBuGn', invert: 'dark' }, { name: 'PuBu', value: 'interpolatePuBu', invert: 'dark' }, { name: 'PuRd', value: 'interpolatePuRd', invert: 'dark' }, { name: 'RdPu', value: 'interpolateRdPu', invert: 'dark' }, { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' }, { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' }, { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' }, { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'darm' }]; + { name: 'BuGn', value: 'interpolateBuGn', invert: 'dark' }, { name: 'BuPu', value: 'interpolateBuPu', invert: 'dark' }, { name: 'GnBu', value: 'interpolateGnBu', invert: 'dark' }, { name: 'OrRd', value: 'interpolateOrRd', invert: 'dark' }, { name: 'PuBuGn', value: 'interpolatePuBuGn', invert: 'dark' }, { name: 'PuBu', value: 'interpolatePuBu', invert: 'dark' }, { name: 'PuRd', value: 'interpolatePuRd', invert: 'dark' }, { name: 'RdPu', value: 'interpolateRdPu', invert: 'dark' }, { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' }, { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' }, { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' }, { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'dark' }]; colorModes = ['opacity', 'spectrum', 'discrete']; opacityScales = ['linear', 'sqrt']; @@ -123,6 +123,7 @@ System.register(['app/plugins/sdk', 'lodash', 'app/core/core', 'app/core/utils/k _this.onRenderComplete = function (data) { _this.graph.chartWidth = data.chartWidth; + _this.renderingCompleted(); }; _this.calculateInterval = function () { @@ -344,6 +345,7 @@ System.register(['app/plugins/sdk', 'lodash', 'app/core/core', 'app/core/utils/k _this.events.on('init-edit-mode', _this.onInitEditMode); _this.events.on('render', _this.onRender); _this.events.on('refresh', _this.postRefresh); + // custom event from rendering.js _this.events.on('render-complete', _this.onRenderComplete); return _this; } diff --git a/dist/status_heatmap_ctrl.js.map b/dist/status_heatmap_ctrl.js.map index 7636779..c51dd26 100644 --- a/dist/status_heatmap_ctrl.js.map +++ b/dist/status_heatmap_ctrl.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/status_heatmap_ctrl.js"],"names":["MetricsPanelCtrl","_","contextSrv","kbn","rendering","statusHeatmapOptionsEditor","ColorModeDiscrete","CANVAS","SVG","VALUE_INDEX","TIME_INDEX","panelDefaults","color","mode","cardColor","colorScale","exponent","colorScheme","defaultColor","thresholds","cards","cardMinWidth","cardSpacing","cardRound","xAxis","show","showWeekends","minBucketWidthToShowWeekends","showCrosshair","labelFormat","yAxis","tooltip","legend","data","unitFormat","decimals","nullPointMode","highlightCards","useMax","renderer","colorSchemes","name","value","invert","colorModes","opacityScales","StatusHeatmapCtrl","$scope","$injector","$rootScope","timeSrv","onRenderComplete","graph","chartWidth","calculateInterval","panelWidth","Math","ceil","$","window","width","panel","gridPos","w","max","minCardWidth","minSpacing","maxCardsCount","intervalMs","rangeMs","range","to","valueOf","from","discreteHelper","roundIntervalCeil","lowLimitMs","intervalOverride","interval","templateSrv","replace","scopedVars","datasource","slice","interval_to_ms","secondsToHms","onDataReceived","dataList","cardsData","convertToCards","render","onInitEditMode","addEditorTab","unitFormats","getUnitFormats","onRender","multipleValues","noColorDefined","updateCardsValuesHasColorInfo","onCardColorChange","newColor","onDataError","postRefresh","onEditorAddThreshold","push","onEditorRemoveThreshold","index","splice","onEditorAddThreeLights","link","scope","elem","attrs","ctrl","xBucketSize","yBucketSize","maxValue","minValue","length","targetIndex","i","ts","target","undefined","targets","keys","sort","min","map","d","datapoints","j","card","id","values","si","s","datapoint","x","y","defaultsDeep","dataWarnings","title","tip","events","on","templateUrl"],"mappings":"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","file":"status_heatmap_ctrl.js","sourcesContent":["import { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport _ from 'lodash';\nimport { contextSrv } from 'app/core/core';\nimport kbn from 'app/core/utils/kbn';\n\nimport rendering from './rendering';\n// import aggregates, { aggregatesMap } from './aggregates';\n// import fragments, { fragmentsMap } from './fragments';\n// import { labelFormats } from './xAxisLabelFormats';\nimport {statusHeatmapOptionsEditor} from './options_editor';\nimport {ColorModeDiscrete} from \"./color_mode_discrete\";\n\nconst CANVAS = 'CANVAS';\nconst SVG = 'SVG';\nconst VALUE_INDEX = 0,\n TIME_INDEX = 1;\n\nconst panelDefaults = {\n // aggregate: aggregates.AVG,\n // fragment: fragments.HOUR,\n color: {\n mode: 'spectrum',\n cardColor: '#b4ff00',\n colorScale: 'sqrt',\n exponent: 0.5,\n colorScheme: 'interpolateGnYlRd',\n // discrete mode settings\n defaultColor: '#757575',\n thresholds: [] // manual colors\n },\n cards: {\n cardMinWidth: 5,\n cardSpacing: 2,\n cardRound: null\n },\n xAxis: {\n show: true,\n showWeekends: true,\n minBucketWidthToShowWeekends: 4,\n showCrosshair: true,\n labelFormat: '%a %m/%d'\n },\n yAxis: {\n show: true,\n showCrosshair: false\n },\n tooltip: {\n show: true\n },\n legend: {\n show: true\n },\n data: {\n unitFormat: 'short',\n decimals: null\n },\n // how null points should be handled\n nullPointMode: 'as empty',\n highlightCards: true,\n useMax: true\n};\n\nconst renderer = CANVAS;\n\nconst colorSchemes = [\n // Diverging\n { name: 'Spectral', value: 'interpolateSpectral', invert: 'always' },\n { name: 'RdYlGn', value: 'interpolateRdYlGn', invert: 'always' },\n { name: 'GnYlRd', value: 'interpolateGnYlRd', invert: 'always' },\n\n // Sequential (Single Hue)\n { name: 'Blues', value: 'interpolateBlues', invert: 'dark' },\n { name: 'Greens', value: 'interpolateGreens', invert: 'dark' },\n { name: 'Greys', value: 'interpolateGreys', invert: 'dark' },\n { name: 'Oranges', value: 'interpolateOranges', invert: 'dark' },\n { name: 'Purples', value: 'interpolatePurples', invert: 'dark' },\n { name: 'Reds', value: 'interpolateReds', invert: 'dark' },\n\n // Sequential (Multi-Hue)\n { name: 'BuGn', value: 'interpolateBuGn', invert: 'dark' },\n { name: 'BuPu', value: 'interpolateBuPu', invert: 'dark' },\n { name: 'GnBu', value: 'interpolateGnBu', invert: 'dark' },\n { name: 'OrRd', value: 'interpolateOrRd', invert: 'dark' },\n { name: 'PuBuGn', value: 'interpolatePuBuGn', invert: 'dark' },\n { name: 'PuBu', value: 'interpolatePuBu', invert: 'dark' },\n { name: 'PuRd', value: 'interpolatePuRd', invert: 'dark' },\n { name: 'RdPu', value: 'interpolateRdPu', invert: 'dark' },\n { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' },\n { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' },\n { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' },\n { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'darm' }\n];\n\nlet colorModes = ['opacity', 'spectrum', 'discrete'];\nlet opacityScales = ['linear', 'sqrt'];\n\nexport class StatusHeatmapCtrl extends MetricsPanelCtrl {\n static templateUrl = 'module.html';\n\n constructor($scope, $injector, $rootScope, timeSrv) {\n super($scope, $injector);\n _.defaultsDeep(this.panel, panelDefaults);\n\n this.opacityScales = opacityScales;\n this.colorModes = colorModes;\n this.colorSchemes = colorSchemes;\n\n // default graph width for discrete card width calculation\n this.graph = {\n \"chartWidth\" : -1\n };\n\n this.multipleValues = false;\n this.noColorDefined = false;\n\n this.discreteHelper = new ColorModeDiscrete($scope);\n\n this.dataWarnings = {\n \"noColorDefined\": {\n title: 'Data has value with undefined color',\n tip: 'Check metric values, color values or define a new color',\n },\n \"multipleValues\": {\n title: 'Data has multiple values for one target',\n tip: 'Change targets definitions or set \"use max value\"',\n }\n };\n\n this.events.on('data-received', this.onDataReceived);\n this.events.on('data-snapshot-load', this.onDataReceived);\n this.events.on('data-error', this.onDataError);\n this.events.on('init-edit-mode', this.onInitEditMode);\n this.events.on('render', this.onRender);\n this.events.on('refresh', this.postRefresh);\n this.events.on('render-complete', this.onRenderComplete);\n }\n\n onRenderComplete = (data) => {\n this.graph.chartWidth = data.chartWidth;\n };\n\n // override calculateInterval for discrete color mode\n calculateInterval = () => {\n let panelWidth = Math.ceil($(window).width() * (this.panel.gridPos.w / 24));\n // approximate chartWidth because y axis ticks not rendered yet on first data receive.\n let chartWidth = _.max([\n panelWidth - 200,\n panelWidth/2\n ]);\n\n let minCardWidth = this.panel.cards.cardMinWidth;\n let minSpacing = this.panel.cards.cardSpacing;\n let maxCardsCount = Math.ceil((chartWidth-minCardWidth) / (minCardWidth + minSpacing));\n\n let intervalMs;\n let rangeMs = this.range.to.valueOf() - this.range.from.valueOf();\n\n // this is minimal interval! kbn.round_interval will lower it.\n intervalMs = this.discreteHelper.roundIntervalCeil(rangeMs / maxCardsCount);\n\n // Calculate low limit of interval\n let lowLimitMs = 1; // 1 millisecond default low limit\n let intervalOverride = this.panel.interval;\n\n // if no panel interval check datasource\n if (intervalOverride) {\n intervalOverride = this.templateSrv.replace(intervalOverride, this.panel.scopedVars);\n } else if (this.datasource && this.datasource.interval) {\n intervalOverride = this.datasource.interval;\n }\n\n if (intervalOverride) {\n if (intervalOverride[0] === '>') {\n intervalOverride = intervalOverride.slice(1);\n }\n lowLimitMs = kbn.interval_to_ms(intervalOverride);\n }\n\n if (lowLimitMs > intervalMs) {\n intervalMs = lowLimitMs;\n }\n\n this.intervalMs = intervalMs;\n this.interval = kbn.secondsToHms(intervalMs / 1000);\n };\n\n onDataReceived = (dataList) => {\n this.data = dataList;\n this.cardsData = this.convertToCards(this.data);\n\n this.render();\n };\n\n onInitEditMode = () => {\n this.addEditorTab('Options', statusHeatmapOptionsEditor, 2);\n this.unitFormats = kbn.getUnitFormats();\n };\n\n onRender = () => {\n if (!this.data) { return; }\n\n this.multipleValues = false;\n if (!this.panel.useMax) {\n if (this.cardsData) {\n this.multipleValues = this.cardsData.multipleValues;\n }\n }\n\n this.noColorDefined = false;\n if (this.panel.color.mode === 'discrete') {\n this.discreteHelper.updateCardsValuesHasColorInfo();\n if (this.cardsData) {\n this.noColorDefined = this.cardsData.noColorDefined;\n }\n }\n };\n\n onCardColorChange = (newColor) => {\n this.panel.color.cardColor = newColor;\n this.render();\n };\n\n onDataError = () => {\n this.data = [];\n this.render();\n };\n\n postRefresh = () => {\n this.noColorDefined = false;\n };\n\n onEditorAddThreshold = () => {\n this.panel.color.thresholds.push({ color: this.panel.defaultColor });\n this.render();\n };\n\n onEditorRemoveThreshold = (index) => {\n this.panel.color.thresholds.splice(index, 1);\n this.render();\n };\n\n onEditorAddThreeLights = () => {\n this.panel.color.thresholds.push({color: \"red\", value: 2, tooltip: \"error\" });\n this.panel.color.thresholds.push({color: \"yellow\", value: 1, tooltip: \"warning\" });\n this.panel.color.thresholds.push({color: \"green\", value: 0, tooltip: \"ok\" });\n this.render();\n };\n\n link = (scope, elem, attrs, ctrl) => {\n rendering(scope, elem, attrs, ctrl);\n };\n\n // group values into buckets by target\n convertToCards = (data) => {\n let cardsData = {\n cards: [],\n xBucketSize: 0,\n yBucketSize: 0,\n maxValue: 0,\n minValue: 0,\n multipleValues: false,\n noColorDefined: false,\n };\n\n if (!data || data.length == 0) { return cardsData;}\n\n // collect uniq targets and their indexes in data array\n cardsData.targetIndex = {};\n for (let i = 0; i < data.length; i++) {\n let ts = data[i];\n let target = ts.target;\n if (cardsData.targetIndex[target] == undefined) {\n cardsData.targetIndex[target] = []\n }\n cardsData.targetIndex[target].push(i);\n }\n\n // TODO add some logic for targets heirarchy\n cardsData.targets = _.keys(cardsData.targetIndex);\n cardsData.targets.sort();\n cardsData.yBucketSize = cardsData.targets.length;\n cardsData.xBucketSize = _.min(_.map(data, d => d.datapoints.length));\n\n // Collect all values for each bucket from datapoints with similar target.\n for(let i = 0; i < cardsData.targets.length; i++) {\n let target = cardsData.targets[i];\n\n for (let j = 0; j < cardsData.xBucketSize; j++) {\n let card = {\n id: i*cardsData.xBucketSize + j,\n values: [],\n multipleValues: false,\n noColorDefined: false,\n };\n\n // collect values from all timeseries with target\n for (let si = 0; si < cardsData.targetIndex[target].length; si++) {\n let s = data[cardsData.targetIndex[target][si]];\n let datapoint = s.datapoints[j];\n if (card.values.length === 0) {\n card.x = datapoint[TIME_INDEX];\n card.y = s.target;\n }\n card.values.push(datapoint[VALUE_INDEX]);\n }\n card.minValue = _.min(card.values);\n card.maxValue = _.max(card.values);\n if (card.values.length > 1) {\n cardsData.multipleValues = true;\n card.multipleValues = true;\n card.value = card.maxValue; // max value by default\n } else {\n card.value = card.maxValue; // max value by default\n }\n\n if (cardsData.maxValue < card.maxValue)\n cardsData.maxValue = card.maxValue;\n\n if (cardsData.minValue > card.minValue)\n cardsData.minValue = card.minValue;\n\n cardsData.cards.push(card);\n }\n }\n\n return cardsData;\n };\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/status_heatmap_ctrl.js"],"names":["MetricsPanelCtrl","_","contextSrv","kbn","rendering","statusHeatmapOptionsEditor","ColorModeDiscrete","CANVAS","SVG","VALUE_INDEX","TIME_INDEX","panelDefaults","color","mode","cardColor","colorScale","exponent","colorScheme","defaultColor","thresholds","cards","cardMinWidth","cardSpacing","cardRound","xAxis","show","showWeekends","minBucketWidthToShowWeekends","showCrosshair","labelFormat","yAxis","tooltip","legend","data","unitFormat","decimals","nullPointMode","highlightCards","useMax","renderer","colorSchemes","name","value","invert","colorModes","opacityScales","StatusHeatmapCtrl","$scope","$injector","$rootScope","timeSrv","onRenderComplete","graph","chartWidth","renderingCompleted","calculateInterval","panelWidth","Math","ceil","$","window","width","panel","gridPos","w","max","minCardWidth","minSpacing","maxCardsCount","intervalMs","rangeMs","range","to","valueOf","from","discreteHelper","roundIntervalCeil","lowLimitMs","intervalOverride","interval","templateSrv","replace","scopedVars","datasource","slice","interval_to_ms","secondsToHms","onDataReceived","dataList","cardsData","convertToCards","render","onInitEditMode","addEditorTab","unitFormats","getUnitFormats","onRender","multipleValues","noColorDefined","updateCardsValuesHasColorInfo","onCardColorChange","newColor","onDataError","postRefresh","onEditorAddThreshold","push","onEditorRemoveThreshold","index","splice","onEditorAddThreeLights","link","scope","elem","attrs","ctrl","xBucketSize","yBucketSize","maxValue","minValue","length","targetIndex","i","ts","target","undefined","targets","keys","sort","min","map","d","datapoints","j","card","id","values","si","s","datapoint","x","y","defaultsDeep","dataWarnings","title","tip","events","on","templateUrl"],"mappings":"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","file":"status_heatmap_ctrl.js","sourcesContent":["import { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport _ from 'lodash';\nimport { contextSrv } from 'app/core/core';\nimport kbn from 'app/core/utils/kbn';\n\nimport './color_legend';\nimport rendering from './rendering';\n// import aggregates, { aggregatesMap } from './aggregates';\n// import fragments, { fragmentsMap } from './fragments';\n// import { labelFormats } from './xAxisLabelFormats';\nimport {statusHeatmapOptionsEditor} from './options_editor';\nimport {ColorModeDiscrete} from \"./color_mode_discrete\";\n\nconst CANVAS = 'CANVAS';\nconst SVG = 'SVG';\nconst VALUE_INDEX = 0,\n TIME_INDEX = 1;\n\nconst panelDefaults = {\n // aggregate: aggregates.AVG,\n // fragment: fragments.HOUR,\n color: {\n mode: 'spectrum',\n cardColor: '#b4ff00',\n colorScale: 'sqrt',\n exponent: 0.5,\n colorScheme: 'interpolateGnYlRd',\n // discrete mode settings\n defaultColor: '#757575',\n thresholds: [] // manual colors\n },\n cards: {\n cardMinWidth: 5,\n cardSpacing: 2,\n cardRound: null\n },\n xAxis: {\n show: true,\n showWeekends: true,\n minBucketWidthToShowWeekends: 4,\n showCrosshair: true,\n labelFormat: '%a %m/%d'\n },\n yAxis: {\n show: true,\n showCrosshair: false\n },\n tooltip: {\n show: true\n },\n legend: {\n show: true\n },\n data: {\n unitFormat: 'short',\n decimals: null\n },\n // how null points should be handled\n nullPointMode: 'as empty',\n highlightCards: true,\n useMax: true\n};\n\nconst renderer = CANVAS;\n\nconst colorSchemes = [\n // Diverging\n { name: 'Spectral', value: 'interpolateSpectral', invert: 'always' },\n { name: 'RdYlGn', value: 'interpolateRdYlGn', invert: 'always' },\n { name: 'GnYlRd', value: 'interpolateGnYlRd', invert: 'always' },\n\n // Sequential (Single Hue)\n { name: 'Blues', value: 'interpolateBlues', invert: 'dark' },\n { name: 'Greens', value: 'interpolateGreens', invert: 'dark' },\n { name: 'Greys', value: 'interpolateGreys', invert: 'dark' },\n { name: 'Oranges', value: 'interpolateOranges', invert: 'dark' },\n { name: 'Purples', value: 'interpolatePurples', invert: 'dark' },\n { name: 'Reds', value: 'interpolateReds', invert: 'dark' },\n\n // Sequential (Multi-Hue)\n { name: 'BuGn', value: 'interpolateBuGn', invert: 'dark' },\n { name: 'BuPu', value: 'interpolateBuPu', invert: 'dark' },\n { name: 'GnBu', value: 'interpolateGnBu', invert: 'dark' },\n { name: 'OrRd', value: 'interpolateOrRd', invert: 'dark' },\n { name: 'PuBuGn', value: 'interpolatePuBuGn', invert: 'dark' },\n { name: 'PuBu', value: 'interpolatePuBu', invert: 'dark' },\n { name: 'PuRd', value: 'interpolatePuRd', invert: 'dark' },\n { name: 'RdPu', value: 'interpolateRdPu', invert: 'dark' },\n { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' },\n { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' },\n { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' },\n { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'dark' }\n];\n\nlet colorModes = ['opacity', 'spectrum', 'discrete'];\nlet opacityScales = ['linear', 'sqrt'];\n\nexport class StatusHeatmapCtrl extends MetricsPanelCtrl {\n static templateUrl = 'module.html';\n\n constructor($scope, $injector, $rootScope, timeSrv) {\n super($scope, $injector);\n _.defaultsDeep(this.panel, panelDefaults);\n\n this.opacityScales = opacityScales;\n this.colorModes = colorModes;\n this.colorSchemes = colorSchemes;\n\n // default graph width for discrete card width calculation\n this.graph = {\n \"chartWidth\" : -1\n };\n\n this.multipleValues = false;\n this.noColorDefined = false;\n\n this.discreteHelper = new ColorModeDiscrete($scope);\n\n this.dataWarnings = {\n \"noColorDefined\": {\n title: 'Data has value with undefined color',\n tip: 'Check metric values, color values or define a new color',\n },\n \"multipleValues\": {\n title: 'Data has multiple values for one target',\n tip: 'Change targets definitions or set \"use max value\"',\n }\n };\n\n this.events.on('data-received', this.onDataReceived);\n this.events.on('data-snapshot-load', this.onDataReceived);\n this.events.on('data-error', this.onDataError);\n this.events.on('init-edit-mode', this.onInitEditMode);\n this.events.on('render', this.onRender);\n this.events.on('refresh', this.postRefresh);\n // custom event from rendering.js\n this.events.on('render-complete', this.onRenderComplete);\n }\n\n onRenderComplete = (data) => {\n this.graph.chartWidth = data.chartWidth;\n this.renderingCompleted();\n };\n\n // override calculateInterval for discrete color mode\n calculateInterval = () => {\n let panelWidth = Math.ceil($(window).width() * (this.panel.gridPos.w / 24));\n // approximate chartWidth because y axis ticks not rendered yet on first data receive.\n let chartWidth = _.max([\n panelWidth - 200,\n panelWidth/2\n ]);\n\n let minCardWidth = this.panel.cards.cardMinWidth;\n let minSpacing = this.panel.cards.cardSpacing;\n let maxCardsCount = Math.ceil((chartWidth-minCardWidth) / (minCardWidth + minSpacing));\n\n let intervalMs;\n let rangeMs = this.range.to.valueOf() - this.range.from.valueOf();\n\n // this is minimal interval! kbn.round_interval will lower it.\n intervalMs = this.discreteHelper.roundIntervalCeil(rangeMs / maxCardsCount);\n\n // Calculate low limit of interval\n let lowLimitMs = 1; // 1 millisecond default low limit\n let intervalOverride = this.panel.interval;\n\n // if no panel interval check datasource\n if (intervalOverride) {\n intervalOverride = this.templateSrv.replace(intervalOverride, this.panel.scopedVars);\n } else if (this.datasource && this.datasource.interval) {\n intervalOverride = this.datasource.interval;\n }\n\n if (intervalOverride) {\n if (intervalOverride[0] === '>') {\n intervalOverride = intervalOverride.slice(1);\n }\n lowLimitMs = kbn.interval_to_ms(intervalOverride);\n }\n\n if (lowLimitMs > intervalMs) {\n intervalMs = lowLimitMs;\n }\n\n this.intervalMs = intervalMs;\n this.interval = kbn.secondsToHms(intervalMs / 1000);\n };\n\n onDataReceived = (dataList) => {\n this.data = dataList;\n this.cardsData = this.convertToCards(this.data);\n\n this.render();\n };\n\n onInitEditMode = () => {\n this.addEditorTab('Options', statusHeatmapOptionsEditor, 2);\n this.unitFormats = kbn.getUnitFormats();\n };\n\n onRender = () => {\n if (!this.data) { return; }\n\n this.multipleValues = false;\n if (!this.panel.useMax) {\n if (this.cardsData) {\n this.multipleValues = this.cardsData.multipleValues;\n }\n }\n\n this.noColorDefined = false;\n if (this.panel.color.mode === 'discrete') {\n this.discreteHelper.updateCardsValuesHasColorInfo();\n if (this.cardsData) {\n this.noColorDefined = this.cardsData.noColorDefined;\n }\n }\n };\n\n onCardColorChange = (newColor) => {\n this.panel.color.cardColor = newColor;\n this.render();\n };\n\n onDataError = () => {\n this.data = [];\n this.render();\n };\n\n postRefresh = () => {\n this.noColorDefined = false;\n };\n\n onEditorAddThreshold = () => {\n this.panel.color.thresholds.push({ color: this.panel.defaultColor });\n this.render();\n };\n\n onEditorRemoveThreshold = (index) => {\n this.panel.color.thresholds.splice(index, 1);\n this.render();\n };\n\n onEditorAddThreeLights = () => {\n this.panel.color.thresholds.push({color: \"red\", value: 2, tooltip: \"error\" });\n this.panel.color.thresholds.push({color: \"yellow\", value: 1, tooltip: \"warning\" });\n this.panel.color.thresholds.push({color: \"green\", value: 0, tooltip: \"ok\" });\n this.render();\n };\n\n link = (scope, elem, attrs, ctrl) => {\n rendering(scope, elem, attrs, ctrl);\n };\n\n // group values into buckets by target\n convertToCards = (data) => {\n let cardsData = {\n cards: [],\n xBucketSize: 0,\n yBucketSize: 0,\n maxValue: 0,\n minValue: 0,\n multipleValues: false,\n noColorDefined: false,\n };\n\n if (!data || data.length == 0) { return cardsData;}\n\n // collect uniq targets and their indexes in data array\n cardsData.targetIndex = {};\n for (let i = 0; i < data.length; i++) {\n let ts = data[i];\n let target = ts.target;\n if (cardsData.targetIndex[target] == undefined) {\n cardsData.targetIndex[target] = []\n }\n cardsData.targetIndex[target].push(i);\n }\n\n // TODO add some logic for targets heirarchy\n cardsData.targets = _.keys(cardsData.targetIndex);\n cardsData.targets.sort();\n cardsData.yBucketSize = cardsData.targets.length;\n cardsData.xBucketSize = _.min(_.map(data, d => d.datapoints.length));\n\n // Collect all values for each bucket from datapoints with similar target.\n for(let i = 0; i < cardsData.targets.length; i++) {\n let target = cardsData.targets[i];\n\n for (let j = 0; j < cardsData.xBucketSize; j++) {\n let card = {\n id: i*cardsData.xBucketSize + j,\n values: [],\n multipleValues: false,\n noColorDefined: false,\n };\n\n // collect values from all timeseries with target\n for (let si = 0; si < cardsData.targetIndex[target].length; si++) {\n let s = data[cardsData.targetIndex[target][si]];\n let datapoint = s.datapoints[j];\n if (card.values.length === 0) {\n card.x = datapoint[TIME_INDEX];\n card.y = s.target;\n }\n card.values.push(datapoint[VALUE_INDEX]);\n }\n card.minValue = _.min(card.values);\n card.maxValue = _.max(card.values);\n if (card.values.length > 1) {\n cardsData.multipleValues = true;\n card.multipleValues = true;\n card.value = card.maxValue; // max value by default\n } else {\n card.value = card.maxValue; // max value by default\n }\n\n if (cardsData.maxValue < card.maxValue)\n cardsData.maxValue = card.maxValue;\n\n if (cardsData.minValue > card.minValue)\n cardsData.minValue = card.minValue;\n\n cardsData.cards.push(card);\n }\n }\n\n return cardsData;\n };\n}\n"]} \ No newline at end of file diff --git a/src/module.js b/src/module.js index f31cc18..639d67f 100644 --- a/src/module.js +++ b/src/module.js @@ -1,5 +1,4 @@ import {loadPluginCss} from 'app/plugins/sdk'; -import './color_legend'; import { StatusHeatmapCtrl } from './status_heatmap_ctrl'; loadPluginCss({ @@ -7,7 +6,6 @@ loadPluginCss({ light: 'plugins/flant-statusmap-panel/css/statusmap.light.css' }); - export { StatusHeatmapCtrl as PanelCtrl }; diff --git a/src/status_heatmap_ctrl.js b/src/status_heatmap_ctrl.js index 91f276b..9835080 100644 --- a/src/status_heatmap_ctrl.js +++ b/src/status_heatmap_ctrl.js @@ -3,6 +3,7 @@ import _ from 'lodash'; import { contextSrv } from 'app/core/core'; import kbn from 'app/core/utils/kbn'; +import './color_legend'; import rendering from './rendering'; // import aggregates, { aggregatesMap } from './aggregates'; // import fragments, { fragmentsMap } from './fragments'; @@ -88,7 +89,7 @@ const colorSchemes = [ { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' }, { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' }, { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' }, - { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'darm' } + { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'dark' } ]; let colorModes = ['opacity', 'spectrum', 'discrete']; @@ -132,11 +133,13 @@ export class StatusHeatmapCtrl extends MetricsPanelCtrl { this.events.on('init-edit-mode', this.onInitEditMode); this.events.on('render', this.onRender); this.events.on('refresh', this.postRefresh); + // custom event from rendering.js this.events.on('render-complete', this.onRenderComplete); } onRenderComplete = (data) => { this.graph.chartWidth = data.chartWidth; + this.renderingCompleted(); }; // override calculateInterval for discrete color mode