forked from open-telemetry/opentelemetry-cpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspan_benchmark.cc
128 lines (114 loc) · 4.03 KB
/
span_benchmark.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
#include "opentelemetry/nostd/shared_ptr.h"
#include "opentelemetry/trace/noop.h"
#include "opentelemetry/trace/propagation/detail/context.h"
#include "opentelemetry/trace/span_id.h"
#include "opentelemetry/trace/trace_id.h"
#include <cstdint>
#include <benchmark/benchmark.h>
using opentelemetry::trace::SpanContext;
namespace trace_api = opentelemetry::trace;
namespace nostd = opentelemetry::nostd;
namespace
{
std::shared_ptr<opentelemetry::trace::Tracer> initTracer()
{
return std::shared_ptr<opentelemetry::trace::Tracer>(new trace_api::NoopTracer());
}
// Test to measure performance for span creation
void BM_SpanCreation(benchmark::State &state)
{
auto tracer = initTracer();
while (state.KeepRunning())
{
auto span = tracer->StartSpan("span");
span->End();
}
}
BENCHMARK(BM_SpanCreation);
// Test to measure performance for single span creation with scope
void BM_SpanCreationWithScope(benchmark::State &state)
{
auto tracer = initTracer();
while (state.KeepRunning())
{
auto span = tracer->StartSpan("span");
auto scope = tracer->WithActiveSpan(span);
span->End();
}
}
BENCHMARK(BM_SpanCreationWithScope);
// Test to measure performance for nested span creation with scope
void BM_NestedSpanCreationWithScope(benchmark::State &state)
{
auto tracer = initTracer();
while (state.KeepRunning())
{
auto span = tracer->StartSpan("outer");
auto scope = tracer->WithActiveSpan(span);
{
auto span = tracer->StartSpan("inner");
auto scope = tracer->WithActiveSpan(span);
{
auto span = tracer->StartSpan("innermost");
auto scope = tracer->WithActiveSpan(span);
span->End();
}
span->End();
}
span->End();
}
}
BENCHMARK(BM_NestedSpanCreationWithScope);
// Test to measure performance for nested span creation with manual span context management
void BM_SpanCreationWithManualSpanContextPropagation(benchmark::State &state)
{
auto tracer = initTracer();
constexpr uint8_t buf1[] = {1, 2, 3, 4, 5, 6, 7, 8};
trace_api::SpanId span_id(buf1);
constexpr uint8_t buf2[] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1};
trace_api::TraceId trace_id(buf2);
while (state.KeepRunning())
{
auto outer_span = nostd::shared_ptr<trace_api::Span>(
new trace_api::DefaultSpan(SpanContext(trace_id, span_id, trace_api::TraceFlags(), false)));
trace_api::StartSpanOptions options;
options.parent = outer_span->GetContext();
auto inner_span = tracer->StartSpan("inner", options);
auto inner_span_context = inner_span->GetContext();
options.parent = inner_span_context;
auto innermost_span = tracer->StartSpan("innermost", options);
innermost_span->End();
inner_span->End();
}
}
BENCHMARK(BM_SpanCreationWithManualSpanContextPropagation);
// Test to measure performance for nested span creation with context propagation
void BM_SpanCreationWitContextPropagation(benchmark::State &state)
{
auto tracer = initTracer();
constexpr uint8_t buf1[] = {1, 2, 3, 4, 5, 6, 7, 8};
trace_api::SpanId span_id(buf1);
constexpr uint8_t buf2[] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1};
trace_api::TraceId trace_id(buf2);
while (state.KeepRunning())
{
auto current_ctx = opentelemetry::context::RuntimeContext::GetCurrent();
auto outer_span_context = SpanContext(trace_id, span_id, trace_api::TraceFlags(), false);
auto outer_span =
nostd::shared_ptr<trace_api::Span>(new trace_api::DefaultSpan(outer_span_context));
trace_api::propagation::SetSpan(current_ctx, outer_span);
auto inner_child = tracer->StartSpan("inner");
auto scope = tracer->WithActiveSpan(inner_child);
{
auto innermost_child = tracer->StartSpan("innermost");
auto scope = tracer->WithActiveSpan(innermost_child);
innermost_child->End();
}
inner_child->End();
}
}
BENCHMARK(BM_SpanCreationWitContextPropagation);
} // namespace
BENCHMARK_MAIN();