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)
 	}