diff --git a/README.md b/README.md
index 54ddad18..708b07f7 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ This plugin will make it easier to do. You just add all the metrics you want to
2. Component disable marker - Set the exact value that represent if the component is disabled, the panel will be grey.
3. Display as text - show extra information about the component in the panel
-Severity and text values can be shown in 2 options:
+Severity and text values can be shown in 2 modes:
1. Regular - under the panel title
2. Annotation - In the top left side of the panel
@@ -35,7 +35,8 @@ You can also repeat the panel on a template if you have multiple instances that
3. Go the the Options tab, and choose the how to treat each metric.
1. For severity display, select the `Threshold` option type under `Handler Type`. Enter the `Warning` and `Critical` thresholds for each of your queries.
* If you want the result to always be displayed with it's value (regardless to the thresholds), check the box titled `Show Always`
- * The plugin automatically detects if higher values are good, or lower values are good by checking which threshold is higher/lower. i.e. if in your metric higher values are better, put a lower value in the "critical" threshold than the "warning" threshold.
+ * In case one of the fields (`Warning`/`Critical`) is a text, there will be equality check with the values.
+ * In case both fields are numbers there will be range check with the values. The plugin automatically detects if higher values are good, or lower values are good by checking which threshold is higher/lower. i.e. if in your metric higher values are better, put a lower value in the `critical` threshold than the `warning` threshold.
2. For disable display, select the `Disable Criteria` option type under `Handler Type`. Enter the `Disable Value` for each of your queries.
3. For display the text without any condition, select the `Text Only` option type under `Handler Type`. The alias + the value of the metric will be shown on the panel by the `Display Type` value.
4. If the query returns multiple values, choose the type of aggregation you want to be used (`None` will just use the most first result)
@@ -47,6 +48,9 @@ The plugins has a 'Remove Prefix' field in the configuration. This field is is m
i.e. you recognize your servers by domain, and they are all name in the following way `www.general-prefix.server.com`, and you would like to remove the prefix from the display, then you enter `www.general-prefix.` and all the panels will only display the `server.com` part.
+### Display Value by Regex
+When you want to display just part of the value for a specific metric in the screen, you can pass a regex in the `Value Regex` field, and if there is match, Only the first match will be displayed. Otherwise, the original value will be displayed.
+
### Measurement URL
Lets say that you want your user to be able to get instructions on what to do when a certain metric is at Warning or Critical levels. Just put a link in this field and the name will become clickable, and send your user to any URL you desire (like an internal wiki).
diff --git a/dist/README.md b/dist/README.md
index 54ddad18..708b07f7 100644
--- a/dist/README.md
+++ b/dist/README.md
@@ -15,7 +15,7 @@ This plugin will make it easier to do. You just add all the metrics you want to
2. Component disable marker - Set the exact value that represent if the component is disabled, the panel will be grey.
3. Display as text - show extra information about the component in the panel
-Severity and text values can be shown in 2 options:
+Severity and text values can be shown in 2 modes:
1. Regular - under the panel title
2. Annotation - In the top left side of the panel
@@ -35,7 +35,8 @@ You can also repeat the panel on a template if you have multiple instances that
3. Go the the Options tab, and choose the how to treat each metric.
1. For severity display, select the `Threshold` option type under `Handler Type`. Enter the `Warning` and `Critical` thresholds for each of your queries.
* If you want the result to always be displayed with it's value (regardless to the thresholds), check the box titled `Show Always`
- * The plugin automatically detects if higher values are good, or lower values are good by checking which threshold is higher/lower. i.e. if in your metric higher values are better, put a lower value in the "critical" threshold than the "warning" threshold.
+ * In case one of the fields (`Warning`/`Critical`) is a text, there will be equality check with the values.
+ * In case both fields are numbers there will be range check with the values. The plugin automatically detects if higher values are good, or lower values are good by checking which threshold is higher/lower. i.e. if in your metric higher values are better, put a lower value in the `critical` threshold than the `warning` threshold.
2. For disable display, select the `Disable Criteria` option type under `Handler Type`. Enter the `Disable Value` for each of your queries.
3. For display the text without any condition, select the `Text Only` option type under `Handler Type`. The alias + the value of the metric will be shown on the panel by the `Display Type` value.
4. If the query returns multiple values, choose the type of aggregation you want to be used (`None` will just use the most first result)
@@ -47,6 +48,9 @@ The plugins has a 'Remove Prefix' field in the configuration. This field is is m
i.e. you recognize your servers by domain, and they are all name in the following way `www.general-prefix.server.com`, and you would like to remove the prefix from the display, then you enter `www.general-prefix.` and all the panels will only display the `server.com` part.
+### Display Value by Regex
+When you want to display just part of the value for a specific metric in the screen, you can pass a regex in the `Value Regex` field, and if there is match, Only the first match will be displayed. Otherwise, the original value will be displayed.
+
### Measurement URL
Lets say that you want your user to be able to get instructions on what to do when a certain metric is at Warning or Critical levels. Just put a link in this field and the name will become clickable, and send your user to any URL you desire (like an internal wiki).
diff --git a/dist/editor.html b/dist/editor.html
index b62a17c2..ee2de978 100644
--- a/dist/editor.html
+++ b/dist/editor.html
@@ -79,6 +79,21 @@
{{ display.alias }}
{{ display.alias }}
-
- {{ display.display_value | numberOrText }}
+
- {{ display.display_value | numberOrTextWithRegex : display.valueDisplayRegex }}
{{ crit.alias }}
{{ crit.alias }}
-
- {{ crit.display_value | numberOrText }}
+
- {{ crit.display_value | numberOrTextWithRegex : crit.valueDisplayRegex }}
{{ warn.alias }}
{{ warn.alias }}
-
- {{ warn.display_value | numberOrText }}
+
- {{ warn.display_value | numberOrTextWithRegex : warn.valueDisplayRegex }}
diff --git a/dist/plugin.json b/dist/plugin.json
index f93ead75..bee5310d 100644
--- a/dist/plugin.json
+++ b/dist/plugin.json
@@ -24,7 +24,7 @@
{"name": "Critical State", "path": "img/error.png"}
],
"version": "1.0.3",
- "updated": "2017-3-23"
+ "updated": "2017-4-9"
},
"dependencies": {
diff --git a/dist/status_ctrl.js b/dist/status_ctrl.js
index a89e88e6..472c3bf7 100644
--- a/dist/status_ctrl.js
+++ b/dist/status_ctrl.js
@@ -111,6 +111,36 @@ System.register(["app/plugins/sdk", "app/plugins/panel/graph/legend", "app/plugi
numberOrTextFilter.$stateful = true;
return numberOrTextFilter;
});
+
+ coreModule.filter('numberOrTextWithRegex', function () {
+ var numberOrTextFilter = function numberOrTextFilter(input, textRegex) {
+ if (angular.isNumber(input)) {
+ return _this2.filter('number')(input);
+ } else {
+ if (textRegex == null || textRegex.length == 0) {
+ return input;
+ } else {
+ var regex = void 0;
+
+ try {
+ regex = new RegExp(textRegex);
+ } catch (e) {
+ return input;
+ }
+
+ var matchResults = input.match(regex);
+ if (matchResults == null) {
+ return input;
+ } else {
+ return matchResults[0];
+ }
+ }
+ }
+ };
+
+ numberOrTextFilter.$stateful = true;
+ return numberOrTextFilter;
+ });
}
}, {
key: "postRefresh",
@@ -202,6 +232,11 @@ System.register(["app/plugins/sdk", "app/plugins/panel/graph/legend", "app/plugi
s.url = target.url;
s.display = true;
s.displayType = target.displayType;
+ s.valueDisplayRegex = "";
+
+ if (_this4.validateRegex(target.valueDisplayRegex)) {
+ s.valueDisplayRegex = target.valueDisplayRegex;
+ }
var value = void 0;
switch (target.aggregation) {
@@ -366,6 +401,19 @@ System.register(["app/plugins/sdk", "app/plugins/panel/graph/legend", "app/plugi
this.uri = undefined;
}
}
+ }, {
+ key: "validateRegex",
+ value: function validateRegex(textRegex) {
+ if (textRegex == null || textRegex.length == 0) {
+ return true;
+ }
+ try {
+ var regex = new RegExp(textRegex);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
}, {
key: "onDataReceived",
value: function onDataReceived(dataList) {
diff --git a/dist/status_ctrl.js.map b/dist/status_ctrl.js.map
index fcb63538..4f953f0e 100644
--- a/dist/status_ctrl.js.map
+++ b/dist/status_ctrl.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/status_ctrl.js"],"names":["MetricsPanelCtrl","_","TimeSeries","coreModule","StatusPluginCtrl","$scope","$injector","$log","$filter","annotationsSrv","filter","valueHandlers","aggregations","displayTypes","panel","flipTime","events","on","onRender","bind","postRefresh","onDataError","onDataReceived","onInitEditMode","addFilters","numberOrTextFilter","input","angular","isNumber","$stateful","fixedSpan","span","measurements","targets","duplicates","measurement","hide","each","m","res","alias","target","length","addEditorTab","$panelContainer","find","css","$panelContoller","height","minHeight","tail","panelWidth","innerWidth","isNaN","parseInt","slice","maxWidth","setElementHeight","setTextMaxWidth","upgradeOldVersion","clusterName","displayName","replace","RegExp","namePrefix","flipCard","addClass","removeClass","crit","warn","disabled","display","annotation","series","s","url","displayType","value","aggregation","max","datapoints","point","stats","min","total","avg","display_value","valueHandler","handleThresholdStatus","handleDisabledStatus","handleTextOnly","autoFlip","handleCssDisplay","parseUri","thresholds","parseThresholds","inverted","isCritical","isWarning","isCheckRanges","warnIsNumber","critIsNumber","push","disabledValue","undefined","isGrayOnNoData","links","uri","dashUri","params","dataList","map","seriesHandler","render","timeoutId","clearInterval","setInterval","toggleClass","scope","elem","attrs","ctrl","metricOptions","isFloat","parseFloat","val","toString","toLowerCase","indexOf","seriesData","flotpairs","getFlotPairs","templateUrl"],"mappings":"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","file":"status_ctrl.js","sourcesContent":["import {MetricsPanelCtrl} from \"app/plugins/sdk\";\nimport \"app/plugins/panel/graph/legend\";\nimport \"app/plugins/panel/graph/series_overrides_ctrl\";\nimport _ from \"lodash\";\nimport TimeSeries from \"app/core/time_series2\";\nimport coreModule from \"app/core/core_module\"\n\nimport './css/status_panel.css!';\n\nexport class StatusPluginCtrl extends MetricsPanelCtrl {\n\t/** @ngInject */\n\tconstructor($scope, $injector, $log, $filter, annotationsSrv) {\n\t\tsuper($scope, $injector);\n\n\t\t//this.log = $log.debug;\n\t\tthis.filter = $filter;\n\n\t\tthis.valueHandlers = ['Threshold', 'Disable Criteria', 'Text Only'];\n\t\tthis.aggregations = ['Last', 'First', 'Max', 'Min', 'Sum', 'Avg'];\n\t\tthis.displayTypes = ['Regular', 'Annotation'];\n\n\t\tthis.panel.flipTime = this.panel.flipTime || 5;\n\n\t\t/** Bind events to functions **/\n\t\tthis.events.on('render', this.onRender.bind(this));\n\t\tthis.events.on('refresh', this.postRefresh.bind(this));\n\t\tthis.events.on('data-error', this.onDataError.bind(this));\n\t\tthis.events.on('data-received', this.onDataReceived.bind(this));\n\t\tthis.events.on('data-snapshot-load', this.onDataReceived.bind(this));\n\t\tthis.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n\n\t\tthis.addFilters()\n\t}\n\n\taddFilters() {\n\t\tcoreModule.filter('numberOrText', () => {\n\t\t\tlet numberOrTextFilter = (input) => {\n\t\t\t\tif(angular.isNumber(input)) {\n\t\t\t\t\treturn this.filter('number')(input);\n\t\t\t\t} else {\n\t\t\t\t\treturn input;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tnumberOrTextFilter.$stateful = true;\n\t\t\treturn numberOrTextFilter;\n\t\t});\n\t}\n\n\tpostRefresh() {\n\t\tif (this.panel.fixedSpan) {\n\t\t\tthis.panel.span = this.panel.fixedSpan;\n\t\t}\n\n\t\tthis.measurements = this.panel.targets;\n\n\t\t/** Duplicate alias validation **/\n\t\tthis.duplicates = false;\n\n\t\tthis.measurements = _.filter(this.measurements, (measurement) => {\n\t\t\treturn !measurement.hide;\n\t\t});\n\n\t\t_.each(this.measurements, (m) => {\n\t\t\tlet res = _.filter(this.measurements, (measurement) => {\n\t\t\t\treturn (m.alias == measurement.alias || (m.target == measurement.target && m.target)) && !m.hide;\n\t\t\t});\n\n\t\t\tif (res.length > 1) {\n\t\t\t\tthis.duplicates = true;\n\t\t\t}\n\t\t});\n\t}\n\n\tonInitEditMode() {\n\t\tthis.addEditorTab('Options', 'public/plugins/vonage-status-panel/editor.html', 2);\n\t}\n\n\tsetElementHeight() {\n\t\tthis.$panelContainer.find('.status-panel').css('min-height', this.$panelContoller.height + 'px');\n\t\tthis.minHeight = this.$panelContoller.height-10;\n\t}\n\n\tsetTextMaxWidth() {\n\t\tlet tail = ' …';\n\t\tlet panelWidth = this.$panelContainer.innerWidth();\n\t\tif (isNaN(panelWidth))\n\t\t\tpanelWidth = parseInt(panelWidth.slice(0, -2), 10) / 12;\n\t\tpanelWidth = panelWidth - 20;\n\t\tthis.maxWidth = panelWidth;\n\t}\n\n\tonRender() {\n\t\tthis.setElementHeight();\n\t\tthis.setTextMaxWidth();\n\t\tthis.upgradeOldVersion();\n\n\t\tif (this.panel.clusterName) {\n\t\t\tthis.panel.displayName =\n\t\t\t\tthis.filter('interpolateTemplateVars')(this.panel.clusterName, this.$scope)\n\t\t\t\t\t.replace(new RegExp(this.panel.namePrefix, 'i'), '');\n\t\t} else {\n\t\t\tthis.panel.displayName = \"\";\n\t\t}\n\n\t\tif(this.panel.flipCard){\n\t\t this.$panelContainer.addClass(\"effect-hover\");\n\t\t} else {\n\t\t this.$panelContainer.removeClass(\"effect-hover\");\n\t\t}\n\n\t\tlet targets = this.panel.targets;\n\n\t\tthis.crit = [];\n\t\tthis.warn = [];\n\t\tthis.disabled = [];\n\t\tthis.display = [];\n\t\tthis.annotation = [];\n\n\t\t_.each(this.series, (s) => {\n\t\t\tlet target = _.find(targets, (target) => {\n\t\t\t\treturn target.alias == s.alias || target.target == s.alias;\n\t\t\t});\n\n\t\t\tif (!target) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ts.alias = target.alias;\n\t\t\ts.url = target.url;\n\t\t\ts.display = true;\n\t\t\ts.displayType = target.displayType;\n\n\t\t\tlet value;\n\t\t\tswitch (target.aggregation) {\n\t\t\t\tcase 'Max':\n\t\t\t\t\tvalue = _.max(s.datapoints, (point) => { return point[0]; })[0];\n\t\t\t\t\tvalue = s.stats.max;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Min':\n\t\t\t\t\tvalue = _.min(s.datapoints, (point) => { return point[0]; })[0];\n\t\t\t\t\tvalue = s.stats.min;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Sum':\n\t\t\t\t\tvalue = 0;\n\t\t\t\t\t_.each(s.datapoints, (point) => { value += point[0] });\n\t\t\t\t\tvalue = s.stats.total;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Avg':\n\t\t\t\t\tvalue = s.stats.avg;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'First':\n\t\t\t\t\tvalue = s.datapoints[0][0];\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalue = s.datapoints[s.datapoints.length - 1][0];\n\t\t\t}\n\n\t\t\ts.display_value = value;\n\n\t\t\tif (target.valueHandler == \"Threshold\") {\n\t\t\t\tthis.handleThresholdStatus(s, target);\n\t\t\t}\n\t\t\telse if (target.valueHandler == \"Disable Criteria\") {\n\t\t\t\tthis.handleDisabledStatus(s,target);\n\t\t\t}\n\t\t\telse if (target.valueHandler == \"Text Only\") {\n\t\t\t\tthis.handleTextOnly(s, target);\n\t\t\t}\n\t\t});\n\n\t\tif(this.disabled.length > 0) {\n\t\t\tthis.crit = [];\n\t\t\tthis.warn = [];\n\t\t\tthis.display = [];\n\t\t}\n\n\t\tthis.autoFlip();\n\t\tthis.handleCssDisplay();\n\t\tthis.parseUri();\n\t}\n\n\tupgradeOldVersion() {\n\t\tlet targets = this.panel.targets;\n\n\t\t//Handle legacy code\n\t\t_.each(targets, (target) => {\n\t\t\tif(target.valueHandler == null) {\n\t\t\t\ttarget.valueHandler = target.displayType;\n\t\t\t\tif(target.valueHandler == \"Annotation\") {\n\t\t\t\t\ttarget.valueHandler = \"Text Only\"\n\t\t\t\t}\n\t\t\t\ttarget.displayType = this.displayTypes[0];\n\t\t\t}\n\t\t});\n\t}\n\n\thandleThresholdStatus(series, target) {\n\t\tseries.thresholds = StatusPluginCtrl.parseThresholds(target);\n\t\tseries.inverted = series.thresholds.crit < series.thresholds.warn;\n\t\tseries.display = target.display;\n\n\t\tlet isCritical = false;\n\t\tlet isWarning = false;\n\t\tlet isCheckRanges = series.thresholds.warnIsNumber && series.thresholds.critIsNumber;\n\t\tif (isCheckRanges) {\n\t\t\tif (!series.inverted) {\n\t\t\t\tif (series.display_value >= series.thresholds.crit) {\n\t\t\t\t\tisCritical = true\n\t\t\t\t} else if (series.display_value >= series.thresholds.warn) {\n\t\t\t\t\tisWarning = true\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (series.display_value <= series.thresholds.crit) {\n\t\t\t\t\tisCritical = true\n\t\t\t\t} else if (series.display_value <= series.thresholds.warn) {\n\t\t\t\t\tisWarning = true\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (series.display_value == series.thresholds.crit) {\n\t\t\t\tisCritical = true\n\t\t\t} else if (series.display_value == series.thresholds.warn) {\n\t\t\t\tisWarning = true\n\t\t\t}\n\t\t}\n\n\t\tif(isCritical) {\n\t\t\tthis.crit.push(series);\n\t\t\tseries.displayType = this.displayTypes[0]\n\t\t} else if(isWarning) {\n\t\t\tthis.warn.push(series);\n\t\t\tseries.displayType = this.displayTypes[0]\n\t\t} else if (series.display) {\n\t\t\tif(series.displayType == \"Annotation\") {\n\t\t\t\tthis.annotation.push(series);\n\t\t\t} else {\n\t\t\t\tthis.display.push(series);\n\t\t\t}\n\t\t}\n\t}\n\n\thandleDisabledStatus(series, target) {\n\t\tseries.displayType = this.displayTypes[0];\n\t\tseries.disabledValue = target.disabledValue;\n\n\t\tif (series.display_value == series.disabledValue) {\n\t\t\tthis.disabled.push(series);\n\t\t}\n\t}\n\n\thandleTextOnly(series, target) {\n\t\tif(series.displayType == \"Annotation\") {\n\t\t\tthis.annotation.push(series);\n\t\t} else {\n\t\t\tthis.display.push(series);\n\t\t}\n\t}\n\n\thandleCssDisplay() {\n\t\tthis.$panelContainer.removeClass('error-state warn-state disabled-state ok-state no-data-state');\n\n\t\tif(this.duplicates) {\n\t\t\tthis.$panelContainer.addClass('error-state');\n\t\t} else if (this.disabled.length > 0) {\n\t\t\tthis.$panelContainer.addClass('disabled-state');\n\t\t} else if (this.crit.length > 0) {\n\t\t\tthis.$panelContainer.addClass('error-state');\n\t\t} else if (this.warn.length > 0) {\n\t\t\tthis.$panelContainer.addClass('warn-state');\n\t\t} else if((this.series == undefined || this.series.length == 0) && this.panel.isGrayOnNoData) {\n\t\t\tthis.$panelContainer.addClass('no-data-state');\n\t\t} else {\n\t\t\tthis.$panelContainer.addClass('ok-state');\n\t\t}\n\t}\n\n\tparseUri() {\n\t\tif (this.panel.links && this.panel.links.length > 0) {\n\t\t\tthis.uri = this.panel.links[0].dashUri + \"?\" + this.panel.links[0].params;\n\t\t} else {\n\t\t\tthis.uri = undefined;\n\t\t}\n\t}\n\n\tstatic parseThresholds(metricOptions) {\n\t\tlet res = {};\n\n\t\tres.warnIsNumber = StatusPluginCtrl.isFloat(metricOptions.warn)\n\t\tif(res.warnIsNumber) {\n\t\t\tres.warn = parseFloat(metricOptions.warn);\n\t\t} else {\n\t\t\tres.warn = metricOptions.warn;\n\t\t}\n\n\t\tres.critIsNumber = StatusPluginCtrl.isFloat(metricOptions.crit);\n\t\tif(res.critIsNumber) {\n\t\t\tres.crit = parseFloat(metricOptions.crit);\n\t\t} else {\n\t\t\tres.crit = metricOptions.crit;\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tstatic isFloat(val) {\n\t\tif (!isNaN(val) && val.toString().toLowerCase().indexOf('e') == -1) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tonDataReceived(dataList) {\n\t\tthis.series = dataList.map(StatusPluginCtrl.seriesHandler.bind(this));\n\t\tthis.render();\n\t}\n\n\tonDataError() {\n\t\tthis.crit = [];\n\t\tthis.warn = [];\n\t}\n\n\tstatic seriesHandler(seriesData) {\n\t\tvar series = new TimeSeries({\n\t\t\tdatapoints: seriesData.datapoints,\n\t\t\talias: seriesData.target\n\t\t});\n\n\t\tseries.flotpairs = series.getFlotPairs(\"connected\");\n\n\t\treturn series;\n\t}\n\n\t$onDestroy() {\n\t\tif(this.timeoutId) clearInterval(this.timeoutId);\n\t}\n\n\tautoFlip() {\n\t\tif (this.timeoutId) clearInterval(this.timeoutId);\n\t\tif (this.panel.flipCard && (this.crit.length > 0 || this.warn.length > 0 || this.disabled.length > 0)) {\n\t\t\tthis.timeoutId = setInterval(() => {\n\t\t\t\tthis.$panelContainer.toggleClass(\"flipped\");\n\t\t\t}, this.panel.flipTime * 1000);\n\t\t}\n\t}\n\n\tlink(scope, elem, attrs, ctrl) {\n\t\tthis.$panelContainer = elem.find('.panel-container');\n\t\tthis.$panelContainer.addClass(\"st-card\");\n\t\tthis.$panelContoller = ctrl;\n\t}\n}\n\nStatusPluginCtrl.templateUrl = 'module.html';\n"]}
\ No newline at end of file
+{"version":3,"sources":["../src/status_ctrl.js"],"names":["MetricsPanelCtrl","_","TimeSeries","coreModule","StatusPluginCtrl","$scope","$injector","$log","$filter","annotationsSrv","filter","valueHandlers","aggregations","displayTypes","panel","flipTime","events","on","onRender","bind","postRefresh","onDataError","onDataReceived","onInitEditMode","addFilters","numberOrTextFilter","input","angular","isNumber","$stateful","textRegex","length","regex","RegExp","e","matchResults","match","fixedSpan","span","measurements","targets","duplicates","measurement","hide","each","m","res","alias","target","addEditorTab","$panelContainer","find","css","$panelContoller","height","minHeight","tail","panelWidth","innerWidth","isNaN","parseInt","slice","maxWidth","setElementHeight","setTextMaxWidth","upgradeOldVersion","clusterName","displayName","replace","namePrefix","flipCard","addClass","removeClass","crit","warn","disabled","display","annotation","series","s","url","displayType","valueDisplayRegex","validateRegex","value","aggregation","max","datapoints","point","stats","min","total","avg","display_value","valueHandler","handleThresholdStatus","handleDisabledStatus","handleTextOnly","autoFlip","handleCssDisplay","parseUri","thresholds","parseThresholds","inverted","isCritical","isWarning","isCheckRanges","warnIsNumber","critIsNumber","push","disabledValue","undefined","isGrayOnNoData","links","uri","dashUri","params","dataList","map","seriesHandler","render","timeoutId","clearInterval","setInterval","toggleClass","scope","elem","attrs","ctrl","metricOptions","isFloat","parseFloat","val","toString","toLowerCase","indexOf","seriesData","flotpairs","getFlotPairs","templateUrl"],"mappings":"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","file":"status_ctrl.js","sourcesContent":["import {MetricsPanelCtrl} from \"app/plugins/sdk\";\nimport \"app/plugins/panel/graph/legend\";\nimport \"app/plugins/panel/graph/series_overrides_ctrl\";\nimport _ from \"lodash\";\nimport TimeSeries from \"app/core/time_series2\";\nimport coreModule from \"app/core/core_module\"\n\nimport './css/status_panel.css!';\n\nexport class StatusPluginCtrl extends MetricsPanelCtrl {\n\t/** @ngInject */\n\tconstructor($scope, $injector, $log, $filter, annotationsSrv) {\n\t\tsuper($scope, $injector);\n\n\t\t//this.log = $log.debug;\n\t\tthis.filter = $filter;\n\n\t\tthis.valueHandlers = ['Threshold', 'Disable Criteria', 'Text Only'];\n\t\tthis.aggregations = ['Last', 'First', 'Max', 'Min', 'Sum', 'Avg'];\n\t\tthis.displayTypes = ['Regular', 'Annotation'];\n\n\t\tthis.panel.flipTime = this.panel.flipTime || 5;\n\n\t\t/** Bind events to functions **/\n\t\tthis.events.on('render', this.onRender.bind(this));\n\t\tthis.events.on('refresh', this.postRefresh.bind(this));\n\t\tthis.events.on('data-error', this.onDataError.bind(this));\n\t\tthis.events.on('data-received', this.onDataReceived.bind(this));\n\t\tthis.events.on('data-snapshot-load', this.onDataReceived.bind(this));\n\t\tthis.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n\n\t\tthis.addFilters()\n\t}\n\n\taddFilters() {\n\t\tcoreModule.filter('numberOrText', () => {\n\t\t\tlet numberOrTextFilter = (input) => {\n\t\t\t\tif(angular.isNumber(input)) {\n\t\t\t\t\treturn this.filter('number')(input);\n\t\t\t\t} else {\n\t\t\t\t\treturn input;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tnumberOrTextFilter.$stateful = true;\n\t\t\treturn numberOrTextFilter;\n\t\t});\n\n\t\tcoreModule.filter('numberOrTextWithRegex', () => {\n\t\t\tlet numberOrTextFilter = (input, textRegex) => {\n\t\t\t\tif(angular.isNumber(input)) {\n\t\t\t\t\treturn this.filter('number')(input);\n\t\t\t\t} else {\n\t\t\t\t\tif(textRegex == null || textRegex.length == 0) {\n\t\t\t\t\t\treturn input;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet regex;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tregex = new RegExp(textRegex);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\treturn input;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet matchResults = input.match(regex);\n\t\t\t\t\t\tif (matchResults == null) {\n\t\t\t\t\t\t\treturn input;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn matchResults[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tnumberOrTextFilter.$stateful = true;\n\t\t\treturn numberOrTextFilter;\n\t\t});\n\t}\n\n\tpostRefresh() {\n\t\tif (this.panel.fixedSpan) {\n\t\t\tthis.panel.span = this.panel.fixedSpan;\n\t\t}\n\n\t\tthis.measurements = this.panel.targets;\n\n\t\t/** Duplicate alias validation **/\n\t\tthis.duplicates = false;\n\n\t\tthis.measurements = _.filter(this.measurements, (measurement) => {\n\t\t\treturn !measurement.hide;\n\t\t});\n\n\t\t_.each(this.measurements, (m) => {\n\t\t\tlet res = _.filter(this.measurements, (measurement) => {\n\t\t\t\treturn (m.alias == measurement.alias || (m.target == measurement.target && m.target)) && !m.hide;\n\t\t\t});\n\n\t\t\tif (res.length > 1) {\n\t\t\t\tthis.duplicates = true;\n\t\t\t}\n\t\t});\n\t}\n\n\tonInitEditMode() {\n\t\tthis.addEditorTab('Options', 'public/plugins/vonage-status-panel/editor.html', 2);\n\t}\n\n\tsetElementHeight() {\n\t\tthis.$panelContainer.find('.status-panel').css('min-height', this.$panelContoller.height + 'px');\n\t\tthis.minHeight = this.$panelContoller.height-10;\n\t}\n\n\tsetTextMaxWidth() {\n\t\tlet tail = ' …';\n\t\tlet panelWidth = this.$panelContainer.innerWidth();\n\t\tif (isNaN(panelWidth))\n\t\t\tpanelWidth = parseInt(panelWidth.slice(0, -2), 10) / 12;\n\t\tpanelWidth = panelWidth - 20;\n\t\tthis.maxWidth = panelWidth;\n\t}\n\n\tonRender() {\n\t\tthis.setElementHeight();\n\t\tthis.setTextMaxWidth();\n\t\tthis.upgradeOldVersion();\n\n\t\tif (this.panel.clusterName) {\n\t\t\tthis.panel.displayName =\n\t\t\t\tthis.filter('interpolateTemplateVars')(this.panel.clusterName, this.$scope)\n\t\t\t\t\t.replace(new RegExp(this.panel.namePrefix, 'i'), '');\n\t\t} else {\n\t\t\tthis.panel.displayName = \"\";\n\t\t}\n\n\t\tif(this.panel.flipCard){\n\t\t this.$panelContainer.addClass(\"effect-hover\");\n\t\t} else {\n\t\t this.$panelContainer.removeClass(\"effect-hover\");\n\t\t}\n\n\t\tlet targets = this.panel.targets;\n\n\t\tthis.crit = [];\n\t\tthis.warn = [];\n\t\tthis.disabled = [];\n\t\tthis.display = [];\n\t\tthis.annotation = [];\n\n\t\t_.each(this.series, (s) => {\n\t\t\tlet target = _.find(targets, (target) => {\n\t\t\t\treturn target.alias == s.alias || target.target == s.alias;\n\t\t\t});\n\n\t\t\tif (!target) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ts.alias = target.alias;\n\t\t\ts.url = target.url;\n\t\t\ts.display = true;\n\t\t\ts.displayType = target.displayType;\n\t\t\ts.valueDisplayRegex = \"\";\n\n\t\t\tif(this.validateRegex(target.valueDisplayRegex)) {\n\t\t\t\ts.valueDisplayRegex = target.valueDisplayRegex;\n\t\t\t}\n\n\t\t\tlet value;\n\t\t\tswitch (target.aggregation) {\n\t\t\t\tcase 'Max':\n\t\t\t\t\tvalue = _.max(s.datapoints, (point) => { return point[0]; })[0];\n\t\t\t\t\tvalue = s.stats.max;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Min':\n\t\t\t\t\tvalue = _.min(s.datapoints, (point) => { return point[0]; })[0];\n\t\t\t\t\tvalue = s.stats.min;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Sum':\n\t\t\t\t\tvalue = 0;\n\t\t\t\t\t_.each(s.datapoints, (point) => { value += point[0] });\n\t\t\t\t\tvalue = s.stats.total;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Avg':\n\t\t\t\t\tvalue = s.stats.avg;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'First':\n\t\t\t\t\tvalue = s.datapoints[0][0];\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalue = s.datapoints[s.datapoints.length - 1][0];\n\t\t\t}\n\n\t\t\ts.display_value = value;\n\n\t\t\tif (target.valueHandler == \"Threshold\") {\n\t\t\t\tthis.handleThresholdStatus(s, target);\n\t\t\t}\n\t\t\telse if (target.valueHandler == \"Disable Criteria\") {\n\t\t\t\tthis.handleDisabledStatus(s,target);\n\t\t\t}\n\t\t\telse if (target.valueHandler == \"Text Only\") {\n\t\t\t\tthis.handleTextOnly(s, target);\n\t\t\t}\n\t\t});\n\n\t\tif(this.disabled.length > 0) {\n\t\t\tthis.crit = [];\n\t\t\tthis.warn = [];\n\t\t\tthis.display = [];\n\t\t}\n\n\t\tthis.autoFlip();\n\t\tthis.handleCssDisplay();\n\t\tthis.parseUri();\n\t}\n\n\tupgradeOldVersion() {\n\t\tlet targets = this.panel.targets;\n\n\t\t//Handle legacy code\n\t\t_.each(targets, (target) => {\n\t\t\tif(target.valueHandler == null) {\n\t\t\t\ttarget.valueHandler = target.displayType;\n\t\t\t\tif(target.valueHandler == \"Annotation\") {\n\t\t\t\t\ttarget.valueHandler = \"Text Only\"\n\t\t\t\t}\n\t\t\t\ttarget.displayType = this.displayTypes[0];\n\t\t\t}\n\t\t});\n\t}\n\n\thandleThresholdStatus(series, target) {\n\t\tseries.thresholds = StatusPluginCtrl.parseThresholds(target);\n\t\tseries.inverted = series.thresholds.crit < series.thresholds.warn;\n\t\tseries.display = target.display;\n\n\t\tlet isCritical = false;\n\t\tlet isWarning = false;\n\t\tlet isCheckRanges = series.thresholds.warnIsNumber && series.thresholds.critIsNumber;\n\t\tif (isCheckRanges) {\n\t\t\tif (!series.inverted) {\n\t\t\t\tif (series.display_value >= series.thresholds.crit) {\n\t\t\t\t\tisCritical = true\n\t\t\t\t} else if (series.display_value >= series.thresholds.warn) {\n\t\t\t\t\tisWarning = true\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (series.display_value <= series.thresholds.crit) {\n\t\t\t\t\tisCritical = true\n\t\t\t\t} else if (series.display_value <= series.thresholds.warn) {\n\t\t\t\t\tisWarning = true\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (series.display_value == series.thresholds.crit) {\n\t\t\t\tisCritical = true\n\t\t\t} else if (series.display_value == series.thresholds.warn) {\n\t\t\t\tisWarning = true\n\t\t\t}\n\t\t}\n\n\t\tif(isCritical) {\n\t\t\tthis.crit.push(series);\n\t\t\tseries.displayType = this.displayTypes[0]\n\t\t} else if(isWarning) {\n\t\t\tthis.warn.push(series);\n\t\t\tseries.displayType = this.displayTypes[0]\n\t\t} else if (series.display) {\n\t\t\tif(series.displayType == \"Annotation\") {\n\t\t\t\tthis.annotation.push(series);\n\t\t\t} else {\n\t\t\t\tthis.display.push(series);\n\t\t\t}\n\t\t}\n\t}\n\n\thandleDisabledStatus(series, target) {\n\t\tseries.displayType = this.displayTypes[0];\n\t\tseries.disabledValue = target.disabledValue;\n\n\t\tif (series.display_value == series.disabledValue) {\n\t\t\tthis.disabled.push(series);\n\t\t}\n\t}\n\n\thandleTextOnly(series, target) {\n\t\tif(series.displayType == \"Annotation\") {\n\t\t\tthis.annotation.push(series);\n\t\t} else {\n\t\t\tthis.display.push(series);\n\t\t}\n\t}\n\n\thandleCssDisplay() {\n\t\tthis.$panelContainer.removeClass('error-state warn-state disabled-state ok-state no-data-state');\n\n\t\tif(this.duplicates) {\n\t\t\tthis.$panelContainer.addClass('error-state');\n\t\t} else if (this.disabled.length > 0) {\n\t\t\tthis.$panelContainer.addClass('disabled-state');\n\t\t} else if (this.crit.length > 0) {\n\t\t\tthis.$panelContainer.addClass('error-state');\n\t\t} else if (this.warn.length > 0) {\n\t\t\tthis.$panelContainer.addClass('warn-state');\n\t\t} else if((this.series == undefined || this.series.length == 0) && this.panel.isGrayOnNoData) {\n\t\t\tthis.$panelContainer.addClass('no-data-state');\n\t\t} else {\n\t\t\tthis.$panelContainer.addClass('ok-state');\n\t\t}\n\t}\n\n\tparseUri() {\n\t\tif (this.panel.links && this.panel.links.length > 0) {\n\t\t\tthis.uri = this.panel.links[0].dashUri + \"?\" + this.panel.links[0].params;\n\t\t} else {\n\t\t\tthis.uri = undefined;\n\t\t}\n\t}\n\n\tvalidateRegex(textRegex) {\n\t\tif(textRegex == null || textRegex.length == 0) {\n\t\t\treturn true\n\t\t}\n\t\ttry {\n\t\t\tlet regex = new RegExp(textRegex);\n\t\t\treturn true\n\t\t} catch(e) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tstatic parseThresholds(metricOptions) {\n\t\tlet res = {};\n\n\t\tres.warnIsNumber = StatusPluginCtrl.isFloat(metricOptions.warn)\n\t\tif(res.warnIsNumber) {\n\t\t\tres.warn = parseFloat(metricOptions.warn);\n\t\t} else {\n\t\t\tres.warn = metricOptions.warn;\n\t\t}\n\n\t\tres.critIsNumber = StatusPluginCtrl.isFloat(metricOptions.crit);\n\t\tif(res.critIsNumber) {\n\t\t\tres.crit = parseFloat(metricOptions.crit);\n\t\t} else {\n\t\t\tres.crit = metricOptions.crit;\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tstatic isFloat(val) {\n\t\tif (!isNaN(val) && val.toString().toLowerCase().indexOf('e') == -1) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tonDataReceived(dataList) {\n\t\tthis.series = dataList.map(StatusPluginCtrl.seriesHandler.bind(this));\n\t\tthis.render();\n\t}\n\n\tonDataError() {\n\t\tthis.crit = [];\n\t\tthis.warn = [];\n\t}\n\n\tstatic seriesHandler(seriesData) {\n\t\tvar series = new TimeSeries({\n\t\t\tdatapoints: seriesData.datapoints,\n\t\t\talias: seriesData.target\n\t\t});\n\n\t\tseries.flotpairs = series.getFlotPairs(\"connected\");\n\n\t\treturn series;\n\t}\n\n\t$onDestroy() {\n\t\tif(this.timeoutId) clearInterval(this.timeoutId);\n\t}\n\n\tautoFlip() {\n\t\tif (this.timeoutId) clearInterval(this.timeoutId);\n\t\tif (this.panel.flipCard && (this.crit.length > 0 || this.warn.length > 0 || this.disabled.length > 0)) {\n\t\t\tthis.timeoutId = setInterval(() => {\n\t\t\t\tthis.$panelContainer.toggleClass(\"flipped\");\n\t\t\t}, this.panel.flipTime * 1000);\n\t\t}\n\t}\n\n\tlink(scope, elem, attrs, ctrl) {\n\t\tthis.$panelContainer = elem.find('.panel-container');\n\t\tthis.$panelContainer.addClass(\"st-card\");\n\t\tthis.$panelContoller = ctrl;\n\t}\n}\n\nStatusPluginCtrl.templateUrl = 'module.html';\n"]}
\ No newline at end of file
diff --git a/src/editor.html b/src/editor.html
index b62a17c2..ee2de978 100644
--- a/src/editor.html
+++ b/src/editor.html
@@ -79,6 +79,21 @@
Display Settings
+
+
+
@@ -87,7 +102,7 @@ Display Settings
Make the name of the metric clickable, and send the user to a link (with explanations what to do when this error occurs)
-
+
diff --git a/src/module.html b/src/module.html
index 7e0d59ca..c00901bb 100644
--- a/src/module.html
+++ b/src/module.html
@@ -18,7 +18,7 @@
{{ annoation.alias }}
{{ annotation.alias }}
-
- {{ annotation.display_value | numberOrText}}
+
- {{ annotation.display_value | numberOrTextWithRegex : annotation.valueDisplayRegex}}
@@ -41,19 +41,19 @@
{{ display.alias }}
{{ display.alias }}
-
- {{ display.display_value | numberOrText }}
+
- {{ display.display_value | numberOrTextWithRegex : display.valueDisplayRegex }}
{{ crit.alias }}
{{ crit.alias }}
-
- {{ crit.display_value | numberOrText }}
+
- {{ crit.display_value | numberOrTextWithRegex : crit.valueDisplayRegex }}
{{ warn.alias }}
{{ warn.alias }}
-
- {{ warn.display_value | numberOrText }}
+
- {{ warn.display_value | numberOrTextWithRegex : warn.valueDisplayRegex }}
diff --git a/src/plugin.json b/src/plugin.json
index f93ead75..bee5310d 100644
--- a/src/plugin.json
+++ b/src/plugin.json
@@ -24,7 +24,7 @@
{"name": "Critical State", "path": "img/error.png"}
],
"version": "1.0.3",
- "updated": "2017-3-23"
+ "updated": "2017-4-9"
},
"dependencies": {
diff --git a/src/status_ctrl.js b/src/status_ctrl.js
index 4eb112b9..5e18a703 100644
--- a/src/status_ctrl.js
+++ b/src/status_ctrl.js
@@ -45,6 +45,36 @@ export class StatusPluginCtrl extends MetricsPanelCtrl {
numberOrTextFilter.$stateful = true;
return numberOrTextFilter;
});
+
+ coreModule.filter('numberOrTextWithRegex', () => {
+ let numberOrTextFilter = (input, textRegex) => {
+ if(angular.isNumber(input)) {
+ return this.filter('number')(input);
+ } else {
+ if(textRegex == null || textRegex.length == 0) {
+ return input;
+ } else {
+ let regex;
+
+ try {
+ regex = new RegExp(textRegex);
+ } catch (e) {
+ return input;
+ }
+
+ let matchResults = input.match(regex);
+ if (matchResults == null) {
+ return input;
+ } else {
+ return matchResults[0];
+ }
+ }
+ }
+ };
+
+ numberOrTextFilter.$stateful = true;
+ return numberOrTextFilter;
+ });
}
postRefresh() {
@@ -130,6 +160,11 @@ export class StatusPluginCtrl extends MetricsPanelCtrl {
s.url = target.url;
s.display = true;
s.displayType = target.displayType;
+ s.valueDisplayRegex = "";
+
+ if(this.validateRegex(target.valueDisplayRegex)) {
+ s.valueDisplayRegex = target.valueDisplayRegex;
+ }
let value;
switch (target.aggregation) {
@@ -283,6 +318,18 @@ export class StatusPluginCtrl extends MetricsPanelCtrl {
}
}
+ validateRegex(textRegex) {
+ if(textRegex == null || textRegex.length == 0) {
+ return true
+ }
+ try {
+ let regex = new RegExp(textRegex);
+ return true
+ } catch(e) {
+ return false
+ }
+ }
+
static parseThresholds(metricOptions) {
let res = {};