diff --git a/rust/telemetry/src/lib.rs b/rust/telemetry/src/lib.rs index 7bdbfaa08..a2cd0b332 100644 --- a/rust/telemetry/src/lib.rs +++ b/rust/telemetry/src/lib.rs @@ -38,10 +38,6 @@ impl Drop for Telemetry { impl Telemetry { pub fn start(&mut self, api_url: &str, release: &str, dsn: Dsn) { - if self.inner.is_some() { - return; - } - // Can't use URLs as `environment` directly, because Sentry doesn't allow slashes in environments. // let environment = match api_url { @@ -54,6 +50,29 @@ impl Telemetry { } }; + if self + .inner + .as_ref() + .and_then(|i| i.options().environment.as_ref()) + .is_some_and(|env| env == environment) + { + tracing::debug!("Telemetry already initialised"); + + return; + } + + // Stop any previous telemetry session. + if let Some(inner) = self.inner.take() { + tracing::debug!("Stopping previous telemetry session"); + + sentry::end_session(); + drop(inner); + + self.account_slug = None; + self.firezone_id = None; + set_current_user(None); + } + tracing::info!("Starting telemetry"); let inner = sentry::init(( dsn.0, @@ -142,6 +161,10 @@ impl Telemetry { .map(|slug| ("account_slug".to_owned(), slug.into())), ); - sentry::Hub::main().configure_scope(|scope| scope.set_user(Some(user))); + set_current_user(Some(user)); } } + +fn set_current_user(user: Option) { + sentry::Hub::main().configure_scope(|scope| scope.set_user(user)); +}