Skip to main content

vtcode_config/
telemetry.rs

1use crate::env_helpers::default_true;
2use serde::{Deserialize, Serialize};
3
4#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
5#[derive(Debug, Clone, Deserialize, Serialize)]
6pub struct TelemetryConfig {
7    #[serde(default = "default_true")]
8    pub trajectory_enabled: bool,
9
10    /// Enable real-time dashboards
11    #[serde(default = "default_true")]
12    pub dashboards_enabled: bool,
13
14    /// KPI sampling interval in milliseconds
15    #[serde(default = "default_interval")]
16    pub sample_interval_ms: u64,
17
18    /// Retention window for historical benchmarking (days)
19    #[serde(default = "default_retention_days")]
20    pub retention_days: u32,
21
22    /// Enable ATIF (Agent Trajectory Interchange Format) trajectory export.
23    /// When enabled, sessions write an `atif-trajectory.json` alongside the
24    /// existing `.jsonl` trajectory log.
25    #[serde(default)]
26    pub atif_enabled: bool,
27
28    /// Emit bottleneck traces for slow paths
29    #[serde(default)]
30    pub bottleneck_tracing: bool,
31
32    /// Emit performance events for file I/O, spawns, and UI latency
33    #[serde(default = "default_true")]
34    pub perf_events: bool,
35
36    /// Maximum number of rotated trajectory log files to keep per workspace
37    #[serde(default = "default_trajectory_max_files")]
38    pub trajectory_max_files: usize,
39
40    /// Maximum age in days for rotated trajectory log files
41    #[serde(default = "default_trajectory_max_age_days")]
42    pub trajectory_max_age_days: u64,
43
44    /// Maximum total size in MB for all trajectory log files in a workspace
45    #[serde(default = "default_trajectory_max_size_mb")]
46    pub trajectory_max_size_mb: u64,
47}
48
49impl Default for TelemetryConfig {
50    fn default() -> Self {
51        Self {
52            trajectory_enabled: true,
53            atif_enabled: false,
54            dashboards_enabled: true,
55            sample_interval_ms: default_interval(),
56            retention_days: default_retention_days(),
57            bottleneck_tracing: true,
58            perf_events: true,
59            trajectory_max_files: default_trajectory_max_files(),
60            trajectory_max_age_days: default_trajectory_max_age_days(),
61            trajectory_max_size_mb: default_trajectory_max_size_mb(),
62        }
63    }
64}
65
66fn default_interval() -> u64 {
67    1000
68}
69
70fn default_retention_days() -> u32 {
71    14
72}
73
74fn default_trajectory_max_files() -> usize {
75    crate::constants::defaults::DEFAULT_TRAJECTORY_MAX_FILES
76}
77
78fn default_trajectory_max_age_days() -> u64 {
79    crate::constants::defaults::DEFAULT_TRAJECTORY_MAX_AGE_DAYS
80}
81
82fn default_trajectory_max_size_mb() -> u64 {
83    crate::constants::defaults::DEFAULT_TRAJECTORY_MAX_SIZE_MB
84}