From 7db39115e85fc3d595291f1c220e41b43da0077d Mon Sep 17 00:00:00 2001 From: Nate Walck Date: Thu, 27 Feb 2020 22:44:12 -0500 Subject: [PATCH] Fixed ctx issue, changed to track failures instead of success --- lib/jsonrpc/handler.go | 11 ++++++++--- metrics/metrics.go | 18 +++++++++--------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/lib/jsonrpc/handler.go b/lib/jsonrpc/handler.go index b42b9d925..88a20ee1f 100644 --- a/lib/jsonrpc/handler.go +++ b/lib/jsonrpc/handler.go @@ -156,7 +156,7 @@ func (handlers) getSpan(ctx context.Context, req request) (context.Context, *tra func (h handlers) handle(ctx context.Context, req request, w func(func(io.Writer)), rpcError rpcErrFunc, done func(keepCtx bool), chOut chanOut) { // Not sure if we need to sanitize the incoming req.Method or not. ctx, span := h.getSpan(ctx, req) - ctx, _ = tag.New(context.Background(), tag.Insert(metrics.RPCMethod, req.Method)) + ctx, _ = tag.New(ctx, tag.Insert(metrics.RPCMethod, req.Method)) defer span.End() handler, ok := h[req.Method] @@ -169,6 +169,7 @@ func (h handlers) handle(ctx context.Context, req request, w func(func(io.Writer if len(req.Params) != handler.nParams { rpcError(w, &req, rpcInvalidParams, fmt.Errorf("wrong param count")) + stats.Record(ctx, metrics.RPCRequestError.M(1)) done(false) return } @@ -178,6 +179,7 @@ func (h handlers) handle(ctx context.Context, req request, w func(func(io.Writer if chOut == nil && outCh { rpcError(w, &req, rpcMethodNotFound, fmt.Errorf("method '%s' not supported in this mode (no out channel support)", req.Method)) + stats.Record(ctx, metrics.RPCRequestError.M(1)) return } @@ -191,6 +193,7 @@ func (h handlers) handle(ctx context.Context, req request, w func(func(io.Writer rp := reflect.New(handler.paramReceivers[i]) if err := json.NewDecoder(bytes.NewReader(req.Params[i].data)).Decode(rp.Interface()); err != nil { rpcError(w, &req, rpcParseError, xerrors.Errorf("unmarshaling params for '%s': %w", handler.handlerFunc, err)) + stats.Record(ctx, metrics.RPCRequestError.M(1)) return } @@ -202,12 +205,12 @@ func (h handlers) handle(ctx context.Context, req request, w func(func(io.Writer callResult, err := doCall(req.Method, handler.handlerFunc, callParams) if err != nil { rpcError(w, &req, 0, xerrors.Errorf("fatal error calling '%s': %w", req.Method, err)) + stats.Record(ctx, metrics.RPCRequestError.M(1)) return } if req.ID == nil { return // notification } - stats.Record(ctx, metrics.RPCRequestSuccess.M(1)) /////////////////// @@ -220,6 +223,7 @@ func (h handlers) handle(ctx context.Context, req request, w func(func(io.Writer err := callResult[handler.errOut].Interface() if err != nil { log.Warnf("error in RPC call to '%s': %+v", req.Method, err) + stats.Record(ctx, metrics.RPCResponseError.M(1)) resp.Error = &respError{ Code: 1, Message: err.(error).Error(), @@ -241,6 +245,7 @@ func (h handlers) handle(ctx context.Context, req request, w func(func(io.Writer } log.Warnf("failed to setup channel in RPC call to '%s': %+v", req.Method, err) + stats.Record(ctx, metrics.RPCResponseError.M(1)) resp.Error = &respError{ Code: 1, Message: err.(error).Error(), @@ -250,8 +255,8 @@ func (h handlers) handle(ctx context.Context, req request, w func(func(io.Writer w(func(w io.Writer) { if err := json.NewEncoder(w).Encode(resp); err != nil { log.Error(err) + stats.Record(ctx, metrics.RPCResponseError.M(1)) return } - stats.Record(ctx, metrics.RPCResponseSuccess.M(1)) }) } diff --git a/metrics/metrics.go b/metrics/metrics.go index 5e1b78f93..ca32b81b5 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -15,13 +15,13 @@ var ( // Measures var ( - LotusInfo = stats.Int64("info", "Arbitrary counter to tag lotus info to", stats.UnitDimensionless) - ChainHeight = stats.Int64("chain/height", "Current Height of the chain", stats.UnitDimensionless) - ChainNodeHeight = stats.Int64("chain/node_height", "Current Height of the node", stats.UnitDimensionless) - PeerCount = stats.Int64("peer/count", "Current number of FIL peers", stats.UnitDimensionless) - RPCInvalidMethod = stats.Int64("rpc/invalid_method", "Total number of invalid RPC methods called", stats.UnitDimensionless) - RPCRequestSuccess = stats.Int64("rpc/request_success", "Total number of successful requests handled", stats.UnitDimensionless) - RPCResponseSuccess = stats.Int64("rpc/response_success", "Total number of succeessful responses handled", stats.UnitDimensionless) + LotusInfo = stats.Int64("info", "Arbitrary counter to tag lotus info to", stats.UnitDimensionless) + ChainHeight = stats.Int64("chain/height", "Current Height of the chain", stats.UnitDimensionless) + ChainNodeHeight = stats.Int64("chain/node_height", "Current Height of the node", stats.UnitDimensionless) + PeerCount = stats.Int64("peer/count", "Current number of FIL peers", stats.UnitDimensionless) + RPCInvalidMethod = stats.Int64("rpc/invalid_method", "Total number of invalid RPC methods called", stats.UnitDimensionless) + RPCRequestError = stats.Int64("rpc/request_error", "Total number of request errors handled", stats.UnitDimensionless) + RPCResponseError = stats.Int64("rpc/response_error", "Total number of responses errors handled", stats.UnitDimensionless) ) // DefaultViews is an array of Consensus views for metric gathering purposes @@ -48,12 +48,12 @@ var DefaultViews = []*view.View{ TagKeys: []tag.Key{RPCMethod}, }, &view.View{ - Measure: RPCRequestSuccess, + Measure: RPCRequestError, Aggregation: view.Count(), TagKeys: []tag.Key{RPCMethod}, }, &view.View{ - Measure: RPCResponseSuccess, + Measure: RPCResponseError, Aggregation: view.Count(), TagKeys: []tag.Key{RPCMethod}, },