From 3856798131f3f58201778dc728285ce3cc79db7b Mon Sep 17 00:00:00 2001 From: Scott Rankin Date: Thu, 23 Mar 2017 15:18:21 -0400 Subject: [PATCH] Adding ability to specify docker labels as tags in service discovery --- utils/service_discovery/sd_docker_backend.py | 22 ++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/utils/service_discovery/sd_docker_backend.py b/utils/service_discovery/sd_docker_backend.py index e54816ce0d..7e5f8995db 100644 --- a/utils/service_discovery/sd_docker_backend.py +++ b/utils/service_discovery/sd_docker_backend.py @@ -17,6 +17,7 @@ from utils.service_discovery.config_stores import get_config_store DATADOG_ID = 'com.datadoghq.sd.check.id' +DEFAULT_COLLECT_LABELS_AS_TAGS = "" log = logging.getLogger(__name__) @@ -73,6 +74,7 @@ class SDDockerBackend(AbstractSDBackend): def __init__(self, agentConfig): try: + self.collect_labels_as_tags = agentConfig.get('sd_docker_collect_labels_as_tags', DEFAULT_COLLECT_LABELS_AS_TAGS).split(",") self.config_store = get_config_store(agentConfig=agentConfig) except Exception as e: log.error('Failed to instantiate the config store client. ' @@ -245,6 +247,20 @@ def _extract_port_from_list(self, ports, tpl_var): def get_tags(self, state, c_id): """Extract useful tags from docker or platform APIs. These are collected by default.""" tags = [] + + # Collect any specified docker labels as tags + c_labels = state.inspect_container(c_id).get('Config', {}).get('Labels', {}) + for k in self.collect_labels_as_tags: + if k in c_labels.keys(): + v = c_labels[k] + if k == SWARM_SVC_LABEL and Platform.is_swarm(): + if v: + tags.append("swarm_service:%s" % v) + elif not v: + tags.append(k) + else: + tags.append("%s:%s" % (k,v)) + if Platform.is_k8s(): pod_metadata = state.get_kube_config(c_id, 'metadata') @@ -284,12 +300,6 @@ def get_tags(self, state, c_id): # For deployment we only need to do it if the pod creator is a ReplicaSet. # Details: https://kubernetes.io/docs/user-guide/deployments/#selector - elif Platform.is_swarm(): - c_labels = state.inspect_container(c_id).get('Config', {}).get('Labels', {}) - swarm_svc = c_labels.get(SWARM_SVC_LABEL) - if swarm_svc: - tags.append('swarm_service:%s' % swarm_svc) - return tags def _get_additional_tags(self, state, c_id, *args):