@ -19,33 +19,99 @@ const extJSON: FieldExtractor = {
} ,
} ;
// strips quotes and leading/trailing braces in prom labels
const stripDecor = /['"]|^\{|\}$/g ;
// splits on whitespace and other label pair delimiters
const splitLines = /[\s,;&]+/g ;
// splits kv pairs
const splitPair = /[=:]/g ;
function parseKeyValuePairs ( raw : string ) : Record < string , string > {
const buff : string [ ] = [ ] ; // array of characters
let esc = '' ;
let key = '' ;
const obj : Record < string , string > = { } ;
for ( let i = 0 ; i < raw . length ; i ++ ) {
let c = raw [ i ] ;
if ( c === esc ) {
esc = '' ;
c = raw [ ++ i ] ;
}
const extLabels : FieldExtractor = {
id : FieldExtractorID.KeyValues ,
name : 'Key+value pairs' ,
description : 'Look for a=b, c: d values in the line' ,
parse : ( v : string ) = > {
const obj : Record < string , any > = { } ;
const isEscaped = c === '\\' ;
if ( isEscaped ) {
c = raw [ ++ i ] ;
}
// When escaped just append
if ( isEscaped || esc . length ) {
buff . push ( c ) ;
continue ;
}
v . trim ( )
. replace ( stripDecor , '' )
. split ( splitLines )
. forEach ( ( pair ) = > {
let [ k , v ] = pair . split ( splitPair ) ;
if ( c === ` " ` || c === ` ' ` ) {
esc = c ;
}
if ( k != null ) {
obj [ k ] = v ;
switch ( c ) {
case ':' :
case '=' :
if ( buff . length ) {
if ( key ) {
obj [ key ] = '' ;
}
key = buff . join ( '' ) ;
buff . length = 0 ; // clear values
}
} ) ;
break ;
return obj ;
} ,
// escape chars
case ` " ` :
case ` ' ` :
// whitespace
case ` ` :
case ` \ n ` :
case ` \ t ` :
case ` \ r ` :
case ` \ n ` :
if ( buff . length && key === '' ) {
obj [ buff . join ( '' ) ] = '' ;
buff . length = 0 ;
}
// seperators
case ',' :
case ';' :
case '&' :
case '{' :
case '}' :
if ( buff . length ) {
const val = buff . join ( '' ) ;
if ( key . length ) {
obj [ key ] = val ;
key = '' ;
} else {
key = val ;
}
buff . length = 0 ; // clear values
}
break ;
// append our buffer
default :
buff . push ( c ) ;
if ( i === raw . length - 1 ) {
if ( key === '' && buff . length ) {
obj [ buff . join ( '' ) ] = '' ;
buff . length = 0 ;
}
}
}
}
if ( key . length ) {
obj [ key ] = buff . join ( '' ) ;
}
return obj ;
}
const extLabels : FieldExtractor = {
id : FieldExtractorID.KeyValues ,
name : 'Key+value pairs' ,
description : 'Look for a=b, c: d values in the line' ,
parse : parseKeyValuePairs ,
} ;
const fmts = [ extJSON , extLabels ] ;