github.com/mackerelio/mackerel-agent-plugins@v0.89.3/mackerel-plugin-solr/lib/solr_test.go (about)

     1  package mpsolr
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"os"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  var (
    14  	SolrVersions = []string{"5.5.4", "6.4.2", "7.7.2", "8.1.1"}
    15  	solrVersion  string
    16  )
    17  
    18  var testHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    19  	switch r.URL.Path {
    20  	case "/solr/admin/info/system":
    21  		fmt.Fprint(w, fetchJSON("system"))
    22  	case "/solr/admin/cores":
    23  		fmt.Fprint(w, fetchJSON("cores"))
    24  	case "/solr/testcore/admin/mbeans":
    25  		key := r.URL.Query()["cat"][0]
    26  		fmt.Fprint(w, fetchJSONForMbeans(key))
    27  	default:
    28  		fmt.Fprint(w, "")
    29  	}
    30  })
    31  
    32  func fetchJSON(name string) string {
    33  	path := fmt.Sprintf("./stats/%s/%s.json", solrVersion, name)
    34  	json, err := os.ReadFile(path)
    35  	if err != nil {
    36  		panic(err)
    37  	}
    38  	return string(json)
    39  }
    40  
    41  func fetchJSONForMbeans(key string) string {
    42  	switch key {
    43  	case "QUERYHANDLER", "QUERY":
    44  		return fetchJSON("query")
    45  	case "UPDATEHANDLER", "UPDATE":
    46  		return fetchJSON("update")
    47  	case "REPLICATION":
    48  		return fetchJSON("replication")
    49  	case "CACHE":
    50  		return fetchJSON("cache")
    51  	default:
    52  		return ""
    53  	}
    54  }
    55  
    56  func setupSolr(mockURL string, version string) (solr SolrPlugin) {
    57  	solrVersion = version
    58  	solr = SolrPlugin{
    59  		BaseURL: mockURL + "/solr",
    60  		Cores:   []string{"testcore"},
    61  		Prefix:  "solr",
    62  	}
    63  	solr.loadVersion()
    64  	return
    65  }
    66  
    67  func TestGraphDefinition(t *testing.T) {
    68  	ts := httptest.NewServer(testHandler)
    69  	defer ts.Close()
    70  
    71  	for _, version := range SolrVersions {
    72  		solr := setupSolr(ts.URL, version)
    73  		graphdef := solr.GraphDefinition()
    74  
    75  		assert.EqualValues(t, "testcore DocsCount", graphdef["solr.testcore.docsCount"].Label)
    76  		assert.EqualValues(t, "testcore_numDocs", graphdef["solr.testcore.docsCount"].Metrics[0].Name)
    77  		assert.EqualValues(t, "testcore_deletedDocs", graphdef["solr.testcore.docsCount"].Metrics[1].Name)
    78  
    79  		assert.EqualValues(t, "testcore IndexHeapUsageBytes", graphdef["solr.testcore.indexHeapUsageBytes"].Label)
    80  		assert.EqualValues(t, "testcore_indexHeapUsageBytes", graphdef["solr.testcore.indexHeapUsageBytes"].Metrics[0].Name)
    81  		assert.EqualValues(t, "testcore SegmentCount", graphdef["solr.testcore.segmentCount"].Label)
    82  		assert.EqualValues(t, "testcore_segmentCount", graphdef["solr.testcore.segmentCount"].Metrics[0].Name)
    83  		assert.EqualValues(t, "testcore SizeInBytes", graphdef["solr.testcore.sizeInBytes"].Label)
    84  		assert.EqualValues(t, "testcore_sizeInBytes", graphdef["solr.testcore.sizeInBytes"].Metrics[0].Name)
    85  
    86  		assert.EqualValues(t, "testcore Requests", graphdef["solr.testcore.requests"].Label)
    87  		assert.EqualValues(t, "testcore_requests_updatejson", graphdef["solr.testcore.requests"].Metrics[0].Name)
    88  		assert.EqualValues(t, "testcore_requests_select", graphdef["solr.testcore.requests"].Metrics[1].Name)
    89  		assert.EqualValues(t, "testcore_requests_updatejsondocs", graphdef["solr.testcore.requests"].Metrics[2].Name)
    90  		assert.EqualValues(t, "testcore_requests_get", graphdef["solr.testcore.requests"].Metrics[3].Name)
    91  		assert.EqualValues(t, "testcore_requests_updatecsv", graphdef["solr.testcore.requests"].Metrics[4].Name)
    92  		assert.EqualValues(t, "testcore_requests_replication", graphdef["solr.testcore.requests"].Metrics[5].Name)
    93  		assert.EqualValues(t, "testcore_requests_update", graphdef["solr.testcore.requests"].Metrics[6].Name)
    94  		assert.EqualValues(t, "testcore_requests_dataimport", graphdef["solr.testcore.requests"].Metrics[7].Name)
    95  
    96  		assert.EqualValues(t, "testcore Errors", graphdef["solr.testcore.errors"].Label)
    97  		assert.EqualValues(t, "testcore Timeouts", graphdef["solr.testcore.timeouts"].Label)
    98  		if version == "7.7.2" || version == "8.1.1" {
    99  			assert.EqualValues(t, "testcore ClientErrors", graphdef["solr.testcore.clientErrors"].Label)
   100  			assert.EqualValues(t, "testcore ServerErrors", graphdef["solr.testcore.serverErrors"].Label)
   101  			assert.EqualValues(t, "testcore RequestTimes", graphdef["solr.testcore.requestTimes"].Label)
   102  		} else {
   103  			assert.EqualValues(t, "testcore AvgRequestsPerSecond", graphdef["solr.testcore.avgRequestsPerSecond"].Label)
   104  			assert.EqualValues(t, "testcore 5minRateRequestsPerSecond", graphdef["solr.testcore.5minRateRequestsPerSecond"].Label)
   105  			assert.EqualValues(t, "testcore 15minRateRequestsPerSecond", graphdef["solr.testcore.15minRateRequestsPerSecond"].Label)
   106  			assert.EqualValues(t, "testcore AvgTimePerRequest", graphdef["solr.testcore.avgTimePerRequest"].Label)
   107  			assert.EqualValues(t, "testcore MedianRequestTime", graphdef["solr.testcore.medianRequestTime"].Label)
   108  			assert.EqualValues(t, "testcore 75thPcRequestTime", graphdef["solr.testcore.75thPcRequestTime"].Label)
   109  			assert.EqualValues(t, "testcore 95thPcRequestTime", graphdef["solr.testcore.95thPcRequestTime"].Label)
   110  			assert.EqualValues(t, "testcore 99thPcRequestTime", graphdef["solr.testcore.99thPcRequestTime"].Label)
   111  			assert.EqualValues(t, "testcore 999thPcRequestTime", graphdef["solr.testcore.999thPcRequestTime"].Label)
   112  		}
   113  
   114  		assert.EqualValues(t, "testcore Lookups", graphdef["solr.testcore.lookups"].Label)
   115  		assert.EqualValues(t, "testcore_lookups_filterCache", graphdef["solr.testcore.lookups"].Metrics[0].Name)
   116  		assert.EqualValues(t, "testcore_lookups_perSegFilter", graphdef["solr.testcore.lookups"].Metrics[1].Name)
   117  		assert.EqualValues(t, "testcore_lookups_queryResultCache", graphdef["solr.testcore.lookups"].Metrics[2].Name)
   118  		assert.EqualValues(t, "testcore_lookups_documentCache", graphdef["solr.testcore.lookups"].Metrics[3].Name)
   119  		assert.EqualValues(t, "testcore_lookups_fieldValueCache", graphdef["solr.testcore.lookups"].Metrics[4].Name)
   120  
   121  		assert.EqualValues(t, "testcore Hits", graphdef["solr.testcore.hits"].Label)
   122  		assert.EqualValues(t, "testcore Hitratio", graphdef["solr.testcore.hitratio"].Label)
   123  		assert.EqualValues(t, "testcore Inserts", graphdef["solr.testcore.inserts"].Label)
   124  		assert.EqualValues(t, "testcore Evictions", graphdef["solr.testcore.evictions"].Label)
   125  		assert.EqualValues(t, "testcore Size", graphdef["solr.testcore.size"].Label)
   126  		assert.EqualValues(t, "testcore WarmupTime", graphdef["solr.testcore.warmupTime"].Label)
   127  	}
   128  }
   129  
   130  func TestFetchMetrics(t *testing.T) {
   131  	ts := httptest.NewServer(testHandler)
   132  	defer ts.Close()
   133  
   134  	for _, version := range SolrVersions {
   135  		solr := setupSolr(ts.URL, version)
   136  		solr.loadStats()
   137  		stat, err := solr.FetchMetrics()
   138  		if err != nil {
   139  			t.Fatal(err)
   140  		}
   141  
   142  		msgPrefix := "Solr Version: " + solrVersion + ", Stat Key: "
   143  
   144  		assert.EqualValues(t, 12345, stat["testcore_numDocs"], msgPrefix+"testcore_numDocs")
   145  		assert.EqualValues(t, 54321, stat["testcore_deletedDocs"], msgPrefix+"testcore_deletedDocs")
   146  
   147  		assert.EqualValues(t, 128, stat["testcore_indexHeapUsageBytes"], msgPrefix+"testcore_indexHeapUsageBytes")
   148  		assert.EqualValues(t, 256, stat["testcore_segmentCount"], msgPrefix+"testcore_segmentCount")
   149  		assert.EqualValues(t, 512, stat["testcore_sizeInBytes"], msgPrefix+"testcore_sizeInBytes")
   150  
   151  		assert.EqualValues(t, 111.0, stat["testcore_requests_select"], msgPrefix+"testcore_requests_select")
   152  		assert.EqualValues(t, 222.0, stat["testcore_errors_select"], msgPrefix+"testcore_errors_select")
   153  		assert.EqualValues(t, 333.0, stat["testcore_timeouts_select"], msgPrefix+"testcore_timeouts_select")
   154  		if version == "7.7.2" || version == "8.1.1" {
   155  			assert.EqualValues(t, 432.0, stat["testcore_clientErrors_select"], msgPrefix+"testcore_clientErrors_select")
   156  			assert.EqualValues(t, 234.0, stat["testcore_serverErrors_select"], msgPrefix+"testcore_serverErrors_select")
   157  			assert.EqualValues(t, 0.123, stat["testcore_requestTimes_select"], msgPrefix+"testcore_requestTimes_select")
   158  		}
   159  		if version == "5.5.4" || version == "6.4.2" {
   160  			assert.EqualValues(t, 444.0, stat["testcore_avgRequestsPerSecond_select"], msgPrefix+"testcore_avgRequestsPerSecond_select")
   161  		}
   162  		switch version {
   163  		case "5.5.4":
   164  			assert.EqualValues(t, 555.0, stat["testcore_5minRateReqsPerSecond_select"], msgPrefix+"testcore_5minRateRequestsPerSecond_select")
   165  			assert.EqualValues(t, 666.0, stat["testcore_15minRateReqsPerSecond_select"], msgPrefix+"testcore_15minRateRequestsPerSecond_select")
   166  		case "6.4.2":
   167  			assert.EqualValues(t, 555.0, stat["testcore_5minRateRequestsPerSecond_select"], msgPrefix+"testcore_5minRateRequestsPerSecond_select")
   168  			assert.EqualValues(t, 666.0, stat["testcore_15minRateRequestsPerSecond_select"], msgPrefix+"testcore_15minRateRequestsPerSecond_select")
   169  		default:
   170  		}
   171  		if version == "5.5.4" || version == "6.4.2" {
   172  			assert.EqualValues(t, 777.0, stat["testcore_avgTimePerRequest_select"], msgPrefix+"testcore_avgTimePerRequest_select")
   173  			assert.EqualValues(t, 888.0, stat["testcore_medianRequestTime_select"], msgPrefix+"testcore_medianRequestTime_select")
   174  			assert.EqualValues(t, 999.0, stat["testcore_75thPcRequestTime_select"], msgPrefix+"testcore_75thPcRequestTime_select")
   175  			assert.EqualValues(t, 100.1, stat["testcore_95thPcRequestTime_select"], msgPrefix+"testcore_95thPcRequestTime_select")
   176  			assert.EqualValues(t, 100.2, stat["testcore_99thPcRequestTime_select"], msgPrefix+"testcore_99thPcRequestTime_select")
   177  			assert.EqualValues(t, 100.3, stat["testcore_999thPcRequestTime_select"], msgPrefix+"testcore_999thPcRequestTime_select")
   178  		}
   179  
   180  		assert.EqualValues(t, 1111.0, stat["testcore_requests_update"], msgPrefix+"testcore_requests_update")
   181  		assert.EqualValues(t, 2222.0, stat["testcore_errors_update"], msgPrefix+"testcore_errors_update")
   182  		assert.EqualValues(t, 3333.0, stat["testcore_timeouts_update"], msgPrefix+"testcore_timeouts_update")
   183  		if version == "7.7.2" || version == "8.1.1" {
   184  			assert.EqualValues(t, 4321.0, stat["testcore_clientErrors_update"], msgPrefix+"testcore_clientErrors_update")
   185  			assert.EqualValues(t, 1234.0, stat["testcore_serverErrors_update"], msgPrefix+"testcore_serverErrors_update")
   186  			assert.EqualValues(t, 0.1234, stat["testcore_requestTimes_update"], msgPrefix+"testcore_requestTimes_update")
   187  		}
   188  		if version == "5.5.4" || version == "6.4.2" {
   189  			assert.EqualValues(t, 4444.0, stat["testcore_avgRequestsPerSecond_update"], msgPrefix+"testcore_avgRequestsPerSecond_update")
   190  		}
   191  		switch version {
   192  		case "5.5.4":
   193  			assert.EqualValues(t, 5555.0, stat["testcore_5minRateReqsPerSecond_update"], msgPrefix+"testcore_5minRateRequestsPerSecond_update")
   194  			assert.EqualValues(t, 6666.0, stat["testcore_15minRateReqsPerSecond_update"], msgPrefix+"testcore_15minRateRequestsPerSecond_update")
   195  		case "6.4.2":
   196  			assert.EqualValues(t, 5555.0, stat["testcore_5minRateRequestsPerSecond_update"], msgPrefix+"testcore_5minRateRequestsPerSecond_update")
   197  			assert.EqualValues(t, 6666.0, stat["testcore_15minRateRequestsPerSecond_update"], msgPrefix+"testcore_15minRateRequestsPerSecond_update")
   198  		default:
   199  		}
   200  		if version == "5.5.4" || version == "6.4.2" {
   201  			assert.EqualValues(t, 7777.0, stat["testcore_avgTimePerRequest_update"], msgPrefix+"testcore_avgTimePerRequest_update")
   202  			assert.EqualValues(t, 8888.0, stat["testcore_medianRequestTime_update"], msgPrefix+"testcore_medianRequestTime_update")
   203  			assert.EqualValues(t, 9999.0, stat["testcore_75thPcRequestTime_update"], msgPrefix+"testcore_75thPcRequestTime_update")
   204  			assert.EqualValues(t, 1000.1, stat["testcore_95thPcRequestTime_update"], msgPrefix+"testcore_95thPcRequestTime_update")
   205  			assert.EqualValues(t, 1000.2, stat["testcore_99thPcRequestTime_update"], msgPrefix+"testcore_99thPcRequestTime_update")
   206  			assert.EqualValues(t, 1000.3, stat["testcore_999thPcRequestTime_update"], msgPrefix+"testcore_999thPcRequestTime_update")
   207  		}
   208  
   209  		assert.EqualValues(t, 11111.0, stat["testcore_requests_replication"], msgPrefix+"testcore_requests_replication")
   210  		assert.EqualValues(t, 22222.0, stat["testcore_errors_replication"], msgPrefix+"testcore_errors_replication")
   211  		assert.EqualValues(t, 33333.0, stat["testcore_timeouts_replication"], msgPrefix+"testcore_timeouts_replication")
   212  		if version == "7.7.2" || version == "8.1.1" {
   213  			assert.EqualValues(t, 54321.0, stat["testcore_clientErrors_replication"], msgPrefix+"testcore_clientErrors_replication")
   214  			assert.EqualValues(t, 12345.0, stat["testcore_serverErrors_replication"], msgPrefix+"testcore_serverErrors_replication")
   215  			assert.EqualValues(t, 0.12345, stat["testcore_requestTimes_replication"], msgPrefix+"testcore_requestTimes_replication")
   216  		}
   217  		if version == "5.5.4" || version == "6.4.2" {
   218  			assert.EqualValues(t, 44444.0, stat["testcore_avgRequestsPerSecond_replication"], msgPrefix+"testcore_avgRequestsPerSecond_replication")
   219  		}
   220  		switch version {
   221  		case "5.5.4":
   222  			assert.EqualValues(t, 55555.0, stat["testcore_5minRateReqsPerSecond_replication"], msgPrefix+"testcore_5minRateRequestsPerSecond_replication")
   223  			assert.EqualValues(t, 66666.0, stat["testcore_15minRateReqsPerSecond_replication"], msgPrefix+"testcore_15minRateRequestsPerSecond_replication")
   224  		case "6.4.2":
   225  			assert.EqualValues(t, 55555.0, stat["testcore_5minRateRequestsPerSecond_replication"], msgPrefix+"testcore_5minRateRequestsPerSecond_replication")
   226  			assert.EqualValues(t, 66666.0, stat["testcore_15minRateRequestsPerSecond_replication"], msgPrefix+"testcore_15minRateRequestsPerSecond_replication")
   227  		default:
   228  		}
   229  		if version == "5.5.4" || version == "6.4.2" {
   230  			assert.EqualValues(t, 77777.0, stat["testcore_avgTimePerRequest_replication"], msgPrefix+"testcore_avgTimePerRequest_replication")
   231  			assert.EqualValues(t, 88888.0, stat["testcore_medianRequestTime_replication"], msgPrefix+"testcore_medianRequestTime_replication")
   232  			assert.EqualValues(t, 99999.0, stat["testcore_75thPcRequestTime_replication"], msgPrefix+"testcore_75thPcRequestTime_replication")
   233  			assert.EqualValues(t, 10000.1, stat["testcore_95thPcRequestTime_replication"], msgPrefix+"testcore_95thPcRequestTime_replication")
   234  			assert.EqualValues(t, 10000.2, stat["testcore_99thPcRequestTime_replication"], msgPrefix+"testcore_99thPcRequestTime_replication")
   235  			assert.EqualValues(t, 10000.3, stat["testcore_999thPcRequestTime_replication"], msgPrefix+"testcore_999thPcRequestTime_replication")
   236  		}
   237  
   238  		assert.EqualValues(t, 135, stat["testcore_lookups_filterCache"], msgPrefix+"testcore_lookups_filterCache")
   239  		assert.EqualValues(t, 357, stat["testcore_lookups_perSegFilter"], msgPrefix+"testcore_lookups_perSegFilter")
   240  		assert.EqualValues(t, 579, stat["testcore_lookups_queryResultCache"], msgPrefix+"testcore_lookups_queryResultCache")
   241  		assert.EqualValues(t, 246, stat["testcore_lookups_documentCache"], msgPrefix+"testcore_lookups_documentCache")
   242  		assert.EqualValues(t, 468, stat["testcore_lookups_fieldValueCache"], msgPrefix+"testcore_lookups_fieldValueCache")
   243  	}
   244  }