Skip to content

Commit 416242c

Browse files
authored
refactor: marker is mdc (#90)
Signed-off-by: tison <wander4096@gmail.com>
1 parent 941449e commit 416242c

File tree

21 files changed

+382
-357
lines changed

21 files changed

+382
-357
lines changed

examples/fastrace.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ fn main() {
2626
.dispatch(|d| {
2727
d.append(
2828
logforth::append::Stderr::default()
29-
.with_marker(logforth::marker::TraceIdMarker::default()),
29+
.with_marker(logforth::diagnostic::FastraceDiagnostic::default()),
3030
)
3131
})
3232
.apply();

src/append/fastrace.rs

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ use jiff::Zoned;
2020
use log::Record;
2121

2222
use crate::append::Append;
23-
use crate::layout::collect_kvs;
23+
use crate::diagnostic::Visitor;
24+
use crate::Diagnostic;
2425

2526
/// An appender that adds log records to fastrace as an event associated to the current span.
2627
///
@@ -37,16 +38,24 @@ pub struct FastraceEvent {
3738
}
3839

3940
impl Append for FastraceEvent {
40-
fn append(&self, record: &Record) -> anyhow::Result<()> {
41+
fn append(&self, record: &Record, diagnostics: &[Diagnostic]) -> anyhow::Result<()> {
4142
let message = format!("{}", record.args());
43+
44+
let mut collector = KvCollector { kv: Vec::new() };
45+
record.key_values().visit(&mut collector)?;
46+
for d in diagnostics {
47+
d.visit(&mut collector);
48+
}
49+
4250
fastrace::Event::add_to_local_parent(message, || {
4351
[
4452
(Cow::from("level"), Cow::from(record.level().as_str())),
4553
(Cow::from("timestamp"), Cow::from(Zoned::now().to_string())),
4654
]
4755
.into_iter()
4856
.chain(
49-
collect_kvs(record.key_values())
57+
collector
58+
.kv
5059
.into_iter()
5160
.map(|(k, v)| (Cow::from(k), Cow::from(v))),
5261
)
@@ -58,3 +67,30 @@ impl Append for FastraceEvent {
5867
fastrace::flush();
5968
}
6069
}
70+
71+
struct KvCollector {
72+
kv: Vec<(String, String)>,
73+
}
74+
75+
impl<'kvs> log::kv::VisitSource<'kvs> for KvCollector {
76+
fn visit_pair(
77+
&mut self,
78+
key: log::kv::Key<'kvs>,
79+
value: log::kv::Value<'kvs>,
80+
) -> Result<(), log::kv::Error> {
81+
self.kv.push((key.to_string(), value.to_string()));
82+
Ok(())
83+
}
84+
}
85+
86+
impl Visitor for KvCollector {
87+
fn visit<'k, 'v, K, V>(&mut self, key: K, value: V)
88+
where
89+
K: Into<Cow<'k, str>>,
90+
V: Into<Cow<'v, str>>,
91+
{
92+
let key = key.into().into_owned();
93+
let value = value.into().into_owned();
94+
self.kv.push((key, value));
95+
}
96+
}

src/append/journald/mod.rs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
use std::borrow::Cow;
1516
use std::io;
1617
use std::io::Write;
1718
use std::os::unix::net::UnixDatagram;
1819

1920
use log::Level;
2021
use log::Record;
2122

23+
use crate::diagnostic::Visitor;
2224
use crate::Append;
25+
use crate::Diagnostic;
2326

2427
mod field;
2528
#[cfg(target_os = "linux")]
@@ -237,19 +240,30 @@ impl<'kvs> log::kv::VisitSource<'kvs> for WriteKeyValues<'_> {
237240
key: log::kv::Key<'kvs>,
238241
value: log::kv::Value<'kvs>,
239242
) -> Result<(), log::kv::Error> {
240-
field::put_field_length_encoded(
241-
self.0,
242-
field::FieldName::WriteEscaped(key.as_str()),
243-
value,
244-
);
243+
let key = key.as_str();
244+
field::put_field_length_encoded(self.0, field::FieldName::WriteEscaped(key), value);
245245
Ok(())
246246
}
247247
}
248248

249+
impl Visitor for WriteKeyValues<'_> {
250+
fn visit<'k, 'v, K, V>(&mut self, key: K, value: V)
251+
where
252+
K: Into<Cow<'k, str>>,
253+
V: Into<Cow<'v, str>>,
254+
{
255+
let key = key.into();
256+
let value = value.into();
257+
let key = key.as_ref();
258+
let value = value.as_bytes();
259+
field::put_field_length_encoded(self.0, field::FieldName::WriteEscaped(key), value);
260+
}
261+
}
262+
249263
impl Append for Journald {
250264
/// Extract all fields (standard and custom) from `record`, append all `extra_fields` given
251265
/// to this appender, and send the result to journald.
252-
fn append(&self, record: &Record) -> anyhow::Result<()> {
266+
fn append(&self, record: &Record, diagnostics: &[Diagnostic]) -> anyhow::Result<()> {
253267
use field::*;
254268

255269
let mut buffer = vec![];
@@ -299,9 +313,11 @@ impl Append for Journald {
299313
record.target().as_bytes(),
300314
);
301315
// Put all structured values of the record
302-
record
303-
.key_values()
304-
.visit(&mut WriteKeyValues(&mut buffer))?;
316+
let mut visitor = WriteKeyValues(&mut buffer);
317+
record.key_values().visit(&mut visitor)?;
318+
for d in diagnostics {
319+
d.visit(&mut visitor);
320+
}
305321
// Put all extra fields of the appender
306322
buffer.extend_from_slice(&self.extra_fields);
307323
self.send_payload(&buffer)?;

src/append/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
1717
use std::fmt;
1818

19+
use crate::Diagnostic;
20+
1921
#[cfg(feature = "fastrace")]
2022
mod fastrace;
2123
#[cfg(all(unix, feature = "journald"))]
@@ -46,7 +48,7 @@ pub use self::syslog::Syslog;
4648
/// Implementors of this trait can handle log records in custom ways.
4749
pub trait Append: fmt::Debug + Send + Sync + 'static {
4850
/// Dispatches a log record to the append target.
49-
fn append(&self, record: &log::Record) -> anyhow::Result<()>;
51+
fn append(&self, record: &log::Record, diagnostics: &[Diagnostic]) -> anyhow::Result<()>;
5052

5153
/// Flushes any buffered records.
5254
fn flush(&self) {}

src/append/opentelemetry.rs

Lines changed: 47 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ use opentelemetry_sdk::logs::LogRecord;
3131
use opentelemetry_sdk::logs::LoggerProvider;
3232

3333
use crate::append::Append;
34+
use crate::diagnostic::Visitor;
35+
use crate::Diagnostic;
3436
use crate::Layout;
35-
use crate::Marker;
3637

3738
/// Specifies the wire protocol to use when sending logs to OpenTelemetry.
3839
///
@@ -56,7 +57,6 @@ pub struct OpentelemetryLogBuilder {
5657
protocol: Protocol,
5758
labels: Vec<(Cow<'static, str>, Cow<'static, str>)>,
5859
layout: Option<Layout>,
59-
marker: Option<Marker>,
6060
}
6161

6262
impl OpentelemetryLogBuilder {
@@ -76,7 +76,6 @@ impl OpentelemetryLogBuilder {
7676
protocol: Protocol::Grpc,
7777
labels: vec![],
7878
layout: None,
79-
marker: None,
8079
}
8180
}
8281

@@ -155,22 +154,6 @@ impl OpentelemetryLogBuilder {
155154
self
156155
}
157156

158-
/// Sets the marker for the logs.
159-
///
160-
/// # Examples
161-
///
162-
/// ```
163-
/// use logforth::append::opentelemetry::OpentelemetryLogBuilder;
164-
/// use logforth::marker::TraceIdMarker;
165-
///
166-
/// let builder = OpentelemetryLogBuilder::new("my_service", "http://localhost:4317");
167-
/// builder.marker(TraceIdMarker::default());
168-
/// ```
169-
pub fn marker(mut self, marker: impl Into<Marker>) -> Self {
170-
self.marker = Some(marker.into());
171-
self
172-
}
173-
174157
/// Builds the [`OpentelemetryLog`] appender.
175158
///
176159
/// # Examples
@@ -190,7 +173,6 @@ impl OpentelemetryLogBuilder {
190173
protocol,
191174
labels,
192175
layout,
193-
marker,
194176
} = self;
195177

196178
let collector_timeout =
@@ -224,7 +206,6 @@ impl OpentelemetryLogBuilder {
224206
Ok(OpentelemetryLog {
225207
name,
226208
layout,
227-
marker,
228209
logger,
229210
provider,
230211
})
@@ -250,61 +231,41 @@ impl OpentelemetryLogBuilder {
250231
pub struct OpentelemetryLog {
251232
name: String,
252233
layout: Option<Layout>,
253-
marker: Option<Marker>,
254234
logger: opentelemetry_sdk::logs::Logger,
255235
provider: LoggerProvider,
256236
}
257237

258238
impl Append for OpentelemetryLog {
259-
fn append(&self, record: &Record) -> anyhow::Result<()> {
260-
let mut log_record_ = LogRecord::default();
261-
log_record_.observed_timestamp = Some(SystemTime::now());
262-
log_record_.severity_number = Some(log_level_to_otel_severity(record.level()));
263-
log_record_.severity_text = Some(record.level().as_str());
264-
log_record_.target = Some(record.target().to_string().into());
265-
log_record_.body = Some(AnyValue::Bytes(Box::new(match self.layout.as_ref() {
239+
fn append(&self, record: &Record, diagnostics: &[Diagnostic]) -> anyhow::Result<()> {
240+
let mut log_record = LogRecord::default();
241+
log_record.observed_timestamp = Some(SystemTime::now());
242+
log_record.severity_number = Some(log_level_to_otel_severity(record.level()));
243+
log_record.severity_text = Some(record.level().as_str());
244+
log_record.target = Some(record.target().to_string().into());
245+
log_record.body = Some(AnyValue::Bytes(Box::new(match self.layout.as_ref() {
266246
None => record.args().to_string().into_bytes(),
267-
Some(layout) => layout.format(record, self.marker.as_ref())?,
247+
Some(layout) => layout.format(record, diagnostics)?,
268248
})));
269249

270250
if let Some(module_path) = record.module_path() {
271-
log_record_.add_attribute("module_path", module_path.to_string());
251+
log_record.add_attribute("module_path", module_path.to_string());
272252
}
273253
if let Some(file) = record.file() {
274-
log_record_.add_attribute("file", file.to_string());
254+
log_record.add_attribute("file", file.to_string());
275255
}
276256
if let Some(line) = record.line() {
277-
log_record_.add_attribute("line", line);
278-
}
279-
280-
struct KvExtractor<'a> {
281-
record: &'a mut LogRecord,
282-
}
283-
284-
impl<'kvs> log::kv::VisitSource<'kvs> for KvExtractor<'_> {
285-
fn visit_pair(
286-
&mut self,
287-
key: log::kv::Key<'kvs>,
288-
value: log::kv::Value<'kvs>,
289-
) -> Result<(), log::kv::Error> {
290-
self.record
291-
.add_attribute(key.to_string(), value.to_string());
292-
Ok(())
293-
}
257+
log_record.add_attribute("line", line);
294258
}
295259

296260
let mut extractor = KvExtractor {
297-
record: &mut log_record_,
261+
record: &mut log_record,
298262
};
299-
record.key_values().visit(&mut extractor).ok();
300-
301-
if let Some(marker) = &self.marker {
302-
marker.mark(|key, value| {
303-
log_record_.add_attribute(key.to_string(), value.to_string());
304-
});
263+
record.key_values().visit(&mut extractor)?;
264+
for d in diagnostics {
265+
d.visit(&mut extractor);
305266
}
306267

307-
self.logger.emit(log_record_);
268+
self.logger.emit(log_record);
308269
Ok(())
309270
}
310271

@@ -329,3 +290,32 @@ fn log_level_to_otel_severity(level: log::Level) -> opentelemetry::logs::Severit
329290
log::Level::Trace => opentelemetry::logs::Severity::Trace,
330291
}
331292
}
293+
294+
struct KvExtractor<'a> {
295+
record: &'a mut LogRecord,
296+
}
297+
298+
impl<'kvs> log::kv::VisitSource<'kvs> for KvExtractor<'_> {
299+
fn visit_pair(
300+
&mut self,
301+
key: log::kv::Key<'kvs>,
302+
value: log::kv::Value<'kvs>,
303+
) -> Result<(), log::kv::Error> {
304+
let key = key.to_string();
305+
let value = value.to_string();
306+
self.record.add_attribute(key, value);
307+
Ok(())
308+
}
309+
}
310+
311+
impl Visitor for KvExtractor<'_> {
312+
fn visit<'k, 'v, K, V>(&mut self, key: K, value: V)
313+
where
314+
K: Into<Cow<'k, str>>,
315+
V: Into<Cow<'v, str>>,
316+
{
317+
let key = key.into().into_owned();
318+
let value = value.into().into_owned();
319+
self.record.add_attribute(key, value);
320+
}
321+
}

src/append/rolling_file/append.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,13 @@ use crate::append::rolling_file::RollingFileWriter;
1818
use crate::append::Append;
1919
use crate::layout::TextLayout;
2020
use crate::non_blocking::NonBlocking;
21+
use crate::Diagnostic;
2122
use crate::Layout;
22-
use crate::Marker;
2323

2424
/// An appender that writes log records to rolling files.
2525
#[derive(Debug)]
2626
pub struct RollingFile {
2727
layout: Layout,
28-
marker: Option<Marker>,
2928
writer: NonBlocking<RollingFileWriter>,
3029
}
3130

@@ -36,7 +35,6 @@ impl RollingFile {
3635
pub fn new(writer: NonBlocking<RollingFileWriter>) -> Self {
3736
Self {
3837
layout: TextLayout::default().no_color().into(),
39-
marker: None,
4038
writer,
4139
}
4240
}
@@ -46,17 +44,11 @@ impl RollingFile {
4644
self.layout = layout.into();
4745
self
4846
}
49-
50-
/// Sets the marker used to add additional fields to log records.
51-
pub fn with_marker(mut self, marker: impl Into<Marker>) -> Self {
52-
self.marker = Some(marker.into());
53-
self
54-
}
5547
}
5648

5749
impl Append for RollingFile {
58-
fn append(&self, record: &Record) -> anyhow::Result<()> {
59-
let mut bytes = self.layout.format(record, self.marker.as_ref())?;
50+
fn append(&self, record: &Record, diagnostics: &[Diagnostic]) -> anyhow::Result<()> {
51+
let mut bytes = self.layout.format(record, diagnostics)?;
6052
bytes.push(b'\n');
6153
self.writer.send(bytes)?;
6254
Ok(())

0 commit comments

Comments
 (0)