mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-13 17:14:05 -08:00
fix the issue of failing to match the first network when the container is reconnected to a new network
Signed-off-by: ouyang1204@gmail.com <ouyang1204@gmail.com>
This commit is contained in:
parent
26977b5c1e
commit
89dee48cc8
|
@ -19,6 +19,7 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -251,28 +252,26 @@ func (d *DockerDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, er
|
||||||
}
|
}
|
||||||
|
|
||||||
if d.matchFirstNetwork && len(networks) > 1 {
|
if d.matchFirstNetwork && len(networks) > 1 {
|
||||||
// Match user defined network
|
// Sort networks by name and take first non-nil network.
|
||||||
if containerNetworkMode.IsUserDefined() {
|
keys := make([]string, 0, len(networks))
|
||||||
networkMode := string(containerNetworkMode)
|
|
||||||
networks = map[string]*network.EndpointSettings{networkMode: networks[networkMode]}
|
|
||||||
} else {
|
|
||||||
// Get first network if container network mode has "none" value.
|
|
||||||
// This case appears under certain condition:
|
|
||||||
// 1. Container created with network set to "--net=none".
|
|
||||||
// 2. Disconnect network "none".
|
|
||||||
// 3. Reconnect network with user defined networks.
|
|
||||||
var first string
|
|
||||||
for k, n := range networks {
|
for k, n := range networks {
|
||||||
if n != nil {
|
if n != nil {
|
||||||
first = k
|
keys = append(keys, k)
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
networks = map[string]*network.EndpointSettings{first: networks[first]}
|
if len(keys) > 0 {
|
||||||
|
sort.Strings(keys)
|
||||||
|
firstNetworkMode := keys[0]
|
||||||
|
firstNetwork := networks[firstNetworkMode]
|
||||||
|
networks = map[string]*network.EndpointSettings{firstNetworkMode: firstNetwork}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, n := range networks {
|
for _, n := range networks {
|
||||||
|
if n == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
var added bool
|
var added bool
|
||||||
|
|
||||||
for _, p := range c.Ports {
|
for _, p := range c.Ports {
|
||||||
|
|
|
@ -60,9 +60,9 @@ host: %s
|
||||||
tg := tgs[0]
|
tg := tgs[0]
|
||||||
require.NotNil(t, tg)
|
require.NotNil(t, tg)
|
||||||
require.NotNil(t, tg.Targets)
|
require.NotNil(t, tg.Targets)
|
||||||
require.Len(t, tg.Targets, 6)
|
require.Len(t, tg.Targets, 8)
|
||||||
|
|
||||||
for i, lbls := range []model.LabelSet{
|
expected := []model.LabelSet{
|
||||||
{
|
{
|
||||||
"__address__": "172.19.0.2:9100",
|
"__address__": "172.19.0.2:9100",
|
||||||
"__meta_docker_container_id": "c301b928faceb1a18fe379f6bc178727ef920bb30b0f9b8592b32b36255a0eca",
|
"__meta_docker_container_id": "c301b928faceb1a18fe379f6bc178727ef920bb30b0f9b8592b32b36255a0eca",
|
||||||
|
@ -163,7 +163,43 @@ host: %s
|
||||||
"__meta_docker_network_scope": "local",
|
"__meta_docker_network_scope": "local",
|
||||||
"__meta_docker_port_private": "9104",
|
"__meta_docker_port_private": "9104",
|
||||||
},
|
},
|
||||||
} {
|
{
|
||||||
|
"__address__": "172.20.0.3:3306",
|
||||||
|
"__meta_docker_container_id": "f84b2a0cfaa58d9e70b0657e2b3c6f44f0e973de4163a871299b4acf127b224f",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_project": "dockersd",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_service": "mysql",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_version": "2.2.2",
|
||||||
|
"__meta_docker_container_name": "/dockersd_multi_networks",
|
||||||
|
"__meta_docker_container_network_mode": "dockersd_private_none",
|
||||||
|
"__meta_docker_network_id": "e804771e55254a360fdb70dfdd78d3610fdde231b14ef2f837a00ac1eeb9e601",
|
||||||
|
"__meta_docker_network_ingress": "false",
|
||||||
|
"__meta_docker_network_internal": "false",
|
||||||
|
"__meta_docker_network_ip": "172.20.0.3",
|
||||||
|
"__meta_docker_network_name": "dockersd_private",
|
||||||
|
"__meta_docker_network_scope": "local",
|
||||||
|
"__meta_docker_port_private": "3306",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__address__": "172.20.0.3:33060",
|
||||||
|
"__meta_docker_container_id": "f84b2a0cfaa58d9e70b0657e2b3c6f44f0e973de4163a871299b4acf127b224f",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_project": "dockersd",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_service": "mysql",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_version": "2.2.2",
|
||||||
|
"__meta_docker_container_name": "/dockersd_multi_networks",
|
||||||
|
"__meta_docker_container_network_mode": "dockersd_private_none",
|
||||||
|
"__meta_docker_network_id": "e804771e55254a360fdb70dfdd78d3610fdde231b14ef2f837a00ac1eeb9e601",
|
||||||
|
"__meta_docker_network_ingress": "false",
|
||||||
|
"__meta_docker_network_internal": "false",
|
||||||
|
"__meta_docker_network_ip": "172.20.0.3",
|
||||||
|
"__meta_docker_network_name": "dockersd_private",
|
||||||
|
"__meta_docker_network_scope": "local",
|
||||||
|
"__meta_docker_port_private": "33060",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
sortFunc(expected)
|
||||||
|
sortFunc(tg.Targets)
|
||||||
|
|
||||||
|
for i, lbls := range expected {
|
||||||
t.Run(fmt.Sprintf("item %d", i), func(t *testing.T) {
|
t.Run(fmt.Sprintf("item %d", i), func(t *testing.T) {
|
||||||
require.Equal(t, lbls, tg.Targets[i])
|
require.Equal(t, lbls, tg.Targets[i])
|
||||||
})
|
})
|
||||||
|
@ -202,13 +238,8 @@ host: %s
|
||||||
tg := tgs[0]
|
tg := tgs[0]
|
||||||
require.NotNil(t, tg)
|
require.NotNil(t, tg)
|
||||||
require.NotNil(t, tg.Targets)
|
require.NotNil(t, tg.Targets)
|
||||||
require.Len(t, tg.Targets, 9)
|
require.Len(t, tg.Targets, 13)
|
||||||
|
|
||||||
sortFunc := func(labelSets []model.LabelSet) {
|
|
||||||
sort.Slice(labelSets, func(i, j int) bool {
|
|
||||||
return labelSets[i]["__address__"] < labelSets[j]["__address__"]
|
|
||||||
})
|
|
||||||
}
|
|
||||||
expected := []model.LabelSet{
|
expected := []model.LabelSet{
|
||||||
{
|
{
|
||||||
"__address__": "172.19.0.2:9100",
|
"__address__": "172.19.0.2:9100",
|
||||||
|
@ -359,6 +390,70 @@ host: %s
|
||||||
"__meta_docker_network_scope": "local",
|
"__meta_docker_network_scope": "local",
|
||||||
"__meta_docker_port_private": "9104",
|
"__meta_docker_port_private": "9104",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"__address__": "172.20.0.3:3306",
|
||||||
|
"__meta_docker_container_id": "f84b2a0cfaa58d9e70b0657e2b3c6f44f0e973de4163a871299b4acf127b224f",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_project": "dockersd",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_service": "mysql",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_version": "2.2.2",
|
||||||
|
"__meta_docker_container_name": "/dockersd_multi_networks",
|
||||||
|
"__meta_docker_container_network_mode": "dockersd_private_none",
|
||||||
|
"__meta_docker_network_id": "e804771e55254a360fdb70dfdd78d3610fdde231b14ef2f837a00ac1eeb9e601",
|
||||||
|
"__meta_docker_network_ingress": "false",
|
||||||
|
"__meta_docker_network_internal": "false",
|
||||||
|
"__meta_docker_network_ip": "172.20.0.3",
|
||||||
|
"__meta_docker_network_name": "dockersd_private",
|
||||||
|
"__meta_docker_network_scope": "local",
|
||||||
|
"__meta_docker_port_private": "3306",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__address__": "172.20.0.3:33060",
|
||||||
|
"__meta_docker_container_id": "f84b2a0cfaa58d9e70b0657e2b3c6f44f0e973de4163a871299b4acf127b224f",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_project": "dockersd",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_service": "mysql",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_version": "2.2.2",
|
||||||
|
"__meta_docker_container_name": "/dockersd_multi_networks",
|
||||||
|
"__meta_docker_container_network_mode": "dockersd_private_none",
|
||||||
|
"__meta_docker_network_id": "e804771e55254a360fdb70dfdd78d3610fdde231b14ef2f837a00ac1eeb9e601",
|
||||||
|
"__meta_docker_network_ingress": "false",
|
||||||
|
"__meta_docker_network_internal": "false",
|
||||||
|
"__meta_docker_network_ip": "172.20.0.3",
|
||||||
|
"__meta_docker_network_name": "dockersd_private",
|
||||||
|
"__meta_docker_network_scope": "local",
|
||||||
|
"__meta_docker_port_private": "33060",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__address__": "172.21.0.3:3306",
|
||||||
|
"__meta_docker_container_id": "f84b2a0cfaa58d9e70b0657e2b3c6f44f0e973de4163a871299b4acf127b224f",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_project": "dockersd",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_service": "mysql",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_version": "2.2.2",
|
||||||
|
"__meta_docker_container_name": "/dockersd_multi_networks",
|
||||||
|
"__meta_docker_container_network_mode": "dockersd_private_none",
|
||||||
|
"__meta_docker_network_id": "bfcf66a6b64f7d518f009e34290dc3f3c66a08164257ad1afc3bd31d75f656e8",
|
||||||
|
"__meta_docker_network_ingress": "false",
|
||||||
|
"__meta_docker_network_internal": "false",
|
||||||
|
"__meta_docker_network_ip": "172.21.0.3",
|
||||||
|
"__meta_docker_network_name": "dockersd_private1",
|
||||||
|
"__meta_docker_network_scope": "local",
|
||||||
|
"__meta_docker_port_private": "3306",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__address__": "172.21.0.3:33060",
|
||||||
|
"__meta_docker_container_id": "f84b2a0cfaa58d9e70b0657e2b3c6f44f0e973de4163a871299b4acf127b224f",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_project": "dockersd",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_service": "mysql",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_version": "2.2.2",
|
||||||
|
"__meta_docker_container_name": "/dockersd_multi_networks",
|
||||||
|
"__meta_docker_container_network_mode": "dockersd_private_none",
|
||||||
|
"__meta_docker_network_id": "bfcf66a6b64f7d518f009e34290dc3f3c66a08164257ad1afc3bd31d75f656e8",
|
||||||
|
"__meta_docker_network_ingress": "false",
|
||||||
|
"__meta_docker_network_internal": "false",
|
||||||
|
"__meta_docker_network_ip": "172.21.0.3",
|
||||||
|
"__meta_docker_network_name": "dockersd_private1",
|
||||||
|
"__meta_docker_network_scope": "local",
|
||||||
|
"__meta_docker_port_private": "33060",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
sortFunc(expected)
|
sortFunc(expected)
|
||||||
|
@ -370,3 +465,9 @@ host: %s
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func sortFunc(labelSets []model.LabelSet) {
|
||||||
|
sort.Slice(labelSets, func(i, j int) bool {
|
||||||
|
return labelSets[i]["__address__"] < labelSets[j]["__address__"]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -228,5 +228,74 @@
|
||||||
"Networks": {}
|
"Networks": {}
|
||||||
},
|
},
|
||||||
"Mounts": []
|
"Mounts": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Id": "f84b2a0cfaa58d9e70b0657e2b3c6f44f0e973de4163a871299b4acf127b224f",
|
||||||
|
"Names": [
|
||||||
|
"/dockersd_multi_networks"
|
||||||
|
],
|
||||||
|
"Image": "mysql:5.7.29",
|
||||||
|
"ImageID": "sha256:16ae2f4625ba63a250462bedeece422e741de9f0caf3b1d89fd5b257aca80cd1",
|
||||||
|
"Command": "mysqld",
|
||||||
|
"Created": 1616273136,
|
||||||
|
"Ports": [
|
||||||
|
{
|
||||||
|
"PrivatePort": 3306,
|
||||||
|
"Type": "tcp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"PrivatePort": 33060,
|
||||||
|
"Type": "tcp"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Labels": {
|
||||||
|
"com.docker.compose.project": "dockersd",
|
||||||
|
"com.docker.compose.service": "mysql",
|
||||||
|
"com.docker.compose.version": "2.2.2"
|
||||||
|
},
|
||||||
|
"State": "running",
|
||||||
|
"Status": "Up 40 seconds",
|
||||||
|
"HostConfig": {
|
||||||
|
"NetworkMode": "dockersd_private_none"
|
||||||
|
},
|
||||||
|
"NetworkSettings": {
|
||||||
|
"Networks": {
|
||||||
|
"dockersd_private": {
|
||||||
|
"IPAMConfig": null,
|
||||||
|
"Links": null,
|
||||||
|
"Aliases": null,
|
||||||
|
"NetworkID": "e804771e55254a360fdb70dfdd78d3610fdde231b14ef2f837a00ac1eeb9e601",
|
||||||
|
"EndpointID": "972d6807997369605ace863af58de6cb90c787a5bf2ffc4105662d393ae539b7",
|
||||||
|
"Gateway": "172.20.0.1",
|
||||||
|
"IPAddress": "172.20.0.3",
|
||||||
|
"IPPrefixLen": 16,
|
||||||
|
"IPv6Gateway": "",
|
||||||
|
"GlobalIPv6Address": "",
|
||||||
|
"GlobalIPv6PrefixLen": 0,
|
||||||
|
"MacAddress": "02:42:ac:14:00:02",
|
||||||
|
"DriverOpts": null
|
||||||
|
},
|
||||||
|
"dockersd_private1": {
|
||||||
|
"IPAMConfig": {},
|
||||||
|
"Links": null,
|
||||||
|
"Aliases": [
|
||||||
|
"mysql",
|
||||||
|
"mysql",
|
||||||
|
"f9ade4b83199"
|
||||||
|
],
|
||||||
|
"NetworkID": "bfcf66a6b64f7d518f009e34290dc3f3c66a08164257ad1afc3bd31d75f656e8",
|
||||||
|
"EndpointID": "91a98405344ee1cb7d977cafabe634837876651544b32da20a5e0155868e6f5f",
|
||||||
|
"Gateway": "172.21.0.1",
|
||||||
|
"IPAddress": "172.21.0.3",
|
||||||
|
"IPPrefixLen": 24,
|
||||||
|
"IPv6Gateway": "",
|
||||||
|
"GlobalIPv6Address": "",
|
||||||
|
"GlobalIPv6PrefixLen": 0,
|
||||||
|
"MacAddress": "02:42:ac:15:00:02",
|
||||||
|
"DriverOpts": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Mounts": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -943,7 +943,9 @@ tls_config:
|
||||||
# The host to use if the container is in host networking mode.
|
# The host to use if the container is in host networking mode.
|
||||||
[ host_networking_host: <string> | default = "localhost" ]
|
[ host_networking_host: <string> | default = "localhost" ]
|
||||||
|
|
||||||
# Match the first network if the container has multiple networks defined, thus avoiding collecting duplicate targets.
|
# Sort all non-nil networks in ascending order based on network name and
|
||||||
|
# get the first network if the container has multiple networks defined,
|
||||||
|
# thus avoiding collecting duplicate targets.
|
||||||
[ match_first_network: <boolean> | default = true ]
|
[ match_first_network: <boolean> | default = true ]
|
||||||
|
|
||||||
# Optional filters to limit the discovery process to a subset of available
|
# Optional filters to limit the discovery process to a subset of available
|
||||||
|
|
Loading…
Reference in a new issue