Merge pull request #1003 from zed-industries/moar-logs

Nathan Sobo created

Log JSON in Kubernetes

Change summary

Cargo.lock                              | 13 +++++++++++++
crates/collab/Cargo.toml                |  2 +-
crates/collab/k8s/manifest.template.yml |  2 ++
crates/collab/src/main.rs               | 24 +++++++++++++++++++-----
4 files changed, 35 insertions(+), 6 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -5333,6 +5333,16 @@ dependencies = [
  "tracing-subscriber",
 ]
 
+[[package]]
+name = "tracing-serde"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1"
+dependencies = [
+ "serde",
+ "tracing-core",
+]
+
 [[package]]
 name = "tracing-subscriber"
 version = "0.3.11"
@@ -5343,12 +5353,15 @@ dependencies = [
  "lazy_static",
  "matchers",
  "regex",
+ "serde",
+ "serde_json",
  "sharded-slab",
  "smallvec",
  "thread_local",
  "tracing",
  "tracing-core",
  "tracing-log",
+ "tracing-serde",
 ]
 
 [[package]]

crates/collab/Cargo.toml 🔗

@@ -45,7 +45,7 @@ toml = "0.5.8"
 tracing = "0.1.34"
 tracing-log = "0.1.3"
 tracing-opentelemetry = "0.17"
-tracing-subscriber = { version = "0.3.11", features = ["env-filter"] }
+tracing-subscriber = { version = "0.3.11", features = ["env-filter", "json"] }
 
 [dependencies.sqlx]
 version = "0.5.2"

crates/collab/k8s/manifest.template.yml 🔗

@@ -83,6 +83,8 @@ spec:
                   key: token
             - name: RUST_LOG
               value: ${RUST_LOG}
+            - name: LOG_JSON
+              value: "true"
             - name: HONEYCOMB_DATASET
               value: "collab"
             - name: HONEYCOMB_API_KEY

crates/collab/src/main.rs 🔗

@@ -12,7 +12,7 @@ use std::{
     sync::Arc,
 };
 use tracing_log::LogTracer;
-use tracing_subscriber::filter::EnvFilter;
+use tracing_subscriber::{filter::EnvFilter, fmt::format::JsonFields, Layer};
 use util::ResultExt;
 
 #[derive(Default, Deserialize)]
@@ -23,6 +23,7 @@ pub struct Config {
     pub honeycomb_api_key: Option<String>,
     pub honeycomb_dataset: Option<String>,
     pub rust_log: Option<String>,
+    pub log_json: Option<bool>,
 }
 
 pub struct AppState {
@@ -152,10 +153,23 @@ pub fn init_tracing(config: &Config) -> Option<()> {
 
     let subscriber = tracing_subscriber::Registry::default()
         .with(open_telemetry_layer)
-        .with(
-            tracing_subscriber::fmt::layer()
-                .event_format(tracing_subscriber::fmt::format().pretty()),
-        )
+        .with(if config.log_json.unwrap_or(false) {
+            Box::new(
+                tracing_subscriber::fmt::layer()
+                    .fmt_fields(JsonFields::default())
+                    .event_format(
+                        tracing_subscriber::fmt::format()
+                            .json()
+                            .flatten_event(true)
+                            .with_span_list(true),
+                    ),
+            ) as Box<dyn Layer<_> + Send + Sync>
+        } else {
+            Box::new(
+                tracing_subscriber::fmt::layer()
+                    .event_format(tracing_subscriber::fmt::format().pretty()),
+            )
+        })
         .with(EnvFilter::from_str(rust_log.as_str()).log_err()?);
 
     tracing::subscriber::set_global_default(subscriber).unwrap();