c41777dcd2
* mostly working api proxy gen * api: Consistent api names * fix docsgen * regenerate api struct * api: expand external interfaces * Add missing gen files * apigen: fix perm detection * api: Move perm tags to the interface * gofmt * worker perms * docsgen * docsgen: ignore tag comments * apigen: add codegen warning * gofmt * missing actor type * docsgen * make linter happy * fix lint * apigen: use directives for tags * docsgen * regen openrpc docs
66 lines
1.5 KiB
Go
66 lines
1.5 KiB
Go
package metrics
|
|
|
|
import (
|
|
"context"
|
|
"reflect"
|
|
|
|
"go.opencensus.io/tag"
|
|
|
|
"github.com/filecoin-project/lotus/api"
|
|
"github.com/filecoin-project/lotus/api/apistruct"
|
|
)
|
|
|
|
func MetricedStorMinerAPI(a api.StorageMiner) api.StorageMiner {
|
|
var out apistruct.StorageMinerStruct
|
|
proxy(a, &out.Internal)
|
|
proxy(a, &out.CommonStruct.Internal)
|
|
return &out
|
|
}
|
|
|
|
func MetricedFullAPI(a api.FullNode) api.FullNode {
|
|
var out apistruct.FullNodeStruct
|
|
proxy(a, &out.Internal)
|
|
proxy(a, &out.CommonStruct.Internal)
|
|
return &out
|
|
}
|
|
|
|
func MetricedWorkerAPI(a api.Worker) api.Worker {
|
|
var out apistruct.WorkerStruct
|
|
proxy(a, &out.Internal)
|
|
return &out
|
|
}
|
|
|
|
func MetricedWalletAPI(a api.Wallet) api.Wallet {
|
|
var out apistruct.WalletStruct
|
|
proxy(a, &out.Internal)
|
|
return &out
|
|
}
|
|
|
|
func MetricedGatewayAPI(a api.Gateway) api.Gateway {
|
|
var out apistruct.GatewayStruct
|
|
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)
|
|
}))
|
|
|
|
}
|
|
}
|