simple_processor_test.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <chrono>
  5. #include <memory>
  6. #include <string>
  7. #include <utility>
  8. #include <vector>
  9. #include "opentelemetry/exporters/memory/in_memory_span_data.h"
  10. #include "opentelemetry/exporters/memory/in_memory_span_exporter.h"
  11. #include "opentelemetry/nostd/span.h"
  12. #include "opentelemetry/sdk/common/exporter_utils.h"
  13. #include "opentelemetry/sdk/trace/exporter.h"
  14. #include "opentelemetry/sdk/trace/recordable.h"
  15. #include "opentelemetry/sdk/trace/simple_processor.h"
  16. #include "opentelemetry/sdk/trace/span_data.h"
  17. #include "opentelemetry/trace/span_context.h"
  18. using namespace opentelemetry::sdk::trace;
  19. using namespace opentelemetry::sdk::common;
  20. using opentelemetry::exporter::memory::InMemorySpanData;
  21. using opentelemetry::exporter::memory::InMemorySpanExporter;
  22. using opentelemetry::trace::SpanContext;
  23. TEST(SimpleProcessor, ToInMemorySpanExporter)
  24. {
  25. InMemorySpanExporter *exporter = new InMemorySpanExporter();
  26. std::shared_ptr<InMemorySpanData> span_data = exporter->GetData();
  27. SimpleSpanProcessor processor(std::unique_ptr<SpanExporter>{exporter});
  28. auto recordable = processor.MakeRecordable();
  29. processor.OnStart(*recordable, SpanContext::GetInvalid());
  30. ASSERT_EQ(0, span_data->GetSpans().size());
  31. processor.OnEnd(std::move(recordable));
  32. ASSERT_EQ(1, span_data->GetSpans().size());
  33. EXPECT_TRUE(processor.Shutdown());
  34. }
  35. // An exporter that does nothing but record (and give back ) the # of times Shutdown was called.
  36. class RecordShutdownExporter final : public SpanExporter
  37. {
  38. public:
  39. RecordShutdownExporter(int *force_flush_counter, int *shutdown_counter)
  40. : force_flush_counter_(force_flush_counter), shutdown_counter_(shutdown_counter)
  41. {}
  42. std::unique_ptr<Recordable> MakeRecordable() noexcept override
  43. {
  44. return std::unique_ptr<Recordable>(new SpanData());
  45. }
  46. ExportResult Export(const opentelemetry::nostd::span<std::unique_ptr<Recordable>>
  47. & /* recordables */) noexcept override
  48. {
  49. return ExportResult::kSuccess;
  50. }
  51. bool ForceFlush(std::chrono::microseconds /* timeout */) noexcept override
  52. {
  53. *force_flush_counter_ += 1;
  54. return true;
  55. }
  56. bool Shutdown(std::chrono::microseconds /* timeout */) noexcept override
  57. {
  58. *shutdown_counter_ += 1;
  59. return true;
  60. }
  61. private:
  62. int *force_flush_counter_;
  63. int *shutdown_counter_;
  64. };
  65. TEST(SimpleSpanProcessor, ShutdownCalledOnce)
  66. {
  67. int force_flush = 0;
  68. int shutdowns = 0;
  69. RecordShutdownExporter *exporter = new RecordShutdownExporter(&force_flush, &shutdowns);
  70. SimpleSpanProcessor processor(std::unique_ptr<SpanExporter>{exporter});
  71. EXPECT_EQ(0, shutdowns);
  72. processor.Shutdown();
  73. EXPECT_EQ(1, shutdowns);
  74. processor.Shutdown();
  75. EXPECT_EQ(1, shutdowns);
  76. EXPECT_EQ(0, force_flush);
  77. }
  78. TEST(SimpleSpanProcessor, ForceFlush)
  79. {
  80. int force_flush = 0;
  81. int shutdowns = 0;
  82. RecordShutdownExporter *exporter = new RecordShutdownExporter(&force_flush, &shutdowns);
  83. SimpleSpanProcessor processor(std::unique_ptr<SpanExporter>{exporter});
  84. processor.ForceFlush();
  85. EXPECT_EQ(0, shutdowns);
  86. EXPECT_EQ(1, force_flush);
  87. processor.ForceFlush();
  88. EXPECT_EQ(2, force_flush);
  89. }
  90. // An exporter that does nothing but record (and give back ) the # of times Shutdown was called.
  91. class FailShutDownForceFlushExporter final : public SpanExporter
  92. {
  93. public:
  94. FailShutDownForceFlushExporter() {}
  95. std::unique_ptr<Recordable> MakeRecordable() noexcept override
  96. {
  97. return std::unique_ptr<Recordable>(new SpanData());
  98. }
  99. ExportResult Export(const opentelemetry::nostd::span<std::unique_ptr<Recordable>>
  100. & /* recordables */) noexcept override
  101. {
  102. return ExportResult::kSuccess;
  103. }
  104. bool ForceFlush(std::chrono::microseconds /* timeout */) noexcept override { return false; }
  105. bool Shutdown(std::chrono::microseconds /* timeout */) noexcept override { return false; }
  106. };
  107. TEST(SimpleSpanProcessor, ShutdownFail)
  108. {
  109. SimpleSpanProcessor processor(
  110. std::unique_ptr<SpanExporter>{new FailShutDownForceFlushExporter()});
  111. EXPECT_EQ(false, processor.Shutdown());
  112. }
  113. TEST(SimpleSpanProcessor, ForceFlushFail)
  114. {
  115. SimpleSpanProcessor processor(
  116. std::unique_ptr<SpanExporter>{new FailShutDownForceFlushExporter()});
  117. EXPECT_EQ(false, processor.ForceFlush());
  118. }