@@ -14,20 +14,17 @@ export class AlertDomain extends Domain {
1414
1515 // Convert a Query to a relative URI reference.
1616 linkToQuery ( link : URIRef ) : Query {
17- const m = link . pathname . match ( / m o n i t o r i n g \/ (?: a l e r t s | a l e r t r u l e s ) (?: \/ ( . * ) ) ? $ / ) ;
17+ const m = link . pathname . match ( / m o n i t o r i n g \/ (?: a l e r t s | a l e r t r u l e s ) (?: \/ ( [ ^ / ] * ) ) ? / ) ;
1818 if ( ! m ) throw this . badLink ( link ) ;
1919 const ruleID = m ?. [ 1 ] ;
20- let selector : { alertname ? : string } ;
20+ let selector : { [ key : string ] : string } ;
2121 if ( ruleID ) {
2222 // Search for alerts belonging to a specific alerting rule.
2323 selector = Object . fromEntries ( link . searchParams ) ;
24- // Get the name from the path if not found in search parameters.
25- if ( ! selector . alertname ) {
26- const name = this ?. idToName ?. get ( ruleID ) ;
27- if ( name ) selector . alertname = name ;
28- }
24+ selector [ 'alertname' ] ||= this ?. idToName ?. get ( ruleID ) ; // Look up name from ID if missing
2925 // Must have an alertname for a specific rule search.
30- if ( ! selector . alertname ) throw this . badLink ( link , 'cannot find alertname' ) ;
26+ if ( ! selector [ 'alertname' ] ) throw this . badLink ( link , 'cannot find alertname' ) ;
27+ nonLabelParams . forEach ( ( key : string ) => delete selector [ key ] ) ;
3128 } else {
3229 // Generic alert search across rules. Empty selector is allowed - means "all alerts"
3330 selector = parseKeyValueList ( link . searchParams . get ( 'alerts' ) ) ;
@@ -36,7 +33,20 @@ export class AlertDomain extends Domain {
3633 }
3734
3835 queryToLink ( query : Query ) : URIRef {
39- const selectors = keyValueList ( JSON . parse ( query . selector ) ) ;
40- return new URIRef ( `monitoring/alerts` , { alerts : selectors || undefined } ) ;
36+ // Use "alerts" parameter to search for alerts of possibly mixed alertnames.
37+ try {
38+ const selectors = keyValueList ( JSON . parse ( query . selector ) ) ;
39+ return new URIRef ( `monitoring/alerts` , { alerts : selectors || undefined } ) ;
40+ } catch ( e ) {
41+ throw this . badQuery ( query , e . toString ( ) ) ;
42+ }
4143 }
4244}
45+
46+ // URL parameters that are not alert labels, remove them from the query.
47+ const nonLabelParams = new Set < string > ( [
48+ 'prometheus' ,
49+ 'rowFilter-alert-state' ,
50+ 'rowFilter-alert-source' ,
51+ 'rowFilter-alerting-rule-source' ,
52+ ] ) ;
0 commit comments