Commit e3274d67 by Mitsuhiro Tanda

(prometheus) show label name in paren after by/without/on/ignoring/group_left/group_right

parent 24723cdb
...@@ -8,7 +8,6 @@ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; ...@@ -8,7 +8,6 @@ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
var PrometheusHighlightRules = function() { var PrometheusHighlightRules = function() {
var keywords = ( 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" "count|count_values|min|max|avg|sum|stddev|stdvar|bottomk|topk|quantile"
); );
...@@ -42,44 +41,65 @@ var PrometheusHighlightRules = function() { ...@@ -42,44 +41,65 @@ var PrometheusHighlightRules = function() {
token : "constant.language", // time token : "constant.language", // time
regex : "\\d+[smhdwy]" regex : "\\d+[smhdwy]"
}, { }, {
token : "keyword.operator.binary",
regex : "\\+|\\-|\\*|\\/|%|\\^|==|!=|<=|>=|<|>|and|or|unless"
}, {
token : "keyword.other",
regex : "keep_common|offset|bool"
}, {
token : "keyword.control",
regex : "by|without|on|ignoring|group_left|group_right",
next : "start-label-list-matcher"
}, {
token : keywordMapper, token : keywordMapper,
regex : "[a-zA-Z_:][a-zA-Z0-9_:]*" regex : "[a-zA-Z_:][a-zA-Z0-9_:]*"
}, { }, {
token : "keyword.operator",
regex : "\\+|\\-|\\*|\\/|%|\\^|==|!=|<=|>=|<|>"
}, {
token : "paren.lparen", token : "paren.lparen",
regex : "[[(]" regex : "[[(]"
}, { }, {
token : "paren.lparen", token : "paren.lparen.label-matcher",
regex : "{", regex : "{",
next : "start-label-matcher" next : "start-label-matcher"
}, { }, {
token : "paren.rparen", token : "paren.rparen",
regex : "[\\])]" regex : "[\\])]"
}, { }, {
token : "paren.rparen", token : "paren.rparen.label-matcher",
regex : "}" regex : "}"
}, { }, {
token : "text", token : "text",
regex : "\\s+" regex : "\\s+"
} ], } ],
"start-label-matcher" : [ { "start-label-matcher" : [ {
token : "entity.name.tag", token : "entity.name.tag.label-matcher",
regex : '[a-zA-Z_][a-zA-Z0-9_]*' regex : '[a-zA-Z_][a-zA-Z0-9_]*'
}, { }, {
token : "keyword.operator", token : "keyword.operator.label-matcher",
regex : '=~|=|!~|!=' regex : '=~|=|!~|!='
}, { }, {
token : "string.quoted", token : "string.quoted.label-matcher",
regex : '"[^"]*"|\'[^\']*\'' regex : '"[^"]*"|\'[^\']*\''
}, { }, {
token : "punctuation.operator", token : "punctuation.operator.label-matcher",
regex : "," regex : ","
}, { }, {
token : "paren.rparen", token : "paren.rparen.label-matcher",
regex : "}", regex : "}",
next : "start" next : "start"
} ],
"start-label-list-matcher" : [ {
token : "paren.lparen.label-list-matcher",
regex : "[(]"
}, {
token : "entity.name.tag.label-list-matcher",
regex : '[a-zA-Z_][a-zA-Z0-9_]*'
}, {
token : "punctuation.operator.label-list-matcher",
regex : ","
}, {
token : "paren.rparen.label-list-matcher",
regex : "[)]",
next : "start"
} ] } ]
}; };
...@@ -395,7 +415,9 @@ var PrometheusCompletions = function() {}; ...@@ -395,7 +415,9 @@ var PrometheusCompletions = function() {};
(function() { (function() {
this.getCompletions = function(state, session, pos, prefix, callback) { this.getCompletions = function(state, session, pos, prefix, callback) {
var token = session.getTokenAt(pos.row, pos.column); var token = session.getTokenAt(pos.row, pos.column);
if (token.type === 'entity.name.tag' || token.type === 'string.quoted') { if (token.type === 'entity.name.tag.label-matcher'
|| token.type === 'string.quoted.label-matcher'
|| token.type === 'entity.name.tag.label-list-matcher') {
return callback(null, []); return callback(null, []);
} }
......
...@@ -61,16 +61,21 @@ describe('Prometheus editor completer', function() { ...@@ -61,16 +61,21 @@ describe('Prometheus editor completer', function() {
it('Should return label name list', () => { it('Should return label name list', () => {
const session = getSessionStub({ const session = getSessionStub({
currentToken: { currentToken: {
type: 'entity.name.tag', type: 'entity.name.tag.label-matcher',
value: 'j', value: 'j',
index: 2, index: 2,
start: 9, start: 9,
}, },
tokens: [ tokens: [
{ type: 'identifier', value: 'node_cpu' }, { type: 'identifier', value: 'node_cpu' },
{ type: 'paren.lparen', value: '{' }, { type: 'paren.lparen.label-matcher', value: '{' },
{ type: 'entity.name.tag', value: 'j', index: 2, start: 9 }, {
{ type: 'paren.rparen', value: '}' }, type: 'entity.name.tag.label-matcher',
value: 'j',
index: 2,
start: 9,
},
{ type: 'paren.rparen.label-matcher', value: '}' },
], ],
line: 'node_cpu{j}', line: 'node_cpu{j}',
}); });
...@@ -85,19 +90,24 @@ describe('Prometheus editor completer', function() { ...@@ -85,19 +90,24 @@ describe('Prometheus editor completer', function() {
it('Should return label name list', () => { it('Should return label name list', () => {
const session = getSessionStub({ const session = getSessionStub({
currentToken: { currentToken: {
type: 'entity.name.tag', type: 'entity.name.tag.label-matcher',
value: 'j', value: 'j',
index: 5, index: 5,
start: 22, start: 22,
}, },
tokens: [ tokens: [
{ type: 'paren.lparen', value: '{' }, { type: 'paren.lparen.label-matcher', value: '{' },
{ type: 'entity.name.tag', value: '__name__' }, { type: 'entity.name.tag.label-matcher', value: '__name__' },
{ type: 'keyword.operator', value: '=~' }, { type: 'keyword.operator.label-matcher', value: '=~' },
{ type: 'string.quoted', value: '"node_cpu"' }, { type: 'string.quoted.label-matcher', value: '"node_cpu"' },
{ type: 'punctuation.operator', value: ',' }, { type: 'punctuation.operator.label-matcher', value: ',' },
{ type: 'entity.name.tag', value: 'j', index: 5, start: 22 }, {
{ type: 'paren.rparen', value: '}' }, type: 'entity.name.tag.label-matcher',
value: 'j',
index: 5,
start: 22,
},
{ type: 'paren.rparen.label-matcher', value: '}' },
], ],
line: '{__name__=~"node_cpu",j}', line: '{__name__=~"node_cpu",j}',
}); });
...@@ -112,18 +122,23 @@ describe('Prometheus editor completer', function() { ...@@ -112,18 +122,23 @@ describe('Prometheus editor completer', function() {
it('Should return label value list', () => { it('Should return label value list', () => {
const session = getSessionStub({ const session = getSessionStub({
currentToken: { currentToken: {
type: 'string.quoted', type: 'string.quoted.label-matcher',
value: '"n"', value: '"n"',
index: 4, index: 4,
start: 13, start: 13,
}, },
tokens: [ tokens: [
{ type: 'identifier', value: 'node_cpu' }, { type: 'identifier', value: 'node_cpu' },
{ type: 'paren.lparen', value: '{' }, { type: 'paren.lparen.label-matcher', value: '{' },
{ type: 'entity.name.tag', value: 'job' }, { type: 'entity.name.tag.label-matcher', value: 'job' },
{ type: 'keyword.operator', value: '=' }, { type: 'keyword.operator.label-matcher', value: '=' },
{ type: 'string.quoted', value: '"n"', index: 4, start: 13 }, {
{ type: 'paren.rparen', value: '}' }, type: 'string.quoted.label-matcher',
value: '"n"',
index: 4,
start: 13,
},
{ type: 'paren.rparen.label-matcher', value: '}' },
], ],
line: 'node_cpu{job="n"}', line: 'node_cpu{job="n"}',
}); });
...@@ -133,4 +148,40 @@ describe('Prometheus editor completer', function() { ...@@ -133,4 +148,40 @@ describe('Prometheus editor completer', function() {
}); });
}); });
}); });
describe('When inside by', () => {
it('Should return label name list', () => {
const session = getSessionStub({
currentToken: {
type: 'entity.name.tag.label-list-matcher',
value: 'm',
index: 9,
start: 22,
},
tokens: [
{ type: 'paren.lparen', value: '(' },
{ type: 'keyword', value: 'count' },
{ type: 'paren.lparen', value: '(' },
{ type: 'identifier', value: 'node_cpu' },
{ type: 'paren.rparen', value: '))' },
{ type: 'text', value: ' ' },
{ type: 'keyword.control', value: 'by' },
{ type: 'text', value: ' ' },
{ type: 'paren.lparen.label-list-matcher', value: '(' },
{
type: 'entity.name.tag.label-list-matcher',
value: 'm',
index: 9,
start: 22,
},
{ type: 'paren.rparen.label-list-matcher', value: ')' },
],
line: '(count(node_cpu)) by (m)',
});
return completer.getCompletions(editor, session, { row: 0, column: 23 }, 'm', (s, res) => {
expect(res[0].meta).to.eql('label name');
});
});
});
}); });
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment