Skip to main content

trojan_config/
analytics.rs

1//! Analytics configuration for connection event collection.
2
3use serde::{Deserialize, Serialize};
4
5/// Analytics configuration for connection event collection.
6#[derive(Debug, Clone, Serialize, Deserialize, Default)]
7pub struct AnalyticsConfig {
8    /// Whether analytics is enabled (runtime switch).
9    #[serde(default)]
10    pub enabled: bool,
11
12    /// ClickHouse configuration.
13    #[serde(default)]
14    pub clickhouse: Option<ClickHouseConfig>,
15
16    /// Buffer configuration.
17    #[serde(default)]
18    pub buffer: AnalyticsBufferConfig,
19
20    /// Sampling configuration.
21    #[serde(default)]
22    pub sampling: AnalyticsSamplingConfig,
23
24    /// Privacy configuration.
25    #[serde(default)]
26    pub privacy: AnalyticsPrivacyConfig,
27
28    /// Server identifier for multi-instance deployments.
29    #[serde(default)]
30    pub server_id: Option<String>,
31}
32
33/// ClickHouse connection configuration.
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct ClickHouseConfig {
36    /// ClickHouse URL (e.g., "http://localhost:8123").
37    pub url: String,
38
39    /// Database name.
40    #[serde(default = "default_analytics_database")]
41    pub database: String,
42
43    /// Table name.
44    #[serde(default = "default_analytics_table")]
45    pub table: String,
46
47    /// Username (optional).
48    #[serde(default)]
49    pub username: Option<String>,
50
51    /// Password (optional).
52    #[serde(default)]
53    pub password: Option<String>,
54
55    /// Connection timeout in seconds.
56    #[serde(default = "default_analytics_connect_timeout")]
57    pub connect_timeout_secs: u64,
58
59    /// Write timeout in seconds.
60    #[serde(default = "default_analytics_write_timeout")]
61    pub write_timeout_secs: u64,
62}
63
64/// Buffer configuration for event batching.
65#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct AnalyticsBufferConfig {
67    /// Maximum number of events to buffer in memory.
68    #[serde(default = "default_analytics_buffer_size")]
69    pub size: usize,
70
71    /// Flush interval in seconds.
72    #[serde(default = "default_analytics_flush_interval")]
73    pub flush_interval_secs: u64,
74
75    /// Batch size for writes.
76    #[serde(default = "default_analytics_batch_size")]
77    pub batch_size: usize,
78
79    /// Fallback file path for failed writes.
80    #[serde(default)]
81    pub fallback_path: Option<String>,
82}
83
84impl Default for AnalyticsBufferConfig {
85    fn default() -> Self {
86        Self {
87            size: default_analytics_buffer_size(),
88            flush_interval_secs: default_analytics_flush_interval(),
89            batch_size: default_analytics_batch_size(),
90            fallback_path: None,
91        }
92    }
93}
94
95/// Sampling configuration for high-traffic scenarios.
96#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct AnalyticsSamplingConfig {
98    /// Sampling rate (0.0 - 1.0, where 1.0 = 100%).
99    #[serde(default = "default_analytics_sample_rate")]
100    pub rate: f64,
101
102    /// Users to always record (not affected by sampling).
103    #[serde(default)]
104    pub always_record_users: Vec<String>,
105}
106
107impl Default for AnalyticsSamplingConfig {
108    fn default() -> Self {
109        Self {
110            rate: default_analytics_sample_rate(),
111            always_record_users: Vec::new(),
112        }
113    }
114}
115
116/// Privacy configuration for data collection.
117#[derive(Debug, Clone, Serialize, Deserialize)]
118pub struct AnalyticsPrivacyConfig {
119    /// Whether to record client IP addresses.
120    #[serde(default = "default_true")]
121    pub record_peer_ip: bool,
122
123    /// Whether to record full user ID (false = prefix only).
124    #[serde(default)]
125    pub full_user_id: bool,
126
127    /// User ID prefix length when full_user_id is false.
128    #[serde(default = "default_analytics_user_id_prefix_len")]
129    pub user_id_prefix_len: usize,
130
131    /// Whether to record SNI.
132    #[serde(default = "default_true")]
133    pub record_sni: bool,
134}
135
136impl Default for AnalyticsPrivacyConfig {
137    fn default() -> Self {
138        Self {
139            record_peer_ip: true,
140            full_user_id: false,
141            user_id_prefix_len: default_analytics_user_id_prefix_len(),
142            record_sni: true,
143        }
144    }
145}
146
147// Analytics default value functions
148
149fn default_analytics_database() -> String {
150    "trojan".to_string()
151}
152
153fn default_analytics_table() -> String {
154    "connections".to_string()
155}
156
157fn default_analytics_buffer_size() -> usize {
158    10000
159}
160
161fn default_analytics_flush_interval() -> u64 {
162    5
163}
164
165fn default_analytics_batch_size() -> usize {
166    1000
167}
168
169fn default_analytics_sample_rate() -> f64 {
170    1.0
171}
172
173fn default_analytics_user_id_prefix_len() -> usize {
174    8
175}
176
177fn default_analytics_connect_timeout() -> u64 {
178    10
179}
180
181fn default_analytics_write_timeout() -> u64 {
182    30
183}
184
185fn default_true() -> bool {
186    true
187}