diff --git a/exporters/elasticsearch/src/es_log_exporter.cc b/exporters/elasticsearch/src/es_log_exporter.cc index c7201db907..777bfb9426 100644 --- a/exporters/elasticsearch/src/es_log_exporter.cc +++ b/exporters/elasticsearch/src/es_log_exporter.cc @@ -3,8 +3,11 @@ #ifdef ENABLE_LOGS_PREVIEW +# include // std::stringstream + # include "opentelemetry/exporters/elasticsearch/es_log_exporter.h" # include "opentelemetry/exporters/elasticsearch/es_log_recordable.h" +# include "opentelemetry/sdk_config.h" namespace nostd = opentelemetry::nostd; namespace sdklogs = opentelemetry::sdk::logs; @@ -74,23 +77,19 @@ class ResponseHandler : public http_client::EventHandler switch (state) { case http_client::SessionState::ConnectFailed: - if (console_debug_) - std::cout << "Connection to elasticsearch failed\n"; + OTEL_INTERNAL_LOG_ERROR("[ES Trace Exporter] Connection to elasticsearch failed"); cv_.notify_all(); break; case http_client::SessionState::SendFailed: - if (console_debug_) - std::cout << "Request failed to be sent to elasticsearch\n"; + OTEL_INTERNAL_LOG_ERROR("[ES Trace Exporter] Request failed to be sent to elasticsearch"); cv_.notify_all(); break; case http_client::SessionState::TimedOut: - if (console_debug_) - std::cout << "Request to elasticsearch timed out\n"; + OTEL_INTERNAL_LOG_ERROR("[ES Trace Exporter] Request to elasticsearch timed out"); cv_.notify_all(); break; case http_client::SessionState::NetworkError: - if (console_debug_) - std::cout << "Network error to elasticsearch\n"; + OTEL_INTERNAL_LOG_ERROR("[ES Trace Exporter] Network error to elasticsearch"); cv_.notify_all(); break; } @@ -131,11 +130,8 @@ sdk::common::ExportResult ElasticsearchLogExporter::Export( // Return failure if this exporter has been shutdown if (is_shutdown_) { - if (options_.console_debug_) - { - std::cout << "Export failed, exporter is shutdown" << std::endl; - } + OTEL_INTERNAL_LOG_ERROR("[ES Trace Exporter] Export failed, exporter is shutdown"); return sdk::common::ExportResult::kFailure; } @@ -172,8 +168,9 @@ sdk::common::ExportResult ElasticsearchLogExporter::Export( // Wait for the response to be received if (options_.console_debug_) { - std::cout << "waiting for response from Elasticsearch (timeout = " << options_.response_timeout_ - << " seconds)" << std::endl; + OTEL_INTERNAL_LOG_DEBUG( + "[ES Trace Exporter] waiting for response from Elasticsearch (timeout = " + << options_.response_timeout_ << " seconds)"); } bool write_successful = handler->waitForResponse(); @@ -191,12 +188,9 @@ sdk::common::ExportResult ElasticsearchLogExporter::Export( std::string responseBody = handler->GetResponseBody(); if (responseBody.find("\"failed\" : 0") == std::string::npos) { - if (options_.console_debug_) - { - std::cout << "Logs were not written to Elasticsearch correctly, response body:" << std::endl; - std::cout << responseBody << std::endl; - } - + OTEL_INTERNAL_LOG_ERROR( + "[ES Trace Exporter] Logs were not written to Elasticsearch correctly, response body: " + << responseBody); // TODO: Retry logic return sdk::common::ExportResult::kFailure; } diff --git a/exporters/jaeger/src/TUDPTransport.cc b/exporters/jaeger/src/TUDPTransport.cc index 123ba66d96..c72881df91 100644 --- a/exporters/jaeger/src/TUDPTransport.cc +++ b/exporters/jaeger/src/TUDPTransport.cc @@ -1,7 +1,10 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include // std::stringstream + #include "TUDPTransport.h" +#include "opentelemetry/sdk_config.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace exporter @@ -51,7 +54,7 @@ void TUDPTransport::open() if (error) { - // TODO: log error + OTEL_INTERNAL_LOG_ERROR("Jaeger Exporter: getaddrinfo failed with error: " << error); return; } diff --git a/exporters/jaeger/src/udp_transport.cc b/exporters/jaeger/src/udp_transport.cc index 1470a4260f..6ae41e7b9a 100644 --- a/exporters/jaeger/src/udp_transport.cc +++ b/exporters/jaeger/src/udp_transport.cc @@ -1,6 +1,9 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include // std::stringstream + +#include "opentelemetry/sdk_config.h" #include "udp_transport.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -36,7 +39,7 @@ void UDPTransport::InitSocket() int err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { - // TODO: handle error + OTEL_INTERNAL_LOG_ERROR("Jaeger Exporter: WSAStartup failed with error: " << error); return; } diff --git a/exporters/otlp/src/otlp_grpc_exporter.cc b/exporters/otlp/src/otlp_grpc_exporter.cc index 42c0b5d300..2d522ca3cd 100644 --- a/exporters/otlp/src/otlp_grpc_exporter.cc +++ b/exporters/otlp/src/otlp_grpc_exporter.cc @@ -3,10 +3,11 @@ #include "opentelemetry/exporters/otlp/otlp_grpc_exporter.h" #include "opentelemetry/exporters/otlp/otlp_recordable.h" +#include "opentelemetry/sdk_config.h" #include #include -#include +#include // std::stringstream OPENTELEMETRY_BEGIN_NAMESPACE namespace exporter @@ -112,7 +113,8 @@ sdk::common::ExportResult OtlpGrpcExporter::Export( if (!status.ok()) { - std::cerr << "[OTLP Exporter] Export() failed: " << status.error_message() << "\n"; + + OTEL_INTERNAL_LOG_ERROR("[OTLP Exporter] Export() failed: " << status.error_message()); return sdk::common::ExportResult::kFailure; } return sdk::common::ExportResult::kSuccess; diff --git a/exporters/otlp/src/otlp_http_exporter.cc b/exporters/otlp/src/otlp_http_exporter.cc index dec5268165..80cbfa40c7 100644 --- a/exporters/otlp/src/otlp_http_exporter.cc +++ b/exporters/otlp/src/otlp_http_exporter.cc @@ -16,11 +16,12 @@ #include "opentelemetry/proto/collector/trace/v1/trace_service.pb.h" #include "opentelemetry/exporters/otlp/protobuf_include_suffix.h" +#include "opentelemetry/sdk_config.h" #include #include -#include #include +#include #include #include @@ -66,14 +67,15 @@ class ResponseHandler : public http_client::EventHandler if (console_debug_) { - std::cout << "[OTLP HTTP Exporter] Status:" << response.GetStatusCode() << std::endl - << "Header:" << std::endl; - response.ForEachHeader([](opentelemetry::nostd::string_view header_name, - opentelemetry::nostd::string_view header_value) { - std::cout << "\t" << header_name.data() << " : " << header_value.data() << std::endl; + std::stringstream ss; + ss << "[OTLP HTTP Exporter] Status:" << response.GetStatusCode() << "Header:"; + response.ForEachHeader([&ss](opentelemetry::nostd::string_view header_name, + opentelemetry::nostd::string_view header_value) { + ss << "\t" << header_name.data() << " : " << header_value.data() << ","; return true; }); - std::cout << "Body:" << std::endl << body_ << std::endl; + ss << "Body:" << body_; + OTEL_INTERNAL_LOG_DEBUG(ss.str()); } // Set the response_received_ flag to true and notify any threads waiting on this result @@ -82,7 +84,7 @@ class ResponseHandler : public http_client::EventHandler cv_.notify_all(); } - /** + /**resource * A method the user calls to block their thread until the response is received. The longest * duration is the timeout of the request, set by SetTimeoutMs() */ @@ -111,114 +113,94 @@ class ResponseHandler : public http_client::EventHandler switch (state) { case http_client::SessionState::CreateFailed: - if (console_debug_) - { - std::cerr << "[OTLP HTTP Exporter] Session state: session create failed" << std::endl; - } + OTEL_INTERNAL_LOG_ERROR("[OTLP HTTP Exporter] Session state: session create failed"); cv_.notify_all(); break; case http_client::SessionState::Created: if (console_debug_) { - std::cerr << "[OTLP HTTP Exporter] Session state: session created" << std::endl; + OTEL_INTERNAL_LOG_DEBUG("[OTLP HTTP Exporter] Session state: session created"); } break; case http_client::SessionState::Destroyed: if (console_debug_) { - std::cerr << "[OTLP HTTP Exporter] Session state: session destroyed" << std::endl; + OTEL_INTERNAL_LOG_DEBUG("[OTLP HTTP Exporter] Session state: session destroyed"); } break; case http_client::SessionState::Connecting: if (console_debug_) { - std::cerr << "[OTLP HTTP Exporter] Session state: connecting to peer" << std::endl; + OTEL_INTERNAL_LOG_DEBUG("[OTLP HTTP Exporter] Session state: connecting to peer"); } break; case http_client::SessionState::ConnectFailed: - if (console_debug_) - { - std::cerr << "[OTLP HTTP Exporter] Session state: connection failed" << std::endl; - } + OTEL_INTERNAL_LOG_ERROR("[OTLP HTTP Exporter] Session state: connection failed"); cv_.notify_all(); break; case http_client::SessionState::Connected: if (console_debug_) { - std::cerr << "[OTLP HTTP Exporter] Session state: connected" << std::endl; + OTEL_INTERNAL_LOG_DEBUG("[OTLP HTTP Exporter] Session state: connected"); } break; case http_client::SessionState::Sending: if (console_debug_) { - std::cerr << "[OTLP HTTP Exporter] Session state: sending request" << std::endl; + OTEL_INTERNAL_LOG_DEBUG("[OTLP HTTP Exporter] Session state: sending request"); } break; case http_client::SessionState::SendFailed: - if (console_debug_) - { - std::cerr << "[OTLP HTTP Exporter] Session state: request send failed" << std::endl; - } + OTEL_INTERNAL_LOG_ERROR("[OTLP HTTP Exporter] Session state: request send failed"); cv_.notify_all(); break; case http_client::SessionState::Response: if (console_debug_) { - std::cerr << "[OTLP HTTP Exporter] Session state: response received" << std::endl; + OTEL_INTERNAL_LOG_DEBUG("[OTLP HTTP Exporter] Session state: response received"); } break; case http_client::SessionState::SSLHandshakeFailed: - if (console_debug_) - { - std::cerr << "[OTLP HTTP Exporter] Session state: SSL handshake failed" << std::endl; - } + OTEL_INTERNAL_LOG_ERROR("[OTLP HTTP Exporter] Session state: SSL handshake failed"); cv_.notify_all(); break; case http_client::SessionState::TimedOut: - if (console_debug_) - { - std::cerr << "[OTLP HTTP Exporter] Session state: request time out" << std::endl; - } + OTEL_INTERNAL_LOG_ERROR("[OTLP HTTP Exporter] Session state: request time out"); cv_.notify_all(); break; case http_client::SessionState::NetworkError: - if (console_debug_) - { - std::cerr << "[OTLP HTTP Exporter] Session state: network error" << std::endl; - } + OTEL_INTERNAL_LOG_ERROR("[OTLP HTTP Exporter] Session state: network error"); cv_.notify_all(); break; case http_client::SessionState::ReadError: if (console_debug_) { - std::cerr << "[OTLP HTTP Exporter] Session state: error reading response" << std::endl; + OTEL_INTERNAL_LOG_DEBUG("[OTLP HTTP Exporter] Session state: error reading response"); } break; case http_client::SessionState::WriteError: if (console_debug_) { - std::cerr << "[OTLP HTTP Exporter] Session state: error writing request" << std::endl; + OTEL_INTERNAL_LOG_DEBUG( + "[OTLP HTTP Exporter] DEBUG:Session state: error writing request"); } break; case http_client::SessionState::Cancelled: - if (console_debug_) - { - std::cerr << "[OTLP HTTP Exporter] Session state: (manually) cancelled" << std::endl; - } + OTEL_INTERNAL_LOG_ERROR("[OTLP HTTP Exporter] Session state: (manually) cancelled\n"); cv_.notify_all(); break; @@ -612,16 +594,16 @@ sdk::common::ExportResult OtlpHttpExporter::Export( { if (options_.console_debug) { - std::cout << "[OTLP HTTP Exporter] Request body(Binary):\n" - << service_request.Utf8DebugString() << std::endl; + OTEL_INTERNAL_LOG_DEBUG( + "[OTLP HTTP Exporter] Request body(Binary): " << service_request.Utf8DebugString()); } } else { if (options_.console_debug) { - std::cout << "[OTLP HTTP Exporter] Serialize body failed(Binary):" - << service_request.InitializationErrorString() << std::endl; + OTEL_INTERNAL_LOG_DEBUG("[OTLP HTTP Exporter] Serialize body failed(Binary):" + << service_request.InitializationErrorString()); } return sdk::common::ExportResult::kFailure; } @@ -638,7 +620,7 @@ sdk::common::ExportResult OtlpHttpExporter::Export( json_request.dump(-1, ' ', false, nlohmann::detail::error_handler_t::replace); if (options_.console_debug) { - std::cout << "[OTLP HTTP Exporter] Request body(Json):\n" << post_body_json << std::endl; + OTEL_INTERNAL_LOG_DEBUG("[OTLP HTTP Exporter] Request body(Json)" << post_body_json); } body_vec.assign(post_body_json.begin(), post_body_json.end()); content_type = kHttpJsonContentType; @@ -660,8 +642,9 @@ sdk::common::ExportResult OtlpHttpExporter::Export( // Wait for the response to be received if (options_.console_debug) { - std::cout << "[OTLP HTTP Exporter] Waiting for response from " << options_.url - << " (timeout = " << options_.timeout.count() << " milliseconds)" << std::endl; + OTEL_INTERNAL_LOG_DEBUG("[OTLP HTTP Exporter] DEBUG: Waiting for response from " + << options_.url << " (timeout = " << options_.timeout.count() + << " milliseconds)"); } bool write_successful = handler->waitForResponse(); diff --git a/exporters/zipkin/src/zipkin_exporter.cc b/exporters/zipkin/src/zipkin_exporter.cc index 199a908b86..f09487becb 100644 --- a/exporters/zipkin/src/zipkin_exporter.cc +++ b/exporters/zipkin/src/zipkin_exporter.cc @@ -5,6 +5,7 @@ #include "opentelemetry/exporters/zipkin/recordable.h" #include "opentelemetry/ext/http/client/http_client_factory.h" #include "opentelemetry/ext/http/common/url_parser.h" +#include "opentelemetry/sdk_config.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace exporter @@ -71,7 +72,7 @@ sdk::common::ExportResult ZipkinExporter::Export( { if (result.GetSessionState() == http_client::SessionState::ConnectFailed) { - // TODO -> Handle error / retries + OTEL_INTERNAL_LOG_ERROR("ZIPKIN EXPORTER] Zipkin Exporter: Connection failed"); } return sdk::common::ExportResult::kFailure; } diff --git a/ext/include/opentelemetry/ext/http/client/http_client.h b/ext/include/opentelemetry/ext/http/client/http_client.h index 4e3e9845e0..308335e492 100644 --- a/ext/include/opentelemetry/ext/http/client/http_client.h +++ b/ext/include/opentelemetry/ext/http/client/http_client.h @@ -183,8 +183,8 @@ class Result { if (response_ == nullptr) { - static NoopResponse res; - return res; + // let's not return nullptr + response_.reset(new NoopResponse()); } return *response_; } diff --git a/sdk/include/opentelemetry/sdk/common/global_log_handler.h b/sdk/include/opentelemetry/sdk/common/global_log_handler.h new file mode 100644 index 0000000000..f967111e3a --- /dev/null +++ b/sdk/include/opentelemetry/sdk/common/global_log_handler.h @@ -0,0 +1,209 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include +#include + +#include "opentelemetry/nostd/shared_ptr.h" +#include "opentelemetry/sdk/common/attribute_utils.h" +#include "opentelemetry/version.h" + +#define OTEL_INTERNAL_LOG_LEVEL_ERROR 0 +#define OTEL_INTERNAL_LOG_LEVEL_WARN 1 +#define OTEL_INTERNAL_LOG_LEVEL_INFO 2 +#define OTEL_INTERNAL_LOG_LEVEL_DEBUG 3 // to be disabled in release + +#ifndef OTEL_INTERNAL_LOG_LEVEL +# define OTEL_INTERNAL_LOG_LEVEL OTEL_INTERNAL_LOG_LEVEL_WARN // ERROR and WARN +#endif + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace common +{ +namespace internal_log +{ + +enum class LogLevel +{ + Error = 0, + Warning, + Info, + Debug +}; + +inline std::string LevelToString(LogLevel level) +{ + switch (level) + { + case LogLevel::Error: + return "Error"; + case LogLevel::Warning: + return "Warning"; + case LogLevel::Info: + return "Info"; + case LogLevel::Debug: + return "Debug"; + } + return {}; +} + +class LogHandler +{ +public: + virtual void Handle(LogLevel level, + const char *file, + int line, + const char *msg, + const sdk::common::AttributeMap &attributes) noexcept = 0; +}; + +class DefaultLogHandler : public LogHandler +{ +public: + void Handle(LogLevel level, + const char *file, + int line, + const char *msg, + const sdk::common::AttributeMap &attributes) noexcept override + { + std::stringstream output_s; + output_s << "[" << LevelToString(level) << "] "; + if (file != nullptr) + { + output_s << "File: " << file << ":" << line; + } + if (msg != nullptr) + { + output_s << msg; + } + output_s << std::endl; + // TBD - print attributes + std::cout << output_s.str(); // thread safe. + } +}; + +class NoopLogHandler : public LogHandler +{ +public: + void Handle(LogLevel level, + const char *file, + int line, + const char *msg, + const sdk::common::AttributeMap &error_attributes) noexcept override + { + // ignore the log message + } +}; + +/** + * Stores the singleton global LogHandler. + */ +class GlobalLogHandler +{ +public: + /** + * Returns the singleton LogHandler. + * + * By default, a default LogHandler is returned. This will never return a + * nullptr LogHandler. + */ + static nostd::shared_ptr GetLogHandler() noexcept + { + return nostd::shared_ptr(GetHandler()); + } + + /** + * Changes the singleton LogHandler. + * This should be called once at the start of application before creating TracerProvider + * instance. + */ + static void SetLogHandler(nostd::shared_ptr eh) noexcept { GetHandler() = eh; } + +private: + static nostd::shared_ptr &GetHandler() noexcept + { + static nostd::shared_ptr handler(new DefaultLogHandler); + return handler; + } +}; + +} // namespace internal_log +} // namespace common +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE + +#define OTEL_INTERNAL_LOG_DISPATCH(level, message, attributes) \ + do \ + { \ + using namespace opentelemetry::sdk::common::internal_log; \ + std::stringstream tmp_stream; \ + tmp_stream << message; \ + GlobalLogHandler::GetLogHandler()->Handle(level, __FILE__, __LINE__, tmp_stream.str().c_str(), \ + attributes); \ + } while (0) + +#define OTEL_INTERNAL_LOG_GET_3RD_ARG(arg1, arg2, arg3, ...) arg3 + +#if OTEL_INTERNAL_LOG_LEVEL >= OTEL_INTERNAL_LOG_LEVEL_ERROR +# define OTEL_INTERNAL_LOG_ERROR_1_ARGS(message) \ + OTEL_INTERNAL_LOG_DISPATCH(opentelemetry::sdk::common::internal_log::LogLevel::Error, message, \ + {}) +# define OTEL_INTERNAL_LOG_ERROR_2_ARGS(message, attributes) \ + OTEL_INTERNAL_LOG_DISPATCH(opentelemetry::sdk::common::internal_log::LogLevel::Error, message, \ + attributes) +# define OTEL_INTERNAL_LOG_ERROR_MACRO(...) \ + OTEL_INTERNAL_LOG_GET_3RD_ARG(__VA_ARGS__, OTEL_INTERNAL_LOG_ERROR_2_ARGS, \ + OTEL_INTERNAL_LOG_ERROR_1_ARGS) +# define OTEL_INTERNAL_LOG_ERROR(...) OTEL_INTERNAL_LOG_ERROR_MACRO(__VA_ARGS__)(__VA_ARGS__) +#else +# define OTEL_INTERNAL_LOG_ERROR(...) +#endif + +#if OTEL_INTERNAL_LOG_LEVEL >= OTEL_INTERNAL_LOG_LEVEL_WARN +# define OTEL_INTERNAL_LOG_WARN_1_ARGS(message) \ + OTEL_INTERNAL_LOG_DISPATCH(opentelemetry::sdk::common::internal_log::LogLevel::Warn, message, \ + {}) +# define OTEL_INTERNAL_LOG_WARN_2_ARGS(message, attributes) \ + OTEL_INTERNAL_LOG_DISPATCH(opentelemetry::sdk::common::internal_log::LogLevel::Warn, message, \ + attributes) +# define OTEL_INTERNAL_LOG_WARN_MACRO(...) \ + OTEL_INTERNAL_LOG_GET_3RD_ARG(__VA_ARGS__, OTEL_INTERNAL_LOG_WARN_2_ARGS, \ + OTEL_INTERNAL_LOG_WARN_1_ARGS) +# define OTEL_INTERNAL_LOG_WARN(...) OTEL_INTERNAL_LOG_WARN_MACRO(__VA_ARGS__)(__VA_ARGS__) +#else +# define OTEL_INTERNAL_LOG_ERROR(...) +#endif + +#if OTEL_INTERNAL_LOG_LEVEL >= OTEL_INTERNAL_LOG_LEVEL_DEBUG +# define OTEL_INTERNAL_LOG_DEBUG_1_ARGS(message) \ + OTEL_INTERNAL_LOG_DISPATCH(opentelemetry::sdk::common::internal_log::LogLevel::Debug, message, \ + {}) +# define OTEL_INTERNAL_LOG_DEBUG_2_ARGS(message, attributes) \ + OTEL_INTERNAL_LOG_DISPATCH(opentelemetry::sdk::common::internal_logg::LogLevel::Debug, \ + message, attributes) +# define OTEL_INTERNAL_LOG_DEBUG_MACRO(...) \ + OTEL_INTERNAL_LOG_GET_3RD_ARG(__VA_ARGS__, OTEL_INTERNAL_LOG_DEBUG_2_ARGS, \ + OTEL_INTERNAL_LOG_DEBUG_1_ARGS) +# define OTEL_INTERNAL_LOG_DEBUG(...) OTEL_INTERNAL_LOG_DEBUG_MACRO(__VA_ARGS__)(__VA_ARGS__) +#else +# define OTEL_INTERNAL_LOG_DEBUG(...) +#endif + +#if OTEL_INTERNAL_LOG_LEVEL >= OTEL_INTERNAL_LOG_LEVEL_INFO +# define OTEL_INTERNAL_LOG_INFO_1_ARGS(message) \ + OTEL_INTERNAL_LOG_DISPATCH(opentelemetry::sdk::common::internal_logger::LogLevel::Info, \ + message, {}) +# define OTEL_INTERNAL_LOG_INFO_2_ARGS(message, attributes) \ + OTEL_INTERNAL_LOG_DISPATCH(opentelemetry::sdk::common::internal_logger::LogLevel::Info, \ + message, attributes) +# define OTEL_INTERNAL_LOG_INFO_MACRO(...) \ + OTEL_INTERNAL_LOG_GET_3RD_ARG(__VA_ARGS__, OTEL_INTERNAL_LOG_ERROR_2_ARGS, \ + OTEL_INTERNAL_LOG_ERROR_1_ARGS) +# define OTEL_INTERNAL_LOG_INFO(...) OTEL_INTERNAL_LOG_INFO_MACRO(__VA_ARGS__)(__VA_ARGS__) +#else +# define OTEL_INTERNAL_LOG_INFO(...) +#endif diff --git a/sdk/include/opentelemetry/sdk_config.h b/sdk/include/opentelemetry/sdk_config.h new file mode 100644 index 0000000000..8ac72a10d5 --- /dev/null +++ b/sdk/include/opentelemetry/sdk_config.h @@ -0,0 +1,7 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "opentelemetry/config.h" +#include "opentelemetry/sdk/common/global_log_handler.h" \ No newline at end of file diff --git a/sdk/src/common/global_log_handler.cc b/sdk/src/common/global_log_handler.cc new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sdk/src/logs/logger.cc b/sdk/src/logs/logger.cc index 970f61b7e9..fe61dd4ce8 100644 --- a/sdk/src/logs/logger.cc +++ b/sdk/src/logs/logger.cc @@ -4,6 +4,7 @@ #ifdef ENABLE_LOGS_PREVIEW # include "opentelemetry/sdk/logs/logger.h" # include "opentelemetry/sdk/logs/log_record.h" +# include "opentelemetry/sdk_config.h" # include "opentelemetry/trace/provider.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -48,7 +49,7 @@ void Logger::Log(opentelemetry::logs::Severity severity, auto recordable = processor->MakeRecordable(); if (recordable == nullptr) { - // TODO: Error diagnostics should indicate "recordable creation failed" to user + OTEL_INTERNAL_LOG_ERROR("[LOGGER] Recordable creation failed"); return; } diff --git a/sdk/src/trace/tracer_provider.cc b/sdk/src/trace/tracer_provider.cc index ed6853be67..911e66c2f0 100644 --- a/sdk/src/trace/tracer_provider.cc +++ b/sdk/src/trace/tracer_provider.cc @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 #include "opentelemetry/sdk/trace/tracer_provider.h" +#include "opentelemetry/sdk_config.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk @@ -40,9 +41,10 @@ nostd::shared_ptr TracerProvider::GetTracer( { library_name = ""; } - // if (library_name == "") { - // // TODO: log invalid library_name. - // } + if (library_name == "") + { + OTEL_INTERNAL_LOG_ERROR("[TracerProvider::GetTracer] Library name is empty."); + } const std::lock_guard guard(lock_);