• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "opencensus/tags/context_util.h"
22 #include "opencensus/trace/context_util.h"
23 #include "src/cpp/ext/filters/census/context.h"
24 
25 namespace grpc {
26 
27 using ::opencensus::tags::TagMap;
28 using ::opencensus::trace::Span;
29 using ::opencensus::trace::SpanContext;
30 
GenerateServerContext(absl::string_view tracing,absl::string_view stats,absl::string_view primary_role,absl::string_view method,CensusContext * context)31 void GenerateServerContext(absl::string_view tracing, absl::string_view stats,
32                            absl::string_view primary_role,
33                            absl::string_view method, CensusContext* context) {
34   // Destruct the current CensusContext to free the Span memory before
35   // overwriting it below.
36   context->~CensusContext();
37   GrpcTraceContext trace_ctxt;
38   if (TraceContextEncoding::Decode(tracing, &trace_ctxt) !=
39       TraceContextEncoding::kEncodeDecodeFailure) {
40     SpanContext parent_ctx = trace_ctxt.ToSpanContext();
41     if (parent_ctx.IsValid()) {
42       new (context) CensusContext(method, parent_ctx);
43       return;
44     }
45   }
46   new (context) CensusContext(method, TagMap{});
47 }
48 
GenerateClientContext(absl::string_view method,CensusContext * ctxt,CensusContext * parent_ctxt)49 void GenerateClientContext(absl::string_view method, CensusContext* ctxt,
50                            CensusContext* parent_ctxt) {
51   // Destruct the current CensusContext to free the Span memory before
52   // overwriting it below.
53   ctxt->~CensusContext();
54   if (parent_ctxt != nullptr) {
55     SpanContext span_ctxt = parent_ctxt->Context();
56     Span span = parent_ctxt->Span();
57     if (span_ctxt.IsValid()) {
58       new (ctxt) CensusContext(method, &span, TagMap{});
59       return;
60     }
61   }
62   const Span& span = opencensus::trace::GetCurrentSpan();
63   const TagMap& tags = opencensus::tags::GetCurrentTagMap();
64   if (span.context().IsValid()) {
65     // Create span with parent.
66     new (ctxt) CensusContext(method, &span, tags);
67     return;
68   }
69   // Create span without parent.
70   new (ctxt) CensusContext(method, tags);
71 }
72 
TraceContextSerialize(const::opencensus::trace::SpanContext & context,char * tracing_buf,size_t tracing_buf_size)73 size_t TraceContextSerialize(const ::opencensus::trace::SpanContext& context,
74                              char* tracing_buf, size_t tracing_buf_size) {
75   GrpcTraceContext trace_ctxt(context);
76   return TraceContextEncoding::Encode(trace_ctxt, tracing_buf,
77                                       tracing_buf_size);
78 }
79 
StatsContextSerialize(size_t max_tags_len,grpc_slice * tags)80 size_t StatsContextSerialize(size_t max_tags_len, grpc_slice* tags) {
81   // TODO: Add implementation. Waiting on stats tagging to be added.
82   return 0;
83 }
84 
ServerStatsSerialize(uint64_t server_elapsed_time,char * buf,size_t buf_size)85 size_t ServerStatsSerialize(uint64_t server_elapsed_time, char* buf,
86                             size_t buf_size) {
87   return RpcServerStatsEncoding::Encode(server_elapsed_time, buf, buf_size);
88 }
89 
ServerStatsDeserialize(const char * buf,size_t buf_size,uint64_t * server_elapsed_time)90 size_t ServerStatsDeserialize(const char* buf, size_t buf_size,
91                               uint64_t* server_elapsed_time) {
92   return RpcServerStatsEncoding::Decode(absl::string_view(buf, buf_size),
93                                         server_elapsed_time);
94 }
95 
GetIncomingDataSize(const grpc_call_final_info * final_info)96 uint64_t GetIncomingDataSize(const grpc_call_final_info* final_info) {
97   return final_info->stats.transport_stream_stats.incoming.data_bytes;
98 }
99 
GetOutgoingDataSize(const grpc_call_final_info * final_info)100 uint64_t GetOutgoingDataSize(const grpc_call_final_info* final_info) {
101   return final_info->stats.transport_stream_stats.outgoing.data_bytes;
102 }
103 
SpanContextFromCensusContext(const census_context * ctxt)104 SpanContext SpanContextFromCensusContext(const census_context* ctxt) {
105   return reinterpret_cast<const CensusContext*>(ctxt)->Context();
106 }
107 
SpanFromCensusContext(const census_context * ctxt)108 Span SpanFromCensusContext(const census_context* ctxt) {
109   return reinterpret_cast<const CensusContext*>(ctxt)->Span();
110 }
111 
StatusCodeToString(grpc_status_code code)112 absl::string_view StatusCodeToString(grpc_status_code code) {
113   switch (code) {
114     case GRPC_STATUS_OK:
115       return "OK";
116     case GRPC_STATUS_CANCELLED:
117       return "CANCELLED";
118     case GRPC_STATUS_UNKNOWN:
119       return "UNKNOWN";
120     case GRPC_STATUS_INVALID_ARGUMENT:
121       return "INVALID_ARGUMENT";
122     case GRPC_STATUS_DEADLINE_EXCEEDED:
123       return "DEADLINE_EXCEEDED";
124     case GRPC_STATUS_NOT_FOUND:
125       return "NOT_FOUND";
126     case GRPC_STATUS_ALREADY_EXISTS:
127       return "ALREADY_EXISTS";
128     case GRPC_STATUS_PERMISSION_DENIED:
129       return "PERMISSION_DENIED";
130     case GRPC_STATUS_UNAUTHENTICATED:
131       return "UNAUTHENTICATED";
132     case GRPC_STATUS_RESOURCE_EXHAUSTED:
133       return "RESOURCE_EXHAUSTED";
134     case GRPC_STATUS_FAILED_PRECONDITION:
135       return "FAILED_PRECONDITION";
136     case GRPC_STATUS_ABORTED:
137       return "ABORTED";
138     case GRPC_STATUS_OUT_OF_RANGE:
139       return "OUT_OF_RANGE";
140     case GRPC_STATUS_UNIMPLEMENTED:
141       return "UNIMPLEMENTED";
142     case GRPC_STATUS_INTERNAL:
143       return "INTERNAL";
144     case GRPC_STATUS_UNAVAILABLE:
145       return "UNAVAILABLE";
146     case GRPC_STATUS_DATA_LOSS:
147       return "DATA_LOSS";
148     default:
149       // gRPC wants users of this enum to include a default branch so that
150       // adding values is not a breaking change.
151       return "UNKNOWN_STATUS";
152   }
153 }
154 
155 }  // namespace grpc
156