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