You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.4 KiB
99 lines
2.4 KiB
// 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));
|
|
|