123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- // 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));
|