tracer_common.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "opentelemetry/context/propagation/global_propagator.h"
  5. #include "opentelemetry/context/propagation/text_map_propagator.h"
  6. #include "opentelemetry/exporters/ostream/span_exporter_factory.h"
  7. #include "opentelemetry/nostd/shared_ptr.h"
  8. #include "opentelemetry/sdk/trace/exporter.h"
  9. #include "opentelemetry/sdk/trace/processor.h"
  10. #include "opentelemetry/sdk/trace/provider.h"
  11. #include "opentelemetry/sdk/trace/simple_processor_factory.h"
  12. #include "opentelemetry/sdk/trace/tracer_context.h"
  13. #include "opentelemetry/sdk/trace/tracer_context_factory.h"
  14. #include "opentelemetry/sdk/trace/tracer_provider_factory.h"
  15. #include "opentelemetry/trace/propagation/http_trace_context.h"
  16. #include "opentelemetry/trace/provider.h"
  17. #include <grpcpp/grpcpp.h>
  18. #include <cstring>
  19. #include <iostream>
  20. #include <vector>
  21. using grpc::ClientContext;
  22. using grpc::ServerContext;
  23. namespace
  24. {
  25. class GrpcClientCarrier : public opentelemetry::context::propagation::TextMapCarrier
  26. {
  27. public:
  28. GrpcClientCarrier(ClientContext *context) : context_(context) {}
  29. GrpcClientCarrier() = default;
  30. virtual opentelemetry::nostd::string_view Get(
  31. opentelemetry::nostd::string_view /* key */) const noexcept override
  32. {
  33. return "";
  34. }
  35. virtual void Set(opentelemetry::nostd::string_view key,
  36. opentelemetry::nostd::string_view value) noexcept override
  37. {
  38. std::cout << " Client ::: Adding " << key << " " << value << "\n";
  39. context_->AddMetadata(std::string(key), std::string(value));
  40. }
  41. ClientContext *context_ = nullptr;
  42. };
  43. class GrpcServerCarrier : public opentelemetry::context::propagation::TextMapCarrier
  44. {
  45. public:
  46. GrpcServerCarrier(ServerContext *context) : context_(context) {}
  47. GrpcServerCarrier() = default;
  48. virtual opentelemetry::nostd::string_view Get(
  49. opentelemetry::nostd::string_view key) const noexcept override
  50. {
  51. auto it = context_->client_metadata().find({key.data(), key.size()});
  52. if (it != context_->client_metadata().end())
  53. {
  54. return opentelemetry::nostd::string_view(it->second.data(), it->second.size());
  55. }
  56. return "";
  57. }
  58. virtual void Set(opentelemetry::nostd::string_view /* key */,
  59. opentelemetry::nostd::string_view /* value */) noexcept override
  60. {
  61. // Not required for server
  62. }
  63. ServerContext *context_ = nullptr;
  64. };
  65. void InitTracer()
  66. {
  67. auto exporter = opentelemetry::exporter::trace::OStreamSpanExporterFactory::Create();
  68. auto processor =
  69. opentelemetry::sdk::trace::SimpleSpanProcessorFactory::Create(std::move(exporter));
  70. std::vector<std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>> processors;
  71. processors.push_back(std::move(processor));
  72. // Default is an always-on sampler.
  73. std::unique_ptr<opentelemetry::sdk::trace::TracerContext> context =
  74. opentelemetry::sdk::trace::TracerContextFactory::Create(std::move(processors));
  75. std::shared_ptr<opentelemetry::trace::TracerProvider> provider =
  76. opentelemetry::sdk::trace::TracerProviderFactory::Create(std::move(context));
  77. // Set the global trace provider
  78. opentelemetry::sdk::trace::Provider::SetTracerProvider(provider);
  79. // set global propagator
  80. opentelemetry::context::propagation::GlobalTextMapPropagator::SetGlobalPropagator(
  81. opentelemetry::nostd::shared_ptr<opentelemetry::context::propagation::TextMapPropagator>(
  82. new opentelemetry::trace::propagation::HttpTraceContext()));
  83. }
  84. void CleanupTracer()
  85. {
  86. std::shared_ptr<opentelemetry::trace::TracerProvider> none;
  87. opentelemetry::sdk::trace::Provider::SetTracerProvider(none);
  88. }
  89. opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> get_tracer(std::string tracer_name)
  90. {
  91. auto provider = opentelemetry::trace::Provider::GetTracerProvider();
  92. return provider->GetTracer(tracer_name);
  93. }
  94. } // namespace