Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Supporting Logging API .Log() Overloads and GetName() method #422

Merged
merged 7 commits into from
Dec 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
457 changes: 446 additions & 11 deletions api/include/opentelemetry/logs/logger.h

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions api/include/opentelemetry/logs/noop.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ namespace logs
class NoopLogger final : public Logger
{
public:
const nostd::string_view GetName() noexcept override { return "noop logger"; }

void Log(Severity severity,
nostd::string_view name,
nostd::string_view body,
Expand Down
4 changes: 2 additions & 2 deletions api/test/logs/BUILD
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
load("//bazel:otel_cc_benchmark.bzl", "otel_cc_benchmark")

cc_test(
name = "logger_provider_test",
name = "provider_test",
srcs = [
"logger_provider_test.cc",
"provider_test.cc",
],
deps = [
"//api",
Expand Down
10 changes: 5 additions & 5 deletions api/test/logs/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
foreach(testname logger_provider_test logger_test)
add_executable(${testname} "${testname}.cc")
target_link_libraries(${testname} ${GTEST_BOTH_LIBRARIES}
foreach(testname provider_test logger_test)
add_executable(logs_api_${testname} "${testname}.cc")
target_link_libraries(logs_api_${testname} ${GTEST_BOTH_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT} opentelemetry_api)
gtest_add_tests(
TARGET ${testname}
TARGET logs_api_${testname}
TEST_PREFIX logs.
TEST_LIST ${testname})
TEST_LIST logs_api_${testname})
endforeach()
53 changes: 35 additions & 18 deletions api/test/logs/logger_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,40 +14,61 @@ using opentelemetry::nostd::shared_ptr;
using opentelemetry::nostd::span;
using opentelemetry::nostd::string_view;

// Check that the default logger is a noop logger instance
TEST(Logger, GetLoggerDefault)
{
auto lp = Provider::GetLoggerProvider();
auto logger = lp->GetLogger("TestLogger");
auto name = logger->GetName();
EXPECT_NE(nullptr, logger);
EXPECT_EQ(name, "noop logger");
}

TEST(Logger, GetNoopLoggerName)
{
auto lp = Provider::GetLoggerProvider();
auto logger = lp->GetLogger("TestLogger");
}

// Test the two additional overloads for GetLogger()
TEST(Logger, GetNoopLoggerNameWithArgs)
{
auto lp = Provider::GetLoggerProvider();

// GetLogger(name, list(args))
std::array<string_view, 1> sv{"string"};
span<string_view> args{sv};
auto logger = lp->GetLogger("NoopLoggerWithArgs", args);
// should probably also test that arguments were set properly too
// by adding a getArgs() method in NoopLogger
lp->GetLogger("NoopLoggerWithArgs", args);

// GetLogger(name, string options)
lp->GetLogger("NoopLoggerWithOptions", "options");
}

TEST(Logger, NoopLog)
// Test the Log() overloads
TEST(Logger, LogMethodOverloads)
{
auto lp = Provider::GetLoggerProvider();
auto logger = lp->GetLogger("TestLogger");
logger->Log("Noop log name");

// Create a map to test the logs with
std::map<std::string, std::string> m = {{"key1", "value1"}};

// Log overloads
logger->Log(Severity::kTrace, "Test log message");
logger->Log(Severity::kInfo, "Logging a message", "Test log message");
logger->Log(Severity::kDebug, m);
logger->Log(Severity::kWarn, "Logging a map", m);
logger->Log(Severity::kError, {{"key1", "value 1"}, {"key2", 2}});
logger->Log(Severity::kFatal, "Logging an initializer list", {{"key1", "value 1"}, {"key2", 2}});

// Severity methods
logger->Trace("Test log message");
logger->Debug("Logging a message", "Test log message");
logger->Info(m);
logger->Warn("Logging a map", m);
logger->Error({{"key1", "value 1"}, {"key2", 2}});
logger->Fatal("Logging an initializer list", {{"key1", "value 1"}, {"key2", 2}});
}

// Define a basic Logger class
class TestLogger : public Logger
{
const opentelemetry::nostd::string_view GetName() noexcept override { return "test logger"; }

void Log(Severity severity,
string_view name,
string_view body,
Expand Down Expand Up @@ -82,11 +103,7 @@ TEST(Logger, PushLoggerImplementation)

auto lp = Provider::GetLoggerProvider();

// GetLogger(name, options) function
// Check that the implementation was pushed by calling TestLogger's GetName()
auto logger = lp->GetLogger("TestLogger");

// GetLogger(name, args) function
std::array<string_view, 1> sv{"string"};
span<string_view> args{sv};
auto logger2 = lp->GetLogger("TestLogger2", args);
}
ASSERT_EQ("test logger", logger->GetName());
}
File renamed without changes.
2 changes: 1 addition & 1 deletion exporters/ostream/test/ostream_log_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ TEST(OStreamLogExporter, IntegrationTest)

// Write a log to ostream exporter
opentelemetry::core::SystemTimestamp now(std::chrono::system_clock::now());
logger->Log(opentelemetry::logs::Severity::kDebug, "Hello", now);
logger->Log(opentelemetry::logs::Severity::kDebug, "", "Hello", {}, {}, {}, {}, {}, now);

// Restore cout's original streambuf
std::cout.rdbuf(original);
Expand Down
6 changes: 6 additions & 0 deletions sdk/include/opentelemetry/sdk/logs/logger.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,17 @@ class Logger final : public opentelemetry::logs::Logger
public:
/**
* Initialize a new logger.
* @param name The name of this logger instance
* @param logger_provider The logger provider that owns this logger.
*/
explicit Logger(opentelemetry::nostd::string_view name,
std::shared_ptr<LoggerProvider> logger_provider) noexcept;

/**
* Returns the name of this logger.
*/
const opentelemetry::nostd::string_view GetName() noexcept override;

/**
* Writes a log record into the processor.
* @param severity the severity level of the log event.
Expand Down
5 changes: 5 additions & 0 deletions sdk/src/logs/logger.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ Logger::Logger(opentelemetry::nostd::string_view name,
: logger_name_(std::string(name)), logger_provider_(logger_provider)
{}

const opentelemetry::nostd::string_view Logger::GetName() noexcept
{
return logger_name_;
}

/**
* Create and populate recordable with the log event's fields passed in.
* The timestamp, severity, traceid, spanid, and traceflags, are injected
Expand Down
13 changes: 6 additions & 7 deletions sdk/test/logs/logger_sdk_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ TEST(LoggerSDK, LogToNullProcessor)
auto logger = lp->GetLogger("logger");

// Log a sample log record to a nullptr processor
logger->Log("Test log");
logger->Debug("Test log");
}

class MockProcessor final : public LogProcessor
Expand All @@ -56,11 +56,11 @@ class MockProcessor final : public LogProcessor
// Cast the recordable received into a concrete LogRecord type
auto copy = std::shared_ptr<LogRecord>(static_cast<LogRecord *>(record.release()));

// Copy over the received log record's name, body, timestamp fields over to the recordable
// Copy over the received log record's severity, name, and body fields over to the recordable
// passed in the constructor
record_received_->SetSeverity(copy->GetSeverity());
record_received_->SetName(copy->GetName());
record_received_->SetBody(copy->GetBody());
record_received_->SetTimestamp(copy->GetTimestamp());
}
bool ForceFlush(std::chrono::microseconds timeout = std::chrono::microseconds(0)) noexcept
{
Expand Down Expand Up @@ -92,10 +92,9 @@ TEST(LoggerSDK, LogToAProcessor)
ASSERT_EQ(processor, lp->GetProcessor());

// Check that the recordable created by the Log() statement is set properly
opentelemetry::core::SystemTimestamp now(std::chrono::system_clock::now());
logger->Log(opentelemetry::logs::Severity::kWarn, "Message", now);
logger->Log(opentelemetry::logs::Severity::kWarn, "Log Name", "Log Message");

ASSERT_EQ(shared_recordable->GetSeverity(), opentelemetry::logs::Severity::kWarn);
ASSERT_EQ(shared_recordable->GetBody(), "Message");
ASSERT_EQ(shared_recordable->GetTimestamp().time_since_epoch(), now.time_since_epoch());
ASSERT_EQ(shared_recordable->GetName(), "Log Name");
ASSERT_EQ(shared_recordable->GetBody(), "Log Message");
}