From 2db20c43642b1b449340ab1abc70b0c6d3f73022 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 22 Apr 2022 11:55:10 -0600 Subject: [PATCH 01/17] Introduce opentelemetry to `collab` Co-Authored-By: Nathan Sobo --- .zed.toml | 2 +- Cargo.lock | 295 ++++++++++++++++++++++++++++++++++---- crates/collab/Cargo.toml | 3 + crates/collab/src/main.rs | 40 +++++- 4 files changed, 308 insertions(+), 32 deletions(-) diff --git a/.zed.toml b/.zed.toml index fae32125f4..7738669efb 100644 --- a/.zed.toml +++ b/.zed.toml @@ -1 +1 @@ -collaborators = ["nathansobo", "as-cii", "maxbrunsfeld", "iamnbutler", "gibusu", "Kethku"] +collaborators = ["nathansobo", "as-cii", "maxbrunsfeld", "iamnbutler", "gibusu", "Kethku", "chrismwendt"] diff --git a/Cargo.lock b/Cargo.lock index 781c534a19..6ea6b80244 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -123,7 +123,7 @@ dependencies = [ "futures-core", "futures-io", "memchr", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", ] [[package]] @@ -228,6 +228,27 @@ dependencies = [ "syn", ] +[[package]] +name = "async-stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" +dependencies = [ + "async-stream-impl", + "futures-core", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "async-task" version = "4.0.3" @@ -267,7 +288,7 @@ dependencies = [ "futures-io", "futures-util", "log", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "tungstenite 0.16.0", ] @@ -339,9 +360,9 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "axum" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f523b4e98ba6897ae90994bc18423d9877c54f9047b06a00ddc8122a957b1c70" +checksum = "f4af7447fc1214c1f3a1ace861d0216a6c8bb13965b64bbad9650f375b67689a" dependencies = [ "async-trait", "axum-core", @@ -358,7 +379,7 @@ dependencies = [ "memchr", "mime", "percent-encoding", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "serde", "serde_json", "serde_urlencoded", @@ -374,9 +395,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3ddbd16eabff8b45f21b98671fddcc93daaa7ac4c84f8473693437226040de5" +checksum = "3bdc19781b16e32f8a7200368a336fa4509d4b72ef15dd4e41df5290855ee1e6" dependencies = [ "async-trait", "bytes", @@ -816,6 +837,8 @@ dependencies = [ "lipsum", "log", "lsp", + "opentelemetry", + "opentelemetry-otlp", "parking_lot", "project", "rand 0.8.3", @@ -831,6 +854,7 @@ dependencies = [ "tokio", "tokio-tungstenite", "toml", + "tonic", "tower", "util", "workspace", @@ -1459,6 +1483,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" +[[package]] +name = "fixedbitset" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" + [[package]] name = "flate2" version = "1.0.20" @@ -1676,7 +1706,7 @@ dependencies = [ "futures-io", "memchr", "parking", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "waker-fn", ] @@ -1716,7 +1746,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "pin-utils", "slab", ] @@ -1883,6 +1913,25 @@ dependencies = [ "syn", ] +[[package]] +name = "h2" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util 0.7.1", + "tracing", +] + [[package]] name = "hashbrown" version = "0.9.1" @@ -2010,7 +2059,7 @@ checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" dependencies = [ "bytes", "http", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", ] [[package]] @@ -2047,12 +2096,13 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", + "h2", "http", "http-body", "httparse", "httpdate", "itoa 1.0.1", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "socket2 0.4.0", "tokio", "tower-service", @@ -2060,6 +2110,18 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite 0.2.9", + "tokio", + "tokio-io-timeout", +] + [[package]] name = "idna" version = "0.2.3" @@ -2880,6 +2942,45 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "opentelemetry" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" +dependencies = [ + "async-trait", + "crossbeam-channel 0.5.0", + "futures-channel", + "futures-executor", + "futures-util", + "js-sys", + "lazy_static", + "percent-encoding", + "pin-project", + "rand 0.8.3", + "thiserror", + "tokio", + "tokio-stream", +] + +[[package]] +name = "opentelemetry-otlp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1a6ca9de4c8b00aa7f1a153bd76cb263287155cec642680d79d98706f3d28a" +dependencies = [ + "async-trait", + "futures", + "futures-util", + "http", + "opentelemetry", + "prost 0.9.0", + "thiserror", + "tokio", + "tonic", + "tonic-build", +] + [[package]] name = "ordered-float" version = "2.1.1" @@ -3023,7 +3124,17 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" dependencies = [ - "fixedbitset", + "fixedbitset 0.2.0", + "indexmap", +] + +[[package]] +name = "petgraph" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" +dependencies = [ + "fixedbitset 0.4.1", "indexmap", ] @@ -3076,9 +3187,9 @@ checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -3280,7 +3391,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de5e2533f59d08fcf364fd374ebda0692a70bd6d7e66ef97f306f45c6c5d8020" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.8.0", +] + +[[package]] +name = "prost" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +dependencies = [ + "bytes", + "prost-derive 0.9.0", ] [[package]] @@ -3294,9 +3415,29 @@ dependencies = [ "itertools", "log", "multimap", - "petgraph", - "prost", - "prost-types", + "petgraph 0.5.1", + "prost 0.8.0", + "prost-types 0.8.0", + "tempfile", + "which 4.1.0", +] + +[[package]] +name = "prost-build" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" +dependencies = [ + "bytes", + "heck 0.3.3", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph 0.6.0", + "prost 0.9.0", + "prost-types 0.9.0", + "regex", "tempfile", "which 4.1.0", ] @@ -3314,6 +3455,19 @@ dependencies = [ "syn", ] +[[package]] +name = "prost-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "prost-types" version = "0.8.0" @@ -3321,7 +3475,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "603bbd6394701d13f3f25aada59c7de9d35a6a5887cfc156181234a44002771b" dependencies = [ "bytes", - "prost", + "prost 0.8.0", +] + +[[package]] +name = "prost-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" +dependencies = [ + "bytes", + "prost 0.9.0", ] [[package]] @@ -3596,8 +3760,8 @@ dependencies = [ "gpui", "log", "parking_lot", - "prost", - "prost-build", + "prost 0.8.0", + "prost-build 0.8.0", "rand 0.8.3", "rsa", "serde", @@ -4742,12 +4906,22 @@ dependencies = [ "num_cpus", "once_cell", "parking_lot", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "signal-hook-registry", "tokio-macros", "winapi 0.3.9", ] +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite 0.2.9", + "tokio", +] + [[package]] name = "tokio-macros" version = "1.7.0" @@ -4777,7 +4951,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" dependencies = [ "futures-core", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "tokio", ] @@ -4793,6 +4967,20 @@ dependencies = [ "tungstenite 0.17.2", ] +[[package]] +name = "tokio-util" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite 0.2.9", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.1" @@ -4802,8 +4990,9 @@ dependencies = [ "bytes", "futures-core", "futures-sink", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "tokio", + "tracing", ] [[package]] @@ -4815,6 +5004,49 @@ dependencies = [ "serde", ] +[[package]] +name = "tonic" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff08f4649d10a70ffa3522ca559031285d8e421d727ac85c60825761818f5d0a" +dependencies = [ + "async-stream", + "async-trait", + "base64 0.13.0", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.9.0", + "prost-derive 0.9.0", + "tokio", + "tokio-stream", + "tokio-util 0.6.9", + "tower", + "tower-layer", + "tower-service", + "tracing", + "tracing-futures", +] + +[[package]] +name = "tonic-build" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757" +dependencies = [ + "proc-macro2", + "prost-build 0.9.0", + "quote", + "syn", +] + [[package]] name = "tower" version = "0.4.12" @@ -4823,10 +5055,13 @@ checksum = "9a89fd63ad6adf737582df5db40d286574513c69a11dac5214dc3b5603d6713e" dependencies = [ "futures-core", "futures-util", + "indexmap", "pin-project", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", + "rand 0.8.3", + "slab", "tokio", - "tokio-util", + "tokio-util 0.7.1", "tower-layer", "tower-service", "tracing", @@ -4834,9 +5069,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.2.5" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8" +checksum = "79dd37121c38240c4b4fe6520332406218bbf876f2f690fe9e406020189366fd" dependencies = [ "bitflags", "bytes", @@ -4845,7 +5080,7 @@ dependencies = [ "http", "http-body", "http-range-header", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "tower", "tower-layer", "tower-service", @@ -4871,7 +5106,7 @@ checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if 1.0.0", "log", - "pin-project-lite 0.2.8", + "pin-project-lite 0.2.9", "tracing-attributes", "tracing-core", ] diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index a9c617667e..856438c40c 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -29,6 +29,8 @@ json_env_logger = "0.1" lazy_static = "1.4" lipsum = { version = "0.8", optional = true } log = { version = "0.4.16", features = ["kv_unstable_serde"] } +opentelemetry = { version = "0.17", features = ["rt-tokio"] } +opentelemetry-otlp = { version = "0.10" } parking_lot = "0.11.1" rand = "0.8" scrypt = "0.7" @@ -37,6 +39,7 @@ serde_json = "1.0" sha-1 = "0.9" tokio = { version = "1", features = ["full"] } tokio-tungstenite = "0.17" +tonic = "0.6" tower = "0.4" time = "0.2" toml = "0.5.8" diff --git a/crates/collab/src/main.rs b/crates/collab/src/main.rs index f0250a6835..dd74258f27 100644 --- a/crates/collab/src/main.rs +++ b/crates/collab/src/main.rs @@ -6,7 +6,10 @@ 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}, @@ -18,6 +21,8 @@ pub struct Config { pub http_port: u16, pub database_url: String, pub api_token: String, + pub honeycomb_api_key: Option, + pub honeycomb_dataset: Option, } pub struct AppState { @@ -52,8 +57,17 @@ async fn main() -> Result<()> { } let config = envy::from_env::().expect("error loading config"); + 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 listener = TcpListener::bind(&format!("0.0.0.0:{}", config.http_port)) .expect("failed to bind TCP listener"); @@ -112,3 +126,27 @@ impl std::fmt::Display for Error { } } } + +pub fn init_tracing(config: &Config) -> Option<()> { + use opentelemetry_otlp::WithExportConfig; + let (honeycomb_api_key, honeycomb_dataset) = config + .honeycomb_api_key + .clone() + .zip(config.honeycomb_dataset.clone())?; + + 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() + .tracing() + .with_exporter( + opentelemetry_otlp::new_exporter() + .tonic() + .with_endpoint("api.honeycomb.io:443") + .with_metadata(metadata), + ) + .install_batch(opentelemetry::runtime::Tokio) + .expect("failed to initialize tracing"); + + None +} From 36b462182b7efab59a0533f4f84d21992265c123 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 27 Apr 2022 09:58:55 -0600 Subject: [PATCH 02/17] Send telemetry to Honeycomb via GRPC We updated the core-foundation crates because Tonic (the GRPC crate) relies on a newer version of core foundation to find TLS root certificates. Co-Authored-By: Antonio Scandurra --- Cargo.lock | 81 ++++++++++++++++++++++++++++++--------- Cargo.toml | 10 ++--- crates/collab/Cargo.toml | 2 +- crates/collab/src/main.rs | 5 ++- crates/gpui/Cargo.toml | 4 +- 5 files changed, 74 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6ea6b80244..3735b3e7d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -115,9 +115,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.3.8" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443ccbb270374a2b1055fc72da40e1f237809cd6bb0e97e66d264cd138473a6" +checksum = "f2bf394cfbbe876f0ac67b13b6ca819f9c9f2fb9ec67223cceb1555fbab1c31a" dependencies = [ "flate2", "futures-core", @@ -701,16 +701,16 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.8" +version = "3.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71c47df61d9e16dc010b55dba1952a57d8c215dbb533fd13cdd13369aac73b1c" +checksum = "7c167e37342afc5f33fd87bbc870cedd020d2a6dffa05d45ccd9241fbdd146db" dependencies = [ "atty", "bitflags", "clap_derive", + "clap_lex", "indexmap", "lazy_static", - "os_str_bytes", "strsim 0.10.0", "termcolor", "textwrap 0.15.0", @@ -729,12 +729,21 @@ dependencies = [ "syn", ] +[[package]] +name = "clap_lex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "cli" version = "0.1.0" dependencies = [ "anyhow", - "clap 3.1.8", + "clap 3.1.12", "core-foundation", "core-services", "dirs 3.0.1", @@ -788,7 +797,7 @@ dependencies = [ [[package]] name = "cocoa" version = "0.24.0" -source = "git+https://github.com/servo/core-foundation-rs?rev=025dcb3c0d1ef01530f57ef65f3b1deb948f5737#025dcb3c0d1ef01530f57ef65f3b1deb948f5737" +source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85" dependencies = [ "bitflags", "block", @@ -802,8 +811,8 @@ dependencies = [ [[package]] name = "cocoa-foundation" -version = "0.1.0" -source = "git+https://github.com/servo/core-foundation-rs?rev=025dcb3c0d1ef01530f57ef65f3b1deb948f5737#025dcb3c0d1ef01530f57ef65f3b1deb948f5737" +version = "0.1.1" +source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85" dependencies = [ "bitflags", "block", @@ -919,8 +928,8 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.1" -source = "git+https://github.com/servo/core-foundation-rs?rev=025dcb3c0d1ef01530f57ef65f3b1deb948f5737#025dcb3c0d1ef01530f57ef65f3b1deb948f5737" +version = "0.9.3" +source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85" dependencies = [ "core-foundation-sys", "libc", @@ -928,13 +937,13 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.2" -source = "git+https://github.com/servo/core-foundation-rs?rev=025dcb3c0d1ef01530f57ef65f3b1deb948f5737#025dcb3c0d1ef01530f57ef65f3b1deb948f5737" +version = "0.8.3" +source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85" [[package]] name = "core-graphics" -version = "0.22.2" -source = "git+https://github.com/servo/core-foundation-rs?rev=025dcb3c0d1ef01530f57ef65f3b1deb948f5737#025dcb3c0d1ef01530f57ef65f3b1deb948f5737" +version = "0.22.3" +source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85" dependencies = [ "bitflags", "core-foundation", @@ -946,7 +955,7 @@ dependencies = [ [[package]] name = "core-graphics-types" version = "0.1.1" -source = "git+https://github.com/servo/core-foundation-rs?rev=025dcb3c0d1ef01530f57ef65f3b1deb948f5737#025dcb3c0d1ef01530f57ef65f3b1deb948f5737" +source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85" dependencies = [ "bitflags", "core-foundation", @@ -2995,9 +3004,6 @@ name = "os_str_bytes" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" -dependencies = [ - "memchr", -] [[package]] name = "outline" @@ -3861,6 +3867,18 @@ dependencies = [ "webpki", ] +[[package]] +name = "rustls-native-certs" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +dependencies = [ + "openssl-probe", + "rustls", + "schannel", + "security-framework", +] + [[package]] name = "rustybuzz" version = "0.3.0" @@ -4019,6 +4037,29 @@ dependencies = [ "workspace", ] +[[package]] +name = "security-framework" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "0.9.0" @@ -5025,7 +5066,9 @@ dependencies = [ "pin-project", "prost 0.9.0", "prost-derive 0.9.0", + "rustls-native-certs", "tokio", + "tokio-rustls", "tokio-stream", "tokio-util 0.6.9", "tower", diff --git a/Cargo.toml b/Cargo.toml index 91c4439be0..c4ae77606c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,11 +6,11 @@ resolver = "2" [patch.crates-io] async-task = { git = "https://github.com/zed-industries/async-task", rev = "341b57d6de98cdfd7b418567b8de2022ca993a6e" } # TODO - Remove when a version is released with this PR: https://github.com/servo/core-foundation-rs/pull/457 -cocoa = { git = "https://github.com/servo/core-foundation-rs", rev = "025dcb3c0d1ef01530f57ef65f3b1deb948f5737" } -cocoa-foundation = { git = "https://github.com/servo/core-foundation-rs", rev = "025dcb3c0d1ef01530f57ef65f3b1deb948f5737" } -core-foundation = { git = "https://github.com/servo/core-foundation-rs", rev = "025dcb3c0d1ef01530f57ef65f3b1deb948f5737" } -core-foundation-sys = { git = "https://github.com/servo/core-foundation-rs", rev = "025dcb3c0d1ef01530f57ef65f3b1deb948f5737" } -core-graphics = { git = "https://github.com/servo/core-foundation-rs", rev = "025dcb3c0d1ef01530f57ef65f3b1deb948f5737" } +cocoa = { git = "https://github.com/servo/core-foundation-rs", rev = "079665882507dd5e2ff77db3de5070c1f6c0fb85" } +cocoa-foundation = { git = "https://github.com/servo/core-foundation-rs", rev = "079665882507dd5e2ff77db3de5070c1f6c0fb85" } +core-foundation = { git = "https://github.com/servo/core-foundation-rs", rev = "079665882507dd5e2ff77db3de5070c1f6c0fb85" } +core-foundation-sys = { git = "https://github.com/servo/core-foundation-rs", rev = "079665882507dd5e2ff77db3de5070c1f6c0fb85" } +core-graphics = { git = "https://github.com/servo/core-foundation-rs", rev = "079665882507dd5e2ff77db3de5070c1f6c0fb85" } [profile.dev] split-debuginfo = "unpacked" diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index 856438c40c..e1c77ac3ec 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -30,7 +30,7 @@ lazy_static = "1.4" lipsum = { version = "0.8", optional = true } log = { version = "0.4.16", features = ["kv_unstable_serde"] } opentelemetry = { version = "0.17", features = ["rt-tokio"] } -opentelemetry-otlp = { version = "0.10" } +opentelemetry-otlp = { version = "0.10", features = ["tls-roots"] } parking_lot = "0.11.1" rand = "0.8" scrypt = "0.7" diff --git a/crates/collab/src/main.rs b/crates/collab/src/main.rs index dd74258f27..f07c91e272 100644 --- a/crates/collab/src/main.rs +++ b/crates/collab/src/main.rs @@ -142,9 +142,12 @@ pub fn init_tracing(config: &Config) -> Option<()> { .with_exporter( opentelemetry_otlp::new_exporter() .tonic() - .with_endpoint("api.honeycomb.io:443") + .with_endpoint("https://api.honeycomb.io") .with_metadata(metadata), ) + .with_trace_config(opentelemetry::sdk::trace::config().with_resource( + opentelemetry::sdk::Resource::new(vec![KeyValue::new("service.name", "collab")]), + )) .install_batch(opentelemetry::runtime::Tokio) .expect("failed to initialize tracing"); diff --git a/crates/gpui/Cargo.toml b/crates/gpui/Cargo.toml index 442a2b5b2f..c426ad869a 100644 --- a/crates/gpui/Cargo.toml +++ b/crates/gpui/Cargo.toml @@ -62,8 +62,8 @@ simplelog = "0.9" anyhow = "1" block = "0.1" cocoa = "0.24" -core-foundation = "0.9" -core-graphics = "0.22.2" +core-foundation = "0.9.3" +core-graphics = "0.22.3" core-text = "19.2" font-kit = { git = "https://github.com/zed-industries/font-kit", rev = "8eaf7a918eafa28b0a37dc759e2e0e7683fa24f1" } foreign-types = "0.3" From 6a21a0f6b8142ae27d3ff04a235be9ec3b95fa85 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 27 Apr 2022 11:48:43 -0600 Subject: [PATCH 03/17] Wire up tracing crate to opentelemetry Still need to - Set a trace level and target via environment to avoid massive noise from other libraries - Trace the operations we care about --- Cargo.lock | 76 ++++++++++++++++++++++++++++++++++++--- crates/collab/Cargo.toml | 5 ++- crates/collab/src/main.rs | 34 ++++++++++-------- 3 files changed, 95 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3735b3e7d5..05a70f6230 100644 --- a/Cargo.lock +++ b/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" diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index e1c77ac3ec..741bc72b6c 100644 --- a/crates/collab/Cargo.toml +++ b/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" diff --git a/crates/collab/src/main.rs b/crates/collab/src/main.rs index f07c91e272..09467558da 100644 --- a/crates/collab/src/main.rs +++ b/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 } From 2db670308bb58b090440a16d2967c54146ab8318 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 27 Apr 2022 15:26:54 -0600 Subject: [PATCH 04/17] Allow tracing level to be customized --- crates/collab/src/main.rs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/crates/collab/src/main.rs b/crates/collab/src/main.rs index 09467558da..82176a53ca 100644 --- a/crates/collab/src/main.rs +++ b/crates/collab/src/main.rs @@ -11,6 +11,7 @@ use std::{ net::{SocketAddr, TcpListener}, sync::Arc, }; +use tracing::metadata::LevelFilter; #[derive(Default, Deserialize)] pub struct Config { @@ -19,6 +20,7 @@ pub struct Config { pub api_token: String, pub honeycomb_api_key: Option, pub honeycomb_dataset: Option, + pub trace_level: Option, } pub struct AppState { @@ -56,12 +58,6 @@ async fn main() -> Result<()> { init_tracing(&config); let state = AppState::new(&config).await?; - { - 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"); @@ -124,6 +120,7 @@ impl std::fmt::Display for Error { pub fn init_tracing(config: &Config) -> Option<()> { use opentelemetry::KeyValue; use opentelemetry_otlp::WithExportConfig; + use std::str::FromStr; use tracing_opentelemetry::OpenTelemetryLayer; use tracing_subscriber::layer::SubscriberExt; @@ -153,7 +150,15 @@ pub fn init_tracing(config: &Config) -> Option<()> { let subscriber = tracing_subscriber::Registry::default() .with(OpenTelemetryLayer::new(tracer)) - .with(tracing_subscriber::fmt::layer()); + .with(tracing_subscriber::fmt::layer()) + .with( + config + .trace_level + .as_ref() + .map_or(LevelFilter::INFO, |level| { + LevelFilter::from_str(level).unwrap() + }), + ); tracing::subscriber::set_global_default(subscriber).unwrap(); From 6ef2d0fbec8c05c1a92212aaf296825df66f1c30 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 27 Apr 2022 15:27:01 -0600 Subject: [PATCH 05/17] Trace handling of messages --- crates/collab/src/rpc.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 6c4775ba6d..8b77eba260 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -47,6 +47,7 @@ use tokio::{ time::Sleep, }; use tower::ServiceBuilder; +use tracing::info_span; use util::ResultExt; type MessageHandler = Box< @@ -156,7 +157,11 @@ impl Server { TypeId::of::(), Box::new(move |server, envelope| { let envelope = envelope.into_any().downcast::>().unwrap(); - (handler)(server, *envelope).boxed() + let span = info_span!( + "handle message", + payload_type = envelope.payload_type_name() + ); + span.in_scope(|| (handler)(server, *envelope).boxed()) }), ); if prev_handler.is_some() { From dc28305c9f83a46f3baa5edab4f55bba9400c966 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 28 Apr 2022 08:48:57 -0600 Subject: [PATCH 06/17] Assign tracing-related environment variables in Kubernetes Co-Authored-By: Antonio Scandurra --- crates/collab/k8s/environments/production.sh | 1 + crates/collab/k8s/environments/staging.sh | 1 + crates/collab/k8s/manifest.template.yml | 9 +++++++++ 3 files changed, 11 insertions(+) diff --git a/crates/collab/k8s/environments/production.sh b/crates/collab/k8s/environments/production.sh index 331019bd40..5f71d201fb 100644 --- a/crates/collab/k8s/environments/production.sh +++ b/crates/collab/k8s/environments/production.sh @@ -1 +1,2 @@ ZED_ENVIRONMENT=production +TRACE_LEVEL=debug diff --git a/crates/collab/k8s/environments/staging.sh b/crates/collab/k8s/environments/staging.sh index 0feacbadf6..0d93902680 100644 --- a/crates/collab/k8s/environments/staging.sh +++ b/crates/collab/k8s/environments/staging.sh @@ -1 +1,2 @@ ZED_ENVIRONMENT=staging +TRACE_LEVEL=debug diff --git a/crates/collab/k8s/manifest.template.yml b/crates/collab/k8s/manifest.template.yml index f243a0adac..848d06ec49 100644 --- a/crates/collab/k8s/manifest.template.yml +++ b/crates/collab/k8s/manifest.template.yml @@ -85,6 +85,15 @@ spec: value: "1" - name: RUST_LOG value: "trace" + - name: TRACE_LEVEL + value: ${TRACE_LEVEL} + - name: HONEYCOMB_DATASET + value: "collab" + - name: HONEYCOMB_API_KEY + valueFrom: + secretKeyRef: + name: honeycomb + key: apiKey securityContext: capabilities: # FIXME - Switch to the more restrictive `PERFMON` capability. From a3640eb8d4794c3c7061202ad83ef37545487219 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 28 Apr 2022 09:09:54 -0600 Subject: [PATCH 07/17] Correctly trace async message handling Co-Authored-By: Antonio Scandurra --- crates/collab/src/rpc.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 8b77eba260..60df2b8447 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -47,7 +47,7 @@ use tokio::{ time::Sleep, }; use tower::ServiceBuilder; -use tracing::info_span; +use tracing::{info_span, Instrument}; use util::ResultExt; type MessageHandler = Box< @@ -161,7 +161,7 @@ impl Server { "handle message", payload_type = envelope.payload_type_name() ); - span.in_scope(|| (handler)(server, *envelope).boxed()) + (handler)(server, *envelope).instrument(span).boxed() }), ); if prev_handler.is_some() { From 2d9d30f74af0efb033709c3887581a6375f8b887 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 28 Apr 2022 09:10:09 -0600 Subject: [PATCH 08/17] Set log level to info on Kubernetes Co-Authored-By: Antonio Scandurra --- crates/collab/k8s/environments/production.sh | 1 + crates/collab/k8s/environments/staging.sh | 1 + crates/collab/k8s/manifest.template.yml | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/collab/k8s/environments/production.sh b/crates/collab/k8s/environments/production.sh index 5f71d201fb..bac7fbedf7 100644 --- a/crates/collab/k8s/environments/production.sh +++ b/crates/collab/k8s/environments/production.sh @@ -1,2 +1,3 @@ ZED_ENVIRONMENT=production +RUST_LOG=info TRACE_LEVEL=debug diff --git a/crates/collab/k8s/environments/staging.sh b/crates/collab/k8s/environments/staging.sh index 0d93902680..ed7121715d 100644 --- a/crates/collab/k8s/environments/staging.sh +++ b/crates/collab/k8s/environments/staging.sh @@ -1,2 +1,3 @@ ZED_ENVIRONMENT=staging +RUST_LOG=info TRACE_LEVEL=debug diff --git a/crates/collab/k8s/manifest.template.yml b/crates/collab/k8s/manifest.template.yml index 848d06ec49..d3f398c473 100644 --- a/crates/collab/k8s/manifest.template.yml +++ b/crates/collab/k8s/manifest.template.yml @@ -84,7 +84,7 @@ spec: - name: LOG_JSON value: "1" - name: RUST_LOG - value: "trace" + value: ${RUST_LOG} - name: TRACE_LEVEL value: ${TRACE_LEVEL} - name: HONEYCOMB_DATASET From 1fe964ac16feace7d518064ad76d374ff5df0a46 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 28 Apr 2022 09:45:59 -0600 Subject: [PATCH 09/17] Start moving from logging to tracing on collab server Install some spans. Probably more work to do here. Co-Authored-By: Antonio Scandurra --- Cargo.lock | 55 ++++-------------- crates/collab/Cargo.toml | 1 - crates/collab/k8s/manifest.template.yml | 2 - crates/collab/src/db.rs | 6 ++ crates/collab/src/main.rs | 6 +- crates/collab/src/rpc.rs | 74 +++++++++++++------------ crates/collab/src/rpc/store.rs | 3 + crates/util/src/lib.rs | 1 + 8 files changed, 63 insertions(+), 85 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 05a70f6230..71eda5f640 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -474,7 +474,7 @@ dependencies = [ "cexpr", "clang-sys", "clap 2.33.3", - "env_logger 0.8.3", + "env_logger", "lazy_static", "lazycell", "log", @@ -845,11 +845,10 @@ dependencies = [ "collections", "ctor", "editor", - "env_logger 0.8.3", + "env_logger", "envy", "futures", "gpui", - "json_env_logger", "language", "lazy_static", "lipsum", @@ -900,7 +899,7 @@ version = "0.1.0" dependencies = [ "ctor", "editor", - "env_logger 0.8.3", + "env_logger", "fuzzy", "gpui", "picker", @@ -1349,7 +1348,7 @@ dependencies = [ "clock", "collections", "ctor", - "env_logger 0.8.3", + "env_logger", "futures", "fuzzy", "gpui", @@ -1395,15 +1394,6 @@ dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "log", -] - [[package]] name = "env_logger" version = "0.8.3" @@ -1485,7 +1475,7 @@ version = "0.1.0" dependencies = [ "ctor", "editor", - "env_logger 0.8.3", + "env_logger", "fuzzy", "gpui", "picker", @@ -1889,7 +1879,7 @@ dependencies = [ "core-text", "ctor", "dhat", - "env_logger 0.8.3", + "env_logger", "etagere", "font-kit", "foreign-types", @@ -2341,18 +2331,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41ee439ee368ba4a77ac70d04f14015415af8600d6c894dc1f11bd79758c57d5" -[[package]] -name = "json_env_logger" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2ec540ea0448b187d3a8b4a9f13e75527d06ef76b3a2baa1cd982aecb62ce2" -dependencies = [ - "env_logger 0.7.1", - "kv-log-macro", - "log", - "serde_json", -] - [[package]] name = "kernel32-sys" version = "0.2.2" @@ -2372,15 +2350,6 @@ dependencies = [ "arrayvec 0.5.2", ] -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - [[package]] name = "language" version = "0.1.0" @@ -2392,7 +2361,7 @@ dependencies = [ "clock", "collections", "ctor", - "env_logger 0.8.3", + "env_logger", "futures", "fuzzy", "gpui", @@ -2559,7 +2528,7 @@ dependencies = [ "async-pipe", "collections", "ctor", - "env_logger 0.8.3", + "env_logger", "futures", "gpui", "log", @@ -3162,7 +3131,7 @@ version = "0.1.0" dependencies = [ "ctor", "editor", - "env_logger 0.8.3", + "env_logger", "gpui", "serde_json", "settings", @@ -4632,7 +4601,7 @@ version = "0.1.0" dependencies = [ "arrayvec 0.7.1", "ctor", - "env_logger 0.8.3", + "env_logger", "log", "rand 0.8.3", ] @@ -4749,7 +4718,7 @@ dependencies = [ "clock", "collections", "ctor", - "env_logger 0.8.3", + "env_logger", "gpui", "lazy_static", "log", @@ -5903,7 +5872,7 @@ dependencies = [ "dirs 3.0.1", "easy-parallel", "editor", - "env_logger 0.8.3", + "env_logger", "file_finder", "fsevent", "futures", diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index 741bc72b6c..feeed1ba6c 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -25,7 +25,6 @@ base64 = "0.13" envy = "0.4.2" env_logger = "0.8" futures = "0.3" -json_env_logger = "0.1" lazy_static = "1.4" lipsum = { version = "0.8", optional = true } log = { version = "0.4.16", features = ["kv_unstable_serde"] } diff --git a/crates/collab/k8s/manifest.template.yml b/crates/collab/k8s/manifest.template.yml index d3f398c473..2e9f0ae298 100644 --- a/crates/collab/k8s/manifest.template.yml +++ b/crates/collab/k8s/manifest.template.yml @@ -81,8 +81,6 @@ spec: secretKeyRef: name: api key: token - - name: LOG_JSON - value: "1" - name: RUST_LOG value: ${RUST_LOG} - name: TRACE_LEVEL diff --git a/crates/collab/src/db.rs b/crates/collab/src/db.rs index 737929db4d..28375b6685 100644 --- a/crates/collab/src/db.rs +++ b/crates/collab/src/db.rs @@ -431,6 +431,12 @@ macro_rules! id_type { self.0 as u64 } } + + impl std::fmt::Display for $name { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + self.0.fmt(f) + } + } }; } diff --git a/crates/collab/src/main.rs b/crates/collab/src/main.rs index 82176a53ca..d7f8905a9a 100644 --- a/crates/collab/src/main.rs +++ b/crates/collab/src/main.rs @@ -41,11 +41,7 @@ impl AppState { #[tokio::main] async fn main() -> Result<()> { - if std::env::var("LOG_JSON").is_ok() { - json_env_logger::init(); - } else { - env_logger::init(); - } + env_logger::init(); if let Err(error) = env::load_dotenv() { log::error!( diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 60df2b8447..9c00c930c9 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -25,7 +25,6 @@ use axum::{ use collections::{HashMap, HashSet}; use futures::{channel::mpsc, future::BoxFuture, FutureExt, SinkExt, StreamExt, TryStreamExt}; use lazy_static::lazy_static; -use log::{as_debug, as_display}; use rpc::{ proto::{self, AnyTypedEnvelope, EntityMessage, EnvelopedMessage, RequestMessage}, Connection, ConnectionId, Peer, TypedEnvelope, @@ -38,7 +37,7 @@ use std::{ ops::{Deref, DerefMut}, rc::Rc, sync::Arc, - time::{Duration, Instant}, + time::Duration, }; use store::{Store, Worktree}; use time::OffsetDateTime; @@ -47,12 +46,11 @@ use tokio::{ time::Sleep, }; use tower::ServiceBuilder; -use tracing::{info_span, Instrument}; +use tracing::{info_span, instrument, Instrument}; use util::ResultExt; -type MessageHandler = Box< - dyn Send + Sync + Fn(Arc, Box) -> BoxFuture<'static, Result<()>>, ->; +type MessageHandler = + Box, Box) -> BoxFuture<'static, ()>>; pub struct Server { peer: Arc, @@ -161,7 +159,14 @@ impl Server { "handle message", payload_type = envelope.payload_type_name() ); - (handler)(server, *envelope).instrument(span).boxed() + let future = (handler)(server, *envelope); + async move { + if let Err(error) = future.await { + tracing::error!(%error, "error handling message"); + } + } + .instrument(span) + .boxed() }), ); if prev_handler.is_some() { @@ -238,12 +243,13 @@ impl Server { pub fn handle_connection( self: &Arc, connection: Connection, - addr: String, + address: String, user_id: UserId, mut send_connection_id: Option>, executor: E, ) -> impl Future { let mut this = self.clone(); + let span = info_span!("handle connection", %user_id, %address); async move { let (connection_id, handle_io, mut incoming_rx) = this .peer @@ -258,6 +264,8 @@ impl Server { }) .await; + tracing::info!(%user_id, %connection_id, %address, "connection opened"); + if let Some(send_connection_id) = send_connection_id.as_mut() { let _ = send_connection_id.send(connection_id).await; } @@ -275,50 +283,47 @@ impl Server { futures::pin_mut!(next_message); futures::select_biased! { result = handle_io => { - if let Err(err) = result { - log::error!("error handling rpc connection {:?} - {:?}", addr, err); + if let Err(error) = result { + tracing::error!(%error, "error handling I/O"); } break; } message = next_message => { if let Some(message) = message { - let start_time = Instant::now(); let type_name = message.payload_type_name(); - log::info!(connection_id = connection_id.0, type_name = type_name; "rpc message received"); - if let Some(handler) = this.handlers.get(&message.payload_type_id()) { - let notifications = this.notifications.clone(); - let is_background = message.is_background(); - let handle_message = (handler)(this.clone(), message); - let handle_message = async move { - if let Err(err) = handle_message.await { - log::error!(connection_id = connection_id.0, type = type_name, error = as_display!(err); "rpc message error"); + let span = tracing::info_span!("receive message", %user_id, %connection_id, %address, type_name); + async { + if let Some(handler) = this.handlers.get(&message.payload_type_id()) { + let notifications = this.notifications.clone(); + let is_background = message.is_background(); + let handle_message = (handler)(this.clone(), message); + let handle_message = async move { + handle_message.await; + if let Some(mut notifications) = notifications { + let _ = notifications.send(()).await; + } + }; + if is_background { + executor.spawn_detached(handle_message); } else { - log::info!(connection_id = connection_id.0, type = type_name, duration = as_debug!(start_time.elapsed()); "rpc message handled"); + handle_message.await; } - if let Some(mut notifications) = notifications { - let _ = notifications.send(()).await; - } - }; - if is_background { - executor.spawn_detached(handle_message); } else { - handle_message.await; + tracing::error!("no message handler"); } - } else { - log::warn!("unhandled message: {}", type_name); - } + }.instrument(span).await; } else { - log::info!(address = as_debug!(addr); "rpc connection closed"); + tracing::info!(%user_id, %connection_id, %address, "connection closed"); break; } } } } - if let Err(err) = this.sign_out(connection_id).await { - log::error!("error signing out connection {:?} - {:?}", addr, err); + if let Err(error) = this.sign_out(connection_id).await { + tracing::error!(%error, "error signing out"); } - } + }.instrument(span) } async fn sign_out(self: &mut Arc, connection_id: ConnectionId) -> Result<()> { @@ -854,6 +859,7 @@ impl Server { Ok(proto::GetUsersResponse { users }) } + #[instrument(skip(self, state, user_ids))] fn update_contacts_for_users<'a>( self: &Arc, state: &Store, diff --git a/crates/collab/src/rpc/store.rs b/crates/collab/src/rpc/store.rs index 7a123ee484..aaaea50263 100644 --- a/crates/collab/src/rpc/store.rs +++ b/crates/collab/src/rpc/store.rs @@ -3,6 +3,7 @@ use anyhow::{anyhow, Result}; use collections::{BTreeMap, HashMap, HashSet}; use rpc::{proto, ConnectionId}; use std::{collections::hash_map, path::PathBuf}; +use tracing::instrument; #[derive(Default)] pub struct Store { @@ -81,6 +82,7 @@ pub struct LeftProject { } impl Store { + #[instrument(skip(self))] pub fn add_connection(&mut self, connection_id: ConnectionId, user_id: UserId) { self.connections.insert( connection_id, @@ -96,6 +98,7 @@ impl Store { .insert(connection_id); } + #[instrument(skip(self))] pub fn remove_connection( &mut self, connection_id: ConnectionId, diff --git a/crates/util/src/lib.rs b/crates/util/src/lib.rs index 5870390285..e5a98fd675 100644 --- a/crates/util/src/lib.rs +++ b/crates/util/src/lib.rs @@ -37,6 +37,7 @@ where } } } + pub trait ResultExt { type Ok; From b51a53addbac0c57a090c57fb9e98a2d0d6a16e2 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 29 Apr 2022 09:21:09 +0200 Subject: [PATCH 10/17] Replace `log_err` with `trace_err` on `collab::rpc` --- crates/collab/src/rpc.rs | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 9c00c930c9..e839f81772 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -47,7 +47,6 @@ use tokio::{ }; use tower::ServiceBuilder; use tracing::{info_span, instrument, Instrument}; -use util::ResultExt; type MessageHandler = Box, Box) -> BoxFuture<'static, ()>>; @@ -875,7 +874,7 @@ impl Server { contacts: contacts.clone(), }, ) - .log_err(); + .trace_err(); } } } @@ -1110,13 +1109,14 @@ impl Executor for RealExecutor { } } +#[instrument(skip(f))] fn broadcast(sender_id: ConnectionId, receiver_ids: Vec, mut f: F) where F: FnMut(ConnectionId) -> anyhow::Result<()>, { for receiver_id in receiver_ids { if receiver_id != sender_id { - f(receiver_id).log_err(); + f(receiver_id).trace_err(); } } } @@ -1217,6 +1217,29 @@ fn to_tungstenite_message(message: AxumMessage) -> TungsteniteMessage { } } +pub trait ResultExt { + type Ok; + + fn trace_err(self) -> Option; +} + +impl ResultExt for Result +where + E: std::fmt::Debug, +{ + type Ok = T; + + fn trace_err(self) -> Option { + match self { + Ok(value) => Some(value), + Err(error) => { + tracing::error!("{:?}", error); + None + } + } + } +} + #[cfg(test)] mod tests { use super::*; From 67347930698c3f2e00529fa3192d6cc358f65bdb Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 29 Apr 2022 10:25:20 +0200 Subject: [PATCH 11/17] Start adding metrics to `collab` server --- crates/collab/src/rpc.rs | 11 ++++++++++- crates/collab/src/rpc/store.rs | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index e839f81772..a36fa58837 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -218,7 +218,7 @@ impl Server { let receipt = envelope.receipt(); let handler = handler.clone(); async move { - let mut store = server.store.write().await; + let mut store = server.state_mut().await; let response = (handler)(server.clone(), &mut *store, envelope); match response { Ok(response) => { @@ -1094,6 +1094,15 @@ impl<'a> Drop for StoreWriteGuard<'a> { fn drop(&mut self) { #[cfg(test)] self.check_invariants(); + + let metrics = self.metrics(); + tracing::info!( + connections = metrics.connections, + registered_projects = metrics.registered_projects, + shared_projects = metrics.shared_projects, + collaborators_per_project = metrics.collaborators_per_project, + "metrics" + ); } } diff --git a/crates/collab/src/rpc/store.rs b/crates/collab/src/rpc/store.rs index aaaea50263..b1881a25a1 100644 --- a/crates/collab/src/rpc/store.rs +++ b/crates/collab/src/rpc/store.rs @@ -81,7 +81,41 @@ pub struct LeftProject { pub authorized_user_ids: Vec, } +#[derive(Copy, Clone)] +pub struct Metrics { + pub connections: usize, + pub registered_projects: usize, + pub shared_projects: usize, + pub collaborators_per_project: f32, +} + impl Store { + pub fn metrics(&self) -> Metrics { + let connections = self.connections.len(); + let mut registered_projects = 0; + let mut shared_projects = 0; + let mut collaborators = 0; + for project in self.projects.values() { + registered_projects += 1; + if let Some(share) = project.share.as_ref() { + shared_projects += 1; + collaborators += share.active_replica_ids.len(); + } + } + let collaborators_per_project = if shared_projects == 0 || collaborators == 0 { + 0. + } else { + collaborators as f32 / shared_projects as f32 + }; + + Metrics { + connections, + registered_projects, + shared_projects, + collaborators_per_project, + } + } + #[instrument(skip(self))] pub fn add_connection(&mut self, connection_id: ConnectionId, user_id: UserId) { self.connections.insert( From 14b078dc0c07f298505e8dd204c553a55a256fa8 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 29 Apr 2022 10:31:47 +0200 Subject: [PATCH 12/17] Use `f32s` for metrics so that we can do aggregation math on honeycomb --- crates/collab/src/rpc.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index a36fa58837..131ea785f7 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -1097,9 +1097,9 @@ impl<'a> Drop for StoreWriteGuard<'a> { let metrics = self.metrics(); tracing::info!( - connections = metrics.connections, - registered_projects = metrics.registered_projects, - shared_projects = metrics.shared_projects, + connections = metrics.connections as f32, + registered_projects = metrics.registered_projects as f32, + shared_projects = metrics.shared_projects as f32, collaborators_per_project = metrics.collaborators_per_project, "metrics" ); From 47e7d924b2f09243297a63107d29cf5dc6c40b33 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 29 Apr 2022 08:23:23 -0600 Subject: [PATCH 13/17] WIP --- Cargo.lock | 13 ++++++++++++ crates/collab/Cargo.toml | 5 +++-- crates/collab/src/main.rs | 44 +++++++++++++++++++++++++++++---------- crates/collab/src/rpc.rs | 29 +++++++++++++++++++------- 4 files changed, 71 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 71eda5f640..65c77a4e16 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -869,6 +869,7 @@ dependencies = [ "theme", "time 0.2.27", "tokio", + "tokio-stream", "tokio-tungstenite", "toml", "tonic", @@ -1180,6 +1181,16 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "dashmap" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" +dependencies = [ + "cfg-if 1.0.0", + "num_cpus", +] + [[package]] name = "data-url" version = "0.1.0" @@ -2940,6 +2951,8 @@ checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" dependencies = [ "async-trait", "crossbeam-channel 0.5.0", + "dashmap", + "fnv", "futures-channel", "futures-executor", "futures-util", diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index feeed1ba6c..f41fd298f3 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -28,8 +28,8 @@ futures = "0.3" lazy_static = "1.4" lipsum = { version = "0.8", optional = true } log = { version = "0.4.16", features = ["kv_unstable_serde"] } -opentelemetry = { version = "0.17", features = ["rt-tokio"] } -opentelemetry-otlp = { version = "0.10", features = ["tls-roots"] } +opentelemetry = { version = "0.17", features = ["metrics", "rt-tokio"] } +opentelemetry-otlp = { version = "0.10", features = ["metrics", "tls-roots"] } parking_lot = "0.11.1" rand = "0.8" scrypt = "0.7" @@ -38,6 +38,7 @@ serde_json = "1.0" sha-1 = "0.9" time = "0.2" tokio = { version = "1", features = ["full"] } +tokio-stream = "0.1" tokio-tungstenite = "0.17" tonic = "0.6" tower = "0.4" diff --git a/crates/collab/src/main.rs b/crates/collab/src/main.rs index d7f8905a9a..50608918a6 100644 --- a/crates/collab/src/main.rs +++ b/crates/collab/src/main.rs @@ -6,11 +6,13 @@ mod rpc; use axum::{body::Body, http::StatusCode, response::IntoResponse, Router}; use db::{Db, PostgresDb}; +use opentelemetry::sdk::metrics::PushController; use serde::Deserialize; use std::{ net::{SocketAddr, TcpListener}, sync::Arc, }; +use tokio_stream::wrappers::IntervalStream; use tracing::metadata::LevelFilter; #[derive(Default, Deserialize)] @@ -51,7 +53,7 @@ async fn main() -> Result<()> { } let config = envy::from_env::().expect("error loading config"); - init_tracing(&config); + let _metrics_push_controller = init_telemetry(&config); let state = AppState::new(&config).await?; let listener = TcpListener::bind(&format!("0.0.0.0:{}", config.http_port)) @@ -113,7 +115,7 @@ impl std::fmt::Display for Error { } } -pub fn init_tracing(config: &Config) -> Option<()> { +pub fn init_telemetry(config: &Config) -> Option { use opentelemetry::KeyValue; use opentelemetry_otlp::WithExportConfig; use std::str::FromStr; @@ -124,23 +126,23 @@ pub fn init_tracing(config: &Config) -> Option<()> { .honeycomb_api_key .clone() .zip(config.honeycomb_dataset.clone())?; - let mut metadata = tonic::metadata::MetadataMap::new(); metadata.insert("x-honeycomb-team", honeycomb_api_key.parse().unwrap()); + + let service_name = KeyValue::new("service.name", honeycomb_dataset.clone()); + let tracer = opentelemetry_otlp::new_pipeline() .tracing() .with_exporter( opentelemetry_otlp::new_exporter() .tonic() .with_endpoint("https://api.honeycomb.io") - .with_metadata(metadata), + .with_metadata(metadata.clone()), + ) + .with_trace_config( + opentelemetry::sdk::trace::config() + .with_resource(opentelemetry::sdk::Resource::new([service_name.clone()])), ) - .with_trace_config(opentelemetry::sdk::trace::config().with_resource( - opentelemetry::sdk::Resource::new(vec![KeyValue::new( - "service.name", - honeycomb_dataset, - )]), - )) .install_batch(opentelemetry::runtime::Tokio) .expect("failed to initialize tracing"); @@ -158,5 +160,25 @@ pub fn init_tracing(config: &Config) -> Option<()> { tracing::subscriber::set_global_default(subscriber).unwrap(); - None + // metadata.insert("x-honeycomb-dataset", "collab_metrics".parse().unwrap()); + // let push_controller = opentelemetry_otlp::new_pipeline() + // .metrics(tokio::spawn, |duration| { + // IntervalStream::new(tokio::time::interval(duration)) + // }) + // .with_exporter( + // opentelemetry_otlp::new_exporter() + // .tonic() + // .with_endpoint("https://api.honeycomb.io") + // .with_metadata(metadata.clone()), + // ) + // .with_resource([service_name]) + // .build() + // .unwrap(); + + let push_controller = opentelemetry::sdk::export::metrics::stdout(tokio::spawn, |duration| { + IntervalStream::new(tokio::time::interval(duration)) + }) + .init(); + + Some(push_controller) } diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 131ea785f7..8cf9844d01 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -25,6 +25,7 @@ use axum::{ use collections::{HashMap, HashSet}; use futures::{channel::mpsc, future::BoxFuture, FutureExt, SinkExt, StreamExt, TryStreamExt}; use lazy_static::lazy_static; +use opentelemetry::metrics::{Meter, ValueRecorder}; use rpc::{ proto::{self, AnyTypedEnvelope, EntityMessage, EnvelopedMessage, RequestMessage}, Connection, ConnectionId, Peer, TypedEnvelope, @@ -48,6 +49,16 @@ use tokio::{ use tower::ServiceBuilder; use tracing::{info_span, instrument, Instrument}; +lazy_static! { + static ref METER: Meter = opentelemetry::global::meter(""); + static ref CONNECTIONS_COUNTER: opentelemetry::metrics::Counter = + METER.u64_counter("connections").init(); + // static ref REGISTERED_PROJECTS_GAUGE: ValueRecorder = + // METER.u64_value_recorder("registered projects").init(); + // static ref SHARED_PROJECTS_GAUGE: ValueRecorder = + // METER.u64_value_recorder("shared projects").init(); +} + type MessageHandler = Box, Box) -> BoxFuture<'static, ()>>; @@ -1096,13 +1107,17 @@ impl<'a> Drop for StoreWriteGuard<'a> { self.check_invariants(); let metrics = self.metrics(); - tracing::info!( - connections = metrics.connections as f32, - registered_projects = metrics.registered_projects as f32, - shared_projects = metrics.shared_projects as f32, - collaborators_per_project = metrics.collaborators_per_project, - "metrics" - ); + + CONNECTIONS_COUNTER.add(1, &[]); + // CONNECTIONS_COUNTER. record(metrics.connections as u64 * 2, &[]); + + // METER.record_batch( + // &[], + // [ + // REGISTERED_PROJECTS_GAUGE.measurement(metrics.registered_projects as u64), + // SHARED_PROJECTS_GAUGE.measurement(metrics.shared_projects as u64), + // ], + // ); } } From 63e184553799c8401c40bd031d615381dc1704a4 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 29 Apr 2022 16:45:29 +0200 Subject: [PATCH 14/17] Revert "WIP" This reverts commit 47e7d924b2f09243297a63107d29cf5dc6c40b33. --- Cargo.lock | 13 ------------ crates/collab/Cargo.toml | 5 ++--- crates/collab/src/main.rs | 44 ++++++++++----------------------------- crates/collab/src/rpc.rs | 29 +++++++------------------- 4 files changed, 20 insertions(+), 71 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 65c77a4e16..71eda5f640 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -869,7 +869,6 @@ dependencies = [ "theme", "time 0.2.27", "tokio", - "tokio-stream", "tokio-tungstenite", "toml", "tonic", @@ -1181,16 +1180,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "dashmap" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" -dependencies = [ - "cfg-if 1.0.0", - "num_cpus", -] - [[package]] name = "data-url" version = "0.1.0" @@ -2951,8 +2940,6 @@ checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" dependencies = [ "async-trait", "crossbeam-channel 0.5.0", - "dashmap", - "fnv", "futures-channel", "futures-executor", "futures-util", diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index f41fd298f3..feeed1ba6c 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -28,8 +28,8 @@ futures = "0.3" lazy_static = "1.4" lipsum = { version = "0.8", optional = true } log = { version = "0.4.16", features = ["kv_unstable_serde"] } -opentelemetry = { version = "0.17", features = ["metrics", "rt-tokio"] } -opentelemetry-otlp = { version = "0.10", features = ["metrics", "tls-roots"] } +opentelemetry = { version = "0.17", features = ["rt-tokio"] } +opentelemetry-otlp = { version = "0.10", features = ["tls-roots"] } parking_lot = "0.11.1" rand = "0.8" scrypt = "0.7" @@ -38,7 +38,6 @@ serde_json = "1.0" sha-1 = "0.9" time = "0.2" tokio = { version = "1", features = ["full"] } -tokio-stream = "0.1" tokio-tungstenite = "0.17" tonic = "0.6" tower = "0.4" diff --git a/crates/collab/src/main.rs b/crates/collab/src/main.rs index 50608918a6..d7f8905a9a 100644 --- a/crates/collab/src/main.rs +++ b/crates/collab/src/main.rs @@ -6,13 +6,11 @@ mod rpc; use axum::{body::Body, http::StatusCode, response::IntoResponse, Router}; use db::{Db, PostgresDb}; -use opentelemetry::sdk::metrics::PushController; use serde::Deserialize; use std::{ net::{SocketAddr, TcpListener}, sync::Arc, }; -use tokio_stream::wrappers::IntervalStream; use tracing::metadata::LevelFilter; #[derive(Default, Deserialize)] @@ -53,7 +51,7 @@ async fn main() -> Result<()> { } let config = envy::from_env::().expect("error loading config"); - let _metrics_push_controller = init_telemetry(&config); + init_tracing(&config); let state = AppState::new(&config).await?; let listener = TcpListener::bind(&format!("0.0.0.0:{}", config.http_port)) @@ -115,7 +113,7 @@ impl std::fmt::Display for Error { } } -pub fn init_telemetry(config: &Config) -> Option { +pub fn init_tracing(config: &Config) -> Option<()> { use opentelemetry::KeyValue; use opentelemetry_otlp::WithExportConfig; use std::str::FromStr; @@ -126,23 +124,23 @@ pub fn init_telemetry(config: &Config) -> Option { .honeycomb_api_key .clone() .zip(config.honeycomb_dataset.clone())?; + let mut metadata = tonic::metadata::MetadataMap::new(); metadata.insert("x-honeycomb-team", honeycomb_api_key.parse().unwrap()); - - let service_name = KeyValue::new("service.name", honeycomb_dataset.clone()); - let tracer = opentelemetry_otlp::new_pipeline() .tracing() .with_exporter( opentelemetry_otlp::new_exporter() .tonic() .with_endpoint("https://api.honeycomb.io") - .with_metadata(metadata.clone()), - ) - .with_trace_config( - opentelemetry::sdk::trace::config() - .with_resource(opentelemetry::sdk::Resource::new([service_name.clone()])), + .with_metadata(metadata), ) + .with_trace_config(opentelemetry::sdk::trace::config().with_resource( + opentelemetry::sdk::Resource::new(vec![KeyValue::new( + "service.name", + honeycomb_dataset, + )]), + )) .install_batch(opentelemetry::runtime::Tokio) .expect("failed to initialize tracing"); @@ -160,25 +158,5 @@ pub fn init_telemetry(config: &Config) -> Option { tracing::subscriber::set_global_default(subscriber).unwrap(); - // metadata.insert("x-honeycomb-dataset", "collab_metrics".parse().unwrap()); - // let push_controller = opentelemetry_otlp::new_pipeline() - // .metrics(tokio::spawn, |duration| { - // IntervalStream::new(tokio::time::interval(duration)) - // }) - // .with_exporter( - // opentelemetry_otlp::new_exporter() - // .tonic() - // .with_endpoint("https://api.honeycomb.io") - // .with_metadata(metadata.clone()), - // ) - // .with_resource([service_name]) - // .build() - // .unwrap(); - - let push_controller = opentelemetry::sdk::export::metrics::stdout(tokio::spawn, |duration| { - IntervalStream::new(tokio::time::interval(duration)) - }) - .init(); - - Some(push_controller) + None } diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 8cf9844d01..131ea785f7 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -25,7 +25,6 @@ use axum::{ use collections::{HashMap, HashSet}; use futures::{channel::mpsc, future::BoxFuture, FutureExt, SinkExt, StreamExt, TryStreamExt}; use lazy_static::lazy_static; -use opentelemetry::metrics::{Meter, ValueRecorder}; use rpc::{ proto::{self, AnyTypedEnvelope, EntityMessage, EnvelopedMessage, RequestMessage}, Connection, ConnectionId, Peer, TypedEnvelope, @@ -49,16 +48,6 @@ use tokio::{ use tower::ServiceBuilder; use tracing::{info_span, instrument, Instrument}; -lazy_static! { - static ref METER: Meter = opentelemetry::global::meter(""); - static ref CONNECTIONS_COUNTER: opentelemetry::metrics::Counter = - METER.u64_counter("connections").init(); - // static ref REGISTERED_PROJECTS_GAUGE: ValueRecorder = - // METER.u64_value_recorder("registered projects").init(); - // static ref SHARED_PROJECTS_GAUGE: ValueRecorder = - // METER.u64_value_recorder("shared projects").init(); -} - type MessageHandler = Box, Box) -> BoxFuture<'static, ()>>; @@ -1107,17 +1096,13 @@ impl<'a> Drop for StoreWriteGuard<'a> { self.check_invariants(); let metrics = self.metrics(); - - CONNECTIONS_COUNTER.add(1, &[]); - // CONNECTIONS_COUNTER. record(metrics.connections as u64 * 2, &[]); - - // METER.record_batch( - // &[], - // [ - // REGISTERED_PROJECTS_GAUGE.measurement(metrics.registered_projects as u64), - // SHARED_PROJECTS_GAUGE.measurement(metrics.shared_projects as u64), - // ], - // ); + tracing::info!( + connections = metrics.connections as f32, + registered_projects = metrics.registered_projects as f32, + shared_projects = metrics.shared_projects as f32, + collaborators_per_project = metrics.collaborators_per_project, + "metrics" + ); } } From f4e5cb14bf11045b0cc2efaedc6f959d9f49a8d3 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 29 Apr 2022 17:19:14 +0200 Subject: [PATCH 15/17] Remove `collaborators_per_project` from `Metrics` Co-Authored-By: Nathan Sobo --- crates/collab/src/rpc.rs | 7 +++---- crates/collab/src/rpc/store.rs | 11 +---------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 131ea785f7..1bf02a6e37 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -1097,10 +1097,9 @@ impl<'a> Drop for StoreWriteGuard<'a> { let metrics = self.metrics(); tracing::info!( - connections = metrics.connections as f32, - registered_projects = metrics.registered_projects as f32, - shared_projects = metrics.shared_projects as f32, - collaborators_per_project = metrics.collaborators_per_project, + connections = metrics.connections, + registered_projects = metrics.registered_projects, + shared_projects = metrics.shared_projects, "metrics" ); } diff --git a/crates/collab/src/rpc/store.rs b/crates/collab/src/rpc/store.rs index b1881a25a1..3be072c5e2 100644 --- a/crates/collab/src/rpc/store.rs +++ b/crates/collab/src/rpc/store.rs @@ -86,7 +86,6 @@ pub struct Metrics { pub connections: usize, pub registered_projects: usize, pub shared_projects: usize, - pub collaborators_per_project: f32, } impl Store { @@ -94,25 +93,17 @@ impl Store { let connections = self.connections.len(); let mut registered_projects = 0; let mut shared_projects = 0; - let mut collaborators = 0; for project in self.projects.values() { registered_projects += 1; - if let Some(share) = project.share.as_ref() { + if project.share.is_some() { shared_projects += 1; - collaborators += share.active_replica_ids.len(); } } - let collaborators_per_project = if shared_projects == 0 || collaborators == 0 { - 0. - } else { - collaborators as f32 / shared_projects as f32 - }; Metrics { connections, registered_projects, shared_projects, - collaborators_per_project, } } From 003bbe9aab47ab00b422045b5eb0e49cabb9d93a Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 29 Apr 2022 17:34:22 +0200 Subject: [PATCH 16/17] Serialize payload in "handle message" span Co-Authored-By: Nathan Sobo --- crates/collab/src/rpc.rs | 5 ++++- crates/rpc/build.rs | 1 + crates/rpc/src/proto.rs | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 1bf02a6e37..b8beef5f25 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -156,7 +156,10 @@ impl Server { let envelope = envelope.into_any().downcast::>().unwrap(); let span = info_span!( "handle message", - payload_type = envelope.payload_type_name() + payload_type = envelope.payload_type_name(), + payload = serde_json::to_string_pretty(&envelope.payload) + .unwrap() + .as_str(), ); let future = (handler)(server, *envelope); async move { diff --git a/crates/rpc/build.rs b/crates/rpc/build.rs index d453616095..66b289f1db 100644 --- a/crates/rpc/build.rs +++ b/crates/rpc/build.rs @@ -2,6 +2,7 @@ fn main() { let mut build = prost_build::Config::new(); // build.protoc_arg("--experimental_allow_proto3_optional"); build + .type_attribute(".", "#[derive(serde::Serialize)]") .compile_protos(&["proto/zed.proto"], &["proto"]) .unwrap(); } diff --git a/crates/rpc/src/proto.rs b/crates/rpc/src/proto.rs index 2d3bf639f4..98fc493774 100644 --- a/crates/rpc/src/proto.rs +++ b/crates/rpc/src/proto.rs @@ -3,6 +3,7 @@ use anyhow::{anyhow, Result}; use async_tungstenite::tungstenite::Message as WebSocketMessage; use futures::{SinkExt as _, StreamExt as _}; use prost::Message as _; +use serde::Serialize; use std::any::{Any, TypeId}; use std::{ io, @@ -11,7 +12,7 @@ use std::{ include!(concat!(env!("OUT_DIR"), "/zed.messages.rs")); -pub trait EnvelopedMessage: Clone + Sized + Send + Sync + 'static { +pub trait EnvelopedMessage: Clone + Serialize + Sized + Send + Sync + 'static { const NAME: &'static str; const PRIORITY: MessagePriority; fn into_envelope( From c8179a61eebbbf9e01e0d8a476556493084cbc8e Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 29 Apr 2022 17:41:49 +0200 Subject: [PATCH 17/17] Restore .zed.toml Co-Authored-By: Nathan Sobo --- .zed.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.zed.toml b/.zed.toml index 7738669efb..fae32125f4 100644 --- a/.zed.toml +++ b/.zed.toml @@ -1 +1 @@ -collaborators = ["nathansobo", "as-cii", "maxbrunsfeld", "iamnbutler", "gibusu", "Kethku", "chrismwendt"] +collaborators = ["nathansobo", "as-cii", "maxbrunsfeld", "iamnbutler", "gibusu", "Kethku"]