Skip to content
Clone

feat(telemetry): introduce TelemetryGuard for automatic telemetry shutdown management

ZhenYi committed
parent 2cb5052 commit 9654670 Browse files

4 files changed

+21 −13

File tree 4
Modified app/src/event.rs View app/src/event.rs
@@ -19,6 +19,7 @@
1919
2020pub async fn run(mode: EventMode) -> anyhow::Result<()> {
2121 let telemetry = oltp::init(&oltp::TelemetryConfig::from_env("gitdata-event"));
22 let _telemetry_guard = telemetry.guard();
2223
2324 let cfg = EventConfig::load().context("loading event configuration")?;
2425
@@ -157,8 +158,5 @@
157158 let _ = rpc_task.await;
158159 host.shutdown().await;
159160 tokio::time::sleep(Duration::from_millis(10)).await;
160 if let Err(error) = telemetry.shutdown() {
161 tracing::warn!(%error, "flushing telemetry failed");
162 }
163161 result.map_err(|error| anyhow!("event system failed: {error}"))
164162}
Modified app/src/main.rs View app/src/main.rs
@@ -37,6 +37,7 @@
3737 use webapi::openapi::api_doc;
3838
3939 let telemetry = oltp::init(&oltp::TelemetryConfig::from_env("gitdata"));
40 let _telemetry_guard = telemetry.guard();
4041
4142 let cfg = AppConfig::load().context("loading configuration")?;
4243 if !cfg.apihost.enabled() {
@@ -207,10 +208,6 @@
207208 }
208209 conn.shutdown().await;
209210 api_result?;
210
211 if let Err(error) = telemetry.shutdown() {
212 warn!(%error, "flushing telemetry failed");
213 }
214211
215212 if relay_failed {
216213 return Err(anyhow::anyhow!("event outbox relay stopped unexpectedly"));
@@ -225,6 +222,7 @@
225222 use tokio_util::sync::CancellationToken;
226223
227224 let telemetry = oltp::init(&oltp::TelemetryConfig::from_env("gitdata-mail"));
225 let _telemetry_guard = telemetry.guard();
228226
229227 let figment = config::loader::figment().context("loading configuration")?;
230228 let rocketmq: config::rocketmq::RocketMqConfig = figment
@@ -259,11 +257,7 @@
259257 };
260258 let (result, ()) = tokio::join!(run, signal);
261259 conn.shutdown().await;
262 result.context("mail service failed")?;
263 if let Err(error) = telemetry.shutdown() {
264 tracing::warn!(%error, "flushing telemetry failed");
265 }
266 Ok(())
260 result.context("mail service failed")
267261}
268262
269263#[tokio::main]
Modified lib/infra/oltp/src/lib.rs View lib/infra/oltp/src/lib.rs
@@ -21,4 +21,4 @@
2121};
2222mod telemetry;
2323
24pub use telemetry::{Telemetry, init, install};
24pub use telemetry::{Telemetry, TelemetryGuard, init, install};
Modified lib/infra/oltp/src/telemetry.rs View lib/infra/oltp/src/telemetry.rs
@@ -57,6 +57,22 @@
5757 .map_err(TelemetryError::shutdown)?;
5858 Ok(())
5959 }
60
61 pub fn guard(&self) -> TelemetryGuard<'_> {
62 TelemetryGuard { telemetry: self }
63 }
64}
65
66pub struct TelemetryGuard<'a> {
67 telemetry: &'a Telemetry,
68}
69
70impl Drop for TelemetryGuard<'_> {
71 fn drop(&mut self) {
72 if let Err(error) = self.telemetry.shutdown() {
73 tracing::warn!(%error, "flushing telemetry failed");
74 }
75 }
6076}
6177
6278pub fn install(config: &TelemetryConfig) -> Telemetry {