Skip to content

Commit 45bddb7

Browse files
committed
port consul service tag filtering feature to 7.78.4
1 parent 887e765 commit 45bddb7

4 files changed

Lines changed: 54 additions & 9 deletions

File tree

consul/datadog_checks/consul/__about__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
# All rights reserved
33
# Licensed under a 3-clause BSD style license (see LICENSE)
44

5-
__version__ = "5.4.0"
5+
# VOLTUS PATCHED
6+
__version__ = "5.4.1"

consul/datadog_checks/consul/config_models/defaults.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ def instance_enable_legacy_tags_normalization():
4848
return True
4949

5050

51+
def instance_include_service_name_in_tag_key():
52+
return False
53+
54+
5155
def instance_kerberos_auth():
5256
return 'disabled'
5357

consul/datadog_checks/consul/config_models/instance.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class InstanceConfig(BaseModel):
6262
)
6363
acl_token: Optional[str] = None
6464
allow_redirects: Optional[bool] = None
65+
allowed_service_tags: Optional[tuple[str, ...]] = None
6566
auth_token: Optional[AuthToken] = None
6667
auth_type: Optional[str] = None
6768
aws_host: Optional[str] = None
@@ -76,6 +77,7 @@ class InstanceConfig(BaseModel):
7677
enable_legacy_tags_normalization: Optional[bool] = None
7778
extra_headers: Optional[MappingProxyType[str, Any]] = None
7879
headers: Optional[MappingProxyType[str, Any]] = None
80+
include_service_name_in_tag_key: Optional[bool] = None
7981
kerberos_auth: Optional[Literal['required', 'optional', 'disabled']] = None
8082
kerberos_cache: Optional[str] = None
8183
kerberos_delegate: Optional[bool] = None

consul/datadog_checks/consul/consul.py

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)