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 }