Skip to content

Commit c003c4b

Browse files
fix(tracker): add FORGE_TRACKER env var to disable enrichment (#2544)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent be16448 commit c003c4b

4 files changed

Lines changed: 69 additions & 4 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,20 @@ The `FORGE_LOG` variable controls the logging level for Forge's internal operati
602602

603603
</details>
604604

605+
<details>
606+
<summary><strong>Tracking Configuration</strong></summary>
607+
608+
Control tracking of user-identifying metadata in telemetry events:
609+
610+
```bash
611+
# .env
612+
FORGE_TRACKER=false # Disable tracking enrichment metadata (default: true)
613+
```
614+
615+
The `FORGE_TRACKER` variable controls whether tracking enrichment metadata is included in telemetry events.
616+
617+
</details>
618+
605619
The `forge.yaml` file supports several advanced configuration options that let you customize Forge's behavior.
606620

607621
<details>

crates/forge_tracker/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,4 @@ uuid.workspace = true
3737
[dev-dependencies]
3838
tokio = { workspace = true, features = ["macros", "rt", "time", "test-util"] }
3939
lazy_static.workspace = true
40+
pretty_assertions.workspace = true

crates/forge_tracker/src/dispatch.rs

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ const VERSION: &str = match option_env!("APP_VERSION") {
2626
None => env!("CARGO_PKG_VERSION"),
2727
};
2828

29+
const TRACKING_ENV_VAR_NAME: &str = "FORGE_TRACKER";
30+
2931
// Cached system information that doesn't change during application lifetime
3032
static CACHED_CORES: LazyLock<usize> = LazyLock::new(|| System::physical_core_count().unwrap_or(0));
3133
static CACHED_CLIENT_ID: LazyLock<String> = LazyLock::new(|| {
@@ -112,7 +114,7 @@ impl Tracker {
112114
}
113115

114116
// Create a new event
115-
let email = self.email().await;
117+
let email = self.system_info().await;
116118
let event = Event {
117119
event_name: event_kind.name(),
118120
event_value: event_kind.value(),
@@ -142,10 +144,10 @@ impl Tracker {
142144
Ok(())
143145
}
144146

145-
async fn email(&self) -> Vec<String> {
147+
async fn system_info(&self) -> Vec<String> {
146148
let mut guard = self.email.lock().await;
147149
if guard.is_none() {
148-
*guard = Some(email().await.into_iter().collect());
150+
*guard = Some(system_info().await.into_iter().collect());
149151
}
150152
guard.clone().unwrap_or_default()
151153
}
@@ -161,8 +163,18 @@ impl Tracker {
161163
}
162164
}
163165

166+
fn tracking_enabled() -> bool {
167+
std::env::var(TRACKING_ENV_VAR_NAME)
168+
.map(|value| !value.eq_ignore_ascii_case("false"))
169+
.unwrap_or(true)
170+
}
171+
164172
// Get the email address
165-
async fn email() -> HashSet<String> {
173+
async fn system_info() -> HashSet<String> {
174+
if !tracking_enabled() {
175+
return HashSet::new();
176+
}
177+
166178
fn parse(output: Output) -> Option<String> {
167179
if output.status.success() {
168180
let text = String::from_utf8_lossy(&output.stdout).trim().to_string();
@@ -264,10 +276,47 @@ fn parse_email(text: String) -> Vec<String> {
264276

265277
#[cfg(test)]
266278
mod tests {
279+
use pretty_assertions::assert_eq;
280+
267281
use super::*;
268282

269283
static TRACKER: LazyLock<Tracker> = LazyLock::new(Tracker::default);
270284

285+
#[test]
286+
fn test_tracking_fixture() {
287+
unsafe {
288+
std::env::remove_var(TRACKING_ENV_VAR_NAME);
289+
}
290+
let actual = tracking_enabled();
291+
let expected = true;
292+
assert_eq!(actual, expected);
293+
294+
unsafe {
295+
std::env::set_var(TRACKING_ENV_VAR_NAME, "false");
296+
}
297+
let actual = tracking_enabled();
298+
let expected = false;
299+
assert_eq!(actual, expected);
300+
301+
unsafe {
302+
std::env::set_var(TRACKING_ENV_VAR_NAME, "FALSE");
303+
}
304+
let actual = tracking_enabled();
305+
let expected = false;
306+
assert_eq!(actual, expected);
307+
308+
unsafe {
309+
std::env::set_var(TRACKING_ENV_VAR_NAME, "true");
310+
}
311+
let actual = tracking_enabled();
312+
let expected = true;
313+
assert_eq!(actual, expected);
314+
315+
unsafe {
316+
std::env::remove_var(TRACKING_ENV_VAR_NAME);
317+
}
318+
}
319+
271320
#[tokio::test]
272321
async fn test_tracker() {
273322
if let Err(e) = TRACKER

0 commit comments

Comments
 (0)