github.com/netdata/go.d.plugin@v0.58.1/modules/solr/solr_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package solr 4 5 import ( 6 "fmt" 7 "net/http" 8 "net/http/httptest" 9 "os" 10 "testing" 11 12 "github.com/netdata/go.d.plugin/agent/module" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 var ( 18 coreMetricsV6, _ = os.ReadFile("testdata/core-metrics-v6.txt") 19 coreMetricsV7, _ = os.ReadFile("testdata/core-metrics-v7.txt") 20 ) 21 22 func version(v string) string { 23 return format(`{ "lucene":{ "solr-spec-version":"%s"}}`, v) 24 } 25 26 func TestNew(t *testing.T) { 27 job := New() 28 29 assert.Implements(t, (*module.Module)(nil), job) 30 assert.Equal(t, defaultURL, job.URL) 31 assert.Equal(t, defaultHTTPTimeout, job.Client.Timeout.Duration) 32 } 33 34 func TestSolr_Init(t *testing.T) { 35 job := New() 36 37 assert.True(t, job.Init()) 38 assert.NotNil(t, job.client) 39 } 40 41 func TestSolr_Check(t *testing.T) { 42 job := New() 43 44 ts := httptest.NewServer( 45 http.HandlerFunc( 46 func(w http.ResponseWriter, r *http.Request) { 47 if r.URL.Path == "/solr/admin/info/system" { 48 _, _ = w.Write([]byte(version(fmt.Sprintf("%.1f.0", minSupportedVersion)))) 49 return 50 } 51 })) 52 53 job.URL = ts.URL 54 require.True(t, job.Init()) 55 assert.True(t, job.Check()) 56 } 57 58 func TestSolr_Check_UnsupportedVersion(t *testing.T) { 59 job := New() 60 61 ts := httptest.NewServer( 62 http.HandlerFunc( 63 func(w http.ResponseWriter, r *http.Request) { 64 if r.URL.Path == "/solr/admin/info/system" { 65 _, _ = w.Write([]byte(version(fmt.Sprintf("%.1f.0", minSupportedVersion-1)))) 66 return 67 } 68 })) 69 70 job.URL = ts.URL 71 72 require.True(t, job.Init()) 73 74 assert.False(t, job.Check()) 75 } 76 77 func TestSolr_Charts(t *testing.T) { 78 assert.NotNil(t, New().Charts()) 79 } 80 81 func TestSolr_Cleanup(t *testing.T) { 82 New().Cleanup() 83 } 84 85 func TestSolr_CollectV6(t *testing.T) { 86 job := New() 87 88 ts := httptest.NewServer( 89 http.HandlerFunc( 90 func(w http.ResponseWriter, r *http.Request) { 91 if r.URL.Path == "/solr/admin/info/system" { 92 _, _ = w.Write([]byte(version(fmt.Sprintf("%.1f.0", minSupportedVersion)))) 93 return 94 } 95 if r.URL.Path == "/solr/admin/metrics" { 96 _, _ = w.Write(coreMetricsV6) 97 return 98 } 99 })) 100 101 job.URL = ts.URL 102 103 require.True(t, job.Init()) 104 require.True(t, job.Check()) 105 require.NotNil(t, job.Charts()) 106 107 expected := map[string]int64{ 108 "core2_query_requestTimes_min_ms": 0, 109 "core1_query_serverErrors_count": 3, 110 "core2_update_requestTimes_mean_ms": 0, 111 "core2_query_requestTimes_p99_ms": 297000000, 112 "core2_query_requestTimes_p999_ms": 2997000000, 113 "core1_update_requestTimes_p99_ms": 297000000, 114 "core2_update_requestTimes_p75_ms": 225000000, 115 "core2_update_requests_count": 3, 116 "core2_query_requestTimes_p75_ms": 225000000, 117 "core2_update_requestTimes_min_ms": 0, 118 "core2_query_clientErrors_count": 3, 119 "core2_query_requestTimes_count": 3, 120 "core2_query_requestTimes_median_ms": 0, 121 "core2_query_requestTimes_p95_ms": 285000000, 122 "core2_update_serverErrors_count": 3, 123 "core1_query_requestTimes_mean_ms": 0, 124 "core1_update_totalTime_count": 3, 125 "core1_update_errors_count": 3, 126 "core1_query_errors_count": 3, 127 "core1_query_timeouts_count": 3, 128 "core1_update_requestTimes_p95_ms": 285000000, 129 "core1_query_clientErrors_count": 3, 130 "core2_query_serverErrors_count": 3, 131 "core1_update_requestTimes_p75_ms": 225000000, 132 "core2_update_requestTimes_p99_ms": 297000000, 133 "core2_query_requests_count": 3, 134 "core2_update_clientErrors_count": 3, 135 "core1_update_requestTimes_min_ms": 0, 136 "core1_update_requestTimes_mean_ms": 0, 137 "core1_query_requestTimes_p95_ms": 285000000, 138 "core1_query_requestTimes_p999_ms": 2997000000, 139 "core1_update_serverErrors_count": 3, 140 "core1_query_requests_count": 3, 141 "core1_update_requestTimes_p999_ms": 2997000000, 142 "core1_query_requestTimes_p75_ms": 225000000, 143 "core1_update_requestTimes_count": 3, 144 "core2_update_requestTimes_p95_ms": 285000000, 145 "core1_query_requestTimes_count": 3, 146 "core1_query_requestTimes_p99_ms": 297000000, 147 "core1_update_requestTimes_median_ms": 0, 148 "core1_update_requestTimes_max_ms": 0, 149 "core2_update_requestTimes_count": 3, 150 "core1_query_requestTimes_min_ms": 0, 151 "core1_update_timeouts_count": 3, 152 "core2_update_timeouts_count": 3, 153 "core2_update_errors_count": 3, 154 "core1_update_requests_count": 3, 155 "core2_query_errors_count": 3, 156 "core1_query_requestTimes_median_ms": 0, 157 "core1_query_requestTimes_max_ms": 0, 158 "core1_update_clientErrors_count": 3, 159 "core2_update_requestTimes_median_ms": 0, 160 "core2_query_requestTimes_mean_ms": 0, 161 "core2_update_totalTime_count": 3, 162 "core2_update_requestTimes_max_ms": 0, 163 "core2_update_requestTimes_p999_ms": 2997000000, 164 "core2_query_timeouts_count": 3, 165 "core2_query_requestTimes_max_ms": 0, 166 "core1_query_totalTime_count": 3, 167 "core2_query_totalTime_count": 3, 168 } 169 170 assert.Equal(t, expected, job.Collect()) 171 assert.Equal(t, expected, job.Collect()) 172 } 173 174 func TestSolr_CollectV7(t *testing.T) { 175 job := New() 176 177 ts := httptest.NewServer( 178 http.HandlerFunc( 179 func(w http.ResponseWriter, r *http.Request) { 180 if r.URL.Path == "/solr/admin/info/system" { 181 _, _ = w.Write([]byte(version(fmt.Sprintf("%.1f.0", minSupportedVersion+1)))) 182 return 183 } 184 if r.URL.Path == "/solr/admin/metrics" { 185 _, _ = w.Write(coreMetricsV7) 186 return 187 } 188 })) 189 190 job.URL = ts.URL 191 192 require.True(t, job.Init()) 193 require.True(t, job.Check()) 194 require.NotNil(t, job.Charts()) 195 196 expected := map[string]int64{ 197 "core1_query_requestTimes_p95_ms": 285000000, 198 "core1_query_timeouts_count": 3, 199 "core1_update_requestTimes_p999_ms": 2997000000, 200 "core2_query_requestTimes_mean_ms": 0, 201 "core2_query_timeouts_count": 3, 202 "core1_update_timeouts_count": 3, 203 "core1_update_requestTimes_mean_ms": 0, 204 "core2_update_serverErrors_count": 3, 205 "core2_query_requestTimes_min_ms": 0, 206 "core2_query_requestTimes_p75_ms": 225000000, 207 "core2_update_clientErrors_count": 3, 208 "core2_update_requestTimes_count": 3, 209 "core2_query_requestTimes_max_ms": 0, 210 "core1_query_requestTimes_mean_ms": 0, 211 "core1_update_totalTime_count": 3, 212 "core1_query_serverErrors_count": 3, 213 "core1_update_requestTimes_p99_ms": 297000000, 214 "core2_query_totalTime_count": 3, 215 "core2_update_requestTimes_max_ms": 0, 216 "core2_query_requestTimes_p99_ms": 297000000, 217 "core1_query_requestTimes_count": 3, 218 "core1_query_requestTimes_median_ms": 0, 219 "core1_query_clientErrors_count": 3, 220 "core2_update_requestTimes_mean_ms": 0, 221 "core2_update_requestTimes_median_ms": 0, 222 "core2_update_requestTimes_p95_ms": 285000000, 223 "core2_update_requestTimes_p999_ms": 2997000000, 224 "core2_update_totalTime_count": 3, 225 "core1_update_clientErrors_count": 3, 226 "core2_query_serverErrors_count": 3, 227 "core2_query_requests_count": 3, 228 "core1_update_serverErrors_count": 3, 229 "core1_update_requestTimes_p75_ms": 225000000, 230 "core2_update_requestTimes_min_ms": 0, 231 "core2_query_errors_count": 3, 232 "core1_update_errors_count": 3, 233 "core1_query_totalTime_count": 3, 234 "core1_update_requestTimes_p95_ms": 285000000, 235 "core2_query_requestTimes_p95_ms": 285000000, 236 "core2_query_requestTimes_p999_ms": 2997000000, 237 "core1_query_requestTimes_min_ms": 0, 238 "core2_update_errors_count": 3, 239 "core2_query_clientErrors_count": 3, 240 "core1_update_requestTimes_min_ms": 0, 241 "core1_query_requestTimes_max_ms": 0, 242 "core1_query_requestTimes_p75_ms": 225000000, 243 "core1_query_requestTimes_p999_ms": 2997000000, 244 "core2_update_requestTimes_p75_ms": 225000000, 245 "core2_update_timeouts_count": 3, 246 "core1_query_requestTimes_p99_ms": 297000000, 247 "core1_update_requests_count": 3, 248 "core1_update_requestTimes_median_ms": 0, 249 "core1_update_requestTimes_max_ms": 0, 250 "core2_update_requestTimes_p99_ms": 297000000, 251 "core2_query_requestTimes_count": 3, 252 "core1_query_errors_count": 3, 253 "core1_query_requests_count": 3, 254 "core1_update_requestTimes_count": 3, 255 "core2_update_requests_count": 3, 256 "core2_query_requestTimes_median_ms": 0, 257 } 258 259 assert.Equal(t, expected, job.Collect()) 260 assert.Equal(t, expected, job.Collect()) 261 } 262 263 func TestSolr_Collect_404(t *testing.T) { 264 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 265 w.WriteHeader(404) 266 })) 267 defer ts.Close() 268 269 job := New() 270 job.URL = ts.URL 271 272 require.True(t, job.Init()) 273 assert.False(t, job.Check()) 274 }