mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-22 08:26:19 +01:00
f325410c26
- Return meta-labels for the discovered targets via promutils.Labels instead of map[string]string. This improves the speed of generating meta-labels for discovered targets by up to 5x. - Remove memory allocations in hot paths during ScrapeWork generation. The ScrapeWork contains scrape settings for a single discovered target. This improves the service discovery speed by up to 2x.
360 lines
12 KiB
Go
360 lines
12 KiB
Go
package dockerswarm
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discoveryutils"
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils"
|
|
)
|
|
|
|
func Test_parseTasks(t *testing.T) {
|
|
type args struct {
|
|
data []byte
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want []task
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "parse ok",
|
|
args: args{
|
|
data: []byte(`[
|
|
{
|
|
"ID": "t4rdm7j2y9yctbrksiwvsgpu5",
|
|
"Version": {
|
|
"Index": 23
|
|
},
|
|
"Spec": {
|
|
"ContainerSpec": {
|
|
"Image": "redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842",
|
|
"Init": false,
|
|
"Labels": {
|
|
"label1": "value1"
|
|
}
|
|
},
|
|
"Resources": {
|
|
"Limits": {},
|
|
"Reservations": {}
|
|
},
|
|
"Placement": {
|
|
"Platforms": [
|
|
{
|
|
"Architecture": "amd64",
|
|
"OS": "linux"
|
|
}
|
|
]
|
|
},
|
|
"ForceUpdate": 0
|
|
},
|
|
"ServiceID": "t91nf284wzle1ya09lqvyjgnq",
|
|
"Slot": 1,
|
|
"NodeID": "qauwmifceyvqs0sipvzu8oslu",
|
|
"Status": {
|
|
"State": "running",
|
|
"ContainerStatus": {
|
|
"ContainerID": "33034b69f6fa5f808098208752fd1fe4e0e1ca86311988cea6a73b998cdc62e8",
|
|
"ExitCode": 0
|
|
},
|
|
"PortStatus": {}
|
|
},
|
|
"DesiredState": "running"
|
|
}
|
|
]
|
|
`),
|
|
},
|
|
want: []task{
|
|
{
|
|
ID: "t4rdm7j2y9yctbrksiwvsgpu5",
|
|
ServiceID: "t91nf284wzle1ya09lqvyjgnq",
|
|
NodeID: "qauwmifceyvqs0sipvzu8oslu",
|
|
Spec: struct {
|
|
ContainerSpec struct {
|
|
Labels map[string]string
|
|
}
|
|
}{
|
|
ContainerSpec: struct {
|
|
Labels map[string]string
|
|
}{
|
|
Labels: map[string]string{
|
|
"label1": "value1",
|
|
},
|
|
},
|
|
},
|
|
DesiredState: "running",
|
|
Slot: 1,
|
|
Status: struct {
|
|
State string
|
|
ContainerStatus struct{ ContainerID string }
|
|
PortStatus struct{ Ports []portConfig }
|
|
}{
|
|
State: "running",
|
|
ContainerStatus: struct{ ContainerID string }{
|
|
ContainerID: "33034b69f6fa5f808098208752fd1fe4e0e1ca86311988cea6a73b998cdc62e8",
|
|
},
|
|
PortStatus: struct{ Ports []portConfig }{}},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := parseTasks(tt.args.data)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("parseTasks() error = %v, wantErr %v", err, tt.wantErr)
|
|
return
|
|
}
|
|
if !reflect.DeepEqual(got, tt.want) {
|
|
t.Errorf("parseTasks() got\n%v\nwant\n%v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_addTasksLabels(t *testing.T) {
|
|
type args struct {
|
|
tasks []task
|
|
nodesLabels []*promutils.Labels
|
|
servicesLabels []*promutils.Labels
|
|
networksLabels map[string]*promutils.Labels
|
|
services []service
|
|
port int
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want []*promutils.Labels
|
|
}{
|
|
{
|
|
name: "adds 1 task with nodes labels",
|
|
args: args{
|
|
port: 9100,
|
|
tasks: []task{
|
|
{
|
|
ID: "t4rdm7j2y9yctbrksiwvsgpu5",
|
|
ServiceID: "t91nf284wzle1ya09lqvyjgnq",
|
|
NodeID: "qauwmifceyvqs0sipvzu8oslu",
|
|
DesiredState: "running",
|
|
Slot: 1,
|
|
Status: struct {
|
|
State string
|
|
ContainerStatus struct{ ContainerID string }
|
|
PortStatus struct{ Ports []portConfig }
|
|
}{
|
|
State: "running",
|
|
ContainerStatus: struct{ ContainerID string }{
|
|
ContainerID: "33034b69f6fa5f808098208752fd1fe4e0e1ca86311988cea6a73b998cdc62e8",
|
|
},
|
|
PortStatus: struct{ Ports []portConfig }{
|
|
Ports: []portConfig{
|
|
{
|
|
PublishMode: "ingress",
|
|
Name: "redis",
|
|
Protocol: "tcp",
|
|
PublishedPort: 6379,
|
|
},
|
|
},
|
|
}},
|
|
},
|
|
},
|
|
nodesLabels: []*promutils.Labels{
|
|
promutils.NewLabelsFromMap(map[string]string{
|
|
"__address__": "172.31.40.97:9100",
|
|
"__meta_dockerswarm_node_address": "172.31.40.97",
|
|
"__meta_dockerswarm_node_availability": "active",
|
|
"__meta_dockerswarm_node_engine_version": "19.03.11",
|
|
"__meta_dockerswarm_node_hostname": "ip-172-31-40-97",
|
|
"__meta_dockerswarm_node_id": "qauwmifceyvqs0sipvzu8oslu",
|
|
"__meta_dockerswarm_node_platform_architecture": "x86_64",
|
|
"__meta_dockerswarm_node_platform_os": "linux",
|
|
"__meta_dockerswarm_node_role": "manager",
|
|
"__meta_dockerswarm_node_status": "ready",
|
|
}),
|
|
},
|
|
},
|
|
want: []*promutils.Labels{
|
|
promutils.NewLabelsFromMap(map[string]string{
|
|
"__address__": "172.31.40.97:6379",
|
|
"__meta_dockerswarm_node_address": "172.31.40.97",
|
|
"__meta_dockerswarm_node_availability": "active",
|
|
"__meta_dockerswarm_node_engine_version": "19.03.11",
|
|
"__meta_dockerswarm_node_hostname": "ip-172-31-40-97",
|
|
"__meta_dockerswarm_node_id": "qauwmifceyvqs0sipvzu8oslu",
|
|
"__meta_dockerswarm_node_platform_architecture": "x86_64",
|
|
"__meta_dockerswarm_node_platform_os": "linux",
|
|
"__meta_dockerswarm_node_role": "manager",
|
|
"__meta_dockerswarm_node_status": "ready",
|
|
"__meta_dockerswarm_task_container_id": "33034b69f6fa5f808098208752fd1fe4e0e1ca86311988cea6a73b998cdc62e8",
|
|
"__meta_dockerswarm_task_desired_state": "running",
|
|
"__meta_dockerswarm_task_id": "t4rdm7j2y9yctbrksiwvsgpu5",
|
|
"__meta_dockerswarm_task_port_publish_mode": "ingress",
|
|
"__meta_dockerswarm_task_slot": "1",
|
|
"__meta_dockerswarm_task_state": "running",
|
|
})},
|
|
},
|
|
{
|
|
name: "adds 1 task with nodes, network and services labels",
|
|
args: args{
|
|
port: 9100,
|
|
tasks: []task{
|
|
{
|
|
ID: "t4rdm7j2y9yctbrksiwvsgpu5",
|
|
ServiceID: "tgsci5gd31aai3jyudv98pqxf",
|
|
NodeID: "qauwmifceyvqs0sipvzu8oslu",
|
|
DesiredState: "running",
|
|
Slot: 1,
|
|
NetworksAttachments: []struct {
|
|
Addresses []string
|
|
Network struct{ ID string }
|
|
}{
|
|
{
|
|
Network: struct {
|
|
ID string
|
|
}{
|
|
ID: "qs0hog6ldlei9ct11pr3c77v1",
|
|
},
|
|
Addresses: []string{"10.10.15.15/24"},
|
|
},
|
|
},
|
|
Status: struct {
|
|
State string
|
|
ContainerStatus struct{ ContainerID string }
|
|
PortStatus struct{ Ports []portConfig }
|
|
}{
|
|
State: "running",
|
|
ContainerStatus: struct{ ContainerID string }{
|
|
ContainerID: "33034b69f6fa5f808098208752fd1fe4e0e1ca86311988cea6a73b998cdc62e8",
|
|
},
|
|
PortStatus: struct{ Ports []portConfig }{}},
|
|
},
|
|
},
|
|
networksLabels: map[string]*promutils.Labels{
|
|
"qs0hog6ldlei9ct11pr3c77v1": promutils.NewLabelsFromMap(map[string]string{
|
|
"__meta_dockerswarm_network_id": "qs0hog6ldlei9ct11pr3c77v1",
|
|
"__meta_dockerswarm_network_ingress": "true",
|
|
"__meta_dockerswarm_network_internal": "false",
|
|
"__meta_dockerswarm_network_label_key1": "value1",
|
|
"__meta_dockerswarm_network_name": "ingress",
|
|
"__meta_dockerswarm_network_scope": "swarm",
|
|
}),
|
|
},
|
|
nodesLabels: []*promutils.Labels{
|
|
promutils.NewLabelsFromMap(map[string]string{
|
|
"__address__": "172.31.40.97:9100",
|
|
"__meta_dockerswarm_node_address": "172.31.40.97",
|
|
"__meta_dockerswarm_node_availability": "active",
|
|
"__meta_dockerswarm_node_engine_version": "19.03.11",
|
|
"__meta_dockerswarm_node_hostname": "ip-172-31-40-97",
|
|
"__meta_dockerswarm_node_id": "qauwmifceyvqs0sipvzu8oslu",
|
|
"__meta_dockerswarm_node_platform_architecture": "x86_64",
|
|
"__meta_dockerswarm_node_platform_os": "linux",
|
|
"__meta_dockerswarm_node_role": "manager",
|
|
"__meta_dockerswarm_node_status": "ready",
|
|
}),
|
|
},
|
|
services: []service{
|
|
{
|
|
ID: "tgsci5gd31aai3jyudv98pqxf",
|
|
Spec: struct {
|
|
Labels map[string]string
|
|
Name string
|
|
TaskTemplate struct {
|
|
ContainerSpec struct {
|
|
Hostname string
|
|
Image string
|
|
}
|
|
}
|
|
Mode struct {
|
|
Global interface{}
|
|
Replicated interface{}
|
|
}
|
|
}{
|
|
Labels: map[string]string{},
|
|
Name: "redis2",
|
|
TaskTemplate: struct {
|
|
ContainerSpec struct {
|
|
Hostname string
|
|
Image string
|
|
}
|
|
}{
|
|
ContainerSpec: struct {
|
|
Hostname string
|
|
Image string
|
|
}{
|
|
Hostname: "node1",
|
|
Image: "redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842",
|
|
},
|
|
},
|
|
Mode: struct {
|
|
Global interface{}
|
|
Replicated interface{}
|
|
}{
|
|
Replicated: map[string]interface{}{},
|
|
},
|
|
},
|
|
Endpoint: struct {
|
|
Ports []portConfig
|
|
VirtualIPs []struct {
|
|
NetworkID string
|
|
Addr string
|
|
}
|
|
}{
|
|
Ports: []portConfig{
|
|
{
|
|
Protocol: "tcp",
|
|
Name: "redis",
|
|
PublishMode: "ingress",
|
|
PublishedPort: 6379,
|
|
},
|
|
}, VirtualIPs: []struct {
|
|
NetworkID string
|
|
Addr string
|
|
}{
|
|
{
|
|
NetworkID: "qs0hog6ldlei9ct11pr3c77v1",
|
|
Addr: "10.0.0.3/24",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
servicesLabels: []*promutils.Labels{},
|
|
},
|
|
want: []*promutils.Labels{
|
|
promutils.NewLabelsFromMap(map[string]string{
|
|
"__address__": "10.10.15.15:6379",
|
|
"__meta_dockerswarm_network_id": "qs0hog6ldlei9ct11pr3c77v1",
|
|
"__meta_dockerswarm_network_ingress": "true",
|
|
"__meta_dockerswarm_network_internal": "false",
|
|
"__meta_dockerswarm_network_label_key1": "value1",
|
|
"__meta_dockerswarm_network_name": "ingress",
|
|
"__meta_dockerswarm_network_scope": "swarm",
|
|
"__meta_dockerswarm_node_address": "172.31.40.97",
|
|
"__meta_dockerswarm_node_availability": "active",
|
|
"__meta_dockerswarm_node_engine_version": "19.03.11",
|
|
"__meta_dockerswarm_node_hostname": "ip-172-31-40-97",
|
|
"__meta_dockerswarm_node_id": "qauwmifceyvqs0sipvzu8oslu",
|
|
"__meta_dockerswarm_node_platform_architecture": "x86_64",
|
|
"__meta_dockerswarm_node_platform_os": "linux",
|
|
"__meta_dockerswarm_node_role": "manager",
|
|
"__meta_dockerswarm_node_status": "ready",
|
|
"__meta_dockerswarm_task_container_id": "33034b69f6fa5f808098208752fd1fe4e0e1ca86311988cea6a73b998cdc62e8",
|
|
"__meta_dockerswarm_task_desired_state": "running",
|
|
"__meta_dockerswarm_task_id": "t4rdm7j2y9yctbrksiwvsgpu5",
|
|
"__meta_dockerswarm_task_port_publish_mode": "ingress",
|
|
"__meta_dockerswarm_task_slot": "1",
|
|
"__meta_dockerswarm_task_state": "running",
|
|
}),
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := addTasksLabels(tt.args.tasks, tt.args.nodesLabels, tt.args.servicesLabels, tt.args.networksLabels, tt.args.services, tt.args.port)
|
|
discoveryutils.TestEqualLabelss(t, got, tt.want)
|
|
})
|
|
}
|
|
}
|