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  }