// // // Copyright 2019 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // #ifndef GRPCPP_OPENCENSUS_H #define GRPCPP_OPENCENSUS_H #include "opencensus/stats/view_descriptor.h" #include "opencensus/tags/tag_map.h" #include "opencensus/trace/span.h" #include "opencensus/trace/span_context.h" namespace grpc { class ServerContext; // These symbols in this file will not be included in the binary unless // grpc_opencensus_plugin build target was added as a dependency. At the moment // it is only setup to be built with Bazel. // Registers the OpenCensus plugin with gRPC, so that it will be used for future // RPCs. This must be called before any views are created. void RegisterOpenCensusPlugin(); // RPC stats definitions, defined by // https://github.com/census-instrumentation/opencensus-specs/blob/master/stats/gRPC.md // Registers the cumulative gRPC views so that they will be exported by any // registered stats exporter. For on-task stats, construct a View using the // ViewDescriptors below. void RegisterOpenCensusViewsForExport(); // Returns the tracing Span for the current RPC. ::opencensus::trace::Span GetSpanFromServerContext(ServerContext* context); namespace experimental { // The tag keys set when recording RPC stats. ::opencensus::tags::TagKey ClientMethodTagKey(); ::opencensus::tags::TagKey ClientStatusTagKey(); ::opencensus::tags::TagKey ServerMethodTagKey(); ::opencensus::tags::TagKey ServerStatusTagKey(); // Names of measures used by the plugin--users can create views on these // measures but should not record data for them. extern const absl::string_view kRpcClientSentMessagesPerRpcMeasureName; extern const absl::string_view kRpcClientSentBytesPerRpcMeasureName; extern const absl::string_view kRpcClientReceivedMessagesPerRpcMeasureName; extern const absl::string_view kRpcClientReceivedBytesPerRpcMeasureName; extern const absl::string_view kRpcClientRoundtripLatencyMeasureName; extern const absl::string_view kRpcClientServerLatencyMeasureName; extern const absl::string_view kRpcClientStartedRpcsMeasureName; extern const absl::string_view kRpcClientRetriesPerCallMeasureName; extern const absl::string_view kRpcClientTransparentRetriesPerCallMeasureName; extern const absl::string_view kRpcClientRetryDelayPerCallMeasureName; extern const absl::string_view kRpcClientTransportLatencyMeasureName; extern const absl::string_view kRpcServerSentMessagesPerRpcMeasureName; extern const absl::string_view kRpcServerSentBytesPerRpcMeasureName; extern const absl::string_view kRpcServerReceivedMessagesPerRpcMeasureName; extern const absl::string_view kRpcServerReceivedBytesPerRpcMeasureName; extern const absl::string_view kRpcServerServerLatencyMeasureName; extern const absl::string_view kRpcServerStartedRpcsMeasureName; // Canonical gRPC view definitions. const ::opencensus::stats::ViewDescriptor& ClientStartedRpcs(); const ::opencensus::stats::ViewDescriptor& ClientCompletedRpcs(); const ::opencensus::stats::ViewDescriptor& ClientRoundtripLatency(); const ::opencensus::stats::ViewDescriptor& ClientSentCompressedMessageBytesPerRpc(); const ::opencensus::stats::ViewDescriptor& ClientReceivedCompressedMessageBytesPerRpc(); const ::opencensus::stats::ViewDescriptor& ClientTransportLatency(); const ::opencensus::stats::ViewDescriptor& ServerStartedRpcs(); const ::opencensus::stats::ViewDescriptor& ServerCompletedRpcs(); const ::opencensus::stats::ViewDescriptor& ServerSentCompressedMessageBytesPerRpc(); const ::opencensus::stats::ViewDescriptor& ServerReceivedCompressedMessageBytesPerRpc(); const ::opencensus::stats::ViewDescriptor& ServerServerLatency(); const ::opencensus::stats::ViewDescriptor& ClientSentMessagesPerRpcCumulative(); const ::opencensus::stats::ViewDescriptor& ClientSentBytesPerRpcCumulative(); const ::opencensus::stats::ViewDescriptor& ClientReceivedMessagesPerRpcCumulative(); const ::opencensus::stats::ViewDescriptor& ClientReceivedBytesPerRpcCumulative(); const ::opencensus::stats::ViewDescriptor& ClientRoundtripLatencyCumulative(); const ::opencensus::stats::ViewDescriptor& ClientServerLatencyCumulative(); const ::opencensus::stats::ViewDescriptor& ClientStartedRpcsCumulative(); const ::opencensus::stats::ViewDescriptor& ClientCompletedRpcsCumulative(); const ::opencensus::stats::ViewDescriptor& ClientRetriesPerCallCumulative(); const ::opencensus::stats::ViewDescriptor& ClientRetriesCumulative(); const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesPerCallCumulative(); const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesCumulative(); const ::opencensus::stats::ViewDescriptor& ClientRetryDelayPerCallCumulative(); const ::opencensus::stats::ViewDescriptor& ServerSentBytesPerRpcCumulative(); const ::opencensus::stats::ViewDescriptor& ServerReceivedBytesPerRpcCumulative(); const ::opencensus::stats::ViewDescriptor& ServerServerLatencyCumulative(); const ::opencensus::stats::ViewDescriptor& ServerStartedRpcsCumulative(); const ::opencensus::stats::ViewDescriptor& ServerCompletedRpcsCumulative(); const ::opencensus::stats::ViewDescriptor& ServerSentMessagesPerRpcCumulative(); const ::opencensus::stats::ViewDescriptor& ServerReceivedMessagesPerRpcCumulative(); const ::opencensus::stats::ViewDescriptor& ClientSentMessagesPerRpcMinute(); const ::opencensus::stats::ViewDescriptor& ClientSentBytesPerRpcMinute(); const ::opencensus::stats::ViewDescriptor& ClientReceivedMessagesPerRpcMinute(); const ::opencensus::stats::ViewDescriptor& ClientReceivedBytesPerRpcMinute(); const ::opencensus::stats::ViewDescriptor& ClientRoundtripLatencyMinute(); const ::opencensus::stats::ViewDescriptor& ClientServerLatencyMinute(); const ::opencensus::stats::ViewDescriptor& ClientStartedRpcsMinute(); const ::opencensus::stats::ViewDescriptor& ClientCompletedRpcsMinute(); const ::opencensus::stats::ViewDescriptor& ClientRetriesPerCallMinute(); const ::opencensus::stats::ViewDescriptor& ClientRetriesMinute(); const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesPerCallMinute(); const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesMinute(); const ::opencensus::stats::ViewDescriptor& ClientRetryDelayPerCallMinute(); const ::opencensus::stats::ViewDescriptor& ServerSentMessagesPerRpcMinute(); const ::opencensus::stats::ViewDescriptor& ServerSentBytesPerRpcMinute(); const ::opencensus::stats::ViewDescriptor& ServerReceivedMessagesPerRpcMinute(); const ::opencensus::stats::ViewDescriptor& ServerReceivedBytesPerRpcMinute(); const ::opencensus::stats::ViewDescriptor& ServerServerLatencyMinute(); const ::opencensus::stats::ViewDescriptor& ServerStartedRpcsMinute(); const ::opencensus::stats::ViewDescriptor& ServerCompletedRpcsMinute(); const ::opencensus::stats::ViewDescriptor& ClientSentMessagesPerRpcHour(); const ::opencensus::stats::ViewDescriptor& ClientSentBytesPerRpcHour(); const ::opencensus::stats::ViewDescriptor& ClientReceivedMessagesPerRpcHour(); const ::opencensus::stats::ViewDescriptor& ClientReceivedBytesPerRpcHour(); const ::opencensus::stats::ViewDescriptor& ClientRoundtripLatencyHour(); const ::opencensus::stats::ViewDescriptor& ClientServerLatencyHour(); const ::opencensus::stats::ViewDescriptor& ClientStartedRpcsHour(); const ::opencensus::stats::ViewDescriptor& ClientCompletedRpcsHour(); const ::opencensus::stats::ViewDescriptor& ClientRetriesPerCallHour(); const ::opencensus::stats::ViewDescriptor& ClientRetriesHour(); const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesPerCallHour(); const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesHour(); const ::opencensus::stats::ViewDescriptor& ClientRetryDelayPerCallHour(); const ::opencensus::stats::ViewDescriptor& ServerSentMessagesPerRpcHour(); const ::opencensus::stats::ViewDescriptor& ServerSentBytesPerRpcHour(); const ::opencensus::stats::ViewDescriptor& ServerReceivedMessagesPerRpcHour(); const ::opencensus::stats::ViewDescriptor& ServerReceivedBytesPerRpcHour(); const ::opencensus::stats::ViewDescriptor& ServerServerLatencyHour(); const ::opencensus::stats::ViewDescriptor& ServerStartedRpcsHour(); const ::opencensus::stats::ViewDescriptor& ServerCompletedRpcsHour(); // Thread compatible. class CensusContext { public: CensusContext() : span_(::opencensus::trace::Span::BlankSpan()), tags_({}) {} explicit CensusContext(absl::string_view name, const ::opencensus::tags::TagMap& tags) : span_(::opencensus::trace::Span::StartSpan(name)), tags_(tags) {} explicit CensusContext(const ::opencensus::tags::TagMap& tags) : span_(::opencensus::trace::Span::BlankSpan()), tags_(tags) {} CensusContext(absl::string_view name, const ::opencensus::trace::Span* parent, const ::opencensus::tags::TagMap& tags) : span_(::opencensus::trace::Span::StartSpan(name, parent)), tags_(tags) {} CensusContext(absl::string_view name, const ::opencensus::trace::SpanContext& parent_ctxt) : span_(::opencensus::trace::Span::StartSpanWithRemoteParent( name, parent_ctxt)), tags_({}) {} CensusContext(absl::string_view name, const ::opencensus::trace::SpanContext& parent_ctxt, const ::opencensus::tags::TagMap& tags) : span_(::opencensus::trace::Span::StartSpanWithRemoteParent( name, parent_ctxt)), tags_(tags) {} void AddSpanAttribute(absl::string_view key, opencensus::trace::AttributeValueRef attribute) { span_.AddAttribute(key, attribute); } void AddSpanAnnotation(absl::string_view description, opencensus::trace::AttributesRef attributes) { span_.AddAnnotation(description, attributes); } const ::opencensus::trace::Span& Span() const { return span_; } const ::opencensus::tags::TagMap& tags() const { return tags_; } ::opencensus::trace::SpanContext Context() const { return Span().context(); } void EndSpan() { Span().End(); } private: ::opencensus::trace::Span span_; ::opencensus::tags::TagMap tags_; }; } // namespace experimental } // namespace grpc #endif // GRPCPP_OPENCENSUS_H