diff --git a/discovery/dockerswarm/services.go b/discovery/dockerswarm/services.go index 64876c3d4..2769bc59c 100644 --- a/discovery/dockerswarm/services.go +++ b/discovery/dockerswarm/services.go @@ -57,42 +57,68 @@ func (d *Discovery) refreshServices(ctx context.Context) ([]*targetgroup.Group, } for _, s := range services { - for _, e := range s.Endpoint.Ports { - if e.Protocol != swarm.PortConfigProtocolTCP { - continue + commonLabels := map[string]string{ + swarmLabelServiceID: s.ID, + swarmLabelServiceName: s.Spec.Name, + swarmLabelServiceTaskContainerHostname: s.Spec.TaskTemplate.ContainerSpec.Hostname, + swarmLabelServiceTaskContainerImage: s.Spec.TaskTemplate.ContainerSpec.Image, + } + commonLabels[swarmLabelServiceMode] = getServiceValueMode(s) + + if s.UpdateStatus != nil { + commonLabels[swarmLabelServiceUpdatingStatus] = string(s.UpdateStatus.State) + } + + for k, v := range s.Spec.Labels { + ln := strutil.SanitizeLabelName(k) + commonLabels[swarmLabelServiceLabelPrefix+ln] = v + } + + for _, p := range s.Endpoint.VirtualIPs { + var added bool + ip, _, err := net.ParseCIDR(p.Addr) + if err != nil { + return nil, fmt.Errorf("error while parsing address %s: %w", p.Addr, err) } - for _, p := range s.Endpoint.VirtualIPs { + + for _, e := range s.Endpoint.Ports { + if e.Protocol != swarm.PortConfigProtocolTCP { + continue + } labels := model.LabelSet{ swarmLabelServiceEndpointPortName: model.LabelValue(e.Name), swarmLabelServiceEndpointPortPublishMode: model.LabelValue(e.PublishMode), - swarmLabelServiceID: model.LabelValue(s.ID), - swarmLabelServiceName: model.LabelValue(s.Spec.Name), - swarmLabelServiceTaskContainerHostname: model.LabelValue(s.Spec.TaskTemplate.ContainerSpec.Hostname), - swarmLabelServiceTaskContainerImage: model.LabelValue(s.Spec.TaskTemplate.ContainerSpec.Image), } - labels[swarmLabelServiceMode] = model.LabelValue(getServiceValueMode(s)) - - if s.UpdateStatus != nil { - labels[swarmLabelServiceUpdatingStatus] = model.LabelValue(s.UpdateStatus.State) + for k, v := range commonLabels { + labels[model.LabelName(k)] = model.LabelValue(v) } - for k, v := range s.Spec.Labels { - ln := strutil.SanitizeLabelName(k) - labels[model.LabelName(swarmLabelServiceLabelPrefix+ln)] = model.LabelValue(v) - } - - ip, _, err := net.ParseCIDR(p.Addr) - if err != nil { - return nil, fmt.Errorf("error while parsing address %s: %w", p.Addr, err) - } - addr := net.JoinHostPort(ip.String(), strconv.FormatUint(uint64(e.PublishedPort), 10)) - labels[model.AddressLabel] = model.LabelValue(addr) - for k, v := range networkLabels[p.NetworkID] { labels[model.LabelName(k)] = model.LabelValue(v) } + addr := net.JoinHostPort(ip.String(), strconv.FormatUint(uint64(e.PublishedPort), 10)) + labels[model.AddressLabel] = model.LabelValue(addr) + + tg.Targets = append(tg.Targets, labels) + added = true + } + + if !added { + labels := model.LabelSet{} + + for k, v := range commonLabels { + labels[model.LabelName(k)] = model.LabelValue(v) + } + + for k, v := range networkLabels[p.NetworkID] { + labels[model.LabelName(k)] = model.LabelValue(v) + } + + addr := net.JoinHostPort(ip.String(), fmt.Sprintf("%d", d.port)) + labels[model.AddressLabel] = model.LabelValue(addr) + tg.Targets = append(tg.Targets, labels) } } diff --git a/discovery/dockerswarm/services_test.go b/discovery/dockerswarm/services_test.go index e7a13ee6a..8240def0b 100644 --- a/discovery/dockerswarm/services_test.go +++ b/discovery/dockerswarm/services_test.go @@ -50,7 +50,7 @@ host: %s tg := tgs[0] testutil.Assert(t, tg != nil, "tg should not be nil") testutil.Assert(t, tg.Targets != nil, "tg.targets should not be nil") - testutil.Equals(t, 10, len(tg.Targets)) + testutil.Equals(t, 15, len(tg.Targets)) for i, lbls := range []model.LabelSet{ { @@ -65,8 +65,8 @@ host: %s "__meta_dockerswarm_service_id": model.LabelValue("3qvd7bwfptmoht16t1f7jllb6"), "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/swarmprom-node-exporter:v0.16.0"), "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), - "__meta_dockerswarm_service_name": model.LabelValue("mon_node-exporter"), "__meta_dockerswarm_service_mode": model.LabelValue("global"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_node-exporter"), "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/swarmprom-node-exporter:v0.16.0@sha256:1d2518ec0501dd848e718bf008df37852b1448c862d6f256f2d39244975758d6"), }, @@ -83,11 +83,75 @@ host: %s "__meta_dockerswarm_service_id": model.LabelValue("3qvd7bwfptmoht16t1f7jllb6"), "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/swarmprom-node-exporter:v0.16.0"), "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), - "__meta_dockerswarm_service_name": model.LabelValue("mon_node-exporter"), "__meta_dockerswarm_service_mode": model.LabelValue("global"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_node-exporter"), "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/swarmprom-node-exporter:v0.16.0@sha256:1d2518ec0501dd848e718bf008df37852b1448c862d6f256f2d39244975758d6"), }, + { + "__address__": model.LabelValue("10.0.1.34:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_service_id": model.LabelValue("9bbq7j55tzzz85k2gg52x73rg"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("cloudflare/unsee:v0.8.0"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_unsee"), + "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), + "__meta_dockerswarm_service_task_container_image": model.LabelValue("cloudflare/unsee:v0.8.0@sha256:28398f47f63feb1647887999701fa730da351fc6d3cc7228e5da44b40a663ada"), + }, + { + "__address__": model.LabelValue("10.0.1.13:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_service_id": model.LabelValue("hv645udwaaewyw7wuc6nspm68"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/swarmprom-prometheus:v2.5.0"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_prometheus"), + "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), + "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/swarmprom-prometheus:v2.5.0@sha256:f1a3781c4785637ba088dcf54889f77d9b6b69f21b2c0a167c1347473f4e2587"), + }, + { + "__address__": model.LabelValue("10.0.1.23:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_service_id": model.LabelValue("iml8vdd2dudvq457sbirpf66z"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("google/cadvisor"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("global"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_cadvisor"), + "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), + "__meta_dockerswarm_service_task_container_image": model.LabelValue("google/cadvisor:latest@sha256:815386ebbe9a3490f38785ab11bda34ec8dacf4634af77b8912832d4f85dca04"), + }, + { + "__address__": model.LabelValue("10.0.1.31:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_service_id": model.LabelValue("rl4jhdws3r4lkfvq8kx6c4xnr"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/swarmprom-alertmanager:v0.14.0"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_alertmanager"), + "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), + "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/swarmprom-alertmanager:v0.14.0@sha256:7069b656bd5df0606ff1db81a7553a25dc72be51d3aca6a7e08d776566cefbd8"), + }, { "__address__": model.LabelValue("10.0.0.13:9090"), "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), @@ -100,8 +164,42 @@ host: %s "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), - "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), + "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), + "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/caddy:latest@sha256:44541cfacb66f4799f81f17fcfb3cb757ccc8f327592745549f5930c42d115c9"), + }, + { + "__address__": model.LabelValue("10.0.0.13:9093"), + "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), + "__meta_dockerswarm_network_ingress": model.LabelValue("true"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_name": model.LabelValue("ingress"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_service_endpoint_port_name": model.LabelValue(""), + "__meta_dockerswarm_service_endpoint_port_publish_mode": model.LabelValue("ingress"), + "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), + "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), + "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/caddy:latest@sha256:44541cfacb66f4799f81f17fcfb3cb757ccc8f327592745549f5930c42d115c9"), + }, + { + "__address__": model.LabelValue("10.0.0.13:9094"), + "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), + "__meta_dockerswarm_network_ingress": model.LabelValue("true"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_name": model.LabelValue("ingress"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_service_endpoint_port_name": model.LabelValue(""), + "__meta_dockerswarm_service_endpoint_port_publish_mode": model.LabelValue("ingress"), + "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/caddy:latest@sha256:44541cfacb66f4799f81f17fcfb3cb757ccc8f327592745549f5930c42d115c9"), }, @@ -118,25 +216,8 @@ host: %s "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), - "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), - "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), - "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/caddy:latest@sha256:44541cfacb66f4799f81f17fcfb3cb757ccc8f327592745549f5930c42d115c9"), - }, - { - "__address__": model.LabelValue("10.0.0.13:9093"), - "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), - "__meta_dockerswarm_network_ingress": model.LabelValue("true"), - "__meta_dockerswarm_network_internal": model.LabelValue("false"), - "__meta_dockerswarm_network_name": model.LabelValue("ingress"), - "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), - "__meta_dockerswarm_service_endpoint_port_name": model.LabelValue(""), - "__meta_dockerswarm_service_endpoint_port_publish_mode": model.LabelValue("ingress"), - "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), - "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), - "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), - "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/caddy:latest@sha256:44541cfacb66f4799f81f17fcfb3cb757ccc8f327592745549f5930c42d115c9"), }, @@ -153,25 +234,8 @@ host: %s "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), - "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), - "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), - "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/caddy:latest@sha256:44541cfacb66f4799f81f17fcfb3cb757ccc8f327592745549f5930c42d115c9"), - }, - { - "__address__": model.LabelValue("10.0.0.13:9094"), - "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), - "__meta_dockerswarm_network_ingress": model.LabelValue("true"), - "__meta_dockerswarm_network_internal": model.LabelValue("false"), - "__meta_dockerswarm_network_name": model.LabelValue("ingress"), - "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), - "__meta_dockerswarm_service_endpoint_port_name": model.LabelValue(""), - "__meta_dockerswarm_service_endpoint_port_publish_mode": model.LabelValue("ingress"), - "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), - "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), - "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), - "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/caddy:latest@sha256:44541cfacb66f4799f81f17fcfb3cb757ccc8f327592745549f5930c42d115c9"), }, @@ -188,8 +252,8 @@ host: %s "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), - "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/caddy:latest@sha256:44541cfacb66f4799f81f17fcfb3cb757ccc8f327592745549f5930c42d115c9"), }, @@ -205,8 +269,8 @@ host: %s "__meta_dockerswarm_service_id": model.LabelValue("uk9su5tb9ykfzew3qtmp14uzh"), "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/swarmprom-grafana:5.3.4"), "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), - "__meta_dockerswarm_service_name": model.LabelValue("mon_grafana"), "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_grafana"), "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/swarmprom-grafana:5.3.4@sha256:2aca8aa5716e6e0eed3fcdc88fec256a0a1828c491a8cf240486ae7cc473092d"), }, @@ -223,11 +287,27 @@ host: %s "__meta_dockerswarm_service_id": model.LabelValue("uk9su5tb9ykfzew3qtmp14uzh"), "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/swarmprom-grafana:5.3.4"), "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), - "__meta_dockerswarm_service_name": model.LabelValue("mon_grafana"), "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_grafana"), "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/swarmprom-grafana:5.3.4@sha256:2aca8aa5716e6e0eed3fcdc88fec256a0a1828c491a8cf240486ae7cc473092d"), }, + { + "__address__": model.LabelValue("10.0.1.17:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_service_id": model.LabelValue("ul5qawv4s7f7msm7dtyfarw80"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("global"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_dockerd-exporter"), + "__meta_dockerswarm_service_task_container_hostname": model.LabelValue(""), + "__meta_dockerswarm_service_task_container_image": model.LabelValue("stefanprodan/caddy:latest@sha256:44541cfacb66f4799f81f17fcfb3cb757ccc8f327592745549f5930c42d115c9"), + }, } { t.Run(fmt.Sprintf("item %d", i), func(t *testing.T) { testutil.Equals(t, lbls, tg.Targets[i]) diff --git a/discovery/dockerswarm/tasks.go b/discovery/dockerswarm/tasks.go index 77514fedd..d42682a35 100644 --- a/discovery/dockerswarm/tasks.go +++ b/discovery/dockerswarm/tasks.go @@ -106,12 +106,19 @@ func (d *Discovery) refreshTasks(ctx context.Context) ([]*targetgroup.Group, err tg.Targets = append(tg.Targets, labels) } - for _, p := range servicePorts[s.ServiceID] { - if p.Protocol != swarm.PortConfigProtocolTCP { - continue - } - for _, network := range s.NetworksAttachments { - for _, address := range network.Addresses { + for _, network := range s.NetworksAttachments { + for _, address := range network.Addresses { + var added bool + + ip, _, err := net.ParseCIDR(address) + if err != nil { + return nil, fmt.Errorf("error while parsing address %s: %w", address, err) + } + + for _, p := range servicePorts[s.ServiceID] { + if p.Protocol != swarm.PortConfigProtocolTCP { + continue + } labels := model.LabelSet{ swarmLabelTaskPortMode: model.LabelValue(p.PublishMode), } @@ -124,13 +131,26 @@ func (d *Discovery) refreshTasks(ctx context.Context) ([]*targetgroup.Group, err labels[model.LabelName(k)] = model.LabelValue(v) } - ip, _, err := net.ParseCIDR(address) - if err != nil { - return nil, fmt.Errorf("error while parsing address %s: %w", address, err) - } addr := net.JoinHostPort(ip.String(), strconv.FormatUint(uint64(p.PublishedPort), 10)) labels[model.AddressLabel] = model.LabelValue(addr) + tg.Targets = append(tg.Targets, labels) + added = true + } + if !added { + labels := model.LabelSet{} + + for k, v := range commonLabels { + labels[model.LabelName(k)] = model.LabelValue(v) + } + + for k, v := range networkLabels[network.Network.ID] { + labels[model.LabelName(k)] = model.LabelValue(v) + } + + addr := net.JoinHostPort(ip.String(), fmt.Sprintf("%d", d.port)) + labels[model.AddressLabel] = model.LabelValue(addr) + tg.Targets = append(tg.Targets, labels) } } diff --git a/discovery/dockerswarm/tasks_test.go b/discovery/dockerswarm/tasks_test.go index 581eaf0c0..dfd3716fc 100644 --- a/discovery/dockerswarm/tasks_test.go +++ b/discovery/dockerswarm/tasks_test.go @@ -50,7 +50,7 @@ host: %s tg := tgs[0] testutil.Assert(t, tg != nil, "tg should not be nil") testutil.Assert(t, tg.Targets != nil, "tg.targets should not be nil") - testutil.Equals(t, 17, len(tg.Targets)) + testutil.Equals(t, 27, len(tg.Targets)) for i, lbls := range []model.LabelSet{ { @@ -108,6 +108,33 @@ host: %s "__meta_dockerswarm_task_slot": model.LabelValue("0"), "__meta_dockerswarm_task_state": model.LabelValue("running"), }, + { + "__address__": model.LabelValue("10.0.1.88:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.2"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("master-2"), + "__meta_dockerswarm_node_id": model.LabelValue("i9woemzxymn1n98o9ufebclgm"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("manager"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("iml8vdd2dudvq457sbirpf66z"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("google/cadvisor"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("global"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_cadvisor"), + "__meta_dockerswarm_task_container_id": model.LabelValue(""), + "__meta_dockerswarm_task_desired_state": model.LabelValue("ready"), + "__meta_dockerswarm_task_id": model.LabelValue("7ogolpkgw2d2amnht1fbtm9oq"), + "__meta_dockerswarm_task_slot": model.LabelValue("0"), + "__meta_dockerswarm_task_state": model.LabelValue("rejected"), + }, { "__address__": model.LabelValue("10.0.0.12:9100"), "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), @@ -273,6 +300,168 @@ host: %s "__meta_dockerswarm_task_slot": model.LabelValue("0"), "__meta_dockerswarm_task_state": model.LabelValue("running"), }, + { + "__address__": model.LabelValue("10.0.1.35:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.4"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("worker-1"), + "__meta_dockerswarm_node_id": model.LabelValue("jkc2xd7p3xdazf0u6sh1m9dmr"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("worker"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("9bbq7j55tzzz85k2gg52x73rg"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("cloudflare/unsee:v0.8.0"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_unsee"), + "__meta_dockerswarm_task_container_id": model.LabelValue("a0734f9421e710b654ca9e67010cbb55c1d5f92c17cc9e6590ab61130a3587e0"), + "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), + "__meta_dockerswarm_task_id": model.LabelValue("i9skiw2n5jkjoq7gix2t9uzhy"), + "__meta_dockerswarm_task_slot": model.LabelValue("1"), + "__meta_dockerswarm_task_state": model.LabelValue("running"), + }, + { + "__address__": model.LabelValue("10.0.1.14:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.1"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("oxygen"), + "__meta_dockerswarm_node_id": model.LabelValue("d3cw2msquo0d71yn42qrnb0tu"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("manager"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("hv645udwaaewyw7wuc6nspm68"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/swarmprom-prometheus:v2.5.0"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_prometheus"), + "__meta_dockerswarm_task_container_id": model.LabelValue("f35e071f1251951a09566a2231cb318a1a29e158a3c3d15ad68fd937184c56b6"), + "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), + "__meta_dockerswarm_task_id": model.LabelValue("irj35fr4j59f1kvi0xdin9oly"), + "__meta_dockerswarm_task_slot": model.LabelValue("1"), + "__meta_dockerswarm_task_state": model.LabelValue("running"), + }, + { + "__address__": model.LabelValue("10.0.1.20:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.1"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("oxygen"), + "__meta_dockerswarm_node_id": model.LabelValue("d3cw2msquo0d71yn42qrnb0tu"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("manager"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("ul5qawv4s7f7msm7dtyfarw80"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("global"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_dockerd-exporter"), + "__meta_dockerswarm_task_container_id": model.LabelValue("3cee48a5b2b363576b255207aae2d1bd0d8872aa61c3ff3b6d180d78d672a943"), + "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), + "__meta_dockerswarm_task_id": model.LabelValue("k8x2806pevvxigagsxovjmur1"), + "__meta_dockerswarm_task_slot": model.LabelValue("0"), + "__meta_dockerswarm_task_state": model.LabelValue("running"), + }, + { + "__address__": model.LabelValue("10.0.1.19:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.5"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("worker-2"), + "__meta_dockerswarm_node_id": model.LabelValue("ldawcom10uqi6owysgi28n4ve"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("worker"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("ul5qawv4s7f7msm7dtyfarw80"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("global"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_dockerd-exporter"), + "__meta_dockerswarm_task_container_id": model.LabelValue("d5fd335a33c1fca8fffa1ec17bb5010a6bb7fba7aa72fd2209c25be8f5d1b975"), + "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), + "__meta_dockerswarm_task_id": model.LabelValue("mita4y262u04g4c7zz7ns032a"), + "__meta_dockerswarm_task_slot": model.LabelValue("0"), + "__meta_dockerswarm_task_state": model.LabelValue("running"), + }, + { + "__address__": model.LabelValue("10.0.1.18:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.4"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("worker-1"), + "__meta_dockerswarm_node_id": model.LabelValue("jkc2xd7p3xdazf0u6sh1m9dmr"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("worker"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("ul5qawv4s7f7msm7dtyfarw80"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("global"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_dockerd-exporter"), + "__meta_dockerswarm_task_container_id": model.LabelValue("ca72094e1ec0547e84aba227dd44446588172fa9ee273de9bf4e6040ff6937bd"), + "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), + "__meta_dockerswarm_task_id": model.LabelValue("nm3v4jifzhfkw3rz33gmnaq2z"), + "__meta_dockerswarm_task_slot": model.LabelValue("0"), + "__meta_dockerswarm_task_state": model.LabelValue("running"), + }, + { + "__address__": model.LabelValue("10.0.1.75:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.5"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("worker-2"), + "__meta_dockerswarm_node_id": model.LabelValue("ldawcom10uqi6owysgi28n4ve"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("worker"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("iml8vdd2dudvq457sbirpf66z"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("google/cadvisor"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("global"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_cadvisor"), + "__meta_dockerswarm_task_container_id": model.LabelValue(""), + "__meta_dockerswarm_task_desired_state": model.LabelValue("shutdown"), + "__meta_dockerswarm_task_id": model.LabelValue("pxdv57mpvquv2zbt7faz3xux9"), + "__meta_dockerswarm_task_slot": model.LabelValue("0"), + "__meta_dockerswarm_task_state": model.LabelValue("rejected"), + }, { "__address__": model.LabelValue("10.0.0.19:9090"), "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), @@ -300,6 +489,60 @@ host: %s "__meta_dockerswarm_task_slot": model.LabelValue("1"), "__meta_dockerswarm_task_state": model.LabelValue("starting"), }, + { + "__address__": model.LabelValue("10.0.0.19:9093"), + "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), + "__meta_dockerswarm_network_ingress": model.LabelValue("true"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_name": model.LabelValue("ingress"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.2"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("master-2"), + "__meta_dockerswarm_node_id": model.LabelValue("i9woemzxymn1n98o9ufebclgm"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("manager"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), + "__meta_dockerswarm_task_container_id": model.LabelValue("5d00e145527f14d1bb2b13601000f1de9c95fc8ec1ccc1ff8291cadc31232957"), + "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), + "__meta_dockerswarm_task_id": model.LabelValue("qtr16op0cz5pdbx4rylm7up4g"), + "__meta_dockerswarm_task_port_publish_mode": model.LabelValue("ingress"), + "__meta_dockerswarm_task_slot": model.LabelValue("1"), + "__meta_dockerswarm_task_state": model.LabelValue("starting"), + }, + { + "__address__": model.LabelValue("10.0.0.19:9094"), + "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), + "__meta_dockerswarm_network_ingress": model.LabelValue("true"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_name": model.LabelValue("ingress"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.2"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("master-2"), + "__meta_dockerswarm_node_id": model.LabelValue("i9woemzxymn1n98o9ufebclgm"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("manager"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), + "__meta_dockerswarm_task_container_id": model.LabelValue("5d00e145527f14d1bb2b13601000f1de9c95fc8ec1ccc1ff8291cadc31232957"), + "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), + "__meta_dockerswarm_task_id": model.LabelValue("qtr16op0cz5pdbx4rylm7up4g"), + "__meta_dockerswarm_task_port_publish_mode": model.LabelValue("ingress"), + "__meta_dockerswarm_task_slot": model.LabelValue("1"), + "__meta_dockerswarm_task_state": model.LabelValue("starting"), + }, { "__address__": model.LabelValue("10.0.1.81:9090"), "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), @@ -328,33 +571,6 @@ host: %s "__meta_dockerswarm_task_slot": model.LabelValue("1"), "__meta_dockerswarm_task_state": model.LabelValue("starting"), }, - { - "__address__": model.LabelValue("10.0.0.19:9093"), - "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), - "__meta_dockerswarm_network_ingress": model.LabelValue("true"), - "__meta_dockerswarm_network_internal": model.LabelValue("false"), - "__meta_dockerswarm_network_name": model.LabelValue("ingress"), - "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), - "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.2"), - "__meta_dockerswarm_node_availability": model.LabelValue("active"), - "__meta_dockerswarm_node_hostname": model.LabelValue("master-2"), - "__meta_dockerswarm_node_id": model.LabelValue("i9woemzxymn1n98o9ufebclgm"), - "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), - "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), - "__meta_dockerswarm_node_role": model.LabelValue("manager"), - "__meta_dockerswarm_node_status": model.LabelValue("ready"), - "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), - "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), - "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), - "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), - "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), - "__meta_dockerswarm_task_container_id": model.LabelValue("5d00e145527f14d1bb2b13601000f1de9c95fc8ec1ccc1ff8291cadc31232957"), - "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), - "__meta_dockerswarm_task_id": model.LabelValue("qtr16op0cz5pdbx4rylm7up4g"), - "__meta_dockerswarm_task_port_publish_mode": model.LabelValue("ingress"), - "__meta_dockerswarm_task_slot": model.LabelValue("1"), - "__meta_dockerswarm_task_state": model.LabelValue("starting"), - }, { "__address__": model.LabelValue("10.0.1.81:9093"), "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), @@ -383,33 +599,6 @@ host: %s "__meta_dockerswarm_task_slot": model.LabelValue("1"), "__meta_dockerswarm_task_state": model.LabelValue("starting"), }, - { - "__address__": model.LabelValue("10.0.0.19:9094"), - "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), - "__meta_dockerswarm_network_ingress": model.LabelValue("true"), - "__meta_dockerswarm_network_internal": model.LabelValue("false"), - "__meta_dockerswarm_network_name": model.LabelValue("ingress"), - "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), - "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.2"), - "__meta_dockerswarm_node_availability": model.LabelValue("active"), - "__meta_dockerswarm_node_hostname": model.LabelValue("master-2"), - "__meta_dockerswarm_node_id": model.LabelValue("i9woemzxymn1n98o9ufebclgm"), - "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), - "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), - "__meta_dockerswarm_node_role": model.LabelValue("manager"), - "__meta_dockerswarm_node_status": model.LabelValue("ready"), - "__meta_dockerswarm_service_id": model.LabelValue("tkv91uso46cck763aaqcb4rek"), - "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), - "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), - "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), - "__meta_dockerswarm_service_name": model.LabelValue("mon_caddy"), - "__meta_dockerswarm_task_container_id": model.LabelValue("5d00e145527f14d1bb2b13601000f1de9c95fc8ec1ccc1ff8291cadc31232957"), - "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), - "__meta_dockerswarm_task_id": model.LabelValue("qtr16op0cz5pdbx4rylm7up4g"), - "__meta_dockerswarm_task_port_publish_mode": model.LabelValue("ingress"), - "__meta_dockerswarm_task_slot": model.LabelValue("1"), - "__meta_dockerswarm_task_state": model.LabelValue("starting"), - }, { "__address__": model.LabelValue("10.0.1.81:9094"), "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), @@ -438,6 +627,60 @@ host: %s "__meta_dockerswarm_task_slot": model.LabelValue("1"), "__meta_dockerswarm_task_state": model.LabelValue("starting"), }, + { + "__address__": model.LabelValue("10.0.1.24:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.1"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("oxygen"), + "__meta_dockerswarm_node_id": model.LabelValue("d3cw2msquo0d71yn42qrnb0tu"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("manager"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("iml8vdd2dudvq457sbirpf66z"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("google/cadvisor"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("global"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_cadvisor"), + "__meta_dockerswarm_task_container_id": model.LabelValue("81dd017b6d9f36d779a3217021111ffc77dcdbd5f26da86c2ae8fada86f33d17"), + "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), + "__meta_dockerswarm_task_id": model.LabelValue("s0rh3k9l7ii9vb62lsfp4wc93"), + "__meta_dockerswarm_task_slot": model.LabelValue("0"), + "__meta_dockerswarm_task_state": model.LabelValue("running"), + }, + { + "__address__": model.LabelValue("10.0.1.32:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.3"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("master-3"), + "__meta_dockerswarm_node_id": model.LabelValue("bvtjl7pnrtg0k88ywialsldpd"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("manager"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("rl4jhdws3r4lkfvq8kx6c4xnr"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/swarmprom-alertmanager:v0.14.0"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("replicated"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_alertmanager"), + "__meta_dockerswarm_task_container_id": model.LabelValue("2c753737f2ac7b01b577324513d9bd2a1754e65ab2a44714090eb5d83d2961b2"), + "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), + "__meta_dockerswarm_task_id": model.LabelValue("sxwkumr37wjaqzir89uepm4nc"), + "__meta_dockerswarm_task_slot": model.LabelValue("1"), + "__meta_dockerswarm_task_state": model.LabelValue("running"), + }, { "__address__": model.LabelValue("10.0.0.16:3000"), "__meta_dockerswarm_network_id": model.LabelValue("qvwhwd6p61k4o0ulsknqb066z"), @@ -515,6 +758,33 @@ host: %s "__meta_dockerswarm_task_slot": model.LabelValue("0"), "__meta_dockerswarm_task_state": model.LabelValue("running"), }, + { + "__address__": model.LabelValue("10.0.1.22:80"), + "__meta_dockerswarm_network_id": model.LabelValue("npq2closzy836m07eaq1425k3"), + "__meta_dockerswarm_network_ingress": model.LabelValue("false"), + "__meta_dockerswarm_network_internal": model.LabelValue("false"), + "__meta_dockerswarm_network_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_network_name": model.LabelValue("mon_net"), + "__meta_dockerswarm_network_scope": model.LabelValue("swarm"), + "__meta_dockerswarm_node_address": model.LabelValue("10.0.232.3"), + "__meta_dockerswarm_node_availability": model.LabelValue("active"), + "__meta_dockerswarm_node_hostname": model.LabelValue("master-3"), + "__meta_dockerswarm_node_id": model.LabelValue("bvtjl7pnrtg0k88ywialsldpd"), + "__meta_dockerswarm_node_platform_architecture": model.LabelValue("x86_64"), + "__meta_dockerswarm_node_platform_os": model.LabelValue("linux"), + "__meta_dockerswarm_node_role": model.LabelValue("manager"), + "__meta_dockerswarm_node_status": model.LabelValue("ready"), + "__meta_dockerswarm_service_id": model.LabelValue("ul5qawv4s7f7msm7dtyfarw80"), + "__meta_dockerswarm_service_label_com_docker_stack_image": model.LabelValue("stefanprodan/caddy"), + "__meta_dockerswarm_service_label_com_docker_stack_namespace": model.LabelValue("mon"), + "__meta_dockerswarm_service_mode": model.LabelValue("global"), + "__meta_dockerswarm_service_name": model.LabelValue("mon_dockerd-exporter"), + "__meta_dockerswarm_task_container_id": model.LabelValue("dd50c428ebc7a7bd786c7b0db873bf53ed5cbe5312995a76eb8fd325dcf16032"), + "__meta_dockerswarm_task_desired_state": model.LabelValue("running"), + "__meta_dockerswarm_task_id": model.LabelValue("zhoo9feqxfyi9zg6acnt1eam2"), + "__meta_dockerswarm_task_slot": model.LabelValue("0"), + "__meta_dockerswarm_task_state": model.LabelValue("running"), + }, } { t.Run(fmt.Sprintf("item %d", i), func(t *testing.T) { testutil.Equals(t, lbls, tg.Targets[i]) diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index 3d220ad14..24b32619c 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -459,7 +459,10 @@ One of the following roles can be configured to discover targets: #### `services` -The `services` role is used to discover [Swarm services](https://docs.docker.com/engine/swarm/key-concepts/#services-and-tasks). +The `services` role discovers all [Swarm services](https://docs.docker.com/engine/swarm/key-concepts/#services-and-tasks) +and exposes their ports as targets. For each published port of a service, a +single target is generated. If a service has no published ports, a target per +service is created using the `port` parameter defined in the SD configuration. Available meta labels: @@ -481,7 +484,10 @@ Available meta labels: #### `tasks` -The `tasks` role is used to discover [Swarm tasks](https://docs.docker.com/engine/swarm/key-concepts/#services-and-tasks). +The `tasks` role discovers all [Swarm tasks](https://docs.docker.com/engine/swarm/key-concepts/#services-and-tasks) +and exposes their ports as targets. For each published port of a task, a single +target is generated. If a task has no published ports, a target per task is +created using the `port` parameter defined in the SD configuration. Available meta labels: @@ -552,7 +558,8 @@ tls_config: # Role of the targets to retrieve. Must be `services`, `tasks`, or `nodes`. role: -# The port to scrape metrics from, when `role` is nodes. +# The port to scrape metrics from, when `role` is nodes, and for discovered +# tasks and services that don't have published ports. [ port: | default = 80 ] # The time after which the droplets are refreshed.