Wire up tracing crate to opentelemetry

Nathan Sobo created

Still need to

- Set a trace level and target via environment to avoid massive noise from other libraries
- Trace the operations we care about

Change summary

Cargo.lock                | 76 ++++++++++++++++++++++++++++++++++++++--
crates/collab/Cargo.toml  |  5 ++
crates/collab/src/main.rs | 34 ++++++++++-------
3 files changed, 95 insertions(+), 20 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -52,6 +52,15 @@ dependencies = [
  "winapi 0.3.9",
 ]
 
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi 0.3.9",
+]
+
 [[package]]
 name = "anyhow"
 version = "1.0.42"
@@ -690,7 +699,7 @@ version = "2.33.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
 dependencies = [
- "ansi_term",
+ "ansi_term 0.11.0",
  "atty",
  "bitflags",
  "strsim 0.8.0",
@@ -865,6 +874,9 @@ dependencies = [
  "toml",
  "tonic",
  "tower",
+ "tracing",
+ "tracing-opentelemetry",
+ "tracing-subscriber",
  "util",
  "workspace",
 ]
@@ -4252,6 +4264,15 @@ dependencies = [
  "digest 0.10.3",
 ]
 
+[[package]]
+name = "sharded-slab"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
+dependencies = [
+ "lazy_static",
+]
+
 [[package]]
 name = "shlex"
 version = "1.0.0"
@@ -4814,9 +4835,9 @@ checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820"
 
 [[package]]
 name = "thread_local"
-version = "1.1.3"
+version = "1.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd"
+checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180"
 dependencies = [
  "once_cell",
 ]
@@ -5167,11 +5188,12 @@ dependencies = [
 
 [[package]]
 name = "tracing-core"
-version = "0.1.18"
+version = "0.1.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052"
+checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f"
 dependencies = [
  "lazy_static",
+ "valuable",
 ]
 
 [[package]]
@@ -5184,6 +5206,44 @@ dependencies = [
  "tracing",
 ]
 
+[[package]]
+name = "tracing-log"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
+dependencies = [
+ "lazy_static",
+ "log",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-opentelemetry"
+version = "0.17.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f9378e96a9361190ae297e7f3a8ff644aacd2897f244b1ff81f381669196fa6"
+dependencies = [
+ "opentelemetry",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596"
+dependencies = [
+ "ansi_term 0.12.1",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing-core",
+ "tracing-log",
+]
+
 [[package]]
 name = "tree-sitter"
 version = "0.20.4"
@@ -5483,6 +5543,12 @@ dependencies = [
  "getrandom 0.2.2",
 ]
 
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
 [[package]]
 name = "value-bag"
 version = "1.0.0-alpha.8"

crates/collab/Cargo.toml 🔗

@@ -37,12 +37,15 @@ scrypt = "0.7"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 sha-1 = "0.9"
+time = "0.2"
 tokio = { version = "1", features = ["full"] }
 tokio-tungstenite = "0.17"
 tonic = "0.6"
 tower = "0.4"
-time = "0.2"
 toml = "0.5.8"
+tracing = "0.1"
+tracing-opentelemetry = "0.17"
+tracing-subscriber = "0.3"
 
 [dependencies.sqlx]
 version = "0.5.2"

crates/collab/src/main.rs 🔗

@@ -6,10 +6,6 @@ mod rpc;
 
 use axum::{body::Body, http::StatusCode, response::IntoResponse, Router};
 use db::{Db, PostgresDb};
-use opentelemetry::{
-    trace::{get_active_span, Tracer},
-    KeyValue,
-};
 use serde::Deserialize;
 use std::{
     net::{SocketAddr, TcpListener},
@@ -60,13 +56,11 @@ async fn main() -> Result<()> {
     init_tracing(&config);
     let state = AppState::new(&config).await?;
 
-    let tracer = opentelemetry::global::tracer("");
-    tracer.in_span("testing", |_| {
-        get_active_span(|span| {
-            span.set_attribute(KeyValue::new("foo", "bar"));
-        });
-        log::info!("testing in span");
-    });
+    {
+        let root = tracing::span!(tracing::Level::TRACE, "testing_1", work_units = 2_i32);
+        let _enter = root.enter();
+        tracing::error!("test_error_1");
+    }
 
     let listener = TcpListener::bind(&format!("0.0.0.0:{}", config.http_port))
         .expect("failed to bind TCP listener");
@@ -128,7 +122,11 @@ impl std::fmt::Display for Error {
 }
 
 pub fn init_tracing(config: &Config) -> Option<()> {
+    use opentelemetry::KeyValue;
     use opentelemetry_otlp::WithExportConfig;
+    use tracing_opentelemetry::OpenTelemetryLayer;
+    use tracing_subscriber::layer::SubscriberExt;
+
     let (honeycomb_api_key, honeycomb_dataset) = config
         .honeycomb_api_key
         .clone()
@@ -136,8 +134,7 @@ pub fn init_tracing(config: &Config) -> Option<()> {
 
     let mut metadata = tonic::metadata::MetadataMap::new();
     metadata.insert("x-honeycomb-team", honeycomb_api_key.parse().unwrap());
-    metadata.insert("x-honeycomb-dataset", honeycomb_dataset.parse().unwrap());
-    opentelemetry_otlp::new_pipeline()
+    let tracer = opentelemetry_otlp::new_pipeline()
         .tracing()
         .with_exporter(
             opentelemetry_otlp::new_exporter()
@@ -146,10 +143,19 @@ pub fn init_tracing(config: &Config) -> Option<()> {
                 .with_metadata(metadata),
         )
         .with_trace_config(opentelemetry::sdk::trace::config().with_resource(
-            opentelemetry::sdk::Resource::new(vec![KeyValue::new("service.name", "collab")]),
+            opentelemetry::sdk::Resource::new(vec![KeyValue::new(
+                "service.name",
+                honeycomb_dataset,
+            )]),
         ))
         .install_batch(opentelemetry::runtime::Tokio)
         .expect("failed to initialize tracing");
 
+    let subscriber = tracing_subscriber::Registry::default()
+        .with(OpenTelemetryLayer::new(tracer))
+        .with(tracing_subscriber::fmt::layer());
+
+    tracing::subscriber::set_global_default(subscriber).unwrap();
+
     None
 }