1
- use chrono:: { NaiveDateTime , TimeZone , Utc } ;
1
+ use crate :: cmdargs:: TimePeriod ;
2
+ use crate :: downsampling:: is_downsampling_interval;
2
3
use crate :: {
3
- cmdargs:: CmdArgs ,
4
- influx:: {
5
- extract_float_value, from_json_values, get_range, influx_client, save_points, to_point,
6
- Error , FieldValue ,
7
- } ,
8
- lttb:: { lttb_downsample, DataPoint } ,
9
- settings:: { Config , Field } ,
10
- utils:: { error:: print_err_and_exit, time:: intervals} ,
4
+ downsampling:: downsample_period, influx:: influx_client, settings:: Config ,
5
+ utils:: time:: intervals,
11
6
} ;
12
- use influx_db_client:: Client ;
13
- use influx_db_client:: Point ;
14
- use lazy_static:: lazy_static;
15
7
use rayon:: prelude:: * ;
16
8
use std:: collections:: HashMap ;
17
- use std:: ops:: Sub ;
18
- use std:: time:: Duration as StdDuration ;
19
9
use string_template:: Template ;
20
10
use time:: Duration ;
21
11
22
- lazy_static ! {
23
- static ref UNIX_EPOCH : NaiveDateTime = Utc . timestamp( 0 , 0 ) . naive_utc( ) ;
24
- }
25
-
26
12
pub fn pre_render_names ( config : & Config , template : Template ) -> HashMap < ( u64 , & str ) , String > {
27
13
let mut map: HashMap < ( u64 , & str ) , String > =
28
14
HashMap :: with_capacity ( config. vars . ids . len ( ) * config. downsampler . intervals . len ( ) ) ;
@@ -40,7 +26,7 @@ pub fn pre_render_names(config: &Config, template: Template) -> HashMap<(u64, &s
40
26
map
41
27
}
42
28
43
- pub fn downsample ( args : & CmdArgs , config : & Config ) -> ( ) {
29
+ pub fn downsample ( args : & TimePeriod , config : & Config ) -> ( ) {
44
30
let client = influx_client (
45
31
& config. influxdb . url ,
46
32
& config. influxdb . db ,
@@ -58,116 +44,24 @@ pub fn downsample(args: &CmdArgs, config: &Config) -> () {
58
44
59
45
for ( start, _end) in intervals ( args. start , args. end , Duration :: seconds ( 1 ) ) {
60
46
for interval_period in config. downsampler . intervals . iter ( ) {
61
- if start. signed_duration_since ( * UNIX_EPOCH ) . num_seconds ( )
62
- % ( interval_period. duration_secs as i64 )
63
- == 0
64
- {
65
- let measurement_name = measurements
66
- . get ( & ( interval_period. duration_secs , id) )
67
- . unwrap ( ) ;
68
-
69
- downsample_period (
70
- config,
71
- & client,
72
- & query_template,
73
- id,
74
- start,
75
- interval_period. duration_secs ,
76
- measurement_name,
77
- ) ;
78
- }
47
+ if is_downsampling_interval ( & start, interval_period) {
48
+ let measurement_name = measurements
49
+ . get ( & ( interval_period. duration_secs , id) )
50
+ . unwrap ( ) ;
51
+
52
+ downsample_period (
53
+ config,
54
+ & client,
55
+ & query_template,
56
+ id,
57
+ start,
58
+ interval_period. duration_secs ,
59
+ measurement_name,
60
+ ) ;
61
+ }
79
62
}
80
63
}
81
64
82
65
println ! ( "end {}" , id) ;
83
66
} ) ;
84
67
}
85
-
86
- pub fn downsample_period (
87
- config : & Config ,
88
- client : & Client ,
89
- query_template : & Template ,
90
- id : & str ,
91
- end : NaiveDateTime ,
92
- interval_duration_secs : u64 ,
93
- measurement_name : & str ,
94
- ) {
95
- let duration = Duration :: from_std ( StdDuration :: from_secs ( interval_duration_secs) ) . unwrap ( ) ;
96
- let begin = end. sub ( duration) ;
97
-
98
- let query_str = build_query ( & query_template, id, begin, end, 0 , "raw" ) ;
99
- let series = match get_range ( & client, & query_str) {
100
- Ok ( series) => series,
101
- Err ( err) => match err {
102
- Error :: NoResult => return ,
103
- e => print_err_and_exit ( e) ,
104
- } ,
105
- } ;
106
- let vals = from_json_values ( series. values , & config. downsampler . fields )
107
- . unwrap_or_else ( |e| print_err_and_exit ( e) ) ;
108
- // let _count = vals.iter().count();
109
- // println!("{} - [{} - {}] ({})", i, start, end, _count);
110
- let subset = lttb_downsample (
111
- & vals,
112
- 60 ,
113
- config. downsampler . x_field_index ,
114
- config. downsampler . y_field_index ,
115
- ) ;
116
- let points = to_influx_points ( measurement_name, & vals, & subset, & config. downsampler . fields ) ;
117
- // println!("{:#?}", &points);
118
- // TODO: handle errors
119
- save_points ( & client, & config. influxdb . retention_policy , points) . unwrap ( ) ;
120
- }
121
-
122
- pub fn to_influx_points (
123
- measurement_name : & str ,
124
- raw : & [ Vec < FieldValue > ] ,
125
- downsampled : & Option < Vec < & Vec < FieldValue > > > ,
126
- fields : & [ Field ] ,
127
- ) -> Vec < Point > {
128
- match downsampled {
129
- Some ( downsampled) => downsampled
130
- . iter ( )
131
- . map ( |v| to_point ( v, measurement_name, fields) )
132
- . collect ( ) ,
133
- _ => raw
134
- . iter ( )
135
- . map ( |v| to_point ( v, measurement_name, fields) )
136
- . collect ( ) ,
137
- }
138
- }
139
-
140
- // pass `limit: 0` to disable limit
141
- pub fn build_query (
142
- query_template : & Template ,
143
- id : & str ,
144
- start : NaiveDateTime ,
145
- end : NaiveDateTime ,
146
- limit : i64 ,
147
- time_interval : & str ,
148
- ) -> String {
149
- let start_str = start. timestamp_nanos ( ) . to_string ( ) ;
150
- let end_str = end. timestamp_nanos ( ) . to_string ( ) ;
151
- let limit_str = limit. to_string ( ) ;
152
-
153
- let mut map = HashMap :: new ( ) ;
154
- map. insert ( "id" , id) ;
155
- map. insert ( "start" , & start_str) ;
156
- map. insert ( "end" , & end_str) ;
157
- map. insert ( "limit" , & limit_str) ;
158
- map. insert ( "time_interval" , time_interval) ;
159
-
160
- query_template. render ( & map)
161
- }
162
-
163
- impl DataPoint for Vec < FieldValue > {
164
- fn get_x ( & self , index : usize ) -> f64 {
165
- let field_value = self . get ( index) . unwrap ( ) ;
166
- extract_float_value ( field_value)
167
- }
168
-
169
- fn get_y ( & self , index : usize ) -> f64 {
170
- let field_value = self . get ( index) . unwrap ( ) ;
171
- extract_float_value ( field_value)
172
- }
173
- }
0 commit comments