1
1
use clap:: { arg, Parser } ;
2
2
use serde_json:: { to_string, Value } ;
3
3
use std:: time:: Duration ;
4
+ use reqwest:: Error ;
4
5
use tokio:: time:: sleep;
5
6
6
7
/// Algolia index size monitor
@@ -16,14 +17,17 @@ struct Args {
16
17
/// Name of the index to monitor
17
18
index_name : String ,
18
19
20
+ #[ arg( short, long, default_value = "false" ) ]
21
+ all_logs : bool ,
22
+
19
23
#[ arg( short, long, default_value = "0" ) ]
20
24
expected_records : u64 ,
21
25
22
26
#[ arg( short, long, default_value = "30" ) ]
23
27
delay : u64 ,
24
28
25
- #[ arg( long, default_value = "1000" ) ]
26
- delta : u64 ,
29
+ #[ arg( long, default_value = "- 1000" ) ]
30
+ delta : i64 ,
27
31
}
28
32
29
33
impl Args {
@@ -55,21 +59,19 @@ struct AlgoliaClient {
55
59
56
60
struct AlgoliaLog {
57
61
timestamp : String ,
58
- message : String ,
59
- method : String ,
62
+ message : String
60
63
}
61
64
62
65
impl AlgoliaLog {
63
66
fn from_json ( json : & Value ) -> AlgoliaLog {
64
67
AlgoliaLog {
65
68
timestamp : json[ "timestamp" ] . as_str ( ) . unwrap ( ) . to_string ( ) ,
66
69
message : to_string ( json) . unwrap ( ) ,
67
- method : json[ "method" ] . as_str ( ) . unwrap ( ) . to_string ( ) ,
68
70
}
69
71
}
70
72
71
- fn is_update ( & self ) -> bool {
72
- self . method != "GET"
73
+ fn is_newer ( & self , timestamp : & String ) -> bool {
74
+ self . timestamp . gt ( timestamp )
73
75
}
74
76
}
75
77
@@ -125,32 +127,62 @@ async fn main() -> Result<(), reqwest::Error> {
125
127
_ => args. expected_records ,
126
128
} ;
127
129
128
- eprintln ! (
129
- "Monitoring for record count changes, started with expected value of {expected_records}"
130
- ) ;
130
+ if !args. all_logs {
131
+ eprintln ! (
132
+ "Monitoring for record count changes, started with expected value of {expected_records}"
133
+ ) ;
134
+ }
131
135
132
136
loop {
133
- let total_records = client. total_records ( ) . await ?;
134
- if ( expected_records as i64 - total_records as i64 ) . abs ( ) > args. delta as i64 {
135
- eprintln ! ( "Records count difference is more than {}, waiting for logs..." , args. delta) ;
136
- let logs = client. get_logs ( ) . await ?;
137
- for log in & logs {
138
- if log. timestamp > last_log_timestamp && log. is_update ( ) {
139
- if log. message . contains ( "delete" ) {
140
- println ! ( "DELETE:{}" , log. message) ;
141
- continue ;
142
- }
143
-
144
- println ! ( "UPDATE:{}" , log. message) ;
145
- }
146
- }
147
- for log in & logs {
148
- if log. timestamp > last_log_timestamp {
149
- last_log_timestamp = log. timestamp . to_string ( ) ;
150
- }
151
- }
137
+ if args. all_logs {
138
+ print_all_logs ( & client, & mut last_log_timestamp) . await ?;
139
+ } else {
140
+ print_logs_when_records_change ( & client, expected_records, args. delta , & mut last_log_timestamp) . await ?;
152
141
}
153
-
154
142
sleep ( Duration :: from_secs ( args. delay ) ) . await ;
155
143
}
156
144
}
145
+
146
+ async fn print_logs_when_records_change (
147
+ client : & AlgoliaClient ,
148
+ expected_records : u64 ,
149
+ delta : i64 ,
150
+ last_log_timestamp : & mut String ,
151
+ ) -> Result < ( ) , Error > {
152
+ let total_records = client. total_records ( ) . await ?;
153
+ let changed_records = total_records as i64 - expected_records as i64 ;
154
+ if ( delta < 0 && changed_records < delta) || ( delta > 0 && changed_records > delta) {
155
+ eprintln ! (
156
+ "Records count difference is more than {} ({}), waiting for logs..." ,
157
+ delta,
158
+ changed_records
159
+ ) ;
160
+ print_algolia_logs ( client, last_log_timestamp) . await ?;
161
+ }
162
+
163
+ Ok ( ( ) )
164
+ }
165
+
166
+
167
+ async fn print_all_logs (
168
+ client : & AlgoliaClient ,
169
+ last_log_timestamp : & mut String ,
170
+ ) -> Result < ( ) , reqwest:: Error > {
171
+ print_algolia_logs ( client, last_log_timestamp) . await ?;
172
+ Ok ( ( ) )
173
+ }
174
+
175
+ async fn print_algolia_logs ( client : & AlgoliaClient , last_log_timestamp : & mut String ) -> Result < ( ) , Error > {
176
+ let logs = client. get_logs ( ) . await ?;
177
+ for log in & logs {
178
+ if log. is_newer ( last_log_timestamp) {
179
+ println ! ( "{}" , log. message) ;
180
+ }
181
+ }
182
+ for log in & logs {
183
+ if log. is_newer ( last_log_timestamp) {
184
+ let _ = std:: mem:: replace ( last_log_timestamp, log. timestamp . clone ( ) ) ;
185
+ }
186
+ }
187
+ Ok ( ( ) )
188
+ }
0 commit comments