]> git.proxmox.com Git - ceph.git/blob - ceph/src/jaegertracing/opentelemetry-cpp/exporters/ostream/src/log_exporter.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / jaegertracing / opentelemetry-cpp / exporters / ostream / src / log_exporter.cc
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
3
4 #ifdef ENABLE_LOGS_PREVIEW
5 # include "opentelemetry/exporters/ostream/log_exporter.h"
6 # include <mutex>
7 # include "opentelemetry/exporters/ostream/common_utils.h"
8 # include "opentelemetry/sdk_config.h"
9
10 # include <iostream>
11 # include <type_traits>
12
13 namespace nostd = opentelemetry::nostd;
14 namespace sdklogs = opentelemetry::sdk::logs;
15 namespace sdkcommon = opentelemetry::sdk::common;
16 OPENTELEMETRY_BEGIN_NAMESPACE
17 namespace exporter
18 {
19 namespace logs
20 {
21
22 /*********************** Constructor ***********************/
23
24 OStreamLogExporter::OStreamLogExporter(std::ostream &sout) noexcept : sout_(sout) {}
25
26 /*********************** Exporter methods ***********************/
27
28 std::unique_ptr<sdklogs::Recordable> OStreamLogExporter::MakeRecordable() noexcept
29 {
30 return std::unique_ptr<sdklogs::Recordable>(new sdklogs::LogRecord());
31 }
32
33 sdk::common::ExportResult OStreamLogExporter::Export(
34 const nostd::span<std::unique_ptr<sdklogs::Recordable>> &records) noexcept
35 {
36 if (isShutdown())
37 {
38 OTEL_INTERNAL_LOG_ERROR("[Ostream Log Exporter] Exporting "
39 << records.size() << " log(s) failed, exporter is shutdown");
40 return sdk::common::ExportResult::kFailure;
41 }
42
43 for (auto &record : records)
44 {
45 // Convert recordable to a LogRecord so that the getters of the LogRecord can be used
46 auto log_record =
47 std::unique_ptr<sdklogs::LogRecord>(static_cast<sdklogs::LogRecord *>(record.release()));
48
49 if (log_record == nullptr)
50 {
51 // TODO: Log Internal SDK error "recordable data was lost"
52 continue;
53 }
54
55 // Convert trace, spanid, traceflags into exportable representation
56 constexpr int trace_id_len = 32;
57 constexpr int span_id__len = 16;
58 constexpr int trace_flags_len = 2;
59
60 char trace_id[trace_id_len] = {0};
61 char span_id[span_id__len] = {0};
62 char trace_flags[trace_flags_len] = {0};
63
64 log_record->GetTraceId().ToLowerBase16(trace_id);
65 log_record->GetSpanId().ToLowerBase16(span_id);
66 log_record->GetTraceFlags().ToLowerBase16(trace_flags);
67
68 // Print out each field of the log record, noting that severity is separated
69 // into severity_num and severity_text
70 sout_ << "{\n"
71 << " timestamp : " << log_record->GetTimestamp().time_since_epoch().count() << "\n"
72 << " severity_num : " << static_cast<std::uint32_t>(log_record->GetSeverity()) << "\n"
73 << " severity_text : ";
74
75 std::uint32_t severity_index = static_cast<std::uint32_t>(log_record->GetSeverity());
76 if (severity_index >= std::extent<decltype(opentelemetry::logs::SeverityNumToText)>::value)
77 {
78 sout_ << "Invalid severity(" << severity_index << ")\n";
79 }
80 else
81 {
82 sout_ << opentelemetry::logs::SeverityNumToText[severity_index] << "\n";
83 }
84
85 sout_ << " body : " << log_record->GetBody() << "\n"
86 << " resource : ";
87
88 printAttributes(log_record->GetResource().GetAttributes());
89
90 sout_ << "\n"
91 << " attributes : ";
92
93 printAttributes(log_record->GetAttributes());
94
95 sout_ << "\n"
96 << " trace_id : " << std::string(trace_id, trace_id_len) << "\n"
97 << " span_id : " << std::string(span_id, span_id__len) << "\n"
98 << " trace_flags : " << std::string(trace_flags, trace_flags_len) << "\n"
99 << "}\n";
100 }
101
102 return sdk::common::ExportResult::kSuccess;
103 }
104
105 bool OStreamLogExporter::Shutdown(std::chrono::microseconds timeout) noexcept
106 {
107 const std::lock_guard<opentelemetry::common::SpinLockMutex> locked(lock_);
108 is_shutdown_ = true;
109 return true;
110 }
111
112 bool OStreamLogExporter::isShutdown() const noexcept
113 {
114 const std::lock_guard<opentelemetry::common::SpinLockMutex> locked(lock_);
115 return is_shutdown_;
116 }
117
118 void OStreamLogExporter::printAttributes(
119 const std::unordered_map<std::string, sdkcommon::OwnedAttributeValue> &map,
120 const std::string prefix)
121 {
122 for (const auto &kv : map)
123 {
124 sout_ << prefix << kv.first << ": ";
125 opentelemetry::exporter::ostream_common::print_value(kv.second, sout_);
126 }
127 }
128
129 } // namespace logs
130 } // namespace exporter
131 OPENTELEMETRY_END_NAMESPACE
132 #endif