Current section
Files
Jump to
Current section
Files
src/grpcbox_oc_stats_handler.erl
-module(grpcbox_oc_stats_handler).
-export([init/0,
init/1,
handle/5]).
-record(stats, {recv_bytes = 0 :: integer(),
sent_bytes = 0 :: integer(),
recv_count = 0 :: integer(),
sent_count = 0 :: integer(),
start_time :: integer() | undefined,
end_time :: integer() | undefined}).
init() ->
init(client),
init(server).
-spec init(server | client) -> ok.
init(Type) ->
grpcbox_oc_stats:register_measures(Type).
handle(Ctx, server, rpc_begin, _, _) ->
Method = ctx:get(Ctx, grpc_server_method),
Tags = #{grpc_server_method => Method},
oc_stat:record(Tags, [{'grpc.io/server/started_rpcs', 1}]),
{oc_tags:new(Ctx, Tags), #stats{start_time=erlang:monotonic_time()}};
handle(Ctx, client, rpc_begin, _, _) ->
Method = ctx:get(Ctx, grpc_client_method),
Tags = #{grpc_client_method => Method},
oc_stat:record(Tags, 'grpc.io/client/started_rpcs', 1),
{oc_tags:new(Ctx, Tags), #stats{start_time=erlang:monotonic_time()}};
handle(Ctx, _, out_payload, #{uncompressed_size := USize,
compressed_size := _CSize}, Stats=#stats{sent_count=SentCount,
sent_bytes=SentBytes}) ->
%% set span message event
{Ctx, Stats#stats{sent_count=SentCount+1,
sent_bytes=SentBytes+USize}};
handle(Ctx, _, in_payload, #{uncompressed_size := USize,
compressed_size := _CSize}, Stats=#stats{recv_count=SentCount,
recv_bytes=SentBytes}) ->
%% set span message event
{Ctx, Stats#stats{recv_count=SentCount+1,
recv_bytes=SentBytes+USize}};
handle(Ctx, server, rpc_end, _, Stats=#stats{start_time=StartTime,
sent_count=SentCount,
sent_bytes=SentBytes,
recv_count=RecvCount,
recv_bytes=RecvBytes}) ->
EndTime = erlang:monotonic_time(),
Status = ctx:get(Ctx, grpc_server_status),
Ctx1 = oc_tags:new(Ctx, #{grpc_server_status => Status}),
oc_stat:record(Ctx1, [{'grpc.io/server/server_latency', EndTime - StartTime},
{'grpc.io/server/sent_bytes_per_rpc', SentBytes},
{'grpc.io/server/received_bytes_per_rpc', RecvBytes},
{'grpc.io/server/received_messages_per_rpc', RecvCount},
{'grpc.io/server/sent_messages_per_rpc', SentCount}]),
{Ctx1, Stats#stats{end_time=EndTime}};
handle(Ctx, client, rpc_end, _, Stats=#stats{start_time=StartTime,
sent_count=SentCount,
sent_bytes=SentBytes,
recv_count=RecvCount,
recv_bytes=RecvBytes}) ->
EndTime = erlang:monotonic_time(),
Status = ctx:get(Ctx, grpc_client_status),
Ctx1 = oc_tags:new(Ctx, #{grpc_client_status => Status}),
oc_stat:record(Ctx1, [{'grpc.io/client/roundtrip_latency', EndTime - StartTime},
{'grpc.io/client/sent_bytes_per_rpc', SentBytes},
{'grpc.io/client/received_bytes_per_rpc', RecvBytes},
{'grpc.io/client/received_messages_per_rpc', RecvCount},
{'grpc.io/client/sent_messages_per_rpc', SentCount}]),
{Ctx1, Stats#stats{end_time=EndTime}};
handle(Ctx, _, _, _, Stats=#stats{}) ->
{Ctx, Stats}.