]> git.proxmox.com Git - ceph.git/blame - ceph/src/jaegertracing/opentracing-cpp/mocktracer/src/tracer.cpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / jaegertracing / opentracing-cpp / mocktracer / src / tracer.cpp
CommitLineData
f67539c2
TL
1#include <opentracing/mocktracer/tracer.h>
2#include <cstdio>
3#include <exception>
4
5#include "mock_span.h"
6#include "mock_span_context.h"
7#include "propagation.h"
8
9#include <opentracing/dynamic_load.h>
10#include <opentracing/mocktracer/tracer_factory.h>
11#include <cstdio>
12#include <cstring>
13#include <exception>
14
15namespace opentracing {
16BEGIN_OPENTRACING_ABI_NAMESPACE
17namespace mocktracer {
18
19template <class Carrier>
20static expected<void> InjectImpl(const PropagationOptions& propagation_options,
21 const opentracing::SpanContext& span_context,
22 Carrier& writer) {
23 if (propagation_options.inject_error_code.value() != 0) {
24 return opentracing::make_unexpected(propagation_options.inject_error_code);
25 }
26 auto mock_span_context = dynamic_cast<const MockSpanContext*>(&span_context);
27 if (mock_span_context == nullptr) {
28 return opentracing::make_unexpected(
29 opentracing::invalid_span_context_error);
30 }
31 return mock_span_context->Inject(propagation_options, writer);
32}
33
34template <class Carrier>
35opentracing::expected<std::unique_ptr<opentracing::SpanContext>> ExtractImpl(
36 const PropagationOptions& propagation_options, Carrier& reader) {
37 if (propagation_options.extract_error_code.value() != 0) {
38 return opentracing::make_unexpected(propagation_options.extract_error_code);
39 }
40 MockSpanContext* mock_span_context;
41 try {
42 mock_span_context = new MockSpanContext{};
43 } catch (const std::bad_alloc&) {
44 return opentracing::make_unexpected(
45 make_error_code(std::errc::not_enough_memory));
46 }
47 std::unique_ptr<opentracing::SpanContext> span_context(mock_span_context);
48 auto result = mock_span_context->Extract(propagation_options, reader);
49 if (!result) {
50 return opentracing::make_unexpected(result.error());
51 }
52 if (!*result) {
53 span_context.reset();
54 }
55 return std::move(span_context);
56}
57
58MockTracer::MockTracer(MockTracerOptions&& options)
59 : recorder_{std::move(options.recorder)},
60 propagation_options_{std::move(options.propagation_options)} {}
61
62std::unique_ptr<Span> MockTracer::StartSpanWithOptions(
63 string_view operation_name, const StartSpanOptions& options) const
64 noexcept try {
65 return std::unique_ptr<Span>{new MockSpan{shared_from_this(), recorder_.get(),
66 operation_name, options}};
67} catch (const std::exception& e) {
68 fprintf(stderr, "Failed to start span: %s\n", e.what());
69 return nullptr;
70}
71
72void MockTracer::Close() noexcept {
73 if (recorder_ != nullptr) {
74 recorder_->Close();
75 }
76}
77
78expected<void> MockTracer::Inject(const SpanContext& sc,
79 std::ostream& writer) const {
80 return InjectImpl(propagation_options_, sc, writer);
81}
82
83expected<void> MockTracer::Inject(const SpanContext& sc,
84 const TextMapWriter& writer) const {
85 return InjectImpl(propagation_options_, sc, writer);
86}
87
88expected<void> MockTracer::Inject(const SpanContext& sc,
89 const HTTPHeadersWriter& writer) const {
90 return InjectImpl(propagation_options_, sc, writer);
91}
92
93expected<std::unique_ptr<SpanContext>> MockTracer::Extract(
94 std::istream& reader) const {
95 return ExtractImpl(propagation_options_, reader);
96}
97
98expected<std::unique_ptr<SpanContext>> MockTracer::Extract(
99 const TextMapReader& reader) const {
100 return ExtractImpl(propagation_options_, reader);
101}
102
103expected<std::unique_ptr<SpanContext>> MockTracer::Extract(
104 const HTTPHeadersReader& reader) const {
105 return ExtractImpl(propagation_options_, reader);
106}
107} // namespace mocktracer
108END_OPENTRACING_ABI_NAMESPACE
109} // namespace opentracing