span_data_test.cc 5.7 KB

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