Skip to main content

tracing_gcloud_layer/
default_mapper.rs

1use serde_json::{Value, json};
2
3use crate::{
4    extract_trace_id, get_severity,
5    google_logger::{LogContext, LogMapper},
6    log_entry::{Labels, Resource},
7};
8
9#[derive(Clone, Debug, Default)]
10pub struct DefaultLogMapper;
11
12impl LogMapper for DefaultLogMapper {
13    fn map(&self, context: LogContext, log_entry: Value) -> Value {
14        let log_name = format!("projects/{}/logs/{}", context.project_id, context.log_label);
15
16        let trace_id =
17            extract_trace_id(&log_entry).unwrap_or_else(|| json!("trace_id is undefined"));
18
19        json!({
20            "log_name": log_name,
21            "resource": Resource::new_global(context.project_id.to_string()),
22            "severity": get_severity(&log_entry),
23            "timestamp": log_entry
24                .get("time")
25                .cloned()
26                .unwrap_or_else(|| json!(chrono::Utc::now().to_rfc3339())),
27            "json_payload": log_entry,
28            "trace": trace_id.clone(),
29            "labels": Labels {
30                context: context.log_label.to_string(),
31                request_id: trace_id,
32            },
33        })
34    }
35}