3
3
using System . Text ;
4
4
using System . Threading . Tasks ;
5
5
using System . Timers ;
6
- using Rackspace . Threading ;
7
6
using System . Globalization ;
7
+ using System . Threading ;
8
+ using Timer = System . Threading . Timer ;
8
9
9
10
namespace GitHub . Unity
10
11
{
@@ -14,20 +15,21 @@ class UsageTracker : IUsageTracker
14
15
private static IMetricsService metricsService ;
15
16
16
17
private readonly NPath storePath ;
18
+ private readonly ISettings userSettings ;
17
19
private readonly string guid ;
18
20
private readonly string unityVersion ;
19
-
20
- private bool firstRun = true ;
21
21
private Timer timer ;
22
22
23
- public UsageTracker ( NPath storePath , string guid , string unityVersion )
23
+ public UsageTracker ( ISettings userSettings , NPath storePath , string guid , string unityVersion )
24
24
{
25
+ this . userSettings = userSettings ;
25
26
this . guid = guid ;
26
27
this . storePath = storePath ;
27
28
this . unityVersion = unityVersion ;
28
29
29
30
Logger . Trace ( "guid:{0}" , guid ) ;
30
- RunTimer ( ) ;
31
+ if ( Enabled )
32
+ RunTimer ( 3 * 60 ) ;
31
33
}
32
34
33
35
private UsageStore LoadUsage ( )
@@ -88,98 +90,71 @@ private void SaveUsage(UsageStore store)
88
90
}
89
91
}
90
92
91
- private void RunTimer ( )
92
- {
93
- Logger . Trace ( "Scheduling timer for 3 minutes from now" ) ;
94
- // The timer first ticks after 3 minutes to allow things to settle down after startup.
95
- // This will be changed to 8 hours after the first tick by the TimerTick method.
96
- timer = new Timer ( TimeSpan . FromMinutes ( 3 ) . TotalMilliseconds ) ;
97
- timer . Elapsed += TimerTick ;
98
- timer . Start ( ) ;
99
- }
100
-
101
- private void TimerTick ( object sender , ElapsedEventArgs e )
93
+ private void RunTimer ( int seconds )
102
94
{
103
- TimerTick ( ) . Catch ( ( Action < Task , Exception > ) ( ( task , exception ) => {
104
- Logger . Error ( exception , "TimerTicker Error: {0}" , exception . Message ) ;
105
- } ) ) . Forget ( ) ;
95
+ Logger . Trace ( $ "Scheduling timer for { seconds } seconds from now") ;
96
+ timer = new Timer ( async _ =>
97
+ {
98
+ try
99
+ {
100
+ timer . Dispose ( ) ;
101
+ await SendUsage ( ) ;
102
+ }
103
+ catch { }
104
+ } , null , seconds * 1000 , Timeout . Infinite ) ;
106
105
}
107
106
108
- private async Task TimerTick ( )
109
- {
110
- Logger . Trace ( "TimerTick" ) ;
111
107
112
- var usageStore = LoadUsage ( ) ;
108
+ private async Task SendUsage ( )
109
+ {
110
+ Logger . Trace ( "SendUsage" ) ;
113
111
114
- if ( firstRun )
115
- {
116
- timer . Interval = TimeSpan . FromHours ( 8 ) . TotalMilliseconds ;
117
- firstRun = false ;
118
- Logger . Trace ( "Scheduling timer for 8 hours from now" ) ;
119
-
120
- if ( ! Enabled )
121
- {
122
- Logger . Warning ( "Metrics Disabled" ) ;
123
- return ;
124
- }
125
- }
112
+ var usage = LoadUsage ( ) ;
126
113
127
114
if ( metricsService == null )
128
115
{
129
- Logger . Warning ( "MetricsClient is null; stopping timer" ) ;
130
- if ( timer != null )
131
- {
132
- timer . Enabled = false ;
133
- timer = null ;
134
- }
135
- return ;
136
- }
137
-
138
- if ( ! Enabled )
139
- {
140
- Logger . Warning ( "Metrics Disabled" ) ;
116
+ Logger . Warning ( "No service, not sending usage" ) ;
141
117
return ;
142
118
}
143
119
144
- if ( usageStore . LastUpdated . Date != DateTimeOffset . UtcNow . Date )
120
+ if ( usage . LastUpdated . Date != DateTimeOffset . UtcNow . Date )
145
121
{
146
- await SendUsage ( usageStore ) ;
147
- }
148
- }
122
+ Logger . Trace ( "Sending Usage" ) ;
149
123
150
- private async Task SendUsage ( UsageStore usage )
151
- {
152
- Logger . Trace ( "Sending Usage" ) ;
153
-
154
- var currentTimeOffset = DateTimeOffset . UtcNow ;
155
- var beforeDate = currentTimeOffset . Date ;
124
+ var currentTimeOffset = DateTimeOffset . UtcNow ;
125
+ var beforeDate = currentTimeOffset . Date ;
156
126
157
- var success = false ;
158
- var extractReports = usage . Model . SelectReports ( beforeDate ) ;
159
- if ( ! extractReports . Any ( ) )
160
- {
161
- Logger . Trace ( "No items to send" ) ;
162
- success = true ;
163
- }
164
- else
165
- {
166
- try
127
+ var success = false ;
128
+ var extractReports = usage . Model . SelectReports ( beforeDate ) ;
129
+ if ( ! extractReports . Any ( ) )
167
130
{
168
- await metricsService . PostUsage ( extractReports ) ;
169
- success = true ;
131
+ Logger . Trace ( "No items to send" ) ;
170
132
}
171
- catch ( Exception ex )
133
+ else
172
134
{
173
- Logger . Warning ( ex , "Error Sending Usage" ) ;
174
- }
135
+ if ( ! Enabled )
136
+ {
137
+ Logger . Trace ( "Metrics disabled" ) ;
138
+ return ;
139
+ }
175
140
176
- }
141
+ try
142
+ {
143
+ await metricsService . PostUsage ( extractReports ) ;
144
+ success = true ;
145
+ }
146
+ catch ( Exception ex )
147
+ {
148
+ Logger . Warning ( ex , "Error Sending Usage" ) ;
149
+ }
150
+ }
177
151
178
- if ( success )
179
- {
180
- usage . Model . RemoveReports ( beforeDate ) ;
181
- usage . LastUpdated = currentTimeOffset ;
182
- SaveUsage ( usage ) ;
152
+ if ( success )
153
+ {
154
+ usage . Model . RemoveReports ( beforeDate ) ;
155
+ usage . LastUpdated = currentTimeOffset ;
156
+ SaveUsage ( usage ) ;
157
+ }
183
158
}
184
159
}
185
160
@@ -204,6 +179,27 @@ public static void SetMetricsService(IMetricsService instance)
204
179
metricsService = instance ;
205
180
}
206
181
207
- public bool Enabled { get ; set ; }
182
+ public bool Enabled
183
+ {
184
+ get
185
+ {
186
+ return userSettings . Get ( Constants . MetricsKey , true ) ;
187
+ }
188
+ set
189
+ {
190
+ if ( value == Enabled )
191
+ return ;
192
+ userSettings . Set ( Constants . MetricsKey , value ) ;
193
+ if ( value )
194
+ {
195
+ RunTimer ( 5 ) ;
196
+ }
197
+ else
198
+ {
199
+ timer . Dispose ( ) ;
200
+ timer = null ;
201
+ }
202
+ }
203
+ }
208
204
}
209
205
}
0 commit comments