Skip to content

Commit b5fe16e

Browse files
lalitbTommyCppcijothomas
authored
Moving LogRecord implementation to SDK (#1702)
Co-authored-by: Zhongyang Wu <zhongyang.wu@outlook.com> Co-authored-by: Cijo Thomas <cithomas@microsoft.com> Co-authored-by: Cijo Thomas <cijo.thomas@gmail.com>
1 parent 845f2f0 commit b5fe16e

File tree

16 files changed

+374
-384
lines changed

16 files changed

+374
-384
lines changed

opentelemetry-appender-log/src/lib.rs

+8-11
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
9797
use log::{Level, Metadata, Record};
9898
use opentelemetry::{
99-
logs::{AnyValue, LogRecordBuilder, Logger, LoggerProvider, Severity},
99+
logs::{AnyValue, LogRecord, Logger, LoggerProvider, Severity},
100100
Key,
101101
};
102102
use std::borrow::Cow;
@@ -126,16 +126,13 @@ where
126126

127127
fn log(&self, record: &Record) {
128128
if self.enabled(record.metadata()) {
129-
self.logger.emit(
130-
LogRecordBuilder::new()
131-
.with_severity_number(severity_of_level(record.level()))
132-
.with_severity_text(record.level().as_str())
133-
// Not populating ObservedTimestamp, instead relying on OpenTelemetry
134-
// API to populate it with current time.
135-
.with_body(AnyValue::from(record.args().to_string()))
136-
.with_attributes(log_attributes(record.key_values()))
137-
.build(),
138-
);
129+
let mut log_record = self.logger.create_log_record();
130+
log_record.set_severity_number(severity_of_level(record.level()));
131+
log_record.set_severity_text(record.level().as_str().into());
132+
log_record.set_body(AnyValue::from(record.args().to_string()));
133+
log_record.add_attributes(log_attributes(record.key_values()));
134+
135+
self.logger.emit(log_record);
139136
}
140137
}
141138

opentelemetry-appender-tracing/src/layer.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,11 @@ impl EventVisitor {
7171
}
7272
}
7373

74-
fn push_to_otel_log_record(self, log_record: &mut LogRecord) {
75-
log_record.body = self.log_record_body;
76-
log_record.attributes = Some(self.log_record_attributes);
74+
fn push_to_otel_log_record<LR: LogRecord>(self, log_record: &mut LR) {
75+
if let Some(body) = self.log_record_body {
76+
log_record.set_body(body);
77+
}
78+
log_record.add_attributes(self.log_record_attributes);
7779
}
7880
}
7981

@@ -166,12 +168,10 @@ where
166168
#[cfg(not(feature = "experimental_metadata_attributes"))]
167169
let meta = event.metadata();
168170

169-
let mut log_record: LogRecord = LogRecord::default();
170-
log_record.severity_number = Some(severity_of_level(meta.level()));
171-
log_record.severity_text = Some(meta.level().to_string().into());
172-
173-
// Not populating ObservedTimestamp, instead relying on OpenTelemetry
174-
// API to populate it with current time.
171+
//let mut log_record: LogRecord = LogRecord::default();
172+
let mut log_record = self.logger.create_log_record();
173+
log_record.set_severity_number(severity_of_level(meta.level()));
174+
log_record.set_severity_text(meta.level().to_string().into());
175175

176176
let mut visitor = EventVisitor::default();
177177
visitor.visit_metadata(meta);

opentelemetry-proto/src/transform/logs.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ pub mod tonic {
5050
}
5151
}
5252

53-
impl From<opentelemetry::logs::LogRecord> for LogRecord {
54-
fn from(log_record: opentelemetry::logs::LogRecord) -> Self {
53+
impl From<opentelemetry_sdk::logs::LogRecord> for LogRecord {
54+
fn from(log_record: opentelemetry_sdk::logs::LogRecord) -> Self {
5555
let trace_context = log_record.trace_context.as_ref();
5656
let severity_number = match log_record.severity_number {
5757
Some(Severity::Trace) => SeverityNumber::Trace,
@@ -83,7 +83,7 @@ pub mod tonic {
8383

8484
LogRecord {
8585
time_unix_nano: log_record.timestamp.map(to_nanos).unwrap_or_default(),
86-
observed_time_unix_nano: to_nanos(log_record.observed_timestamp),
86+
observed_time_unix_nano: to_nanos(log_record.observed_timestamp.unwrap()),
8787
severity_number: severity_number.into(),
8888
severity_text: log_record.severity_text.map(Into::into).unwrap_or_default(),
8989
body: log_record.body.map(Into::into),

opentelemetry-sdk/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
- `shutdown` methods in `LoggerProvider` and `LogProcessor` now takes a immutable reference
2727
- After `shutdown`, `LoggerProvider` will return noop `Logger`
2828
- After `shutdown`, `LogProcessor` will not process any new logs
29+
- Moving LogRecord implementation to the SDK. [1702](https://github.com/open-telemetry/opentelemetry-rust/pull/1702).
30+
- Relocated `LogRecord` struct to SDK, as an implementation for the trait in the API.
2931

3032
## v0.22.1
3133

opentelemetry-sdk/benches/log.rs

+93-115
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ use std::time::SystemTime;
44
use async_trait::async_trait;
55
use criterion::{criterion_group, criterion_main, Criterion};
66

7-
use opentelemetry::logs::{AnyValue, LogRecord, LogResult, Logger, LoggerProvider as _, Severity};
7+
use opentelemetry::logs::{
8+
AnyValue, LogRecord as _, LogResult, Logger as _, LoggerProvider as _, Severity,
9+
};
810
use opentelemetry::trace::Tracer;
911
use opentelemetry::trace::TracerProvider as _;
1012
use opentelemetry::Key;
1113
use opentelemetry_sdk::export::logs::{LogData, LogExporter};
12-
use opentelemetry_sdk::logs::LoggerProvider;
14+
use opentelemetry_sdk::logs::{Logger, LoggerProvider};
1315
use opentelemetry_sdk::trace::{config, Sampler, TracerProvider};
1416

1517
#[derive(Debug)]
@@ -22,7 +24,7 @@ impl LogExporter for VoidExporter {
2224
}
2325
}
2426

25-
fn log_benchmark_group<F: Fn(&dyn Logger)>(c: &mut Criterion, name: &str, f: F) {
27+
fn log_benchmark_group<F: Fn(&Logger)>(c: &mut Criterion, name: &str, f: F) {
2628
let mut group = c.benchmark_group(name);
2729

2830
group.bench_function("no-context", |b| {
@@ -59,53 +61,45 @@ fn log_benchmark_group<F: Fn(&dyn Logger)>(c: &mut Criterion, name: &str, f: F)
5961

6062
fn criterion_benchmark(c: &mut Criterion) {
6163
log_benchmark_group(c, "simple-log", |logger| {
62-
logger.emit(LogRecord::builder().with_body("simple log").build())
64+
let mut log_record = logger.create_log_record();
65+
log_record.set_body("simple log".into());
66+
logger.emit(log_record);
6367
});
6468

6569
log_benchmark_group(c, "simple-log-with-int", |logger| {
66-
logger.emit(
67-
LogRecord::builder()
68-
.with_body("simple log")
69-
.with_attribute("testint", 2)
70-
.build(),
71-
)
70+
let mut log_record = logger.create_log_record();
71+
log_record.set_body("simple log".into());
72+
log_record.add_attribute("testint", 2);
73+
logger.emit(log_record);
7274
});
7375

7476
log_benchmark_group(c, "simple-log-with-double", |logger| {
75-
logger.emit(
76-
LogRecord::builder()
77-
.with_body("simple log")
78-
.with_attribute("testdouble", 2.2)
79-
.build(),
80-
)
77+
let mut log_record = logger.create_log_record();
78+
log_record.set_body("simple log".into());
79+
log_record.add_attribute("testdouble", 2.2);
80+
logger.emit(log_record);
8181
});
8282

8383
log_benchmark_group(c, "simple-log-with-string", |logger| {
84-
logger.emit(
85-
LogRecord::builder()
86-
.with_body("simple log")
87-
.with_attribute("teststring", "test")
88-
.build(),
89-
)
84+
let mut log_record = logger.create_log_record();
85+
log_record.set_body("simple log".into());
86+
log_record.add_attribute("teststring", "test");
87+
logger.emit(log_record);
9088
});
9189

9290
log_benchmark_group(c, "simple-log-with-bool", |logger| {
93-
logger.emit(
94-
LogRecord::builder()
95-
.with_body("simple log")
96-
.with_attribute("testbool", AnyValue::Boolean(true))
97-
.build(),
98-
)
91+
let mut log_record = logger.create_log_record();
92+
log_record.set_body("simple log".into());
93+
log_record.add_attribute("testbool", AnyValue::Boolean(true));
94+
logger.emit(log_record);
9995
});
10096

10197
let bytes = AnyValue::Bytes(vec![25u8, 30u8, 40u8]);
10298
log_benchmark_group(c, "simple-log-with-bytes", |logger| {
103-
logger.emit(
104-
LogRecord::builder()
105-
.with_body("simple log")
106-
.with_attribute("testbytes", bytes.clone())
107-
.build(),
108-
)
99+
let mut log_record = logger.create_log_record();
100+
log_record.set_body("simple log".into());
101+
log_record.add_attribute("testbytes", bytes.clone());
102+
logger.emit(log_record);
109103
});
110104

111105
let bytes = AnyValue::Bytes(vec![
@@ -117,22 +111,18 @@ fn criterion_benchmark(c: &mut Criterion) {
117111
30u8, 40u8, 30u8, 40u8, 30u8, 40u8, 30u8, 40u8, 30u8, 40u8,
118112
]);
119113
log_benchmark_group(c, "simple-log-with-a-lot-of-bytes", |logger| {
120-
logger.emit(
121-
LogRecord::builder()
122-
.with_body("simple log")
123-
.with_attribute("testbytes", bytes.clone())
124-
.build(),
125-
)
114+
let mut log_record = logger.create_log_record();
115+
log_record.set_body("simple log".into());
116+
log_record.add_attribute("testbytes", bytes.clone());
117+
logger.emit(log_record);
126118
});
127119

128120
let vec_any_values = AnyValue::ListAny(vec![AnyValue::Int(25), "test".into(), true.into()]);
129121
log_benchmark_group(c, "simple-log-with-vec-any-value", |logger| {
130-
logger.emit(
131-
LogRecord::builder()
132-
.with_body("simple log")
133-
.with_attribute("testvec", vec_any_values.clone())
134-
.build(),
135-
)
122+
let mut log_record = logger.create_log_record();
123+
log_record.set_body("simple log".into());
124+
log_record.add_attribute("testvec", vec_any_values.clone());
125+
logger.emit(log_record);
136126
});
137127

138128
let vec_any_values = AnyValue::ListAny(vec![AnyValue::Int(25), "test".into(), true.into()]);
@@ -143,12 +133,10 @@ fn criterion_benchmark(c: &mut Criterion) {
143133
vec_any_values,
144134
]);
145135
log_benchmark_group(c, "simple-log-with-inner-vec-any-value", |logger| {
146-
logger.emit(
147-
LogRecord::builder()
148-
.with_body("simple log")
149-
.with_attribute("testvec", vec_any_values.clone())
150-
.build(),
151-
)
136+
let mut log_record = logger.create_log_record();
137+
log_record.set_body("simple log".into());
138+
log_record.add_attribute("testvec", vec_any_values.clone());
139+
logger.emit(log_record);
152140
});
153141

154142
let map_any_values = AnyValue::Map(HashMap::from([
@@ -157,12 +145,10 @@ fn criterion_benchmark(c: &mut Criterion) {
157145
("teststring".into(), "test".into()),
158146
]));
159147
log_benchmark_group(c, "simple-log-with-map-any-value", |logger| {
160-
logger.emit(
161-
LogRecord::builder()
162-
.with_body("simple log")
163-
.with_attribute("testmap", map_any_values.clone())
164-
.build(),
165-
)
148+
let mut log_record = logger.create_log_record();
149+
log_record.set_body("simple log".into());
150+
log_record.add_attribute("testmap", map_any_values.clone());
151+
logger.emit(log_record);
166152
});
167153

168154
let map_any_values = AnyValue::Map(HashMap::from([
@@ -177,66 +163,60 @@ fn criterion_benchmark(c: &mut Criterion) {
177163
("testmap".into(), map_any_values),
178164
]));
179165
log_benchmark_group(c, "simple-log-with-inner-map-any-value", |logger| {
180-
logger.emit(
181-
LogRecord::builder()
182-
.with_body("simple log")
183-
.with_attribute("testmap", map_any_values.clone())
184-
.build(),
185-
)
166+
let mut log_record = logger.create_log_record();
167+
log_record.set_body("simple log".into());
168+
log_record.add_attribute("testmap", map_any_values.clone());
169+
logger.emit(log_record);
186170
});
187171

188172
log_benchmark_group(c, "long-log", |logger| {
189-
logger.emit(LogRecord::builder().with_body("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Gravida in fermentum et sollicitudin ac orci phasellus. Ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at augue. Magna etiam tempor orci eu. Sed tempus urna et pharetra pharetra massa.").build())
173+
let mut log_record = logger.create_log_record();
174+
log_record.set_body("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Gravida in fermentum et sollicitudin ac orci phasellus. Ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at augue. Magna etiam tempor orci eu. Sed tempus urna et pharetra pharetra massa.".into());
175+
logger.emit(log_record);
190176
});
191177

192178
let now = SystemTime::now();
193179
log_benchmark_group(c, "full-log", |logger| {
194-
logger.emit(
195-
LogRecord::builder()
196-
.with_body("full log")
197-
.with_timestamp(now)
198-
.with_observed_timestamp(now)
199-
.with_severity_number(Severity::Warn)
200-
.with_severity_text(Severity::Warn.name())
201-
.build(),
202-
)
180+
let mut log_record = logger.create_log_record();
181+
log_record.set_body("full log".into());
182+
log_record.set_timestamp(now);
183+
log_record.set_observed_timestamp(now);
184+
log_record.set_severity_number(Severity::Warn);
185+
log_record.set_severity_text(Severity::Warn.name().into());
186+
logger.emit(log_record);
203187
});
204188

205189
log_benchmark_group(c, "full-log-with-4-attributes", |logger| {
206-
logger.emit(
207-
LogRecord::builder()
208-
.with_body("full log")
209-
.with_timestamp(now)
210-
.with_observed_timestamp(now)
211-
.with_severity_number(Severity::Warn)
212-
.with_severity_text(Severity::Warn.name())
213-
.with_attribute("name", "my-event-name")
214-
.with_attribute("event.id", 20)
215-
.with_attribute("user.name", "otel")
216-
.with_attribute("user.email", "otel@opentelemetry.io")
217-
.build(),
218-
)
190+
let mut log_record = logger.create_log_record();
191+
log_record.set_body("full log".into());
192+
log_record.set_timestamp(now);
193+
log_record.set_observed_timestamp(now);
194+
log_record.set_severity_number(Severity::Warn);
195+
log_record.set_severity_text(Severity::Warn.name().into());
196+
log_record.add_attribute("name", "my-event-name");
197+
log_record.add_attribute("event.id", 20);
198+
log_record.add_attribute("user.name", "otel");
199+
log_record.add_attribute("user.email", "otel@opentelemetry.io");
200+
logger.emit(log_record);
219201
});
220202

221203
log_benchmark_group(c, "full-log-with-9-attributes", |logger| {
222-
logger.emit(
223-
LogRecord::builder()
224-
.with_body("full log")
225-
.with_timestamp(now)
226-
.with_observed_timestamp(now)
227-
.with_severity_number(Severity::Warn)
228-
.with_severity_text(Severity::Warn.name())
229-
.with_attribute("name", "my-event-name")
230-
.with_attribute("event.id", 20)
231-
.with_attribute("user.name", "otel")
232-
.with_attribute("user.email", "otel@opentelemetry.io")
233-
.with_attribute("code.filename", "log.rs")
234-
.with_attribute("code.filepath", "opentelemetry_sdk/benches/log.rs")
235-
.with_attribute("code.lineno", 96)
236-
.with_attribute("code.namespace", "opentelemetry_sdk::benches::log")
237-
.with_attribute("log.target", "opentelemetry_sdk::benches::log")
238-
.build(),
239-
)
204+
let mut log_record = logger.create_log_record();
205+
log_record.set_body("full log".into());
206+
log_record.set_timestamp(now);
207+
log_record.set_observed_timestamp(now);
208+
log_record.set_severity_number(Severity::Warn);
209+
log_record.set_severity_text(Severity::Warn.name().into());
210+
log_record.add_attribute("name", "my-event-name");
211+
log_record.add_attribute("event.id", 20);
212+
log_record.add_attribute("user.name", "otel");
213+
log_record.add_attribute("user.email", "otel@opentelemetry.io");
214+
log_record.add_attribute("code.filename", "log.rs");
215+
log_record.add_attribute("code.filepath", "opentelemetry_sdk/benches/log.rs");
216+
log_record.add_attribute("code.lineno", 96);
217+
log_record.add_attribute("code.namespace", "opentelemetry_sdk::benches::log");
218+
log_record.add_attribute("log.target", "opentelemetry_sdk::benches::log");
219+
logger.emit(log_record);
240220
});
241221

242222
let attributes: Vec<(Key, AnyValue)> = vec![
@@ -260,16 +240,14 @@ fn criterion_benchmark(c: &mut Criterion) {
260240
),
261241
];
262242
log_benchmark_group(c, "full-log-with-attributes", |logger| {
263-
logger.emit(
264-
LogRecord::builder()
265-
.with_body("full log")
266-
.with_timestamp(now)
267-
.with_observed_timestamp(now)
268-
.with_severity_number(Severity::Warn)
269-
.with_severity_text(Severity::Warn.name())
270-
.with_attributes(attributes.clone())
271-
.build(),
272-
)
243+
let mut log_record = logger.create_log_record();
244+
log_record.set_body("full log".into());
245+
log_record.set_timestamp(now);
246+
log_record.set_observed_timestamp(now);
247+
log_record.set_severity_number(Severity::Warn);
248+
log_record.set_severity_text(Severity::Warn.name().into());
249+
log_record.add_attributes(attributes.clone());
250+
logger.emit(log_record);
273251
});
274252
}
275253

0 commit comments

Comments
 (0)