Skip to main content

ckb_sentry_slog/
converters.rs

1use sentry_core::protocol::{Breadcrumb, Event, Exception, Frame, Level, Map, Stacktrace, Value};
2use slog::{OwnedKVList, Record, KV};
3
4/// Converts a [`slog::Level`] to a Sentry [`Level`]
5pub fn convert_log_level(level: slog::Level) -> Level {
6    match level {
7        slog::Level::Trace | slog::Level::Debug => Level::Debug,
8        slog::Level::Info => Level::Info,
9        slog::Level::Warning => Level::Warning,
10        slog::Level::Error | slog::Level::Critical => Level::Error,
11    }
12}
13
14/// Adds the data from a [`slog::KV`] into a Sentry [`Map`].
15fn add_kv_to_map(map: &mut Map<String, Value>, kv: &impl KV) {
16    let _ = (map, kv);
17    // TODO: actually implement this ;-)
18}
19
20/// Creates a Sentry [`Breadcrumb`] from the [`Record`].
21pub fn breadcrumb_from_record(record: &Record, values: &OwnedKVList) -> Breadcrumb {
22    let mut data = Map::new();
23    add_kv_to_map(&mut data, &record.kv());
24    add_kv_to_map(&mut data, values);
25
26    Breadcrumb {
27        ty: "log".into(),
28        message: Some(record.msg().to_string()),
29        level: convert_log_level(record.level()),
30        data,
31        ..Default::default()
32    }
33}
34
35/// Creates a simple message [`Event`] from the [`Record`].
36pub fn event_from_record(record: &Record, values: &OwnedKVList) -> Event<'static> {
37    let mut extra = Map::new();
38    add_kv_to_map(&mut extra, &record.kv());
39    add_kv_to_map(&mut extra, values);
40    Event {
41        message: Some(record.msg().to_string()),
42        level: convert_log_level(record.level()),
43        ..Default::default()
44    }
45}
46
47/// Creates an exception [`Event`] from the [`Record`].
48///
49/// The exception will have a stacktrace that corresponds to the location
50/// information contained in the [`Record`].
51///
52/// # Examples
53///
54/// ```
55/// use ckb_sentry_slog as sentry_slog;
56///
57/// let args = format_args!("");
58/// let record = slog::record!(slog::Level::Error, "", &args, slog::b!());
59/// let kv = slog::o!().into();
60/// let event = sentry_slog::exception_from_record(&record, &kv);
61///
62/// let frame = &event.exception.as_ref()[0]
63///     .stacktrace
64///     .as_ref()
65///     .unwrap()
66///     .frames[0];
67/// assert!(frame.lineno.unwrap() > 0);
68/// ```
69pub fn exception_from_record(record: &Record, values: &OwnedKVList) -> Event<'static> {
70    let mut event = event_from_record(record, values);
71    let frame = Frame {
72        function: Some(record.function().into()),
73        module: Some(record.module().into()),
74        filename: Some(record.file().into()),
75        lineno: Some(record.line().into()),
76        colno: Some(record.column().into()),
77        ..Default::default()
78    };
79    let exception = Exception {
80        ty: "slog::Record".into(),
81        stacktrace: Some(Stacktrace {
82            frames: vec![frame],
83            ..Default::default()
84        }),
85        ..Default::default()
86    };
87    event.exception = vec![exception].into();
88    event
89}