Skip to main content

vtcode_config/
telemetry.rs

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