@@ -114,6 +114,12 @@ def __init__(self, name, init_config, instances):
114114 self .collect_health_checks = self .instance .get (
115115 'collect_health_checks' , self .init_config .get ('collect_health_checks' , False )
116116 )
117+ self .include_service_name_in_tag_key = is_affirmative (
118+ self .instance .get ('include_service_name_in_tag_key' , self .init_config .get ('include_service_name_in_tag_key' , True ))
119+ )
120+ self .allowed_service_tags = self .instance .get (
121+ 'allowed_service_tags' , self .init_config .get ('allowed_service_tags' , None )
122+ )
117123
118124 if self .threads_count > 1 :
119125 self .thread_pool = ThreadPool (self .threads_count )
@@ -320,11 +326,39 @@ def _cull_services_list(self, services):
320326 return services
321327
322328 @staticmethod
323- def _get_service_tags (service , tags ):
324- service_tags = ['consul_service_id:{}' .format (service )]
329+ def _filter_service_tags (tags , allowed_service_tags ):
330+ """Filter service tags based on allowed_service_tags configuration."""
331+ if allowed_service_tags is None :
332+ return tags
325333
334+ filtered_tags = []
326335 for tag in tags :
327- service_tags .append ('consul_{}_service_tag:{}' .format (service , tag ))
336+ tag_lower = tag .lower ()
337+ # Check if tag matches any allowed patterns
338+ # Support both key=value tags and simple tags
339+ tag_allowed = False
340+ for allowed_tag in allowed_service_tags :
341+ allowed_tag_lower = allowed_tag .lower ()
342+ # Check for exact match or key match (for key=value tags)
343+ if tag .lower () == allowed_tag_lower or tag_lower .startswith (allowed_tag_lower + '=' ):
344+ tag_allowed = True
345+ break
346+
347+ if tag_allowed :
348+ filtered_tags .append (tag )
349+
350+ return filtered_tags
351+
352+ @staticmethod
353+ def _get_service_tags (service , tags , include_service_name_in_tag_key = True , allowed_service_tags = None ):
354+ service_tags = ['consul_service_id:{}' .format (service )]
355+
356+ # Apply filtering first
357+ filtered_tags = ConsulCheck ._filter_service_tags (tags , allowed_service_tags )
358+
359+ for tag in filtered_tags :
360+ if include_service_name_in_tag_key :
361+ service_tags .append ('consul_{}_service_tag:{}' .format (service , tag ))
328362 service_tags .append ('consul_service_tag:{}' .format (tag ))
329363
330364 return service_tags
@@ -495,10 +529,14 @@ def check(self, _):
495529 )
496530
497531 for node_status , count in nodes_per_service_tag_counts .items ():
498- service_tags = [
499- 'consul_{}_service_tag:{}' .format (node_status .service_name , tag )
500- for tag in node_status .service_tags_set
501- ]
532+ # Apply filtering to service tags for services_count metric
533+ filtered_service_tags = self ._filter_service_tags (list (node_status .service_tags_set ), self .allowed_service_tags )
534+
535+ service_tags = []
536+ if self .include_service_name_in_tag_key :
537+ for tag in filtered_service_tags :
538+ service_tags .append ('consul_{}_service_tag:{}' .format (node_status .service_name , tag ))
539+
502540 service_tags .append ('consul_service_id:{}' .format (node_status .service_name ))
503541 service_tags .append ('consul_node_id:{}' .format (node_status .node_id ))
504542 service_tags .append ('consul_status:{}' .format (node_status .status ))
@@ -523,7 +561,7 @@ def _submit_service_status(
523561 # `consul.catalog.nodes_passing` : # of Nodes with service status `passing` from those registered
524562 # `consul.catalog.nodes_warning` : # of Nodes with service status `warning` from those registered
525563 # `consul.catalog.nodes_critical` : # of Nodes with service status `critical` from those registered
526- all_service_tags = self ._get_service_tags (service , service_tags )
564+ all_service_tags = self ._get_service_tags (service , service_tags , self . include_service_name_in_tag_key , self . allowed_service_tags )
527565 # {'up': 0, 'passing': 0, 'warning': 0, 'critical': 0}
528566 node_count_per_status = defaultdict (int )
529567 for node in nodes_with_service :
0 commit comments