From 9b8671da4a12d82a9e885ac2b42d9e4380b08b61 Mon Sep 17 00:00:00 2001 From: masato25 Date: Sat, 23 Apr 2016 01:26:06 +0800 Subject: [PATCH] first push --- README.md | 31 ++ add_openfalcon_func.js | 108 +++++ dashboards/carbon_metrics.json | 176 ++++++++ datasource.js | 295 +++++++++++++ datasource.js.map | 1 + func_editor.js | 247 +++++++++++ gfunc.js | 736 +++++++++++++++++++++++++++++++ img/grafana_demo.png | Bin 0 -> 283636 bytes img/openfalcon_datasource.png | Bin 0 -> 113362 bytes img/openfalcon_logo.png | Bin 0 -> 17168 bytes lexer.js | 590 +++++++++++++++++++++++++ lexer.js.map | 1 + module.js | 39 ++ module.js.map | 1 + parser.js | 216 +++++++++ parser.js.map | 1 + partials/annotations.editor.html | 10 + partials/config.html | 3 + partials/query.editor.html | 21 + partials/query.options.html | 126 ++++++ plugin.json | 23 + query_ctrl.js | 275 ++++++++++++ query_ctrl.js.map | 1 + specs/datasource_specs.d.ts | 0 specs/datasource_specs.js | 123 ++++++ specs/datasource_specs.js.map | 1 + specs/datasource_specs.ts | 133 ++++++ specs/gfunc_specs.d.ts | 0 specs/gfunc_specs.js | 117 +++++ specs/gfunc_specs.js.map | 1 + specs/gfunc_specs.ts | 125 ++++++ specs/lexer_specs.d.ts | 0 specs/lexer_specs.js | 116 +++++ specs/lexer_specs.js.map | 1 + specs/lexer_specs.ts | 118 +++++ specs/parser_specs.d.ts | 0 specs/parser_specs.js | 164 +++++++ specs/parser_specs.js.map | 1 + specs/parser_specs.ts | 183 ++++++++ specs/query_ctrl_specs.d.ts | 0 specs/query_ctrl_specs.js | 150 +++++++ specs/query_ctrl_specs.js.map | 1 + specs/query_ctrl_specs.ts | 163 +++++++ 43 files changed, 4298 insertions(+) create mode 100644 README.md create mode 100644 add_openfalcon_func.js create mode 100644 dashboards/carbon_metrics.json create mode 100644 datasource.js create mode 100644 datasource.js.map create mode 100644 func_editor.js create mode 100644 gfunc.js create mode 100644 img/grafana_demo.png create mode 100644 img/openfalcon_datasource.png create mode 100644 img/openfalcon_logo.png create mode 100644 lexer.js create mode 100644 lexer.js.map create mode 100644 module.js create mode 100644 module.js.map create mode 100644 parser.js create mode 100644 parser.js.map create mode 100644 partials/annotations.editor.html create mode 100644 partials/config.html create mode 100644 partials/query.editor.html create mode 100644 partials/query.options.html create mode 100644 plugin.json create mode 100644 query_ctrl.js create mode 100644 query_ctrl.js.map create mode 100644 specs/datasource_specs.d.ts create mode 100644 specs/datasource_specs.js create mode 100644 specs/datasource_specs.js.map create mode 100644 specs/datasource_specs.ts create mode 100644 specs/gfunc_specs.d.ts create mode 100644 specs/gfunc_specs.js create mode 100644 specs/gfunc_specs.js.map create mode 100644 specs/gfunc_specs.ts create mode 100644 specs/lexer_specs.d.ts create mode 100644 specs/lexer_specs.js create mode 100644 specs/lexer_specs.js.map create mode 100644 specs/lexer_specs.ts create mode 100644 specs/parser_specs.d.ts create mode 100644 specs/parser_specs.js create mode 100644 specs/parser_specs.js.map create mode 100644 specs/parser_specs.ts create mode 100644 specs/query_ctrl_specs.d.ts create mode 100644 specs/query_ctrl_specs.js create mode 100644 specs/query_ctrl_specs.js.map create mode 100644 specs/query_ctrl_specs.ts diff --git a/README.md b/README.md new file mode 100644 index 0000000..6a73341 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +# Openfaln Datasource - 3 party plugin + +[Openfalcon](https://github.com/open-falcon() is a system monitor solution made by xiaomi. + +![](./img/grafana_demo.png) + +## How to install? +* Please download the latest version of Grafana on the [github](https://github.com/grafana/grafana). (currently the latest one is tag -> v3.0-beta5) +* Finish the all setup up. (more info please refer the README.md in Grafana project.) +``` +cd $GOPATH/src/github.com/grafana/grafana +go run build.go setup (only needed once to install godep) +godep restore (will pull down all golang lib dependencies in your current GOPATH) +go run build.go build +``` +``` +npm install +npm install -g grunt-cli +grunt +``` +* Checkout this plugin +``` +cd $GRAFANA_PATH/public_gen/app/plugins/datasource +git clone https://github.com/masato25/grafana-openfalcon +``` +* Start grafana-server +``` +./bin/grafana-server +``` +* if the installation is successed, You will see Openfalcon on the datasource list. +![](./img/openfalcon_datasource.png) diff --git a/add_openfalcon_func.js b/add_openfalcon_func.js new file mode 100644 index 0000000..361e236 --- /dev/null +++ b/add_openfalcon_func.js @@ -0,0 +1,108 @@ +define([ + 'angular', + 'lodash', + 'jquery', + './gfunc', +], +function (angular, _, $, gfunc) { + 'use strict'; + + angular + .module('grafana.directives') + .directive('openfalconAddFunc', function($compile) { + var inputTemplate = ''; + + var buttonTemplate = '' + + ''; + + return { + link: function($scope, elem) { + var categories = gfunc.getCategories(); + var allFunctions = getAllFunctionNames(categories); + var ctrl = $scope.ctrl; + + $scope.functionMenu = createFunctionDropDownMenu(categories); + + var $input = $(inputTemplate); + var $button = $(buttonTemplate); + //$input.appendTo(elem); + //$button.appendTo(elem); + + $input.attr('data-provide', 'typeahead'); + $input.typeahead({ + source: allFunctions, + minLength: 1, + items: 10, + updater: function (value) { + var funcDef = gfunc.getFuncDef(value); + if (!funcDef) { + // try find close match + value = value.toLowerCase(); + funcDef = _.find(allFunctions, function(funcName) { + return funcName.toLowerCase().indexOf(value) === 0; + }); + + if (!funcDef) { return; } + } + + $scope.$apply(function() { + ctrl.addFunction(funcDef); + }); + + $input.trigger('blur'); + return ''; + } + }); + + $button.click(function() { + $button.hide(); + $input.show(); + $input.focus(); + }); + + $input.keyup(function() { + elem.toggleClass('open', $input.val() === ''); + }); + + $input.blur(function() { + // clicking the function dropdown menu wont + // work if you remove class at once + setTimeout(function() { + $input.val(''); + $input.hide(); + $button.show(); + elem.removeClass('open'); + }, 200); + }); + + $compile(elem.contents())($scope); + } + }; + }); + + function getAllFunctionNames(categories) { + return _.reduce(categories, function(list, category) { + _.each(category, function(func) { + list.push(func.name); + }); + return list; + }, []); + } + + function createFunctionDropDownMenu(categories) { + return _.map(categories, function(list, category) { + return { + text: category, + submenu: _.map(list, function(value) { + return { + text: value.name, + click: "ctrl.addFunction('" + value.name + "')", + }; + }) + }; + }); + } +}); diff --git a/dashboards/carbon_metrics.json b/dashboards/carbon_metrics.json new file mode 100644 index 0000000..334ddb9 --- /dev/null +++ b/dashboards/carbon_metrics.json @@ -0,0 +1,176 @@ +{ + "__inputs": [ + { + "name": "DS_NAME", + "type": "datasource", + "pluginId": "openfalcon" + } + ], + + "revision": "1.0", + "title": "Openfalcon Carbon Metrics", + "tags": ["openfalcon", "carbon"], + "style": "dark", + "timezone": "browser", + "editable": true, + "hideControls": false, + "sharedCrosshair": false, + "rows": [ + { + "collapsable": true, + "collapse": false, + "editable": true, + "height": "350px", + "notice": false, + "panels": [ + { + "aliasColors": {}, + "annotate": { + "enable": false + }, + "bars": false, + "datasource": "${DS_NAME}", + "editable": true, + "fill": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "max": null, + "min": 0, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null, + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "loadingEditor": false, + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "resolution": 100, + "scale": 1, + "seriesOverrides": [ + { + "alias": "Points Per Update", + "yaxis": 2 + }, + { + "alias": "CPU", + "yaxis": 2 + } + ], + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [ + { + "refId": "A", + "target": "alias(sumSeries(carbon.agents.*.updateOperations),\"Updates\") " + }, + { + "refId": "B", + "target": "alias(sumSeries(carbon.agents.*.metricsReceived),'Metrics Received')" + }, + { + "refId": "C", + "target": "alias(sumSeries(carbon.agents.*.committedPoints),'Committed Points')" + }, + { + "refId": "D", + "target": "alias(sumSeries(carbon.agents.*.pointsPerUpdate),'Points Per Update')" + }, + { + "refId": "E", + "target": "alias(averageSeries(carbon.agents.*.cpuUsage),'CPU')" + }, + { + "refId": "F", + "target": "alias(sumSeries(carbon.agents.*.creates),'Creates')" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Openfalcon Carbon Metrics", + "tooltip": { + "query_as_alias": true, + "shared": false, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "y-axis": true, + "y_formats": [ + "short", + "short" + ], + "zerofill": true + } + ], + "title": "Row1" + } + ], + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": { + "collapse": false, + "enable": true, + "notice": false, + "now": true, + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "status": "Stable", + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ], + "type": "timepicker" + }, + "templating": { + "enable": false, + "list": [] + }, + "annotations": { + "enable": false, + "list": [] + }, + "refresh": false, + "schemaVersion": 8, + "version": 2, + "links": [] +} diff --git a/datasource.js b/datasource.js new file mode 100644 index 0000000..bc9e36a --- /dev/null +++ b/datasource.js @@ -0,0 +1,295 @@ +/// +System.register(['lodash', 'app/core/utils/datemath'], function(exports_1) { + var lodash_1, dateMath; + /** fixed openfalcon query **/ + function FixTargets(targets) { + return _.map(targets, function(obj){ + if( obj.target && obj.target != "" && obj.target.match(/\./) ){ + obj.target = obj.target.replace(/\./g, "#"); + //fix ip back to the right foramt ex. 10#10#10#10 -> 10.10.10.10 + obj.target = obj.target.replace(/(\d+)#(\d+)#(\d+)#(\d+)/g,"$1.$2.$3.$4"); + } + return obj; + }) + } + /** @ngInject */ + function OpenfalconDatasource(instanceSettings, $q, backendSrv, templateSrv) { + this.basicAuth = instanceSettings.basicAuth; + this.url = instanceSettings.url; + this.name = instanceSettings.name; + this.cacheTimeout = instanceSettings.cacheTimeout; + this.withCredentials = instanceSettings.withCredentials; + this.render_method = instanceSettings.render_method || 'POST'; + this.query = function (options) { + var graphOptions = { + from: this.translateTime(options.rangeRaw.from, false), + until: this.translateTime(options.rangeRaw.to, true), + targets: FixTargets(options.targets), + format: options.format, + cacheTimeout: options.cacheTimeout || this.cacheTimeout, + maxDataPoints: options.maxDataPoints, + }; + var params = this.buildOpenfalconParams(graphOptions, options.scopedVars); + if (params.length === 0) { + return $q.when({ data: [] }); + } + if (options.format === 'png') { + return $q.when(this.url + '/render' + '?' + params.join('&')); + } + var httpOptions = { method: this.render_method, url: '/render' }; + if (httpOptions.method === 'GET') { + httpOptions.url = httpOptions.url + '?' + params.join('&'); + } + else { + httpOptions.data = params.join('&'); + httpOptions.headers = { 'Content-Type': 'application/x-www-form-urlencoded' }; + } + return this.doOpenfalconRequest(httpOptions).then(this.convertDataPointsToMs); + }; + this.convertDataPointsToMs = function (result) { + if (!result || !result.data || !result.data.length) { + return []; + } + var data = [], datapoints = [], timestamp = 0, + value = 0, values = [], metric = '', host = ''; + _.forEach(result.data, function(row) { + if ('Values' in row) { + values = row.Values; + metric = row.counter; + host = row.endpoint; + datapoints = []; + _.forEach(values, function(arr) { + timestamp = arr['timestamp']; + value = arr['value']; + datapoints.push([value, timestamp]); + }); + obj = {}; + obj.datapoints = datapoints; + obj.target = host + '.' + metric; + data.push(obj); + } + }); + result.data = data; + if (!result || !result.data) { return []; } + for (var i = 0; i < result.data.length; i++) { + var series = result.data[i]; + for (var y = 0; y < series.datapoints.length; y++) { + series.datapoints[y][1] *= 1000; + } + } + return result; + }; + this.annotationQuery = function (options) { + // Openfalcon metric as annotation + if (options.annotation.target) { + var target = templateSrv.replace(options.annotation.target, {}, 'glob'); + var openfalconQuery = { + rangeRaw: options.rangeRaw, + targets: [{ target: target }], + format: 'json', + maxDataPoints: 100 + }; + return this.query(openfalconQuery).then(function (result) { + var list = []; + for (var i = 0; i < result.data.length; i++) { + var target = result.data[i]; + for (var y = 0; y < target.datapoints.length; y++) { + var datapoint = target.datapoints[y]; + if (!datapoint[0]) { + continue; + } + list.push({ + annotation: options.annotation, + time: datapoint[1], + title: target.target + }); + } + } + return list; + }); + } + else { + // Openfalcon event as annotation + var tags = templateSrv.replace(options.annotation.tags); + return this.events({ range: options.rangeRaw, tags: tags }).then(function (results) { + var list = []; + for (var i = 0; i < results.data.length; i++) { + var e = results.data[i]; + list.push({ + annotation: options.annotation, + time: e.when * 1000, + title: e.what, + tags: e.tags, + text: e.data + }); + } + return list; + }); + } + }; + this.events = function (options) { + try { + var tags = ''; + if (options.tags) { + tags = '&tags=' + options.tags; + } + return this.doOpenfalconRequest({ + method: 'GET', + url: '/events/get_data?from=' + this.translateTime(options.range.from, false) + + '&until=' + this.translateTime(options.range.to, true) + tags, + }); + } + catch (err) { + return $q.reject(err); + } + }; + this.translateTime = function (date, roundUp) { + if (lodash_1.default.isString(date)) { + if (date === 'now') { + return Math.ceil((new Date).getTime()/1000); + } + else if(date.match(/(\d+)h/).length != 0){ + var current = Math.ceil((new Date).getTime()/1000); + return current - (+date.match(/(\d+)h/)[1] * 60 * 60); + } + else if (date.indexOf('now-') >= 0 && date.indexOf('/') === -1) { + date = date.substring(3); + date = date.replace('m', 'min'); + date = date.replace('M', 'mon'); + return date; + } + date = dateMath.parse(date, roundUp); + } + // openfalcon' s from filter is exclusive + // here we step back one minute in order + // to guarantee that we get all the data that + // exists for the specified range + if (roundUp) { + if (date.get('s')) { + date.add(1, 'm'); + } + } + else if (roundUp === false) { + if (date.get('s')) { + date.subtract(1, 'm'); + } + } + return date.unix(); + }; + this.metricFindQuery = function (query) { + var interpolated; + try { + interpolated = encodeURIComponent(templateSrv.replace(query)); + } + catch (err) { + return $q.reject(err); + } + if (interpolated == '*') { + interpolated = ''; + } + return this.doOpenfalconRequest({ method: 'GET', url: '/metrics/find/?query=' + interpolated }) + .then(function (results) { + return lodash_1.default.map(results.data, function (metric) { + return { + text: metric.text, + expandable: metric.expandable ? true : false + }; + }); + }); + }; + this.testDatasource = function () { + return this.metricFindQuery('*').then(function () { + return { status: "success", message: "Data source is working", title: "Success" }; + }); + }; + this.listDashboards = function (query) { + return this.doOpenfalconRequest({ method: 'GET', url: '/dashboard/find/', params: { query: query || '' } }) + .then(function (results) { + return results.data.dashboards; + }); + }; + this.loadDashboard = function (dashName) { + return this.doOpenfalconRequest({ method: 'GET', url: '/dashboard/load/' + encodeURIComponent(dashName) }); + }; + this.doOpenfalconRequest = function (options) { + if (this.basicAuth || this.withCredentials) { + options.withCredentials = true; + } + if (this.basicAuth) { + options.headers = options.headers || {}; + options.headers.Authorization = this.basicAuth; + } + options.url = this.url + options.url; + options.inspect = { type: 'openfalcon' }; + return backendSrv.datasourceRequest(options); + }; + this._seriesRefLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + this.buildOpenfalconParams = function (options, scopedVars) { + var openfalcon_options = ['from', 'until', 'rawData', 'format', 'maxDataPoints', 'cacheTimeout']; + var clean_options = [], targets = {}; + var target, targetValue, i; + var regex = /\#([A-Z])/g; + var intervalFormatFixRegex = /'(\d+)m'/gi; + var hasTargets = false; + if (options.format !== 'png') { + options['format'] = 'json'; + } + function fixIntervalFormat(match) { + return match.replace('m', 'min').replace('M', 'mon'); + } + for (i = 0; i < options.targets.length; i++) { + target = options.targets[i]; + if (!target.target) { + continue; + } + if (!target.refId) { + target.refId = this._seriesRefLetters[i]; + } + targetValue = templateSrv.replace(target.target, scopedVars); + targetValue = targetValue.replace(intervalFormatFixRegex, fixIntervalFormat); + targets[target.refId] = targetValue; + } + function nestedSeriesRegexReplacer(match, g1) { + return targets[g1]; + } + for (i = 0; i < options.targets.length; i++) { + target = options.targets[i]; + if (!target.target) { + continue; + } + targetValue = targets[target.refId]; + targetValue = targetValue.replace(regex, nestedSeriesRegexReplacer); + targets[target.refId] = targetValue; + if (!target.hide) { + hasTargets = true; + clean_options.push("target=" + encodeURIComponent(targetValue)); + } + } + lodash_1.default.each(options, function (value, key) { + if (lodash_1.default.indexOf(openfalcon_options, key) === -1) { + return; + } + if (value) { + clean_options.push(key + "=" + encodeURIComponent(value)); + } + }); + if (!hasTargets) { + return []; + } + return clean_options; + }; + } + exports_1("OpenfalconDatasource", OpenfalconDatasource); + return { + setters:[ + function (lodash_1_1) { + lodash_1 = lodash_1_1; + }, + function (dateMath_1) { + dateMath = dateMath_1; + }], + execute: function() { + } + } +}); +//# sourceMappingURL=datasource.js.map diff --git a/datasource.js.map b/datasource.js.map new file mode 100644 index 0000000..3be02b3 --- /dev/null +++ b/datasource.js.map @@ -0,0 +1 @@ +{"version":3,"file":"datasource.js","sourceRoot":"","sources":["./datasource.ts"],"names":["OpenfalconDatasource","fixIntervalFormat","nestedSeriesRegexReplacer"],"mappings":"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"} diff --git a/func_editor.js b/func_editor.js new file mode 100644 index 0000000..4b0b269 --- /dev/null +++ b/func_editor.js @@ -0,0 +1,247 @@ +define([ + 'angular', + 'lodash', + 'jquery', +], +function (angular, _, $) { + 'use strict'; + + angular + .module('grafana.directives') + .directive('openfalconFuncEditor', function($compile, templateSrv) { + + var funcSpanTemplate = '{{func.def.name}}('; + var paramTemplate = ''; + + var funcControlsTemplate = + '
' + + '' + + '' + + '' + + '' + + '
'; + + return { + restrict: 'A', + link: function postLink($scope, elem) { + var $funcLink = $(funcSpanTemplate); + var $funcControls = $(funcControlsTemplate); + var ctrl = $scope.ctrl; + var func = $scope.func; + var funcDef = func.def; + var scheduledRelink = false; + var paramCountAtLink = 0; + + function clickFuncParam(paramIndex) { + /*jshint validthis:true */ + + var $link = $(this); + var $input = $link.next(); + + $input.val(func.params[paramIndex]); + $input.css('width', ($link.width() + 16) + 'px'); + + $link.hide(); + $input.show(); + $input.focus(); + $input.select(); + + var typeahead = $input.data('typeahead'); + if (typeahead) { + $input.val(''); + typeahead.lookup(); + } + } + + function scheduledRelinkIfNeeded() { + if (paramCountAtLink === func.params.length) { + return; + } + + if (!scheduledRelink) { + scheduledRelink = true; + setTimeout(function() { + relink(); + scheduledRelink = false; + }, 200); + } + } + + function inputBlur(paramIndex) { + /*jshint validthis:true */ + var $input = $(this); + var $link = $input.prev(); + var newValue = $input.val(); + + if (newValue !== '' || func.def.params[paramIndex].optional) { + $link.html(templateSrv.highlightVariablesAsHtml(newValue)); + + func.updateParam($input.val(), paramIndex); + scheduledRelinkIfNeeded(); + + $scope.$apply(function() { + ctrl.targetChanged(); + }); + + $input.hide(); + $link.show(); + } + } + + function inputKeyPress(paramIndex, e) { + /*jshint validthis:true */ + if(e.which === 13) { + inputBlur.call(this, paramIndex); + } + } + + function inputKeyDown() { + /*jshint validthis:true */ + this.style.width = (3 + this.value.length) * 8 + 'px'; + } + + function addTypeahead($input, paramIndex) { + $input.attr('data-provide', 'typeahead'); + + var options = funcDef.params[paramIndex].options; + if (funcDef.params[paramIndex].type === 'int') { + options = _.map(options, function(val) { return val.toString(); }); + } + + $input.typeahead({ + source: options, + minLength: 0, + items: 20, + updater: function (value) { + setTimeout(function() { + inputBlur.call($input[0], paramIndex); + }, 0); + return value; + } + }); + + var typeahead = $input.data('typeahead'); + typeahead.lookup = function () { + this.query = this.$element.val() || ''; + return this.process(this.source); + }; + } + + function toggleFuncControls() { + var targetDiv = elem.closest('.tight-form'); + + if (elem.hasClass('show-function-controls')) { + elem.removeClass('show-function-controls'); + targetDiv.removeClass('has-open-function'); + $funcControls.hide(); + return; + } + + elem.addClass('show-function-controls'); + targetDiv.addClass('has-open-function'); + + $funcControls.show(); + } + + function addElementsAndCompile() { + $funcControls.appendTo(elem); + $funcLink.appendTo(elem); + + _.each(funcDef.params, function(param, index) { + if (param.optional && func.params.length <= index) { + return; + } + + if (index > 0) { + $(', ').appendTo(elem); + } + + var paramValue = templateSrv.highlightVariablesAsHtml(func.params[index]); + var $paramLink = $('' + paramValue + ''); + var $input = $(paramTemplate); + + paramCountAtLink++; + + $paramLink.appendTo(elem); + $input.appendTo(elem); + + $input.blur(_.partial(inputBlur, index)); + $input.keyup(inputKeyDown); + $input.keypress(_.partial(inputKeyPress, index)); + $paramLink.click(_.partial(clickFuncParam, index)); + + if (funcDef.params[index].options) { + addTypeahead($input, index); + } + + }); + + $(')').appendTo(elem); + + $compile(elem.contents())($scope); + } + + function ifJustAddedFocusFistParam() { + if ($scope.func.added) { + $scope.func.added = false; + setTimeout(function() { + elem.find('.openfalcon-func-param-link').first().click(); + }, 10); + } + } + + function registerFuncControlsToggle() { + $funcLink.click(toggleFuncControls); + } + + function registerFuncControlsActions() { + $funcControls.click(function(e) { + var $target = $(e.target); + if ($target.hasClass('fa-remove')) { + toggleFuncControls(); + $scope.$apply(function() { + ctrl.removeFunction($scope.func); + }); + return; + } + + if ($target.hasClass('fa-arrow-left')) { + $scope.$apply(function() { + _.move(ctrl.functions, $scope.$index, $scope.$index - 1); + ctrl.targetChanged(); + }); + return; + } + + if ($target.hasClass('fa-arrow-right')) { + $scope.$apply(function() { + _.move(ctrl.functions, $scope.$index, $scope.$index + 1); + ctrl.targetChanged(); + }); + return; + } + + if ($target.hasClass('fa-question-circle')) { + window.open("http://openfalcon.readthedocs.org/en/latest/functions.html#openfalcon.render.functions." + funcDef.name,'_blank'); + return; + } + }); + } + + function relink() { + elem.children().remove(); + + addElementsAndCompile(); + ifJustAddedFocusFistParam(); + registerFuncControlsToggle(); + registerFuncControlsActions(); + } + + relink(); + } + }; + + }); + +}); diff --git a/gfunc.js b/gfunc.js new file mode 100644 index 0000000..de48259 --- /dev/null +++ b/gfunc.js @@ -0,0 +1,736 @@ +define([ + 'lodash', + 'jquery' +], +function (_, $) { + 'use strict'; + + var index = []; + var categories = { + Combine: [], + Transform: [], + Calculate: [], + Filter: [], + Special: [] + }; + + function addFuncDef(funcDef) { + funcDef.params = funcDef.params || []; + funcDef.defaultParams = funcDef.defaultParams || []; + + if (funcDef.category) { + funcDef.category.push(funcDef); + } + index[funcDef.name] = funcDef; + index[funcDef.shortName || funcDef.name] = funcDef; + } + + var optionalSeriesRefArgs = [ + { name: 'other', type: 'value_or_series', optional: true }, + { name: 'other', type: 'value_or_series', optional: true }, + { name: 'other', type: 'value_or_series', optional: true }, + { name: 'other', type: 'value_or_series', optional: true }, + { name: 'other', type: 'value_or_series', optional: true } + ]; + + addFuncDef({ + name: 'scaleToSeconds', + category: categories.Transform, + params: [{ name: 'seconds', type: 'int' }], + defaultParams: [1], + }); + + addFuncDef({ + name: 'perSecond', + category: categories.Transform, + params: [{ name: "max value", type: "int", optional: true }], + defaultParams: [], + }); + + addFuncDef({ + name: "holtWintersForecast", + category: categories.Calculate, + }); + + addFuncDef({ + name: "holtWintersConfidenceBands", + category: categories.Calculate, + params: [{ name: "delta", type: 'int' }], + defaultParams: [3] + }); + + addFuncDef({ + name: "holtWintersAberration", + category: categories.Calculate, + params: [{ name: "delta", type: 'int' }], + defaultParams: [3] + }); + + addFuncDef({ + name: "nPercentile", + category: categories.Calculate, + params: [{ name: "Nth percentile", type: 'int' }], + defaultParams: [95] + }); + + addFuncDef({ + name: 'diffSeries', + params: optionalSeriesRefArgs, + defaultParams: ['#A'], + category: categories.Calculate, + }); + + addFuncDef({ + name: 'divideSeries', + params: optionalSeriesRefArgs, + defaultParams: ['#A'], + category: categories.Calculate, + }); + + addFuncDef({ + name: 'multiplySeries', + params: optionalSeriesRefArgs, + defaultParams: ['#A'], + category: categories.Calculate, + }); + + addFuncDef({ + name: 'asPercent', + params: optionalSeriesRefArgs, + defaultParams: ['#A'], + category: categories.Calculate, + }); + + addFuncDef({ + name: 'group', + params: optionalSeriesRefArgs, + defaultParams: ['#A', '#B'], + category: categories.Combine, + }); + + addFuncDef({ + name: 'mapSeries', + shortName: 'map', + params: [{ name: "node", type: 'int' }], + defaultParams: [3], + category: categories.Combine, + }); + + addFuncDef({ + name: 'reduceSeries', + shortName: 'reduce', + params: [ + { name: "function", type: 'string', options: ['asPercent', 'diffSeries', 'divideSeries'] }, + { name: "reduceNode", type: 'int', options: [0,1,2,3,4,5,6,7,8,9,10,11,12,13] }, + { name: "reduceMatchers", type: 'string' }, + { name: "reduceMatchers", type: 'string' }, + ], + defaultParams: ['asPercent', 2, 'used_bytes', 'total_bytes'], + category: categories.Combine, + }); + + addFuncDef({ + name: 'sumSeries', + shortName: 'sum', + category: categories.Combine, + params: optionalSeriesRefArgs, + defaultParams: [''], + }); + + addFuncDef({ + name: 'averageSeries', + shortName: 'avg', + category: categories.Combine, + params: optionalSeriesRefArgs, + defaultParams: [''], + }); + + addFuncDef({ + name: 'isNonNull', + category: categories.Combine, + }); + + addFuncDef({ + name: 'rangeOfSeries', + category: categories.Combine + }); + + addFuncDef({ + name: 'percentileOfSeries', + category: categories.Combine, + params: [{ name: "n", type: "int" }, { name: "interpolate", type: "select", options: ["true", "false"] }], + defaultParams: [95, "false"] + }); + + addFuncDef({ + name: 'sumSeriesWithWildcards', + category: categories.Combine, + params: [ + { name: "node", type: "int" }, + { name: "node", type: "int", optional: true }, + { name: "node", type: "int", optional: true }, + { name: "node", type: "int", optional: true } + ], + defaultParams: [3] + }); + + addFuncDef({ + name: 'maxSeries', + shortName: 'max', + category: categories.Combine, + }); + + addFuncDef({ + name: 'minSeries', + shortName: 'min', + category: categories.Combine, + }); + + addFuncDef({ + name: 'averageSeriesWithWildcards', + category: categories.Combine, + params: [ + { name: "node", type: "int" }, + { name: "node", type: "int", optional: true }, + ], + defaultParams: [3] + }); + + addFuncDef({ + name: "alias", + category: categories.Special, + params: [{ name: "alias", type: 'string' }], + defaultParams: ['alias'] + }); + + addFuncDef({ + name: "aliasSub", + category: categories.Special, + params: [{ name: "search", type: 'string' }, { name: "replace", type: 'string' }], + defaultParams: ['', '\\1'] + }); + + addFuncDef({ + name: "stacked", + category: categories.Special, + params: [{ name: "stack", type: 'string' }], + defaultParams: ['stacked'] + }); + + addFuncDef({ + name: "consolidateBy", + category: categories.Special, + params: [ + { + name: 'function', + type: 'string', + options: ['sum', 'average', 'min', 'max'] + } + ], + defaultParams: ['max'] + }); + + addFuncDef({ + name: "cumulative", + category: categories.Special, + params: [], + defaultParams: [] + }); + + addFuncDef({ + name: "groupByNode", + category: categories.Special, + params: [ + { + name: "node", + type: "int", + options: [0,1,2,3,4,5,6,7,8,9,10,12] + }, + { + name: "function", + type: "string", + options: ['sum', 'avg', 'maxSeries'] + } + ], + defaultParams: [3, "sum"] + }); + + addFuncDef({ + name: 'aliasByNode', + category: categories.Special, + params: [ + { name: "node", type: "int", options: [0,1,2,3,4,5,6,7,8,9,10,12] }, + { name: "node", type: "int", options: [0,-1,-2,-3,-4,-5,-6,-7], optional: true }, + { name: "node", type: "int", options: [0,-1,-2,-3,-4,-5,-6,-7], optional: true }, + { name: "node", type: "int", options: [0,-1,-2,-3,-4,-5,-6,-7], optional: true }, + ], + defaultParams: [3] + }); + + addFuncDef({ + name: 'substr', + category: categories.Special, + params: [ + { name: "start", type: "int", options: [-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,12] }, + { name: "stop", type: "int", options: [-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,12] }, + ], + defaultParams: [0, 0] + }); + + addFuncDef({ + name: 'sortByName', + category: categories.Special, + params: [{ name: "natural", type: "select", options: ["true", "false"], optional: true }], + defaultParams: ["false"] + }); + + addFuncDef({ + name: 'sortByMaxima', + category: categories.Special + }); + + addFuncDef({ + name: 'sortByMinima', + category: categories.Special + }); + + addFuncDef({ + name: 'sortByTotal', + category: categories.Special + }); + + addFuncDef({ + name: 'aliasByMetric', + category: categories.Special, + }); + + addFuncDef({ + name: 'randomWalk', + fake: true, + category: categories.Special, + params: [{ name: "name", type: "string", }], + defaultParams: ['randomWalk'] + }); + + addFuncDef({ + name: 'countSeries', + category: categories.Special + }); + + addFuncDef({ + name: 'constantLine', + category: categories.Special, + params: [{ name: "value", type: "int", }], + defaultParams: [10] + }); + + addFuncDef({ + name: 'cactiStyle', + category: categories.Special, + }); + + addFuncDef({ + name: 'keepLastValue', + category: categories.Special, + params: [{ name: "n", type: "int", }], + defaultParams: [100] + }); + + addFuncDef({ + name: "changed", + category: categories.Special, + params: [], + defaultParams: [] + }); + + addFuncDef({ + name: 'scale', + category: categories.Transform, + params: [{ name: "factor", type: "int", }], + defaultParams: [1] + }); + + addFuncDef({ + name: 'offset', + category: categories.Transform, + params: [{ name: "amount", type: "int", }], + defaultParams: [10] + }); + + addFuncDef({ + name: 'offsetToZero', + category: categories.Transform, + }); + + addFuncDef({ + name: 'transformNull', + category: categories.Transform, + params: [{ name: "amount", type: "int", }], + defaultParams: [0] + }); + + addFuncDef({ + name: 'integral', + category: categories.Transform, + }); + + addFuncDef({ + name: 'derivative', + category: categories.Transform, + }); + + addFuncDef({ + name: 'nonNegativeDerivative', + category: categories.Transform, + params: [{ name: "max value or 0", type: "int", optional: true }], + defaultParams: [''] + }); + + addFuncDef({ + name: 'timeShift', + category: categories.Transform, + params: [{ name: "amount", type: "select", options: ['1h', '6h', '12h', '1d', '2d', '7d', '14d', '30d'] }], + defaultParams: ['1d'] + }); + + addFuncDef({ + name: 'timeStack', + category: categories.Transform, + params: [ + { name: "timeShiftUnit", type: "select", options: ['1h', '6h', '12h', '1d', '2d', '7d', '14d', '30d'] }, + { name: "timeShiftStart", type: "int" }, + { name: "timeShiftEnd", type: "int" } + ], + defaultParams: ['1d', 0, 7] + }); + + addFuncDef({ + name: 'summarize', + category: categories.Transform, + params: [ + { name: "interval", type: "string" }, + { name: "func", type: "select", options: ['sum', 'avg', 'min', 'max', 'last'] }, + { name: "alignToFrom", type: "boolean", optional: true, options: ['false', 'true'] }, + ], + defaultParams: ['1h', 'sum', 'false'] + }); + + addFuncDef({ + name: 'smartSummarize', + category: categories.Transform, + params: [{ name: "interval", type: "string" }, { name: "func", type: "select", options: ['sum', 'avg', 'min', 'max', 'last'] }], + defaultParams: ['1h', 'sum'] + }); + + addFuncDef({ + name: 'absolute', + category: categories.Transform, + }); + + addFuncDef({ + name: 'hitcount', + category: categories.Transform, + params: [{ name: "interval", type: "string" }], + defaultParams: ['10s'] + }); + + addFuncDef({ + name: 'log', + category: categories.Transform, + params: [{ name: "base", type: "int" }], + defaultParams: ['10'] + }); + + addFuncDef({ + name: 'averageAbove', + category: categories.Filter, + params: [{ name: "n", type: "int", }], + defaultParams: [25] + }); + + addFuncDef({ + name: 'averageBelow', + category: categories.Filter, + params: [{ name: "n", type: "int", }], + defaultParams: [25] + }); + + addFuncDef({ + name: 'currentAbove', + category: categories.Filter, + params: [{ name: "n", type: "int", }], + defaultParams: [25] + }); + + addFuncDef({ + name: 'currentBelow', + category: categories.Filter, + params: [{ name: "n", type: "int", }], + defaultParams: [25] + }); + + addFuncDef({ + name: 'maximumAbove', + category: categories.Filter, + params: [{ name: "value", type: "int" }], + defaultParams: [0] + }); + + addFuncDef({ + name: 'maximumBelow', + category: categories.Filter, + params: [{ name: "value", type: "int" }], + defaultParams: [0] + }); + + addFuncDef({ + name: 'minimumAbove', + category: categories.Filter, + params: [{ name: "value", type: "int" }], + defaultParams: [0] + }); + + addFuncDef({ + name: 'minimumBelow', + category: categories.Filter, + params: [{ name: "value", type: "int" }], + defaultParams: [0] + }); + + addFuncDef({ + name: 'limit', + category: categories.Filter, + params: [{ name: "n", type: "int" }], + defaultParams: [5] + }); + + addFuncDef({ + name: 'mostDeviant', + category: categories.Filter, + params: [{ name: "n", type: "int" }], + defaultParams: [10] + }); + + addFuncDef({ + name: "exclude", + category: categories.Filter, + params: [{ name: "exclude", type: 'string' }], + defaultParams: ['exclude'] + }); + + addFuncDef({ + name: "grep", + category: categories.Filter, + params: [{ name: "grep", type: 'string' }], + defaultParams: ['grep'] + }); + + addFuncDef({ + name: 'highestCurrent', + category: categories.Filter, + params: [{ name: "count", type: "int" }], + defaultParams: [5] + }); + + addFuncDef({ + name: 'highestMax', + category: categories.Filter, + params: [{ name: "count", type: "int" }], + defaultParams: [5] + }); + + addFuncDef({ + name: 'lowestCurrent', + category: categories.Filter, + params: [{ name: "count", type: "int" }], + defaultParams: [5] + }); + + addFuncDef({ + name: 'movingAverage', + category: categories.Filter, + params: [{ name: "windowSize", type: "int_or_interval", options: ['5', '7', '10', '5min', '10min', '30min', '1hour'] }], + defaultParams: [10] + }); + + addFuncDef({ + name: 'weightedAverage', + category: categories.Filter, + params: [ + { name: 'other', type: 'value_or_series', optional: true }, + { name: "node", type: "int", options: [0,1,2,3,4,5,6,7,8,9,10,12] }, + ], + defaultParams: ['#A', 4] + }); + + addFuncDef({ + name: 'movingMedian', + category: categories.Filter, + params: [{ name: "windowSize", type: "int_or_interval", options: ['5', '7', '10', '5min', '10min', '30min', '1hour'] }], + defaultParams: ['5'] + }); + + addFuncDef({ + name: 'stdev', + category: categories.Filter, + params: [{ name: "n", type: "int" }, { name: "tolerance", type: "int" }], + defaultParams: [5,0.1] + }); + + addFuncDef({ + name: 'highestAverage', + category: categories.Filter, + params: [{ name: "count", type: "int" }], + defaultParams: [5] + }); + + addFuncDef({ + name: 'lowestAverage', + category: categories.Filter, + params: [{ name: "count", type: "int" }], + defaultParams: [5] + }); + + addFuncDef({ + name: 'removeAbovePercentile', + category: categories.Filter, + params: [{ name: "n", type: "int" }], + defaultParams: [5] + }); + + addFuncDef({ + name: 'removeAboveValue', + category: categories.Filter, + params: [{ name: "n", type: "int" }], + defaultParams: [5] + }); + + addFuncDef({ + name: 'removeBelowPercentile', + category: categories.Filter, + params: [{ name: "n", type: "int" }], + defaultParams: [5] + }); + + addFuncDef({ + name: 'removeBelowValue', + category: categories.Filter, + params: [{ name: "n", type: "int" }], + defaultParams: [5] + }); + + addFuncDef({ + name: 'removeEmptySeries', + category: categories.Filter + }); + + addFuncDef({ + name: 'useSeriesAbove', + category: categories.Filter, + params: [ + { name: "value", type: "int" }, + { name: "search", type: "string" }, + { name: "replace", type: "string" } + ], + defaultParams: [0, 'search', 'replace'] + }); + + _.each(categories, function(funcList, catName) { + categories[catName] = _.sortBy(funcList, 'name'); + }); + + function FuncInstance(funcDef, options) { + this.def = funcDef; + this.params = []; + + if (options && options.withDefaultParams) { + this.params = funcDef.defaultParams.slice(0); + } + + this.updateText(); + } + + FuncInstance.prototype.render = function(metricExp) { + var str = this.def.name + '('; + var parameters = _.map(this.params, function(value, index) { + + var paramType = this.def.params[index].type; + if (paramType === 'int' || paramType === 'value_or_series' || paramType === 'boolean') { + return value; + } + else if (paramType === 'int_or_interval' && $.isNumeric(value)) { + return value; + } + + return "'" + value + "'"; + + }, this); + + if (metricExp) { + parameters.unshift(metricExp); + } + + return str + parameters.join(', ') + ')'; + }; + + FuncInstance.prototype._hasMultipleParamsInString = function(strValue, index) { + if (strValue.indexOf(',') === -1) { + return false; + } + + return this.def.params[index + 1] && this.def.params[index + 1].optional; + }; + + FuncInstance.prototype.updateParam = function(strValue, index) { + // handle optional parameters + // if string contains ',' and next param is optional, split and update both + if (this._hasMultipleParamsInString(strValue, index)) { + _.each(strValue.split(','), function(partVal, idx) { + this.updateParam(partVal.trim(), idx); + }, this); + return; + } + + if (strValue === '' && this.def.params[index].optional) { + this.params.splice(index, 1); + } + else { + this.params[index] = strValue; + } + + this.updateText(); + }; + + FuncInstance.prototype.updateText = function () { + if (this.params.length === 0) { + this.text = this.def.name + '()'; + return; + } + + var text = this.def.name + '('; + text += this.params.join(', '); + text += ')'; + this.text = text; + }; + + return { + createFuncInstance: function(funcDef, options) { + if (_.isString(funcDef)) { + if (!index[funcDef]) { + throw { message: 'Method not found ' + name }; + } + funcDef = index[funcDef]; + } + return new FuncInstance(funcDef, options); + }, + + getFuncDef: function(name) { + return index[name]; + }, + + getCategories: function() { + return categories; + } + }; + +}); diff --git a/img/grafana_demo.png b/img/grafana_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..1d7fd3003be212e8fc5704a4fff09280fca6ab88 GIT binary patch literal 283636 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

@1umL7FBsF+K2Lz8gav%S%)HupsIVb- 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

Of$rD8_G+9G9>X{b)b$6XWYy$J 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%0D})dc*{J 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�qe~>?e~4~l_8{MPh_v_3wl+X-Pny@6q(_r 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

  • RO#ej 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 z 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 KTPkh#`u_l6#fAR> literal 0 HcmV?d00001 diff --git a/img/openfalcon_datasource.png b/img/openfalcon_datasource.png new file mode 100644 index 0000000000000000000000000000000000000000..babf0634ecee1cb1a505dae9d4a0405a37610fa1 GIT binary patch literal 113362 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 literal 0 HcmV?d00001 diff --git a/img/openfalcon_logo.png b/img/openfalcon_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..48c4e8e2f925b97ce13899113199554cc4d33061 GIT binary patch literal 17168 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 Mp00i_>zopr0FNpTvj6}9 literal 0 HcmV?d00001 diff --git a/lexer.js b/lexer.js new file mode 100644 index 0000000..3011383 --- /dev/null +++ b/lexer.js @@ -0,0 +1,590 @@ +/// +System.register(['lodash'], function(exports_1) { + var lodash_1; + var unicodeLetterTable, identifierStartTable, i, identifierPartTable, i2; + function Lexer(expression) { + this.input = expression; + this.char = 1; + this.from = 1; + } + exports_1("Lexer", Lexer); + return { + setters:[ + function (lodash_1_1) { + lodash_1 = lodash_1_1; + }], + execute: function() { + // This is auto generated from the unicode tables. + // The tables are at: + // http://www.fileformat.info/info/unicode/category/Lu/list.htm + // http://www.fileformat.info/info/unicode/category/Ll/list.htm + // http://www.fileformat.info/info/unicode/category/Lt/list.htm + // http://www.fileformat.info/info/unicode/category/Lm/list.htm + // http://www.fileformat.info/info/unicode/category/Lo/list.htm + // http://www.fileformat.info/info/unicode/category/Nl/list.htm + unicodeLetterTable = [ + 170, 170, 181, 181, 186, 186, 192, 214, + 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, + 880, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, + 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, + 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610, + 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, + 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, + 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, + 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2308, 2361, + 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425, 2431, + 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, + 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, + 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, + 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, + 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, + 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, + 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, + 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, + 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, + 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, + 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, + 3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, + 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, + 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, + 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, + 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, + 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, + 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, + 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, + 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805, + 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, + 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, + 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4304, 4346, + 4348, 4348, 4352, 4680, 4682, 4685, 4688, 4694, 4696, 4696, + 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, + 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, + 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740, + 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, + 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, + 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, + 6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516, + 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, + 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7104, 7141, + 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, + 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, + 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, + 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, + 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, + 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, + 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, + 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, + 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, + 11360, 11492, 11499, 11502, 11520, 11557, 11568, 11621, + 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, + 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, + 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, + 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, + 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, + 12593, 12686, 12704, 12730, 12784, 12799, 13312, 13312, + 19893, 19893, 19968, 19968, 40907, 40907, 40960, 42124, + 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, + 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, + 42786, 42888, 42891, 42894, 42896, 42897, 42912, 42921, + 43002, 43009, 43011, 43013, 43015, 43018, 43020, 43042, + 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, + 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, + 43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595, + 43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697, + 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, + 43739, 43741, 43777, 43782, 43785, 43790, 43793, 43798, + 43808, 43814, 43816, 43822, 43968, 44002, 44032, 44032, + 55203, 55203, 55216, 55238, 55243, 55291, 63744, 64045, + 64048, 64109, 64112, 64217, 64256, 64262, 64275, 64279, + 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, + 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, + 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, + 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, + 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, + 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, + 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, + 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66334, + 66352, 66378, 66432, 66461, 66464, 66499, 66504, 66511, + 66513, 66517, 66560, 66717, 67584, 67589, 67592, 67592, + 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, + 67840, 67861, 67872, 67897, 68096, 68096, 68112, 68115, + 68117, 68119, 68121, 68147, 68192, 68220, 68352, 68405, + 68416, 68437, 68448, 68466, 68608, 68680, 69635, 69687, + 69763, 69807, 73728, 74606, 74752, 74850, 77824, 78894, + 92160, 92728, 110592, 110593, 119808, 119892, 119894, 119964, + 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, + 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, + 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, + 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, + 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, + 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, + 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, + 131072, 131072, 173782, 173782, 173824, 173824, 177972, 177972, + 177984, 177984, 178205, 178205, 194560, 195101 + ]; + identifierStartTable = []; + for (i = 0; i < 128; i++) { + identifierStartTable[i] = + i >= 48 && i <= 57 || + i === 36 || + i === 126 || + i === 124 || + i >= 65 && i <= 90 || + i === 95 || + i === 45 || + i === 42 || + i === 58 || + i === 91 || + i === 93 || + i === 63 || + i === 37 || + i === 35 || + i === 61 || + i >= 97 && i <= 122; // a-z + } + identifierPartTable = []; + for (i2 = 0; i2 < 128; i2++) { + identifierPartTable[i2] = + identifierStartTable[i2] || + i2 >= 48 && i2 <= 57; // 0-9 + } + Lexer.prototype = { + peek: function (i) { + return this.input.charAt(i || 0); + }, + skip: function (i) { + i = i || 1; + this.char += i; + this.input = this.input.slice(i); + }, + tokenize: function () { + var list = []; + var token; + while (token = this.next()) { + list.push(token); + } + return list; + }, + next: function () { + this.from = this.char; + // Move to the next non-space character. + var start; + if (/\s/.test(this.peek())) { + start = this.char; + while (/\s/.test(this.peek())) { + this.from += 1; + this.skip(); + } + if (this.peek() === "") { + return null; + } + } + var match = this.scanStringLiteral(); + if (match) { + return match; + } + match = + this.scanPunctuator() || + this.scanNumericLiteral() || + this.scanIdentifier() || + this.scanTemplateSequence(); + if (match) { + this.skip(match.value.length); + return match; + } + // No token could be matched, give up. + return null; + }, + scanTemplateSequence: function () { + if (this.peek() === '[' && this.peek(1) === '[') { + return { + type: 'templateStart', + value: '[[', + pos: this.char + }; + } + if (this.peek() === ']' && this.peek(1) === ']') { + return { + type: 'templateEnd', + value: '[[', + pos: this.char + }; + } + return null; + }, + /* + * Extract a JavaScript identifier out of the next sequence of + * characters or return 'null' if its not possible. In addition, + * to Identifier this method can also produce BooleanLiteral + * (true/false) and NullLiteral (null). + */ + scanIdentifier: function () { + var id = ""; + var index = 0; + var type, char; + // Detects any character in the Unicode categories "Uppercase + // letter (Lu)", "Lowercase letter (Ll)", "Titlecase letter + // (Lt)", "Modifier letter (Lm)", "Other letter (Lo)", or + // "Letter number (Nl)". + // + // Both approach and unicodeLetterTable were borrowed from + // Google's Traceur. + function isUnicodeLetter(code) { + for (var i = 0; i < unicodeLetterTable.length;) { + if (code < unicodeLetterTable[i++]) { + return false; + } + if (code <= unicodeLetterTable[i++]) { + return true; + } + } + return false; + } + function isHexDigit(str) { + return (/^[0-9a-fA-F]$/).test(str); + } + var readUnicodeEscapeSequence = lodash_1.default.bind(function () { + /*jshint validthis:true */ + index += 1; + if (this.peek(index) !== "u") { + return null; + } + var ch1 = this.peek(index + 1); + var ch2 = this.peek(index + 2); + var ch3 = this.peek(index + 3); + var ch4 = this.peek(index + 4); + var code; + if (isHexDigit(ch1) && isHexDigit(ch2) && isHexDigit(ch3) && isHexDigit(ch4)) { + code = parseInt(ch1 + ch2 + ch3 + ch4, 16); + if (isUnicodeLetter(code)) { + index += 5; + return "\\u" + ch1 + ch2 + ch3 + ch4; + } + return null; + } + return null; + }, this); + var getIdentifierStart = lodash_1.default.bind(function () { + /*jshint validthis:true */ + var chr = this.peek(index); + var code = chr.charCodeAt(0); + if (chr === '*') { + index += 1; + return chr; + } + if (code === 92) { + return readUnicodeEscapeSequence(); + } + if (code < 128) { + if (identifierStartTable[code]) { + index += 1; + return chr; + } + return null; + } + if (isUnicodeLetter(code)) { + index += 1; + return chr; + } + return null; + }, this); + var getIdentifierPart = lodash_1.default.bind(function () { + /*jshint validthis:true */ + var chr = this.peek(index); + var code = chr.charCodeAt(0); + if (code === 92) { + return readUnicodeEscapeSequence(); + } + if (code < 128) { + if (identifierPartTable[code]) { + index += 1; + return chr; + } + return null; + } + if (isUnicodeLetter(code)) { + index += 1; + return chr; + } + return null; + }, this); + char = getIdentifierStart(); + if (char === null) { + return null; + } + id = char; + for (;;) { + char = getIdentifierPart(); + if (char === null) { + break; + } + id += char; + } + switch (id) { + case 'true': { + type = 'bool'; + break; + } + case 'false': { + type = 'bool'; + break; + } + default: + type = "identifier"; + } + return { + type: type, + value: id, + pos: this.char + }; + }, + /* + * Extract a numeric literal out of the next sequence of + * characters or return 'null' if its not possible. This method + * supports all numeric literals described in section 7.8.3 + * of the EcmaScript 5 specification. + * + * This method's implementation was heavily influenced by the + * scanNumericLiteral function in the Esprima parser's source code. + */ + scanNumericLiteral: function () { + var index = 0; + var value = ""; + var length = this.input.length; + var char = this.peek(index); + var bad; + function isDecimalDigit(str) { + return (/^[0-9]$/).test(str); + } + function isOctalDigit(str) { + return (/^[0-7]$/).test(str); + } + function isHexDigit(str) { + return (/^[0-9a-fA-F]$/).test(str); + } + function isIdentifierStart(ch) { + return (ch === "$") || (ch === "_") || (ch === "\\") || + (ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z"); + } + // handle negative num literals + if (char === '-') { + value += char; + index += 1; + char = this.peek(index); + } + // Numbers must start either with a decimal digit or a point. + if (char !== "." && !isDecimalDigit(char)) { + return null; + } + if (char !== ".") { + value += this.peek(index); + index += 1; + char = this.peek(index); + if (value === "0") { + // Base-16 numbers. + if (char === "x" || char === "X") { + index += 1; + value += char; + while (index < length) { + char = this.peek(index); + if (!isHexDigit(char)) { + break; + } + value += char; + index += 1; + } + if (value.length <= 2) { + return { + type: 'number', + value: value, + isMalformed: true, + pos: this.char + }; + } + if (index < length) { + char = this.peek(index); + if (isIdentifierStart(char)) { + return null; + } + } + return { + type: 'number', + value: value, + base: 16, + isMalformed: false, + pos: this.char + }; + } + // Base-8 numbers. + if (isOctalDigit(char)) { + index += 1; + value += char; + bad = false; + while (index < length) { + char = this.peek(index); + // Numbers like '019' (note the 9) are not valid octals + // but we still parse them and mark as malformed. + if (isDecimalDigit(char)) { + bad = true; + } + else if (!isOctalDigit(char)) { + break; + } + value += char; + index += 1; + } + if (index < length) { + char = this.peek(index); + if (isIdentifierStart(char)) { + return null; + } + } + return { + type: 'number', + value: value, + base: 8, + isMalformed: false + }; + } + // Decimal numbers that start with '0' such as '09' are illegal + // but we still parse them and return as malformed. + if (isDecimalDigit(char)) { + index += 1; + value += char; + } + } + while (index < length) { + char = this.peek(index); + if (!isDecimalDigit(char)) { + break; + } + value += char; + index += 1; + } + } + // Decimal digits. + if (char === ".") { + value += char; + index += 1; + while (index < length) { + char = this.peek(index); + if (!isDecimalDigit(char)) { + break; + } + value += char; + index += 1; + } + } + // Exponent part. + if (char === "e" || char === "E") { + value += char; + index += 1; + char = this.peek(index); + if (char === "+" || char === "-") { + value += this.peek(index); + index += 1; + } + char = this.peek(index); + if (isDecimalDigit(char)) { + value += char; + index += 1; + while (index < length) { + char = this.peek(index); + if (!isDecimalDigit(char)) { + break; + } + value += char; + index += 1; + } + } + else { + return null; + } + } + if (index < length) { + char = this.peek(index); + if (!this.isPunctuator(char)) { + return null; + } + } + return { + type: 'number', + value: value, + base: 10, + pos: this.char, + isMalformed: !isFinite(+value) + }; + }, + isPunctuator: function (ch1) { + switch (ch1) { + case ".": + case "(": + case ")": + case ",": + case "{": + case "}": + return true; + } + return false; + }, + scanPunctuator: function () { + var ch1 = this.peek(); + if (this.isPunctuator(ch1)) { + return { + type: ch1, + value: ch1, + pos: this.char + }; + } + return null; + }, + /* + * Extract a string out of the next sequence of characters and/or + * lines or return 'null' if its not possible. Since strings can + * span across multiple lines this method has to move the char + * pointer. + * + * This method recognizes pseudo-multiline JavaScript strings: + * + * var str = "hello\ + * world"; + */ + scanStringLiteral: function () { + /*jshint loopfunc:true */ + var quote = this.peek(); + // String must start with a quote. + if (quote !== "\"" && quote !== "'") { + return null; + } + var value = ""; + this.skip(); + while (this.peek() !== quote) { + if (this.peek() === "") { + return { + type: 'string', + value: value, + isUnclosed: true, + quote: quote, + pos: this.char + }; + } + var char = this.peek(); + var jump = 1; // A length of a jump, after we're done + // parsing this character. + value += char; + this.skip(jump); + } + this.skip(); + return { + type: 'string', + value: value, + isUnclosed: false, + quote: quote, + pos: this.char + }; + }, + }; + } + } +}); +//# sourceMappingURL=lexer.js.map \ No newline at end of file diff --git a/lexer.js.map b/lexer.js.map new file mode 100644 index 0000000..5afa654 --- /dev/null +++ b/lexer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"lexer.js","sourceRoot":"","sources":["./lexer.ts"],"names":["Lexer","isUnicodeLetter","isHexDigit","isDecimalDigit","isOctalDigit","isIdentifierStart"],"mappings":"AAAA,oDAAoD;;;QAahD,kBAAkB,EAqGlB,oBAAoB,EAEf,CAAC,EAoBN,mBAAmB,EAEd,EAAE;IAMX,eAAsB,UAAU;QAC9BA,IAAIA,CAACA,KAAKA,GAAGA,UAAUA,CAACA;QACxBA,IAAIA,CAACA,IAAIA,GAAGA,CAACA,CAACA;QACdA,IAAIA,CAACA,IAAIA,GAAGA,CAACA,CAACA;IAChBA,CAACA;IAJD,yBAIC,CAAA;;;;;;;YAhJD,kDAAkD;YAClD,qBAAqB;YACrB,+DAA+D;YAC/D,+DAA+D;YAC/D,+DAA+D;YAC/D,+DAA+D;YAC/D,+DAA+D;YAC/D,+DAA+D;YAE3D,kBAAkB,GAAG;gBACvB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;gBACtC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;gBAC1D,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;gBAC1D,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBACvD,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBAClD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;gBACtD,KAAK,EAA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"} diff --git a/module.js b/module.js new file mode 100644 index 0000000..fa4b5a6 --- /dev/null +++ b/module.js @@ -0,0 +1,39 @@ +System.register(['./datasource', './query_ctrl'], function(exports_1) { + var datasource_1, query_ctrl_1; + var OpenfalconConfigCtrl, OpenfalconQueryOptionsCtrl, AnnotationsQueryCtrl; + return { + setters:[ + function (datasource_1_1) { + datasource_1 = datasource_1_1; + }, + function (query_ctrl_1_1) { + query_ctrl_1 = query_ctrl_1_1; + }], + execute: function() { + OpenfalconConfigCtrl = (function () { + function OpenfalconConfigCtrl() { + } + OpenfalconConfigCtrl.templateUrl = 'partials/config.html'; + return OpenfalconConfigCtrl; + })(); + OpenfalconQueryOptionsCtrl = (function () { + function OpenfalconQueryOptionsCtrl() { + } + OpenfalconQueryOptionsCtrl.templateUrl = 'partials/query.options.html'; + return OpenfalconQueryOptionsCtrl; + })(); + AnnotationsQueryCtrl = (function () { + function AnnotationsQueryCtrl() { + } + AnnotationsQueryCtrl.templateUrl = 'partials/annotations.editor.html'; + return AnnotationsQueryCtrl; + })(); + exports_1("Datasource", datasource_1.OpenfalconDatasource); + exports_1("QueryCtrl", query_ctrl_1.OpenfalconQueryCtrl); + exports_1("ConfigCtrl", OpenfalconConfigCtrl); + exports_1("QueryOptionsCtrl", OpenfalconQueryOptionsCtrl); + exports_1("AnnotationsQueryCtrl", AnnotationsQueryCtrl); + } + } +}); +//# sourceMappingURL=module.js.map \ No newline at end of file diff --git a/module.js.map b/module.js.map new file mode 100644 index 0000000..e48fcaa --- /dev/null +++ b/module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"module.js","sourceRoot":"","sources":["./module.ts"],"names":["OpenfalconConfigCtrl","OpenfalconConfigCtrl.constructor","OpenfalconQueryOptionsCtrl","OpenfalconQueryOptionsCtrl.constructor","AnnotationsQueryCtrl","AnnotationsQueryCtrl.constructor"],"mappings":";;;;;;;;;;;;YAGA;gBAAAA;gBAEAC,CAACA;gBADQD,8BAAWA,GAAGA,sBAAsBA,CAACA;gBAC9CA,yBAACA;YAADA,CAACA,AAFD,IAEC;YAED;gBAAAE;gBAEAC,CAACA;gBADQD,oCAAWA,GAAGA,6BAA6BA,CAACA;gBACrDA,+BAACA;YAADA,CAACA,AAFD,IAEC;YAED;gBAAAE;gBAEAC,CAACA;gBADQD,gCAAWA,GAAGA,kCAAkCA,CAACA;gBAC1DA,2BAACA;YAADA,CAACA,AAFD,IAEC;YAGuB,wDAAU;YACX,sDAAS;YACR,2CAAU;YACJ,uDAAgB;YACpB,uDAAoB"} diff --git a/parser.js b/parser.js new file mode 100644 index 0000000..411aa35 --- /dev/null +++ b/parser.js @@ -0,0 +1,216 @@ +System.register(['./lexer'], function(exports_1) { + var lexer_1; + function Parser(expression) { + this.expression = expression; + this.lexer = new lexer_1.Lexer(expression); + this.tokens = this.lexer.tokenize(); + this.index = 0; + } + exports_1("Parser", Parser); + return { + setters:[ + function (lexer_1_1) { + lexer_1 = lexer_1_1; + }], + execute: function() { + Parser.prototype = { + getAst: function () { + return this.start(); + }, + start: function () { + try { + return this.functionCall() || this.metricExpression(); + } + catch (e) { + return { + type: 'error', + message: e.message, + pos: e.pos + }; + } + }, + curlyBraceSegment: function () { + if (this.match('identifier', '{') || this.match('{')) { + var curlySegment = ""; + while (!this.match('') && !this.match('}')) { + curlySegment += this.consumeToken().value; + } + if (!this.match('}')) { + this.errorMark("Expected closing '}'"); + } + curlySegment += this.consumeToken().value; + // if curly segment is directly followed by identifier + // include it in the segment + if (this.match('identifier')) { + curlySegment += this.consumeToken().value; + } + return { + type: 'segment', + value: curlySegment + }; + } + else { + return null; + } + }, + metricSegment: function () { + var curly = this.curlyBraceSegment(); + if (curly) { + return curly; + } + if (this.match('identifier') || this.match('number')) { + // hack to handle float numbers in metric segments + var parts = this.consumeToken().value.split('.'); + if (parts.length === 2) { + this.tokens.splice(this.index, 0, { type: '.' }); + this.tokens.splice(this.index + 1, 0, { type: 'number', value: parts[1] }); + } + return { + type: 'segment', + value: parts[0] + }; + } + if (!this.match('templateStart')) { + this.errorMark('Expected metric identifier'); + } + this.consumeToken(); + if (!this.match('identifier')) { + this.errorMark('Expected identifier after templateStart'); + } + var node = { + type: 'template', + value: this.consumeToken().value + }; + if (!this.match('templateEnd')) { + this.errorMark('Expected templateEnd'); + } + this.consumeToken(); + return node; + }, + metricExpression: function () { + if (!this.match('templateStart') && + !this.match('identifier') && + !this.match('number') && + !this.match('{')) { + return null; + } + var node = { + type: 'metric', + segments: [] + }; + node.segments.push(this.metricSegment()); + while (this.match('.')) { + this.consumeToken(); + var segment = this.metricSegment(); + if (!segment) { + this.errorMark('Expected metric identifier'); + } + node.segments.push(segment); + } + return node; + }, + functionCall: function () { + if (!this.match('identifier', '(')) { + return null; + } + var node = { + type: 'function', + name: this.consumeToken().value, + }; + // consume left parenthesis + this.consumeToken(); + node.params = this.functionParameters(); + if (!this.match(')')) { + this.errorMark('Expected closing parenthesis'); + } + this.consumeToken(); + return node; + }, + boolExpression: function () { + if (!this.match('bool')) { + return null; + } + return { + type: 'bool', + value: this.consumeToken().value === 'true', + }; + }, + functionParameters: function () { + if (this.match(')') || this.match('')) { + return []; + } + var param = this.functionCall() || + this.numericLiteral() || + this.seriesRefExpression() || + this.boolExpression() || + this.metricExpression() || + this.stringLiteral(); + if (!this.match(',')) { + return [param]; + } + this.consumeToken(); + return [param].concat(this.functionParameters()); + }, + seriesRefExpression: function () { + if (!this.match('identifier')) { + return null; + } + var value = this.tokens[this.index].value; + if (!value.match(/\#[A-Z]/)) { + return null; + } + var token = this.consumeToken(); + return { + type: 'series-ref', + value: token.value + }; + }, + numericLiteral: function () { + if (!this.match('number')) { + return null; + } + return { + type: 'number', + value: parseFloat(this.consumeToken().value) + }; + }, + stringLiteral: function () { + if (!this.match('string')) { + return null; + } + var token = this.consumeToken(); + if (token.isUnclosed) { + throw { message: 'Unclosed string parameter', pos: token.pos }; + } + return { + type: 'string', + value: token.value + }; + }, + errorMark: function (text) { + var currentToken = this.tokens[this.index]; + var type = currentToken ? currentToken.type : 'end of string'; + throw { + message: text + " instead found " + type, + pos: currentToken ? currentToken.pos : this.lexer.char + }; + }, + // returns token value and incre + consumeToken: function () { + this.index++; + return this.tokens[this.index - 1]; + }, + matchToken: function (type, index) { + var token = this.tokens[this.index + index]; + return (token === undefined && type === '') || + token && token.type === type; + }, + match: function (token1, token2) { + return this.matchToken(token1, 0) && + (!token2 || this.matchToken(token2, 1)); + }, + }; + } + } +}); +//# sourceMappingURL=parser.js.map diff --git a/parser.js.map b/parser.js.map new file mode 100644 index 0000000..394beea --- /dev/null +++ b/parser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parser.js","sourceRoot":"","sources":["./parser.ts"],"names":["Parser"],"mappings":"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"} diff --git a/partials/annotations.editor.html b/partials/annotations.editor.html new file mode 100644 index 0000000..2e0e724 --- /dev/null +++ b/partials/annotations.editor.html @@ -0,0 +1,10 @@ +
    +
    + Openfalcon metrics query + +
    +
    + Or Openfalcon events query + +
    +
    diff --git a/partials/config.html b/partials/config.html new file mode 100644 index 0000000..d7a0f73 --- /dev/null +++ b/partials/config.html @@ -0,0 +1,3 @@ + + + diff --git a/partials/query.editor.html b/partials/query.editor.html new file mode 100644 index 0000000..dd250c3 --- /dev/null +++ b/partials/query.editor.html @@ -0,0 +1,21 @@ + + +
  • + +
  • + +
  • + +
  • + +
  • +
  • + + +
  • + + +
  • + + diff --git a/partials/query.options.html b/partials/query.options.html new file mode 100644 index 0000000..d673231 --- /dev/null +++ b/partials/query.options.html @@ -0,0 +1,126 @@ +
    +
    +
    + + Cache timeout + + + +
    +
    + Max data points + + +
    +
    +
    +
    + +
    +
    + +
    +
    Shorter legend names
    +
      +
    • alias() function to specify a custom series name
    • +
    • aliasByNode(2) to alias by a specific part of your metric path
    • +
    • aliasByNode(2, -1) you can add multiple segment paths, and use negative index
    • +
    • groupByNode(2, 'sum') is useful if you have 2 wildcards in your metric path and want to sumSeries and group by
    • +
    +
    + +
    +
    Series as parameter
    +
      +
    • Some openfalcon functions allow you to have many series arguments
    • +
    • Use #[A-Z] to use a openfalcon query as parameter to a function
    • +
    • + Examples: +
        +
      • asPercent(#A, #B)
      • +
      • prod.srv-01.counters.count - asPercent(#A) : percentage of count in comparison with A query
      • +
      • prod.srv-01.counters.count - sumSeries(#A) : sum count and series A
      • +
      • divideSeries(#A, #B)
      • +
      +
    • +
    • If a query is added only to be used as a parameter, hide it from the graph with the eye icon
    • +
    +
    + +
    +
    Stacking
    +
      +
    • You find the stacking option under Display Styles tab
    • +
    • When stacking is enabled make sure null point mode is set to 'null as zero'
    • +
    +
    + +
    +
    Templating
    +
      +
    • You can use a template variable in place of metric names
    • +
    • You can use a template variable in place of function parameters
    • +
    • You enable the templating feature in Dashboard settings / Feature toggles
    • +
    +
    + +
    +
    Max data points
    +
      +
    • Every openfalcon request is issued with a maxDataPoints parameter
    • +
    • Openfalcon uses this parameter to consolidate the real number of values down to this number
    • +
    • If there are more real values, then by default they will be consolidated using averages
    • +
    • This could hide real peaks and max values in your series
    • +
    • You can change how point consolidation is made using the consolidateBy openfalcon function
    • +
    • Point consolidation will effect series legend values (min,max,total,current)
    • +
    • If you override maxDataPoint and set a high value performance can be severely effected
    • +
    +
    +
    +
    diff --git a/plugin.json b/plugin.json new file mode 100644 index 0000000..8bd19bc --- /dev/null +++ b/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "Openfalcon", + "type": "datasource", + "id": "openfalcon", + + "includes": [ + {"type": "dashboard", "name": "Openfalcon Carbon Metrics", "path": "dashboards/carbon_metrics.json"} + ], + + "metrics": true, + "annotations": true, + + "info": { + "author": { + "name": "Openfalcon Project", + "url": "http://grafana.org" + }, + "logos": { + "small": "img/openfalcon_logo.png", + "large": "img/openfalcon_logo.png" + } + } +} diff --git a/query_ctrl.js b/query_ctrl.js new file mode 100644 index 0000000..ec1fcac --- /dev/null +++ b/query_ctrl.js @@ -0,0 +1,275 @@ +/// +System.register(['./add_openfalcon_func', './func_editor', 'lodash', './gfunc', './parser', 'app/plugins/sdk'], function(exports_1) { + var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; + var lodash_1, gfunc_1, parser_1, sdk_1; + var OpenfalconQueryCtrl; + return { + setters:[ + function (_1) {}, + function (_2) {}, + function (lodash_1_1) { + lodash_1 = lodash_1_1; + }, + function (gfunc_1_1) { + gfunc_1 = gfunc_1_1; + }, + function (parser_1_1) { + parser_1 = parser_1_1; + }, + function (sdk_1_1) { + sdk_1 = sdk_1_1; + }], + execute: function() { + OpenfalconQueryCtrl = (function (_super) { + __extends(OpenfalconQueryCtrl, _super); + /** @ngInject **/ + function OpenfalconQueryCtrl($scope, $injector, uiSegmentSrv, templateSrv) { + _super.call(this, $scope, $injector); + this.uiSegmentSrv = uiSegmentSrv; + this.templateSrv = templateSrv; + if (this.target) { + this.target.target = this.target.target || ''; + this.parseTarget(); + } + } + OpenfalconQueryCtrl.prototype.toggleEditorMode = function () { + this.target.textEditor = !this.target.textEditor; + this.parseTarget(); + }; + OpenfalconQueryCtrl.prototype.parseTarget = function () { + this.functions = []; + this.segments = []; + this.error = null; + if (this.target.textEditor) { + //fix "." back to "#" + this.target.target = this.target.target.replace(/\./g, "#"); + //fix ip back to the right foramt ex. 10#10#10#10 -> 10.10.10.10 + this.target.target = this.target.target.replace(/(\d+)#(\d+)#(\d+)#(\d+)/g,"$1.$2.$3.$4"); + return; + }else{ + //fix "." to "#" + this.target.target = this.target.target.replace(/#/g, "."); + } + var parser = new parser_1.Parser(this.target.target); + var astNode = parser.getAst(); + if (astNode === null) { + this.checkOtherSegments(0); + return; + } + if (astNode.type === 'error') { + this.error = astNode.message + " at position: " + astNode.pos; + this.target.textEditor = true; + return; + } + try { + this.parseTargeRecursive(astNode, null, 0); + } + catch (err) { + console.log('error parsing target:', err.message); + this.error = err.message; + this.target.textEditor = true; + } + this.checkOtherSegments(this.segments.length - 1); + }; + OpenfalconQueryCtrl.prototype.addFunctionParameter = function (func, value, index, shiftBack) { + if (shiftBack) { + index = Math.max(index - 1, 0); + } + func.params[index] = value; + }; + OpenfalconQueryCtrl.prototype.parseTargeRecursive = function (astNode, func, index) { + var _this = this; + if (astNode === null) { + return null; + } + switch (astNode.type) { + case 'function': + var innerFunc = gfunc_1.default.createFuncInstance(astNode.name, { withDefaultParams: false }); + lodash_1.default.each(astNode.params, function (param, index) { + _this.parseTargeRecursive(param, innerFunc, index); + }); + innerFunc.updateText(); + this.functions.push(innerFunc); + break; + case 'series-ref': + this.addFunctionParameter(func, astNode.value, index, this.segments.length > 0); + break; + case 'bool': + case 'string': + case 'number': + if ((index - 1) >= func.def.params.length) { + throw { message: 'invalid number of parameters to method ' + func.def.name }; + } + this.addFunctionParameter(func, astNode.value, index, true); + break; + case 'metric': + if (this.segments.length > 0) { + if (astNode.segments.length !== 1) { + throw { message: 'Multiple metric params not supported, use text editor.' }; + } + this.addFunctionParameter(func, astNode.segments[0].value, index, true); + break; + } + this.segments = lodash_1.default.map(astNode.segments, function (segment) { + return _this.uiSegmentSrv.newSegment(segment); + }); + } + }; + OpenfalconQueryCtrl.prototype.getSegmentPathUpTo = function (index) { + var arr = this.segments.slice(0, index); + return lodash_1.default.reduce(arr, function (result, segment) { + return result ? (result + "#" + segment.value) : segment.value; + }, ""); + }; + OpenfalconQueryCtrl.prototype.checkOtherSegments = function (fromIndex) { + var _this = this; + if (fromIndex === 0) { + this.segments.push(this.uiSegmentSrv.newSelectMetric()); + return; + } + var path = this.getSegmentPathUpTo(fromIndex + 1); + return this.datasource.metricFindQuery(path).then(function (segments) { + if (segments.length === 0) { + if (path !== '') { + _this.segments = _this.segments.splice(0, fromIndex); + _this.segments.push(_this.uiSegmentSrv.newSelectMetric()); + } + } + else if (segments[0].expandable || segments.length > 1) { + if (_this.segments.length === fromIndex) { + _this.segments.push(_this.uiSegmentSrv.newSelectMetric()); + } + else { + return _this.checkOtherSegments(fromIndex + 1); + } + } + }).catch(function (err) { + _this.error = err.message || 'Failed to issue metric query'; + }); + }; + OpenfalconQueryCtrl.prototype.setSegmentFocus = function (segmentIndex) { + lodash_1.default.each(this.segments, function (segment, index) { + segment.focus = segmentIndex === index; + }); + }; + OpenfalconQueryCtrl.prototype.wrapFunction = function (target, func) { + return func.render(target); + }; + OpenfalconQueryCtrl.prototype.getAltSegments = function (index) { + var _this = this; + var query = ""; + if(index === 0){ + query = this.getSegmentPathUpTo(index) || ".*"; + }else{ + query = this.getSegmentPathUpTo(index) + '#.*'; + } + + return this.datasource.metricFindQuery(query).then(function (segments) { + var altSegments = lodash_1.default.map(segments, function (segment) { + return _this.uiSegmentSrv.newSegment({ value: segment.text, expandable: segment.expandable }); + }); + if (altSegments.length === 0) { return altSegments; } + // add template variables + lodash_1.default.each(_this.templateSrv.variables, function (variable) { + altSegments.unshift(_this.uiSegmentSrv.newSegment({ + type: 'template', + value: '$' + variable.name, + expandable: true, + })); + }); + // add wildcard option + altSegments.unshift(_this.uiSegmentSrv.newSegment('*')); + return altSegments; + }).catch(function (err) { + _this.error = err.message || 'Failed to issue metric query'; + return []; + }); + }; + OpenfalconQueryCtrl.prototype.segmentValueChanged = function (segment, segmentIndex) { + var _this = this; + this.error = null; + if (this.functions.length > 0 && this.functions[0].def.fake) { + this.functions = []; + } + if (segment.expandable) { + return this.checkOtherSegments(segmentIndex + 1).then(function () { + _this.setSegmentFocus(segmentIndex + 1); + _this.targetChanged(); + }); + } + else { + this.segments = this.segments.splice(0, segmentIndex + 1); + } + this.setSegmentFocus(segmentIndex + 1); + this.targetChanged(); + }; + OpenfalconQueryCtrl.prototype.targetTextChanged = function () { + this.parseTarget(); + this.panelCtrl.refresh(); + }; + OpenfalconQueryCtrl.prototype.targetChanged = function () { + if (this.error) { + return; + } + var oldTarget = this.target.target; + var target = this.getSegmentPathUpTo(this.segments.length); + this.target.target = lodash_1.default.reduce(this.functions, this.wrapFunction, target); + if (this.target.target !== oldTarget) { + if (this.segments[this.segments.length - 1].value !== 'select metric') { + this.panelCtrl.refresh(); + } + } + }; + OpenfalconQueryCtrl.prototype.removeFunction = function (func) { + this.functions = lodash_1.default.without(this.functions, func); + this.targetChanged(); + }; + OpenfalconQueryCtrl.prototype.addFunction = function (funcDef) { + var newFunc = gfunc_1.default.createFuncInstance(funcDef, { withDefaultParams: true }); + newFunc.added = true; + this.functions.push(newFunc); + this.moveAliasFuncLast(); + this.smartlyHandleNewAliasByNode(newFunc); + if (this.segments.length === 1 && this.segments[0].fake) { + this.segments = []; + } + if (!newFunc.params.length && newFunc.added) { + this.targetChanged(); + } + }; + OpenfalconQueryCtrl.prototype.moveAliasFuncLast = function () { + var aliasFunc = lodash_1.default.find(this.functions, function (func) { + return func.def.name === 'alias' || + func.def.name === 'aliasByNode' || + func.def.name === 'aliasByMetric'; + }); + if (aliasFunc) { + this.functions = lodash_1.default.without(this.functions, aliasFunc); + this.functions.push(aliasFunc); + } + }; + OpenfalconQueryCtrl.prototype.smartlyHandleNewAliasByNode = function (func) { + if (func.def.name !== 'aliasByNode') { + return; + } + for (var i = 0; i < this.segments.length; i++) { + if (this.segments[i].value.indexOf('*') >= 0) { + func.params[0] = i; + func.added = false; + this.targetChanged(); + return; + } + } + }; + OpenfalconQueryCtrl.templateUrl = 'partials/query.editor.html'; + return OpenfalconQueryCtrl; + })(sdk_1.QueryCtrl); + exports_1("OpenfalconQueryCtrl", OpenfalconQueryCtrl); + } + } +}); +//# sourceMappingURL=query_ctrl.js.map diff --git a/query_ctrl.js.map b/query_ctrl.js.map new file mode 100644 index 0000000..0d4c1d7 --- /dev/null +++ b/query_ctrl.js.map @@ -0,0 +1 @@ +{"version":3,"file":"query_ctrl.js","sourceRoot":"","sources":["./query_ctrl.ts"],"names":["OpenfalconQueryCtrl","OpenfalconQueryCtrl.constructor","OpenfalconQueryCtrl.toggleEditorMode","OpenfalconQueryCtrl.parseTarget","OpenfalconQueryCtrl.addFunctionParameter","OpenfalconQueryCtrl.parseTargeRecursive","OpenfalconQueryCtrl.getSegmentPathUpTo","OpenfalconQueryCtrl.checkOtherSegments","OpenfalconQueryCtrl.setSegmentFocus","OpenfalconQueryCtrl.wrapFunction","OpenfalconQueryCtrl.getAltSegments","OpenfalconQueryCtrl.segmentValueChanged","OpenfalconQueryCtrl.targetTextChanged","OpenfalconQueryCtrl.targetChanged","OpenfalconQueryCtrl.removeFunction","OpenfalconQueryCtrl.addFunction","OpenfalconQueryCtrl.moveAliasFuncLast","OpenfalconQueryCtrl.smartlyHandleNewAliasByNode"],"mappings":"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"} diff --git a/specs/datasource_specs.d.ts b/specs/datasource_specs.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/specs/datasource_specs.js b/specs/datasource_specs.js new file mode 100644 index 0000000..51c7627 --- /dev/null +++ b/specs/datasource_specs.js @@ -0,0 +1,123 @@ +System.register(['test/lib/common', 'test/specs/helpers', "../datasource"], function(exports_1) { + var common_1, helpers_1, datasource_1; + return { + setters:[ + function (common_1_1) { + common_1 = common_1_1; + }, + function (helpers_1_1) { + helpers_1 = helpers_1_1; + }, + function (datasource_1_1) { + datasource_1 = datasource_1_1; + }], + execute: function() { + common_1.describe('openfalconDatasource', function () { + var ctx = new helpers_1.default.ServiceTestContext(); + var instanceSettings = { url: [''] }; + common_1.beforeEach(common_1.angularMocks.module('grafana.core')); + common_1.beforeEach(common_1.angularMocks.module('grafana.services')); + common_1.beforeEach(ctx.providePhase(['backendSrv'])); + common_1.beforeEach(common_1.angularMocks.inject(function ($q, $rootScope, $httpBackend, $injector) { + ctx.$q = $q; + ctx.$httpBackend = $httpBackend; + ctx.$rootScope = $rootScope; + ctx.$injector = $injector; + $httpBackend.when('GET', /\.html$/).respond(''); + })); + common_1.beforeEach(function () { + ctx.ds = ctx.$injector.instantiate(datasource_1.OpenfalconDatasource, { instanceSettings: instanceSettings }); + }); + common_1.describe('When querying influxdb with one target using query editor target spec', function () { + var query = { + rangeRaw: { from: 'now-1h', to: 'now' }, + targets: [{ target: 'prod1.count' }, { target: 'prod2.count' }], + maxDataPoints: 500, + }; + var results; + var requestOptions; + common_1.beforeEach(function () { + ctx.backendSrv.datasourceRequest = function (options) { + requestOptions = options; + return ctx.$q.when({ data: [{ target: 'prod1.count', datapoints: [[10, 1], [12, 1]] }] }); + }; + ctx.ds.query(query).then(function (data) { results = data; }); + ctx.$rootScope.$apply(); + }); + common_1.it('should generate the correct query', function () { + common_1.expect(requestOptions.url).to.be('/render'); + }); + common_1.it('should query correctly', function () { + var params = requestOptions.data.split('&'); + common_1.expect(params).to.contain('target=prod1.count'); + common_1.expect(params).to.contain('target=prod2.count'); + common_1.expect(params).to.contain('from=-1h'); + common_1.expect(params).to.contain('until=now'); + }); + common_1.it('should exclude undefined params', function () { + var params = requestOptions.data.split('&'); + common_1.expect(params).to.not.contain('cacheTimeout=undefined'); + }); + common_1.it('should return series list', function () { + common_1.expect(results.data.length).to.be(1); + common_1.expect(results.data[0].target).to.be('prod1.count'); + }); + common_1.it('should convert to millisecond resolution', function () { + common_1.expect(results.data[0].datapoints[0][0]).to.be(10); + }); + }); + common_1.describe('building openfalcon params', function () { + common_1.it('should return empty array if no targets', function () { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{}] + }); + common_1.expect(results.length).to.be(0); + }); + common_1.it('should uri escape targets', function () { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{ target: 'prod1.{test,test2}' }, { target: 'prod2.count' }] + }); + common_1.expect(results).to.contain('target=prod1.%7Btest%2Ctest2%7D'); + }); + common_1.it('should replace target placeholder', function () { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{ target: 'series1' }, { target: 'series2' }, { target: 'asPercent(#A,#B)' }] + }); + common_1.expect(results[2]).to.be('target=asPercent(series1%2Cseries2)'); + }); + common_1.it('should replace target placeholder for hidden series', function () { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{ target: 'series1', hide: true }, { target: 'sumSeries(#A)', hide: true }, { target: 'asPercent(#A,#B)' }] + }); + common_1.expect(results[0]).to.be('target=' + encodeURIComponent('asPercent(series1,sumSeries(series1))')); + }); + common_1.it('should replace target placeholder when nesting query references', function () { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{ target: 'series1' }, { target: 'sumSeries(#A)' }, { target: 'asPercent(#A,#B)' }] + }); + common_1.expect(results[2]).to.be('target=' + encodeURIComponent("asPercent(series1,sumSeries(series1))")); + }); + common_1.it('should fix wrong minute interval parameters', function () { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{ target: "summarize(prod.25m.count, '25m', 'sum')" }] + }); + common_1.expect(results[0]).to.be('target=' + encodeURIComponent("summarize(prod.25m.count, '25min', 'sum')")); + }); + common_1.it('should fix wrong month interval parameters', function () { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{ target: "summarize(prod.5M.count, '5M', 'sum')" }] + }); + common_1.expect(results[0]).to.be('target=' + encodeURIComponent("summarize(prod.5M.count, '5mon', 'sum')")); + }); + common_1.it('should ignore empty targets', function () { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{ target: 'series1' }, { target: '' }] + }); + common_1.expect(results.length).to.be(2); + }); + }); + }); + } + } +}); +//# sourceMappingURL=datasource_specs.js.map \ No newline at end of file diff --git a/specs/datasource_specs.js.map b/specs/datasource_specs.js.map new file mode 100644 index 0000000..f409919 --- /dev/null +++ b/specs/datasource_specs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"datasource_specs.js","sourceRoot":"","sources":["../../../../../../public/app/plugins/datasource/openfalcon/specs/datasource_specs.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/specs/datasource_specs.ts b/specs/datasource_specs.ts new file mode 100644 index 0000000..8f50e49 --- /dev/null +++ b/specs/datasource_specs.ts @@ -0,0 +1,133 @@ + +import {describe, beforeEach, it, sinon, expect, angularMocks} from 'test/lib/common'; +import helpers from 'test/specs/helpers'; +import {OpenfalconDatasource} from "../datasource"; + +describe('openfalconDatasource', function() { + var ctx = new helpers.ServiceTestContext(); + var instanceSettings: any = {url: ['']}; + + beforeEach(angularMocks.module('grafana.core')); + beforeEach(angularMocks.module('grafana.services')); + beforeEach(ctx.providePhase(['backendSrv'])); + beforeEach(angularMocks.inject(function($q, $rootScope, $httpBackend, $injector) { + ctx.$q = $q; + ctx.$httpBackend = $httpBackend; + ctx.$rootScope = $rootScope; + ctx.$injector = $injector; + $httpBackend.when('GET', /\.html$/).respond(''); + })); + + beforeEach(function() { + ctx.ds = ctx.$injector.instantiate(OpenfalconDatasource, {instanceSettings: instanceSettings}); + }); + + describe('When querying influxdb with one target using query editor target spec', function() { + var query = { + rangeRaw: { from: 'now-1h', to: 'now' }, + targets: [{ target: 'prod1.count' }, {target: 'prod2.count'}], + maxDataPoints: 500, + }; + + var results; + var requestOptions; + + beforeEach(function() { + ctx.backendSrv.datasourceRequest = function(options) { + requestOptions = options; + return ctx.$q.when({data: [{ target: 'prod1.count', datapoints: [[10, 1], [12,1]] }]}); + }; + + ctx.ds.query(query).then(function(data) { results = data; }); + ctx.$rootScope.$apply(); + }); + + it('should generate the correct query', function() { + expect(requestOptions.url).to.be('/render'); + }); + + it('should query correctly', function() { + var params = requestOptions.data.split('&'); + expect(params).to.contain('target=prod1.count'); + expect(params).to.contain('target=prod2.count'); + expect(params).to.contain('from=-1h'); + expect(params).to.contain('until=now'); + }); + + it('should exclude undefined params', function() { + var params = requestOptions.data.split('&'); + expect(params).to.not.contain('cacheTimeout=undefined'); + }); + + it('should return series list', function() { + expect(results.data.length).to.be(1); + expect(results.data[0].target).to.be('prod1.count'); + }); + + it('should convert to millisecond resolution', function() { + expect(results.data[0].datapoints[0][0]).to.be(10); + }); + + }); + + describe('building openfalcon params', function() { + it('should return empty array if no targets', function() { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{}] + }); + expect(results.length).to.be(0); + }); + + it('should uri escape targets', function() { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{target: 'prod1.{test,test2}'}, {target: 'prod2.count'}] + }); + expect(results).to.contain('target=prod1.%7Btest%2Ctest2%7D'); + }); + + it('should replace target placeholder', function() { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{target: 'series1'}, {target: 'series2'}, {target: 'asPercent(#A,#B)'}] + }); + expect(results[2]).to.be('target=asPercent(series1%2Cseries2)'); + }); + + it('should replace target placeholder for hidden series', function() { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{target: 'series1', hide: true}, {target: 'sumSeries(#A)', hide: true}, {target: 'asPercent(#A,#B)'}] + }); + expect(results[0]).to.be('target=' + encodeURIComponent('asPercent(series1,sumSeries(series1))')); + }); + + it('should replace target placeholder when nesting query references', function() { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{target: 'series1'}, {target: 'sumSeries(#A)'}, {target: 'asPercent(#A,#B)'}] + }); + expect(results[2]).to.be('target=' + encodeURIComponent("asPercent(series1,sumSeries(series1))")); + }); + + it('should fix wrong minute interval parameters', function() { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{target: "summarize(prod.25m.count, '25m', 'sum')" }] + }); + expect(results[0]).to.be('target=' + encodeURIComponent("summarize(prod.25m.count, '25min', 'sum')")); + }); + + it('should fix wrong month interval parameters', function() { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{target: "summarize(prod.5M.count, '5M', 'sum')" }] + }); + expect(results[0]).to.be('target=' + encodeURIComponent("summarize(prod.5M.count, '5mon', 'sum')")); + }); + + it('should ignore empty targets', function() { + var results = ctx.ds.buildOpenfalconParams({ + targets: [{target: 'series1'}, {target: ''}] + }); + expect(results.length).to.be(2); + }); + + }); + +}); + diff --git a/specs/gfunc_specs.d.ts b/specs/gfunc_specs.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/specs/gfunc_specs.js b/specs/gfunc_specs.js new file mode 100644 index 0000000..ea9d551 --- /dev/null +++ b/specs/gfunc_specs.js @@ -0,0 +1,117 @@ +System.register(['test/lib/common', '../gfunc'], function(exports_1) { + var common_1, gfunc_1; + return { + setters:[ + function (common_1_1) { + common_1 = common_1_1; + }, + function (gfunc_1_1) { + gfunc_1 = gfunc_1_1; + }], + execute: function() { + common_1.describe('when creating func instance from func names', function () { + common_1.it('should return func instance', function () { + var func = gfunc_1.default.createFuncInstance('sumSeries'); + common_1.expect(func).to.be.ok(); + common_1.expect(func.def.name).to.equal('sumSeries'); + common_1.expect(func.def.params.length).to.equal(5); + common_1.expect(func.def.defaultParams.length).to.equal(1); + }); + common_1.it('should return func instance with shortName', function () { + var func = gfunc_1.default.createFuncInstance('sum'); + common_1.expect(func).to.be.ok(); + }); + common_1.it('should return func instance from funcDef', function () { + var func = gfunc_1.default.createFuncInstance('sum'); + var func2 = gfunc_1.default.createFuncInstance(func.def); + common_1.expect(func2).to.be.ok(); + }); + common_1.it('func instance should have text representation', function () { + var func = gfunc_1.default.createFuncInstance('groupByNode'); + func.params[0] = 5; + func.params[1] = 'avg'; + func.updateText(); + common_1.expect(func.text).to.equal("groupByNode(5, avg)"); + }); + }); + common_1.describe('when rendering func instance', function () { + common_1.it('should handle single metric param', function () { + var func = gfunc_1.default.createFuncInstance('sumSeries'); + common_1.expect(func.render('hello.metric')).to.equal("sumSeries(hello.metric)"); + }); + common_1.it('should include default params if options enable it', function () { + var func = gfunc_1.default.createFuncInstance('scaleToSeconds', { withDefaultParams: true }); + common_1.expect(func.render('hello')).to.equal("scaleToSeconds(hello, 1)"); + }); + common_1.it('should handle int or interval params with number', function () { + var func = gfunc_1.default.createFuncInstance('movingMedian'); + func.params[0] = '5'; + common_1.expect(func.render('hello')).to.equal("movingMedian(hello, 5)"); + }); + common_1.it('should handle int or interval params with interval string', function () { + var func = gfunc_1.default.createFuncInstance('movingMedian'); + func.params[0] = '5min'; + common_1.expect(func.render('hello')).to.equal("movingMedian(hello, '5min')"); + }); + common_1.it('should handle metric param and int param and string param', function () { + var func = gfunc_1.default.createFuncInstance('groupByNode'); + func.params[0] = 5; + func.params[1] = 'avg'; + common_1.expect(func.render('hello.metric')).to.equal("groupByNode(hello.metric, 5, 'avg')"); + }); + common_1.it('should handle function with no metric param', function () { + var func = gfunc_1.default.createFuncInstance('randomWalk'); + func.params[0] = 'test'; + common_1.expect(func.render(undefined)).to.equal("randomWalk('test')"); + }); + common_1.it('should handle function multiple series params', function () { + var func = gfunc_1.default.createFuncInstance('asPercent'); + func.params[0] = '#B'; + common_1.expect(func.render('#A')).to.equal("asPercent(#A, #B)"); + }); + }); + common_1.describe('when requesting function categories', function () { + common_1.it('should return function categories', function () { + var catIndex = gfunc_1.default.getCategories(); + common_1.expect(catIndex.Special.length).to.be.greaterThan(8); + }); + }); + common_1.describe('when updating func param', function () { + common_1.it('should update param value and update text representation', function () { + var func = gfunc_1.default.createFuncInstance('summarize', { withDefaultParams: true }); + func.updateParam('1h', 0); + common_1.expect(func.params[0]).to.be('1h'); + common_1.expect(func.text).to.be('summarize(1h, sum, false)'); + }); + common_1.it('should parse numbers as float', function () { + var func = gfunc_1.default.createFuncInstance('scale'); + func.updateParam('0.001', 0); + common_1.expect(func.params[0]).to.be('0.001'); + }); + }); + common_1.describe('when updating func param with optional second parameter', function () { + common_1.it('should update value and text', function () { + var func = gfunc_1.default.createFuncInstance('aliasByNode'); + func.updateParam('1', 0); + common_1.expect(func.params[0]).to.be('1'); + }); + common_1.it('should slit text and put value in second param', function () { + var func = gfunc_1.default.createFuncInstance('aliasByNode'); + func.updateParam('4,-5', 0); + common_1.expect(func.params[0]).to.be('4'); + common_1.expect(func.params[1]).to.be('-5'); + common_1.expect(func.text).to.be('aliasByNode(4, -5)'); + }); + common_1.it('should remove second param when empty string is set', function () { + var func = gfunc_1.default.createFuncInstance('aliasByNode'); + func.updateParam('4,-5', 0); + func.updateParam('', 1); + common_1.expect(func.params[0]).to.be('4'); + common_1.expect(func.params[1]).to.be(undefined); + common_1.expect(func.text).to.be('aliasByNode(4)'); + }); + }); + } + } +}); +//# sourceMappingURL=gfunc_specs.js.map \ No newline at end of file diff --git a/specs/gfunc_specs.js.map b/specs/gfunc_specs.js.map new file mode 100644 index 0000000..29c2617 --- /dev/null +++ b/specs/gfunc_specs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gfunc_specs.js","sourceRoot":"","sources":["../../../../../../public/app/plugins/datasource/openfalcon/specs/gfunc_specs.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/specs/gfunc_specs.ts b/specs/gfunc_specs.ts new file mode 100644 index 0000000..4f8f00d --- /dev/null +++ b/specs/gfunc_specs.ts @@ -0,0 +1,125 @@ + +import {describe, it, expect} from 'test/lib/common'; +import gfunc from '../gfunc'; + +describe('when creating func instance from func names', function() { + it('should return func instance', function() { + var func = gfunc.createFuncInstance('sumSeries'); + expect(func).to.be.ok(); + expect(func.def.name).to.equal('sumSeries'); + expect(func.def.params.length).to.equal(5); + expect(func.def.defaultParams.length).to.equal(1); + }); + + it('should return func instance with shortName', function() { + var func = gfunc.createFuncInstance('sum'); + expect(func).to.be.ok(); + }); + + it('should return func instance from funcDef', function() { + var func = gfunc.createFuncInstance('sum'); + var func2 = gfunc.createFuncInstance(func.def); + expect(func2).to.be.ok(); + }); + + it('func instance should have text representation', function() { + var func = gfunc.createFuncInstance('groupByNode'); + func.params[0] = 5; + func.params[1] = 'avg'; + func.updateText(); + expect(func.text).to.equal("groupByNode(5, avg)"); + }); +}); + +describe('when rendering func instance', function() { + + it('should handle single metric param', function() { + var func = gfunc.createFuncInstance('sumSeries'); + expect(func.render('hello.metric')).to.equal("sumSeries(hello.metric)"); + }); + + it('should include default params if options enable it', function() { + var func = gfunc.createFuncInstance('scaleToSeconds', { withDefaultParams: true }); + expect(func.render('hello')).to.equal("scaleToSeconds(hello, 1)"); + }); + + it('should handle int or interval params with number', function() { + var func = gfunc.createFuncInstance('movingMedian'); + func.params[0] = '5'; + expect(func.render('hello')).to.equal("movingMedian(hello, 5)"); + }); + + it('should handle int or interval params with interval string', function() { + var func = gfunc.createFuncInstance('movingMedian'); + func.params[0] = '5min'; + expect(func.render('hello')).to.equal("movingMedian(hello, '5min')"); + }); + + it('should handle metric param and int param and string param', function() { + var func = gfunc.createFuncInstance('groupByNode'); + func.params[0] = 5; + func.params[1] = 'avg'; + expect(func.render('hello.metric')).to.equal("groupByNode(hello.metric, 5, 'avg')"); + }); + + it('should handle function with no metric param', function() { + var func = gfunc.createFuncInstance('randomWalk'); + func.params[0] = 'test'; + expect(func.render(undefined)).to.equal("randomWalk('test')"); + }); + + it('should handle function multiple series params', function() { + var func = gfunc.createFuncInstance('asPercent'); + func.params[0] = '#B'; + expect(func.render('#A')).to.equal("asPercent(#A, #B)"); + }); + +}); + +describe('when requesting function categories', function() { + it('should return function categories', function() { + var catIndex = gfunc.getCategories(); + expect(catIndex.Special.length).to.be.greaterThan(8); + }); +}); + +describe('when updating func param', function() { + it('should update param value and update text representation', function() { + var func = gfunc.createFuncInstance('summarize', { withDefaultParams: true }); + func.updateParam('1h', 0); + expect(func.params[0]).to.be('1h'); + expect(func.text).to.be('summarize(1h, sum, false)'); + }); + + it('should parse numbers as float', function() { + var func = gfunc.createFuncInstance('scale'); + func.updateParam('0.001', 0); + expect(func.params[0]).to.be('0.001'); + }); +}); + +describe('when updating func param with optional second parameter', function() { + it('should update value and text', function() { + var func = gfunc.createFuncInstance('aliasByNode'); + func.updateParam('1', 0); + expect(func.params[0]).to.be('1'); + }); + + it('should slit text and put value in second param', function() { + var func = gfunc.createFuncInstance('aliasByNode'); + func.updateParam('4,-5', 0); + expect(func.params[0]).to.be('4'); + expect(func.params[1]).to.be('-5'); + expect(func.text).to.be('aliasByNode(4, -5)'); + }); + + it('should remove second param when empty string is set', function() { + var func = gfunc.createFuncInstance('aliasByNode'); + func.updateParam('4,-5', 0); + func.updateParam('', 1); + expect(func.params[0]).to.be('4'); + expect(func.params[1]).to.be(undefined); + expect(func.text).to.be('aliasByNode(4)'); + }); +}); + diff --git a/specs/lexer_specs.d.ts b/specs/lexer_specs.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/specs/lexer_specs.js b/specs/lexer_specs.js new file mode 100644 index 0000000..895e89d --- /dev/null +++ b/specs/lexer_specs.js @@ -0,0 +1,116 @@ +System.register(['test/lib/common', '../lexer'], function(exports_1) { + var common_1, lexer_1; + return { + setters:[ + function (common_1_1) { + common_1 = common_1_1; + }, + function (lexer_1_1) { + lexer_1 = lexer_1_1; + }], + execute: function() { + common_1.describe('when lexing openfalcon expression', function () { + common_1.it('should tokenize metric expression', function () { + var lexer = new lexer_1.Lexer('metric.test.*.asd.count'); + var tokens = lexer.tokenize(); + common_1.expect(tokens[0].value).to.be('metric'); + common_1.expect(tokens[1].value).to.be('.'); + common_1.expect(tokens[2].type).to.be('identifier'); + common_1.expect(tokens[4].type).to.be('identifier'); + common_1.expect(tokens[4].pos).to.be(13); + }); + common_1.it('should tokenize metric expression with dash', function () { + var lexer = new lexer_1.Lexer('metric.test.se1-server-*.asd.count'); + var tokens = lexer.tokenize(); + common_1.expect(tokens[4].type).to.be('identifier'); + common_1.expect(tokens[4].value).to.be('se1-server-*'); + }); + common_1.it('should tokenize metric expression with dash2', function () { + var lexer = new lexer_1.Lexer('net.192-168-1-1.192-168-1-9.ping_value.*'); + var tokens = lexer.tokenize(); + common_1.expect(tokens[0].value).to.be('net'); + common_1.expect(tokens[2].value).to.be('192-168-1-1'); + }); + common_1.it('should tokenize metric expression with equal sign', function () { + var lexer = new lexer_1.Lexer('apps=test'); + var tokens = lexer.tokenize(); + common_1.expect(tokens[0].value).to.be('apps=test'); + }); + common_1.it('simple function2', function () { + var lexer = new lexer_1.Lexer('offset(test.metric, -100)'); + var tokens = lexer.tokenize(); + common_1.expect(tokens[2].type).to.be('identifier'); + common_1.expect(tokens[4].type).to.be('identifier'); + common_1.expect(tokens[6].type).to.be('number'); + }); + common_1.it('should tokenize metric expression with curly braces', function () { + var lexer = new lexer_1.Lexer('metric.se1-{first, second}.count'); + var tokens = lexer.tokenize(); + common_1.expect(tokens.length).to.be(10); + common_1.expect(tokens[3].type).to.be('{'); + common_1.expect(tokens[4].value).to.be('first'); + common_1.expect(tokens[5].value).to.be(','); + common_1.expect(tokens[6].value).to.be('second'); + }); + common_1.it('should tokenize metric expression with number segments', function () { + var lexer = new lexer_1.Lexer("metric.10.12_10.test"); + var tokens = lexer.tokenize(); + common_1.expect(tokens[0].type).to.be('identifier'); + common_1.expect(tokens[2].type).to.be('identifier'); + common_1.expect(tokens[2].value).to.be('10'); + common_1.expect(tokens[4].value).to.be('12_10'); + common_1.expect(tokens[4].type).to.be('identifier'); + }); + common_1.it('should tokenize func call with numbered metric and number arg', function () { + var lexer = new lexer_1.Lexer("scale(metric.10, 15)"); + var tokens = lexer.tokenize(); + common_1.expect(tokens[0].type).to.be('identifier'); + common_1.expect(tokens[2].type).to.be('identifier'); + common_1.expect(tokens[2].value).to.be('metric'); + common_1.expect(tokens[4].value).to.be('10'); + common_1.expect(tokens[4].type).to.be('number'); + common_1.expect(tokens[6].type).to.be('number'); + }); + common_1.it('should tokenize metric with template parameter', function () { + var lexer = new lexer_1.Lexer("metric.[[server]].test"); + var tokens = lexer.tokenize(); + common_1.expect(tokens[2].type).to.be('identifier'); + common_1.expect(tokens[2].value).to.be('[[server]]'); + common_1.expect(tokens[4].type).to.be('identifier'); + }); + common_1.it('should tokenize metric with question mark', function () { + var lexer = new lexer_1.Lexer("metric.server_??.test"); + var tokens = lexer.tokenize(); + common_1.expect(tokens[2].type).to.be('identifier'); + common_1.expect(tokens[2].value).to.be('server_??'); + common_1.expect(tokens[4].type).to.be('identifier'); + }); + common_1.it('should handle error with unterminated string', function () { + var lexer = new lexer_1.Lexer("alias(metric, 'asd)"); + var tokens = lexer.tokenize(); + common_1.expect(tokens[0].value).to.be('alias'); + common_1.expect(tokens[1].value).to.be('('); + common_1.expect(tokens[2].value).to.be('metric'); + common_1.expect(tokens[3].value).to.be(','); + common_1.expect(tokens[4].type).to.be('string'); + common_1.expect(tokens[4].isUnclosed).to.be(true); + common_1.expect(tokens[4].pos).to.be(20); + }); + common_1.it('should handle float parameters', function () { + var lexer = new lexer_1.Lexer("alias(metric, 0.002)"); + var tokens = lexer.tokenize(); + common_1.expect(tokens[4].type).to.be('number'); + common_1.expect(tokens[4].value).to.be('0.002'); + }); + common_1.it('should handle bool parameters', function () { + var lexer = new lexer_1.Lexer("alias(metric, true, false)"); + var tokens = lexer.tokenize(); + common_1.expect(tokens[4].type).to.be('bool'); + common_1.expect(tokens[4].value).to.be('true'); + common_1.expect(tokens[6].type).to.be('bool'); + }); + }); + } + } +}); +//# sourceMappingURL=lexer_specs.js.map \ No newline at end of file diff --git a/specs/lexer_specs.js.map b/specs/lexer_specs.js.map new file mode 100644 index 0000000..bfd61b9 --- /dev/null +++ b/specs/lexer_specs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"lexer_specs.js","sourceRoot":"","sources":["../../../../../../public/app/plugins/datasource/openfalcon/specs/lexer_specs.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/specs/lexer_specs.ts b/specs/lexer_specs.ts new file mode 100644 index 0000000..54b8afc --- /dev/null +++ b/specs/lexer_specs.ts @@ -0,0 +1,118 @@ + +import {describe, it, expect} from 'test/lib/common'; +import {Lexer} from '../lexer'; + +describe('when lexing openfalcon expression', function() { + + it('should tokenize metric expression', function() { + var lexer = new Lexer('metric.test.*.asd.count'); + var tokens = lexer.tokenize(); + expect(tokens[0].value).to.be('metric'); + expect(tokens[1].value).to.be('.'); + expect(tokens[2].type).to.be('identifier'); + expect(tokens[4].type).to.be('identifier'); + expect(tokens[4].pos).to.be(13); + }); + + it('should tokenize metric expression with dash', function() { + var lexer = new Lexer('metric.test.se1-server-*.asd.count'); + var tokens = lexer.tokenize(); + expect(tokens[4].type).to.be('identifier'); + expect(tokens[4].value).to.be('se1-server-*'); + }); + + it('should tokenize metric expression with dash2', function() { + var lexer = new Lexer('net.192-168-1-1.192-168-1-9.ping_value.*'); + var tokens = lexer.tokenize(); + expect(tokens[0].value).to.be('net'); + expect(tokens[2].value).to.be('192-168-1-1'); + }); + + it('should tokenize metric expression with equal sign', function() { + var lexer = new Lexer('apps=test'); + var tokens = lexer.tokenize(); + expect(tokens[0].value).to.be('apps=test'); + }); + + it('simple function2', function() { + var lexer = new Lexer('offset(test.metric, -100)'); + var tokens = lexer.tokenize(); + expect(tokens[2].type).to.be('identifier'); + expect(tokens[4].type).to.be('identifier'); + expect(tokens[6].type).to.be('number'); + }); + + it('should tokenize metric expression with curly braces', function() { + var lexer = new Lexer('metric.se1-{first, second}.count'); + var tokens = lexer.tokenize(); + expect(tokens.length).to.be(10); + expect(tokens[3].type).to.be('{'); + expect(tokens[4].value).to.be('first'); + expect(tokens[5].value).to.be(','); + expect(tokens[6].value).to.be('second'); + }); + + it('should tokenize metric expression with number segments', function() { + var lexer = new Lexer("metric.10.12_10.test"); + var tokens = lexer.tokenize(); + expect(tokens[0].type).to.be('identifier'); + expect(tokens[2].type).to.be('identifier'); + expect(tokens[2].value).to.be('10'); + expect(tokens[4].value).to.be('12_10'); + expect(tokens[4].type).to.be('identifier'); + }); + + it('should tokenize func call with numbered metric and number arg', function() { + var lexer = new Lexer("scale(metric.10, 15)"); + var tokens = lexer.tokenize(); + expect(tokens[0].type).to.be('identifier'); + expect(tokens[2].type).to.be('identifier'); + expect(tokens[2].value).to.be('metric'); + expect(tokens[4].value).to.be('10'); + expect(tokens[4].type).to.be('number'); + expect(tokens[6].type).to.be('number'); + }); + + it('should tokenize metric with template parameter', function() { + var lexer = new Lexer("metric.[[server]].test"); + var tokens = lexer.tokenize(); + expect(tokens[2].type).to.be('identifier'); + expect(tokens[2].value).to.be('[[server]]'); + expect(tokens[4].type).to.be('identifier'); + }); + + it('should tokenize metric with question mark', function() { + var lexer = new Lexer("metric.server_??.test"); + var tokens = lexer.tokenize(); + expect(tokens[2].type).to.be('identifier'); + expect(tokens[2].value).to.be('server_??'); + expect(tokens[4].type).to.be('identifier'); + }); + + it('should handle error with unterminated string', function() { + var lexer = new Lexer("alias(metric, 'asd)"); + var tokens = lexer.tokenize(); + expect(tokens[0].value).to.be('alias'); + expect(tokens[1].value).to.be('('); + expect(tokens[2].value).to.be('metric'); + expect(tokens[3].value).to.be(','); + expect(tokens[4].type).to.be('string'); + expect(tokens[4].isUnclosed).to.be(true); + expect(tokens[4].pos).to.be(20); + }); + + it('should handle float parameters', function() { + var lexer = new Lexer("alias(metric, 0.002)"); + var tokens = lexer.tokenize(); + expect(tokens[4].type).to.be('number'); + expect(tokens[4].value).to.be('0.002'); + }); + + it('should handle bool parameters', function() { + var lexer = new Lexer("alias(metric, true, false)"); + var tokens = lexer.tokenize(); + expect(tokens[4].type).to.be('bool'); + expect(tokens[4].value).to.be('true'); + expect(tokens[6].type).to.be('bool'); + }); +}); diff --git a/specs/parser_specs.d.ts b/specs/parser_specs.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/specs/parser_specs.js b/specs/parser_specs.js new file mode 100644 index 0000000..03177f8 --- /dev/null +++ b/specs/parser_specs.js @@ -0,0 +1,164 @@ +System.register(['test/lib/common', '../parser'], function(exports_1) { + var common_1, parser_1; + return { + setters:[ + function (common_1_1) { + common_1 = common_1_1; + }, + function (parser_1_1) { + parser_1 = parser_1_1; + }], + execute: function() { + common_1.describe('when parsing', function () { + common_1.it('simple metric expression', function () { + var parser = new parser_1.Parser('metric.test.*.asd.count'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('metric'); + common_1.expect(rootNode.segments.length).to.be(5); + common_1.expect(rootNode.segments[0].value).to.be('metric'); + }); + common_1.it('simple metric expression with numbers in segments', function () { + var parser = new parser_1.Parser('metric.10.15_20.5'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('metric'); + common_1.expect(rootNode.segments.length).to.be(4); + common_1.expect(rootNode.segments[1].value).to.be('10'); + common_1.expect(rootNode.segments[2].value).to.be('15_20'); + common_1.expect(rootNode.segments[3].value).to.be('5'); + }); + common_1.it('simple metric expression with curly braces', function () { + var parser = new parser_1.Parser('metric.se1-{count, max}'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('metric'); + common_1.expect(rootNode.segments.length).to.be(2); + common_1.expect(rootNode.segments[1].value).to.be('se1-{count,max}'); + }); + common_1.it('simple metric expression with curly braces at start of segment and with post chars', function () { + var parser = new parser_1.Parser('metric.{count, max}-something.count'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('metric'); + common_1.expect(rootNode.segments.length).to.be(3); + common_1.expect(rootNode.segments[1].value).to.be('{count,max}-something'); + }); + common_1.it('simple function', function () { + var parser = new parser_1.Parser('sum(test)'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('function'); + common_1.expect(rootNode.params.length).to.be(1); + }); + common_1.it('simple function2', function () { + var parser = new parser_1.Parser('offset(test.metric, -100)'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('function'); + common_1.expect(rootNode.params[0].type).to.be('metric'); + common_1.expect(rootNode.params[1].type).to.be('number'); + }); + common_1.it('simple function with string arg', function () { + var parser = new parser_1.Parser("randomWalk('test')"); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('function'); + common_1.expect(rootNode.params.length).to.be(1); + common_1.expect(rootNode.params[0].type).to.be('string'); + }); + common_1.it('function with multiple args', function () { + var parser = new parser_1.Parser("sum(test, 1, 'test')"); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('function'); + common_1.expect(rootNode.params.length).to.be(3); + common_1.expect(rootNode.params[0].type).to.be('metric'); + common_1.expect(rootNode.params[1].type).to.be('number'); + common_1.expect(rootNode.params[2].type).to.be('string'); + }); + common_1.it('function with nested function', function () { + var parser = new parser_1.Parser("sum(scaleToSeconds(test, 1))"); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('function'); + common_1.expect(rootNode.params.length).to.be(1); + common_1.expect(rootNode.params[0].type).to.be('function'); + common_1.expect(rootNode.params[0].name).to.be('scaleToSeconds'); + common_1.expect(rootNode.params[0].params.length).to.be(2); + common_1.expect(rootNode.params[0].params[0].type).to.be('metric'); + common_1.expect(rootNode.params[0].params[1].type).to.be('number'); + }); + common_1.it('function with multiple series', function () { + var parser = new parser_1.Parser("sum(test.test.*.count, test.timers.*.count)"); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('function'); + common_1.expect(rootNode.params.length).to.be(2); + common_1.expect(rootNode.params[0].type).to.be('metric'); + common_1.expect(rootNode.params[1].type).to.be('metric'); + }); + common_1.it('function with templated series', function () { + var parser = new parser_1.Parser("sum(test.[[server]].count)"); + var rootNode = parser.getAst(); + common_1.expect(rootNode.message).to.be(undefined); + common_1.expect(rootNode.params[0].type).to.be('metric'); + common_1.expect(rootNode.params[0].segments[1].type).to.be('segment'); + common_1.expect(rootNode.params[0].segments[1].value).to.be('[[server]]'); + }); + common_1.it('invalid metric expression', function () { + var parser = new parser_1.Parser('metric.test.*.asd.'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.message).to.be('Expected metric identifier instead found end of string'); + common_1.expect(rootNode.pos).to.be(19); + }); + common_1.it('invalid function expression missing closing parenthesis', function () { + var parser = new parser_1.Parser('sum(test'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.message).to.be('Expected closing parenthesis instead found end of string'); + common_1.expect(rootNode.pos).to.be(9); + }); + common_1.it('unclosed string in function', function () { + var parser = new parser_1.Parser("sum('test)"); + var rootNode = parser.getAst(); + common_1.expect(rootNode.message).to.be('Unclosed string parameter'); + common_1.expect(rootNode.pos).to.be(11); + }); + common_1.it('handle issue #69', function () { + var parser = new parser_1.Parser('cactiStyle(offset(scale(net.192-168-1-1.192-168-1-9.ping_value.*,0.001),-100))'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('function'); + }); + common_1.it('handle float function arguments', function () { + var parser = new parser_1.Parser('scale(test, 0.002)'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('function'); + common_1.expect(rootNode.params[1].type).to.be('number'); + common_1.expect(rootNode.params[1].value).to.be(0.002); + }); + common_1.it('handle curly brace pattern at start', function () { + var parser = new parser_1.Parser('{apps}.test'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('metric'); + common_1.expect(rootNode.segments[0].value).to.be('{apps}'); + common_1.expect(rootNode.segments[1].value).to.be('test'); + }); + common_1.it('series parameters', function () { + var parser = new parser_1.Parser('asPercent(#A, #B)'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('function'); + common_1.expect(rootNode.params[0].type).to.be('series-ref'); + common_1.expect(rootNode.params[0].value).to.be('#A'); + common_1.expect(rootNode.params[1].value).to.be('#B'); + }); + common_1.it('series parameters, issue 2788', function () { + var parser = new parser_1.Parser("summarize(diffSeries(#A, #B), '10m', 'sum', false)"); + var rootNode = parser.getAst(); + common_1.expect(rootNode.type).to.be('function'); + common_1.expect(rootNode.params[0].type).to.be('function'); + common_1.expect(rootNode.params[1].value).to.be('10m'); + common_1.expect(rootNode.params[3].type).to.be('bool'); + }); + common_1.it('should parse metric expression with ip number segments', function () { + var parser = new parser_1.Parser('5.10.123.5'); + var rootNode = parser.getAst(); + common_1.expect(rootNode.segments[0].value).to.be('5'); + common_1.expect(rootNode.segments[1].value).to.be('10'); + common_1.expect(rootNode.segments[2].value).to.be('123'); + common_1.expect(rootNode.segments[3].value).to.be('5'); + }); + }); + } + } +}); +//# sourceMappingURL=parser_specs.js.map \ No newline at end of file diff --git a/specs/parser_specs.js.map b/specs/parser_specs.js.map new file mode 100644 index 0000000..eeba2a9 --- /dev/null +++ b/specs/parser_specs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parser_specs.js","sourceRoot":"","sources":["../../../../../../public/app/plugins/datasource/openfalcon/specs/parser_specs.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/specs/parser_specs.ts b/specs/parser_specs.ts new file mode 100644 index 0000000..a69dcb5 --- /dev/null +++ b/specs/parser_specs.ts @@ -0,0 +1,183 @@ +import {describe, it, expect} from 'test/lib/common'; +import {Parser} from '../parser'; + +describe('when parsing', function() { + + it('simple metric expression', function() { + var parser = new Parser('metric.test.*.asd.count'); + var rootNode = parser.getAst(); + + expect(rootNode.type).to.be('metric'); + expect(rootNode.segments.length).to.be(5); + expect(rootNode.segments[0].value).to.be('metric'); + }); + + it('simple metric expression with numbers in segments', function() { + var parser = new Parser('metric.10.15_20.5'); + var rootNode = parser.getAst(); + + expect(rootNode.type).to.be('metric'); + expect(rootNode.segments.length).to.be(4); + expect(rootNode.segments[1].value).to.be('10'); + expect(rootNode.segments[2].value).to.be('15_20'); + expect(rootNode.segments[3].value).to.be('5'); + }); + + it('simple metric expression with curly braces', function() { + var parser = new Parser('metric.se1-{count, max}'); + var rootNode = parser.getAst(); + + expect(rootNode.type).to.be('metric'); + expect(rootNode.segments.length).to.be(2); + expect(rootNode.segments[1].value).to.be('se1-{count,max}'); + }); + + it('simple metric expression with curly braces at start of segment and with post chars', function() { + var parser = new Parser('metric.{count, max}-something.count'); + var rootNode = parser.getAst(); + + expect(rootNode.type).to.be('metric'); + expect(rootNode.segments.length).to.be(3); + expect(rootNode.segments[1].value).to.be('{count,max}-something'); + }); + + it('simple function', function() { + var parser = new Parser('sum(test)'); + var rootNode = parser.getAst(); + expect(rootNode.type).to.be('function'); + expect(rootNode.params.length).to.be(1); + }); + + it('simple function2', function() { + var parser = new Parser('offset(test.metric, -100)'); + var rootNode = parser.getAst(); + expect(rootNode.type).to.be('function'); + expect(rootNode.params[0].type).to.be('metric'); + expect(rootNode.params[1].type).to.be('number'); + }); + + it('simple function with string arg', function() { + var parser = new Parser("randomWalk('test')"); + var rootNode = parser.getAst(); + expect(rootNode.type).to.be('function'); + expect(rootNode.params.length).to.be(1); + expect(rootNode.params[0].type).to.be('string'); + }); + + it('function with multiple args', function() { + var parser = new Parser("sum(test, 1, 'test')"); + var rootNode = parser.getAst(); + + expect(rootNode.type).to.be('function'); + expect(rootNode.params.length).to.be(3); + expect(rootNode.params[0].type).to.be('metric'); + expect(rootNode.params[1].type).to.be('number'); + expect(rootNode.params[2].type).to.be('string'); + }); + + it('function with nested function', function() { + var parser = new Parser("sum(scaleToSeconds(test, 1))"); + var rootNode = parser.getAst(); + + expect(rootNode.type).to.be('function'); + expect(rootNode.params.length).to.be(1); + expect(rootNode.params[0].type).to.be('function'); + expect(rootNode.params[0].name).to.be('scaleToSeconds'); + expect(rootNode.params[0].params.length).to.be(2); + expect(rootNode.params[0].params[0].type).to.be('metric'); + expect(rootNode.params[0].params[1].type).to.be('number'); + }); + + it('function with multiple series', function() { + var parser = new Parser("sum(test.test.*.count, test.timers.*.count)"); + var rootNode = parser.getAst(); + + expect(rootNode.type).to.be('function'); + expect(rootNode.params.length).to.be(2); + expect(rootNode.params[0].type).to.be('metric'); + expect(rootNode.params[1].type).to.be('metric'); + }); + + it('function with templated series', function() { + var parser = new Parser("sum(test.[[server]].count)"); + var rootNode = parser.getAst(); + + expect(rootNode.message).to.be(undefined); + expect(rootNode.params[0].type).to.be('metric'); + expect(rootNode.params[0].segments[1].type).to.be('segment'); + expect(rootNode.params[0].segments[1].value).to.be('[[server]]'); + }); + + it('invalid metric expression', function() { + var parser = new Parser('metric.test.*.asd.'); + var rootNode = parser.getAst(); + + expect(rootNode.message).to.be('Expected metric identifier instead found end of string'); + expect(rootNode.pos).to.be(19); + }); + + it('invalid function expression missing closing parenthesis', function() { + var parser = new Parser('sum(test'); + var rootNode = parser.getAst(); + + expect(rootNode.message).to.be('Expected closing parenthesis instead found end of string'); + expect(rootNode.pos).to.be(9); + }); + + it('unclosed string in function', function() { + var parser = new Parser("sum('test)"); + var rootNode = parser.getAst(); + + expect(rootNode.message).to.be('Unclosed string parameter'); + expect(rootNode.pos).to.be(11); + }); + + it('handle issue #69', function() { + var parser = new Parser('cactiStyle(offset(scale(net.192-168-1-1.192-168-1-9.ping_value.*,0.001),-100))'); + var rootNode = parser.getAst(); + expect(rootNode.type).to.be('function'); + }); + + it('handle float function arguments', function() { + var parser = new Parser('scale(test, 0.002)'); + var rootNode = parser.getAst(); + expect(rootNode.type).to.be('function'); + expect(rootNode.params[1].type).to.be('number'); + expect(rootNode.params[1].value).to.be(0.002); + }); + + it('handle curly brace pattern at start', function() { + var parser = new Parser('{apps}.test'); + var rootNode = parser.getAst(); + expect(rootNode.type).to.be('metric'); + expect(rootNode.segments[0].value).to.be('{apps}'); + expect(rootNode.segments[1].value).to.be('test'); + }); + + it('series parameters', function() { + var parser = new Parser('asPercent(#A, #B)'); + var rootNode = parser.getAst(); + expect(rootNode.type).to.be('function'); + expect(rootNode.params[0].type).to.be('series-ref'); + expect(rootNode.params[0].value).to.be('#A'); + expect(rootNode.params[1].value).to.be('#B'); + }); + + it('series parameters, issue 2788', function() { + var parser = new Parser("summarize(diffSeries(#A, #B), '10m', 'sum', false)"); + var rootNode = parser.getAst(); + expect(rootNode.type).to.be('function'); + expect(rootNode.params[0].type).to.be('function'); + expect(rootNode.params[1].value).to.be('10m'); + expect(rootNode.params[3].type).to.be('bool'); + }); + + it('should parse metric expression with ip number segments', function() { + var parser = new Parser('5.10.123.5'); + var rootNode = parser.getAst(); + expect(rootNode.segments[0].value).to.be('5'); + expect(rootNode.segments[1].value).to.be('10'); + expect(rootNode.segments[2].value).to.be('123'); + expect(rootNode.segments[3].value).to.be('5'); + }); +}); diff --git a/specs/query_ctrl_specs.d.ts b/specs/query_ctrl_specs.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/specs/query_ctrl_specs.js b/specs/query_ctrl_specs.js new file mode 100644 index 0000000..d3206d1 --- /dev/null +++ b/specs/query_ctrl_specs.js @@ -0,0 +1,150 @@ +System.register(['../query_ctrl', 'app/core/services/segment_srv', 'test/lib/common', '../gfunc', 'test/specs/helpers'], function(exports_1) { + var common_1, gfunc_1, helpers_1, query_ctrl_1; + return { + setters:[ + function (query_ctrl_1_1) { + query_ctrl_1 = query_ctrl_1_1; + }, + function (_1) {}, + function (common_1_1) { + common_1 = common_1_1; + }, + function (gfunc_1_1) { + gfunc_1 = gfunc_1_1; + }, + function (helpers_1_1) { + helpers_1 = helpers_1_1; + }], + execute: function() { + common_1.describe('OpenfalconQueryCtrl', function () { + var ctx = new helpers_1.default.ControllerTestContext(); + common_1.beforeEach(common_1.angularMocks.module('grafana.core')); + common_1.beforeEach(common_1.angularMocks.module('grafana.controllers')); + common_1.beforeEach(common_1.angularMocks.module('grafana.services')); + common_1.beforeEach(ctx.providePhase()); + common_1.beforeEach(common_1.angularMocks.inject(function ($rootScope, $controller, $q) { + ctx.$q = $q; + ctx.scope = $rootScope.$new(); + ctx.target = { target: 'aliasByNode(scaleToSeconds(test.prod.*,1),2)' }; + ctx.datasource.metricFindQuery = common_1.sinon.stub().returns(ctx.$q.when([])); + ctx.panelCtrl = { panel: {} }; + ctx.panelCtrl.refresh = common_1.sinon.spy(); + ctx.ctrl = $controller(query_ctrl_1.OpenfalconQueryCtrl, { $scope: ctx.scope }, { + panelCtrl: ctx.panelCtrl, + datasource: ctx.datasource, + target: ctx.target + }); + ctx.scope.$digest(); + })); + common_1.describe('init', function () { + common_1.it('should validate metric key exists', function () { + common_1.expect(ctx.datasource.metricFindQuery.getCall(0).args[0]).to.be('test.prod.*'); + }); + common_1.it('should delete last segment if no metrics are found', function () { + common_1.expect(ctx.ctrl.segments[2].value).to.be('select metric'); + }); + common_1.it('should parse expression and build function model', function () { + common_1.expect(ctx.ctrl.functions.length).to.be(2); + }); + }); + common_1.describe('when adding function', function () { + common_1.beforeEach(function () { + ctx.ctrl.target.target = 'test.prod.*.count'; + ctx.ctrl.datasource.metricFindQuery = common_1.sinon.stub().returns(ctx.$q.when([{ expandable: false }])); + ctx.ctrl.parseTarget(); + ctx.ctrl.addFunction(gfunc_1.default.getFuncDef('aliasByNode')); + }); + common_1.it('should add function with correct node number', function () { + common_1.expect(ctx.ctrl.functions[0].params[0]).to.be(2); + }); + common_1.it('should update target', function () { + common_1.expect(ctx.ctrl.target.target).to.be('aliasByNode(test.prod.*.count, 2)'); + }); + common_1.it('should call refresh', function () { + common_1.expect(ctx.panelCtrl.refresh.called).to.be(true); + }); + }); + common_1.describe('when adding function before any metric segment', function () { + common_1.beforeEach(function () { + ctx.ctrl.target.target = ''; + ctx.ctrl.datasource.metricFindQuery.returns(ctx.$q.when([{ expandable: true }])); + ctx.ctrl.parseTarget(); + ctx.ctrl.addFunction(gfunc_1.default.getFuncDef('asPercent')); + }); + common_1.it('should add function and remove select metric link', function () { + common_1.expect(ctx.ctrl.segments.length).to.be(0); + }); + }); + common_1.describe('when initalizing target without metric expression and only function', function () { + common_1.beforeEach(function () { + ctx.ctrl.target.target = 'asPercent(#A, #B)'; + ctx.ctrl.datasource.metricFindQuery.returns(ctx.$q.when([])); + ctx.ctrl.parseTarget(); + ctx.scope.$digest(); + }); + common_1.it('should not add select metric segment', function () { + common_1.expect(ctx.ctrl.segments.length).to.be(0); + }); + common_1.it('should add both series refs as params', function () { + common_1.expect(ctx.ctrl.functions[0].params.length).to.be(2); + }); + }); + common_1.describe('when initializing a target with single param func using variable', function () { + common_1.beforeEach(function () { + ctx.ctrl.target.target = 'movingAverage(prod.count, $var)'; + ctx.ctrl.datasource.metricFindQuery.returns(ctx.$q.when([])); + ctx.ctrl.parseTarget(); + }); + common_1.it('should add 2 segments', function () { + common_1.expect(ctx.ctrl.segments.length).to.be(2); + }); + common_1.it('should add function param', function () { + common_1.expect(ctx.ctrl.functions[0].params.length).to.be(1); + }); + }); + common_1.describe('when initalizing target without metric expression and function with series-ref', function () { + common_1.beforeEach(function () { + ctx.ctrl.target.target = 'asPercent(metric.node.count, #A)'; + ctx.ctrl.datasource.metricFindQuery.returns(ctx.$q.when([])); + ctx.ctrl.parseTarget(); + }); + common_1.it('should add segments', function () { + common_1.expect(ctx.ctrl.segments.length).to.be(3); + }); + common_1.it('should have correct func params', function () { + common_1.expect(ctx.ctrl.functions[0].params.length).to.be(1); + }); + }); + common_1.describe('when getting altSegments and metricFindQuery retuns empty array', function () { + common_1.beforeEach(function () { + ctx.ctrl.target.target = 'test.count'; + ctx.ctrl.datasource.metricFindQuery.returns(ctx.$q.when([])); + ctx.ctrl.parseTarget(); + ctx.ctrl.getAltSegments(1).then(function (results) { + ctx.altSegments = results; + }); + ctx.scope.$digest(); + }); + common_1.it('should have no segments', function () { + common_1.expect(ctx.altSegments.length).to.be(0); + }); + }); + common_1.describe('targetChanged', function () { + common_1.beforeEach(function () { + ctx.ctrl.datasource.metricFindQuery = common_1.sinon.stub().returns(ctx.$q.when([{ expandable: false }])); + ctx.ctrl.parseTarget(); + ctx.ctrl.target.target = ''; + ctx.ctrl.targetChanged(); + }); + common_1.it('should rebuld target after expression model', function () { + common_1.expect(ctx.ctrl.target.target).to.be('aliasByNode(scaleToSeconds(test.prod.*, 1), 2)'); + }); + common_1.it('should call panelCtrl.refresh', function () { + common_1.expect(ctx.panelCtrl.refresh.called).to.be(true); + }); + }); + }); + } + } +}); +//# sourceMappingURL=query_ctrl_specs.js.map \ No newline at end of file diff --git a/specs/query_ctrl_specs.js.map b/specs/query_ctrl_specs.js.map new file mode 100644 index 0000000..2784c69 --- /dev/null +++ b/specs/query_ctrl_specs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"query_ctrl_specs.js","sourceRoot":"","sources":["../../../../../../public/app/plugins/datasource/openfalcon/specs/query_ctrl_specs.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/specs/query_ctrl_specs.ts b/specs/query_ctrl_specs.ts new file mode 100644 index 0000000..ef8b635 --- /dev/null +++ b/specs/query_ctrl_specs.ts @@ -0,0 +1,163 @@ + +import '../query_ctrl'; +import 'app/core/services/segment_srv'; +import {describe, beforeEach, it, sinon, expect, angularMocks} from 'test/lib/common'; + +import gfunc from '../gfunc'; +import helpers from 'test/specs/helpers'; +import {OpenfalconQueryCtrl} from '../query_ctrl'; + +describe('OpenfalconQueryCtrl', function() { + var ctx = new helpers.ControllerTestContext(); + + beforeEach(angularMocks.module('grafana.core')); + beforeEach(angularMocks.module('grafana.controllers')); + beforeEach(angularMocks.module('grafana.services')); + + beforeEach(ctx.providePhase()); + beforeEach(angularMocks.inject(($rootScope, $controller, $q) => { + ctx.$q = $q; + ctx.scope = $rootScope.$new(); + ctx.target = {target: 'aliasByNode(scaleToSeconds(test.prod.*,1),2)'}; + ctx.datasource.metricFindQuery = sinon.stub().returns(ctx.$q.when([])); + ctx.panelCtrl = {panel: {}}; + ctx.panelCtrl.refresh = sinon.spy(); + + ctx.ctrl = $controller(OpenfalconQueryCtrl, {$scope: ctx.scope}, { + panelCtrl: ctx.panelCtrl, + datasource: ctx.datasource, + target: ctx.target + }); + ctx.scope.$digest(); + })); + + describe('init', function() { + it('should validate metric key exists', function() { + expect(ctx.datasource.metricFindQuery.getCall(0).args[0]).to.be('test.prod.*'); + }); + + it('should delete last segment if no metrics are found', function() { + expect(ctx.ctrl.segments[2].value).to.be('select metric'); + }); + + it('should parse expression and build function model', function() { + expect(ctx.ctrl.functions.length).to.be(2); + }); + }); + + describe('when adding function', function() { + beforeEach(function() { + ctx.ctrl.target.target = 'test.prod.*.count'; + ctx.ctrl.datasource.metricFindQuery = sinon.stub().returns(ctx.$q.when([{expandable: false}])); + ctx.ctrl.parseTarget(); + ctx.ctrl.addFunction(gfunc.getFuncDef('aliasByNode')); + }); + + it('should add function with correct node number', function() { + expect(ctx.ctrl.functions[0].params[0]).to.be(2); + }); + + it('should update target', function() { + expect(ctx.ctrl.target.target).to.be('aliasByNode(test.prod.*.count, 2)'); + }); + + it('should call refresh', function() { + expect(ctx.panelCtrl.refresh.called).to.be(true); + }); + }); + + describe('when adding function before any metric segment', function() { + beforeEach(function() { + ctx.ctrl.target.target = ''; + ctx.ctrl.datasource.metricFindQuery.returns(ctx.$q.when([{expandable: true}])); + ctx.ctrl.parseTarget(); + ctx.ctrl.addFunction(gfunc.getFuncDef('asPercent')); + }); + + it('should add function and remove select metric link', function() { + expect(ctx.ctrl.segments.length).to.be(0); + }); + }); + + describe('when initalizing target without metric expression and only function', function() { + beforeEach(function() { + ctx.ctrl.target.target = 'asPercent(#A, #B)'; + ctx.ctrl.datasource.metricFindQuery.returns(ctx.$q.when([])); + ctx.ctrl.parseTarget(); + ctx.scope.$digest(); + }); + + it('should not add select metric segment', function() { + expect(ctx.ctrl.segments.length).to.be(0); + }); + + it('should add both series refs as params', function() { + expect(ctx.ctrl.functions[0].params.length).to.be(2); + }); + }); + + describe('when initializing a target with single param func using variable', function() { + beforeEach(function() { + ctx.ctrl.target.target = 'movingAverage(prod.count, $var)'; + ctx.ctrl.datasource.metricFindQuery.returns(ctx.$q.when([])); + ctx.ctrl.parseTarget(); + }); + + it('should add 2 segments', function() { + expect(ctx.ctrl.segments.length).to.be(2); + }); + + it('should add function param', function() { + expect(ctx.ctrl.functions[0].params.length).to.be(1); + }); + }); + + describe('when initalizing target without metric expression and function with series-ref', function() { + beforeEach(function() { + ctx.ctrl.target.target = 'asPercent(metric.node.count, #A)'; + ctx.ctrl.datasource.metricFindQuery.returns(ctx.$q.when([])); + ctx.ctrl.parseTarget(); + }); + + it('should add segments', function() { + expect(ctx.ctrl.segments.length).to.be(3); + }); + + it('should have correct func params', function() { + expect(ctx.ctrl.functions[0].params.length).to.be(1); + }); + }); + + describe('when getting altSegments and metricFindQuery retuns empty array', function() { + beforeEach(function() { + ctx.ctrl.target.target = 'test.count'; + ctx.ctrl.datasource.metricFindQuery.returns(ctx.$q.when([])); + ctx.ctrl.parseTarget(); + ctx.ctrl.getAltSegments(1).then(function(results) { + ctx.altSegments = results; + }); + ctx.scope.$digest(); + }); + + it('should have no segments', function() { + expect(ctx.altSegments.length).to.be(0); + }); + }); + + describe('targetChanged', function() { + beforeEach(function() { + ctx.ctrl.datasource.metricFindQuery = sinon.stub().returns(ctx.$q.when([{expandable: false}])); + ctx.ctrl.parseTarget(); + ctx.ctrl.target.target = ''; + ctx.ctrl.targetChanged(); + }); + + it('should rebuld target after expression model', function() { + expect(ctx.ctrl.target.target).to.be('aliasByNode(scaleToSeconds(test.prod.*, 1), 2)'); + }); + + it('should call panelCtrl.refresh', function() { + expect(ctx.panelCtrl.refresh.called).to.be(true); + }); + }); +});