mirror of
				https://github.com/prometheus/prometheus.git
				synced 2025-10-26 14:01:30 +01:00 
			
		
		
		
	This adds support for the new grammar of `{"metric_name", "l1"="val"}` to promql and some of the exposition formats.
This grammar will also be valid for non-UTF-8 names.
UTF-8 names will not be considered valid unless model.NameValidationScheme is changed.
This does not update the go expfmt parser in text_parse.go, which will be addressed by https://github.com/prometheus/common/issues/554/.
Part of https://github.com/prometheus/prometheus/issues/13095
Signed-off-by: Owen Williams <owen.williams@grafana.com>
		
	
			
		
			
				
	
	
		
			657 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			657 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Code generated by golex. DO NOT EDIT.
 | |
| 
 | |
| // Copyright 2017 The Prometheus Authors
 | |
| // Licensed under the Apache License, Version 2.0 (the "License");
 | |
| // you may not use this file except in compliance with the License.
 | |
| // You may obtain a copy of the License at
 | |
| //
 | |
| // http://www.apache.org/licenses/LICENSE-2.0
 | |
| //
 | |
| // Unless required by applicable law or agreed to in writing, software
 | |
| // distributed under the License is distributed on an "AS IS" BASIS,
 | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| // See the License for the specific language governing permissions and
 | |
| // limitations under the License.
 | |
| 
 | |
| package textparse
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	sInit = iota
 | |
| 	sComment
 | |
| 	sMeta1
 | |
| 	sMeta2
 | |
| 	sLabels
 | |
| 	sLValue
 | |
| 	sValue
 | |
| 	sTimestamp
 | |
| 	sExemplar
 | |
| 	sEValue
 | |
| 	sETimestamp
 | |
| )
 | |
| 
 | |
| // Lex is called by the parser generated by "go tool yacc" to obtain each
 | |
| // token. The method is opened before the matching rules block and closed at
 | |
| // the end of the file.
 | |
| func (l *promlexer) Lex() token {
 | |
| 	if l.i >= len(l.b) {
 | |
| 		return tEOF
 | |
| 	}
 | |
| 	c := l.b[l.i]
 | |
| 	l.start = l.i
 | |
| 
 | |
| yystate0:
 | |
| 
 | |
| 	switch yyt := l.state; yyt {
 | |
| 	default:
 | |
| 		panic(fmt.Errorf(`invalid start condition %d`, yyt))
 | |
| 	case 0: // start condition: INITIAL
 | |
| 		goto yystart1
 | |
| 	case 1: // start condition: sComment
 | |
| 		goto yystart9
 | |
| 	case 2: // start condition: sMeta1
 | |
| 		goto yystart20
 | |
| 	case 3: // start condition: sMeta2
 | |
| 		goto yystart25
 | |
| 	case 4: // start condition: sLabels
 | |
| 		goto yystart28
 | |
| 	case 5: // start condition: sLValue
 | |
| 		goto yystart36
 | |
| 	case 6: // start condition: sValue
 | |
| 		goto yystart40
 | |
| 	case 7: // start condition: sTimestamp
 | |
| 		goto yystart43
 | |
| 	}
 | |
| 
 | |
| yystate1:
 | |
| 	c = l.next()
 | |
| yystart1:
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == '#':
 | |
| 		goto yystate5
 | |
| 	case c == ':' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | |
| 		goto yystate7
 | |
| 	case c == '\n':
 | |
| 		goto yystate4
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate3
 | |
| 	case c == '\x00':
 | |
| 		goto yystate2
 | |
| 	case c == '{':
 | |
| 		goto yystate8
 | |
| 	}
 | |
| 
 | |
| yystate2:
 | |
| 	c = l.next()
 | |
| 	goto yyrule1
 | |
| 
 | |
| yystate3:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule3
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate3
 | |
| 	}
 | |
| 
 | |
| yystate4:
 | |
| 	c = l.next()
 | |
| 	goto yyrule2
 | |
| 
 | |
| yystate5:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule5
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate6
 | |
| 	}
 | |
| 
 | |
| yystate6:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule4
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate6
 | |
| 	}
 | |
| 
 | |
| yystate7:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule11
 | |
| 	case c >= '0' && c <= ':' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | |
| 		goto yystate7
 | |
| 	}
 | |
| 
 | |
| yystate8:
 | |
| 	c = l.next()
 | |
| 	goto yyrule13
 | |
| 
 | |
| yystate9:
 | |
| 	c = l.next()
 | |
| yystart9:
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == 'H':
 | |
| 		goto yystate10
 | |
| 	case c == 'T':
 | |
| 		goto yystate15
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate3
 | |
| 	}
 | |
| 
 | |
| yystate10:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == 'E':
 | |
| 		goto yystate11
 | |
| 	}
 | |
| 
 | |
| yystate11:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == 'L':
 | |
| 		goto yystate12
 | |
| 	}
 | |
| 
 | |
| yystate12:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == 'P':
 | |
| 		goto yystate13
 | |
| 	}
 | |
| 
 | |
| yystate13:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate14
 | |
| 	}
 | |
| 
 | |
| yystate14:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule6
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate14
 | |
| 	}
 | |
| 
 | |
| yystate15:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == 'Y':
 | |
| 		goto yystate16
 | |
| 	}
 | |
| 
 | |
| yystate16:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == 'P':
 | |
| 		goto yystate17
 | |
| 	}
 | |
| 
 | |
| yystate17:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == 'E':
 | |
| 		goto yystate18
 | |
| 	}
 | |
| 
 | |
| yystate18:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate19
 | |
| 	}
 | |
| 
 | |
| yystate19:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule7
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate19
 | |
| 	}
 | |
| 
 | |
| yystate20:
 | |
| 	c = l.next()
 | |
| yystart20:
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == '"':
 | |
| 		goto yystate21
 | |
| 	case c == ':' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | |
| 		goto yystate24
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate3
 | |
| 	}
 | |
| 
 | |
| yystate21:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == '"':
 | |
| 		goto yystate22
 | |
| 	case c == '\\':
 | |
| 		goto yystate23
 | |
| 	case c >= '\x01' && c <= '!' || c >= '#' && c <= '[' || c >= ']' && c <= 'ÿ':
 | |
| 		goto yystate21
 | |
| 	}
 | |
| 
 | |
| yystate22:
 | |
| 	c = l.next()
 | |
| 	goto yyrule8
 | |
| 
 | |
| yystate23:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ':
 | |
| 		goto yystate21
 | |
| 	}
 | |
| 
 | |
| yystate24:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule9
 | |
| 	case c >= '0' && c <= ':' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | |
| 		goto yystate24
 | |
| 	}
 | |
| 
 | |
| yystate25:
 | |
| 	c = l.next()
 | |
| yystart25:
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule10
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate27
 | |
| 	case c >= '\x01' && c <= '\b' || c >= '\v' && c <= '\x1f' || c >= '!' && c <= 'ÿ':
 | |
| 		goto yystate26
 | |
| 	}
 | |
| 
 | |
| yystate26:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule10
 | |
| 	case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ':
 | |
| 		goto yystate26
 | |
| 	}
 | |
| 
 | |
| yystate27:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule3
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate27
 | |
| 	case c >= '\x01' && c <= '\b' || c >= '\v' && c <= '\x1f' || c >= '!' && c <= 'ÿ':
 | |
| 		goto yystate26
 | |
| 	}
 | |
| 
 | |
| yystate28:
 | |
| 	c = l.next()
 | |
| yystart28:
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == '"':
 | |
| 		goto yystate29
 | |
| 	case c == ',':
 | |
| 		goto yystate32
 | |
| 	case c == '=':
 | |
| 		goto yystate33
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate3
 | |
| 	case c == '}':
 | |
| 		goto yystate35
 | |
| 	case c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | |
| 		goto yystate34
 | |
| 	}
 | |
| 
 | |
| yystate29:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == '"':
 | |
| 		goto yystate30
 | |
| 	case c == '\\':
 | |
| 		goto yystate31
 | |
| 	case c >= '\x01' && c <= '!' || c >= '#' && c <= '[' || c >= ']' && c <= 'ÿ':
 | |
| 		goto yystate29
 | |
| 	}
 | |
| 
 | |
| yystate30:
 | |
| 	c = l.next()
 | |
| 	goto yyrule15
 | |
| 
 | |
| yystate31:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ':
 | |
| 		goto yystate29
 | |
| 	}
 | |
| 
 | |
| yystate32:
 | |
| 	c = l.next()
 | |
| 	goto yyrule18
 | |
| 
 | |
| yystate33:
 | |
| 	c = l.next()
 | |
| 	goto yyrule17
 | |
| 
 | |
| yystate34:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule14
 | |
| 	case c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | |
| 		goto yystate34
 | |
| 	}
 | |
| 
 | |
| yystate35:
 | |
| 	c = l.next()
 | |
| 	goto yyrule16
 | |
| 
 | |
| yystate36:
 | |
| 	c = l.next()
 | |
| yystart36:
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == '"':
 | |
| 		goto yystate37
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate3
 | |
| 	}
 | |
| 
 | |
| yystate37:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == '"':
 | |
| 		goto yystate38
 | |
| 	case c == '\\':
 | |
| 		goto yystate39
 | |
| 	case c >= '\x01' && c <= '!' || c >= '#' && c <= '[' || c >= ']' && c <= 'ÿ':
 | |
| 		goto yystate37
 | |
| 	}
 | |
| 
 | |
| yystate38:
 | |
| 	c = l.next()
 | |
| 	goto yyrule19
 | |
| 
 | |
| yystate39:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ':
 | |
| 		goto yystate37
 | |
| 	}
 | |
| 
 | |
| yystate40:
 | |
| 	c = l.next()
 | |
| yystart40:
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate3
 | |
| 	case c == '{':
 | |
| 		goto yystate42
 | |
| 	case c >= '\x01' && c <= '\b' || c >= '\v' && c <= '\x1f' || c >= '!' && c <= 'z' || c >= '|' && c <= 'ÿ':
 | |
| 		goto yystate41
 | |
| 	}
 | |
| 
 | |
| yystate41:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule20
 | |
| 	case c >= '\x01' && c <= '\b' || c >= '\v' && c <= '\x1f' || c >= '!' && c <= 'z' || c >= '|' && c <= 'ÿ':
 | |
| 		goto yystate41
 | |
| 	}
 | |
| 
 | |
| yystate42:
 | |
| 	c = l.next()
 | |
| 	goto yyrule12
 | |
| 
 | |
| yystate43:
 | |
| 	c = l.next()
 | |
| yystart43:
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyabort
 | |
| 	case c == '\n':
 | |
| 		goto yystate44
 | |
| 	case c == '\t' || c == ' ':
 | |
| 		goto yystate3
 | |
| 	case c >= '0' && c <= '9':
 | |
| 		goto yystate45
 | |
| 	}
 | |
| 
 | |
| yystate44:
 | |
| 	c = l.next()
 | |
| 	goto yyrule22
 | |
| 
 | |
| yystate45:
 | |
| 	c = l.next()
 | |
| 	switch {
 | |
| 	default:
 | |
| 		goto yyrule21
 | |
| 	case c >= '0' && c <= '9':
 | |
| 		goto yystate45
 | |
| 	}
 | |
| 
 | |
| yyrule1: // \0
 | |
| 	{
 | |
| 		return tEOF
 | |
| 	}
 | |
| yyrule2: // \n
 | |
| 	{
 | |
| 		l.state = sInit
 | |
| 		return tLinebreak
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule3: // [ \t]+
 | |
| 	{
 | |
| 		return tWhitespace
 | |
| 	}
 | |
| yyrule4: // #[ \t]+
 | |
| 	{
 | |
| 		l.state = sComment
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule5: // #
 | |
| 	{
 | |
| 		return l.consumeComment()
 | |
| 	}
 | |
| yyrule6: // HELP[\t ]+
 | |
| 	{
 | |
| 		l.state = sMeta1
 | |
| 		return tHelp
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule7: // TYPE[\t ]+
 | |
| 	{
 | |
| 		l.state = sMeta1
 | |
| 		return tType
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule8: // \"(\\.|[^\\"])*\"
 | |
| 	{
 | |
| 		l.state = sMeta2
 | |
| 		return tMName
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule9: // {M}({M}|{D})*
 | |
| 	{
 | |
| 		l.state = sMeta2
 | |
| 		return tMName
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule10: // {C}*
 | |
| 	{
 | |
| 		l.state = sInit
 | |
| 		return tText
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule11: // {M}({M}|{D})*
 | |
| 	{
 | |
| 		l.state = sValue
 | |
| 		return tMName
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule12: // \{
 | |
| 	{
 | |
| 		l.state = sLabels
 | |
| 		return tBraceOpen
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule13: // \{
 | |
| 	{
 | |
| 		l.state = sLabels
 | |
| 		return tBraceOpen
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule14: // {L}({L}|{D})*
 | |
| 	{
 | |
| 		return tLName
 | |
| 	}
 | |
| yyrule15: // \"(\\.|[^\\"])*\"
 | |
| 	{
 | |
| 		l.state = sLabels
 | |
| 		return tQString
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule16: // \}
 | |
| 	{
 | |
| 		l.state = sValue
 | |
| 		return tBraceClose
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule17: // =
 | |
| 	{
 | |
| 		l.state = sLValue
 | |
| 		return tEqual
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule18: // ,
 | |
| 	{
 | |
| 		return tComma
 | |
| 	}
 | |
| yyrule19: // \"(\\.|[^\\"])*\"
 | |
| 	{
 | |
| 		l.state = sLabels
 | |
| 		return tLValue
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule20: // [^{ \t\n]+
 | |
| 	{
 | |
| 		l.state = sTimestamp
 | |
| 		return tValue
 | |
| 		goto yystate0
 | |
| 	}
 | |
| yyrule21: // {D}+
 | |
| 	{
 | |
| 		return tTimestamp
 | |
| 	}
 | |
| yyrule22: // \n
 | |
| 	if true { // avoid go vet determining the below panic will not be reached
 | |
| 		l.state = sInit
 | |
| 		return tLinebreak
 | |
| 		goto yystate0
 | |
| 	}
 | |
| 	panic("unreachable")
 | |
| 
 | |
| yyabort: // no lexem recognized
 | |
| 	// silence unused label errors for build and satisfy go vet reachability analysis
 | |
| 	{
 | |
| 		if false {
 | |
| 			goto yyabort
 | |
| 		}
 | |
| 		if false {
 | |
| 			goto yystate0
 | |
| 		}
 | |
| 		if false {
 | |
| 			goto yystate1
 | |
| 		}
 | |
| 		if false {
 | |
| 			goto yystate9
 | |
| 		}
 | |
| 		if false {
 | |
| 			goto yystate20
 | |
| 		}
 | |
| 		if false {
 | |
| 			goto yystate25
 | |
| 		}
 | |
| 		if false {
 | |
| 			goto yystate28
 | |
| 		}
 | |
| 		if false {
 | |
| 			goto yystate36
 | |
| 		}
 | |
| 		if false {
 | |
| 			goto yystate40
 | |
| 		}
 | |
| 		if false {
 | |
| 			goto yystate43
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// Workaround to gobble up comments that started with a HELP or TYPE
 | |
| 	// prefix. We just consume all characters until we reach a newline.
 | |
| 	// This saves us from adding disproportionate complexity to the parser.
 | |
| 	if l.state == sComment {
 | |
| 		return l.consumeComment()
 | |
| 	}
 | |
| 	return tInvalid
 | |
| }
 | |
| 
 | |
| func (l *promlexer) consumeComment() token {
 | |
| 	for c := l.cur(); ; c = l.next() {
 | |
| 		switch c {
 | |
| 		case 0:
 | |
| 			return tEOF
 | |
| 		case '\n':
 | |
| 			l.state = sInit
 | |
| 			return tComment
 | |
| 		}
 | |
| 	}
 | |
| }
 |