2
0

tracer_common.h 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include <cstring>
  5. #include <iostream>
  6. #include <vector>
  7. #include "opentelemetry/context/propagation/global_propagator.h"
  8. #include "opentelemetry/context/propagation/text_map_propagator.h"
  9. #include "opentelemetry/exporters/ostream/span_exporter_factory.h"
  10. #include "opentelemetry/ext/http/client/http_client.h"
  11. #include "opentelemetry/nostd/shared_ptr.h"
  12. #include "opentelemetry/sdk/trace/exporter.h"
  13. #include "opentelemetry/sdk/trace/processor.h"
  14. #include "opentelemetry/sdk/trace/provider.h"
  15. #include "opentelemetry/sdk/trace/simple_processor_factory.h"
  16. #include "opentelemetry/sdk/trace/tracer_context.h"
  17. #include "opentelemetry/sdk/trace/tracer_context_factory.h"
  18. #include "opentelemetry/sdk/trace/tracer_provider_factory.h"
  19. #include "opentelemetry/trace/propagation/http_trace_context.h"
  20. #include "opentelemetry/trace/provider.h"
  21. namespace
  22. {
  23. template <typename T>
  24. class HttpTextMapCarrier : public opentelemetry::context::propagation::TextMapCarrier
  25. {
  26. public:
  27. HttpTextMapCarrier(T &headers) : headers_(headers) {}
  28. HttpTextMapCarrier() = default;
  29. virtual opentelemetry::nostd::string_view Get(
  30. opentelemetry::nostd::string_view key) const noexcept override
  31. {
  32. std::string key_to_compare = key.data();
  33. // Header's first letter seems to be automatically capitaliazed by our test http-server, so
  34. // compare accordingly.
  35. if (key == opentelemetry::trace::propagation::kTraceParent)
  36. {
  37. key_to_compare = "Traceparent";
  38. }
  39. else if (key == opentelemetry::trace::propagation::kTraceState)
  40. {
  41. key_to_compare = "Tracestate";
  42. }
  43. auto it = headers_.find(key_to_compare);
  44. if (it != headers_.end())
  45. {
  46. return it->second;
  47. }
  48. return "";
  49. }
  50. virtual void Set(opentelemetry::nostd::string_view key,
  51. opentelemetry::nostd::string_view value) noexcept override
  52. {
  53. headers_.insert(std::pair<std::string, std::string>(std::string(key), std::string(value)));
  54. }
  55. T headers_;
  56. };
  57. void InitTracer()
  58. {
  59. auto exporter = opentelemetry::exporter::trace::OStreamSpanExporterFactory::Create();
  60. auto processor =
  61. opentelemetry::sdk::trace::SimpleSpanProcessorFactory::Create(std::move(exporter));
  62. std::vector<std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>> processors;
  63. processors.push_back(std::move(processor));
  64. // Default is an always-on sampler.
  65. std::unique_ptr<opentelemetry::sdk::trace::TracerContext> context =
  66. opentelemetry::sdk::trace::TracerContextFactory::Create(std::move(processors));
  67. std::shared_ptr<opentelemetry::trace::TracerProvider> provider =
  68. opentelemetry::sdk::trace::TracerProviderFactory::Create(std::move(context));
  69. // Set the global trace provider
  70. opentelemetry::sdk::trace::Provider::SetTracerProvider(provider);
  71. // set global propagator
  72. opentelemetry::context::propagation::GlobalTextMapPropagator::SetGlobalPropagator(
  73. opentelemetry::nostd::shared_ptr<opentelemetry::context::propagation::TextMapPropagator>(
  74. new opentelemetry::trace::propagation::HttpTraceContext()));
  75. }
  76. void CleanupTracer()
  77. {
  78. std::shared_ptr<opentelemetry::trace::TracerProvider> none;
  79. opentelemetry::sdk::trace::Provider::SetTracerProvider(none);
  80. }
  81. opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> get_tracer(std::string tracer_name)
  82. {
  83. auto provider = opentelemetry::trace::Provider::GetTracerProvider();
  84. return provider->GetTracer(tracer_name);
  85. }
  86. } // namespace