logger_test.cc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <map>
  5. #include <string>
  6. #include <utility>
  7. #include <vector>
  8. #include "opentelemetry/common/attribute_value.h"
  9. #include "opentelemetry/common/key_value_iterable.h"
  10. #include "opentelemetry/common/key_value_iterable_view.h"
  11. #include "opentelemetry/logs/event_id.h"
  12. #include "opentelemetry/logs/event_logger.h"
  13. #include "opentelemetry/logs/event_logger_provider.h"
  14. #include "opentelemetry/logs/log_record.h"
  15. #include "opentelemetry/logs/logger.h"
  16. #include "opentelemetry/logs/logger_provider.h"
  17. #include "opentelemetry/logs/provider.h"
  18. #include "opentelemetry/logs/severity.h"
  19. #include "opentelemetry/nostd/shared_ptr.h"
  20. #include "opentelemetry/nostd/span.h"
  21. #include "opentelemetry/nostd/string_view.h"
  22. #include "opentelemetry/nostd/unique_ptr.h"
  23. using opentelemetry::logs::EventId;
  24. using opentelemetry::logs::Logger;
  25. using opentelemetry::logs::LoggerProvider;
  26. using opentelemetry::logs::Provider;
  27. using opentelemetry::logs::Severity;
  28. using opentelemetry::nostd::shared_ptr;
  29. using opentelemetry::nostd::string_view;
  30. namespace common = opentelemetry::common;
  31. namespace nostd = opentelemetry::nostd;
  32. namespace trace = opentelemetry::trace;
  33. // Check that the default logger is a noop logger instance
  34. TEST(Logger, GetLoggerDefault)
  35. {
  36. auto lp = Provider::GetLoggerProvider();
  37. const std::string schema_url{"https://opentelemetry.io/schemas/1.11.0"};
  38. auto logger = lp->GetLogger("TestLogger", "opentelelemtry_library", "", schema_url);
  39. EXPECT_NE(nullptr, logger);
  40. auto name = logger->GetName();
  41. EXPECT_EQ(name, "noop logger");
  42. auto record = logger->CreateLogRecord();
  43. EXPECT_NE(nullptr, record);
  44. }
  45. // Test the two additional overloads for GetLogger()
  46. TEST(Logger, GetNoopLoggerNameWithArgs)
  47. {
  48. auto lp = Provider::GetLoggerProvider();
  49. const std::string schema_url{"https://opentelemetry.io/schemas/1.11.0"};
  50. lp->GetLogger("NoopLoggerWithArgs", "opentelelemtry_library", "", schema_url);
  51. lp->GetLogger("NoopLoggerWithOptions", "opentelelemtry_library", "", schema_url);
  52. }
  53. // Test the EmitLogRecord() overloads
  54. TEST(Logger, LogMethodOverloads)
  55. {
  56. auto lp = Provider::GetLoggerProvider();
  57. const std::string schema_url{"https://opentelemetry.io/schemas/1.11.0"};
  58. auto logger = lp->GetLogger("TestLogger", "opentelelemtry_library", "", schema_url);
  59. EventId trace_event_id{0x1, "TraceEventId"};
  60. EventId debug_event_id{0x2, "DebugEventId"};
  61. EventId info_event_id{0x3, "InfoEventId"};
  62. EventId warn_event_id{0x4, "WarnEventId"};
  63. EventId error_event_id{0x5, "ErrorEventId"};
  64. EventId fatal_event_id{0x6, "FatalEventId"};
  65. // Create a map to test the logs with
  66. std::map<std::string, std::string> m = {{"key1", "value1"}};
  67. // EmitLogRecord overloads
  68. logger->EmitLogRecord(Severity::kTrace, "Test log message");
  69. logger->EmitLogRecord(Severity::kInfo, "Test log message");
  70. logger->EmitLogRecord(Severity::kDebug, m);
  71. logger->EmitLogRecord(Severity::kWarn, "Logging a map", m);
  72. logger->EmitLogRecord(Severity::kError,
  73. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  74. logger->EmitLogRecord(Severity::kFatal, "Logging an initializer list",
  75. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  76. logger->EmitLogRecord(Severity::kDebug, opentelemetry::common::MakeAttributes(m));
  77. logger->EmitLogRecord(Severity::kDebug,
  78. common::KeyValueIterableView<std::map<std::string, std::string>>(m));
  79. std::pair<nostd::string_view, common::AttributeValue> array[] = {{"key1", "value1"}};
  80. logger->EmitLogRecord(Severity::kDebug, opentelemetry::common::MakeAttributes(array));
  81. std::vector<std::pair<std::string, std::string>> vec = {{"key1", "value1"}};
  82. logger->EmitLogRecord(Severity::kDebug, opentelemetry::common::MakeAttributes(vec));
  83. // Severity methods
  84. logger->Trace("Test log message");
  85. logger->Trace("Test log message", m);
  86. logger->Trace("Test log message",
  87. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  88. logger->Trace(m);
  89. logger->Trace(opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  90. logger->Trace(trace_event_id, "Test log message",
  91. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  92. logger->Trace(trace_event_id.id_, "Test log message",
  93. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  94. logger->Debug("Test log message");
  95. logger->Debug("Test log message", m);
  96. logger->Debug("Test log message",
  97. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  98. logger->Debug(m);
  99. logger->Debug(opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  100. logger->Debug(debug_event_id, "Test log message",
  101. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  102. logger->Debug(debug_event_id.id_, "Test log message",
  103. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  104. logger->Info("Test log message");
  105. logger->Info("Test log message", m);
  106. logger->Info("Test log message",
  107. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  108. logger->Info(m);
  109. logger->Info(opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  110. logger->Info(info_event_id, "Test log message",
  111. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  112. logger->Info(info_event_id.id_, "Test log message",
  113. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  114. logger->Warn("Test log message");
  115. logger->Warn("Test log message", m);
  116. logger->Warn("Test log message",
  117. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  118. logger->Warn(m);
  119. logger->Warn(opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  120. logger->Warn(warn_event_id, "Test log message",
  121. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  122. logger->Warn(warn_event_id.id_, "Test log message",
  123. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  124. logger->Error("Test log message");
  125. logger->Error("Test log message", m);
  126. logger->Error("Test log message",
  127. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  128. logger->Error(m);
  129. logger->Error(opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  130. logger->Error(error_event_id, "Test log message",
  131. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  132. logger->Error(error_event_id.id_, "Test log message",
  133. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  134. logger->Fatal("Test log message");
  135. logger->Fatal("Test log message", m);
  136. logger->Fatal("Test log message",
  137. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  138. logger->Fatal(m);
  139. logger->Fatal(opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  140. logger->Fatal(fatal_event_id, "Test log message",
  141. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  142. logger->Fatal(fatal_event_id.id_, "Test log message",
  143. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  144. }
  145. #if OPENTELEMETRY_ABI_VERSION_NO < 2
  146. TEST(Logger, EventLogMethodOverloads)
  147. {
  148. auto lp = Provider::GetLoggerProvider();
  149. const std::string schema_url{"https://opentelemetry.io/schemas/1.11.0"};
  150. auto logger = lp->GetLogger("TestLogger", "opentelelemtry_library", "", schema_url);
  151. auto elp = Provider::GetEventLoggerProvider();
  152. auto event_logger = elp->CreateEventLogger(logger, "otel-cpp.test");
  153. std::map<std::string, std::string> m = {{"key1", "value1"}};
  154. event_logger->EmitEvent("event name", Severity::kTrace, "Test log message");
  155. event_logger->EmitEvent("event name", Severity::kInfo, "Test log message");
  156. event_logger->EmitEvent("event name", Severity::kDebug, m);
  157. event_logger->EmitEvent("event name", Severity::kWarn, "Logging a map", m);
  158. event_logger->EmitEvent(
  159. "event name", Severity::kError,
  160. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  161. event_logger->EmitEvent(
  162. "event name", Severity::kFatal, "Logging an initializer list",
  163. opentelemetry::common::MakeAttributes({{"key1", "value 1"}, {"key2", 2}}));
  164. event_logger->EmitEvent("event name", Severity::kDebug, opentelemetry::common::MakeAttributes(m));
  165. event_logger->EmitEvent("event name", Severity::kDebug,
  166. common::KeyValueIterableView<std::map<std::string, std::string>>(m));
  167. std::pair<nostd::string_view, common::AttributeValue> array[] = {{"key1", "value1"}};
  168. event_logger->EmitEvent("event name", Severity::kDebug,
  169. opentelemetry::common::MakeAttributes(array));
  170. std::vector<std::pair<std::string, std::string>> vec = {{"key1", "value1"}};
  171. event_logger->EmitEvent("event name", Severity::kDebug,
  172. opentelemetry::common::MakeAttributes(vec));
  173. }
  174. #endif
  175. // Define a basic Logger class
  176. class TestLogger : public Logger
  177. {
  178. const nostd::string_view GetName() noexcept override { return "test logger"; }
  179. nostd::unique_ptr<opentelemetry::logs::LogRecord> CreateLogRecord() noexcept override
  180. {
  181. return nullptr;
  182. }
  183. using Logger::EmitLogRecord;
  184. void EmitLogRecord(nostd::unique_ptr<opentelemetry::logs::LogRecord> &&) noexcept override {}
  185. };
  186. // Define a basic LoggerProvider class that returns an instance of the logger class defined above
  187. class TestProvider : public LoggerProvider
  188. {
  189. nostd::shared_ptr<Logger> GetLogger(nostd::string_view /* logger_name */,
  190. nostd::string_view /* library_name */,
  191. nostd::string_view /* library_version */,
  192. nostd::string_view /* schema_url */,
  193. const common::KeyValueIterable & /* attributes */) override
  194. {
  195. return nostd::shared_ptr<Logger>(new TestLogger());
  196. }
  197. };
  198. TEST(Logger, PushLoggerImplementation)
  199. {
  200. // Push the new loggerprovider class into the global singleton
  201. auto test_provider = shared_ptr<LoggerProvider>(new TestProvider());
  202. Provider::SetLoggerProvider(test_provider);
  203. auto lp = Provider::GetLoggerProvider();
  204. // Check that the implementation was pushed by calling TestLogger's GetName()
  205. nostd::string_view schema_url{"https://opentelemetry.io/schemas/1.11.0"};
  206. auto logger = lp->GetLogger("TestLogger", "opentelelemtry_library", "", schema_url);
  207. ASSERT_EQ("test logger", logger->GetName());
  208. }