diff --git a/dist/README.md b/dist/README.md index 4c2896f..f23952b 100644 --- a/dist/README.md +++ b/dist/README.md @@ -104,6 +104,17 @@ Example, JSON posted on [the Hawkular's REST API](http://www.hawkular.org/hawkul In the case of Hawkular Alerts events, you need to provide the trigger ID (several comma-separated IDs are allowed). +### Legend + +Metric names can be customized in chart legend. The `Legend` field can receive regular expressions in that purpose. Regex must be written between double curly braces, and include a parentheses group to point to what must be written: `{{(.*)}}` + +_Example:_ +> From metric name `pod/c6e2a9ab-8d1c-11e7-b7be-06415eb17bbf/custom/haproxy_server_bytes_in_total{namespace=my-namespace,pod=web-45-6f464,route=web,server=10.1.10.138:8080,service=web}` +> +> Legend: `HAProxy Server Bytes In {{namespace=([^,}]+)}} / {{pod=([^,}]+)}}` +> +> Result: `HAProxy Server Bytes In my-namespace / web-45-6f464` + ## Installing from sources Additional information on installing from sources can be found on [hawkular.org](http://www.hawkular.org/hawkular-clients/grafana/docs/quickstart-guide/). diff --git a/dist/partials/query.editor.html b/dist/partials/query.editor.html index 7992f4a..b28916e 100644 --- a/dist/partials/query.editor.html +++ b/dist/partials/query.editor.html @@ -78,4 +78,13 @@ + +
+
+
+ + +
+
+
diff --git a/dist/plugin.json b/dist/plugin.json index a04faf1..d5becf4 100644 --- a/dist/plugin.json +++ b/dist/plugin.json @@ -24,8 +24,8 @@ "url": "https://github.com/hawkular/hawkular-grafana-datasource" } ], - "version": "1.1.1", - "updated": "2017-11-14" + "version": "1.1.2", + "updated": "2018-02-09" }, "dependencies": { "grafanaVersion": "3.x.x", diff --git a/dist/queryProcessor.js b/dist/queryProcessor.js index 23b1855..48e501e 100644 --- a/dist/queryProcessor.js +++ b/dist/queryProcessor.js @@ -54,6 +54,7 @@ System.register(['lodash', './tagsKVPairsController'], function (_export, _conte this.availMapping = function (point) { return [point.value == 'up' ? 1 : 0, point.timestamp]; }; + this.legendRegexp = /{{(.+?)(?=}})}}/g; } _createClass(QueryProcessor, [{ @@ -159,11 +160,28 @@ System.register(['lodash', './tagsKVPairsController'], function (_export, _conte return allSeries.map(function (timeSerie) { return { refId: target.refId, - target: timeSerie.prefix + timeSerie.id, + target: _this4.legend(target, timeSerie.prefix + timeSerie.id), datapoints: timeSerie.data.map(target.type == 'availability' ? _this4.availMapping : _this4.numericMapping) }; }); } + }, { + key: 'legend', + value: function legend(target, name) { + if (target.legend) { + var legend = target.legend.replace(this.legendRegexp, function (str, group) { + try { + var match = new RegExp(group).exec(name); + if (match && match.length > 1) { + return match[1]; + } + } catch (e) {} + return str; + }); + return legend; + } + return name; + } }, { key: 'processRawResponseLegacy', value: function processRawResponseLegacy(target, metric, data) { @@ -224,9 +242,9 @@ System.register(['lodash', './tagsKVPairsController'], function (_export, _conte // Detailed `data[i].result`: [{start:1234, end:5678, avg:100.0, min:90.0, max:110.0, (...), percentiles:[{quantile: 90, value: 105.0}]}] var flatten = []; var prefixer = multiTenantsData.length > 1 ? function (tenant) { - return '[' + tenant + '] '; + return '[' + target.refId + ': ' + tenant + '] '; } : function (tenant) { - return ''; + return '[' + target.refId + '] '; }; multiTenantsData.forEach(function (tenantData) { if (tenantData.result) { @@ -235,7 +253,7 @@ System.register(['lodash', './tagsKVPairsController'], function (_export, _conte if (percentile) { flatten.push({ refId: target.refId, - target: prefixer(tenantData.tenant) + stat, + target: _this6.legend(target, prefixer(tenantData.tenant) + stat), datapoints: tenantData.result.filter(function (bucket) { return !bucket.empty; }).map(function (bucket) { @@ -245,7 +263,7 @@ System.register(['lodash', './tagsKVPairsController'], function (_export, _conte } else { flatten.push({ refId: target.refId, - target: prefixer(tenantData.tenant) + stat, + target: _this6.legend(target, prefixer(tenantData.tenant) + stat), datapoints: tenantData.result.filter(function (bucket) { return !bucket.empty; }).map(function (bucket) { @@ -310,7 +328,7 @@ System.register(['lodash', './tagsKVPairsController'], function (_export, _conte if (percentile) { series.push({ refId: target.refId, - target: '' + prefix + metricId + ' [' + stat + ']', + target: _this8.legend(target, '' + prefix + metricId + ' [' + stat + ']'), datapoints: buckets.filter(function (bucket) { return !bucket.empty; }).map(function (bucket) { @@ -320,7 +338,7 @@ System.register(['lodash', './tagsKVPairsController'], function (_export, _conte } else { series.push({ refId: target.refId, - target: '' + prefix + metricId + ' [' + stat + ']', + target: _this8.legend(target, '' + prefix + metricId + ' [' + stat + ']'), datapoints: buckets.filter(function (bucket) { return !bucket.empty; }).map(function (bucket) { diff --git a/dist/queryProcessor.js.map b/dist/queryProcessor.js.map index 7b1989f..341c898 100644 --- a/dist/queryProcessor.js.map +++ b/dist/queryProcessor.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/queryProcessor.js"],"names":["_","tagsModelToString","modelToString","STATS_BUCKETS","QueryProcessor","q","multiTenantsQuery","variablesHelper","capabilities","url","typeResources","numericMapping","point","value","timestamp","availMapping","target","options","then","postData","start","range","from","valueOf","end","to","order","tenants","tenant","resolve","id","metricIds","caps","QUERY_POST_ENDPOINTS","raw","ids","rawQuery","timeAggFn","singleStatLiveQuery","limit","metrics","singleStatQuery","statsQuery","rawQueryLegacy","TAGS_QUERY_LANGUAGE","tagsQL","undefined","length","tags","resolveForQL","when","type","rate","tenantsPrefixer","res","processRawResponse","allSeries","all","map","encodeURIComponent","metric","replace","params","processRawResponseLegacy","refId","timeSerie","prefix","datapoints","data","sortedData","sort","p1","p2","chain","zip","slice","filter","pair","point1","point2","value_diff","time_diff","seriesAggFn","statsQueryUnmerged","buckets","stacked","percentiles","getPercentilesToQuery","stats","join","processStatsResponse","multiTenantsData","flatten","prefixer","forEach","tenantData","result","percentile","getPercentileValue","stat","push","bucket","empty","findQuantileInBucket","types","metricsPerType","processUnmergedStatsResponse","series","allMetrics","metricId","hasOwnProperty","perc","percentileName","idx","indexOf","substring","quantile","percObj","find","p","toString","fnBucket","avg","min","max","processSingleStatResponse","Date","now","processSingleStatLiveResponse","reduceFunc","presentValues","reduce","a","b","latestPoints","timeSeries","dp","allTenantTimeSeries","oneTenantTimeSeries"],"mappings":";;;;;;;;;;;;;;;AAAOA,O;;AACkBC,uB,0BAAjBC,a;;;;;;;;;;;;;;;;;;;;;AAEFC,mB,GAAgB,E;;gCAETC,c;AAEX,gCAAYC,CAAZ,EAAeC,iBAAf,EAAkCC,eAAlC,EAAmDC,YAAnD,EAAiEC,GAAjE,EAAsEC,aAAtE,EAAqF;AAAA;;AACnF,eAAKL,CAAL,GAASA,CAAT;AACA,eAAKC,iBAAL,GAAyBA,iBAAzB;AACA,eAAKC,eAAL,GAAuBA,eAAvB;AACA,eAAKC,YAAL,GAAoBA,YAApB;AACA,eAAKC,GAAL,GAAWA,GAAX;AACA,eAAKC,aAAL,GAAqBA,aAArB;AACA,eAAKC,cAAL,GAAsB;AAAA,mBAAS,CAACC,MAAMC,KAAP,EAAcD,MAAME,SAApB,CAAT;AAAA,WAAtB;AACA,eAAKC,YAAL,GAAoB;AAAA,mBAAS,CAACH,MAAMC,KAAN,IAAe,IAAf,GAAsB,CAAtB,GAA0B,CAA3B,EAA8BD,MAAME,SAApC,CAAT;AAAA,WAApB;AACD;;;;8BAEGE,M,EAAQC,O,EAAS;AAAA;;AACnB,mBAAO,KAAKT,YAAL,CAAkBU,IAAlB,CAAuB,gBAAQ;AACpC,kBAAIC,WAAW;AACbC,uBAAOH,QAAQI,KAAR,CAAcC,IAAd,CAAmBC,OAAnB,EADM;AAEbC,qBAAKP,QAAQI,KAAR,CAAcI,EAAd,CAAiBF,OAAjB,EAFQ;AAGbG,uBAAO;AAHM,eAAf;AAKA,kBAAIC,UAAU,CAAC,IAAD,CAAd;AACA,kBAAIX,OAAOY,MAAX,EAAmB;AACjBD,0BAAU,MAAKpB,eAAL,CAAqBsB,OAArB,CAA6Bb,OAAOY,MAApC,EAA4CX,OAA5C,CAAV;AACD;AACD,kBAAID,OAAOc,EAAX,EAAe;AACb,oBAAMC,YAAY,MAAKxB,eAAL,CAAqBsB,OAArB,CAA6Bb,OAAOc,EAApC,EAAwCb,OAAxC,CAAlB;AACA,oBAAIe,KAAKC,oBAAT,EAA+B;AAC7B,sBAAIjB,OAAOkB,GAAX,EAAgB;AACdf,6BAASgB,GAAT,GAAeJ,SAAf;AACA,2BAAO,MAAKK,QAAL,CAAcpB,MAAd,EAAsBG,QAAtB,EAAgCQ,OAAhC,CAAP;AACD,mBAHD,MAGO,IAAIX,OAAOqB,SAAP,IAAoB,MAAxB,EAAgC;AACrC;AACA,2BAAO,MAAKC,mBAAL,CAAyBtB,MAAzB,EAAiC,EAACmB,KAAKJ,SAAN,EAAiBQ,OAAO,CAAxB,EAAjC,EAA6DZ,OAA7D,CAAP;AACD,mBAHM,MAGA,IAAIX,OAAOqB,SAAX,EAAsB;AAC3B;AACAlB,6BAASqB,OAAT,GAAmBT,SAAnB;AACA,2BAAO,MAAKU,eAAL,CAAqBzB,MAArB,EAA6BG,QAA7B,EAAuCQ,OAAvC,CAAP;AACD,mBAJM,MAIA;AACL;AACAR,6BAASqB,OAAT,GAAmBT,SAAnB;AACA,2BAAO,MAAKW,UAAL,CAAgB1B,MAAhB,EAAwBG,QAAxB,EAAkCQ,OAAlC,CAAP;AACD;AACF,iBAhBD,MAgBO;AACL,yBAAO,MAAKgB,cAAL,CAAoB3B,MAApB,EAA4BC,QAAQI,KAApC,EAA2CU,SAA3C,EAAsDJ,OAAtD,CAAP;AACD;AACF,eArBD,MAqBO;AACL,oBAAIK,KAAKY,mBAAT,EAA8B;AAC5B,sBAAI5B,OAAO6B,MAAP,KAAkBC,SAAlB,IAA+B9B,OAAO6B,MAAP,CAAcE,MAAd,GAAuB,CAA1D,EAA6D;AAC3D5B,6BAAS6B,IAAT,GAAgB,MAAKzC,eAAL,CAAqB0C,YAArB,CAAkCjC,OAAO6B,MAAzC,EAAiD5B,OAAjD,CAAhB;AACD,mBAFD,MAEO;AACL,2BAAO,MAAKZ,CAAL,CAAO6C,IAAP,CAAY,EAAZ,CAAP;AACD;AACF,iBAND,MAMO;AACL,sBAAIlC,OAAOgC,IAAP,KAAgBF,SAAhB,IAA6B9B,OAAOgC,IAAP,CAAYD,MAAZ,GAAqB,CAAtD,EAAyD;AACvD5B,6BAAS6B,IAAT,GAAgB/C,kBAAkBe,OAAOgC,IAAzB,EAA+B,MAAKzC,eAApC,EAAqDU,OAArD,CAAhB;AACD,mBAFD,MAEO;AACL,2BAAO,MAAKZ,CAAL,CAAO6C,IAAP,CAAY,EAAZ,CAAP;AACD;AACF;AACD,oBAAIlC,OAAOkB,GAAX,EAAgB;AACd,yBAAO,MAAKE,QAAL,CAAcpB,MAAd,EAAsBG,QAAtB,EAAgCQ,OAAhC,CAAP;AACD,iBAFD,MAEO,IAAIX,OAAOqB,SAAP,IAAoB,MAAxB,EAAgC;AACrC;AACA,yBAAO,MAAKC,mBAAL,CAAyBtB,MAAzB,EAAiC,EAACgC,MAAM7B,SAAS6B,IAAhB,EAAsBT,OAAO,CAA7B,EAAjC,EAAkEZ,OAAlE,CAAP;AACD,iBAHM,MAGA,IAAIX,OAAOqB,SAAX,EAAsB;AAC3B;AACA,yBAAO,MAAKI,eAAL,CAAqBzB,MAArB,EAA6BG,QAA7B,EAAuCQ,OAAvC,CAAP;AACD,iBAHM,MAGA;AACL;AACA,yBAAO,MAAKe,UAAL,CAAgB1B,MAAhB,EAAwBG,QAAxB,EAAkCQ,OAAlC,CAAP;AACD;AACF;AACF,aA1DM,CAAP;AA2DD;;;mCAEQX,M,EAAQG,Q,EAAUQ,O,EAAS;AAAA;;AAClC,gBAAMlB,MAAS,KAAKA,GAAd,SAAqB,KAAKC,aAAL,CAAmBM,OAAOmC,IAA1B,CAArB,UAAwDnC,OAAOoC,IAAP,GAAc,MAAd,GAAuB,KAA/E,YAAN;AACA,mBAAO,KAAK9C,iBAAL,CAAuBqB,OAAvB,EAAgClB,GAAhC,EAAqC,IAArC,EAA2CU,QAA3C,EAAqD,MAArD,EACJD,IADI,CACC;AAAA,qBAAO,OAAKmC,eAAL,CAAqBC,GAArB,CAAP;AAAA,aADD,EAEJpC,IAFI,CAEC;AAAA,qBAAa,OAAKqC,kBAAL,CAAwBvC,MAAxB,EAAgCwC,SAAhC,CAAb;AAAA,aAFD,CAAP;AAGD;;;yCAEcxC,M,EAAQK,K,EAAOU,S,EAAWJ,O,EAAS;AAAA;;AAChD,mBAAO,KAAKtB,CAAL,CAAOoD,GAAP,CAAW1B,UAAU2B,GAAV,CAAc,kBAAU;AACxC,kBAAMjD,MAAS,OAAKA,GAAd,SAAqB,OAAKC,aAAL,CAAmBM,OAAOmC,IAA1B,CAArB,SAAwDQ,mBAAmBC,MAAnB,EAA2BC,OAA3B,CAAmC,GAAnC,EAAwC,KAAxC,CAAxD,UAAN;AACA,kBAAMC,SAAS;AACb1C,uBAAOC,MAAMC,IAAN,CAAWC,OAAX,EADM;AAEbC,qBAAKH,MAAMI,EAAN,CAASF,OAAT;AAFQ,eAAf;AAIA,qBAAO,OAAKjB,iBAAL,CAAuBqB,OAAvB,EAAgClB,GAAhC,EAAqCqD,MAArC,EAA6C,IAA7C,EAAmD,KAAnD,EACJ5C,IADI,CACC;AAAA,uBAAO,OAAKmC,eAAL,CAAqBC,GAArB,CAAP;AAAA,eADD,EAEJpC,IAFI,CAEC;AAAA,uBAAa,OAAK6C,wBAAL,CAA8B/C,MAA9B,EAAsC4C,MAAtC,EAA8CJ,SAA9C,CAAb;AAAA,eAFD,CAAP;AAGD,aATiB,CAAX,CAAP;AAUD;;;6CAEkBxC,M,EAAQwC,S,EAAW;AAAA;;AACpC,mBAAOA,UAAUE,GAAV,CAAc,qBAAa;AAChC,qBAAO;AACLM,uBAAOhD,OAAOgD,KADT;AAELhD,wBAAQiD,UAAUC,MAAV,GAAmBD,UAAUnC,EAFhC;AAGLqC,4BAAYF,UAAUG,IAAV,CAAeV,GAAf,CAAmB1C,OAAOmC,IAAP,IAAe,cAAf,GAAgC,OAAKpC,YAArC,GAAoD,OAAKJ,cAA5E;AAHP,eAAP;AAKD,aANM,CAAP;AAOD;;;mDAEwBK,M,EAAQ4C,M,EAAQQ,I,EAAM;AAC7C,gBAAID,mBAAJ;AACA,gBAAInD,OAAOmC,IAAP,IAAe,cAAnB,EAAmC;AACjCgB,2BAAaC,KAAKV,GAAL,CAAS,KAAK3C,YAAd,CAAb;AACD,aAFD,MAEO,IAAI,CAACC,OAAOoC,IAAZ,EAAkB;AACvBe,2BAAaC,KAAKV,GAAL,CAAS,KAAK/C,cAAd,CAAb;AACD,aAFM,MAEA;AACL,kBAAI0D,aAAaD,KAAKE,IAAL,CAAU,UAACC,EAAD,EAAKC,EAAL;AAAA,uBAAWD,GAAGzD,SAAH,GAAe0D,GAAG1D,SAA7B;AAAA,eAAV,CAAjB;AACAqD,2BAAanE,EAAEyE,KAAF,CAAQJ,UAAR,EACVK,GADU,CACNL,WAAWM,KAAX,CAAiB,CAAjB,CADM,EAEVC,MAFU,CAEH,gBAAQ;AACd,uBAAOC,KAAK,CAAL,EAAQ;AAAR,oBACD7D,OAAOmC,IAAP,IAAe,SAAf,IAA4B0B,KAAK,CAAL,EAAQhE,KAAR,IAAiBgE,KAAK,CAAL,EAAQhE,KADpD,CAAP,CADc,CAEqD;AACpE,eALU,EAMV6C,GANU,CAMN,gBAAQ;AACX,oBAAIoB,SAASD,KAAK,CAAL,CAAb;AAAA,oBAAsBE,SAASF,KAAK,CAAL,CAA/B;AACA,oBAAI/D,YAAYiE,OAAOjE,SAAvB;AACA,oBAAIkE,aAAaD,OAAOlE,KAAP,GAAeiE,OAAOjE,KAAvC;AACA,oBAAIoE,YAAYF,OAAOjE,SAAP,GAAmBgE,OAAOhE,SAA1C;AACA,oBAAIsC,OAAO,QAAQ4B,UAAR,GAAqBC,SAAhC;AACA,uBAAO,CAAC7B,IAAD,EAAOtC,SAAP,CAAP;AACD,eAbU,EAcVD,KAdU,EAAb;AAeD;AACD,mBAAO;AACLmD,qBAAOhD,OAAOgD,KADT;AAELhD,sBAAQ4C,MAFH;AAGLO,0BAAYA;AAHP,aAAP;AAKD;;;qCAEUnD,M,EAAQG,Q,EAAUQ,O,EAAS;AAAA;;AACpC,gBAAIX,OAAOkE,WAAP,KAAuB,MAA3B,EAAmC;AACjC,qBAAO,KAAKC,kBAAL,CAAwBnE,MAAxB,EAAgCG,QAAhC,EAA0CQ,OAA1C,CAAP;AACD;AACD,gBAAMlB,MAAS,KAAKA,GAAd,SAAqB,KAAKC,aAAL,CAAmBM,OAAOmC,IAA1B,CAArB,iBAAN;AACA,mBAAOhC,SAASO,KAAhB;AACAP,qBAASiE,OAAT,GAAmBjF,aAAnB;AACAgB,qBAASkE,OAAT,GAAmBrE,OAAOkE,WAAP,KAAuB,KAA1C;AACA,gBAAMI,cAAc,KAAKC,qBAAL,CAA2BvE,OAAOwE,KAAlC,CAApB;AACA,gBAAIF,YAAYvC,MAAZ,GAAqB,CAAzB,EAA4B;AAC1B5B,uBAASmE,WAAT,GAAuBA,YAAYG,IAAZ,CAAiB,GAAjB,CAAvB;AACD;AACD,mBAAO,KAAKnF,iBAAL,CAAuBqB,OAAvB,EAAgClB,GAAhC,EAAqC,IAArC,EAA2CU,QAA3C,EAAqD,MAArD,EACJD,IADI,CACC;AAAA,qBAAoB,OAAKwE,oBAAL,CAA0B1E,MAA1B,EAAkC2E,gBAAlC,CAApB;AAAA,aADD,CAAP;AAED;;;+CAEoB3E,M,EAAQ2E,gB,EAAkB;AAAA;;AAC7C;AACA;AACA,gBAAMC,UAAU,EAAhB;AACA,gBAAMC,WAAWF,iBAAiB5C,MAAjB,GAA0B,CAA1B,GAA8B,UAACnB,MAAD;AAAA,2BAAgBA,MAAhB;AAAA,aAA9B,GAA2D,UAACA,MAAD;AAAA,qBAAY,EAAZ;AAAA,aAA5E;AACA+D,6BAAiBG,OAAjB,CAAyB,sBAAc;AACrC,kBAAIC,WAAWC,MAAf,EAAuB;AACrBhF,uBAAOwE,KAAP,CAAaM,OAAb,CAAqB,gBAAQ;AAC3B,sBAAMG,aAAa,OAAKC,kBAAL,CAAwBC,IAAxB,CAAnB;AACA,sBAAIF,UAAJ,EAAgB;AACdL,4BAAQQ,IAAR,CAAa;AACXpC,6BAAOhD,OAAOgD,KADH;AAEXhD,8BAAQ6E,SAASE,WAAWnE,MAApB,IAA8BuE,IAF3B;AAGXhC,kCAAY4B,WAAWC,MAAX,CAAkBpB,MAAlB,CAAyB;AAAA,+BAAU,CAACyB,OAAOC,KAAlB;AAAA,uBAAzB,EACT5C,GADS,CACL;AAAA,+BAAU,CAAC,OAAK6C,oBAAL,CAA0BN,UAA1B,EAAsCI,MAAtC,CAAD,EAAgDA,OAAOjF,KAAvD,CAAV;AAAA,uBADK;AAHD,qBAAb;AAMD,mBAPD,MAOO;AACLwE,4BAAQQ,IAAR,CAAa;AACXpC,6BAAOhD,OAAOgD,KADH;AAEXhD,8BAAQ6E,SAASE,WAAWnE,MAApB,IAA8BuE,IAF3B;AAGXhC,kCAAY4B,WAAWC,MAAX,CAAkBpB,MAAlB,CAAyB;AAAA,+BAAU,CAACyB,OAAOC,KAAlB;AAAA,uBAAzB,EAAkD5C,GAAlD,CAAsD;AAAA,+BAAU,CAAC2C,OAAOF,IAAP,CAAD,EAAeE,OAAOjF,KAAtB,CAAV;AAAA,uBAAtD;AAHD,qBAAb;AAKD;AACF,iBAhBD;AAiBD;AACF,aApBD;AAqBA,mBAAOwE,OAAP;AACD;;;6CAEkB5E,M,EAAQG,Q,EAAUQ,O,EAAS;AAAA;;AAC5C,gBAAMlB,MAAS,KAAKA,GAAd,yBAAN;AACA,mBAAOU,SAASO,KAAhB;AACAP,qBAASiE,OAAT,GAAmBjF,aAAnB;AACAgB,qBAASqF,KAAT,GAAiB,CAACxF,OAAOmC,IAAR,CAAjB;AACA,gBAAIhC,SAASqB,OAAb,EAAsB;AACpB,kBAAMiE,iBAAiB,EAAvB;AACAA,6BAAezF,OAAOmC,IAAtB,IAA8BhC,SAASqB,OAAvC;AACArB,uBAASqB,OAAT,GAAmBiE,cAAnB;AACD;AACD,gBAAMnB,cAAc,KAAKC,qBAAL,CAA2BvE,OAAOwE,KAAlC,CAApB;AACA,gBAAIF,YAAYvC,MAAZ,GAAqB,CAAzB,EAA4B;AAC1B5B,uBAASmE,WAAT,GAAuBA,YAAYG,IAAZ,CAAiB,GAAjB,CAAvB;AACD;AACD,mBAAO,KAAKnF,iBAAL,CAAuBqB,OAAvB,EAAgClB,GAAhC,EAAqC,IAArC,EAA2CU,QAA3C,EAAqD,MAArD,EACJD,IADI,CACC;AAAA,qBAAoB,OAAKwF,4BAAL,CAAkC1F,MAAlC,EAA0C2E,gBAA1C,CAApB;AAAA,aADD,CAAP;AAED;;;uDAE4B3E,M,EAAQ2E,gB,EAAkB;AAAA;;AACrD;AACA;AACA;AACA;AACA;AACA,gBAAMgB,SAAS,EAAf;AACA,gBAAMd,WAAWF,iBAAiB5C,MAAjB,GAA0B,CAA1B,GAA8B,UAACnB,MAAD;AAAA,2BAAgBA,MAAhB;AAAA,aAA9B,GAA2D,UAACA,MAAD;AAAA,qBAAY,EAAZ;AAAA,aAA5E;AACA+D,6BAAiBG,OAAjB,CAAyB,sBAAc;AACrC,kBAAIC,WAAWC,MAAf,EAAuB;AAAA;AACrB,sBAAMY,aAAab,WAAWC,MAAX,CAAkBhF,OAAOmC,IAAzB,CAAnB;AACA,sBAAMe,SAAS2B,SAASE,WAAWnE,MAApB,CAAf;;AAFqB,6CAGZiF,QAHY;AAInB,wBAAID,WAAWE,cAAX,CAA0BD,QAA1B,CAAJ,EAAyC;AACvC,0BAAMzB,UAAUwB,WAAWC,QAAX,CAAhB;AACA7F,6BAAOwE,KAAP,CAAaM,OAAb,CAAqB,gBAAQ;AAC3B,4BAAMG,aAAa,OAAKC,kBAAL,CAAwBC,IAAxB,CAAnB;AACA,4BAAIF,UAAJ,EAAgB;AACdU,iCAAOP,IAAP,CAAY;AACVpC,mCAAOhD,OAAOgD,KADJ;AAEVhD,yCAAWkD,MAAX,GAAoB2C,QAApB,UAAiCV,IAAjC,MAFU;AAGVhC,wCAAYiB,QAAQR,MAAR,CAAe;AAAA,qCAAU,CAACyB,OAAOC,KAAlB;AAAA,6BAAf,EACT5C,GADS,CACL;AAAA,qCAAU,CAAC,OAAK6C,oBAAL,CAA0BN,UAA1B,EAAsCI,MAAtC,CAAD,EAAgDA,OAAOjF,KAAvD,CAAV;AAAA,6BADK;AAHF,2BAAZ;AAMD,yBAPD,MAOO;AACLuF,iCAAOP,IAAP,CAAY;AACVpC,mCAAOhD,OAAOgD,KADJ;AAEVhD,yCAAWkD,MAAX,GAAoB2C,QAApB,UAAiCV,IAAjC,MAFU;AAGVhC,wCAAYiB,QAAQR,MAAR,CAAe;AAAA,qCAAU,CAACyB,OAAOC,KAAlB;AAAA,6BAAf,EAAwC5C,GAAxC,CAA4C;AAAA,qCAAU,CAAC2C,OAAOF,IAAP,CAAD,EAAeE,OAAOjF,KAAtB,CAAV;AAAA,6BAA5C;AAHF,2BAAZ;AAKD;AACF,uBAhBD;AAiBD;AAvBkB;;AAGrB,uBAAK,IAAIyF,QAAT,IAAqBD,UAArB,EAAiC;AAAA,0BAAxBC,QAAwB;AAqBhC;AAxBoB;AAyBtB;AACF,aA3BD;AA4BA,mBAAOF,MAAP;AACD;;;gDAEqBnB,K,EAAO;AAC3B,mBAAOA,MAAM9B,GAAN,CAAU,KAAKwC,kBAAf,EAAmCtB,MAAnC,CAA0C;AAAA,qBAAQmC,QAAQ,IAAhB;AAAA,aAA1C,CAAP;AACD;;;6CAEkBC,c,EAAgB;AACjC,gBAAMC,MAAMD,eAAeE,OAAf,CAAuB,OAAvB,CAAZ;AACA,mBAAQD,OAAO,CAAR,GAAaD,eAAeG,SAAf,CAAyB,CAAzB,EAA4BF,GAA5B,CAAb,GAAgD,IAAvD;AACD;;;+CAEoBG,Q,EAAUf,M,EAAQ;AACrC,gBAAIA,OAAOf,WAAX,EAAwB;AACtB,kBAAM+B,UAAUhB,OAAOf,WAAP,CAAmBgC,IAAnB,CAAwB;AAAA,uBAAKC,EAAEH,QAAF,CAAWI,QAAX,GAAsBN,OAAtB,CAA8BE,QAA9B,KAA2C,CAAhD;AAAA,eAAxB,CAAhB;AACA,kBAAIC,OAAJ,EAAa;AACX,uBAAOA,QAAQxG,KAAf;AACD;AACF;AACD,mBAAO,IAAP;AACD;;;0CAEeG,M,EAAQG,Q,EAAUQ,O,EAAS;AAAA;;AACzC;AACA;AACA,gBAAI8F,iBAAJ;AACA,gBAAIzG,OAAOqB,SAAP,IAAoB,KAAxB,EAA+B;AAC7BoF,yBAAW;AAAA,uBAAUpB,OAAOqB,GAAjB;AAAA,eAAX;AACD,aAFD,MAEO,IAAI1G,OAAOqB,SAAP,IAAoB,KAAxB,EAA+B;AACpCoF,yBAAW;AAAA,uBAAUpB,OAAOsB,GAAjB;AAAA,eAAX;AACD,aAFM,MAEA,IAAI3G,OAAOqB,SAAP,IAAoB,KAAxB,EAA+B;AACpCoF,yBAAW;AAAA,uBAAUpB,OAAOuB,GAAjB;AAAA,eAAX;AACD,aAVwC,CAUvC;AACF,gBAAMnH,MAAS,KAAKA,GAAd,SAAqB,KAAKC,aAAL,CAAmBM,OAAOmC,IAA1B,CAArB,iBAAN;AACA,mBAAOhC,SAASO,KAAhB;AACAP,qBAASiE,OAAT,GAAmB,CAAnB;AACAjE,qBAASkE,OAAT,GAAmBrE,OAAOkE,WAAP,KAAuB,KAA1C;AACA,mBAAO,KAAK5E,iBAAL,CAAuBqB,OAAvB,EAAgClB,GAAhC,EAAqC,IAArC,EAA2CU,QAA3C,EAAqD,MAArD,EACJD,IADI,CACC;AAAA,qBAAoB,OAAK2G,yBAAL,CAA+B7G,MAA/B,EAAuCyG,QAAvC,EAAiD9B,gBAAjD,CAApB;AAAA,aADD,CAAP;AAED;;;oDAEyB3E,M,EAAQyG,Q,EAAU9B,gB,EAAkB;AAC5D,mBAAO3F,EAAE4F,OAAF,CAAUD,iBAAiBjC,GAAjB,CAAqB,sBAAc;AAClD,kBAAIqC,WAAWC,MAAf,EAAuB;AACrB,uBAAOD,WAAWC,MAAX,CAAkBtC,GAAlB,CAAsB,kBAAU;AACrC,yBAAO;AACLM,2BAAOhD,OAAOgD,KADT;AAELhD,4BAAQ,WAFH;AAGLmD,gCAAY,CAAC,CAACsD,SAASpB,MAAT,CAAD,EAAmBA,OAAOjF,KAA1B,CAAD;AAHP,mBAAP;AAKD,iBANM,CAAP;AAOD;AACF,aAVgB,CAAV,CAAP;AAWD;;;8CAEmBJ,M,EAAQG,Q,EAAUQ,O,EAAS;AAAA;;AAC7C,gBAAMlB,MAAS,KAAKA,GAAd,SAAqB,KAAKC,aAAL,CAAmBM,OAAOmC,IAA1B,CAArB,UAAwDnC,OAAOoC,IAAP,GAAc,MAAd,GAAuB,KAA/E,YAAN;AACA;AACAjC,qBAASC,KAAT,GAAiB0G,KAAKC,GAAL,KAAa,MAA9B;AACA,mBAAO,KAAKzH,iBAAL,CAAuBqB,OAAvB,EAAgClB,GAAhC,EAAqC,IAArC,EAA2CU,QAA3C,EAAqD,MAArD,EACJD,IADI,CACC;AAAA,qBAAoB,QAAK8G,6BAAL,CAAmChH,MAAnC,EAA2C2E,gBAA3C,CAApB;AAAA,aADD,CAAP;AAED;;;wDAE6B3E,M,EAAQ2E,gB,EAAkB;AACtD,gBAAIsC,mBAAJ;AACA,gBAAIjH,OAAOkE,WAAP,KAAuB,KAA3B,EAAkC;AAChC+C,2BAAc;AAAA,uBAAiBC,cAAcC,MAAd,CAAqB,UAACC,CAAD,EAAGC,CAAH;AAAA,yBAASD,IAAEC,CAAX;AAAA,iBAArB,CAAjB;AAAA,eAAd;AACD,aAFD,MAEO;AACLJ,2BAAc;AAAA,uBAAiBC,cAAcC,MAAd,CAAqB,UAACC,CAAD,EAAGC,CAAH;AAAA,yBAASD,IAAEC,CAAX;AAAA,iBAArB,IAAqCH,cAAcnF,MAApE;AAAA,eAAd;AACD;AACD,mBAAO/C,EAAE4F,OAAF,CAAUD,iBAAiBjC,GAAjB,CAAqB,sBAAc;AAClD,kBAAIqC,WAAWC,MAAf,EAAuB;AACrB,oBAAI7B,mBAAJ;AACA,oBAAMmE,eAAevC,WAAWC,MAAX,CAAkBpB,MAAlB,CAAyB;AAAA,yBAAc2D,WAAWnE,IAAX,CAAgBrB,MAAhB,GAAyB,CAAvC;AAAA,iBAAzB,EAChBW,GADgB,CACZ;AAAA,yBAAc6E,WAAWnE,IAAX,CAAgB,CAAhB,CAAd;AAAA,iBADY,CAArB;AAEA,oBAAIkE,aAAavF,MAAb,KAAwB,CAA5B,EAA+B;AAC7BoB,+BAAa,EAAb;AACD,iBAFD,MAEO;AACLA,+BAAa,CAAC,CAAC8D,WAAWK,aAAa5E,GAAb,CAAiB;AAAA,2BAAM8E,GAAG3H,KAAT;AAAA,mBAAjB,CAAX,CAAD,EAA+CyH,aAAa,CAAb,EAAgBxH,SAA/D,CAAD,CAAb;AACD;AACD,uBAAO,CAAC;AACNkD,yBAAOhD,OAAOgD,KADR;AAENhD,0BAAQ,WAFF;AAGNmD,8BAAYA;AAHN,iBAAD,CAAP;AAKD;AACF,aAhBgB,CAAV,CAAP;AAiBD;;;0CAEesE,mB,EAAqB;AACnC;AACA;AACA,gBAAM7C,UAAU,EAAhB;AACA,gBAAMC,WAAW4C,oBAAoB1F,MAApB,GAA6B,CAA7B,GAAiC,UAACnB,MAAD;AAAA,2BAAgBA,MAAhB;AAAA,aAAjC,GAA8D,UAACA,MAAD;AAAA,qBAAY,EAAZ;AAAA,aAA/E;AACA6G,gCAAoB3C,OAApB,CAA4B,+BAAuB;AACjD,kBAAI4C,oBAAoB1C,MAAxB,EAAgC;AAC9B0C,oCAAoB1C,MAApB,CAA2BF,OAA3B,CAAmC,sBAAc;AAC/CyC,6BAAWrE,MAAX,GAAoB2B,SAAS6C,oBAAoB9G,MAA7B,CAApB;AACAgE,0BAAQQ,IAAR,CAAamC,UAAb;AACD,iBAHD;AAID;AACF,aAPD;AAQA,mBAAO3C,OAAP;AACD","file":"queryProcessor.js","sourcesContent":["import _ from 'lodash';\nimport {modelToString as tagsModelToString} from './tagsKVPairsController';\n\nconst STATS_BUCKETS = 60;\n\nexport class QueryProcessor {\n\n constructor(q, multiTenantsQuery, variablesHelper, capabilities, url, typeResources) {\n this.q = q;\n this.multiTenantsQuery = multiTenantsQuery;\n this.variablesHelper = variablesHelper;\n this.capabilities = capabilities;\n this.url = url;\n this.typeResources = typeResources;\n this.numericMapping = point => [point.value, point.timestamp];\n this.availMapping = point => [point.value == 'up' ? 1 : 0, point.timestamp];\n }\n\n run(target, options) {\n return this.capabilities.then(caps => {\n let postData = {\n start: options.range.from.valueOf(),\n end: options.range.to.valueOf(),\n order: 'ASC'\n };\n let tenants = [null];\n if (target.tenant) {\n tenants = this.variablesHelper.resolve(target.tenant, options);\n }\n if (target.id) {\n const metricIds = this.variablesHelper.resolve(target.id, options);\n if (caps.QUERY_POST_ENDPOINTS) {\n if (target.raw) {\n postData.ids = metricIds;\n return this.rawQuery(target, postData, tenants);\n } else if (target.timeAggFn == 'live') {\n // Need to change postData\n return this.singleStatLiveQuery(target, {ids: metricIds, limit: 1}, tenants);\n } else if (target.timeAggFn) {\n // Query single stat\n postData.metrics = metricIds;\n return this.singleStatQuery(target, postData, tenants);\n } else {\n // Query stats for chart\n postData.metrics = metricIds;\n return this.statsQuery(target, postData, tenants);\n }\n } else {\n return this.rawQueryLegacy(target, options.range, metricIds, tenants);\n }\n } else {\n if (caps.TAGS_QUERY_LANGUAGE) {\n if (target.tagsQL !== undefined && target.tagsQL.length > 0) {\n postData.tags = this.variablesHelper.resolveForQL(target.tagsQL, options);\n } else {\n return this.q.when([]);\n }\n } else {\n if (target.tags !== undefined && target.tags.length > 0) {\n postData.tags = tagsModelToString(target.tags, this.variablesHelper, options);\n } else {\n return this.q.when([]);\n }\n }\n if (target.raw) {\n return this.rawQuery(target, postData, tenants);\n } else if (target.timeAggFn == 'live') {\n // Need to change postData\n return this.singleStatLiveQuery(target, {tags: postData.tags, limit: 1}, tenants);\n } else if (target.timeAggFn) {\n // Query single stat\n return this.singleStatQuery(target, postData, tenants);\n } else {\n // Query stats for chart\n return this.statsQuery(target, postData, tenants);\n }\n }\n });\n }\n\n rawQuery(target, postData, tenants) {\n const url = `${this.url}/${this.typeResources[target.type]}/${target.rate ? 'rate' : 'raw'}/query`;\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(res => this.tenantsPrefixer(res))\n .then(allSeries => this.processRawResponse(target, allSeries));\n }\n\n rawQueryLegacy(target, range, metricIds, tenants) {\n return this.q.all(metricIds.map(metric => {\n const url = `${this.url}/${this.typeResources[target.type]}/${encodeURIComponent(metric).replace('+', '%20')}/data`;\n const params = {\n start: range.from.valueOf(),\n end: range.to.valueOf()\n };\n return this.multiTenantsQuery(tenants, url, params, null, 'GET')\n .then(res => this.tenantsPrefixer(res))\n .then(allSeries => this.processRawResponseLegacy(target, metric, allSeries));\n }));\n }\n\n processRawResponse(target, allSeries) {\n return allSeries.map(timeSerie => {\n return {\n refId: target.refId,\n target: timeSerie.prefix + timeSerie.id,\n datapoints: timeSerie.data.map(target.type == 'availability' ? this.availMapping : this.numericMapping)\n };\n });\n }\n\n processRawResponseLegacy(target, metric, data) {\n let datapoints;\n if (target.type == 'availability') {\n datapoints = data.map(this.availMapping);\n } else if (!target.rate) {\n datapoints = data.map(this.numericMapping);\n } else {\n let sortedData = data.sort((p1, p2)=> p1.timestamp - p2.timestamp);\n datapoints = _.chain(sortedData)\n .zip(sortedData.slice(1))\n .filter(pair => {\n return pair[1] // Exclude the last pair\n && (target.type != 'counter' || pair[0].value <= pair[1].value); // Exclude counter resets\n })\n .map(pair => {\n let point1 = pair[0], point2 = pair[1];\n let timestamp = point2.timestamp;\n let value_diff = point2.value - point1.value;\n let time_diff = point2.timestamp - point1.timestamp;\n let rate = 60000 * value_diff / time_diff;\n return [rate, timestamp];\n })\n .value();\n }\n return {\n refId: target.refId,\n target: metric,\n datapoints: datapoints\n };\n }\n\n statsQuery(target, postData, tenants) {\n if (target.seriesAggFn === 'none') {\n return this.statsQueryUnmerged(target, postData, tenants);\n }\n const url = `${this.url}/${this.typeResources[target.type]}/stats/query`;\n delete postData.order;\n postData.buckets = STATS_BUCKETS;\n postData.stacked = target.seriesAggFn === 'sum';\n const percentiles = this.getPercentilesToQuery(target.stats);\n if (percentiles.length > 0) {\n postData.percentiles = percentiles.join(',');\n }\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processStatsResponse(target, multiTenantsData));\n }\n\n processStatsResponse(target, multiTenantsData) {\n // Response example: [ { tenant: 't1', result: [...] }, { tenant: 't2', result: [...] } ]\n // Detailed `data[i].result`: [{start:1234, end:5678, avg:100.0, min:90.0, max:110.0, (...), percentiles:[{quantile: 90, value: 105.0}]}]\n const flatten = [];\n const prefixer = multiTenantsData.length > 1 ? (tenant) => `[${tenant}] ` : (tenant) => '';\n multiTenantsData.forEach(tenantData => {\n if (tenantData.result) {\n target.stats.forEach(stat => {\n const percentile = this.getPercentileValue(stat);\n if (percentile) {\n flatten.push({\n refId: target.refId,\n target: prefixer(tenantData.tenant) + stat,\n datapoints: tenantData.result.filter(bucket => !bucket.empty)\n .map(bucket => [this.findQuantileInBucket(percentile, bucket), bucket.start])\n });\n } else {\n flatten.push({\n refId: target.refId,\n target: prefixer(tenantData.tenant) + stat,\n datapoints: tenantData.result.filter(bucket => !bucket.empty).map(bucket => [bucket[stat], bucket.start])\n });\n }\n });\n }\n });\n return flatten;\n }\n\n statsQueryUnmerged(target, postData, tenants) {\n const url = `${this.url}/metrics/stats/query`;\n delete postData.order;\n postData.buckets = STATS_BUCKETS;\n postData.types = [target.type];\n if (postData.metrics) {\n const metricsPerType = {};\n metricsPerType[target.type] = postData.metrics;\n postData.metrics = metricsPerType;\n }\n const percentiles = this.getPercentilesToQuery(target.stats);\n if (percentiles.length > 0) {\n postData.percentiles = percentiles.join(',');\n }\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processUnmergedStatsResponse(target, multiTenantsData));\n }\n\n processUnmergedStatsResponse(target, multiTenantsData) {\n // Response example: [ { tenant: 't1', result: {...} }, { tenant: 't2', result: {...} } ]\n // Detailed `data[i].result`:\n // {\"gauge\": {\"my_metric\": [\n // {start:1234, end:5678, avg:100.0, min:90.0, max:110.0, (...), percentiles:[{quantile: 90, value: 105.0}]}\n // ]}}\n const series = [];\n const prefixer = multiTenantsData.length > 1 ? (tenant) => `[${tenant}] ` : (tenant) => '';\n multiTenantsData.forEach(tenantData => {\n if (tenantData.result) {\n const allMetrics = tenantData.result[target.type];\n const prefix = prefixer(tenantData.tenant);\n for (let metricId in allMetrics) {\n if (allMetrics.hasOwnProperty(metricId)) {\n const buckets = allMetrics[metricId];\n target.stats.forEach(stat => {\n const percentile = this.getPercentileValue(stat);\n if (percentile) {\n series.push({\n refId: target.refId,\n target: `${prefix}${metricId} [${stat}]`,\n datapoints: buckets.filter(bucket => !bucket.empty)\n .map(bucket => [this.findQuantileInBucket(percentile, bucket), bucket.start])\n });\n } else {\n series.push({\n refId: target.refId,\n target: `${prefix}${metricId} [${stat}]`,\n datapoints: buckets.filter(bucket => !bucket.empty).map(bucket => [bucket[stat], bucket.start])\n });\n }\n });\n }\n }\n }\n });\n return series;\n }\n\n getPercentilesToQuery(stats) {\n return stats.map(this.getPercentileValue).filter(perc => perc != null);\n }\n\n getPercentileValue(percentileName) {\n const idx = percentileName.indexOf(' %ile');\n return (idx >= 0) ? percentileName.substring(0, idx) : null;\n }\n\n findQuantileInBucket(quantile, bucket) {\n if (bucket.percentiles) {\n const percObj = bucket.percentiles.find(p => p.quantile.toString().indexOf(quantile) >= 0);\n if (percObj) {\n return percObj.value;\n }\n }\n return null;\n }\n\n singleStatQuery(target, postData, tenants) {\n // Query for singlestat => we just ask for a single bucket\n // But because of that we need to override Grafana behaviour, and manage ourselves the min/max/avg/etc. selection\n let fnBucket;\n if (target.timeAggFn == 'avg') {\n fnBucket = bucket => bucket.avg;\n } else if (target.timeAggFn == 'min') {\n fnBucket = bucket => bucket.min;\n } else if (target.timeAggFn == 'max') {\n fnBucket = bucket => bucket.max;\n } // no else case. \"live\" case was handled before\n const url = `${this.url}/${this.typeResources[target.type]}/stats/query`;\n delete postData.order;\n postData.buckets = 1;\n postData.stacked = target.seriesAggFn === 'sum';\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processSingleStatResponse(target, fnBucket, multiTenantsData));\n }\n\n processSingleStatResponse(target, fnBucket, multiTenantsData) {\n return _.flatten(multiTenantsData.map(tenantData => {\n if (tenantData.result) {\n return tenantData.result.map(bucket => {\n return {\n refId: target.refId,\n target: 'Aggregate',\n datapoints: [[fnBucket(bucket), bucket.start]]\n };\n });\n }\n }));\n }\n\n singleStatLiveQuery(target, postData, tenants) {\n const url = `${this.url}/${this.typeResources[target.type]}/${target.rate ? 'rate' : 'raw'}/query`;\n // Set start to now - 5m\n postData.start = Date.now() - 300000;\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processSingleStatLiveResponse(target, multiTenantsData));\n }\n\n processSingleStatLiveResponse(target, multiTenantsData) {\n let reduceFunc;\n if (target.seriesAggFn === 'sum') {\n reduceFunc = (presentValues => presentValues.reduce((a,b) => a+b));\n } else {\n reduceFunc = (presentValues => presentValues.reduce((a,b) => a+b) / presentValues.length);\n }\n return _.flatten(multiTenantsData.map(tenantData => {\n if (tenantData.result) {\n let datapoints;\n const latestPoints = tenantData.result.filter(timeSeries => timeSeries.data.length > 0)\n .map(timeSeries => timeSeries.data[0]);\n if (latestPoints.length === 0) {\n datapoints = [];\n } else {\n datapoints = [[reduceFunc(latestPoints.map(dp => dp.value)), latestPoints[0].timestamp]];\n }\n return [{\n refId: target.refId,\n target: 'Aggregate',\n datapoints: datapoints\n }];\n }\n }));\n }\n\n tenantsPrefixer(allTenantTimeSeries) {\n // Exemple of input:\n // [ { tenant: 't1', result: [ {id: metricA, data: []} ] }, { tenant: 't2', result: [ {id: metricB, data: []} ] } ]\n const flatten = [];\n const prefixer = allTenantTimeSeries.length > 1 ? (tenant) => `[${tenant}] ` : (tenant) => '';\n allTenantTimeSeries.forEach(oneTenantTimeSeries => {\n if (oneTenantTimeSeries.result) {\n oneTenantTimeSeries.result.forEach(timeSeries => {\n timeSeries.prefix = prefixer(oneTenantTimeSeries.tenant);\n flatten.push(timeSeries);\n })\n }\n })\n return flatten;\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/queryProcessor.js"],"names":["_","tagsModelToString","modelToString","STATS_BUCKETS","QueryProcessor","q","multiTenantsQuery","variablesHelper","capabilities","url","typeResources","numericMapping","point","value","timestamp","availMapping","legendRegexp","target","options","then","postData","start","range","from","valueOf","end","to","order","tenants","tenant","resolve","id","metricIds","caps","QUERY_POST_ENDPOINTS","raw","ids","rawQuery","timeAggFn","singleStatLiveQuery","limit","metrics","singleStatQuery","statsQuery","rawQueryLegacy","TAGS_QUERY_LANGUAGE","tagsQL","undefined","length","tags","resolveForQL","when","type","rate","tenantsPrefixer","res","processRawResponse","allSeries","all","map","encodeURIComponent","metric","replace","params","processRawResponseLegacy","refId","legend","timeSerie","prefix","datapoints","data","name","str","group","match","RegExp","exec","e","sortedData","sort","p1","p2","chain","zip","slice","filter","pair","point1","point2","value_diff","time_diff","seriesAggFn","statsQueryUnmerged","buckets","stacked","percentiles","getPercentilesToQuery","stats","join","processStatsResponse","multiTenantsData","flatten","prefixer","forEach","tenantData","result","percentile","getPercentileValue","stat","push","bucket","empty","findQuantileInBucket","types","metricsPerType","processUnmergedStatsResponse","series","allMetrics","metricId","hasOwnProperty","perc","percentileName","idx","indexOf","substring","quantile","percObj","find","p","toString","fnBucket","avg","min","max","processSingleStatResponse","Date","now","processSingleStatLiveResponse","reduceFunc","presentValues","reduce","a","b","latestPoints","timeSeries","dp","allTenantTimeSeries","oneTenantTimeSeries"],"mappings":"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","file":"queryProcessor.js","sourcesContent":["import _ from 'lodash';\nimport {modelToString as tagsModelToString} from './tagsKVPairsController';\n\nconst STATS_BUCKETS = 60;\n\nexport class QueryProcessor {\n\n constructor(q, multiTenantsQuery, variablesHelper, capabilities, url, typeResources) {\n this.q = q;\n this.multiTenantsQuery = multiTenantsQuery;\n this.variablesHelper = variablesHelper;\n this.capabilities = capabilities;\n this.url = url;\n this.typeResources = typeResources;\n this.numericMapping = point => [point.value, point.timestamp];\n this.availMapping = point => [point.value == 'up' ? 1 : 0, point.timestamp];\n this.legendRegexp = /{{(.+?)(?=}})}}/g;\n }\n\n run(target, options) {\n return this.capabilities.then(caps => {\n let postData = {\n start: options.range.from.valueOf(),\n end: options.range.to.valueOf(),\n order: 'ASC'\n };\n let tenants = [null];\n if (target.tenant) {\n tenants = this.variablesHelper.resolve(target.tenant, options);\n }\n if (target.id) {\n const metricIds = this.variablesHelper.resolve(target.id, options);\n if (caps.QUERY_POST_ENDPOINTS) {\n if (target.raw) {\n postData.ids = metricIds;\n return this.rawQuery(target, postData, tenants);\n } else if (target.timeAggFn == 'live') {\n // Need to change postData\n return this.singleStatLiveQuery(target, {ids: metricIds, limit: 1}, tenants);\n } else if (target.timeAggFn) {\n // Query single stat\n postData.metrics = metricIds;\n return this.singleStatQuery(target, postData, tenants);\n } else {\n // Query stats for chart\n postData.metrics = metricIds;\n return this.statsQuery(target, postData, tenants);\n }\n } else {\n return this.rawQueryLegacy(target, options.range, metricIds, tenants);\n }\n } else {\n if (caps.TAGS_QUERY_LANGUAGE) {\n if (target.tagsQL !== undefined && target.tagsQL.length > 0) {\n postData.tags = this.variablesHelper.resolveForQL(target.tagsQL, options);\n } else {\n return this.q.when([]);\n }\n } else {\n if (target.tags !== undefined && target.tags.length > 0) {\n postData.tags = tagsModelToString(target.tags, this.variablesHelper, options);\n } else {\n return this.q.when([]);\n }\n }\n if (target.raw) {\n return this.rawQuery(target, postData, tenants);\n } else if (target.timeAggFn == 'live') {\n // Need to change postData\n return this.singleStatLiveQuery(target, {tags: postData.tags, limit: 1}, tenants);\n } else if (target.timeAggFn) {\n // Query single stat\n return this.singleStatQuery(target, postData, tenants);\n } else {\n // Query stats for chart\n return this.statsQuery(target, postData, tenants);\n }\n }\n });\n }\n\n rawQuery(target, postData, tenants) {\n const url = `${this.url}/${this.typeResources[target.type]}/${target.rate ? 'rate' : 'raw'}/query`;\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(res => this.tenantsPrefixer(res))\n .then(allSeries => this.processRawResponse(target, allSeries));\n }\n\n rawQueryLegacy(target, range, metricIds, tenants) {\n return this.q.all(metricIds.map(metric => {\n const url = `${this.url}/${this.typeResources[target.type]}/${encodeURIComponent(metric).replace('+', '%20')}/data`;\n const params = {\n start: range.from.valueOf(),\n end: range.to.valueOf()\n };\n return this.multiTenantsQuery(tenants, url, params, null, 'GET')\n .then(res => this.tenantsPrefixer(res))\n .then(allSeries => this.processRawResponseLegacy(target, metric, allSeries));\n }));\n }\n\n processRawResponse(target, allSeries) {\n return allSeries.map(timeSerie => {\n return {\n refId: target.refId,\n target: this.legend(target, timeSerie.prefix + timeSerie.id),\n datapoints: timeSerie.data.map(target.type == 'availability' ? this.availMapping : this.numericMapping)\n };\n });\n }\n\n legend(target, name) {\n if (target.legend) {\n let legend = target.legend.replace(this.legendRegexp, function(str, group) {\n try {\n let match = new RegExp(group).exec(name);\n if (match && match.length > 1) {\n return match[1];\n }\n } catch(e) {\n }\n return str;\n });\n return legend;\n }\n return name;\n }\n\n processRawResponseLegacy(target, metric, data) {\n let datapoints;\n if (target.type == 'availability') {\n datapoints = data.map(this.availMapping);\n } else if (!target.rate) {\n datapoints = data.map(this.numericMapping);\n } else {\n let sortedData = data.sort((p1, p2)=> p1.timestamp - p2.timestamp);\n datapoints = _.chain(sortedData)\n .zip(sortedData.slice(1))\n .filter(pair => {\n return pair[1] // Exclude the last pair\n && (target.type != 'counter' || pair[0].value <= pair[1].value); // Exclude counter resets\n })\n .map(pair => {\n let point1 = pair[0], point2 = pair[1];\n let timestamp = point2.timestamp;\n let value_diff = point2.value - point1.value;\n let time_diff = point2.timestamp - point1.timestamp;\n let rate = 60000 * value_diff / time_diff;\n return [rate, timestamp];\n })\n .value();\n }\n return {\n refId: target.refId,\n target: metric,\n datapoints: datapoints\n };\n }\n\n statsQuery(target, postData, tenants) {\n if (target.seriesAggFn === 'none') {\n return this.statsQueryUnmerged(target, postData, tenants);\n }\n const url = `${this.url}/${this.typeResources[target.type]}/stats/query`;\n delete postData.order;\n postData.buckets = STATS_BUCKETS;\n postData.stacked = target.seriesAggFn === 'sum';\n const percentiles = this.getPercentilesToQuery(target.stats);\n if (percentiles.length > 0) {\n postData.percentiles = percentiles.join(',');\n }\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processStatsResponse(target, multiTenantsData));\n }\n\n processStatsResponse(target, multiTenantsData) {\n // Response example: [ { tenant: 't1', result: [...] }, { tenant: 't2', result: [...] } ]\n // Detailed `data[i].result`: [{start:1234, end:5678, avg:100.0, min:90.0, max:110.0, (...), percentiles:[{quantile: 90, value: 105.0}]}]\n const flatten = [];\n const prefixer = multiTenantsData.length > 1 ? (tenant) => `[${target.refId}: ${tenant}] ` : (tenant) => `[${target.refId}] `;\n multiTenantsData.forEach(tenantData => {\n if (tenantData.result) {\n target.stats.forEach(stat => {\n const percentile = this.getPercentileValue(stat);\n if (percentile) {\n flatten.push({\n refId: target.refId,\n target: this.legend(target, prefixer(tenantData.tenant) + stat),\n datapoints: tenantData.result.filter(bucket => !bucket.empty)\n .map(bucket => [this.findQuantileInBucket(percentile, bucket), bucket.start])\n });\n } else {\n flatten.push({\n refId: target.refId,\n target: this.legend(target, prefixer(tenantData.tenant) + stat),\n datapoints: tenantData.result.filter(bucket => !bucket.empty).map(bucket => [bucket[stat], bucket.start])\n });\n }\n });\n }\n });\n return flatten;\n }\n\n statsQueryUnmerged(target, postData, tenants) {\n const url = `${this.url}/metrics/stats/query`;\n delete postData.order;\n postData.buckets = STATS_BUCKETS;\n postData.types = [target.type];\n if (postData.metrics) {\n const metricsPerType = {};\n metricsPerType[target.type] = postData.metrics;\n postData.metrics = metricsPerType;\n }\n const percentiles = this.getPercentilesToQuery(target.stats);\n if (percentiles.length > 0) {\n postData.percentiles = percentiles.join(',');\n }\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processUnmergedStatsResponse(target, multiTenantsData));\n }\n\n processUnmergedStatsResponse(target, multiTenantsData) {\n // Response example: [ { tenant: 't1', result: {...} }, { tenant: 't2', result: {...} } ]\n // Detailed `data[i].result`:\n // {\"gauge\": {\"my_metric\": [\n // {start:1234, end:5678, avg:100.0, min:90.0, max:110.0, (...), percentiles:[{quantile: 90, value: 105.0}]}\n // ]}}\n const series = [];\n const prefixer = multiTenantsData.length > 1 ? (tenant) => `[${tenant}] ` : (tenant) => '';\n multiTenantsData.forEach(tenantData => {\n if (tenantData.result) {\n const allMetrics = tenantData.result[target.type];\n const prefix = prefixer(tenantData.tenant);\n for (let metricId in allMetrics) {\n if (allMetrics.hasOwnProperty(metricId)) {\n const buckets = allMetrics[metricId];\n target.stats.forEach(stat => {\n const percentile = this.getPercentileValue(stat);\n if (percentile) {\n series.push({\n refId: target.refId,\n target: this.legend(target, `${prefix}${metricId} [${stat}]`),\n datapoints: buckets.filter(bucket => !bucket.empty)\n .map(bucket => [this.findQuantileInBucket(percentile, bucket), bucket.start])\n });\n } else {\n series.push({\n refId: target.refId,\n target: this.legend(target, `${prefix}${metricId} [${stat}]`),\n datapoints: buckets.filter(bucket => !bucket.empty).map(bucket => [bucket[stat], bucket.start])\n });\n }\n });\n }\n }\n }\n });\n return series;\n }\n\n getPercentilesToQuery(stats) {\n return stats.map(this.getPercentileValue).filter(perc => perc != null);\n }\n\n getPercentileValue(percentileName) {\n const idx = percentileName.indexOf(' %ile');\n return (idx >= 0) ? percentileName.substring(0, idx) : null;\n }\n\n findQuantileInBucket(quantile, bucket) {\n if (bucket.percentiles) {\n const percObj = bucket.percentiles.find(p => p.quantile.toString().indexOf(quantile) >= 0);\n if (percObj) {\n return percObj.value;\n }\n }\n return null;\n }\n\n singleStatQuery(target, postData, tenants) {\n // Query for singlestat => we just ask for a single bucket\n // But because of that we need to override Grafana behaviour, and manage ourselves the min/max/avg/etc. selection\n let fnBucket;\n if (target.timeAggFn == 'avg') {\n fnBucket = bucket => bucket.avg;\n } else if (target.timeAggFn == 'min') {\n fnBucket = bucket => bucket.min;\n } else if (target.timeAggFn == 'max') {\n fnBucket = bucket => bucket.max;\n } // no else case. \"live\" case was handled before\n const url = `${this.url}/${this.typeResources[target.type]}/stats/query`;\n delete postData.order;\n postData.buckets = 1;\n postData.stacked = target.seriesAggFn === 'sum';\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processSingleStatResponse(target, fnBucket, multiTenantsData));\n }\n\n processSingleStatResponse(target, fnBucket, multiTenantsData) {\n return _.flatten(multiTenantsData.map(tenantData => {\n if (tenantData.result) {\n return tenantData.result.map(bucket => {\n return {\n refId: target.refId,\n target: 'Aggregate',\n datapoints: [[fnBucket(bucket), bucket.start]]\n };\n });\n }\n }));\n }\n\n singleStatLiveQuery(target, postData, tenants) {\n const url = `${this.url}/${this.typeResources[target.type]}/${target.rate ? 'rate' : 'raw'}/query`;\n // Set start to now - 5m\n postData.start = Date.now() - 300000;\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processSingleStatLiveResponse(target, multiTenantsData));\n }\n\n processSingleStatLiveResponse(target, multiTenantsData) {\n let reduceFunc;\n if (target.seriesAggFn === 'sum') {\n reduceFunc = (presentValues => presentValues.reduce((a,b) => a+b));\n } else {\n reduceFunc = (presentValues => presentValues.reduce((a,b) => a+b) / presentValues.length);\n }\n return _.flatten(multiTenantsData.map(tenantData => {\n if (tenantData.result) {\n let datapoints;\n const latestPoints = tenantData.result.filter(timeSeries => timeSeries.data.length > 0)\n .map(timeSeries => timeSeries.data[0]);\n if (latestPoints.length === 0) {\n datapoints = [];\n } else {\n datapoints = [[reduceFunc(latestPoints.map(dp => dp.value)), latestPoints[0].timestamp]];\n }\n return [{\n refId: target.refId,\n target: 'Aggregate',\n datapoints: datapoints\n }];\n }\n }));\n }\n\n tenantsPrefixer(allTenantTimeSeries) {\n // Exemple of input:\n // [ { tenant: 't1', result: [ {id: metricA, data: []} ] }, { tenant: 't2', result: [ {id: metricB, data: []} ] } ]\n const flatten = [];\n const prefixer = allTenantTimeSeries.length > 1 ? (tenant) => `[${tenant}] ` : (tenant) => '';\n allTenantTimeSeries.forEach(oneTenantTimeSeries => {\n if (oneTenantTimeSeries.result) {\n oneTenantTimeSeries.result.forEach(timeSeries => {\n timeSeries.prefix = prefixer(oneTenantTimeSeries.tenant);\n flatten.push(timeSeries);\n })\n }\n })\n return flatten;\n }\n}\n"]} \ No newline at end of file diff --git a/dist/test/queryProcessor.js b/dist/test/queryProcessor.js index 7b821c3..5063fdd 100644 --- a/dist/test/queryProcessor.js +++ b/dist/test/queryProcessor.js @@ -35,6 +35,7 @@ var QueryProcessor = exports.QueryProcessor = function () { this.availMapping = function (point) { return [point.value == 'up' ? 1 : 0, point.timestamp]; }; + this.legendRegexp = /{{(.+?)(?=}})}}/g; } _createClass(QueryProcessor, [{ @@ -140,11 +141,28 @@ var QueryProcessor = exports.QueryProcessor = function () { return allSeries.map(function (timeSerie) { return { refId: target.refId, - target: timeSerie.prefix + timeSerie.id, + target: _this4.legend(target, timeSerie.prefix + timeSerie.id), datapoints: timeSerie.data.map(target.type == 'availability' ? _this4.availMapping : _this4.numericMapping) }; }); } + }, { + key: 'legend', + value: function legend(target, name) { + if (target.legend) { + var legend = target.legend.replace(this.legendRegexp, function (str, group) { + try { + var match = new RegExp(group).exec(name); + if (match && match.length > 1) { + return match[1]; + } + } catch (e) {} + return str; + }); + return legend; + } + return name; + } }, { key: 'processRawResponseLegacy', value: function processRawResponseLegacy(target, metric, data) { @@ -205,9 +223,9 @@ var QueryProcessor = exports.QueryProcessor = function () { // Detailed `data[i].result`: [{start:1234, end:5678, avg:100.0, min:90.0, max:110.0, (...), percentiles:[{quantile: 90, value: 105.0}]}] var flatten = []; var prefixer = multiTenantsData.length > 1 ? function (tenant) { - return '[' + tenant + '] '; + return '[' + target.refId + ': ' + tenant + '] '; } : function (tenant) { - return ''; + return '[' + target.refId + '] '; }; multiTenantsData.forEach(function (tenantData) { if (tenantData.result) { @@ -216,7 +234,7 @@ var QueryProcessor = exports.QueryProcessor = function () { if (percentile) { flatten.push({ refId: target.refId, - target: prefixer(tenantData.tenant) + stat, + target: _this6.legend(target, prefixer(tenantData.tenant) + stat), datapoints: tenantData.result.filter(function (bucket) { return !bucket.empty; }).map(function (bucket) { @@ -226,7 +244,7 @@ var QueryProcessor = exports.QueryProcessor = function () { } else { flatten.push({ refId: target.refId, - target: prefixer(tenantData.tenant) + stat, + target: _this6.legend(target, prefixer(tenantData.tenant) + stat), datapoints: tenantData.result.filter(function (bucket) { return !bucket.empty; }).map(function (bucket) { @@ -291,7 +309,7 @@ var QueryProcessor = exports.QueryProcessor = function () { if (percentile) { series.push({ refId: target.refId, - target: '' + prefix + metricId + ' [' + stat + ']', + target: _this8.legend(target, '' + prefix + metricId + ' [' + stat + ']'), datapoints: buckets.filter(function (bucket) { return !bucket.empty; }).map(function (bucket) { @@ -301,7 +319,7 @@ var QueryProcessor = exports.QueryProcessor = function () { } else { series.push({ refId: target.refId, - target: '' + prefix + metricId + ' [' + stat + ']', + target: _this8.legend(target, '' + prefix + metricId + ' [' + stat + ']'), datapoints: buckets.filter(function (bucket) { return !bucket.empty; }).map(function (bucket) { diff --git a/dist/test/queryProcessor.js.map b/dist/test/queryProcessor.js.map index be8fe06..f27e473 100644 --- a/dist/test/queryProcessor.js.map +++ b/dist/test/queryProcessor.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/queryProcessor.js"],"names":["STATS_BUCKETS","QueryProcessor","q","multiTenantsQuery","variablesHelper","capabilities","url","typeResources","numericMapping","point","value","timestamp","availMapping","target","options","then","postData","start","range","from","valueOf","end","to","order","tenants","tenant","resolve","id","metricIds","caps","QUERY_POST_ENDPOINTS","raw","ids","rawQuery","timeAggFn","singleStatLiveQuery","limit","metrics","singleStatQuery","statsQuery","rawQueryLegacy","TAGS_QUERY_LANGUAGE","tagsQL","undefined","length","tags","resolveForQL","when","type","rate","tenantsPrefixer","res","processRawResponse","allSeries","all","map","encodeURIComponent","metric","replace","params","processRawResponseLegacy","refId","timeSerie","prefix","datapoints","data","sortedData","sort","p1","p2","chain","zip","slice","filter","pair","point1","point2","value_diff","time_diff","seriesAggFn","statsQueryUnmerged","buckets","stacked","percentiles","getPercentilesToQuery","stats","join","processStatsResponse","multiTenantsData","flatten","prefixer","forEach","tenantData","result","percentile","getPercentileValue","stat","push","bucket","empty","findQuantileInBucket","types","metricsPerType","processUnmergedStatsResponse","series","allMetrics","metricId","hasOwnProperty","perc","percentileName","idx","indexOf","substring","quantile","percObj","find","p","toString","fnBucket","avg","min","max","processSingleStatResponse","Date","now","processSingleStatLiveResponse","reduceFunc","presentValues","reduce","a","b","latestPoints","timeSeries","dp","allTenantTimeSeries","oneTenantTimeSeries"],"mappings":"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","file":"queryProcessor.js","sourcesContent":["import _ from 'lodash';\nimport {modelToString as tagsModelToString} from './tagsKVPairsController';\n\nconst STATS_BUCKETS = 60;\n\nexport class QueryProcessor {\n\n constructor(q, multiTenantsQuery, variablesHelper, capabilities, url, typeResources) {\n this.q = q;\n this.multiTenantsQuery = multiTenantsQuery;\n this.variablesHelper = variablesHelper;\n this.capabilities = capabilities;\n this.url = url;\n this.typeResources = typeResources;\n this.numericMapping = point => [point.value, point.timestamp];\n this.availMapping = point => [point.value == 'up' ? 1 : 0, point.timestamp];\n }\n\n run(target, options) {\n return this.capabilities.then(caps => {\n let postData = {\n start: options.range.from.valueOf(),\n end: options.range.to.valueOf(),\n order: 'ASC'\n };\n let tenants = [null];\n if (target.tenant) {\n tenants = this.variablesHelper.resolve(target.tenant, options);\n }\n if (target.id) {\n const metricIds = this.variablesHelper.resolve(target.id, options);\n if (caps.QUERY_POST_ENDPOINTS) {\n if (target.raw) {\n postData.ids = metricIds;\n return this.rawQuery(target, postData, tenants);\n } else if (target.timeAggFn == 'live') {\n // Need to change postData\n return this.singleStatLiveQuery(target, {ids: metricIds, limit: 1}, tenants);\n } else if (target.timeAggFn) {\n // Query single stat\n postData.metrics = metricIds;\n return this.singleStatQuery(target, postData, tenants);\n } else {\n // Query stats for chart\n postData.metrics = metricIds;\n return this.statsQuery(target, postData, tenants);\n }\n } else {\n return this.rawQueryLegacy(target, options.range, metricIds, tenants);\n }\n } else {\n if (caps.TAGS_QUERY_LANGUAGE) {\n if (target.tagsQL !== undefined && target.tagsQL.length > 0) {\n postData.tags = this.variablesHelper.resolveForQL(target.tagsQL, options);\n } else {\n return this.q.when([]);\n }\n } else {\n if (target.tags !== undefined && target.tags.length > 0) {\n postData.tags = tagsModelToString(target.tags, this.variablesHelper, options);\n } else {\n return this.q.when([]);\n }\n }\n if (target.raw) {\n return this.rawQuery(target, postData, tenants);\n } else if (target.timeAggFn == 'live') {\n // Need to change postData\n return this.singleStatLiveQuery(target, {tags: postData.tags, limit: 1}, tenants);\n } else if (target.timeAggFn) {\n // Query single stat\n return this.singleStatQuery(target, postData, tenants);\n } else {\n // Query stats for chart\n return this.statsQuery(target, postData, tenants);\n }\n }\n });\n }\n\n rawQuery(target, postData, tenants) {\n const url = `${this.url}/${this.typeResources[target.type]}/${target.rate ? 'rate' : 'raw'}/query`;\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(res => this.tenantsPrefixer(res))\n .then(allSeries => this.processRawResponse(target, allSeries));\n }\n\n rawQueryLegacy(target, range, metricIds, tenants) {\n return this.q.all(metricIds.map(metric => {\n const url = `${this.url}/${this.typeResources[target.type]}/${encodeURIComponent(metric).replace('+', '%20')}/data`;\n const params = {\n start: range.from.valueOf(),\n end: range.to.valueOf()\n };\n return this.multiTenantsQuery(tenants, url, params, null, 'GET')\n .then(res => this.tenantsPrefixer(res))\n .then(allSeries => this.processRawResponseLegacy(target, metric, allSeries));\n }));\n }\n\n processRawResponse(target, allSeries) {\n return allSeries.map(timeSerie => {\n return {\n refId: target.refId,\n target: timeSerie.prefix + timeSerie.id,\n datapoints: timeSerie.data.map(target.type == 'availability' ? this.availMapping : this.numericMapping)\n };\n });\n }\n\n processRawResponseLegacy(target, metric, data) {\n let datapoints;\n if (target.type == 'availability') {\n datapoints = data.map(this.availMapping);\n } else if (!target.rate) {\n datapoints = data.map(this.numericMapping);\n } else {\n let sortedData = data.sort((p1, p2)=> p1.timestamp - p2.timestamp);\n datapoints = _.chain(sortedData)\n .zip(sortedData.slice(1))\n .filter(pair => {\n return pair[1] // Exclude the last pair\n && (target.type != 'counter' || pair[0].value <= pair[1].value); // Exclude counter resets\n })\n .map(pair => {\n let point1 = pair[0], point2 = pair[1];\n let timestamp = point2.timestamp;\n let value_diff = point2.value - point1.value;\n let time_diff = point2.timestamp - point1.timestamp;\n let rate = 60000 * value_diff / time_diff;\n return [rate, timestamp];\n })\n .value();\n }\n return {\n refId: target.refId,\n target: metric,\n datapoints: datapoints\n };\n }\n\n statsQuery(target, postData, tenants) {\n if (target.seriesAggFn === 'none') {\n return this.statsQueryUnmerged(target, postData, tenants);\n }\n const url = `${this.url}/${this.typeResources[target.type]}/stats/query`;\n delete postData.order;\n postData.buckets = STATS_BUCKETS;\n postData.stacked = target.seriesAggFn === 'sum';\n const percentiles = this.getPercentilesToQuery(target.stats);\n if (percentiles.length > 0) {\n postData.percentiles = percentiles.join(',');\n }\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processStatsResponse(target, multiTenantsData));\n }\n\n processStatsResponse(target, multiTenantsData) {\n // Response example: [ { tenant: 't1', result: [...] }, { tenant: 't2', result: [...] } ]\n // Detailed `data[i].result`: [{start:1234, end:5678, avg:100.0, min:90.0, max:110.0, (...), percentiles:[{quantile: 90, value: 105.0}]}]\n const flatten = [];\n const prefixer = multiTenantsData.length > 1 ? (tenant) => `[${tenant}] ` : (tenant) => '';\n multiTenantsData.forEach(tenantData => {\n if (tenantData.result) {\n target.stats.forEach(stat => {\n const percentile = this.getPercentileValue(stat);\n if (percentile) {\n flatten.push({\n refId: target.refId,\n target: prefixer(tenantData.tenant) + stat,\n datapoints: tenantData.result.filter(bucket => !bucket.empty)\n .map(bucket => [this.findQuantileInBucket(percentile, bucket), bucket.start])\n });\n } else {\n flatten.push({\n refId: target.refId,\n target: prefixer(tenantData.tenant) + stat,\n datapoints: tenantData.result.filter(bucket => !bucket.empty).map(bucket => [bucket[stat], bucket.start])\n });\n }\n });\n }\n });\n return flatten;\n }\n\n statsQueryUnmerged(target, postData, tenants) {\n const url = `${this.url}/metrics/stats/query`;\n delete postData.order;\n postData.buckets = STATS_BUCKETS;\n postData.types = [target.type];\n if (postData.metrics) {\n const metricsPerType = {};\n metricsPerType[target.type] = postData.metrics;\n postData.metrics = metricsPerType;\n }\n const percentiles = this.getPercentilesToQuery(target.stats);\n if (percentiles.length > 0) {\n postData.percentiles = percentiles.join(',');\n }\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processUnmergedStatsResponse(target, multiTenantsData));\n }\n\n processUnmergedStatsResponse(target, multiTenantsData) {\n // Response example: [ { tenant: 't1', result: {...} }, { tenant: 't2', result: {...} } ]\n // Detailed `data[i].result`:\n // {\"gauge\": {\"my_metric\": [\n // {start:1234, end:5678, avg:100.0, min:90.0, max:110.0, (...), percentiles:[{quantile: 90, value: 105.0}]}\n // ]}}\n const series = [];\n const prefixer = multiTenantsData.length > 1 ? (tenant) => `[${tenant}] ` : (tenant) => '';\n multiTenantsData.forEach(tenantData => {\n if (tenantData.result) {\n const allMetrics = tenantData.result[target.type];\n const prefix = prefixer(tenantData.tenant);\n for (let metricId in allMetrics) {\n if (allMetrics.hasOwnProperty(metricId)) {\n const buckets = allMetrics[metricId];\n target.stats.forEach(stat => {\n const percentile = this.getPercentileValue(stat);\n if (percentile) {\n series.push({\n refId: target.refId,\n target: `${prefix}${metricId} [${stat}]`,\n datapoints: buckets.filter(bucket => !bucket.empty)\n .map(bucket => [this.findQuantileInBucket(percentile, bucket), bucket.start])\n });\n } else {\n series.push({\n refId: target.refId,\n target: `${prefix}${metricId} [${stat}]`,\n datapoints: buckets.filter(bucket => !bucket.empty).map(bucket => [bucket[stat], bucket.start])\n });\n }\n });\n }\n }\n }\n });\n return series;\n }\n\n getPercentilesToQuery(stats) {\n return stats.map(this.getPercentileValue).filter(perc => perc != null);\n }\n\n getPercentileValue(percentileName) {\n const idx = percentileName.indexOf(' %ile');\n return (idx >= 0) ? percentileName.substring(0, idx) : null;\n }\n\n findQuantileInBucket(quantile, bucket) {\n if (bucket.percentiles) {\n const percObj = bucket.percentiles.find(p => p.quantile.toString().indexOf(quantile) >= 0);\n if (percObj) {\n return percObj.value;\n }\n }\n return null;\n }\n\n singleStatQuery(target, postData, tenants) {\n // Query for singlestat => we just ask for a single bucket\n // But because of that we need to override Grafana behaviour, and manage ourselves the min/max/avg/etc. selection\n let fnBucket;\n if (target.timeAggFn == 'avg') {\n fnBucket = bucket => bucket.avg;\n } else if (target.timeAggFn == 'min') {\n fnBucket = bucket => bucket.min;\n } else if (target.timeAggFn == 'max') {\n fnBucket = bucket => bucket.max;\n } // no else case. \"live\" case was handled before\n const url = `${this.url}/${this.typeResources[target.type]}/stats/query`;\n delete postData.order;\n postData.buckets = 1;\n postData.stacked = target.seriesAggFn === 'sum';\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processSingleStatResponse(target, fnBucket, multiTenantsData));\n }\n\n processSingleStatResponse(target, fnBucket, multiTenantsData) {\n return _.flatten(multiTenantsData.map(tenantData => {\n if (tenantData.result) {\n return tenantData.result.map(bucket => {\n return {\n refId: target.refId,\n target: 'Aggregate',\n datapoints: [[fnBucket(bucket), bucket.start]]\n };\n });\n }\n }));\n }\n\n singleStatLiveQuery(target, postData, tenants) {\n const url = `${this.url}/${this.typeResources[target.type]}/${target.rate ? 'rate' : 'raw'}/query`;\n // Set start to now - 5m\n postData.start = Date.now() - 300000;\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processSingleStatLiveResponse(target, multiTenantsData));\n }\n\n processSingleStatLiveResponse(target, multiTenantsData) {\n let reduceFunc;\n if (target.seriesAggFn === 'sum') {\n reduceFunc = (presentValues => presentValues.reduce((a,b) => a+b));\n } else {\n reduceFunc = (presentValues => presentValues.reduce((a,b) => a+b) / presentValues.length);\n }\n return _.flatten(multiTenantsData.map(tenantData => {\n if (tenantData.result) {\n let datapoints;\n const latestPoints = tenantData.result.filter(timeSeries => timeSeries.data.length > 0)\n .map(timeSeries => timeSeries.data[0]);\n if (latestPoints.length === 0) {\n datapoints = [];\n } else {\n datapoints = [[reduceFunc(latestPoints.map(dp => dp.value)), latestPoints[0].timestamp]];\n }\n return [{\n refId: target.refId,\n target: 'Aggregate',\n datapoints: datapoints\n }];\n }\n }));\n }\n\n tenantsPrefixer(allTenantTimeSeries) {\n // Exemple of input:\n // [ { tenant: 't1', result: [ {id: metricA, data: []} ] }, { tenant: 't2', result: [ {id: metricB, data: []} ] } ]\n const flatten = [];\n const prefixer = allTenantTimeSeries.length > 1 ? (tenant) => `[${tenant}] ` : (tenant) => '';\n allTenantTimeSeries.forEach(oneTenantTimeSeries => {\n if (oneTenantTimeSeries.result) {\n oneTenantTimeSeries.result.forEach(timeSeries => {\n timeSeries.prefix = prefixer(oneTenantTimeSeries.tenant);\n flatten.push(timeSeries);\n })\n }\n })\n return flatten;\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/queryProcessor.js"],"names":["STATS_BUCKETS","QueryProcessor","q","multiTenantsQuery","variablesHelper","capabilities","url","typeResources","numericMapping","point","value","timestamp","availMapping","legendRegexp","target","options","then","postData","start","range","from","valueOf","end","to","order","tenants","tenant","resolve","id","metricIds","caps","QUERY_POST_ENDPOINTS","raw","ids","rawQuery","timeAggFn","singleStatLiveQuery","limit","metrics","singleStatQuery","statsQuery","rawQueryLegacy","TAGS_QUERY_LANGUAGE","tagsQL","undefined","length","tags","resolveForQL","when","type","rate","tenantsPrefixer","res","processRawResponse","allSeries","all","map","encodeURIComponent","metric","replace","params","processRawResponseLegacy","refId","legend","timeSerie","prefix","datapoints","data","name","str","group","match","RegExp","exec","e","sortedData","sort","p1","p2","chain","zip","slice","filter","pair","point1","point2","value_diff","time_diff","seriesAggFn","statsQueryUnmerged","buckets","stacked","percentiles","getPercentilesToQuery","stats","join","processStatsResponse","multiTenantsData","flatten","prefixer","forEach","tenantData","result","percentile","getPercentileValue","stat","push","bucket","empty","findQuantileInBucket","types","metricsPerType","processUnmergedStatsResponse","series","allMetrics","metricId","hasOwnProperty","perc","percentileName","idx","indexOf","substring","quantile","percObj","find","p","toString","fnBucket","avg","min","max","processSingleStatResponse","Date","now","processSingleStatLiveResponse","reduceFunc","presentValues","reduce","a","b","latestPoints","timeSeries","dp","allTenantTimeSeries","oneTenantTimeSeries"],"mappings":"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","file":"queryProcessor.js","sourcesContent":["import _ from 'lodash';\nimport {modelToString as tagsModelToString} from './tagsKVPairsController';\n\nconst STATS_BUCKETS = 60;\n\nexport class QueryProcessor {\n\n constructor(q, multiTenantsQuery, variablesHelper, capabilities, url, typeResources) {\n this.q = q;\n this.multiTenantsQuery = multiTenantsQuery;\n this.variablesHelper = variablesHelper;\n this.capabilities = capabilities;\n this.url = url;\n this.typeResources = typeResources;\n this.numericMapping = point => [point.value, point.timestamp];\n this.availMapping = point => [point.value == 'up' ? 1 : 0, point.timestamp];\n this.legendRegexp = /{{(.+?)(?=}})}}/g;\n }\n\n run(target, options) {\n return this.capabilities.then(caps => {\n let postData = {\n start: options.range.from.valueOf(),\n end: options.range.to.valueOf(),\n order: 'ASC'\n };\n let tenants = [null];\n if (target.tenant) {\n tenants = this.variablesHelper.resolve(target.tenant, options);\n }\n if (target.id) {\n const metricIds = this.variablesHelper.resolve(target.id, options);\n if (caps.QUERY_POST_ENDPOINTS) {\n if (target.raw) {\n postData.ids = metricIds;\n return this.rawQuery(target, postData, tenants);\n } else if (target.timeAggFn == 'live') {\n // Need to change postData\n return this.singleStatLiveQuery(target, {ids: metricIds, limit: 1}, tenants);\n } else if (target.timeAggFn) {\n // Query single stat\n postData.metrics = metricIds;\n return this.singleStatQuery(target, postData, tenants);\n } else {\n // Query stats for chart\n postData.metrics = metricIds;\n return this.statsQuery(target, postData, tenants);\n }\n } else {\n return this.rawQueryLegacy(target, options.range, metricIds, tenants);\n }\n } else {\n if (caps.TAGS_QUERY_LANGUAGE) {\n if (target.tagsQL !== undefined && target.tagsQL.length > 0) {\n postData.tags = this.variablesHelper.resolveForQL(target.tagsQL, options);\n } else {\n return this.q.when([]);\n }\n } else {\n if (target.tags !== undefined && target.tags.length > 0) {\n postData.tags = tagsModelToString(target.tags, this.variablesHelper, options);\n } else {\n return this.q.when([]);\n }\n }\n if (target.raw) {\n return this.rawQuery(target, postData, tenants);\n } else if (target.timeAggFn == 'live') {\n // Need to change postData\n return this.singleStatLiveQuery(target, {tags: postData.tags, limit: 1}, tenants);\n } else if (target.timeAggFn) {\n // Query single stat\n return this.singleStatQuery(target, postData, tenants);\n } else {\n // Query stats for chart\n return this.statsQuery(target, postData, tenants);\n }\n }\n });\n }\n\n rawQuery(target, postData, tenants) {\n const url = `${this.url}/${this.typeResources[target.type]}/${target.rate ? 'rate' : 'raw'}/query`;\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(res => this.tenantsPrefixer(res))\n .then(allSeries => this.processRawResponse(target, allSeries));\n }\n\n rawQueryLegacy(target, range, metricIds, tenants) {\n return this.q.all(metricIds.map(metric => {\n const url = `${this.url}/${this.typeResources[target.type]}/${encodeURIComponent(metric).replace('+', '%20')}/data`;\n const params = {\n start: range.from.valueOf(),\n end: range.to.valueOf()\n };\n return this.multiTenantsQuery(tenants, url, params, null, 'GET')\n .then(res => this.tenantsPrefixer(res))\n .then(allSeries => this.processRawResponseLegacy(target, metric, allSeries));\n }));\n }\n\n processRawResponse(target, allSeries) {\n return allSeries.map(timeSerie => {\n return {\n refId: target.refId,\n target: this.legend(target, timeSerie.prefix + timeSerie.id),\n datapoints: timeSerie.data.map(target.type == 'availability' ? this.availMapping : this.numericMapping)\n };\n });\n }\n\n legend(target, name) {\n if (target.legend) {\n let legend = target.legend.replace(this.legendRegexp, function(str, group) {\n try {\n let match = new RegExp(group).exec(name);\n if (match && match.length > 1) {\n return match[1];\n }\n } catch(e) {\n }\n return str;\n });\n return legend;\n }\n return name;\n }\n\n processRawResponseLegacy(target, metric, data) {\n let datapoints;\n if (target.type == 'availability') {\n datapoints = data.map(this.availMapping);\n } else if (!target.rate) {\n datapoints = data.map(this.numericMapping);\n } else {\n let sortedData = data.sort((p1, p2)=> p1.timestamp - p2.timestamp);\n datapoints = _.chain(sortedData)\n .zip(sortedData.slice(1))\n .filter(pair => {\n return pair[1] // Exclude the last pair\n && (target.type != 'counter' || pair[0].value <= pair[1].value); // Exclude counter resets\n })\n .map(pair => {\n let point1 = pair[0], point2 = pair[1];\n let timestamp = point2.timestamp;\n let value_diff = point2.value - point1.value;\n let time_diff = point2.timestamp - point1.timestamp;\n let rate = 60000 * value_diff / time_diff;\n return [rate, timestamp];\n })\n .value();\n }\n return {\n refId: target.refId,\n target: metric,\n datapoints: datapoints\n };\n }\n\n statsQuery(target, postData, tenants) {\n if (target.seriesAggFn === 'none') {\n return this.statsQueryUnmerged(target, postData, tenants);\n }\n const url = `${this.url}/${this.typeResources[target.type]}/stats/query`;\n delete postData.order;\n postData.buckets = STATS_BUCKETS;\n postData.stacked = target.seriesAggFn === 'sum';\n const percentiles = this.getPercentilesToQuery(target.stats);\n if (percentiles.length > 0) {\n postData.percentiles = percentiles.join(',');\n }\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processStatsResponse(target, multiTenantsData));\n }\n\n processStatsResponse(target, multiTenantsData) {\n // Response example: [ { tenant: 't1', result: [...] }, { tenant: 't2', result: [...] } ]\n // Detailed `data[i].result`: [{start:1234, end:5678, avg:100.0, min:90.0, max:110.0, (...), percentiles:[{quantile: 90, value: 105.0}]}]\n const flatten = [];\n const prefixer = multiTenantsData.length > 1 ? (tenant) => `[${target.refId}: ${tenant}] ` : (tenant) => `[${target.refId}] `;\n multiTenantsData.forEach(tenantData => {\n if (tenantData.result) {\n target.stats.forEach(stat => {\n const percentile = this.getPercentileValue(stat);\n if (percentile) {\n flatten.push({\n refId: target.refId,\n target: this.legend(target, prefixer(tenantData.tenant) + stat),\n datapoints: tenantData.result.filter(bucket => !bucket.empty)\n .map(bucket => [this.findQuantileInBucket(percentile, bucket), bucket.start])\n });\n } else {\n flatten.push({\n refId: target.refId,\n target: this.legend(target, prefixer(tenantData.tenant) + stat),\n datapoints: tenantData.result.filter(bucket => !bucket.empty).map(bucket => [bucket[stat], bucket.start])\n });\n }\n });\n }\n });\n return flatten;\n }\n\n statsQueryUnmerged(target, postData, tenants) {\n const url = `${this.url}/metrics/stats/query`;\n delete postData.order;\n postData.buckets = STATS_BUCKETS;\n postData.types = [target.type];\n if (postData.metrics) {\n const metricsPerType = {};\n metricsPerType[target.type] = postData.metrics;\n postData.metrics = metricsPerType;\n }\n const percentiles = this.getPercentilesToQuery(target.stats);\n if (percentiles.length > 0) {\n postData.percentiles = percentiles.join(',');\n }\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processUnmergedStatsResponse(target, multiTenantsData));\n }\n\n processUnmergedStatsResponse(target, multiTenantsData) {\n // Response example: [ { tenant: 't1', result: {...} }, { tenant: 't2', result: {...} } ]\n // Detailed `data[i].result`:\n // {\"gauge\": {\"my_metric\": [\n // {start:1234, end:5678, avg:100.0, min:90.0, max:110.0, (...), percentiles:[{quantile: 90, value: 105.0}]}\n // ]}}\n const series = [];\n const prefixer = multiTenantsData.length > 1 ? (tenant) => `[${tenant}] ` : (tenant) => '';\n multiTenantsData.forEach(tenantData => {\n if (tenantData.result) {\n const allMetrics = tenantData.result[target.type];\n const prefix = prefixer(tenantData.tenant);\n for (let metricId in allMetrics) {\n if (allMetrics.hasOwnProperty(metricId)) {\n const buckets = allMetrics[metricId];\n target.stats.forEach(stat => {\n const percentile = this.getPercentileValue(stat);\n if (percentile) {\n series.push({\n refId: target.refId,\n target: this.legend(target, `${prefix}${metricId} [${stat}]`),\n datapoints: buckets.filter(bucket => !bucket.empty)\n .map(bucket => [this.findQuantileInBucket(percentile, bucket), bucket.start])\n });\n } else {\n series.push({\n refId: target.refId,\n target: this.legend(target, `${prefix}${metricId} [${stat}]`),\n datapoints: buckets.filter(bucket => !bucket.empty).map(bucket => [bucket[stat], bucket.start])\n });\n }\n });\n }\n }\n }\n });\n return series;\n }\n\n getPercentilesToQuery(stats) {\n return stats.map(this.getPercentileValue).filter(perc => perc != null);\n }\n\n getPercentileValue(percentileName) {\n const idx = percentileName.indexOf(' %ile');\n return (idx >= 0) ? percentileName.substring(0, idx) : null;\n }\n\n findQuantileInBucket(quantile, bucket) {\n if (bucket.percentiles) {\n const percObj = bucket.percentiles.find(p => p.quantile.toString().indexOf(quantile) >= 0);\n if (percObj) {\n return percObj.value;\n }\n }\n return null;\n }\n\n singleStatQuery(target, postData, tenants) {\n // Query for singlestat => we just ask for a single bucket\n // But because of that we need to override Grafana behaviour, and manage ourselves the min/max/avg/etc. selection\n let fnBucket;\n if (target.timeAggFn == 'avg') {\n fnBucket = bucket => bucket.avg;\n } else if (target.timeAggFn == 'min') {\n fnBucket = bucket => bucket.min;\n } else if (target.timeAggFn == 'max') {\n fnBucket = bucket => bucket.max;\n } // no else case. \"live\" case was handled before\n const url = `${this.url}/${this.typeResources[target.type]}/stats/query`;\n delete postData.order;\n postData.buckets = 1;\n postData.stacked = target.seriesAggFn === 'sum';\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processSingleStatResponse(target, fnBucket, multiTenantsData));\n }\n\n processSingleStatResponse(target, fnBucket, multiTenantsData) {\n return _.flatten(multiTenantsData.map(tenantData => {\n if (tenantData.result) {\n return tenantData.result.map(bucket => {\n return {\n refId: target.refId,\n target: 'Aggregate',\n datapoints: [[fnBucket(bucket), bucket.start]]\n };\n });\n }\n }));\n }\n\n singleStatLiveQuery(target, postData, tenants) {\n const url = `${this.url}/${this.typeResources[target.type]}/${target.rate ? 'rate' : 'raw'}/query`;\n // Set start to now - 5m\n postData.start = Date.now() - 300000;\n return this.multiTenantsQuery(tenants, url, null, postData, 'POST')\n .then(multiTenantsData => this.processSingleStatLiveResponse(target, multiTenantsData));\n }\n\n processSingleStatLiveResponse(target, multiTenantsData) {\n let reduceFunc;\n if (target.seriesAggFn === 'sum') {\n reduceFunc = (presentValues => presentValues.reduce((a,b) => a+b));\n } else {\n reduceFunc = (presentValues => presentValues.reduce((a,b) => a+b) / presentValues.length);\n }\n return _.flatten(multiTenantsData.map(tenantData => {\n if (tenantData.result) {\n let datapoints;\n const latestPoints = tenantData.result.filter(timeSeries => timeSeries.data.length > 0)\n .map(timeSeries => timeSeries.data[0]);\n if (latestPoints.length === 0) {\n datapoints = [];\n } else {\n datapoints = [[reduceFunc(latestPoints.map(dp => dp.value)), latestPoints[0].timestamp]];\n }\n return [{\n refId: target.refId,\n target: 'Aggregate',\n datapoints: datapoints\n }];\n }\n }));\n }\n\n tenantsPrefixer(allTenantTimeSeries) {\n // Exemple of input:\n // [ { tenant: 't1', result: [ {id: metricA, data: []} ] }, { tenant: 't2', result: [ {id: metricB, data: []} ] } ]\n const flatten = [];\n const prefixer = allTenantTimeSeries.length > 1 ? (tenant) => `[${tenant}] ` : (tenant) => '';\n allTenantTimeSeries.forEach(oneTenantTimeSeries => {\n if (oneTenantTimeSeries.result) {\n oneTenantTimeSeries.result.forEach(timeSeries => {\n timeSeries.prefix = prefixer(oneTenantTimeSeries.tenant);\n flatten.push(timeSeries);\n })\n }\n })\n return flatten;\n }\n}\n"]} \ No newline at end of file diff --git a/dist/test/spec/datasource-downsamples_spec.js b/dist/test/spec/datasource-downsamples_spec.js index 84bf286..985846c 100644 --- a/dist/test/spec/datasource-downsamples_spec.js +++ b/dist/test/spec/datasource-downsamples_spec.js @@ -229,6 +229,7 @@ describe('HawkularDatasource for downsamples', function () { to: 30 }, targets: [{ + refId: 'A', seriesAggFn: 'sum', stats: ['avg', '90 %ile'], tags: [{ name: 'type', value: 'memory' }], @@ -271,9 +272,9 @@ describe('HawkularDatasource for downsamples', function () { ctx.ds.query(options).then(function (result) { expect(result.data).to.have.length(2); - expect(result.data[1].target).to.equal('avg'); + expect(result.data[1].target).to.equal('[A] avg'); expect(result.data[1].datapoints).to.deep.equal([[20.25, 20], [23.25, 25]]); - expect(result.data[0].target).to.equal('90 %ile'); + expect(result.data[0].target).to.equal('[A] 90 %ile'); expect(result.data[0].datapoints).to.deep.equal([[23.1, 20], [26.1, 25]]); }).then(function (v) { return done(); diff --git a/dist/test/spec/datasource-downsamples_spec.js.map b/dist/test/spec/datasource-downsamples_spec.js.map index 8822ef0..1634492 100644 --- a/dist/test/spec/datasource-downsamples_spec.js.map +++ b/dist/test/spec/datasource-downsamples_spec.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../spec/datasource-downsamples_spec.js"],"names":["describe","ctx","instanceSettings","beforeEach","$q","backendSrv","datasourceRequest","when","data","templateSrv","replace","target","vars","ds","it","options","range","from","to","targets","seriesAggFn","timeAggFn","tags","name","value","type","rate","request","expect","deep","equal","start","end","buckets","stacked","status","min","max","avg","query","then","result","have","length","datapoints","done","err","limit","id","timestamp","stats","raw","percentiles","types"],"mappings":"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","file":"datasource-downsamples_spec.js","sourcesContent":["import {Datasource} from '../module';\nimport Q from 'q';\nimport {getSettings, expectRequest} from './test-util';\n\ndescribe('HawkularDatasource for downsamples', () => {\n let ctx = {};\n const instanceSettings = getSettings();\n\n beforeEach(() => {\n ctx.$q = Q;\n ctx.backendSrv = {};\n ctx.backendSrv.datasourceRequest = request => {\n return ctx.$q.when({data: {'Implementation-Version': '0.22.0'}})\n };\n ctx.templateSrv = {\n replace: (target, vars) => target\n };\n ctx.ds = new Datasource(instanceSettings, ctx.$q, ctx.backendSrv, ctx.templateSrv);\n });\n\n it('should return aggregated stats max/stacked', done => {\n\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n seriesAggFn: 'sum',\n timeAggFn: 'max',\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/stats/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n tags: 'type:memory',\n buckets: 1,\n stacked: true\n });\n\n return ctx.$q.when({\n status: 200,\n data: [{\n start: 13,\n end: 19,\n min: 35,\n max: 46,\n avg: 40.5\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(1);\n expect(result.data[0].datapoints).to.deep.equal([[46, 13]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should return aggregated stats avg/not stacked', done => {\n\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n seriesAggFn: 'avg',\n timeAggFn: 'avg',\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/stats/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n tags: 'type:memory',\n buckets: 1,\n stacked: false\n });\n\n return ctx.$q.when({\n status: 200,\n data: [{\n start: 13,\n end: 19,\n min: 15,\n max: 25,\n avg: 20.25\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(1);\n expect(result.data[0].datapoints).to.deep.equal([[20.25, 13]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should return live stats stacked', done => {\n\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n seriesAggFn: 'sum',\n timeAggFn: 'live',\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/raw/query');\n expect(request.data.limit).to.equal(1);\n expect(request.data.tags).to.equal('type:memory');\n\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'myhost.metric.memory.1',\n data: [{\n timestamp: 18,\n value: 21\n }]\n },{\n id: 'myhost.metric.memory.2',\n data: [{\n timestamp: 19,\n value: 25\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(1);\n expect(result.data[0].datapoints).to.deep.equal([[46, 18]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should return live stats not stacked', done => {\n\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n seriesAggFn: 'avg',\n timeAggFn: 'live',\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/raw/query');\n expect(request.data.limit).to.equal(1);\n expect(request.data.tags).to.equal('type:memory');\n\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'myhost.metric.memory.1',\n data: [{\n timestamp: 18,\n value: 21\n }]\n },{\n id: 'myhost.metric.memory.2',\n data: [{\n timestamp: 19,\n value: 25\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(1);\n expect(result.data[0].datapoints).to.deep.equal([[23, 18]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should query summed stats avg and percentile', done => {\n let options = {\n range: {\n from: 20,\n to: 30\n },\n targets: [{\n seriesAggFn: 'sum',\n stats: ['avg', '90 %ile'],\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false,\n raw: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/stats/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n tags: 'type:memory',\n percentiles: '90',\n buckets: 60,\n stacked: true\n });\n\n return ctx.$q.when({\n status: 200,\n data: [{\n start: 20,\n end: 25,\n min: 15,\n max: 25,\n avg: 20.25,\n percentiles: [{'value':23.1,'originalQuantile':'90','quantile':90.0}]\n }, {\n start: 25,\n end: 30,\n min: 18,\n max: 28,\n avg: 23.25,\n percentiles: [{'value':26.1,'originalQuantile':'90','quantile':90.0}]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(2);\n expect(result.data[1].target).to.equal('avg');\n expect(result.data[1].datapoints).to.deep.equal([[20.25, 20], [23.25, 25]]);\n expect(result.data[0].target).to.equal('90 %ile');\n expect(result.data[0].datapoints).to.deep.equal([[23.1, 20], [26.1, 25]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should query unmerged stats min and percentile', done => {\n let options = {\n range: {\n from: 20,\n to: 30\n },\n targets: [{\n seriesAggFn: 'none',\n stats: ['min', '95 %ile'],\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false,\n raw: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'metrics/stats/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n tags: 'type:memory',\n percentiles: '95',\n buckets: 60,\n types: ['gauge']\n });\n\n return ctx.$q.when({\n status: 200,\n data: {'gauge':\n { 'gauge_1':\n [{\n start: 20,\n end: 25,\n min: 15,\n max: 25,\n avg: 20.25,\n percentiles: [{'value':23.1,'originalQuantile':'95','quantile':95.0}]\n }, {\n start: 25,\n end: 30,\n min: 18,\n max: 28,\n avg: 23.25,\n percentiles: [{'value':26.1,'originalQuantile':'95','quantile':95.0}]\n }],\n 'gauge_2':\n [{\n start: 20,\n end: 25,\n min: 20,\n max: 30,\n avg: 25.25,\n percentiles: [{'value':28.1,'originalQuantile':'95','quantile':95.0}]\n }, {\n start: 25,\n end: 30,\n min: 23,\n max: 33,\n avg: 28.25,\n percentiles: [{'value':31.1,'originalQuantile':'95','quantile':95.0}]\n }]\n }\n }\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(4);\n expect(result.data[1].target).to.equal('gauge_1 [min]');\n expect(result.data[1].datapoints).to.deep.equal([[15, 20], [18, 25]]);\n expect(result.data[0].target).to.equal('gauge_1 [95 %ile]');\n expect(result.data[0].datapoints).to.deep.equal([[23.1, 20], [26.1, 25]]);\n expect(result.data[3].target).to.equal('gauge_2 [min]');\n expect(result.data[3].datapoints).to.deep.equal([[20, 20], [23, 25]]);\n expect(result.data[2].target).to.equal('gauge_2 [95 %ile]');\n expect(result.data[2].datapoints).to.deep.equal([[28.1, 20], [31.1, 25]]);\n }).then(v => done(), err => done(err));\n });\n});\n"]} \ No newline at end of file +{"version":3,"sources":["../../../spec/datasource-downsamples_spec.js"],"names":["describe","ctx","instanceSettings","beforeEach","$q","backendSrv","datasourceRequest","when","data","templateSrv","replace","target","vars","ds","it","options","range","from","to","targets","seriesAggFn","timeAggFn","tags","name","value","type","rate","request","expect","deep","equal","start","end","buckets","stacked","status","min","max","avg","query","then","result","have","length","datapoints","done","err","limit","id","timestamp","refId","stats","raw","percentiles","types"],"mappings":"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","file":"datasource-downsamples_spec.js","sourcesContent":["import {Datasource} from '../module';\nimport Q from 'q';\nimport {getSettings, expectRequest} from './test-util';\n\ndescribe('HawkularDatasource for downsamples', () => {\n let ctx = {};\n const instanceSettings = getSettings();\n\n beforeEach(() => {\n ctx.$q = Q;\n ctx.backendSrv = {};\n ctx.backendSrv.datasourceRequest = request => {\n return ctx.$q.when({data: {'Implementation-Version': '0.22.0'}})\n };\n ctx.templateSrv = {\n replace: (target, vars) => target\n };\n ctx.ds = new Datasource(instanceSettings, ctx.$q, ctx.backendSrv, ctx.templateSrv);\n });\n\n it('should return aggregated stats max/stacked', done => {\n\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n seriesAggFn: 'sum',\n timeAggFn: 'max',\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/stats/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n tags: 'type:memory',\n buckets: 1,\n stacked: true\n });\n\n return ctx.$q.when({\n status: 200,\n data: [{\n start: 13,\n end: 19,\n min: 35,\n max: 46,\n avg: 40.5\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(1);\n expect(result.data[0].datapoints).to.deep.equal([[46, 13]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should return aggregated stats avg/not stacked', done => {\n\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n seriesAggFn: 'avg',\n timeAggFn: 'avg',\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/stats/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n tags: 'type:memory',\n buckets: 1,\n stacked: false\n });\n\n return ctx.$q.when({\n status: 200,\n data: [{\n start: 13,\n end: 19,\n min: 15,\n max: 25,\n avg: 20.25\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(1);\n expect(result.data[0].datapoints).to.deep.equal([[20.25, 13]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should return live stats stacked', done => {\n\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n seriesAggFn: 'sum',\n timeAggFn: 'live',\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/raw/query');\n expect(request.data.limit).to.equal(1);\n expect(request.data.tags).to.equal('type:memory');\n\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'myhost.metric.memory.1',\n data: [{\n timestamp: 18,\n value: 21\n }]\n },{\n id: 'myhost.metric.memory.2',\n data: [{\n timestamp: 19,\n value: 25\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(1);\n expect(result.data[0].datapoints).to.deep.equal([[46, 18]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should return live stats not stacked', done => {\n\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n seriesAggFn: 'avg',\n timeAggFn: 'live',\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/raw/query');\n expect(request.data.limit).to.equal(1);\n expect(request.data.tags).to.equal('type:memory');\n\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'myhost.metric.memory.1',\n data: [{\n timestamp: 18,\n value: 21\n }]\n },{\n id: 'myhost.metric.memory.2',\n data: [{\n timestamp: 19,\n value: 25\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(1);\n expect(result.data[0].datapoints).to.deep.equal([[23, 18]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should query summed stats avg and percentile', done => {\n let options = {\n range: {\n from: 20,\n to: 30\n },\n targets: [{\n refId: 'A',\n seriesAggFn: 'sum',\n stats: ['avg', '90 %ile'],\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false,\n raw: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/stats/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n tags: 'type:memory',\n percentiles: '90',\n buckets: 60,\n stacked: true\n });\n\n return ctx.$q.when({\n status: 200,\n data: [{\n start: 20,\n end: 25,\n min: 15,\n max: 25,\n avg: 20.25,\n percentiles: [{'value':23.1,'originalQuantile':'90','quantile':90.0}]\n }, {\n start: 25,\n end: 30,\n min: 18,\n max: 28,\n avg: 23.25,\n percentiles: [{'value':26.1,'originalQuantile':'90','quantile':90.0}]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(2);\n expect(result.data[1].target).to.equal('[A] avg');\n expect(result.data[1].datapoints).to.deep.equal([[20.25, 20], [23.25, 25]]);\n expect(result.data[0].target).to.equal('[A] 90 %ile');\n expect(result.data[0].datapoints).to.deep.equal([[23.1, 20], [26.1, 25]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should query unmerged stats min and percentile', done => {\n let options = {\n range: {\n from: 20,\n to: 30\n },\n targets: [{\n seriesAggFn: 'none',\n stats: ['min', '95 %ile'],\n tags: [{name: 'type', value: 'memory'}],\n type: 'gauge',\n rate: false,\n raw: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'metrics/stats/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n tags: 'type:memory',\n percentiles: '95',\n buckets: 60,\n types: ['gauge']\n });\n\n return ctx.$q.when({\n status: 200,\n data: {'gauge':\n { 'gauge_1':\n [{\n start: 20,\n end: 25,\n min: 15,\n max: 25,\n avg: 20.25,\n percentiles: [{'value':23.1,'originalQuantile':'95','quantile':95.0}]\n }, {\n start: 25,\n end: 30,\n min: 18,\n max: 28,\n avg: 23.25,\n percentiles: [{'value':26.1,'originalQuantile':'95','quantile':95.0}]\n }],\n 'gauge_2':\n [{\n start: 20,\n end: 25,\n min: 20,\n max: 30,\n avg: 25.25,\n percentiles: [{'value':28.1,'originalQuantile':'95','quantile':95.0}]\n }, {\n start: 25,\n end: 30,\n min: 23,\n max: 33,\n avg: 28.25,\n percentiles: [{'value':31.1,'originalQuantile':'95','quantile':95.0}]\n }]\n }\n }\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(4);\n expect(result.data[1].target).to.equal('gauge_1 [min]');\n expect(result.data[1].datapoints).to.deep.equal([[15, 20], [18, 25]]);\n expect(result.data[0].target).to.equal('gauge_1 [95 %ile]');\n expect(result.data[0].datapoints).to.deep.equal([[23.1, 20], [26.1, 25]]);\n expect(result.data[3].target).to.equal('gauge_2 [min]');\n expect(result.data[3].datapoints).to.deep.equal([[20, 20], [23, 25]]);\n expect(result.data[2].target).to.equal('gauge_2 [95 %ile]');\n expect(result.data[2].datapoints).to.deep.equal([[28.1, 20], [31.1, 25]]);\n }).then(v => done(), err => done(err));\n });\n});\n"]} \ No newline at end of file diff --git a/dist/test/spec/datasource_spec.js b/dist/test/spec/datasource_spec.js index e079b4d..23d136c 100644 --- a/dist/test/spec/datasource_spec.js +++ b/dist/test/spec/datasource_spec.js @@ -365,5 +365,23 @@ describe('HawkularDatasource', function () { return done(err); }); }); + + it('should get name without legend', function (done) { + var legend = ctx.ds.queryProcessor.legend({}, "my-metric"); + expect(legend).to.equal('my-metric'); + done(); + }); + + it('should get simple legend', function (done) { + var legend = ctx.ds.queryProcessor.legend({ legend: "my-legend" }, "my-metric"); + expect(legend).to.equal('my-legend'); + done(); + }); + + it('should resolve regex in legend', function (done) { + var legend = ctx.ds.queryProcessor.legend({ legend: "my-legend {{a}} {{foo=([^,}]+)}} {{foo2=([^,}]+)}}" }, "my-metric{foo=bar,foo2=bar2}"); + expect(legend).to.equal('my-legend {{a}} bar bar2'); + done(); + }); }); //# sourceMappingURL=datasource_spec.js.map diff --git a/dist/test/spec/datasource_spec.js.map b/dist/test/spec/datasource_spec.js.map index 296c6eb..4496dea 100644 --- a/dist/test/spec/datasource_spec.js.map +++ b/dist/test/spec/datasource_spec.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../spec/datasource_spec.js"],"names":["describe","ctx","instanceSettings","beforeEach","$q","backendSrv","datasourceRequest","when","data","templateSrv","replace","target","vars","ds","it","query","targets","then","expect","result","to","have","property","with","length","done","err","options","range","from","id","type","rate","first","request","deep","equal","start","end","ids","order","status","timestamp","value","map","t","include","members","datapoints","variables","name","url","string","tags","dataRetention","suggestMetrics","tagsQL","text","suggestTags","suggestTagKeys"],"mappings":"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","file":"datasource_spec.js","sourcesContent":["import {Datasource} from '../module';\nimport Q from 'q';\nimport {getSettings, expectRequest} from './test-util';\n\ndescribe('HawkularDatasource', () => {\n let ctx = {};\n const instanceSettings = getSettings();\n\n beforeEach(() => {\n ctx.$q = Q;\n ctx.backendSrv = {};\n ctx.backendSrv.datasourceRequest = request => {\n return ctx.$q.when({data: {'Implementation-Version': '0.22.0'}})\n };\n ctx.templateSrv = {\n replace: (target, vars) => target\n };\n ctx.ds = new Datasource(instanceSettings, ctx.$q, ctx.backendSrv, ctx.templateSrv);\n });\n\n it('should return an empty array when no targets are set', done => {\n ctx.ds.query({targets: []}).then(result => {\n expect(result).to.have.property('data').with.length(0);\n }).then(v => done(), err => done(err));\n });\n\n it('should return the server results when a target is set', done => {\n\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n id: 'memory',\n type: 'gauge',\n rate: false\n }, {\n id: 'packets',\n type: 'counter',\n rate: true\n }]\n };\n\n let first = true;\n let id;\n ctx.backendSrv.datasourceRequest = request => {\n if (first) {\n first = false;\n id = 'memory';\n expectRequest(request, 'POST', 'gauges/raw/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n ids: [id],\n order: 'ASC'\n });\n } else {\n id = 'packets';\n expectRequest(request, 'POST', 'counters/rate/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n ids: [id],\n order: 'ASC'\n });\n }\n\n return ctx.$q.when({\n status: 200,\n data: [{\n id: id,\n data: [{\n timestamp: 13,\n value: 15\n }, {\n timestamp: 19,\n value: 21\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(2);\n expect(result.data.map(t => t.target)).to.include.members(['memory', 'packets']);\n expect(result.data[0].datapoints).to.deep.equal([[15, 13], [21, 19]]);\n expect(result.data[1].datapoints).to.deep.equal([[15, 13], [21, 19]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should return multiple results with templated target', done => {\n\n const options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n id: '$app/memory',\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.templateSrv.variables = [{\n name: 'app'\n }];\n ctx.templateSrv.replace = (target, vars) => {\n expect(target).to.equal('$app');\n return '{app_1,app_2}';\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expect(request.url).to.have.string('gauges/raw/query');\n expect(request.data.ids).to.include.members(['app_1/memory', 'app_2/memory']);\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'app_1/memory',\n data: [{\n timestamp: 13,\n value: 15\n }, {\n timestamp: 19,\n value: 21\n }]\n },{\n id: 'app_2/memory',\n data: [{\n timestamp: 13,\n value: 28\n }, {\n timestamp: 19,\n value: 32\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(2);\n expect(result.data.map(t => t.target)).to.include.members(['app_1/memory', 'app_2/memory']);\n expect(result.data[0].datapoints).to.deep.equal([[15, 13], [21, 19]]);\n expect(result.data[1].datapoints).to.deep.equal([[28, 13], [32, 19]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should query by tags', done => {\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n tags: [\n {name: 'type', value: 'memory'},\n {name: 'host', value: 'myhost'}\n ],\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/raw/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n tags: 'type:memory,host:myhost',\n order: 'ASC'\n });\n\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'myhost.metric.memory.1',\n data: [{\n timestamp: 13,\n value: 15\n }, {\n timestamp: 19,\n value: 21\n }]\n },{\n id: 'myhost.metric.memory.2',\n data: [{\n timestamp: 13,\n value: 20\n }, {\n timestamp: 19,\n value: 25\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(2);\n expect(result.data.map(t => t.target)).to.include.members(['myhost.metric.memory.1', 'myhost.metric.memory.2']);\n expect(result.data[0].datapoints).to.deep.equal([[15, 13], [21, 19]]);\n expect(result.data[1].datapoints).to.deep.equal([[20, 13], [25, 19]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should query availability', done => {\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n id: 'myapp/health',\n type: 'availability'\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'availability/raw/query');\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'myapp/health',\n data: [{\n timestamp: 13,\n value: 'up'\n }, {\n timestamp: 19,\n value: 'down'\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(1);\n expect(result.data[0].target).to.equal('myapp/health');\n expect(result.data[0].datapoints).to.deep.equal([[1, 13], [0, 19]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should suggest metrics', done => {\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'GET', 'metrics?type=gauge&tags=host=cartago');\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'gauge_1',\n tags: {\n 'host': 'cartago'\n },\n dataRetention: 7,\n type: 'gauge'\n },{\n id: 'gauge_2',\n tags: {\n 'host': 'cartago'\n },\n dataRetention: 7,\n type: 'gauge'\n }]\n });\n };\n\n ctx.ds.suggestMetrics({type: 'gauge', tagsQL: 'host=cartago'}).then(result => {\n expect(result).to.have.length(2);\n expect(result[0]).to.deep.equal({ text: 'gauge_1', value: 'gauge_1' });\n expect(result[1]).to.deep.equal({ text: 'gauge_2', value: 'gauge_2' });\n }).then(v => done(), err => done(err));\n });\n\n it('should get tags suggestions', done => {\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'GET', 'gauges/tags/host:*');\n\n return ctx.$q.when({\n status: 200,\n data: {\n 'host': ['cartago', 'rio']\n }\n });\n };\n\n ctx.ds.suggestTags({type: 'gauge'}, 'host').then(result => {\n expect(result).to.have.length(2);\n expect(result[0]).to.deep.equal({ text: 'cartago', value: 'cartago' });\n expect(result[1]).to.deep.equal({ text: 'rio', value: 'rio' });\n }).then(v => done(), err => done(err));\n });\n\n it('should get no suggestions on unknown tag', done => {\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'GET', 'gauges/tags/host:*');\n return ctx.$q.when({\n status: 204,\n data: {}\n });\n };\n ctx.ds.suggestTags({type: 'gauge'}, 'host').then(result => {\n expect(result).to.have.length(0);\n }).then(v => done(), err => done(err));\n });\n\n it('should get tag keys suggestions', done => {\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'GET', 'metrics/tags');\n return ctx.$q.when({\n status: 200,\n data: ['host', 'app']\n });\n };\n\n ctx.ds.suggestTagKeys({}).then(result => {\n expect(result).to.have.length(2);\n expect(result[0]).to.deep.equal({ text: 'host', value: 'host' });\n expect(result[1]).to.deep.equal({ text: 'app', value: 'app' });\n }).then(v => done(), err => done(err));\n });\n});\n"]} \ No newline at end of file +{"version":3,"sources":["../../../spec/datasource_spec.js"],"names":["describe","ctx","instanceSettings","beforeEach","$q","backendSrv","datasourceRequest","when","data","templateSrv","replace","target","vars","ds","it","query","targets","then","expect","result","to","have","property","with","length","done","err","options","range","from","id","type","rate","first","request","deep","equal","start","end","ids","order","status","timestamp","value","map","t","include","members","datapoints","variables","name","url","string","tags","dataRetention","suggestMetrics","tagsQL","text","suggestTags","suggestTagKeys","legend","queryProcessor"],"mappings":"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","file":"datasource_spec.js","sourcesContent":["import {Datasource} from '../module';\nimport Q from 'q';\nimport {getSettings, expectRequest} from './test-util';\n\ndescribe('HawkularDatasource', () => {\n let ctx = {};\n const instanceSettings = getSettings();\n\n beforeEach(() => {\n ctx.$q = Q;\n ctx.backendSrv = {};\n ctx.backendSrv.datasourceRequest = request => {\n return ctx.$q.when({data: {'Implementation-Version': '0.22.0'}})\n };\n ctx.templateSrv = {\n replace: (target, vars) => target\n };\n ctx.ds = new Datasource(instanceSettings, ctx.$q, ctx.backendSrv, ctx.templateSrv);\n });\n\n it('should return an empty array when no targets are set', done => {\n ctx.ds.query({targets: []}).then(result => {\n expect(result).to.have.property('data').with.length(0);\n }).then(v => done(), err => done(err));\n });\n\n it('should return the server results when a target is set', done => {\n\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n id: 'memory',\n type: 'gauge',\n rate: false\n }, {\n id: 'packets',\n type: 'counter',\n rate: true\n }]\n };\n\n let first = true;\n let id;\n ctx.backendSrv.datasourceRequest = request => {\n if (first) {\n first = false;\n id = 'memory';\n expectRequest(request, 'POST', 'gauges/raw/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n ids: [id],\n order: 'ASC'\n });\n } else {\n id = 'packets';\n expectRequest(request, 'POST', 'counters/rate/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n ids: [id],\n order: 'ASC'\n });\n }\n\n return ctx.$q.when({\n status: 200,\n data: [{\n id: id,\n data: [{\n timestamp: 13,\n value: 15\n }, {\n timestamp: 19,\n value: 21\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(2);\n expect(result.data.map(t => t.target)).to.include.members(['memory', 'packets']);\n expect(result.data[0].datapoints).to.deep.equal([[15, 13], [21, 19]]);\n expect(result.data[1].datapoints).to.deep.equal([[15, 13], [21, 19]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should return multiple results with templated target', done => {\n\n const options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n id: '$app/memory',\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.templateSrv.variables = [{\n name: 'app'\n }];\n ctx.templateSrv.replace = (target, vars) => {\n expect(target).to.equal('$app');\n return '{app_1,app_2}';\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expect(request.url).to.have.string('gauges/raw/query');\n expect(request.data.ids).to.include.members(['app_1/memory', 'app_2/memory']);\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'app_1/memory',\n data: [{\n timestamp: 13,\n value: 15\n }, {\n timestamp: 19,\n value: 21\n }]\n },{\n id: 'app_2/memory',\n data: [{\n timestamp: 13,\n value: 28\n }, {\n timestamp: 19,\n value: 32\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(2);\n expect(result.data.map(t => t.target)).to.include.members(['app_1/memory', 'app_2/memory']);\n expect(result.data[0].datapoints).to.deep.equal([[15, 13], [21, 19]]);\n expect(result.data[1].datapoints).to.deep.equal([[28, 13], [32, 19]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should query by tags', done => {\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n tags: [\n {name: 'type', value: 'memory'},\n {name: 'host', value: 'myhost'}\n ],\n type: 'gauge',\n rate: false\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'gauges/raw/query');\n expect(request.data).to.deep.equal({\n start: options.range.from,\n end: options.range.to,\n tags: 'type:memory,host:myhost',\n order: 'ASC'\n });\n\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'myhost.metric.memory.1',\n data: [{\n timestamp: 13,\n value: 15\n }, {\n timestamp: 19,\n value: 21\n }]\n },{\n id: 'myhost.metric.memory.2',\n data: [{\n timestamp: 13,\n value: 20\n }, {\n timestamp: 19,\n value: 25\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(2);\n expect(result.data.map(t => t.target)).to.include.members(['myhost.metric.memory.1', 'myhost.metric.memory.2']);\n expect(result.data[0].datapoints).to.deep.equal([[15, 13], [21, 19]]);\n expect(result.data[1].datapoints).to.deep.equal([[20, 13], [25, 19]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should query availability', done => {\n let options = {\n range: {\n from: 15,\n to: 30\n },\n targets: [{\n id: 'myapp/health',\n type: 'availability'\n }]\n };\n\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'POST', 'availability/raw/query');\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'myapp/health',\n data: [{\n timestamp: 13,\n value: 'up'\n }, {\n timestamp: 19,\n value: 'down'\n }]\n }]\n });\n };\n\n ctx.ds.query(options).then(result => {\n expect(result.data).to.have.length(1);\n expect(result.data[0].target).to.equal('myapp/health');\n expect(result.data[0].datapoints).to.deep.equal([[1, 13], [0, 19]]);\n }).then(v => done(), err => done(err));\n });\n\n it('should suggest metrics', done => {\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'GET', 'metrics?type=gauge&tags=host=cartago');\n return ctx.$q.when({\n status: 200,\n data: [{\n id: 'gauge_1',\n tags: {\n 'host': 'cartago'\n },\n dataRetention: 7,\n type: 'gauge'\n },{\n id: 'gauge_2',\n tags: {\n 'host': 'cartago'\n },\n dataRetention: 7,\n type: 'gauge'\n }]\n });\n };\n\n ctx.ds.suggestMetrics({type: 'gauge', tagsQL: 'host=cartago'}).then(result => {\n expect(result).to.have.length(2);\n expect(result[0]).to.deep.equal({ text: 'gauge_1', value: 'gauge_1' });\n expect(result[1]).to.deep.equal({ text: 'gauge_2', value: 'gauge_2' });\n }).then(v => done(), err => done(err));\n });\n\n it('should get tags suggestions', done => {\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'GET', 'gauges/tags/host:*');\n\n return ctx.$q.when({\n status: 200,\n data: {\n 'host': ['cartago', 'rio']\n }\n });\n };\n\n ctx.ds.suggestTags({type: 'gauge'}, 'host').then(result => {\n expect(result).to.have.length(2);\n expect(result[0]).to.deep.equal({ text: 'cartago', value: 'cartago' });\n expect(result[1]).to.deep.equal({ text: 'rio', value: 'rio' });\n }).then(v => done(), err => done(err));\n });\n\n it('should get no suggestions on unknown tag', done => {\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'GET', 'gauges/tags/host:*');\n return ctx.$q.when({\n status: 204,\n data: {}\n });\n };\n ctx.ds.suggestTags({type: 'gauge'}, 'host').then(result => {\n expect(result).to.have.length(0);\n }).then(v => done(), err => done(err));\n });\n\n it('should get tag keys suggestions', done => {\n ctx.backendSrv.datasourceRequest = request => {\n expectRequest(request, 'GET', 'metrics/tags');\n return ctx.$q.when({\n status: 200,\n data: ['host', 'app']\n });\n };\n\n ctx.ds.suggestTagKeys({}).then(result => {\n expect(result).to.have.length(2);\n expect(result[0]).to.deep.equal({ text: 'host', value: 'host' });\n expect(result[1]).to.deep.equal({ text: 'app', value: 'app' });\n }).then(v => done(), err => done(err));\n });\n\n it('should get name without legend', done => {\n let legend = ctx.ds.queryProcessor.legend({}, \"my-metric\");\n expect(legend).to.equal('my-metric');\n done();\n });\n\n it('should get simple legend', done => {\n let legend = ctx.ds.queryProcessor.legend({legend: \"my-legend\"}, \"my-metric\");\n expect(legend).to.equal('my-legend');\n done();\n });\n\n it('should resolve regex in legend', done => {\n let legend = ctx.ds.queryProcessor.legend({legend: \"my-legend {{a}} {{foo=([^,}]+)}} {{foo2=([^,}]+)}}\"},\n \"my-metric{foo=bar,foo2=bar2}\");\n expect(legend).to.equal('my-legend {{a}} bar bar2');\n done();\n });\n});\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 3419934..18be281 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawkular-grafana-datasource", - "version": "1.1.1", + "version": "1.1.2", "description": "Hawkular Datasource for Grafana", "homepage": "https://github.com/hawkular/hawkular-grafana-datasource", "repository": { diff --git a/plugin.json b/plugin.json index a04faf1..d5becf4 100644 --- a/plugin.json +++ b/plugin.json @@ -24,8 +24,8 @@ "url": "https://github.com/hawkular/hawkular-grafana-datasource" } ], - "version": "1.1.1", - "updated": "2017-11-14" + "version": "1.1.2", + "updated": "2018-02-09" }, "dependencies": { "grafanaVersion": "3.x.x",