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 }