Skip to content
This repository was archived by the owner on Jul 31, 2023. It is now read-only.

Commit b1a01ee

Browse files
authored
Add started RPC metric for client and server side (#1283)
* Add started RPC metric for client and server side
1 parent 0bf7faa commit b1a01ee

File tree

5 files changed

+55
-4
lines changed

5 files changed

+55
-4
lines changed

plugin/ocgrpc/client_metrics.go

+9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ var (
2828
ClientReceivedMessagesPerRPC = stats.Int64("grpc.io/client/received_messages_per_rpc", "Number of response messages received per RPC (always 1 for non-streaming RPCs).", stats.UnitDimensionless)
2929
ClientReceivedBytesPerRPC = stats.Int64("grpc.io/client/received_bytes_per_rpc", "Total bytes received across all response messages per RPC.", stats.UnitBytes)
3030
ClientRoundtripLatency = stats.Float64("grpc.io/client/roundtrip_latency", "Time between first byte of request sent to last byte of response received, or terminal error.", stats.UnitMilliseconds)
31+
ClientStartedRPCs = stats.Int64("grpc.io/client/started_rpcs", "Number of started client RPCs.", stats.UnitDimensionless)
3132
ClientServerLatency = stats.Float64("grpc.io/client/server_latency", `Propagated from the server and should have the same value as "grpc.io/server/latency".`, stats.UnitMilliseconds)
3233
)
3334

@@ -70,6 +71,14 @@ var (
7071
Aggregation: view.Count(),
7172
}
7273

74+
ClientStartedRPCsView = &view.View{
75+
Measure: ClientStartedRPCs,
76+
Name: "grpc.io/client/started_rpcs",
77+
Description: "Number of started client RPCs.",
78+
TagKeys: []tag.Key{KeyClientMethod},
79+
Aggregation: view.Count(),
80+
}
81+
7382
ClientSentMessagesPerRPCView = &view.View{
7483
Measure: ClientSentMessagesPerRPC,
7584
Name: "grpc.io/client/sent_messages_per_rpc",

plugin/ocgrpc/end_to_end_test.go

+12
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ func TestEndToEnd_Single(t *testing.T) {
4040
ocgrpc.ClientReceivedMessagesPerRPCView,
4141
ocgrpc.ServerSentMessagesPerRPCView,
4242
ocgrpc.ClientSentMessagesPerRPCView,
43+
ocgrpc.ServerStartedRPCsView,
44+
ocgrpc.ClientStartedRPCsView,
4345
}
4446
view.Register(extraViews...)
4547
defer view.Unregister(extraViews...)
@@ -63,10 +65,14 @@ func TestEndToEnd_Single(t *testing.T) {
6365
if err != nil {
6466
t.Fatal(err)
6567
}
68+
checkCount(t, ocgrpc.ClientStartedRPCsView, 1, clientMethodTag)
69+
checkCount(t, ocgrpc.ServerStartedRPCsView, 1, serverMethodTag)
6670
checkCount(t, ocgrpc.ClientCompletedRPCsView, 1, clientMethodTag, clientStatusOKTag)
6771
checkCount(t, ocgrpc.ServerCompletedRPCsView, 1, serverMethodTag, serverStatusOKTag)
6872

6973
_, _ = client.Single(ctx, &testpb.FooRequest{Fail: true})
74+
checkCount(t, ocgrpc.ClientStartedRPCsView, 2, clientMethodTag)
75+
checkCount(t, ocgrpc.ServerStartedRPCsView, 2, serverMethodTag)
7076
checkCount(t, ocgrpc.ClientCompletedRPCsView, 1, clientMethodTag, serverStatusUnknownTag)
7177
checkCount(t, ocgrpc.ServerCompletedRPCsView, 1, serverMethodTag, clientStatusUnknownTag)
7278

@@ -101,6 +107,7 @@ func TestEndToEnd_Single(t *testing.T) {
101107
func TestEndToEnd_Stream(t *testing.T) {
102108
view.Register(ocgrpc.DefaultClientViews...)
103109
defer view.Unregister(ocgrpc.DefaultClientViews...)
110+
104111
view.Register(ocgrpc.DefaultServerViews...)
105112
defer view.Unregister(ocgrpc.DefaultServerViews...)
106113

@@ -109,6 +116,8 @@ func TestEndToEnd_Stream(t *testing.T) {
109116
ocgrpc.ClientReceivedMessagesPerRPCView,
110117
ocgrpc.ServerSentMessagesPerRPCView,
111118
ocgrpc.ClientSentMessagesPerRPCView,
119+
ocgrpc.ClientStartedRPCsView,
120+
ocgrpc.ServerStartedRPCsView,
112121
}
113122
view.Register(extraViews...)
114123
defer view.Unregister(extraViews...)
@@ -146,6 +155,8 @@ func TestEndToEnd_Stream(t *testing.T) {
146155
t.Fatal(err)
147156
}
148157

158+
checkCount(t, ocgrpc.ClientStartedRPCsView, 1, clientMethodTag)
159+
checkCount(t, ocgrpc.ServerStartedRPCsView, 1, serverMethodTag)
149160
checkCount(t, ocgrpc.ClientCompletedRPCsView, 1, clientMethodTag, clientStatusOKTag)
150161
checkCount(t, ocgrpc.ServerCompletedRPCsView, 1, serverMethodTag, serverStatusOKTag)
151162

@@ -183,6 +194,7 @@ func getCount(t *testing.T, v *view.View, tags ...tag.Tag) (int64, bool) {
183194
return 0, false
184195
}
185196
}
197+
186198
rows, err := view.RetrieveData(v.Name)
187199
if err != nil {
188200
t.Fatal(err)

plugin/ocgrpc/server_metrics.go

+9
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ var (
2727
ServerReceivedBytesPerRPC = stats.Int64("grpc.io/server/received_bytes_per_rpc", "Total bytes received across all messages per RPC.", stats.UnitBytes)
2828
ServerSentMessagesPerRPC = stats.Int64("grpc.io/server/sent_messages_per_rpc", "Number of messages sent in each RPC. Has value 1 for non-streaming RPCs.", stats.UnitDimensionless)
2929
ServerSentBytesPerRPC = stats.Int64("grpc.io/server/sent_bytes_per_rpc", "Total bytes sent in across all response messages per RPC.", stats.UnitBytes)
30+
ServerStartedRPCs = stats.Int64("grpc.io/server/started_rpcs", "Number of started server RPCs.", stats.UnitDimensionless)
3031
ServerLatency = stats.Float64("grpc.io/server/server_latency", "Time between first byte of request received to last byte of response sent, or terminal error.", stats.UnitMilliseconds)
3132
)
3233

@@ -73,6 +74,14 @@ var (
7374
Aggregation: view.Count(),
7475
}
7576

77+
ServerStartedRPCsView = &view.View{
78+
Measure: ServerStartedRPCs,
79+
Name: "grpc.io/server/started_rpcs",
80+
Description: "Number of started server RPCs.",
81+
TagKeys: []tag.Key{KeyServerMethod},
82+
Aggregation: view.Count(),
83+
}
84+
7685
ServerReceivedMessagesPerRPCView = &view.View{
7786
Name: "grpc.io/server/received_messages_per_rpc",
7887
Description: "Distribution of messages received count per RPC, by method.",

plugin/ocgrpc/stats_common.go

+22-1
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,10 @@ func methodName(fullname string) string {
8282
// statsHandleRPC processes the RPC events.
8383
func statsHandleRPC(ctx context.Context, s stats.RPCStats) {
8484
switch st := s.(type) {
85-
case *stats.Begin, *stats.OutHeader, *stats.InHeader, *stats.InTrailer, *stats.OutTrailer:
85+
case *stats.OutHeader, *stats.InHeader, *stats.InTrailer, *stats.OutTrailer:
8686
// do nothing for client
87+
case *stats.Begin:
88+
handleRPCBegin(ctx, st)
8789
case *stats.OutPayload:
8890
handleRPCOutPayload(ctx, st)
8991
case *stats.InPayload:
@@ -95,6 +97,25 @@ func statsHandleRPC(ctx context.Context, s stats.RPCStats) {
9597
}
9698
}
9799

100+
func handleRPCBegin(ctx context.Context, s *stats.Begin) {
101+
d, ok := ctx.Value(rpcDataKey).(*rpcData)
102+
if !ok {
103+
if grpclog.V(2) {
104+
grpclog.Infoln("Failed to retrieve *rpcData from context.")
105+
}
106+
}
107+
108+
if s.IsClient() {
109+
ocstats.RecordWithOptions(ctx,
110+
ocstats.WithTags(tag.Upsert(KeyClientMethod, methodName(d.method))),
111+
ocstats.WithMeasurements(ClientStartedRPCs.M(1)))
112+
} else {
113+
ocstats.RecordWithOptions(ctx,
114+
ocstats.WithTags(tag.Upsert(KeyClientMethod, methodName(d.method))),
115+
ocstats.WithMeasurements(ServerStartedRPCs.M(1)))
116+
}
117+
}
118+
98119
func handleRPCOutPayload(ctx context.Context, s *stats.OutPayload) {
99120
d, ok := ctx.Value(rpcDataKey).(*rpcData)
100121
if !ok {

stats/view/worker_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,14 @@ func Test_Worker_MultiExport(t *testing.T) {
180180

181181
// Format is Resource.Labels encoded as string, then
182182
wantPartialData := map[string][]*Row{
183-
makeKey(nil, count.Name): []*Row{
183+
makeKey(nil, count.Name): {
184184
{[]tag.Tag{{Key: key, Value: "a"}}, &CountData{Value: 2}},
185185
{[]tag.Tag{{Key: key, Value: "b"}}, &CountData{Value: 1}},
186186
},
187-
makeKey(nil, sum.Name): []*Row{
187+
makeKey(nil, sum.Name): {
188188
{nil, &SumData{Value: 7.5}},
189189
},
190-
makeKey(&extraResource, count.Name): []*Row{
190+
makeKey(&extraResource, count.Name): {
191191
{[]tag.Tag{{Key: key, Value: "b"}}, &CountData{Value: 1}},
192192
},
193193
}

0 commit comments

Comments
 (0)