mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-16 00:41:24 +01:00
lib/promscrape/discovery/docker: support host networking mode
See https://github.com/prometheus/prometheus/issues/9116
This commit is contained in:
parent
6ed9f10da5
commit
b684624f67
@ -21,6 +21,7 @@ sort: 15
|
|||||||
* BUGFIX: vmselect: reset connection timeouts after each request to `vmstorage`. This should prevent from `cannot read data in 0.000 seconds: unexpected EOF` warning in logs. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1562). Thanks to @mxlxm .
|
* BUGFIX: vmselect: reset connection timeouts after each request to `vmstorage`. This should prevent from `cannot read data in 0.000 seconds: unexpected EOF` warning in logs. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1562). Thanks to @mxlxm .
|
||||||
* BUGFIX: keep metric name for time series returned from [rollup_candlestick](https://docs.victoriametrics.com/MetricsQL.html#rollup_candlestick) function, since the returned series don't change the meaning of the original series. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1600).
|
* BUGFIX: keep metric name for time series returned from [rollup_candlestick](https://docs.victoriametrics.com/MetricsQL.html#rollup_candlestick) function, since the returned series don't change the meaning of the original series. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1600).
|
||||||
* BUGFIX: vmagent: properly use `https` scheme for wildcard TLS certificates for `role: ingress` targets in Kubernetes service discovery. See [this issue](https://github.com/prometheus/prometheus/issues/8902).
|
* BUGFIX: vmagent: properly use `https` scheme for wildcard TLS certificates for `role: ingress` targets in Kubernetes service discovery. See [this issue](https://github.com/prometheus/prometheus/issues/8902).
|
||||||
|
* BUGFIX: vmagent: support host networking mode for `docker_sd_config`. See [this issue](https://github.com/prometheus/prometheus/issues/9116).
|
||||||
|
|
||||||
|
|
||||||
## [v1.65.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.65.0)
|
## [v1.65.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.65.0)
|
||||||
|
@ -13,8 +13,9 @@ import (
|
|||||||
var configMap = discoveryutils.NewConfigMap()
|
var configMap = discoveryutils.NewConfigMap()
|
||||||
|
|
||||||
type apiConfig struct {
|
type apiConfig struct {
|
||||||
client *discoveryutils.Client
|
client *discoveryutils.Client
|
||||||
port int
|
port int
|
||||||
|
hostNetworkingHost string
|
||||||
|
|
||||||
// filtersQueryArg contains escaped `filters` query arg to add to each request to Docker Swarm API.
|
// filtersQueryArg contains escaped `filters` query arg to add to each request to Docker Swarm API.
|
||||||
filtersQueryArg string
|
filtersQueryArg string
|
||||||
@ -29,9 +30,14 @@ func getAPIConfig(sdc *SDConfig, baseDir string) (*apiConfig, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func newAPIConfig(sdc *SDConfig, baseDir string) (*apiConfig, error) {
|
func newAPIConfig(sdc *SDConfig, baseDir string) (*apiConfig, error) {
|
||||||
|
hostNetworkingHost := sdc.HostNetworkingHost
|
||||||
|
if hostNetworkingHost == "" {
|
||||||
|
hostNetworkingHost = "localhost"
|
||||||
|
}
|
||||||
cfg := &apiConfig{
|
cfg := &apiConfig{
|
||||||
port: sdc.Port,
|
port: sdc.Port,
|
||||||
filtersQueryArg: getFiltersQueryArg(sdc.Filters),
|
hostNetworkingHost: hostNetworkingHost,
|
||||||
|
filtersQueryArg: getFiltersQueryArg(sdc.Filters),
|
||||||
}
|
}
|
||||||
if cfg.port == 0 {
|
if cfg.port == 0 {
|
||||||
cfg.port = 80
|
cfg.port = 80
|
||||||
|
@ -39,7 +39,7 @@ func getContainersLabels(cfg *apiConfig) ([]map[string]string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return addContainersLabels(containers, networkLabels, cfg.port), nil
|
return addContainersLabels(containers, networkLabels, cfg.port, cfg.hostNetworkingHost), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getContainers(cfg *apiConfig) ([]container, error) {
|
func getContainers(cfg *apiConfig) ([]container, error) {
|
||||||
@ -58,7 +58,7 @@ func parseContainers(data []byte) ([]container, error) {
|
|||||||
return containers, nil
|
return containers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func addContainersLabels(containers []container, networkLabels map[string]map[string]string, defaultPort int) []map[string]string {
|
func addContainersLabels(containers []container, networkLabels map[string]map[string]string, defaultPort int, hostNetworkingHost string) []map[string]string {
|
||||||
var ms []map[string]string
|
var ms []map[string]string
|
||||||
for i := range containers {
|
for i := range containers {
|
||||||
c := &containers[i]
|
c := &containers[i]
|
||||||
@ -86,8 +86,12 @@ func addContainersLabels(containers []container, networkLabels map[string]map[st
|
|||||||
}
|
}
|
||||||
if !added {
|
if !added {
|
||||||
// Use fallback port when no exposed ports are available or if all are non-TCP
|
// Use fallback port when no exposed ports are available or if all are non-TCP
|
||||||
|
addr := hostNetworkingHost
|
||||||
|
if c.HostConfig.NetworkMode != "host" {
|
||||||
|
addr = discoveryutils.JoinHostPort(n.IPAddress, defaultPort)
|
||||||
|
}
|
||||||
m := map[string]string{
|
m := map[string]string{
|
||||||
"__address__": discoveryutils.JoinHostPort(n.IPAddress, defaultPort),
|
"__address__": addr,
|
||||||
"__meta_docker_network_ip": n.IPAddress,
|
"__meta_docker_network_ip": n.IPAddress,
|
||||||
}
|
}
|
||||||
addCommonLabels(m, c, networkLabels[n.NetworkID])
|
addCommonLabels(m, c, networkLabels[n.NetworkID])
|
||||||
|
@ -317,6 +317,118 @@ func Test_addContainerLabels(t *testing.T) {
|
|||||||
want []map[string]string
|
want []map[string]string
|
||||||
wantErr bool
|
wantErr bool
|
||||||
}{
|
}{
|
||||||
|
{
|
||||||
|
name: "NetworkMode!=host",
|
||||||
|
c: container{
|
||||||
|
ID: "90bc3b31aa13da5c0b11af2e228d54b38428a84e25d4e249ae9e9c95e51a0700",
|
||||||
|
Names: []string{"/crow-server"},
|
||||||
|
Labels: map[string]string{
|
||||||
|
"com.docker.compose.config-hash": "c9f0bd5bb31921f94cff367d819a30a0cc08d4399080897a6c5cd74b983156ec",
|
||||||
|
"com.docker.compose.container-number": "1",
|
||||||
|
"com.docker.compose.oneoff": "False",
|
||||||
|
"com.docker.compose.project": "crowserver",
|
||||||
|
"com.docker.compose.service": "crow-server",
|
||||||
|
"com.docker.compose.version": "1.11.2",
|
||||||
|
},
|
||||||
|
HostConfig: struct {
|
||||||
|
NetworkMode string
|
||||||
|
}{
|
||||||
|
NetworkMode: "bridge",
|
||||||
|
},
|
||||||
|
NetworkSettings: struct {
|
||||||
|
Networks map[string]struct {
|
||||||
|
IPAddress string
|
||||||
|
NetworkID string
|
||||||
|
}
|
||||||
|
}{
|
||||||
|
Networks: map[string]struct {
|
||||||
|
IPAddress string
|
||||||
|
NetworkID string
|
||||||
|
}{
|
||||||
|
"host": {
|
||||||
|
IPAddress: "172.17.0.2",
|
||||||
|
NetworkID: "1dd8d1a8bef59943345c7231d7ce8268333ff5a8c5b3c94881e6b4742b447634",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: []map[string]string{
|
||||||
|
{
|
||||||
|
"__address__": "172.17.0.2:8012",
|
||||||
|
"__meta_docker_container_id": "90bc3b31aa13da5c0b11af2e228d54b38428a84e25d4e249ae9e9c95e51a0700",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_config_hash": "c9f0bd5bb31921f94cff367d819a30a0cc08d4399080897a6c5cd74b983156ec",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_container_number": "1",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_oneoff": "False",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_project": "crowserver",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_service": "crow-server",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_version": "1.11.2",
|
||||||
|
"__meta_docker_container_name": "/crow-server",
|
||||||
|
"__meta_docker_container_network_mode": "bridge",
|
||||||
|
"__meta_docker_network_id": "1dd8d1a8bef59943345c7231d7ce8268333ff5a8c5b3c94881e6b4742b447634",
|
||||||
|
"__meta_docker_network_ingress": "false",
|
||||||
|
"__meta_docker_network_internal": "false",
|
||||||
|
"__meta_docker_network_ip": "172.17.0.2",
|
||||||
|
"__meta_docker_network_name": "bridge",
|
||||||
|
"__meta_docker_network_scope": "local",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "NetworkMode=host",
|
||||||
|
c: container{
|
||||||
|
ID: "90bc3b31aa13da5c0b11af2e228d54b38428a84e25d4e249ae9e9c95e51a0700",
|
||||||
|
Names: []string{"/crow-server"},
|
||||||
|
Labels: map[string]string{
|
||||||
|
"com.docker.compose.config-hash": "c9f0bd5bb31921f94cff367d819a30a0cc08d4399080897a6c5cd74b983156ec",
|
||||||
|
"com.docker.compose.container-number": "1",
|
||||||
|
"com.docker.compose.oneoff": "False",
|
||||||
|
"com.docker.compose.project": "crowserver",
|
||||||
|
"com.docker.compose.service": "crow-server",
|
||||||
|
"com.docker.compose.version": "1.11.2",
|
||||||
|
},
|
||||||
|
HostConfig: struct {
|
||||||
|
NetworkMode string
|
||||||
|
}{
|
||||||
|
NetworkMode: "host",
|
||||||
|
},
|
||||||
|
NetworkSettings: struct {
|
||||||
|
Networks map[string]struct {
|
||||||
|
IPAddress string
|
||||||
|
NetworkID string
|
||||||
|
}
|
||||||
|
}{
|
||||||
|
Networks: map[string]struct {
|
||||||
|
IPAddress string
|
||||||
|
NetworkID string
|
||||||
|
}{
|
||||||
|
"host": {
|
||||||
|
IPAddress: "172.17.0.2",
|
||||||
|
NetworkID: "1dd8d1a8bef59943345c7231d7ce8268333ff5a8c5b3c94881e6b4742b447634",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: []map[string]string{
|
||||||
|
{
|
||||||
|
"__address__": "foobar",
|
||||||
|
"__meta_docker_container_id": "90bc3b31aa13da5c0b11af2e228d54b38428a84e25d4e249ae9e9c95e51a0700",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_config_hash": "c9f0bd5bb31921f94cff367d819a30a0cc08d4399080897a6c5cd74b983156ec",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_container_number": "1",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_oneoff": "False",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_project": "crowserver",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_service": "crow-server",
|
||||||
|
"__meta_docker_container_label_com_docker_compose_version": "1.11.2",
|
||||||
|
"__meta_docker_container_name": "/crow-server",
|
||||||
|
"__meta_docker_container_network_mode": "host",
|
||||||
|
"__meta_docker_network_id": "1dd8d1a8bef59943345c7231d7ce8268333ff5a8c5b3c94881e6b4742b447634",
|
||||||
|
"__meta_docker_network_ingress": "false",
|
||||||
|
"__meta_docker_network_internal": "false",
|
||||||
|
"__meta_docker_network_ip": "172.17.0.2",
|
||||||
|
"__meta_docker_network_name": "bridge",
|
||||||
|
"__meta_docker_network_scope": "local",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "get labels from a container",
|
name: "get labels from a container",
|
||||||
c: container{
|
c: container{
|
||||||
@ -391,7 +503,7 @@ func Test_addContainerLabels(t *testing.T) {
|
|||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
labelsMap := addContainersLabels([]container{tt.c}, networkLabels, 80)
|
labelsMap := addContainersLabels([]container{tt.c}, networkLabels, 8012, "foobar")
|
||||||
if (err != nil) != tt.wantErr {
|
if (err != nil) != tt.wantErr {
|
||||||
t.Errorf("addContainersLabels() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("addContainersLabels() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
return
|
return
|
||||||
|
@ -18,9 +18,10 @@ var SDCheckInterval = flag.Duration("promscrape.dockerSDCheckInterval", 30*time.
|
|||||||
//
|
//
|
||||||
// See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config
|
// See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config
|
||||||
type SDConfig struct {
|
type SDConfig struct {
|
||||||
Host string `yaml:"host"`
|
Host string `yaml:"host"`
|
||||||
Port int `yaml:"port,omitempty"`
|
Port int `yaml:"port,omitempty"`
|
||||||
Filters []Filter `yaml:"filters,omitempty"`
|
Filters []Filter `yaml:"filters,omitempty"`
|
||||||
|
HostNetworkingHost string `yaml:"host_networking_host,omitempty"`
|
||||||
|
|
||||||
HTTPClientConfig promauth.HTTPClientConfig `yaml:",inline"`
|
HTTPClientConfig promauth.HTTPClientConfig `yaml:",inline"`
|
||||||
ProxyURL proxy.URL `yaml:"proxy_url,omitempty"`
|
ProxyURL proxy.URL `yaml:"proxy_url,omitempty"`
|
||||||
|
Loading…
Reference in New Issue
Block a user