query_ctrl.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import angular from "angular";
  2. import _ from "lodash";
  3. import { QueryCtrl } from "app/plugins/sdk";
  4. import { PromCompleter } from "./completer";
  5. import "./mode-prometheus";
  6. import "./snippets/prometheus";
  7. class PrometheusQueryCtrl extends QueryCtrl {
  8. static templateUrl = "partials/query.editor.html";
  9. metric: any;
  10. resolutions: any;
  11. formats: any;
  12. instant: any;
  13. oldTarget: any;
  14. suggestMetrics: any;
  15. getMetricsAutocomplete: any;
  16. linkToPrometheus: any;
  17. /** @ngInject */
  18. constructor($scope, $injector, private templateSrv) {
  19. super($scope, $injector);
  20. var target = this.target;
  21. target.expr = target.expr || "";
  22. target.intervalFactor = target.intervalFactor || 1;
  23. target.format = target.format || this.getDefaultFormat();
  24. this.metric = "";
  25. this.resolutions = _.map([1, 2, 3, 4, 5, 10], function(f) {
  26. return { factor: f, label: "1/" + f };
  27. });
  28. this.formats = [
  29. { text: "Time series", value: "time_series" },
  30. { text: "Table", value: "table" }
  31. ];
  32. this.instant = false;
  33. this.updateLink();
  34. }
  35. getCompleter(query) {
  36. return new PromCompleter(this.datasource);
  37. }
  38. getDefaultFormat() {
  39. if (this.panelCtrl.panel.type === "table") {
  40. return "table";
  41. }
  42. return "time_series";
  43. }
  44. refreshMetricData() {
  45. if (!_.isEqual(this.oldTarget, this.target)) {
  46. this.oldTarget = angular.copy(this.target);
  47. this.panelCtrl.refresh();
  48. this.updateLink();
  49. }
  50. }
  51. updateLink() {
  52. var range = this.panelCtrl.range;
  53. if (!range) {
  54. return;
  55. }
  56. var rangeDiff = Math.ceil(
  57. (range.to.valueOf() - range.from.valueOf()) / 1000
  58. );
  59. var endTime = range.to.utc().format("YYYY-MM-DD HH:mm");
  60. var expr = {
  61. "g0.expr": this.templateSrv.replace(
  62. this.target.expr,
  63. this.panelCtrl.panel.scopedVars,
  64. this.datasource.interpolateQueryExpr
  65. ),
  66. "g0.range_input": rangeDiff + "s",
  67. "g0.end_input": endTime,
  68. "g0.step_input": this.target.step,
  69. "g0.stacked": this.panelCtrl.panel.stack ? 1 : 0,
  70. "g0.tab": 0
  71. };
  72. var args = _.map(expr, (v, k) => {
  73. return k + "=" + encodeURIComponent(v);
  74. }).join("&");
  75. this.linkToPrometheus = this.datasource.directUrl + "/graph?" + args;
  76. }
  77. getCollapsedText() {
  78. return this.target.expr;
  79. }
  80. }
  81. export { PrometheusQueryCtrl };