1 /*
2  *
3  * Copyright 2018 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #include <grpc/support/port_platform.h>
20 
21 #include "absl/time/time.h"
22 #include "opencensus/stats/internal/aggregation_window.h"
23 #include "opencensus/stats/internal/set_aggregation_window.h"
24 #include "opencensus/stats/stats.h"
25 
26 #include "src/cpp/ext/filters/census/grpc_plugin.h"
27 
28 namespace grpc {
29 
30 using ::opencensus::stats::Aggregation;
31 using ::opencensus::stats::AggregationWindow;
32 using ::opencensus::stats::BucketBoundaries;
33 using ::opencensus::stats::ViewDescriptor;
34 
35 // These measure definitions should be kept in sync across opencensus
36 // implementations.
37 
38 namespace {
39 
BytesDistributionAggregation()40 Aggregation BytesDistributionAggregation() {
41   return Aggregation::Distribution(BucketBoundaries::Explicit(
42       {0, 1024, 2048, 4096, 16384, 65536, 262144, 1048576, 4194304, 16777216,
43        67108864, 268435456, 1073741824, 4294967296}));
44 }
45 
MillisDistributionAggregation()46 Aggregation MillisDistributionAggregation() {
47   return Aggregation::Distribution(BucketBoundaries::Explicit(
48       {0,   0.01, 0.05, 0.1,  0.3,   0.6,   0.8,   1,     2,   3,   4,
49        5,   6,    8,    10,   13,    16,    20,    25,    30,  40,  50,
50        65,  80,   100,  130,  160,   200,   250,   300,   400, 500, 650,
51        800, 1000, 2000, 5000, 10000, 20000, 50000, 100000}));
52 }
53 
CountDistributionAggregation()54 Aggregation CountDistributionAggregation() {
55   return Aggregation::Distribution(BucketBoundaries::Exponential(17, 1.0, 2.0));
56 }
57 
MinuteDescriptor()58 ViewDescriptor MinuteDescriptor() {
59   auto descriptor = ViewDescriptor();
60   SetAggregationWindow(AggregationWindow::Interval(absl::Minutes(1)),
61                        &descriptor);
62   return descriptor;
63 }
64 
HourDescriptor()65 ViewDescriptor HourDescriptor() {
66   auto descriptor = ViewDescriptor();
67   SetAggregationWindow(AggregationWindow::Interval(absl::Hours(1)),
68                        &descriptor);
69   return descriptor;
70 }
71 
72 }  // namespace
73 
RegisterOpenCensusViewsForExport()74 void RegisterOpenCensusViewsForExport() {
75   ClientSentMessagesPerRpcCumulative().RegisterForExport();
76   ClientSentBytesPerRpcCumulative().RegisterForExport();
77   ClientReceivedMessagesPerRpcCumulative().RegisterForExport();
78   ClientReceivedBytesPerRpcCumulative().RegisterForExport();
79   ClientRoundtripLatencyCumulative().RegisterForExport();
80   ClientServerLatencyCumulative().RegisterForExport();
81 
82   ServerSentMessagesPerRpcCumulative().RegisterForExport();
83   ServerSentBytesPerRpcCumulative().RegisterForExport();
84   ServerReceivedMessagesPerRpcCumulative().RegisterForExport();
85   ServerReceivedBytesPerRpcCumulative().RegisterForExport();
86   ServerServerLatencyCumulative().RegisterForExport();
87 }
88 
89 // client cumulative
ClientSentBytesPerRpcCumulative()90 const ViewDescriptor& ClientSentBytesPerRpcCumulative() {
91   const static ViewDescriptor descriptor =
92       ViewDescriptor()
93           .set_name("grpc.io/client/sent_bytes_per_rpc/cumulative")
94           .set_measure(kRpcClientSentBytesPerRpcMeasureName)
95           .set_aggregation(BytesDistributionAggregation())
96           .add_column(ClientMethodTagKey());
97   return descriptor;
98 }
99 
ClientReceivedBytesPerRpcCumulative()100 const ViewDescriptor& ClientReceivedBytesPerRpcCumulative() {
101   const static ViewDescriptor descriptor =
102       ViewDescriptor()
103           .set_name("grpc.io/client/received_bytes_per_rpc/cumulative")
104           .set_measure(kRpcClientReceivedBytesPerRpcMeasureName)
105           .set_aggregation(BytesDistributionAggregation())
106           .add_column(ClientMethodTagKey());
107   return descriptor;
108 }
109 
ClientRoundtripLatencyCumulative()110 const ViewDescriptor& ClientRoundtripLatencyCumulative() {
111   const static ViewDescriptor descriptor =
112       ViewDescriptor()
113           .set_name("grpc.io/client/roundtrip_latency/cumulative")
114           .set_measure(kRpcClientRoundtripLatencyMeasureName)
115           .set_aggregation(MillisDistributionAggregation())
116           .add_column(ClientMethodTagKey());
117   return descriptor;
118 }
119 
ClientServerLatencyCumulative()120 const ViewDescriptor& ClientServerLatencyCumulative() {
121   const static ViewDescriptor descriptor =
122       ViewDescriptor()
123           .set_name("grpc.io/client/server_latency/cumulative")
124           .set_measure(kRpcClientServerLatencyMeasureName)
125           .set_aggregation(MillisDistributionAggregation())
126           .add_column(ClientMethodTagKey());
127   return descriptor;
128 }
129 
ClientCompletedRpcsCumulative()130 const ViewDescriptor& ClientCompletedRpcsCumulative() {
131   const static ViewDescriptor descriptor =
132       ViewDescriptor()
133           .set_name("grpc.io/client/completed_rpcs/cumulative")
134           .set_measure(kRpcClientRoundtripLatencyMeasureName)
135           .set_aggregation(Aggregation::Count())
136           .add_column(ClientMethodTagKey())
137           .add_column(ClientStatusTagKey());
138   return descriptor;
139 }
140 
ClientSentMessagesPerRpcCumulative()141 const ViewDescriptor& ClientSentMessagesPerRpcCumulative() {
142   const static ViewDescriptor descriptor =
143       ViewDescriptor()
144           .set_name("grpc.io/client/received_messages_per_rpc/cumulative")
145           .set_measure(kRpcClientSentMessagesPerRpcMeasureName)
146           .set_aggregation(CountDistributionAggregation())
147           .add_column(ClientMethodTagKey());
148   return descriptor;
149 }
150 
ClientReceivedMessagesPerRpcCumulative()151 const ViewDescriptor& ClientReceivedMessagesPerRpcCumulative() {
152   const static ViewDescriptor descriptor =
153       ViewDescriptor()
154           .set_name("grpc.io/client/sent_messages_per_rpc/cumulative")
155           .set_measure(kRpcClientReceivedMessagesPerRpcMeasureName)
156           .set_aggregation(CountDistributionAggregation())
157           .add_column(ClientMethodTagKey());
158   return descriptor;
159 }
160 
ClientRetriesPerCallCumulative()161 const ViewDescriptor& ClientRetriesPerCallCumulative() {
162   const static ViewDescriptor descriptor =
163       ViewDescriptor()
164           .set_name("grpc.io/client/retries_per_call/cumulative")
165           .set_measure(kRpcClientRetriesPerCallMeasureName)
166           .set_aggregation(CountDistributionAggregation())
167           .add_column(ClientMethodTagKey());
168   return descriptor;
169 }
170 
ClientRetriesCumulative()171 const ViewDescriptor& ClientRetriesCumulative() {
172   const static ViewDescriptor descriptor =
173       ViewDescriptor()
174           .set_name("grpc.io/client/retries/cumulative")
175           .set_measure(kRpcClientRetriesPerCallMeasureName)
176           .set_aggregation(Aggregation::Sum())
177           .add_column(ClientMethodTagKey());
178   return descriptor;
179 }
180 
ClientTransparentRetriesPerCallCumulative()181 const ViewDescriptor& ClientTransparentRetriesPerCallCumulative() {
182   const static ViewDescriptor descriptor =
183       ViewDescriptor()
184           .set_name("grpc.io/client/transparent_retries_per_call/cumulative")
185           .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
186           .set_aggregation(CountDistributionAggregation())
187           .add_column(ClientMethodTagKey());
188   return descriptor;
189 }
190 
ClientTransparentRetriesCumulative()191 const ViewDescriptor& ClientTransparentRetriesCumulative() {
192   const static ViewDescriptor descriptor =
193       ViewDescriptor()
194           .set_name("grpc.io/client/transparent_retries/cumulative")
195           .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
196           .set_aggregation(Aggregation::Sum())
197           .add_column(ClientMethodTagKey());
198   return descriptor;
199 }
200 
ClientRetryDelayPerCallCumulative()201 const ViewDescriptor& ClientRetryDelayPerCallCumulative() {
202   const static ViewDescriptor descriptor =
203       ViewDescriptor()
204           .set_name("grpc.io/client/retry_delay_per_call/cumulative")
205           .set_measure(kRpcClientRetryDelayPerCallMeasureName)
206           .set_aggregation(MillisDistributionAggregation())
207           .add_column(ClientMethodTagKey());
208   return descriptor;
209 }
210 
211 // server cumulative
ServerSentBytesPerRpcCumulative()212 const ViewDescriptor& ServerSentBytesPerRpcCumulative() {
213   const static ViewDescriptor descriptor =
214       ViewDescriptor()
215           .set_name("grpc.io/server/received_bytes_per_rpc/cumulative")
216           .set_measure(kRpcServerSentBytesPerRpcMeasureName)
217           .set_aggregation(BytesDistributionAggregation())
218           .add_column(ServerMethodTagKey());
219   return descriptor;
220 }
221 
ServerReceivedBytesPerRpcCumulative()222 const ViewDescriptor& ServerReceivedBytesPerRpcCumulative() {
223   const static ViewDescriptor descriptor =
224       ViewDescriptor()
225           .set_name("grpc.io/server/sent_bytes_per_rpc/cumulative")
226           .set_measure(kRpcServerReceivedBytesPerRpcMeasureName)
227           .set_aggregation(BytesDistributionAggregation())
228           .add_column(ServerMethodTagKey());
229   return descriptor;
230 }
231 
ServerServerLatencyCumulative()232 const ViewDescriptor& ServerServerLatencyCumulative() {
233   const static ViewDescriptor descriptor =
234       ViewDescriptor()
235           .set_name("grpc.io/server/elapsed_time/cumulative")
236           .set_measure(kRpcServerServerLatencyMeasureName)
237           .set_aggregation(MillisDistributionAggregation())
238           .add_column(ServerMethodTagKey());
239   return descriptor;
240 }
241 
ServerCompletedRpcsCumulative()242 const ViewDescriptor& ServerCompletedRpcsCumulative() {
243   const static ViewDescriptor descriptor =
244       ViewDescriptor()
245           .set_name("grpc.io/server/completed_rpcs/cumulative")
246           .set_measure(kRpcServerServerLatencyMeasureName)
247           .set_aggregation(Aggregation::Count())
248           .add_column(ServerMethodTagKey())
249           .add_column(ServerStatusTagKey());
250   return descriptor;
251 }
252 
ServerSentMessagesPerRpcCumulative()253 const ViewDescriptor& ServerSentMessagesPerRpcCumulative() {
254   const static ViewDescriptor descriptor =
255       ViewDescriptor()
256           .set_name("grpc.io/server/received_messages_per_rpc/cumulative")
257           .set_measure(kRpcServerSentMessagesPerRpcMeasureName)
258           .set_aggregation(CountDistributionAggregation())
259           .add_column(ServerMethodTagKey());
260   return descriptor;
261 }
262 
ServerReceivedMessagesPerRpcCumulative()263 const ViewDescriptor& ServerReceivedMessagesPerRpcCumulative() {
264   const static ViewDescriptor descriptor =
265       ViewDescriptor()
266           .set_name("grpc.io/server/sent_messages_per_rpc/cumulative")
267           .set_measure(kRpcServerReceivedMessagesPerRpcMeasureName)
268           .set_aggregation(CountDistributionAggregation())
269           .add_column(ServerMethodTagKey());
270   return descriptor;
271 }
272 
273 // client minute
ClientSentBytesPerRpcMinute()274 const ViewDescriptor& ClientSentBytesPerRpcMinute() {
275   const static ViewDescriptor descriptor =
276       MinuteDescriptor()
277           .set_name("grpc.io/client/sent_bytes_per_rpc/minute")
278           .set_measure(kRpcClientSentBytesPerRpcMeasureName)
279           .set_aggregation(BytesDistributionAggregation())
280           .add_column(ClientMethodTagKey());
281   return descriptor;
282 }
283 
ClientReceivedBytesPerRpcMinute()284 const ViewDescriptor& ClientReceivedBytesPerRpcMinute() {
285   const static ViewDescriptor descriptor =
286       MinuteDescriptor()
287           .set_name("grpc.io/client/received_bytes_per_rpc/minute")
288           .set_measure(kRpcClientReceivedBytesPerRpcMeasureName)
289           .set_aggregation(BytesDistributionAggregation())
290           .add_column(ClientMethodTagKey());
291   return descriptor;
292 }
293 
ClientRoundtripLatencyMinute()294 const ViewDescriptor& ClientRoundtripLatencyMinute() {
295   const static ViewDescriptor descriptor =
296       MinuteDescriptor()
297           .set_name("grpc.io/client/roundtrip_latency/minute")
298           .set_measure(kRpcClientRoundtripLatencyMeasureName)
299           .set_aggregation(MillisDistributionAggregation())
300           .add_column(ClientMethodTagKey());
301   return descriptor;
302 }
303 
ClientServerLatencyMinute()304 const ViewDescriptor& ClientServerLatencyMinute() {
305   const static ViewDescriptor descriptor =
306       MinuteDescriptor()
307           .set_name("grpc.io/client/server_latency/minute")
308           .set_measure(kRpcClientServerLatencyMeasureName)
309           .set_aggregation(MillisDistributionAggregation())
310           .add_column(ClientMethodTagKey());
311   return descriptor;
312 }
313 
ClientCompletedRpcsMinute()314 const ViewDescriptor& ClientCompletedRpcsMinute() {
315   const static ViewDescriptor descriptor =
316       MinuteDescriptor()
317           .set_name("grpc.io/client/completed_rpcs/minute")
318           .set_measure(kRpcClientRoundtripLatencyMeasureName)
319           .set_aggregation(Aggregation::Count())
320           .add_column(ClientMethodTagKey())
321           .add_column(ClientStatusTagKey());
322   return descriptor;
323 }
324 
ClientSentMessagesPerRpcMinute()325 const ViewDescriptor& ClientSentMessagesPerRpcMinute() {
326   const static ViewDescriptor descriptor =
327       MinuteDescriptor()
328           .set_name("grpc.io/client/sent_messages_per_rpc/minute")
329           .set_measure(kRpcClientSentMessagesPerRpcMeasureName)
330           .set_aggregation(CountDistributionAggregation())
331           .add_column(ClientMethodTagKey());
332   return descriptor;
333 }
334 
ClientReceivedMessagesPerRpcMinute()335 const ViewDescriptor& ClientReceivedMessagesPerRpcMinute() {
336   const static ViewDescriptor descriptor =
337       MinuteDescriptor()
338           .set_name("grpc.io/client/received_messages_per_rpc/minute")
339           .set_measure(kRpcClientReceivedMessagesPerRpcMeasureName)
340           .set_aggregation(CountDistributionAggregation())
341           .add_column(ClientMethodTagKey());
342   return descriptor;
343 }
344 
ClientRetriesPerCallMinute()345 const ViewDescriptor& ClientRetriesPerCallMinute() {
346   const static ViewDescriptor descriptor =
347       MinuteDescriptor()
348           .set_name("grpc.io/client/retries_per_call/minute")
349           .set_measure(kRpcClientRetriesPerCallMeasureName)
350           .set_aggregation(CountDistributionAggregation())
351           .add_column(ClientMethodTagKey());
352   return descriptor;
353 }
354 
ClientRetriesMinute()355 const ViewDescriptor& ClientRetriesMinute() {
356   const static ViewDescriptor descriptor =
357       MinuteDescriptor()
358           .set_name("grpc.io/client/retries/minute")
359           .set_measure(kRpcClientRetriesPerCallMeasureName)
360           .set_aggregation(Aggregation::Sum())
361           .add_column(ClientMethodTagKey());
362   return descriptor;
363 }
364 
ClientTransparentRetriesPerCallMinute()365 const ViewDescriptor& ClientTransparentRetriesPerCallMinute() {
366   const static ViewDescriptor descriptor =
367       MinuteDescriptor()
368           .set_name("grpc.io/client/transparent_retries_per_call/minute")
369           .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
370           .set_aggregation(CountDistributionAggregation())
371           .add_column(ClientMethodTagKey());
372   return descriptor;
373 }
374 
ClientTransparentRetriesMinute()375 const ViewDescriptor& ClientTransparentRetriesMinute() {
376   const static ViewDescriptor descriptor =
377       MinuteDescriptor()
378           .set_name("grpc.io/client/transparent_retries/minute")
379           .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
380           .set_aggregation(Aggregation::Sum())
381           .add_column(ClientMethodTagKey());
382   return descriptor;
383 }
384 
ClientRetryDelayPerCallMinute()385 const ViewDescriptor& ClientRetryDelayPerCallMinute() {
386   const static ViewDescriptor descriptor =
387       MinuteDescriptor()
388           .set_name("grpc.io/client/retry_delay_per_call/minute")
389           .set_measure(kRpcClientRetryDelayPerCallMeasureName)
390           .set_aggregation(MillisDistributionAggregation())
391           .add_column(ClientMethodTagKey());
392   return descriptor;
393 }
394 
395 // server minute
ServerSentBytesPerRpcMinute()396 const ViewDescriptor& ServerSentBytesPerRpcMinute() {
397   const static ViewDescriptor descriptor =
398       MinuteDescriptor()
399           .set_name("grpc.io/server/sent_bytes_per_rpc/minute")
400           .set_measure(kRpcServerSentBytesPerRpcMeasureName)
401           .set_aggregation(BytesDistributionAggregation())
402           .add_column(ServerMethodTagKey());
403   return descriptor;
404 }
405 
ServerReceivedBytesPerRpcMinute()406 const ViewDescriptor& ServerReceivedBytesPerRpcMinute() {
407   const static ViewDescriptor descriptor =
408       MinuteDescriptor()
409           .set_name("grpc.io/server/received_bytes_per_rpc/minute")
410           .set_measure(kRpcServerReceivedBytesPerRpcMeasureName)
411           .set_aggregation(BytesDistributionAggregation())
412           .add_column(ServerMethodTagKey());
413   return descriptor;
414 }
415 
ServerServerLatencyMinute()416 const ViewDescriptor& ServerServerLatencyMinute() {
417   const static ViewDescriptor descriptor =
418       MinuteDescriptor()
419           .set_name("grpc.io/server/server_latency/minute")
420           .set_measure(kRpcServerServerLatencyMeasureName)
421           .set_aggregation(MillisDistributionAggregation())
422           .add_column(ServerMethodTagKey());
423   return descriptor;
424 }
425 
ServerCompletedRpcsMinute()426 const ViewDescriptor& ServerCompletedRpcsMinute() {
427   const static ViewDescriptor descriptor =
428       MinuteDescriptor()
429           .set_name("grpc.io/server/completed_rpcs/minute")
430           .set_measure(kRpcServerServerLatencyMeasureName)
431           .set_aggregation(Aggregation::Count())
432           .add_column(ServerMethodTagKey())
433           .add_column(ServerStatusTagKey());
434   return descriptor;
435 }
436 
ServerSentMessagesPerRpcMinute()437 const ViewDescriptor& ServerSentMessagesPerRpcMinute() {
438   const static ViewDescriptor descriptor =
439       MinuteDescriptor()
440           .set_name("grpc.io/server/sent_messages_per_rpc/minute")
441           .set_measure(kRpcServerSentMessagesPerRpcMeasureName)
442           .set_aggregation(CountDistributionAggregation())
443           .add_column(ServerMethodTagKey());
444   return descriptor;
445 }
446 
ServerReceivedMessagesPerRpcMinute()447 const ViewDescriptor& ServerReceivedMessagesPerRpcMinute() {
448   const static ViewDescriptor descriptor =
449       MinuteDescriptor()
450           .set_name("grpc.io/server/received_messages_per_rpc/minute")
451           .set_measure(kRpcServerReceivedMessagesPerRpcMeasureName)
452           .set_aggregation(CountDistributionAggregation())
453           .add_column(ServerMethodTagKey());
454   return descriptor;
455 }
456 
457 // client hour
ClientSentBytesPerRpcHour()458 const ViewDescriptor& ClientSentBytesPerRpcHour() {
459   const static ViewDescriptor descriptor =
460       HourDescriptor()
461           .set_name("grpc.io/client/sent_bytes_per_rpc/hour")
462           .set_measure(kRpcClientSentBytesPerRpcMeasureName)
463           .set_aggregation(BytesDistributionAggregation())
464           .add_column(ClientMethodTagKey());
465   return descriptor;
466 }
467 
ClientReceivedBytesPerRpcHour()468 const ViewDescriptor& ClientReceivedBytesPerRpcHour() {
469   const static ViewDescriptor descriptor =
470       HourDescriptor()
471           .set_name("grpc.io/client/received_bytes_per_rpc/hour")
472           .set_measure(kRpcClientReceivedBytesPerRpcMeasureName)
473           .set_aggregation(BytesDistributionAggregation())
474           .add_column(ClientMethodTagKey());
475   return descriptor;
476 }
477 
ClientRoundtripLatencyHour()478 const ViewDescriptor& ClientRoundtripLatencyHour() {
479   const static ViewDescriptor descriptor =
480       HourDescriptor()
481           .set_name("grpc.io/client/roundtrip_latency/hour")
482           .set_measure(kRpcClientRoundtripLatencyMeasureName)
483           .set_aggregation(MillisDistributionAggregation())
484           .add_column(ClientMethodTagKey());
485   return descriptor;
486 }
487 
ClientServerLatencyHour()488 const ViewDescriptor& ClientServerLatencyHour() {
489   const static ViewDescriptor descriptor =
490       HourDescriptor()
491           .set_name("grpc.io/client/server_latency/hour")
492           .set_measure(kRpcClientServerLatencyMeasureName)
493           .set_aggregation(MillisDistributionAggregation())
494           .add_column(ClientMethodTagKey());
495   return descriptor;
496 }
497 
ClientCompletedRpcsHour()498 const ViewDescriptor& ClientCompletedRpcsHour() {
499   const static ViewDescriptor descriptor =
500       HourDescriptor()
501           .set_name("grpc.io/client/completed_rpcs/hour")
502           .set_measure(kRpcClientRoundtripLatencyMeasureName)
503           .set_aggregation(Aggregation::Count())
504           .add_column(ClientMethodTagKey())
505           .add_column(ClientStatusTagKey());
506   return descriptor;
507 }
508 
ClientSentMessagesPerRpcHour()509 const ViewDescriptor& ClientSentMessagesPerRpcHour() {
510   const static ViewDescriptor descriptor =
511       HourDescriptor()
512           .set_name("grpc.io/client/sent_messages_per_rpc/hour")
513           .set_measure(kRpcClientSentMessagesPerRpcMeasureName)
514           .set_aggregation(CountDistributionAggregation())
515           .add_column(ClientMethodTagKey());
516   return descriptor;
517 }
518 
ClientReceivedMessagesPerRpcHour()519 const ViewDescriptor& ClientReceivedMessagesPerRpcHour() {
520   const static ViewDescriptor descriptor =
521       HourDescriptor()
522           .set_name("grpc.io/client/received_messages_per_rpc/hour")
523           .set_measure(kRpcClientReceivedMessagesPerRpcMeasureName)
524           .set_aggregation(CountDistributionAggregation())
525           .add_column(ClientMethodTagKey());
526   return descriptor;
527 }
528 
ClientRetriesPerCallHour()529 const ViewDescriptor& ClientRetriesPerCallHour() {
530   const static ViewDescriptor descriptor =
531       HourDescriptor()
532           .set_name("grpc.io/client/retries_per_call/hour")
533           .set_measure(kRpcClientRetriesPerCallMeasureName)
534           .set_aggregation(CountDistributionAggregation())
535           .add_column(ClientMethodTagKey());
536   return descriptor;
537 }
538 
ClientRetriesHour()539 const ViewDescriptor& ClientRetriesHour() {
540   const static ViewDescriptor descriptor =
541       HourDescriptor()
542           .set_name("grpc.io/client/retries/hour")
543           .set_measure(kRpcClientRetriesPerCallMeasureName)
544           .set_aggregation(Aggregation::Sum())
545           .add_column(ClientMethodTagKey());
546   return descriptor;
547 }
548 
ClientTransparentRetriesPerCallHour()549 const ViewDescriptor& ClientTransparentRetriesPerCallHour() {
550   const static ViewDescriptor descriptor =
551       HourDescriptor()
552           .set_name("grpc.io/client/transparent_retries_per_call/hour")
553           .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
554           .set_aggregation(CountDistributionAggregation())
555           .add_column(ClientMethodTagKey());
556   return descriptor;
557 }
558 
ClientTransparentRetriesHour()559 const ViewDescriptor& ClientTransparentRetriesHour() {
560   const static ViewDescriptor descriptor =
561       HourDescriptor()
562           .set_name("grpc.io/client/transparent_retries/hour")
563           .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
564           .set_aggregation(Aggregation::Sum())
565           .add_column(ClientMethodTagKey());
566   return descriptor;
567 }
568 
ClientRetryDelayPerCallHour()569 const ViewDescriptor& ClientRetryDelayPerCallHour() {
570   const static ViewDescriptor descriptor =
571       HourDescriptor()
572           .set_name("grpc.io/client/retry_delay_per_call/hour")
573           .set_measure(kRpcClientRetryDelayPerCallMeasureName)
574           .set_aggregation(MillisDistributionAggregation())
575           .add_column(ClientMethodTagKey());
576   return descriptor;
577 }
578 
579 // server hour
ServerSentBytesPerRpcHour()580 const ViewDescriptor& ServerSentBytesPerRpcHour() {
581   const static ViewDescriptor descriptor =
582       HourDescriptor()
583           .set_name("grpc.io/server/sent_bytes_per_rpc/hour")
584           .set_measure(kRpcServerSentBytesPerRpcMeasureName)
585           .set_aggregation(BytesDistributionAggregation())
586           .add_column(ServerMethodTagKey());
587   return descriptor;
588 }
589 
ServerReceivedBytesPerRpcHour()590 const ViewDescriptor& ServerReceivedBytesPerRpcHour() {
591   const static ViewDescriptor descriptor =
592       HourDescriptor()
593           .set_name("grpc.io/server/received_bytes_per_rpc/hour")
594           .set_measure(kRpcServerReceivedBytesPerRpcMeasureName)
595           .set_aggregation(BytesDistributionAggregation())
596           .add_column(ServerMethodTagKey());
597   return descriptor;
598 }
599 
ServerServerLatencyHour()600 const ViewDescriptor& ServerServerLatencyHour() {
601   const static ViewDescriptor descriptor =
602       HourDescriptor()
603           .set_name("grpc.io/server/server_latency/hour")
604           .set_measure(kRpcServerServerLatencyMeasureName)
605           .set_aggregation(MillisDistributionAggregation())
606           .add_column(ServerMethodTagKey());
607   return descriptor;
608 }
609 
ServerCompletedRpcsHour()610 const ViewDescriptor& ServerCompletedRpcsHour() {
611   const static ViewDescriptor descriptor =
612       HourDescriptor()
613           .set_name("grpc.io/server/completed_rpcs/hour")
614           .set_measure(kRpcServerServerLatencyMeasureName)
615           .set_aggregation(Aggregation::Count())
616           .add_column(ServerMethodTagKey())
617           .add_column(ServerStatusTagKey());
618   return descriptor;
619 }
620 
ServerSentMessagesPerRpcHour()621 const ViewDescriptor& ServerSentMessagesPerRpcHour() {
622   const static ViewDescriptor descriptor =
623       HourDescriptor()
624           .set_name("grpc.io/server/sent_messages_per_rpc/hour")
625           .set_measure(kRpcServerSentMessagesPerRpcMeasureName)
626           .set_aggregation(CountDistributionAggregation())
627           .add_column(ServerMethodTagKey());
628   return descriptor;
629 }
630 
ServerReceivedMessagesPerRpcHour()631 const ViewDescriptor& ServerReceivedMessagesPerRpcHour() {
632   const static ViewDescriptor descriptor =
633       HourDescriptor()
634           .set_name("grpc.io/server/received_messages_per_rpc/hour")
635           .set_measure(kRpcServerReceivedMessagesPerRpcMeasureName)
636           .set_aggregation(CountDistributionAggregation())
637           .add_column(ServerMethodTagKey());
638   return descriptor;
639 }
640 
641 }  // namespace grpc
642