Skip to content

Commit

Permalink
Introduce a real logging library (#290)
Browse files Browse the repository at this point in the history
### Issue
Follow on from #176
#160
#140

### Description
* Adds a real logging library [spdlog](https://github.com/gabime/spdlog)
to replace the homegrown logger.hpp
* Lazy initializes
* Supports logging to console (stderr) and/or disk
* Not integrated yet (does not yet replace logger.hpp) -- want feedback
from the team prior to replacing existing log statements

### List of the changes
* Introduces new logging API
* Adds tests and performance characterization code 

### Testing
* Unit tests

### API Changes
There are no public API changes in this PR.
  • Loading branch information
joelsmithTT authored Nov 28, 2024
1 parent 79df609 commit f3bd693
Show file tree
Hide file tree
Showing 9 changed files with 460 additions and 19 deletions.
37 changes: 21 additions & 16 deletions cmake/dependencies.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ function(fetch_dependencies)

include(${PROJECT_SOURCE_DIR}/cmake/CPM.cmake)

############################################################################################################################
####################################################################################################################
# google test
############################################################################################################################
####################################################################################################################
CPMAddPackage(
NAME googletest
GITHUB_REPOSITORY google/googletest
Expand All @@ -20,9 +20,9 @@ function(fetch_dependencies)
"INSTALL_GTEST OFF"
)

############################################################################################################################
####################################################################################################################
# yaml-cpp
############################################################################################################################
####################################################################################################################
CPMAddPackage(
NAME yaml-cpp
GITHUB_REPOSITORY jbeder/yaml-cpp
Expand All @@ -42,15 +42,15 @@ function(fetch_dependencies)
)
endif()

############################################################################################################################
###################################################################################################################
# boost::interprocess
############################################################################################################################
###################################################################################################################
include(${PROJECT_SOURCE_DIR}/cmake/fetch_boost.cmake)
fetch_boost_library(interprocess)

############################################################################################################################
###################################################################################################################
# Nanomsg
############################################################################################################################
###################################################################################################################
CPMAddPackage(
NAME nanomsg
GITHUB_REPOSITORY nanomsg/nng
Expand All @@ -61,9 +61,9 @@ function(fetch_dependencies)
"NNG_TOOLS OFF"
)

############################################################################################################################
###################################################################################################################
# Flatbuffers
############################################################################################################################
###################################################################################################################
CPMAddPackage(
NAME flatbuffers
GITHUB_REPOSITORY google/flatbuffers
Expand Down Expand Up @@ -94,22 +94,27 @@ function(fetch_dependencies)
set(FBS_GENERATED_HEADER ${FBS_GENERATED_HEADER} PARENT_SCOPE)
endfunction()

############################################################################################################################
###################################################################################################################
# libuv (for process management)
############################################################################################################################
###################################################################################################################
CPMAddPackage(NAME libuv GITHUB_REPOSITORY libuv/libuv GIT_TAG v1.48.0 OPTIONS "LIBUV_BUILD_TESTS OFF")

############################################################################################################################
###################################################################################################################
# fmt : https://github.com/fmtlib/fmt
############################################################################################################################
###################################################################################################################

CPMAddPackage(NAME fmt GITHUB_REPOSITORY fmtlib/fmt GIT_TAG 11.0.1)

############################################################################################################################
###################################################################################################################
# nanobench (for uBenchmarking)
############################################################################################################################
###################################################################################################################
if(MASTER_PROJECT)
CPMAddPackage(NAME nanobench GITHUB_REPOSITORY martinus/nanobench GIT_TAG v4.3.11)
endif()

####################################################################################################################
# spdlog
####################################################################################################################
CPMAddPackage(NAME spdlog GITHUB_REPOSITORY gabime/spdlog GIT_TAG v1.14.1 VERSION v1.14.1)
endfunction()
fetch_dependencies()
2 changes: 2 additions & 0 deletions common/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ target_sources(
backtrace.hpp
gtest_initializer.hpp # FIXME: this should be tucked away with the tests
logger.hpp
logger_.hpp # FIXME: replace old logger, see issue #315
logger_.cpp
)

target_include_directories(umd_common INTERFACE .)
49 changes: 49 additions & 0 deletions common/logger_.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* SPDX-FileCopyrightText: (c) 2024 Tenstorrent Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/

#include "logger_.hpp" // TODO: rename after logger.hpp is removed

#include <fmt/format.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/stdout_sinks.h>

#include <mutex>

namespace tt::umd::logger {

void initialize(const Options& options) {
static std::mutex mutex;
std::scoped_lock lock{mutex};

if (detail::is_initialized.load(std::memory_order_relaxed)) {
return;
}

std::vector<spdlog::sink_ptr> sinks;

if (options.log_to_stderr) {
auto stderr_sink = std::make_shared<spdlog::sinks::stderr_sink_mt>();
sinks.push_back(stderr_sink);
}

if (!options.filename.empty()) {
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(options.filename);
sinks.push_back(file_sink);
}

auto logger = std::make_shared<spdlog::logger>("UMD", sinks.begin(), sinks.end());
logger->set_level(options.log_level);
logger->set_pattern(options.pattern);

spdlog::set_default_logger(logger);
detail::is_initialized.store(true, std::memory_order_release);
}

namespace detail {
std::atomic_bool is_initialized = false;
}

} // namespace tt::umd::logger
90 changes: 90 additions & 0 deletions common/logger_.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/*
* SPDX-FileCopyrightText: (c) 2024 Tenstorrent Inc.
*
* SPDX-License-Identifier: Apache-2.0
*
*/

#pragma once

#include <atomic>

#define SPDLOG_FMT_EXTERNAL
#include <spdlog/spdlog.h>

namespace tt::umd::logger {

/**
* Parameters controlling the behavior of the logger.
*/
struct Options {
bool log_to_stderr{true};
std::string filename{};
std::string pattern{"[%Y-%m-%d %H:%M:%S.%e] [%l] [%s:%#] %v"};
spdlog::level::level_enum log_level{spdlog::level::debug};

// TODO: this can be augmented as needed (log rotation, flush policy...)
};

/**
* One-time initialization of the logger.
*
* If you don't call it, the logger will be initialized with default options the
* first time a message is logged.
*/
void initialize(const Options& options = Options{});

/**
* Macros for using the logger.
*/
#define UMD_TRACE(...) \
do { \
::tt::umd::logger::detail::ensure_initialized(); \
SPDLOG_TRACE(__VA_ARGS__); \
} while (0)

#define UMD_DEBUG(...) \
do { \
::tt::umd::logger::detail::ensure_initialized(); \
SPDLOG_DEBUG(__VA_ARGS__); \
} while (0)

#define UMD_INFO(...) \
do { \
::tt::umd::logger::detail::ensure_initialized(); \
SPDLOG_INFO(__VA_ARGS__); \
} while (0)

#define UMD_WARN(...) \
do { \
::tt::umd::logger::detail::ensure_initialized(); \
SPDLOG_WARN(__VA_ARGS__); \
} while (0)

#define UMD_ERROR(...) \
do { \
::tt::umd::logger::detail::ensure_initialized(); \
SPDLOG_ERROR(__VA_ARGS__); \
} while (0)

#define UMD_CRITICAL(...) \
do { \
::tt::umd::logger::detail::ensure_initialized(); \
SPDLOG_CRITICAL(__VA_ARGS__); \
} while (0)

/**
* This is not part of the API.
*/
namespace detail {
extern std::atomic_bool is_initialized;

inline void ensure_initialized() {
if (!is_initialized.load(std::memory_order_acquire)) {
initialize();
}
}

} // namespace detail

} // namespace tt::umd::logger
61 changes: 61 additions & 0 deletions common/timestamp.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* SPDX-FileCopyrightText: (c) 2024 Tenstorrent Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/

#pragma once

#include <fmt/format.h>

#include <chrono>
#include <string>

namespace tt::umd::util {

class Timestamp {
std::chrono::steady_clock::time_point start;

public:
Timestamp() : start(std::chrono::steady_clock::now()) {}

void reset() { start = std::chrono::steady_clock::now(); }

uint64_t nanoseconds() const {
auto now = std::chrono::steady_clock::now();
return std::chrono::duration_cast<std::chrono::nanoseconds>(now - start).count();
}

uint64_t microseconds() const {
auto now = std::chrono::steady_clock::now();
return std::chrono::duration_cast<std::chrono::microseconds>(now - start).count();
}

uint64_t milliseconds() const {
auto now = std::chrono::steady_clock::now();
return std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count();
}

uint64_t seconds() const {
auto now = std::chrono::steady_clock::now();
return std::chrono::duration_cast<std::chrono::seconds>(now - start).count();
}

std::string to_string() const {
auto ns = nanoseconds();
if (ns < 1000) {
return fmt::format("{} ns", ns);
}
auto us = microseconds();
if (us < 1000) {
return fmt::format("{} μs", us);
}
auto ms = milliseconds();
if (ms < 1000) {
return fmt::format("{} ms", ms);
}
return fmt::format("{} s", seconds());
}
};

} // namespace tt::umd::util
1 change: 1 addition & 0 deletions device/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ target_link_libraries(
hwloc
rt
Boost::interprocess
spdlog::spdlog_header_only
fmt::fmt-header-only
yaml-cpp::yaml-cpp
${CMAKE_CURRENT_SOURCE_DIR}/libs/${CMAKE_SYSTEM_PROCESSOR}/libcreate_ethernet_map.a
Expand Down
2 changes: 1 addition & 1 deletion tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ if(MASTER_PROJECT)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/microbenchmark)
endif()
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/api)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/pcie)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/misc)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/pcie)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/simulation)
if($ENV{ARCH_NAME} STREQUAL "wormhole_b0")
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/wormhole)
Expand Down
12 changes: 10 additions & 2 deletions tests/misc/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
set(UMD_MISC_TESTS_SRCS test_semver.cpp)
set(UMD_MISC_TESTS_SRCS
test_semver.cpp
test_logger.cpp
)

add_executable(umd_misc_tests ${UMD_MISC_TESTS_SRCS})
target_link_libraries(umd_misc_tests PRIVATE test_common)
target_link_libraries(
umd_misc_tests
PRIVATE
test_common
spdlog::spdlog_header_only
)
set_target_properties(
umd_misc_tests
PROPERTIES
Expand Down
Loading

0 comments on commit f3bd693

Please sign in to comment.