github.com/alwitt/goutils@v0.6.4/metrics_test.go (about)

     1  package goutils_test
     2  
     3  import (
     4  	"io"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"testing"
     8  
     9  	"github.com/alwitt/goutils"
    10  	"github.com/apex/log"
    11  	"github.com/google/uuid"
    12  	"github.com/gorilla/mux"
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  func TestHTTPRequestsMetricsCollection(t *testing.T) {
    17  	assert := assert.New(t)
    18  	log.SetLevel(log.DebugLevel)
    19  
    20  	uut, err := goutils.GetNewMetricsCollector(
    21  		log.Fields{"entity": "metric-collector"}, []goutils.LogMetadataModifier{
    22  			goutils.ModifyLogMetadataByRestRequestParam,
    23  		},
    24  	)
    25  	assert.Nil(err)
    26  
    27  	uut.InstallApplicationMetrics()
    28  
    29  	httpMetricsAgent := uut.InstallHTTPMetrics()
    30  
    31  	testHTTPMiddleware := goutils.RestAPIHandler{
    32  		Component: goutils.Component{
    33  			LogTags: log.Fields{"entity": "ut-middleware"},
    34  			LogTagModifiers: []goutils.LogMetadataModifier{
    35  				goutils.ModifyLogMetadataByRestRequestParam,
    36  			},
    37  		},
    38  		DoNotLogHeaders: map[string]bool{},
    39  		LogLevel:        goutils.HTTPLogLevelDEBUG,
    40  		MetricsHelper:   httpMetricsAgent,
    41  	}
    42  
    43  	testRootRouter := mux.NewRouter()
    44  	testMetricRouter := testRootRouter.PathPrefix("/metric").Subrouter()
    45  	testAppRouter := testRootRouter.PathPrefix("/ut").Subrouter()
    46  
    47  	// Setup metric reporting endpoint
    48  	uut.ExposeCollectionEndpoint(testMetricRouter, "/report", 4)
    49  
    50  	type testParam struct {
    51  		method string
    52  		status int
    53  	}
    54  	tests := []testParam{
    55  		{method: "GET", status: 200},
    56  		{method: "PUT", status: 300},
    57  		{method: "POST", status: 400},
    58  		{method: "DELETE", status: 500},
    59  	}
    60  
    61  	for _, test := range tests {
    62  		req, err := http.NewRequest(test.method, "/ut/testing", nil)
    63  		assert.Nil(err)
    64  
    65  		testHandler := func(w http.ResponseWriter, r *http.Request) {
    66  			assert.Equal(test.method, r.Method)
    67  			w.WriteHeader(test.status)
    68  			_, err := w.Write([]byte(uuid.NewString()))
    69  			assert.Nil(err)
    70  		}
    71  
    72  		// Setup test route
    73  		respRecorder := httptest.NewRecorder()
    74  		testAppRouter.HandleFunc("/testing", testHTTPMiddleware.LoggingMiddleware(testHandler))
    75  
    76  		testAppRouter.ServeHTTP(respRecorder, req)
    77  		assert.Equal(test.status, respRecorder.Code)
    78  	}
    79  
    80  	// Read the metrics
    81  	{
    82  		req, err := http.NewRequest("GET", "/metric/report", nil)
    83  		assert.Nil(err)
    84  		respRecorder := httptest.NewRecorder()
    85  		testMetricRouter.ServeHTTP(respRecorder, req)
    86  		assert.Equal(http.StatusOK, respRecorder.Code)
    87  		report, err := io.ReadAll(respRecorder.Body)
    88  		assert.Nil(err)
    89  		log.Debugf("Metrics report:\n%s\n", string(report))
    90  	}
    91  }