// MeasureHandler adds measuring to http requests func MeasureHandler(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { m := monitoring.BeginMeasuring(r.URL.Path) h.ServeHTTP(w, r) m.EndMeasuring() }) }
// Test of the ETM monitor. func TestEtmMonitor(t *testing.T) { assert := asserts.NewTestingAssertion(t, true) // Generate measurings. for i := 0; i < 500; i++ { n := rand.Intn(10) id := fmt.Sprintf("mp:task:%d", n) m := monitoring.BeginMeasuring(id) work(n * 5000) m.EndMeasuring() } // Need some time to let that backend catch up queued mesurings. time.Sleep(time.Millisecond) // Asserts. mp, err := monitoring.ReadMeasuringPoint("foo") assert.ErrorMatch(err, `\[E.*\] measuring point "foo" does not exist`, "reading non-existent measuring point") mp, err = monitoring.ReadMeasuringPoint("mp:task:5") assert.Nil(err, "No error expected.") assert.Equal(mp.Id, "mp:task:5", "should get the right one") assert.True(mp.Count > 0, "should be measured several times") assert.Match(mp.String(), `Measuring Point "mp:task:5" \(.*\)`, "string representation should look fine") monitoring.MeasuringPointsDo(func(mp *monitoring.MeasuringPoint) { assert.Match(mp.Id, "mp:task:[0-9]", "id has to match the pattern") assert.True(mp.MinDuration <= mp.AvgDuration && mp.AvgDuration <= mp.MaxDuration, "avg should be somewhere between min and max") }) }