diff --git a/lib/promscrape/discovery/consul/api.go b/lib/promscrape/discovery/consul/api.go index 3e95b4ae8f..937b19f7ec 100644 --- a/lib/promscrape/discovery/consul/api.go +++ b/lib/promscrape/discovery/consul/api.go @@ -82,7 +82,13 @@ func newAPIConfig(sdc *SDConfig, baseDir string) (*apiConfig, error) { return nil, err } - cw := newConsulWatcher(client, sdc, dc) + namespace := sdc.Namespace + // default namespace can be detected from env var. + if namespace == "" { + namespace = os.Getenv("CONSUL_NAMESPACE") + } + + cw := newConsulWatcher(client, sdc, dc, sdc.Namespace) cfg := &apiConfig{ tagSeparator: tagSeparator, consulWatcher: cw, diff --git a/lib/promscrape/discovery/consul/consul.go b/lib/promscrape/discovery/consul/consul.go index 5d4e846569..f1ee777ad4 100644 --- a/lib/promscrape/discovery/consul/consul.go +++ b/lib/promscrape/discovery/consul/consul.go @@ -11,9 +11,12 @@ import ( // // See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config type SDConfig struct { - Server string `yaml:"server,omitempty"` - Token *string `yaml:"token"` - Datacenter string `yaml:"datacenter"` + Server string `yaml:"server,omitempty"` + Token *string `yaml:"token"` + Datacenter string `yaml:"datacenter"` + // Namespace only supported at enterprise consul. + // https://www.consul.io/docs/enterprise/namespaces + Namespace string `yaml:"namespace,omitempty"` Scheme string `yaml:"scheme,omitempty"` Username string `yaml:"username"` Password string `yaml:"password"` diff --git a/lib/promscrape/discovery/consul/service_node.go b/lib/promscrape/discovery/consul/service_node.go index 8023ecfd7e..ba33913bab 100644 --- a/lib/promscrape/discovery/consul/service_node.go +++ b/lib/promscrape/discovery/consul/service_node.go @@ -34,12 +34,13 @@ type ServiceNode struct { // // See https://www.consul.io/api/health.html#list-nodes-for-service type Service struct { - ID string - Service string - Address string - Port int - Tags []string - Meta map[string]string + ID string + Service string + Address string + Namespace string + Port int + Tags []string + Meta map[string]string } // Node is Consul node. @@ -81,6 +82,7 @@ func (sn *ServiceNode) appendTargetLabels(ms []map[string]string, serviceName, t "__meta_consul_address": sn.Node.Address, "__meta_consul_dc": sn.Node.Datacenter, "__meta_consul_health": aggregatedStatus(sn.Checks), + "__meta_consul_namespace": sn.Service.Namespace, "__meta_consul_node": sn.Node.Node, "__meta_consul_service": serviceName, "__meta_consul_service_address": sn.Service.Address, diff --git a/lib/promscrape/discovery/consul/service_node_test.go b/lib/promscrape/discovery/consul/service_node_test.go index 7b5e3dc08e..68ad5db411 100644 --- a/lib/promscrape/discovery/consul/service_node_test.go +++ b/lib/promscrape/discovery/consul/service_node_test.go @@ -64,7 +64,7 @@ func TestParseServiceNodesSuccess(t *testing.T) { "Passing": 10, "Warning": 1 }, - "Namespace": "default" + "Namespace": "ns-dev" }, "Checks": [ { @@ -118,6 +118,7 @@ func TestParseServiceNodesSuccess(t *testing.T) { "__meta_consul_dc": "dc1", "__meta_consul_health": "passing", "__meta_consul_metadata_instance_type": "t2.medium", + "__meta_consul_namespace": "ns-dev", "__meta_consul_node": "foobar", "__meta_consul_service": "redis", "__meta_consul_service_address": "10.1.10.12", diff --git a/lib/promscrape/discovery/consul/watch.go b/lib/promscrape/discovery/consul/watch.go index 4fcae3deff..e85a4869e6 100644 --- a/lib/promscrape/discovery/consul/watch.go +++ b/lib/promscrape/discovery/consul/watch.go @@ -42,11 +42,14 @@ type serviceWatcher struct { } // newConsulWatcher creates new watcher and start background service discovery for Consul. -func newConsulWatcher(client *discoveryutils.Client, sdc *SDConfig, datacenter string) *consulWatcher { +func newConsulWatcher(client *discoveryutils.Client, sdc *SDConfig, datacenter, namespace string) *consulWatcher { baseQueryArgs := "?dc=" + url.QueryEscape(datacenter) if sdc.AllowStale { baseQueryArgs += "&stale" } + if namespace != "" { + baseQueryArgs += "&ns=" + namespace + } for k, v := range sdc.NodeMeta { baseQueryArgs += "&node-meta=" + url.QueryEscape(k+":"+v) }