trojan_config/
analytics.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize, Default)]
7pub struct AnalyticsConfig {
8 #[serde(default)]
10 pub enabled: bool,
11
12 #[serde(default)]
14 pub clickhouse: Option<ClickHouseConfig>,
15
16 #[serde(default)]
18 pub buffer: AnalyticsBufferConfig,
19
20 #[serde(default)]
22 pub sampling: AnalyticsSamplingConfig,
23
24 #[serde(default)]
26 pub privacy: AnalyticsPrivacyConfig,
27
28 #[serde(default)]
30 pub server_id: Option<String>,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct ClickHouseConfig {
36 pub url: String,
38
39 #[serde(default = "default_analytics_database")]
41 pub database: String,
42
43 #[serde(default = "default_analytics_table")]
45 pub table: String,
46
47 #[serde(default)]
49 pub username: Option<String>,
50
51 #[serde(default)]
53 pub password: Option<String>,
54
55 #[serde(default = "default_analytics_connect_timeout")]
57 pub connect_timeout_secs: u64,
58
59 #[serde(default = "default_analytics_write_timeout")]
61 pub write_timeout_secs: u64,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct AnalyticsBufferConfig {
67 #[serde(default = "default_analytics_buffer_size")]
69 pub size: usize,
70
71 #[serde(default = "default_analytics_flush_interval")]
73 pub flush_interval_secs: u64,
74
75 #[serde(default = "default_analytics_batch_size")]
77 pub batch_size: usize,
78
79 #[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#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct AnalyticsSamplingConfig {
98 #[serde(default = "default_analytics_sample_rate")]
100 pub rate: f64,
101
102 #[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#[derive(Debug, Clone, Serialize, Deserialize)]
118pub struct AnalyticsPrivacyConfig {
119 #[serde(default = "default_true")]
121 pub record_peer_ip: bool,
122
123 #[serde(default)]
125 pub full_user_id: bool,
126
127 #[serde(default = "default_analytics_user_id_prefix_len")]
129 pub user_id_prefix_len: usize,
130
131 #[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
147fn 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}