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  }