1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
4 #include "opentelemetry/sdk/trace/span_data.h"
5 #include "opentelemetry/nostd/variant.h"
6 #include "opentelemetry/trace/span.h"
7 #include "opentelemetry/trace/span_id.h"
8 #include "opentelemetry/trace/trace_id.h"
10 #include <gtest/gtest.h>
12 using opentelemetry::sdk::trace::SpanData
;
13 namespace trace_api
= opentelemetry::trace
;
14 namespace common
= opentelemetry::common
;
15 namespace nostd
= opentelemetry::nostd
;
17 TEST(SpanData
, DefaultValues
)
19 trace_api::SpanContext empty_span_context
{false, false};
20 trace_api::SpanId zero_span_id
;
23 ASSERT_EQ(data
.GetTraceId(), empty_span_context
.trace_id());
24 ASSERT_EQ(data
.GetSpanId(), empty_span_context
.span_id());
25 ASSERT_EQ(data
.GetSpanContext(), empty_span_context
);
26 ASSERT_EQ(data
.GetParentSpanId(), zero_span_id
);
27 ASSERT_EQ(data
.GetName(), "");
28 ASSERT_EQ(data
.GetStatus(), trace_api::StatusCode::kUnset
);
29 ASSERT_EQ(data
.GetDescription(), "");
30 ASSERT_EQ(data
.GetStartTime().time_since_epoch(), std::chrono::nanoseconds(0));
31 ASSERT_EQ(data
.GetDuration(), std::chrono::nanoseconds(0));
32 ASSERT_EQ(data
.GetAttributes().size(), 0);
33 ASSERT_EQ(data
.GetEvents().size(), 0);
38 constexpr uint8_t trace_id_buf
[] = {1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8};
39 constexpr uint8_t span_id_buf
[] = {1, 2, 3, 4, 5, 6, 7, 8};
40 constexpr uint8_t parent_span_id_buf
[] = {8, 7, 6, 5, 4, 3, 2, 1};
41 trace_api::TraceId trace_id
{trace_id_buf
};
42 trace_api::SpanId span_id
{span_id_buf
};
43 trace_api::SpanId parent_span_id
{parent_span_id_buf
};
44 const auto trace_state
= trace_api::TraceState::GetDefault()->Set("key1", "value");
45 const trace_api::SpanContext span_context
{
46 trace_id
, span_id
, trace_api::TraceFlags
{trace_api::TraceFlags::kIsSampled
}, true,
48 common::SystemTimestamp
now(std::chrono::system_clock::now());
51 data
.SetIdentity(span_context
, parent_span_id
);
52 data
.SetName("span name");
53 data
.SetSpanKind(trace_api::SpanKind::kServer
);
54 data
.SetStatus(trace_api::StatusCode::kOk
, "description");
55 data
.SetStartTime(now
);
56 data
.SetDuration(std::chrono::nanoseconds(1000000));
57 data
.SetAttribute("attr1", (int64_t)314159);
58 data
.AddEvent("event1", now
);
60 ASSERT_EQ(data
.GetTraceId(), trace_id
);
61 ASSERT_EQ(data
.GetSpanId(), span_id
);
62 ASSERT_EQ(data
.GetSpanContext(), span_context
);
63 std::string trace_state_key1_value
;
64 ASSERT_EQ(data
.GetSpanContext().trace_state()->Get("key1", trace_state_key1_value
), true);
65 ASSERT_EQ(trace_state_key1_value
, "value");
66 ASSERT_EQ(data
.GetParentSpanId(), parent_span_id
);
67 ASSERT_EQ(data
.GetName(), "span name");
68 ASSERT_EQ(data
.GetSpanKind(), trace_api::SpanKind::kServer
);
69 ASSERT_EQ(data
.GetStatus(), trace_api::StatusCode::kOk
);
70 ASSERT_EQ(data
.GetDescription(), "description");
71 ASSERT_EQ(data
.GetStartTime().time_since_epoch(), now
.time_since_epoch());
72 ASSERT_EQ(data
.GetDuration(), std::chrono::nanoseconds(1000000));
73 ASSERT_EQ(nostd::get
<int64_t>(data
.GetAttributes().at("attr1")), 314159);
74 ASSERT_EQ(data
.GetEvents().at(0).GetName(), "event1");
75 ASSERT_EQ(data
.GetEvents().at(0).GetTimestamp(), now
);
78 TEST(SpanData
, EventAttributes
)
81 const int kNumAttributes
= 3;
82 std::string keys
[kNumAttributes
] = {"attr1", "attr2", "attr3"};
83 int64_t values
[kNumAttributes
] = {3, 5, 20};
84 std::map
<std::string
, int64_t> attributes
= {
85 {keys
[0], values
[0]}, {keys
[1], values
[1]}, {keys
[2], values
[2]}};
87 data
.AddEvent("Test Event", std::chrono::system_clock::now(),
88 common::KeyValueIterableView
<std::map
<std::string
, int64_t>>(attributes
));
90 for (int i
= 0; i
< kNumAttributes
; i
++)
92 EXPECT_EQ(nostd::get
<int64_t>(data
.GetEvents().at(0).GetAttributes().at(keys
[i
])), values
[i
]);
96 TEST(SpanData
, Resources
)
99 auto resource
= opentelemetry::sdk::resource::Resource::Create({});
100 auto input_attr
= resource
.GetAttributes();
101 data
.SetResource(resource
);
102 auto output_attr
= data
.GetResource().GetAttributes();
103 EXPECT_EQ(input_attr
, output_attr
);
106 TEST(SpanData
, Links
)
109 const int kNumAttributes
= 3;
110 std::string keys
[kNumAttributes
] = {"attr1", "attr2", "attr3"};
111 int64_t values
[kNumAttributes
] = {4, 12, 33};
112 std::map
<std::string
, int64_t> attributes
= {
113 {keys
[0], values
[0]}, {keys
[1], values
[1]}, {keys
[2], values
[2]}};
115 // produce valid SpanContext with pseudo span and trace Id.
116 uint8_t span_id_buf
[trace_api::SpanId::kSize
] = {
119 trace_api::SpanId span_id
{span_id_buf
};
120 uint8_t trace_id_buf
[trace_api::TraceId::kSize
] = {
123 trace_api::TraceId trace_id
{trace_id_buf
};
124 const auto span_context
= trace_api::SpanContext(
125 trace_id
, span_id
, trace_api::TraceFlags
{trace_api::TraceFlags::kIsSampled
}, true);
127 data
.AddLink(span_context
,
128 common::KeyValueIterableView
<std::map
<std::string
, int64_t>>(attributes
));
130 EXPECT_EQ(data
.GetLinks().at(0).GetSpanContext(), span_context
);
131 for (int i
= 0; i
< kNumAttributes
; i
++)
133 EXPECT_EQ(nostd::get
<int64_t>(data
.GetLinks().at(0).GetAttributes().at(keys
[i
])), values
[i
]);