github.com/palisadeinc/bor@v0.0.0-20230615125219-ab7196213d15/consensus/bor/heimdall/metrics.go (about) 1 package heimdall 2 3 import ( 4 "context" 5 "time" 6 7 "github.com/ethereum/go-ethereum/metrics" 8 ) 9 10 type ( 11 requestTypeKey struct{} 12 requestType string 13 14 meter struct { 15 request map[bool]metrics.Meter // map[isSuccessful]metrics.Meter 16 timer metrics.Timer 17 } 18 ) 19 20 const ( 21 stateSyncRequest requestType = "state-sync" 22 spanRequest requestType = "span" 23 checkpointRequest requestType = "checkpoint" 24 checkpointCountRequest requestType = "checkpoint-count" 25 ) 26 27 func withRequestType(ctx context.Context, reqType requestType) context.Context { 28 return context.WithValue(ctx, requestTypeKey{}, reqType) 29 } 30 31 func getRequestType(ctx context.Context) (requestType, bool) { 32 reqType, ok := ctx.Value(requestTypeKey{}).(requestType) 33 return reqType, ok 34 } 35 36 var ( 37 requestMeters = map[requestType]meter{ 38 stateSyncRequest: { 39 request: map[bool]metrics.Meter{ 40 true: metrics.NewRegisteredMeter("client/requests/statesync/valid", nil), 41 false: metrics.NewRegisteredMeter("client/requests/statesync/invalid", nil), 42 }, 43 timer: metrics.NewRegisteredTimer("client/requests/statesync/duration", nil), 44 }, 45 spanRequest: { 46 request: map[bool]metrics.Meter{ 47 true: metrics.NewRegisteredMeter("client/requests/span/valid", nil), 48 false: metrics.NewRegisteredMeter("client/requests/span/invalid", nil), 49 }, 50 timer: metrics.NewRegisteredTimer("client/requests/span/duration", nil), 51 }, 52 checkpointRequest: { 53 request: map[bool]metrics.Meter{ 54 true: metrics.NewRegisteredMeter("client/requests/checkpoint/valid", nil), 55 false: metrics.NewRegisteredMeter("client/requests/checkpoint/invalid", nil), 56 }, 57 timer: metrics.NewRegisteredTimer("client/requests/checkpoint/duration", nil), 58 }, 59 checkpointCountRequest: { 60 request: map[bool]metrics.Meter{ 61 true: metrics.NewRegisteredMeter("client/requests/checkpointcount/valid", nil), 62 false: metrics.NewRegisteredMeter("client/requests/checkpointcount/invalid", nil), 63 }, 64 timer: metrics.NewRegisteredTimer("client/requests/checkpointcount/duration", nil), 65 }, 66 } 67 ) 68 69 func sendMetrics(ctx context.Context, start time.Time, isSuccessful bool) { 70 reqType, ok := getRequestType(ctx) 71 if !ok { 72 return 73 } 74 75 meters, ok := requestMeters[reqType] 76 if !ok { 77 return 78 } 79 80 meters.request[isSuccessful].Mark(1) 81 meters.timer.Update(time.Since(start)) 82 }