2021-06-25 10:42:47 +02:00
|
|
|
package docker
|
2020-10-12 12:38:21 +02:00
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discoveryutils"
|
|
|
|
)
|
|
|
|
|
|
|
|
// See https://docs.docker.com/engine/api/v1.40/#tag/Network
|
|
|
|
type network struct {
|
|
|
|
ID string
|
|
|
|
Name string
|
|
|
|
Scope string
|
|
|
|
Internal bool
|
|
|
|
Ingress bool
|
|
|
|
Labels map[string]string
|
|
|
|
}
|
|
|
|
|
2021-06-25 10:42:47 +02:00
|
|
|
func getNetworksLabels(cfg *apiConfig, labelPrefix string) (map[string]map[string]string, error) {
|
2020-10-12 12:38:21 +02:00
|
|
|
networks, err := getNetworks(cfg)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2021-06-25 10:42:47 +02:00
|
|
|
return getNetworkLabelsGroupByNetworkID(networks, labelPrefix), nil
|
2020-10-12 12:38:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func getNetworks(cfg *apiConfig) ([]network, error) {
|
2020-11-23 15:26:52 +01:00
|
|
|
resp, err := cfg.getAPIResponse("/networks")
|
2020-10-12 12:38:21 +02:00
|
|
|
if err != nil {
|
2021-06-25 10:42:47 +02:00
|
|
|
return nil, fmt.Errorf("cannot query docker/dockerswarm api for networks: %w", err)
|
2020-10-12 12:38:21 +02:00
|
|
|
}
|
|
|
|
return parseNetworks(resp)
|
|
|
|
}
|
|
|
|
|
|
|
|
func parseNetworks(data []byte) ([]network, error) {
|
|
|
|
var networks []network
|
|
|
|
if err := json.Unmarshal(data, &networks); err != nil {
|
|
|
|
return nil, fmt.Errorf("cannot parse networks: %w", err)
|
|
|
|
}
|
|
|
|
return networks, nil
|
|
|
|
}
|
|
|
|
|
2021-06-25 10:42:47 +02:00
|
|
|
func getNetworkLabelsGroupByNetworkID(networks []network, labelPrefix string) map[string]map[string]string {
|
2020-10-12 15:12:36 +02:00
|
|
|
ms := make(map[string]map[string]string)
|
2020-10-12 12:38:21 +02:00
|
|
|
for _, network := range networks {
|
|
|
|
m := map[string]string{
|
2021-06-25 10:42:47 +02:00
|
|
|
labelPrefix + "network_id": network.ID,
|
|
|
|
labelPrefix + "network_name": network.Name,
|
|
|
|
labelPrefix + "network_internal": strconv.FormatBool(network.Internal),
|
|
|
|
labelPrefix + "network_ingress": strconv.FormatBool(network.Ingress),
|
|
|
|
labelPrefix + "network_scope": network.Scope,
|
2020-10-12 12:38:21 +02:00
|
|
|
}
|
|
|
|
for k, v := range network.Labels {
|
2021-06-25 10:42:47 +02:00
|
|
|
m[labelPrefix+"network_label_"+discoveryutils.SanitizeLabelName(k)] = v
|
2020-10-12 12:38:21 +02:00
|
|
|
}
|
2020-10-12 15:12:36 +02:00
|
|
|
ms[network.ID] = m
|
2020-10-12 12:38:21 +02:00
|
|
|
}
|
|
|
|
return ms
|
|
|
|
}
|