@@ -42,9 +42,9 @@ export class AlertmanagerDataSource extends DataSourceApi<CustomQuery, GenericOp
4242 params . push ( `receiver=${ query . receiver } ` ) ;
4343 }
4444 if ( query . filters !== undefined && query . filters . length > 0 ) {
45- query . filters = getTemplateSrv ( ) . replace ( query . filters , options . scopedVars ) ;
45+ query . filters = getTemplateSrv ( ) . replace ( query . filters , options . scopedVars , this . interpolateQueryExpr ) ;
4646 query . filters . split ( ',' ) . forEach ( value => {
47- params . push ( `filter=${ value } ` ) ;
47+ params . push ( `filter=${ encodeURIComponent ( value ) } ` ) ;
4848 } ) ;
4949 }
5050
@@ -150,4 +150,31 @@ export class AlertmanagerDataSource extends DataSourceApi<CustomQuery, GenericOp
150150 } ) ;
151151 return Promise . resolve ( frame ) ;
152152 }
153+
154+ interpolateQueryExpr ( value : string | string [ ] = [ ] , variable : any ) {
155+ // if no multi or include all do not regexEscape
156+ if ( ! variable . multi && ! variable . includeAll ) {
157+ return alertmanagerRegularEscape ( value ) ;
158+ }
159+
160+ if ( typeof value === 'string' ) {
161+ return alertmanagerSpecialRegexEscape ( value ) ;
162+ }
163+
164+ const escapedValues = value . map ( val => alertmanagerSpecialRegexEscape ( val ) ) ;
165+
166+ if ( escapedValues . length === 1 ) {
167+ return escapedValues [ 0 ] ;
168+ }
169+
170+ return '(' + escapedValues . join ( '|' ) + ')' ;
171+ }
172+ }
173+
174+ export function alertmanagerRegularEscape ( value : any ) {
175+ return typeof value === 'string' ? value . replace ( / \\ / g, '\\\\' ) . replace ( / ' / g, "\\\\'" ) : value ;
176+ }
177+
178+ export function alertmanagerSpecialRegexEscape ( value : any ) {
179+ return typeof value === 'string' ? value . replace ( / \\ / g, '\\\\\\\\' ) . replace ( / [ $ ^ * { } \[ \] \' + ? ( ) | ] / g, '\\\\$&' ) : value ;
153180}
0 commit comments