diff --git a/src/bin_node/node_run_command.ml b/src/bin_node/node_run_command.ml index 47ca0a7deaa896c7c58b903b3662c6037ae6301c..9f657a6047f7370e6da1e868af7a52e4ddfcc0e8 100644 --- a/src/bin_node/node_run_command.ml +++ b/src/bin_node/node_run_command.ml @@ -378,6 +378,21 @@ let rpc_metrics = ~subsystem:"rpc" "calls" +let rpc_output_sizes = + Prometheus.Gauge.v_labels + ~label_names:["endpoint"; "method"] + ~help:"RPC endpoint response body output sizes in bytes." + ~namespace:Tezos_version.Octez_node_version.namespace + ~subsystem:"rpc" + "calls_output_size" + +let rpc_ok_responses_counter = + Prometheus.Counter.v + ~help:"Total number of 200 response codes from RPC calls" + ~namespace:Tezos_version.Octez_node_version.namespace + ~subsystem:"rpc" + "200_status_codes" + module Metrics_server = Prometheus_app.Cohttp (Cohttp_lwt_unix.Server) type port = int @@ -451,8 +466,32 @@ let launch_rpc_server (config : Config_file.t) dir rpc_server_kind addr = Lwt.return (`Response response) else Tezos_rpc_http_server.RPC_server.resto_callback server conn req body in - let update_metrics uri meth = - Prometheus.Summary.(time (labels rpc_metrics [uri; meth]) Sys.time) + (* Update total output size *) + let update_output_size uri meth output_size = + Prometheus.Gauge.( + inc (labels rpc_output_sizes [uri; meth]) (Int64.to_float output_size)) + in + (* Update status code metric *) + let update_status_code (response : Cohttp_lwt.Response.t) = + match response.status with + | `OK -> Prometheus.Counter.inc_one rpc_ok_responses_counter + | _ -> () + in + let update_metrics uri meth callback = + let*! (response : Cohttp_lwt_unix.Server.response_action) = + (* Update number of operations and total time *) + Prometheus.Summary.(time (labels rpc_metrics [uri; meth]) Sys.time) + callback + in + match response with + | `Response (response, body) -> + let*! output_size, body = Cohttp_lwt.Body.length body in + update_output_size uri meth output_size ; + update_status_code response ; + Lwt.return (`Response (response, body)) + | `Expert (response, _fn) as expert_response -> + update_status_code response ; + Lwt.return expert_response in let callback = RPC_middleware.rpc_metrics_transform_callback ~update_metrics dir callback