github.com/netdata/go.d.plugin@v0.58.1/modules/k8s_kubelet/kubelet_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package k8s_kubelet 4 5 import ( 6 "net/http" 7 "net/http/httptest" 8 "os" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 ) 14 15 var ( 16 testMetricsData, _ = os.ReadFile("testdata/metrics.txt") 17 testTokenData, _ = os.ReadFile("testdata/token.txt") 18 ) 19 20 func Test_readTestData(t *testing.T) { 21 assert.NotNil(t, testMetricsData) 22 assert.NotNil(t, testTokenData) 23 } 24 25 func TestNew(t *testing.T) { 26 job := New() 27 28 assert.IsType(t, (*Kubelet)(nil), job) 29 } 30 31 func TestKubelet_Charts(t *testing.T) { 32 assert.NotNil(t, New().Charts()) 33 } 34 35 func TestKubelet_Cleanup(t *testing.T) { 36 New().Cleanup() 37 } 38 39 func TestKubelet_Init(t *testing.T) { 40 assert.True(t, New().Init()) 41 } 42 43 func TestKubelet_Init_ReadServiceAccountToken(t *testing.T) { 44 job := New() 45 job.TokenPath = "testdata/token.txt" 46 47 assert.True(t, job.Init()) 48 assert.Equal(t, "Bearer "+string(testTokenData), job.Request.Headers["Authorization"]) 49 } 50 51 func TestKubelet_InitErrorOnCreatingClientWrongTLSCA(t *testing.T) { 52 job := New() 53 job.Client.TLSConfig.TLSCA = "testdata/tls" 54 55 assert.False(t, job.Init()) 56 } 57 58 func TestKubelet_Check(t *testing.T) { 59 ts := httptest.NewServer( 60 http.HandlerFunc( 61 func(w http.ResponseWriter, r *http.Request) { 62 _, _ = w.Write(testMetricsData) 63 })) 64 defer ts.Close() 65 66 job := New() 67 job.URL = ts.URL + "/metrics" 68 require.True(t, job.Init()) 69 assert.True(t, job.Check()) 70 } 71 72 func TestKubelet_Check_ConnectionRefused(t *testing.T) { 73 job := New() 74 job.URL = "http://127.0.0.1:38001/metrics" 75 require.True(t, job.Init()) 76 assert.False(t, job.Check()) 77 } 78 79 func TestKubelet_Collect(t *testing.T) { 80 ts := httptest.NewServer( 81 http.HandlerFunc( 82 func(w http.ResponseWriter, r *http.Request) { 83 _, _ = w.Write(testMetricsData) 84 })) 85 defer ts.Close() 86 87 job := New() 88 job.URL = ts.URL + "/metrics" 89 require.True(t, job.Init()) 90 require.True(t, job.Check()) 91 92 expected := map[string]int64{ 93 "apiserver_audit_requests_rejected_total": 0, 94 "apiserver_storage_data_key_generation_bucket_+Inf": 1, 95 "apiserver_storage_data_key_generation_bucket_10": 1, 96 "apiserver_storage_data_key_generation_bucket_10240": 1, 97 "apiserver_storage_data_key_generation_bucket_1280": 1, 98 "apiserver_storage_data_key_generation_bucket_160": 1, 99 "apiserver_storage_data_key_generation_bucket_20": 1, 100 "apiserver_storage_data_key_generation_bucket_20480": 1, 101 "apiserver_storage_data_key_generation_bucket_2560": 1, 102 "apiserver_storage_data_key_generation_bucket_320": 1, 103 "apiserver_storage_data_key_generation_bucket_40": 1, 104 "apiserver_storage_data_key_generation_bucket_40960": 1, 105 "apiserver_storage_data_key_generation_bucket_5": 6, 106 "apiserver_storage_data_key_generation_bucket_5120": 1, 107 "apiserver_storage_data_key_generation_bucket_640": 1, 108 "apiserver_storage_data_key_generation_bucket_80": 1, 109 "apiserver_storage_data_key_generation_failures_total": 0, 110 "apiserver_storage_envelope_transformation_cache_misses_total": 0, 111 "kubelet_docker_operations_create_container": 19, 112 "kubelet_docker_operations_errors_inspect_container": 14, 113 "kubelet_docker_operations_errors_remove_container": 4, 114 "kubelet_docker_operations_info": 2, 115 "kubelet_docker_operations_inspect_container": 223, 116 "kubelet_docker_operations_inspect_image": 110, 117 "kubelet_docker_operations_list_containers": 5157, 118 "kubelet_docker_operations_list_images": 195, 119 "kubelet_docker_operations_remove_container": 23, 120 "kubelet_docker_operations_start_container": 19, 121 "kubelet_docker_operations_stop_container": 23, 122 "kubelet_docker_operations_version": 472, 123 "kubelet_log_file_system_usage_kube-system_coredns-86c58d9df4-d22hv": 28672, 124 "kubelet_log_file_system_usage_kube-system_coredns-86c58d9df4-ks5dj": 28672, 125 "kubelet_log_file_system_usage_kube-system_etcd-minikube": 36864, 126 "kubelet_log_file_system_usage_kube-system_kube-addon-manager-minikube": 45056, 127 "kubelet_log_file_system_usage_kube-system_kube-apiserver-minikube": 36864, 128 "kubelet_log_file_system_usage_kube-system_kube-controller-manager-minikube": 57344, 129 "kubelet_log_file_system_usage_kube-system_kube-proxy-q2fvs": 28672, 130 "kubelet_log_file_system_usage_kube-system_kube-scheduler-minikube": 40960, 131 "kubelet_log_file_system_usage_kube-system_storage-provisioner": 24576, 132 "kubelet_node_config_error": 1, 133 "kubelet_pleg_relist_interval_05": 1013125, 134 "kubelet_pleg_relist_interval_09": 1016820, 135 "kubelet_pleg_relist_interval_099": 1032022, 136 "kubelet_pleg_relist_latency_05": 12741, 137 "kubelet_pleg_relist_latency_09": 16211, 138 "kubelet_pleg_relist_latency_099": 31234, 139 "kubelet_running_container": 9, 140 "kubelet_running_pod": 9, 141 "kubelet_runtime_operations_container_status": 90, 142 "kubelet_runtime_operations_create_container": 10, 143 "kubelet_runtime_operations_errors_container_status": 14, 144 "kubelet_runtime_operations_errors_remove_container": 4, 145 "kubelet_runtime_operations_exec_sync": 138, 146 "kubelet_runtime_operations_image_status": 25, 147 "kubelet_runtime_operations_list_containers": 2586, 148 "kubelet_runtime_operations_list_images": 195, 149 "kubelet_runtime_operations_list_podsandbox": 2562, 150 "kubelet_runtime_operations_podsandbox_status": 77, 151 "kubelet_runtime_operations_remove_container": 14, 152 "kubelet_runtime_operations_run_podsandbox": 9, 153 "kubelet_runtime_operations_start_container": 10, 154 "kubelet_runtime_operations_status": 279, 155 "kubelet_runtime_operations_stop_podsandbox": 14, 156 "kubelet_runtime_operations_version": 190, 157 "rest_client_requests_200": 177, 158 "rest_client_requests_201": 43, 159 "rest_client_requests_403": 2, 160 "rest_client_requests_409": 1, 161 "rest_client_requests_<error>": 8, 162 "rest_client_requests_GET": 37, 163 "rest_client_requests_PATCH": 177, 164 "rest_client_requests_POST": 8, 165 "token_count": 0, 166 "token_fail_count": 0, 167 "volume_manager_plugin_kubernetes.io/configmap_state_actual": 3, 168 "volume_manager_plugin_kubernetes.io/configmap_state_desired": 3, 169 "volume_manager_plugin_kubernetes.io/host-path_state_actual": 15, 170 "volume_manager_plugin_kubernetes.io/host-path_state_desired": 15, 171 "volume_manager_plugin_kubernetes.io/secret_state_actual": 4, 172 "volume_manager_plugin_kubernetes.io/secret_state_desired": 4, 173 } 174 175 assert.Equal(t, expected, job.Collect()) 176 } 177 178 func TestKubelet_Collect_ReceiveInvalidResponse(t *testing.T) { 179 ts := httptest.NewServer( 180 http.HandlerFunc( 181 func(w http.ResponseWriter, r *http.Request) { 182 _, _ = w.Write([]byte("hello and goodbye")) 183 })) 184 defer ts.Close() 185 186 job := New() 187 job.URL = ts.URL + "/metrics" 188 require.True(t, job.Init()) 189 assert.False(t, job.Check()) 190 } 191 192 func TestKubelet_Collect_Receive404(t *testing.T) { 193 ts := httptest.NewServer( 194 http.HandlerFunc( 195 func(w http.ResponseWriter, r *http.Request) { 196 w.WriteHeader(http.StatusNotFound) 197 })) 198 defer ts.Close() 199 200 job := New() 201 job.URL = ts.URL + "/metrics" 202 require.True(t, job.Init()) 203 assert.False(t, job.Check()) 204 }