github.com/netdata/go.d.plugin@v0.58.1/modules/cockroachdb/cockroachdb_test.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package cockroachdb
     4  
     5  import (
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"os"
     9  	"testing"
    10  
    11  	"github.com/netdata/go.d.plugin/agent/module"
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  var (
    17  	metricsData, _      = os.ReadFile("testdata/metrics.txt")
    18  	wrongMetricsData, _ = os.ReadFile("testdata/non_cockroachdb.txt")
    19  )
    20  
    21  func Test_readTestData(t *testing.T) {
    22  	assert.NotNil(t, metricsData)
    23  	assert.NotNil(t, wrongMetricsData)
    24  }
    25  
    26  func TestNew(t *testing.T) {
    27  	assert.Implements(t, (*module.Module)(nil), New())
    28  }
    29  
    30  func TestCockroachDB_Init(t *testing.T) {
    31  	cdb := prepareCockroachDB()
    32  
    33  	assert.True(t, cdb.Init())
    34  }
    35  
    36  func TestCockroachDB_Init_ReturnsFalseIfConfigURLIsNotSet(t *testing.T) {
    37  	cdb := prepareCockroachDB()
    38  	cdb.URL = ""
    39  
    40  	assert.False(t, cdb.Init())
    41  }
    42  
    43  func TestCockroachDB_Init_ReturnsFalseIfClientWrongTLSCA(t *testing.T) {
    44  	cdb := prepareCockroachDB()
    45  	cdb.Client.TLSConfig.TLSCA = "testdata/tls"
    46  
    47  	assert.False(t, cdb.Init())
    48  }
    49  
    50  func TestCockroachDB_Check(t *testing.T) {
    51  	cdb, srv := prepareClientServer(t)
    52  	defer srv.Close()
    53  
    54  	assert.True(t, cdb.Check())
    55  }
    56  
    57  func TestCockroachDB_Check_ReturnsFalseIfConnectionRefused(t *testing.T) {
    58  	cdb := New()
    59  	cdb.URL = "http://127.0.0.1:38001/metrics"
    60  	require.True(t, cdb.Init())
    61  
    62  	assert.False(t, cdb.Check())
    63  }
    64  
    65  func TestCockroachDB_Charts(t *testing.T) {
    66  	assert.NotNil(t, New().Charts())
    67  }
    68  
    69  func TestCockroachDB_Cleanup(t *testing.T) {
    70  	assert.NotPanics(t, New().Cleanup)
    71  }
    72  
    73  func TestCockroachDB_Collect(t *testing.T) {
    74  	cdb, srv := prepareClientServer(t)
    75  	defer srv.Close()
    76  
    77  	expected := map[string]int64{
    78  		"capacity":                                     64202351837184,
    79  		"capacity_available":                           40402062147584,
    80  		"capacity_unusable":                            23800157791684,
    81  		"capacity_usable":                              40402194045500,
    82  		"capacity_usable_used_percent":                 0,
    83  		"capacity_used":                                131897916,
    84  		"capacity_used_percent":                        37070,
    85  		"keybytes":                                     6730852,
    86  		"keycount":                                     119307,
    87  		"livebytes":                                    81979227,
    88  		"liveness_heartbeatfailures":                   2,
    89  		"liveness_heartbeatsuccesses":                  2720,
    90  		"liveness_livenodes":                           3,
    91  		"queue_consistency_process_failure":            0,
    92  		"queue_gc_process_failure":                     0,
    93  		"queue_raftlog_process_failure":                0,
    94  		"queue_raftsnapshot_process_failure":           0,
    95  		"queue_replicagc_process_failure":              0,
    96  		"queue_replicate_process_failure":              0,
    97  		"queue_split_process_failure":                  0,
    98  		"queue_tsmaintenance_process_failure":          0,
    99  		"range_adds":                                   0,
   100  		"range_merges":                                 0,
   101  		"range_removes":                                0,
   102  		"range_snapshots_generated":                    0,
   103  		"range_snapshots_learner_applied":              0,
   104  		"range_snapshots_normal_applied":               0,
   105  		"range_snapshots_preemptive_applied":           0,
   106  		"range_splits":                                 0,
   107  		"ranges":                                       34,
   108  		"ranges_overreplicated":                        0,
   109  		"ranges_unavailable":                           0,
   110  		"ranges_underreplicated":                       0,
   111  		"rebalancing_queriespersecond":                 801,
   112  		"rebalancing_writespersecond":                  213023,
   113  		"replicas":                                     34,
   114  		"replicas_active":                              0,
   115  		"replicas_leaders":                             7,
   116  		"replicas_leaders_not_leaseholders":            0,
   117  		"replicas_leaseholders":                        7,
   118  		"replicas_quiescent":                           34,
   119  		"requests_slow_latch":                          0,
   120  		"requests_slow_lease":                          0,
   121  		"requests_slow_raft":                           0,
   122  		"rocksdb_block_cache_hit_rate":                 92104,
   123  		"rocksdb_block_cache_hits":                     94825,
   124  		"rocksdb_block_cache_misses":                   8129,
   125  		"rocksdb_block_cache_usage":                    39397184,
   126  		"rocksdb_compactions":                          7,
   127  		"rocksdb_flushes":                              13,
   128  		"rocksdb_num_sstables":                         8,
   129  		"rocksdb_read_amplification":                   1,
   130  		"sql_bytesin":                                  0,
   131  		"sql_bytesout":                                 0,
   132  		"sql_conns":                                    0,
   133  		"sql_ddl_count":                                0,
   134  		"sql_ddl_started_count":                        0,
   135  		"sql_delete_count":                             0,
   136  		"sql_delete_started_count":                     0,
   137  		"sql_distsql_flows_active":                     0,
   138  		"sql_distsql_flows_queued":                     0,
   139  		"sql_distsql_queries_active":                   0,
   140  		"sql_failure_count":                            0,
   141  		"sql_insert_count":                             0,
   142  		"sql_insert_started_count":                     0,
   143  		"sql_misc_count":                               0,
   144  		"sql_misc_started_count":                       0,
   145  		"sql_query_count":                              0,
   146  		"sql_query_started_count":                      0,
   147  		"sql_restart_savepoint_count":                  0,
   148  		"sql_restart_savepoint_release_count":          0,
   149  		"sql_restart_savepoint_release_started_count":  0,
   150  		"sql_restart_savepoint_rollback_count":         0,
   151  		"sql_restart_savepoint_rollback_started_count": 0,
   152  		"sql_restart_savepoint_started_count":          0,
   153  		"sql_savepoint_count":                          0,
   154  		"sql_savepoint_started_count":                  0,
   155  		"sql_select_count":                             0,
   156  		"sql_select_started_count":                     0,
   157  		"sql_txn_abort_count":                          0,
   158  		"sql_txn_begin_count":                          0,
   159  		"sql_txn_begin_started_count":                  0,
   160  		"sql_txn_commit_count":                         0,
   161  		"sql_txn_commit_started_count":                 0,
   162  		"sql_txn_rollback_count":                       0,
   163  		"sql_txn_rollback_started_count":               0,
   164  		"sql_update_count":                             0,
   165  		"sql_update_started_count":                     0,
   166  		"sys_cgo_allocbytes":                           63363512,
   167  		"sys_cgocalls":                                 577778,
   168  		"sys_cpu_combined_percent_normalized":          851,
   169  		"sys_cpu_sys_ns":                               154420000000,
   170  		"sys_cpu_sys_percent":                          1403,
   171  		"sys_cpu_user_ns":                              227620000000,
   172  		"sys_cpu_user_percent":                         2004,
   173  		"sys_fd_open":                                  47,
   174  		"sys_fd_softlimit":                             1048576,
   175  		"sys_gc_count":                                 279,
   176  		"sys_gc_pause_ns":                              60700450,
   177  		"sys_go_allocbytes":                            106576224,
   178  		"sys_goroutines":                               235,
   179  		"sys_host_disk_iopsinprogress":                 0,
   180  		"sys_host_disk_read_bytes":                     43319296,
   181  		"sys_host_disk_read_count":                     1176,
   182  		"sys_host_disk_write_bytes":                    942080,
   183  		"sys_host_disk_write_count":                    106,
   184  		"sys_host_net_recv_bytes":                      234392325,
   185  		"sys_host_net_recv_packets":                    593876,
   186  		"sys_host_net_send_bytes":                      461746036,
   187  		"sys_host_net_send_packets":                    644128,
   188  		"sys_rss":                                      314691584,
   189  		"sys_uptime":                                   12224,
   190  		"sysbytes":                                     13327,
   191  		"timeseries_write_bytes":                       82810041,
   192  		"timeseries_write_errors":                      0,
   193  		"timeseries_write_samples":                     845784,
   194  		"txn_aborts":                                   1,
   195  		"txn_commits":                                  7472,
   196  		"txn_commits1PC":                               3206,
   197  		"txn_restarts_asyncwritefailure":               0,
   198  		"txn_restarts_possiblereplay":                  0,
   199  		"txn_restarts_readwithinuncertainty":           0,
   200  		"txn_restarts_serializable":                    0,
   201  		"txn_restarts_txnaborted":                      0,
   202  		"txn_restarts_txnpush":                         0,
   203  		"txn_restarts_unknown":                         0,
   204  		"txn_restarts_writetooold":                     0,
   205  		"txn_restarts_writetoooldmulti":                0,
   206  		"valbytes":                                     75527718,
   207  		"valcount":                                     124081,
   208  	}
   209  
   210  	collected := cdb.Collect()
   211  	assert.Equal(t, expected, collected)
   212  	testCharts(t, cdb, collected)
   213  }
   214  
   215  func TestCockroachDB_Collect_ReturnsNilIfNotCockroachDBMetrics(t *testing.T) {
   216  	cdb, srv := prepareClientServerNotCockroachDBMetricResponse(t)
   217  	defer srv.Close()
   218  
   219  	assert.Nil(t, cdb.Collect())
   220  }
   221  
   222  func TestCockroachDB_Collect_ReturnsNilIfConnectionRefused(t *testing.T) {
   223  	cdb := prepareCockroachDB()
   224  	require.True(t, cdb.Init())
   225  
   226  	assert.Nil(t, cdb.Collect())
   227  }
   228  
   229  func TestCockroachDB_Collect_ReturnsNilIfReceiveInvalidResponse(t *testing.T) {
   230  	cdb, ts := prepareClientServerInvalidDataResponse(t)
   231  	defer ts.Close()
   232  
   233  	assert.Nil(t, cdb.Collect())
   234  }
   235  
   236  func TestCockroachDB_Collect_ReturnsNilIfReceiveResponse404(t *testing.T) {
   237  	cdb, ts := prepareClientServerResponse404(t)
   238  	defer ts.Close()
   239  
   240  	assert.Nil(t, cdb.Collect())
   241  }
   242  
   243  func testCharts(t *testing.T, cdb *CockroachDB, collected map[string]int64) {
   244  	ensureCollectedHasAllChartsDimsVarsIDs(t, cdb, collected)
   245  }
   246  
   247  func ensureCollectedHasAllChartsDimsVarsIDs(t *testing.T, c *CockroachDB, collected map[string]int64) {
   248  	for _, chart := range *c.Charts() {
   249  		for _, dim := range chart.Dims {
   250  			_, ok := collected[dim.ID]
   251  			assert.Truef(t, ok, "collected metrics has no data for dim '%s' chart '%s'", dim.ID, chart.ID)
   252  		}
   253  		for _, v := range chart.Vars {
   254  			_, ok := collected[v.ID]
   255  			assert.Truef(t, ok, "collected metrics has no data for var '%s' chart '%s'", v.ID, chart.ID)
   256  		}
   257  	}
   258  }
   259  
   260  func prepareCockroachDB() *CockroachDB {
   261  	cdb := New()
   262  	cdb.URL = "http://127.0.0.1:38001/metrics"
   263  	return cdb
   264  }
   265  
   266  func prepareClientServer(t *testing.T) (*CockroachDB, *httptest.Server) {
   267  	t.Helper()
   268  	ts := httptest.NewServer(http.HandlerFunc(
   269  		func(w http.ResponseWriter, r *http.Request) {
   270  			_, _ = w.Write(metricsData)
   271  		}))
   272  
   273  	cdb := New()
   274  	cdb.URL = ts.URL
   275  	require.True(t, cdb.Init())
   276  
   277  	return cdb, ts
   278  }
   279  
   280  func prepareClientServerNotCockroachDBMetricResponse(t *testing.T) (*CockroachDB, *httptest.Server) {
   281  	t.Helper()
   282  	ts := httptest.NewServer(http.HandlerFunc(
   283  		func(w http.ResponseWriter, r *http.Request) {
   284  			_, _ = w.Write(wrongMetricsData)
   285  		}))
   286  
   287  	cdb := New()
   288  	cdb.URL = ts.URL
   289  	require.True(t, cdb.Init())
   290  
   291  	return cdb, ts
   292  }
   293  
   294  func prepareClientServerInvalidDataResponse(t *testing.T) (*CockroachDB, *httptest.Server) {
   295  	t.Helper()
   296  	ts := httptest.NewServer(http.HandlerFunc(
   297  		func(w http.ResponseWriter, r *http.Request) {
   298  			_, _ = w.Write([]byte("hello and\n goodbye"))
   299  		}))
   300  
   301  	cdb := New()
   302  	cdb.URL = ts.URL
   303  	require.True(t, cdb.Init())
   304  
   305  	return cdb, ts
   306  }
   307  
   308  func prepareClientServerResponse404(t *testing.T) (*CockroachDB, *httptest.Server) {
   309  	t.Helper()
   310  	ts := httptest.NewServer(http.HandlerFunc(
   311  		func(w http.ResponseWriter, r *http.Request) {
   312  			w.WriteHeader(http.StatusNotFound)
   313  		}))
   314  
   315  	cdb := New()
   316  	cdb.URL = ts.URL
   317  	require.True(t, cdb.Init())
   318  	return cdb, ts
   319  }