lotus/metrics/proxy.go

65 lines
1.4 KiB
Go
Raw Normal View History

2020-10-21 08:10:27 +00:00
package metrics
import (
"context"
"reflect"
"go.opencensus.io/tag"
"github.com/filecoin-project/lotus/api"
)
func MetricedStorMinerAPI(a api.StorageMiner) api.StorageMiner {
2021-03-25 14:09:50 +00:00
var out api.StorageMinerStruct
2020-10-21 08:10:27 +00:00
proxy(a, &out.Internal)
proxy(a, &out.CommonStruct.Internal)
return &out
}
func MetricedFullAPI(a api.FullNode) api.FullNode {
2021-03-25 14:09:50 +00:00
var out api.FullNodeStruct
2020-10-21 08:10:27 +00:00
proxy(a, &out.Internal)
proxy(a, &out.CommonStruct.Internal)
return &out
}
func MetricedWorkerAPI(a api.Worker) api.Worker {
2021-03-25 14:09:50 +00:00
var out api.WorkerStruct
2020-10-21 08:10:27 +00:00
proxy(a, &out.Internal)
return &out
}
func MetricedWalletAPI(a api.Wallet) api.Wallet {
2021-03-25 14:09:50 +00:00
var out api.WalletStruct
2020-10-21 08:10:27 +00:00
proxy(a, &out.Internal)
return &out
}
func MetricedGatewayAPI(a api.Gateway) api.Gateway {
2021-03-25 14:09:50 +00:00
var out api.GatewayStruct
2020-10-21 08:10:27 +00:00
proxy(a, &out.Internal)
return &out
}
func proxy(in interface{}, out interface{}) {
rint := reflect.ValueOf(out).Elem()
ra := reflect.ValueOf(in)
for f := 0; f < rint.NumField(); f++ {
field := rint.Type().Field(f)
fn := ra.MethodByName(field.Name)
rint.Field(f).Set(reflect.MakeFunc(field.Type, func(args []reflect.Value) (results []reflect.Value) {
ctx := args[0].Interface().(context.Context)
// upsert function name into context
ctx, _ = tag.New(ctx, tag.Upsert(Endpoint, field.Name))
stop := Timer(ctx, APIRequestDuration)
defer stop()
// pass tagged ctx back into function call
args[0] = reflect.ValueOf(ctx)
return fn.Call(args)
}))
}
2020-10-21 08:39:57 +00:00
}