1 // 2 // 3 // Copyright 2019 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 #ifndef GRPCPP_OPENCENSUS_H 20 #define GRPCPP_OPENCENSUS_H 21 22 #include "opencensus/stats/view_descriptor.h" 23 #include "opencensus/tags/tag_map.h" 24 #include "opencensus/trace/span.h" 25 #include "opencensus/trace/span_context.h" 26 27 namespace grpc { 28 class ServerContext; 29 // These symbols in this file will not be included in the binary unless 30 // grpc_opencensus_plugin build target was added as a dependency. At the moment 31 // it is only setup to be built with Bazel. 32 33 // Registers the OpenCensus plugin with gRPC, so that it will be used for future 34 // RPCs. This must be called before any views are created. 35 void RegisterOpenCensusPlugin(); 36 37 // RPC stats definitions, defined by 38 // https://github.com/census-instrumentation/opencensus-specs/blob/master/stats/gRPC.md 39 40 // Registers the cumulative gRPC views so that they will be exported by any 41 // registered stats exporter. For on-task stats, construct a View using the 42 // ViewDescriptors below. 43 void RegisterOpenCensusViewsForExport(); 44 45 // Returns the tracing Span for the current RPC. 46 ::opencensus::trace::Span GetSpanFromServerContext(ServerContext* context); 47 48 namespace experimental { 49 50 // The tag keys set when recording RPC stats. 51 ::opencensus::tags::TagKey ClientMethodTagKey(); 52 ::opencensus::tags::TagKey ClientStatusTagKey(); 53 ::opencensus::tags::TagKey ServerMethodTagKey(); 54 ::opencensus::tags::TagKey ServerStatusTagKey(); 55 56 // Names of measures used by the plugin--users can create views on these 57 // measures but should not record data for them. 58 extern const absl::string_view kRpcClientSentMessagesPerRpcMeasureName; 59 extern const absl::string_view kRpcClientSentBytesPerRpcMeasureName; 60 extern const absl::string_view kRpcClientReceivedMessagesPerRpcMeasureName; 61 extern const absl::string_view kRpcClientReceivedBytesPerRpcMeasureName; 62 extern const absl::string_view kRpcClientRoundtripLatencyMeasureName; 63 extern const absl::string_view kRpcClientServerLatencyMeasureName; 64 extern const absl::string_view kRpcClientStartedRpcsMeasureName; 65 extern const absl::string_view kRpcClientRetriesPerCallMeasureName; 66 extern const absl::string_view kRpcClientTransparentRetriesPerCallMeasureName; 67 extern const absl::string_view kRpcClientRetryDelayPerCallMeasureName; 68 extern const absl::string_view kRpcClientTransportLatencyMeasureName; 69 70 extern const absl::string_view kRpcServerSentMessagesPerRpcMeasureName; 71 extern const absl::string_view kRpcServerSentBytesPerRpcMeasureName; 72 extern const absl::string_view kRpcServerReceivedMessagesPerRpcMeasureName; 73 extern const absl::string_view kRpcServerReceivedBytesPerRpcMeasureName; 74 extern const absl::string_view kRpcServerServerLatencyMeasureName; 75 extern const absl::string_view kRpcServerStartedRpcsMeasureName; 76 77 // Canonical gRPC view definitions. 78 const ::opencensus::stats::ViewDescriptor& ClientStartedRpcs(); 79 const ::opencensus::stats::ViewDescriptor& ClientCompletedRpcs(); 80 const ::opencensus::stats::ViewDescriptor& ClientRoundtripLatency(); 81 const ::opencensus::stats::ViewDescriptor& 82 ClientSentCompressedMessageBytesPerRpc(); 83 const ::opencensus::stats::ViewDescriptor& 84 ClientReceivedCompressedMessageBytesPerRpc(); 85 const ::opencensus::stats::ViewDescriptor& ClientTransportLatency(); 86 87 const ::opencensus::stats::ViewDescriptor& ServerStartedRpcs(); 88 const ::opencensus::stats::ViewDescriptor& ServerCompletedRpcs(); 89 const ::opencensus::stats::ViewDescriptor& 90 ServerSentCompressedMessageBytesPerRpc(); 91 const ::opencensus::stats::ViewDescriptor& 92 ServerReceivedCompressedMessageBytesPerRpc(); 93 const ::opencensus::stats::ViewDescriptor& ServerServerLatency(); 94 95 const ::opencensus::stats::ViewDescriptor& ClientSentMessagesPerRpcCumulative(); 96 const ::opencensus::stats::ViewDescriptor& ClientSentBytesPerRpcCumulative(); 97 const ::opencensus::stats::ViewDescriptor& 98 ClientReceivedMessagesPerRpcCumulative(); 99 const ::opencensus::stats::ViewDescriptor& 100 ClientReceivedBytesPerRpcCumulative(); 101 const ::opencensus::stats::ViewDescriptor& ClientRoundtripLatencyCumulative(); 102 const ::opencensus::stats::ViewDescriptor& ClientServerLatencyCumulative(); 103 const ::opencensus::stats::ViewDescriptor& ClientStartedRpcsCumulative(); 104 const ::opencensus::stats::ViewDescriptor& ClientCompletedRpcsCumulative(); 105 const ::opencensus::stats::ViewDescriptor& ClientRetriesPerCallCumulative(); 106 const ::opencensus::stats::ViewDescriptor& ClientRetriesCumulative(); 107 const ::opencensus::stats::ViewDescriptor& 108 ClientTransparentRetriesPerCallCumulative(); 109 const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesCumulative(); 110 const ::opencensus::stats::ViewDescriptor& ClientRetryDelayPerCallCumulative(); 111 112 const ::opencensus::stats::ViewDescriptor& ServerSentBytesPerRpcCumulative(); 113 const ::opencensus::stats::ViewDescriptor& 114 ServerReceivedBytesPerRpcCumulative(); 115 const ::opencensus::stats::ViewDescriptor& ServerServerLatencyCumulative(); 116 const ::opencensus::stats::ViewDescriptor& ServerStartedRpcsCumulative(); 117 const ::opencensus::stats::ViewDescriptor& ServerCompletedRpcsCumulative(); 118 const ::opencensus::stats::ViewDescriptor& ServerSentMessagesPerRpcCumulative(); 119 const ::opencensus::stats::ViewDescriptor& 120 ServerReceivedMessagesPerRpcCumulative(); 121 122 const ::opencensus::stats::ViewDescriptor& ClientSentMessagesPerRpcMinute(); 123 const ::opencensus::stats::ViewDescriptor& ClientSentBytesPerRpcMinute(); 124 const ::opencensus::stats::ViewDescriptor& ClientReceivedMessagesPerRpcMinute(); 125 const ::opencensus::stats::ViewDescriptor& ClientReceivedBytesPerRpcMinute(); 126 const ::opencensus::stats::ViewDescriptor& ClientRoundtripLatencyMinute(); 127 const ::opencensus::stats::ViewDescriptor& ClientServerLatencyMinute(); 128 const ::opencensus::stats::ViewDescriptor& ClientStartedRpcsMinute(); 129 const ::opencensus::stats::ViewDescriptor& ClientCompletedRpcsMinute(); 130 const ::opencensus::stats::ViewDescriptor& ClientRetriesPerCallMinute(); 131 const ::opencensus::stats::ViewDescriptor& ClientRetriesMinute(); 132 const ::opencensus::stats::ViewDescriptor& 133 ClientTransparentRetriesPerCallMinute(); 134 const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesMinute(); 135 const ::opencensus::stats::ViewDescriptor& ClientRetryDelayPerCallMinute(); 136 137 const ::opencensus::stats::ViewDescriptor& ServerSentMessagesPerRpcMinute(); 138 const ::opencensus::stats::ViewDescriptor& ServerSentBytesPerRpcMinute(); 139 const ::opencensus::stats::ViewDescriptor& ServerReceivedMessagesPerRpcMinute(); 140 const ::opencensus::stats::ViewDescriptor& ServerReceivedBytesPerRpcMinute(); 141 const ::opencensus::stats::ViewDescriptor& ServerServerLatencyMinute(); 142 const ::opencensus::stats::ViewDescriptor& ServerStartedRpcsMinute(); 143 const ::opencensus::stats::ViewDescriptor& ServerCompletedRpcsMinute(); 144 145 const ::opencensus::stats::ViewDescriptor& ClientSentMessagesPerRpcHour(); 146 const ::opencensus::stats::ViewDescriptor& ClientSentBytesPerRpcHour(); 147 const ::opencensus::stats::ViewDescriptor& ClientReceivedMessagesPerRpcHour(); 148 const ::opencensus::stats::ViewDescriptor& ClientReceivedBytesPerRpcHour(); 149 const ::opencensus::stats::ViewDescriptor& ClientRoundtripLatencyHour(); 150 const ::opencensus::stats::ViewDescriptor& ClientServerLatencyHour(); 151 const ::opencensus::stats::ViewDescriptor& ClientStartedRpcsHour(); 152 const ::opencensus::stats::ViewDescriptor& ClientCompletedRpcsHour(); 153 const ::opencensus::stats::ViewDescriptor& ClientRetriesPerCallHour(); 154 const ::opencensus::stats::ViewDescriptor& ClientRetriesHour(); 155 const ::opencensus::stats::ViewDescriptor& 156 ClientTransparentRetriesPerCallHour(); 157 const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesHour(); 158 const ::opencensus::stats::ViewDescriptor& ClientRetryDelayPerCallHour(); 159 160 const ::opencensus::stats::ViewDescriptor& ServerSentMessagesPerRpcHour(); 161 const ::opencensus::stats::ViewDescriptor& ServerSentBytesPerRpcHour(); 162 const ::opencensus::stats::ViewDescriptor& ServerReceivedMessagesPerRpcHour(); 163 const ::opencensus::stats::ViewDescriptor& ServerReceivedBytesPerRpcHour(); 164 const ::opencensus::stats::ViewDescriptor& ServerServerLatencyHour(); 165 const ::opencensus::stats::ViewDescriptor& ServerStartedRpcsHour(); 166 const ::opencensus::stats::ViewDescriptor& ServerCompletedRpcsHour(); 167 168 // Thread compatible. 169 class CensusContext { 170 public: CensusContext()171 CensusContext() : span_(::opencensus::trace::Span::BlankSpan()), tags_({}) {} 172 CensusContext(absl::string_view name,const::opencensus::tags::TagMap & tags)173 explicit CensusContext(absl::string_view name, 174 const ::opencensus::tags::TagMap& tags) 175 : span_(::opencensus::trace::Span::StartSpan(name)), tags_(tags) {} 176 CensusContext(const::opencensus::tags::TagMap & tags)177 explicit CensusContext(const ::opencensus::tags::TagMap& tags) 178 : span_(::opencensus::trace::Span::BlankSpan()), tags_(tags) {} 179 CensusContext(absl::string_view name,const::opencensus::trace::Span * parent,const::opencensus::tags::TagMap & tags)180 CensusContext(absl::string_view name, const ::opencensus::trace::Span* parent, 181 const ::opencensus::tags::TagMap& tags) 182 : span_(::opencensus::trace::Span::StartSpan(name, parent)), 183 tags_(tags) {} 184 CensusContext(absl::string_view name,const::opencensus::trace::SpanContext & parent_ctxt)185 CensusContext(absl::string_view name, 186 const ::opencensus::trace::SpanContext& parent_ctxt) 187 : span_(::opencensus::trace::Span::StartSpanWithRemoteParent( 188 name, parent_ctxt)), 189 tags_({}) {} 190 CensusContext(absl::string_view name,const::opencensus::trace::SpanContext & parent_ctxt,const::opencensus::tags::TagMap & tags)191 CensusContext(absl::string_view name, 192 const ::opencensus::trace::SpanContext& parent_ctxt, 193 const ::opencensus::tags::TagMap& tags) 194 : span_(::opencensus::trace::Span::StartSpanWithRemoteParent( 195 name, parent_ctxt)), 196 tags_(tags) {} 197 AddSpanAttribute(absl::string_view key,opencensus::trace::AttributeValueRef attribute)198 void AddSpanAttribute(absl::string_view key, 199 opencensus::trace::AttributeValueRef attribute) { 200 span_.AddAttribute(key, attribute); 201 } 202 AddSpanAnnotation(absl::string_view description,opencensus::trace::AttributesRef attributes)203 void AddSpanAnnotation(absl::string_view description, 204 opencensus::trace::AttributesRef attributes) { 205 span_.AddAnnotation(description, attributes); 206 } 207 Span()208 const ::opencensus::trace::Span& Span() const { return span_; } tags()209 const ::opencensus::tags::TagMap& tags() const { return tags_; } 210 Context()211 ::opencensus::trace::SpanContext Context() const { return Span().context(); } EndSpan()212 void EndSpan() { Span().End(); } 213 214 private: 215 ::opencensus::trace::Span span_; 216 ::opencensus::tags::TagMap tags_; 217 }; 218 219 } // namespace experimental 220 221 } // namespace grpc 222 223 #endif // GRPCPP_OPENCENSUS_H 224