summaryrefslogtreecommitdiffstats
path: root/public/prism/prism-promql.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/prism/prism-promql.js')
-rw-r--r--public/prism/prism-promql.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/public/prism/prism-promql.js b/public/prism/prism-promql.js
new file mode 100644
index 0000000..13f106e
--- /dev/null
+++ b/public/prism/prism-promql.js
@@ -0,0 +1,102 @@
+// Thanks to: https://github.com/prometheus-community/monaco-promql/blob/master/src/promql/promql.ts
+// As well as: https://kausal.co/blog/slate-prism-add-new-syntax-promql/
+
+(function (Prism) {
+ // PromQL Aggregation Operators
+ // (https://prometheus.io/docs/prometheus/latest/querying/operators/#aggregation-operators)
+ var aggregations = [
+ 'sum',
+ 'min',
+ 'max',
+ 'avg',
+ 'group',
+ 'stddev',
+ 'stdvar',
+ 'count',
+ 'count_values',
+ 'bottomk',
+ 'topk',
+ 'quantile',
+ ];
+
+ // PromQL vector matching + the by and without clauses
+ // (https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching)
+ var vectorMatching = [
+ 'on',
+ 'ignoring',
+ 'group_right',
+ 'group_left',
+ 'by',
+ 'without',
+ ];
+
+ // PromQL offset modifier
+ // (https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier)
+ var offsetModifier = ['offset'];
+
+ var keywords = aggregations.concat(vectorMatching, offsetModifier);
+
+ Prism.languages.promql = {
+ comment: {
+ pattern: /(^[ \t]*)#.*/m,
+ lookbehind: true,
+ },
+ 'vector-match': {
+ // Match the comma-separated label lists inside vector matching:
+ pattern: new RegExp(
+ '((?:' + vectorMatching.join('|') + ')\\s*)\\([^)]*\\)'
+ ),
+ lookbehind: true,
+ inside: {
+ 'label-key': {
+ pattern: /\b[^,]+\b/,
+ alias: 'attr-name',
+ },
+ punctuation: /[(),]/,
+ },
+ },
+ 'context-labels': {
+ pattern: /\{[^{}]*\}/,
+ inside: {
+ 'label-key': {
+ pattern: /\b[a-z_]\w*(?=\s*(?:=|![=~]))/,
+ alias: 'attr-name',
+ },
+ 'label-value': {
+ pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
+ greedy: true,
+ alias: 'attr-value',
+ },
+ punctuation: /\{|\}|=~?|![=~]|,/,
+ },
+ },
+ 'context-range': [
+ {
+ pattern: /\[[\w\s:]+\]/, // [1m]
+ inside: {
+ punctuation: /\[|\]|:/,
+ 'range-duration': {
+ pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
+ alias: 'number',
+ },
+ },
+ },
+ {
+ pattern: /(\boffset\s+)\w+/, // offset 1m
+ lookbehind: true,
+ inside: {
+ 'range-duration': {
+ pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
+ alias: 'number',
+ },
+ },
+ },
+ ],
+ keyword: new RegExp('\\b(?:' + keywords.join('|') + ')\\b', 'i'),
+ function: /\b[a-z_]\w*(?=\s*\()/i,
+ number:
+ /[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,
+ operator: /[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,
+ punctuation: /[{};()`,.[\]]/,
+ };
+})(Prism);