]>
Commit | Line | Data |
---|---|---|
1 | // Copyright The OpenTelemetry Authors | |
2 | // SPDX-License-Identifier: Apache-2.0 | |
3 | ||
4 | #ifdef ENABLE_LOGS_PREVIEW | |
5 | ||
6 | # include "opentelemetry/sdk/logs/log_record.h" | |
7 | # include "opentelemetry/sdk/logs/logger.h" | |
8 | ||
9 | # include <gtest/gtest.h> | |
10 | ||
11 | using namespace opentelemetry::sdk::logs; | |
12 | namespace logs_api = opentelemetry::logs; | |
13 | ||
14 | TEST(LoggerSDK, LogToNullProcessor) | |
15 | { | |
16 | // Confirm Logger::Log() does not have undefined behavior | |
17 | // even when there is no processor set | |
18 | // since it calls Processor::OnReceive() | |
19 | ||
20 | auto lp = std::shared_ptr<logs_api::LoggerProvider>(new LoggerProvider()); | |
21 | const std::string schema_url{"https://opentelemetry.io/schemas/1.11.0"}; | |
22 | auto logger = lp->GetLogger("logger", "", "opentelelemtry_library", "", schema_url); | |
23 | ||
24 | auto sdk_logger = static_cast<opentelemetry::sdk::logs::Logger *>(logger.get()); | |
25 | ASSERT_EQ(sdk_logger->GetInstrumentationLibrary().GetName(), "opentelelemtry_library"); | |
26 | ASSERT_EQ(sdk_logger->GetInstrumentationLibrary().GetVersion(), ""); | |
27 | ASSERT_EQ(sdk_logger->GetInstrumentationLibrary().GetSchemaURL(), schema_url); | |
28 | // Log a sample log record to a nullptr processor | |
29 | logger->Debug("Test log"); | |
30 | } | |
31 | ||
32 | class MockProcessor final : public LogProcessor | |
33 | { | |
34 | private: | |
35 | std::shared_ptr<LogRecord> record_received_; | |
36 | ||
37 | public: | |
38 | // A processor used for testing that keeps a track of the recordable it received | |
39 | explicit MockProcessor(std::shared_ptr<LogRecord> record_received) noexcept | |
40 | : record_received_(record_received) | |
41 | {} | |
42 | ||
43 | std::unique_ptr<Recordable> MakeRecordable() noexcept | |
44 | { | |
45 | return std::unique_ptr<Recordable>(new LogRecord); | |
46 | } | |
47 | // OnReceive stores the record it receives into the shared_ptr recordable passed into its | |
48 | // constructor | |
49 | void OnReceive(std::unique_ptr<Recordable> &&record) noexcept | |
50 | { | |
51 | // Cast the recordable received into a concrete LogRecord type | |
52 | auto copy = std::shared_ptr<LogRecord>(static_cast<LogRecord *>(record.release())); | |
53 | ||
54 | // Copy over the received log record's severity, name, and body fields over to the recordable | |
55 | // passed in the constructor | |
56 | record_received_->SetSeverity(copy->GetSeverity()); | |
57 | record_received_->SetBody(copy->GetBody()); | |
58 | } | |
59 | bool ForceFlush(std::chrono::microseconds timeout = std::chrono::microseconds(0)) noexcept | |
60 | { | |
61 | return true; | |
62 | } | |
63 | bool Shutdown(std::chrono::microseconds timeout = std::chrono::microseconds(0)) noexcept | |
64 | { | |
65 | return true; | |
66 | } | |
67 | }; | |
68 | ||
69 | TEST(LoggerSDK, LogToAProcessor) | |
70 | { | |
71 | // Create an API LoggerProvider and logger | |
72 | auto api_lp = std::shared_ptr<logs_api::LoggerProvider>(new LoggerProvider()); | |
73 | const std::string schema_url{"https://opentelemetry.io/schemas/1.11.0"}; | |
74 | auto logger = api_lp->GetLogger("logger", "", "opentelelemtry_library", "", schema_url); | |
75 | ||
76 | // Cast the API LoggerProvider to an SDK Logger Provider and assert that it is still the same | |
77 | // LoggerProvider by checking that getting a logger with the same name as the previously defined | |
78 | // logger is the same instance | |
79 | auto lp = static_cast<LoggerProvider *>(api_lp.get()); | |
80 | auto logger2 = lp->GetLogger("logger", "", "opentelelemtry_library", "", schema_url); | |
81 | ASSERT_EQ(logger, logger2); | |
82 | ||
83 | auto sdk_logger = static_cast<opentelemetry::sdk::logs::Logger *>(logger.get()); | |
84 | ASSERT_EQ(sdk_logger->GetInstrumentationLibrary().GetName(), "opentelelemtry_library"); | |
85 | ASSERT_EQ(sdk_logger->GetInstrumentationLibrary().GetVersion(), ""); | |
86 | ASSERT_EQ(sdk_logger->GetInstrumentationLibrary().GetSchemaURL(), schema_url); | |
87 | // Set a processor for the LoggerProvider | |
88 | auto shared_recordable = std::shared_ptr<LogRecord>(new LogRecord()); | |
89 | lp->AddProcessor(std::unique_ptr<LogProcessor>(new MockProcessor(shared_recordable))); | |
90 | ||
91 | // Check that the recordable created by the Log() statement is set properly | |
92 | logger->Log(logs_api::Severity::kWarn, "Log Message"); | |
93 | ||
94 | ASSERT_EQ(shared_recordable->GetSeverity(), logs_api::Severity::kWarn); | |
95 | ASSERT_EQ(shared_recordable->GetBody(), "Log Message"); | |
96 | } | |
97 | #endif |