rpc: metrics for JSON-RPC method calls (#20847)
This adds a couple of metrics for tracking the timing and frequency of method calls: - rpc/requests gauge counts all requests - rpc/success gauge counts requests which return err == nil - rpc/failure gauge counts requests which return err != nil - rpc/duration/all timer tracks timing of all requests - rpc/duration/<method>/<success/failure> tracks per-method timing
This commit is contained in:
		
							parent
							
								
									462ddce5b2
								
							
						
					
					
						commit
						be9172a7ac
					
				| @ -327,8 +327,22 @@ func (h *handler) handleCall(cp *callProc, msg *jsonrpcMessage) *jsonrpcMessage | ||||
| 	if err != nil { | ||||
| 		return msg.errorResponse(&invalidParamsError{err.Error()}) | ||||
| 	} | ||||
| 	start := time.Now() | ||||
| 	answer := h.runMethod(cp.ctx, msg, callb, args) | ||||
| 
 | ||||
| 	return h.runMethod(cp.ctx, msg, callb, args) | ||||
| 	// Collect the statistics for RPC calls if metrics is enabled.
 | ||||
| 	// We only care about pure rpc call. Filter out subscription.
 | ||||
| 	if callb != h.unsubscribeCb { | ||||
| 		rpcRequestGauge.Inc(1) | ||||
| 		if answer.Error != nil { | ||||
| 			failedReqeustGauge.Inc(1) | ||||
| 		} else { | ||||
| 			successfulRequestGauge.Inc(1) | ||||
| 		} | ||||
| 		rpcServingTimer.UpdateSince(start) | ||||
| 		newRPCServingTimer(msg.Method, answer.Error == nil).UpdateSince(start) | ||||
| 	} | ||||
| 	return answer | ||||
| } | ||||
| 
 | ||||
| // handleSubscribe processes *_subscribe method calls.
 | ||||
|  | ||||
							
								
								
									
										39
									
								
								rpc/metrics.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								rpc/metrics.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| // Copyright 2020 The go-ethereum Authors
 | ||||
| // This file is part of the go-ethereum library.
 | ||||
| //
 | ||||
| // The go-ethereum library is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU Lesser General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| //
 | ||||
| // The go-ethereum library is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | ||||
| // GNU Lesser General Public License for more details.
 | ||||
| //
 | ||||
| // You should have received a copy of the GNU Lesser General Public License
 | ||||
| // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| package rpc | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/metrics" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	rpcRequestGauge        = metrics.NewRegisteredGauge("rpc/requests", nil) | ||||
| 	successfulRequestGauge = metrics.NewRegisteredGauge("rpc/success", nil) | ||||
| 	failedReqeustGauge     = metrics.NewRegisteredGauge("rpc/failure", nil) | ||||
| 	rpcServingTimer        = metrics.NewRegisteredTimer("rpc/duration/all", nil) | ||||
| ) | ||||
| 
 | ||||
| func newRPCServingTimer(method string, valid bool) metrics.Timer { | ||||
| 	flag := "success" | ||||
| 	if !valid { | ||||
| 		flag = "failure" | ||||
| 	} | ||||
| 	m := fmt.Sprintf("rpc/duration/%s/%s", method, flag) | ||||
| 	return metrics.GetOrRegisterTimer(m, nil) | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user