github.com/mackerelio/mackerel-agent-plugins@v0.89.3/mackerel-plugin-docker/lib/docker_test.go (about)

     1  //go:build linux
     2  
     3  package mpdocker
     4  
     5  import (
     6  	"testing"
     7  
     8  	docker "github.com/fsouza/go-dockerclient"
     9  )
    10  
    11  func TestNormalizeMetricName(t *testing.T) {
    12  	testSets := [][]string{
    13  		{"foo/bar", "foo_bar"},
    14  		{"foo:bar", "foo_bar"},
    15  	}
    16  
    17  	for _, testSet := range testSets {
    18  		if normalizeMetricName(testSet[0]) != testSet[1] {
    19  			t.Errorf("normalizeMetricName: '%s' should be normalized to '%s', but '%s'", testSet[0], testSet[1], normalizeMetricName(testSet[0]))
    20  		}
    21  	}
    22  }
    23  
    24  func TestGraphDefinition(t *testing.T) {
    25  	var docker DockerPlugin
    26  
    27  	graphdef := docker.GraphDefinition()
    28  	if len(graphdef) != 6 {
    29  		t.Errorf("GraphDefinition: %d should be 6", len(graphdef))
    30  	}
    31  }
    32  
    33  func TestGenerateName(t *testing.T) {
    34  	stub := docker.APIContainers{
    35  		ID:      "bab2b03c736de41ecba6470eba736c5109436f706eedca4f3e0d93d6530eccd4",
    36  		Image:   "tutum/mongodb",
    37  		Command: "/run.sh",
    38  		Created: 1456995574,
    39  		Status:  "Up 4 days",
    40  		Ports: []docker.APIPort{
    41  			{PrivatePort: 28017, Type: "tcp"},
    42  			{PrivatePort: 27017, Type: "tcp"},
    43  		},
    44  		Names:  []string{"/my-mongodb"},
    45  		Labels: map[string]string{"foo": "bar"},
    46  	}
    47  	/* {"Id":"5b963f266d609d2b02aee8f57d664e04d35aa8c23afcbc6bb73bc4a5b2e7c44d",
    48  	   "Image":"memcached",
    49  	   "Command":"/entrypoint.sh memcached",
    50  	   "Created":1456994862,
    51  	   "Status":"Up 4 days",
    52  	   "Ports":[{"PrivatePort":11211,
    53  	   "Type":"tcp"}],
    54  	   "Names":["/my-memcache"]}]`
    55  	*/
    56  	var docker DockerPlugin
    57  	docker.NameFormat = "name_id"
    58  	if docker.generateName(stub) != "my-mongodb_bab2b0" {
    59  		t.Errorf("generateName(name): %s should be 'my-mongodb_bab2b0'", docker.generateName(stub))
    60  	}
    61  	docker.NameFormat = "name"
    62  	if docker.generateName(stub) != "my-mongodb" {
    63  		t.Errorf("generateName(name): %s should be 'my-mongodb'", docker.generateName(stub))
    64  	}
    65  	docker.NameFormat = "id"
    66  	if docker.generateName(stub) != "bab2b03c736de41ecba6470eba736c5109436f706eedca4f3e0d93d6530eccd4" {
    67  		t.Errorf("generateName(name): %s should be 'bab2b03c736de41ecba6470eba736c5109436f706eedca4f3e0d93d6530eccd4'", docker.generateName(stub))
    68  	}
    69  	docker.NameFormat = "image"
    70  	if docker.generateName(stub) != "tutum/mongodb" {
    71  		t.Errorf("generateName(name): %s should be 'tutum/mongodb'", docker.generateName(stub))
    72  	}
    73  	docker.NameFormat = "image_id"
    74  	if docker.generateName(stub) != "tutum/mongodb_bab2b0" {
    75  		t.Errorf("generateName(name): %s should be 'tutum/mongodb_bab2b0'", docker.generateName(stub))
    76  	}
    77  	docker.NameFormat = "image_name"
    78  	if docker.generateName(stub) != "tutum/mongodb_my-mongodb" {
    79  		t.Errorf("generateName(name): %s should be 'tutum/mongodb_my-mongodb'", docker.generateName(stub))
    80  	}
    81  	docker.NameFormat = "label"
    82  	docker.Label = "foo"
    83  	if docker.generateName(stub) != "bar" {
    84  		t.Errorf("generateName(name): %s should be 'bar'", docker.generateName(stub))
    85  	}
    86  
    87  }
    88  
    89  func TestAddCPUPercentageStats(t *testing.T) {
    90  	stats := map[string]interface{}{
    91  		"docker._internal.cpuacct.containerA.user":       uint64(3000),
    92  		"docker._internal.cpuacct.containerA.system":     uint64(2000),
    93  		"docker._internal.cpuacct.containerA.host":       uint64(100000),
    94  		"docker._internal.cpuacct.containerA.onlineCPUs": int(2),
    95  		"docker._internal.cpuacct.containerB.host":       uint64(100000),
    96  		"docker._internal.cpuacct.containerB.user":       uint64(3500),
    97  		"docker._internal.cpuacct.containerC.user":       uint64(3300),
    98  		"docker._internal.cpuacct.containerC.system":     uint64(2300),
    99  		"docker._internal.cpuacct.containerD.host":       uint64(100000),
   100  		"docker._internal.cpuacct.containerD.user":       uint64(3000),
   101  		"docker._internal.cpuacct.containerD.system":     uint64(2000),
   102  		"docker._internal.cpuacct.containerF.user":       uint64(3000), // it has been reset
   103  		"docker._internal.cpuacct.containerF.system":     uint64(1000), // it has been reset
   104  		"docker._internal.cpuacct.containerF.host":       uint64(100000100000),
   105  		"docker._internal.cpuacct.containerF.onlineCPUs": int(2),
   106  	}
   107  	oldStats := map[string]interface{}{
   108  		"docker._internal.cpuacct.containerA.host":   float64(90000),
   109  		"docker._internal.cpuacct.containerA.user":   float64(1000),
   110  		"docker._internal.cpuacct.containerA.system": float64(1500),
   111  		"docker._internal.cpuacct.containerB.host":   float64(90000),
   112  		"docker._internal.cpuacct.containerB.user":   float64(3000),
   113  		"docker._internal.cpuacct.containerC.user":   float64(3000),
   114  		"docker._internal.cpuacct.containerC.system": float64(2000),
   115  		"docker._internal.cpuacct.containerE.host":   float64(100000),
   116  		"docker._internal.cpuacct.containerE.user":   float64(3000),
   117  		"docker._internal.cpuacct.containerE.system": float64(2000),
   118  		"docker._internal.cpuacct.containerF.user":   float64(40000000000),
   119  		"docker._internal.cpuacct.containerF.system": float64(20000000000),
   120  		"docker._internal.cpuacct.containerF.host":   float64(100000000000),
   121  	}
   122  	addCPUPercentageStats(&stats, oldStats)
   123  
   124  	if stat, ok := stats["docker.cpuacct_percentage.containerA.user"]; !ok {
   125  		t.Errorf("docker.cpuacct_percentage.containerA.user should be calculated")
   126  	} else if stat != float64(40.0) {
   127  		t.Errorf("docker.cpuacct_percentage.containerA.user should be %f, but %f", float64(40.0), stat)
   128  	}
   129  
   130  	if _, ok := stats["docker.cpuacct_percentage.containerC.user"]; ok {
   131  		t.Errorf("docker.cpuacct_percentage.containerC.user should not be calculated")
   132  	}
   133  
   134  	if _, ok := stats["docker.cpuacct_percentage.containerB.user"]; ok {
   135  		t.Errorf("docker.cpuacct_percentage.containerB.user should not be calculated")
   136  	}
   137  
   138  	if _, ok := stats["docker.cpuacct_percentage.containerD.user"]; ok {
   139  		t.Errorf("docker.cpuacct_percentage.containerD.user should not be calculated")
   140  	}
   141  
   142  	if _, ok := stats["docker.cpuacct_percentage.containerE.user"]; ok {
   143  		t.Errorf("docker.cpuacct_percentage.containerE.user should not be calculated")
   144  	}
   145  
   146  	if stat, ok := stats["docker.cpuacct_percentage.containerF.user"]; !ok {
   147  		t.Errorf("docker.cpuacct_percentage.containerF.user should be calculated")
   148  	} else if stat != float64(6.0) {
   149  		t.Errorf("docker.cpuacct_percentage.containerF.user should be %f, but %f", float64(6.0), stat)
   150  	}
   151  }