3838#include < opentelemetry/sdk/trace/simple_processor_factory.h>
3939#include < opentelemetry/sdk/trace/tracer_provider_factory.h>
4040
41+ #include < opentelemetry/exporters/ostream/log_record_exporter.h>
42+ #include < opentelemetry/exporters/ostream/log_record_exporter_factory.h>
43+
4144#include < opentelemetry/exporters/otlp/otlp_environment.h>
4245#include < opentelemetry/exporters/otlp/otlp_http.h>
4346#include < opentelemetry/exporters/otlp/otlp_http_exporter_factory.h>
@@ -73,22 +76,6 @@ init_otel_tracer()
7376 std::shared_ptr<opentelemetry::trace::TracerProvider>{ std::move (provider) });
7477}
7578
76- void
77- init_otel_logger ()
78- {
79- opentelemetry::exporter::otlp::OtlpHttpLogRecordExporterOptions logger_options;
80- auto exporter =
81- opentelemetry::exporter::otlp::OtlpHttpLogRecordExporterFactory::Create (logger_options);
82- auto processor =
83- opentelemetry::sdk::logs::SimpleLogRecordProcessorFactory::Create (std::move (exporter));
84- std::vector<std::unique_ptr<opentelemetry::sdk::logs::LogRecordProcessor>> processors;
85- processors.emplace_back (std::move (processor));
86- auto context = opentelemetry::sdk::logs::LoggerContextFactory::Create (std::move (processors));
87- std::shared_ptr<opentelemetry::logs::LoggerProvider> provider =
88- opentelemetry::sdk::logs::LoggerProviderFactory::Create (std::move (context));
89- opentelemetry::logs::Provider::SetLoggerProvider (provider);
90- }
91-
9279class get_app : public CLI ::App
9380{
9481public:
@@ -123,20 +110,22 @@ class get_app : public CLI::App
123110 json_lines_,
124111 " Use JSON Lines format (https://jsonlines.org) to print results." );
125112
113+ add_flag (" --use-http-logger" , use_http_logger_, " Use HTTP logger instead of ostream." );
114+
126115 add_common_options (this , common_options_);
127116 allow_extras (true );
128117 }
129118
130119 [[nodiscard]] auto get_otel_tracer () const -> std::shared_ptr<opentelemetry::trace::Tracer>
131120 {
132121 auto provider = opentelemetry::trace::Provider::GetTracerProvider ();
133- return provider->GetTracer (" cbc" , couchbase::core::meta::sdk_version ());
122+ return provider->GetTracer (" cbc" , couchbase::core::meta::sdk_semver ());
134123 }
135124
136125 [[nodiscard]] auto get_otel_logger () const -> std::shared_ptr<opentelemetry::logs::Logger>
137126 {
138127 auto provider = opentelemetry::logs::Provider::GetLoggerProvider ();
139- return provider->GetLogger (" cbc_logger" , " cbc" , OPENTELEMETRY_SDK_VERSION );
128+ return provider->GetLogger (" cbc_logger" , " cbc" , couchbase::core::meta::sdk_semver () );
140129 }
141130
142131 [[nodiscard]] auto execute () const -> int
@@ -204,7 +193,16 @@ class get_app : public CLI::App
204193 auto get_options = common_get_options;
205194 get_options.parent_span (couchbase::core::tracing::otel_request_span::wrap (span));
206195 auto [err, resp] = collection.get (document_id, get_options).get ();
207- logger->Error (" error: {}" , err.ec ().message (), span->GetContext ());
196+ logger->Warn (" this is the message error" );
197+ logger->Warn (" this is the message error: {msg}" ,
198+ opentelemetry::common::MakeAttributes ({
199+ { " msg" , err.ec ().message () },
200+ }));
201+ logger->Warn (" this is the message error: {msg} and some context" ,
202+ opentelemetry::common::MakeAttributes ({
203+ { " msg" , err.ec ().message () },
204+ }), span->GetContext ());
205+ logger->Error (" this is the message error: {}" , err.ec ().message (), span->GetContext ());
208206
209207 if (json_lines_) {
210208 print_result_json_line (bucket_name, scope_name, collection_name, document_id, err, resp);
@@ -313,6 +311,32 @@ class get_app : public CLI::App
313311 }
314312 }
315313
314+ void init_otel_logger () const
315+ {
316+ using namespace opentelemetry ;
317+
318+ if (use_http_logger_) {
319+ exporter::otlp::OtlpHttpLogRecordExporterOptions logger_options;
320+ auto exporter = exporter::otlp::OtlpHttpLogRecordExporterFactory::Create (logger_options);
321+ auto processor = sdk::logs::SimpleLogRecordProcessorFactory::Create (std::move (exporter));
322+ std::vector<std::unique_ptr<sdk::logs::LogRecordProcessor>> processors;
323+ processors.emplace_back (std::move (processor));
324+ auto context = sdk::logs::LoggerContextFactory::Create (std::move (processors));
325+ std::shared_ptr<logs::LoggerProvider> provider =
326+ sdk::logs::LoggerProviderFactory::Create (std::move (context));
327+ logs::Provider::SetLoggerProvider (provider);
328+ } else {
329+ auto exporter = exporter::logs::OStreamLogRecordExporterFactory::Create (std::cerr);
330+ auto processor = sdk::logs::SimpleLogRecordProcessorFactory::Create (std::move (exporter));
331+ std::vector<std::unique_ptr<sdk::logs::LogRecordProcessor>> processors;
332+ processors.emplace_back (std::move (processor));
333+ auto context = sdk::logs::LoggerContextFactory::Create (std::move (processors));
334+ std::shared_ptr<logs::LoggerProvider> provider =
335+ sdk::logs::LoggerProviderFactory::Create (std::move (context));
336+ logs::Provider::SetLoggerProvider (provider);
337+ }
338+ }
339+
316340 common_options common_options_{};
317341
318342 std::string bucket_name_{ default_bucket_name };
@@ -326,6 +350,8 @@ class get_app : public CLI::App
326350 bool json_lines_{ false };
327351 bool verbose_{ false };
328352
353+ bool use_http_logger_{ false };
354+
329355 std::vector<std::string> ids_{};
330356};
331357} // namespace
0 commit comments