diff --git a/public/app/core/components/code_editor/code_editor.ts b/public/app/core/components/code_editor/code_editor.ts
index 6e6900b004f..854d6cabe4d 100644
--- a/public/app/core/components/code_editor/code_editor.ts
+++ b/public/app/core/components/code_editor/code_editor.ts
@@ -23,7 +23,7 @@
*/
///
-
+import _ from 'lodash';
import coreModule from 'app/core/core_module';
import ace from 'ace';
@@ -33,14 +33,23 @@ const DEFAULT_MODE = "text";
const DEFAULT_MAX_LINES = 10;
const DEFAULT_TAB_SIZE = 2;
+const GRAFANA_MODULES = ['mode-prometheus', 'snippets-prometheus'];
+const GRAFANA_MODULE_BASE = "public/app/core/components/code_editor/";
+
// Trick for loading additional modules
function fixModuleUrl(moduleType, name) {
+ let baseUrl = ACE_SRC_BASE;
let aceModeName = `ace/${moduleType}/${name}`;
- let componentName = `${moduleType}-${name}.js`;
+ let moduleName = `${moduleType}-${name}`;
+ let componentName = `${moduleName}.js`;
+
+ if (_.includes(GRAFANA_MODULES, moduleName)) {
+ baseUrl = GRAFANA_MODULE_BASE;
+ }
if (moduleType === 'snippets') {
componentName = `${moduleType}/${name}.js`;
}
- ace.config.setModuleUrl(aceModeName, ACE_SRC_BASE + componentName);
+ ace.config.setModuleUrl(aceModeName, baseUrl + componentName);
}
fixModuleUrl("ext", "language_tools");
diff --git a/public/app/core/components/code_editor/mode-prometheus.js b/public/app/core/components/code_editor/mode-prometheus.js
new file mode 100644
index 00000000000..aa0300b50a5
--- /dev/null
+++ b/public/app/core/components/code_editor/mode-prometheus.js
@@ -0,0 +1,88 @@
+// jshint ignore: start
+// jscs: disable
+ace.define("ace/mode/prometheus_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) {
+"use strict";
+
+var oop = require("../lib/oop");
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
+
+var PrometheusHighlightRules = function() {
+ var keywords = (
+ "by|without|keep_common|offset|bool|and|or|unless|ignoring|on|group_left|group_right|" +
+ "count|count_values|min|max|avg|sum|stddev|stdvar|bottomk|topk|quantile"
+ );
+
+ var builtinConstants = (
+ "true|false|null|__name__|job"
+ );
+
+ var builtinFunctions = (
+ "abs|absent|ceil|changes|clamp_max|clamp_min|count_scalar|day_of_month|day_of_week|days_in_month|delta|deriv|" + "drop_common_labels|exp|floor|histogram_quantile|holt_winters|hour|idelta|increase|irate|label_replace|ln|log2|" +
+ "log10|minute|month|predict_linear|rate|resets|round|scalar|sort|sort_desc|sqrt|time|vector|year|avg_over_time|" +
+ "min_over_time|max_over_time|sum_over_time|count_over_time|quantile_over_time|stddev_over_time|stdvar_over_time"
+ );
+
+ var keywordMapper = this.createKeywordMapper({
+ "support.function": builtinFunctions,
+ "keyword": keywords,
+ "constant.language": builtinConstants
+ }, "identifier", true);
+
+ this.$rules = {
+ "start" : [ {
+ token : "string", // single line
+ regex : /"(?:[^"\\]|\\.)*?"/
+ }, {
+ token : "string", // string
+ regex : "'.*?'"
+ }, {
+ token : "constant.numeric", // float
+ regex : "[-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
+ }, {
+ token : "constant.language", // time
+ regex : "\\d+[smhdwy]"
+ }, {
+ token : keywordMapper,
+ regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
+ }, {
+ token : "keyword.operator",
+ regex : "\\+|\\-|\\*|\\/|%|\\^|=|==|!=|<=|>=|<|>|=~|!~"
+ }, {
+ token : "paren.lparen",
+ regex : "[\\(]"
+ }, {
+ token : "paren.rparen",
+ regex : "[\\)]"
+ }, {
+ token : "text",
+ regex : "\\s+"
+ } ]
+ };
+};
+
+oop.inherits(PrometheusHighlightRules, TextHighlightRules);
+
+exports.PrometheusHighlightRules = PrometheusHighlightRules;
+});
+
+ace.define("ace/mode/prometheus",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/prometheus_highlight_rules"], function(require, exports, module) {
+"use strict";
+
+var oop = require("../lib/oop");
+var TextMode = require("./text").Mode;
+var PrometheusHighlightRules = require("./prometheus_highlight_rules").PrometheusHighlightRules;
+
+var Mode = function() {
+ this.HighlightRules = PrometheusHighlightRules;
+ this.$behaviour = this.$defaultBehaviour;
+};
+oop.inherits(Mode, TextMode);
+
+(function() {
+
+ this.$id = "ace/mode/prometheus";
+}).call(Mode.prototype);
+
+exports.Mode = Mode;
+
+});
diff --git a/public/app/core/components/code_editor/snippets/prometheus.js b/public/app/core/components/code_editor/snippets/prometheus.js
new file mode 100644
index 00000000000..522fa62b531
--- /dev/null
+++ b/public/app/core/components/code_editor/snippets/prometheus.js
@@ -0,0 +1,9 @@
+// jshint ignore: start
+// jscs: disable
+ace.define("ace/snippets/prometheus",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "prometheus";
+
+});
diff --git a/public/app/plugins/datasource/prometheus/partials/query.editor.html b/public/app/plugins/datasource/prometheus/partials/query.editor.html
index d22672b5a85..206c2f012cf 100644
--- a/public/app/plugins/datasource/prometheus/partials/query.editor.html
+++ b/public/app/plugins/datasource/prometheus/partials/query.editor.html
@@ -7,7 +7,7 @@