StatsCollect 0.2.0.20110830 → 0.3.0.20120314
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +3 -1
- data/ChangeLog +15 -0
- data/LICENSE +1 -1
- data/README +2 -5
- data/ReleaseInfo +8 -8
- data/bin/StatsCollect.rb +3 -3
- data/lib/StatsCollect/Backends/MySQL.rb +63 -63
- data/lib/StatsCollect/Backends/Terminal.rb +43 -43
- data/lib/StatsCollect/Locations/AddThis.rb +7 -7
- data/lib/StatsCollect/Locations/CSV.rb +9 -9
- data/lib/StatsCollect/Locations/Facebook.rb +7 -7
- data/lib/StatsCollect/Locations/FacebookArtist.rb +7 -7
- data/lib/StatsCollect/Locations/FacebookLike.rb +7 -7
- data/lib/StatsCollect/Locations/GoogleGroup.rb +10 -10
- data/lib/StatsCollect/Locations/GoogleSearch.rb +6 -6
- data/lib/StatsCollect/Locations/MySpace.rb +43 -43
- data/lib/StatsCollect/Locations/RB.rb +10 -10
- data/lib/StatsCollect/Locations/ReverbNation.rb +34 -34
- data/lib/StatsCollect/Locations/Tweets.rb +7 -7
- data/lib/StatsCollect/Locations/Twitter.rb +11 -11
- data/lib/StatsCollect/Locations/Youtube.rb +33 -49
- data/lib/StatsCollect/Notifiers/Custom.rb +3 -3
- data/lib/StatsCollect/Notifiers/LogFile.rb +4 -4
- data/lib/StatsCollect/Notifiers/None.rb +3 -3
- data/lib/StatsCollect/Notifiers/SendMail.rb +3 -3
- data/lib/StatsCollect/Stats.rb +81 -81
- data/lib/StatsCollect/StatsOrdersProxy.rb +3 -3
- data/lib/StatsCollect/StatsProxy.rb +28 -28
- metadata +24 -12
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2010 -
|
2
|
+
# Copyright (c) 2010 - 2012 Muriel Salvan (muriel@x-aeon.com)
|
3
3
|
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
4
|
#++
|
5
5
|
|
@@ -11,10 +11,10 @@ module StatsCollect
|
|
11
11
|
|
12
12
|
# Send a given notification
|
13
13
|
#
|
14
|
-
# Parameters
|
14
|
+
# Parameters::
|
15
15
|
# * *iConf* (<em>map<Symbol,Object></em>): The notifier config
|
16
16
|
# * *iMessage* (_String_): Message to send
|
17
|
-
def
|
17
|
+
def send_notification(iConf, iMessage)
|
18
18
|
end
|
19
19
|
|
20
20
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2010 -
|
2
|
+
# Copyright (c) 2010 - 2012 Muriel Salvan (muriel@x-aeon.com)
|
3
3
|
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
4
|
#++
|
5
5
|
|
@@ -11,10 +11,10 @@ module StatsCollect
|
|
11
11
|
|
12
12
|
# Send a given notification
|
13
13
|
#
|
14
|
-
# Parameters
|
14
|
+
# Parameters::
|
15
15
|
# * *iConf* (<em>map<Symbol,Object></em>): The notifier config
|
16
16
|
# * *iMessage* (_String_): Message to send
|
17
|
-
def
|
17
|
+
def send_notification(iConf, iMessage)
|
18
18
|
require 'mail'
|
19
19
|
Mail.defaults do
|
20
20
|
delivery_method(:smtp, iConf[:SMTP])
|
data/lib/StatsCollect/Stats.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2010 -
|
2
|
+
# Copyright (c) 2010 - 2012 Muriel Salvan (muriel@x-aeon.com)
|
3
3
|
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
4
|
#++
|
5
5
|
|
@@ -28,10 +28,10 @@ module StatsCollect
|
|
28
28
|
def initialize
|
29
29
|
# Parse for available Locations
|
30
30
|
require 'rUtilAnts/Plugins'
|
31
|
-
RUtilAnts::Plugins::
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
RUtilAnts::Plugins::install_plugins_on_object
|
32
|
+
parse_plugins_from_dir('Locations', "#{File.expand_path(File.dirname(__FILE__))}/Locations", 'StatsCollect::Locations')
|
33
|
+
parse_plugins_from_dir('Backends', "#{File.expand_path(File.dirname(__FILE__))}/Backends", 'StatsCollect::Backends')
|
34
|
+
parse_plugins_from_dir('Notifiers', "#{File.expand_path(File.dirname(__FILE__))}/Notifiers", 'StatsCollect::Notifiers')
|
35
35
|
|
36
36
|
@Backend = nil
|
37
37
|
@BackendInit = false
|
@@ -43,12 +43,12 @@ module StatsCollect
|
|
43
43
|
@Options = OptionParser.new
|
44
44
|
@Options.banner = 'StatsCollect.rb [--help] [--debug] --backend <Backend> --notifier <Notifier> --config <ConfigFile>'
|
45
45
|
@Options.on( '--backend <Backend>', String,
|
46
|
-
"<Backend>: Backend to be used. Available backends are: #{
|
46
|
+
"<Backend>: Backend to be used. Available backends are: #{get_plugins_names('Backends').join(', ')}",
|
47
47
|
'Specify the backend to be used') do |iArg|
|
48
48
|
@Backend = iArg
|
49
49
|
end
|
50
50
|
@Options.on( '--notifier <Notifier>', String,
|
51
|
-
"<Notifier>: Notifier used to send notifications. Available notifiers are: #{
|
51
|
+
"<Notifier>: Notifier used to send notifications. Available notifiers are: #{get_plugins_names('Notifiers').join(', ')}",
|
52
52
|
'Specify the notifier to be used') do |iArg|
|
53
53
|
@Notifier = iArg
|
54
54
|
end
|
@@ -63,7 +63,7 @@ module StatsCollect
|
|
63
63
|
end
|
64
64
|
@Options.on( '--debug',
|
65
65
|
'Activate debug logs') do
|
66
|
-
|
66
|
+
activate_log_debug(true)
|
67
67
|
end
|
68
68
|
|
69
69
|
end
|
@@ -71,9 +71,9 @@ module StatsCollect
|
|
71
71
|
# Check that the environment is correctly set.
|
72
72
|
# This has to be called prior to calling collect, and exit should be made if error code is not 0.
|
73
73
|
#
|
74
|
-
# Parameters
|
74
|
+
# Parameters::
|
75
75
|
# * *iParams* (<em>list<String></em>): The parameters, as given in the command line
|
76
|
-
# Return
|
76
|
+
# Return::
|
77
77
|
# * _Integer_: Error code (given to exit) (0 = no error)
|
78
78
|
def setup(iParams)
|
79
79
|
rErrorCode = 0
|
@@ -82,29 +82,29 @@ module StatsCollect
|
|
82
82
|
begin
|
83
83
|
lRemainingArgs = @Options.parse(iParams)
|
84
84
|
if (!lRemainingArgs.empty?)
|
85
|
-
|
86
|
-
|
85
|
+
log_err "Unknown arguments: #{lRemainingArgs.join(' ')}"
|
86
|
+
log_err @Options
|
87
87
|
rErrorCode = 1
|
88
88
|
end
|
89
89
|
rescue Exception
|
90
|
-
|
90
|
+
log_err "Exception: #{$!}.\n#{$!.backtrace.join("\n")}"
|
91
91
|
rErrorCode = 2
|
92
92
|
end
|
93
93
|
if (rErrorCode == 0)
|
94
94
|
if (@DisplayHelp)
|
95
|
-
|
95
|
+
log_msg @Options
|
96
96
|
rErrorCode = 3
|
97
97
|
elsif (@Backend == nil)
|
98
|
-
|
99
|
-
|
98
|
+
log_err 'You must specify a backend.'
|
99
|
+
log_err @Options
|
100
100
|
rErrorCode = 4
|
101
101
|
elsif (@Notifier == nil)
|
102
|
-
|
103
|
-
|
102
|
+
log_err 'You must specify a notifier.'
|
103
|
+
log_err @Options
|
104
104
|
rErrorCode = 5
|
105
105
|
elsif (@ConfigFile == nil)
|
106
|
-
|
107
|
-
|
106
|
+
log_err 'You must specify a config file.'
|
107
|
+
log_err @Options
|
108
108
|
rErrorCode = 6
|
109
109
|
else
|
110
110
|
@Conf = nil
|
@@ -114,30 +114,30 @@ module StatsCollect
|
|
114
114
|
@Conf = eval(iFile.read)
|
115
115
|
end
|
116
116
|
rescue
|
117
|
-
|
117
|
+
log_err "Invalid configuration file: #{@ConfigFile}"
|
118
118
|
rErrorCode = 7
|
119
119
|
end
|
120
120
|
if (rErrorCode == 0)
|
121
121
|
# Get the corresponding notifier
|
122
122
|
if (@Conf[:Notifiers][@Notifier] == nil)
|
123
|
-
|
123
|
+
log_err "Notifier #{@Notifier} has no configuration set up in configuration file #{@ConfigFile}"
|
124
124
|
rErrorCode = 8
|
125
125
|
else
|
126
|
-
@NotifierInstance, lError =
|
126
|
+
@NotifierInstance, lError = get_plugin_instance('Notifiers', @Notifier)
|
127
127
|
if (@NotifierInstance == nil)
|
128
|
-
|
128
|
+
log_err "Unable to instantiate notifier #{@Notifier}: #{lError}"
|
129
129
|
rErrorCode = 9
|
130
130
|
else
|
131
131
|
# Will we notify the user of the script execution ?
|
132
132
|
@NotifyUser = true
|
133
133
|
# Get the corresponding backend
|
134
134
|
if (@Conf[:Backends][@Backend] == nil)
|
135
|
-
|
135
|
+
log_err "Backend #{@Backend} has no configuration set up in configuration file #{@ConfigFile}"
|
136
136
|
rErrorCode = 10
|
137
137
|
else
|
138
|
-
@BackendInstance, lError =
|
138
|
+
@BackendInstance, lError = get_plugin_instance('Backends', @Backend)
|
139
139
|
if (@BackendInstance == nil)
|
140
|
-
|
140
|
+
log_err "Unable to instantiate backend #{@Backend}: #{lError}"
|
141
141
|
rErrorCode = 11
|
142
142
|
end
|
143
143
|
end
|
@@ -152,53 +152,53 @@ module StatsCollect
|
|
152
152
|
|
153
153
|
# Execute the stats collection
|
154
154
|
#
|
155
|
-
# Return
|
155
|
+
# Return::
|
156
156
|
# * _Integer_: Error code (given to exit)
|
157
157
|
def collect
|
158
158
|
rErrorCode = 0
|
159
159
|
|
160
160
|
require 'rUtilAnts/Misc'
|
161
|
-
RUtilAnts::Misc::
|
162
|
-
lMutexErrorCode =
|
161
|
+
RUtilAnts::Misc::install_misc_on_object
|
162
|
+
lMutexErrorCode = file_mutex('StatsCollect') do
|
163
163
|
begin
|
164
164
|
# The list of errors
|
165
165
|
lLstErrors = []
|
166
|
-
|
166
|
+
set_log_errors_stack(lLstErrors)
|
167
167
|
# Collect statistics
|
168
|
-
|
168
|
+
log_info "[#{DateTime.now.strftime('%Y-%m-%d %H:%M:%S')}] - Begin collecting stats (PID #{Process.pid})..."
|
169
169
|
lFoundOrder = false
|
170
170
|
lNbrErrors = 0
|
171
171
|
setupBackend do
|
172
172
|
# Get the stats orders to process
|
173
173
|
lStatsOrdersProxy = StatsOrdersProxy.new
|
174
|
-
@BackendInstance.
|
174
|
+
@BackendInstance.get_stats_orders(lStatsOrdersProxy)
|
175
175
|
lFoundOrder = (!lStatsOrdersProxy.StatsOrders.empty?)
|
176
176
|
# Process each stats order
|
177
177
|
lStatsOrdersProxy.StatsOrders.each do |iLstIDs, iStatsOrderInfo|
|
178
178
|
iTimeStamp, iLstLocations, iLstObjects, iLstCategories, iStatus = iStatsOrderInfo
|
179
|
-
@BackendInstance.
|
180
|
-
|
179
|
+
@BackendInstance.dequeue_stats_orders(iLstIDs)
|
180
|
+
log_info "Dequeued stats order: IDs: #{iLstIDs.join('|')}, Time: #{iTimeStamp}, Locations: #{iLstLocations.join('|')}, Objects: #{iLstObjects.join('|')}, Categories: #{iLstCategories.join('|')}, Status: #{iStatus}"
|
181
181
|
begin
|
182
182
|
lRecoverableOrders, lUnrecoverableOrders = processOrder(iLstObjects, iLstCategories, iLstLocations)
|
183
183
|
# Add recoverable orders back
|
184
184
|
lRecoverableOrders.each do |iOrderInfo|
|
185
185
|
lNbrErrors += 1
|
186
186
|
iLstRecoverableObjects, iLstRecoverableCategories, iLstRecoverableLocations = iOrderInfo
|
187
|
-
|
188
|
-
@BackendInstance.
|
187
|
+
log_info "Enqueue recoverable order: Locations: #{iLstRecoverableLocations.join('|')}, Objects: #{iLstRecoverableObjects.join('|')}, Categories: #{iLstRecoverableCategories.join('|')}"
|
188
|
+
@BackendInstance.put_new_stats_order(DateTime.now + @Conf[:RecoverableErrorsRetryDelay]/86400.0, iLstRecoverableLocations, iLstRecoverableObjects, iLstRecoverableCategories, STATS_ORDER_STATUS_RECOVERABLE_ERROR)
|
189
189
|
end
|
190
190
|
# Add unrecoverable orders back
|
191
191
|
lUnrecoverableOrders.each do |iOrderInfo|
|
192
192
|
lNbrErrors += 1
|
193
193
|
iLstUnrecoverableObjects, iLstUnrecoverableCategories, iLstUnrecoverableLocations = iOrderInfo
|
194
|
-
|
195
|
-
@BackendInstance.
|
194
|
+
log_info "Enqueue unrecoverable order: Locations: #{iLstUnrecoverableLocations.join('|')}, Objects: #{iLstUnrecoverableObjects.join('|')}, Categories: #{iLstUnrecoverableCategories.join('|')}"
|
195
|
+
@BackendInstance.put_new_stats_order(iTimeStamp, iLstUnrecoverableLocations, iLstUnrecoverableObjects, iLstUnrecoverableCategories, STATS_ORDER_STATUS_UNRECOVERABLE_ERROR)
|
196
196
|
end
|
197
197
|
@BackendInstance.commit
|
198
198
|
rescue Exception
|
199
199
|
lNbrErrors += 1
|
200
200
|
@BackendInstance.rollback
|
201
|
-
|
201
|
+
log_err "Exception while processing order #{iTimeStamp}, Locations: #{iLstLocations.join('|')}, Objects: #{iLstObjects.join('|')}, Categories: #{iLstCategories.join('|')}, Status: #{iStatus}: #{$!}.\n#{$!.backtrace.join("\n")}\n"
|
202
202
|
rErrorCode = 14
|
203
203
|
end
|
204
204
|
end
|
@@ -206,16 +206,16 @@ module StatsCollect
|
|
206
206
|
if (!lFoundOrder)
|
207
207
|
@NotifyUser = false
|
208
208
|
end
|
209
|
-
|
209
|
+
set_log_errors_stack(nil)
|
210
210
|
if (lNbrErrors > 0)
|
211
|
-
|
211
|
+
log_err "#{lNbrErrors} orders were put in error during processing. Please check logs."
|
212
212
|
end
|
213
213
|
if (!lLstErrors.empty?)
|
214
|
-
|
214
|
+
log_err "#{lLstErrors.size} errors were reported. Check log for exact errors."
|
215
215
|
end
|
216
|
-
|
216
|
+
log_info "[#{DateTime.now.strftime('%Y-%m-%d %H:%M:%S')}] - Stats collection finished."
|
217
217
|
rescue Exception
|
218
|
-
|
218
|
+
log_err "Exception thrown while collecting stats: #{$!}.\n#{$!.backtrace.join("\n")}"
|
219
219
|
rErrorCode = 15
|
220
220
|
@NotifyUser = true
|
221
221
|
end
|
@@ -230,7 +230,7 @@ module StatsCollect
|
|
230
230
|
|
231
231
|
# Send notifications of a file content if necessary
|
232
232
|
#
|
233
|
-
# Parameters
|
233
|
+
# Parameters::
|
234
234
|
# * *iFileName* (_String_): The file containing notifications to be sent
|
235
235
|
def notify(iFileName)
|
236
236
|
if (@NotifyUser)
|
@@ -242,19 +242,19 @@ module StatsCollect
|
|
242
242
|
rescue Exception
|
243
243
|
lMessage = "Error while reading log file #{iFileName}: #{$!}"
|
244
244
|
end
|
245
|
-
@NotifierInstance.
|
245
|
+
@NotifierInstance.send_notification(@Conf[:Notifiers][@Notifier], lMessage)
|
246
246
|
end
|
247
247
|
end
|
248
248
|
|
249
249
|
# Enqueue a new stats order
|
250
250
|
#
|
251
|
-
# Parameters
|
251
|
+
# Parameters::
|
252
252
|
# * *iLstLocations* (<em>list<String></em>): Locations list (can be empty for all locations)
|
253
253
|
# * *iLstObjects* (<em>list<String></em>): Objects list (can be empty for all objects)
|
254
254
|
# * *iLstCategories* (<em>list<String></em>): Categories list (can be empty for all categories)
|
255
255
|
def pushStatsOrder(iLstLocations, iLstObjects, iLstCategories)
|
256
256
|
setupBackend do
|
257
|
-
@BackendInstance.
|
257
|
+
@BackendInstance.put_new_stats_order(DateTime.now, iLstLocations, iLstObjects, iLstCategories, STATS_ORDER_STATUS_TOBEPROCESSED)
|
258
258
|
end
|
259
259
|
end
|
260
260
|
|
@@ -263,31 +263,31 @@ module StatsCollect
|
|
263
263
|
# Call some code initializing backend before and ensuring it will be closed after.
|
264
264
|
# This method is re-entrant.
|
265
265
|
#
|
266
|
-
# Parameters
|
266
|
+
# Parameters::
|
267
267
|
# * _CodeBlock_: the code to be called
|
268
268
|
def setupBackend
|
269
269
|
lBackendInitHere = false
|
270
270
|
if (!@BackendInit)
|
271
|
-
@BackendInstance.
|
271
|
+
@BackendInstance.init_session(@Conf[:Backends][@Backend])
|
272
272
|
@BackendInit = true
|
273
273
|
lBackendInitHere = true
|
274
274
|
end
|
275
275
|
yield
|
276
276
|
if (lBackendInitHere)
|
277
|
-
@BackendInstance.
|
277
|
+
@BackendInstance.close_session
|
278
278
|
@BackendInit = false
|
279
279
|
end
|
280
280
|
end
|
281
281
|
|
282
282
|
# Process an order
|
283
283
|
#
|
284
|
-
# Parameters
|
284
|
+
# Parameters::
|
285
285
|
# * *iObjectsList* (<em>list<String></em>): List of objects to filter (can be empty for all)
|
286
286
|
# * *iCategoriesList* (<em>list<String></em>): List of categories to filter (can be empty for all)
|
287
287
|
# * *iLocationsList* (<em>list<String></em>): List of locations to filter (can be empty for all)
|
288
|
-
# Return
|
289
|
-
# * <em>list<[list<String>,list<String>,list<String>]></em>: The list of orders (objects, categories, locations) that could not be performed due to recoverable errors
|
290
|
-
# * <em>list<[list<String>,list<String>,list<String>]></em>: The list of orders (objects, categories, locations) that could not be performed due to unrecoverable errors
|
288
|
+
# Return::
|
289
|
+
# * <em>list< [list<String>,list<String>,list<String>] ></em>: The list of orders (objects, categories, locations) that could not be performed due to recoverable errors
|
290
|
+
# * <em>list< [list<String>,list<String>,list<String>] ></em>: The list of orders (objects, categories, locations) that could not be performed due to unrecoverable errors
|
291
291
|
def processOrder(iObjectsList, iCategoriesList, iLocationsList)
|
292
292
|
rRecoverableOrders = []
|
293
293
|
rUnrecoverableOrders = []
|
@@ -295,7 +295,7 @@ module StatsCollect
|
|
295
295
|
# For each location, call the relevant plugin
|
296
296
|
lPlugins = []
|
297
297
|
if (iLocationsList.empty?)
|
298
|
-
lPlugins =
|
298
|
+
lPlugins = get_plugins_names('Locations')
|
299
299
|
else
|
300
300
|
lPlugins = iLocationsList
|
301
301
|
end
|
@@ -305,15 +305,15 @@ module StatsCollect
|
|
305
305
|
if (@Conf[:Locations] != nil)
|
306
306
|
lPluginConf = @Conf[:Locations][iPluginName]
|
307
307
|
end
|
308
|
-
lPlugin, lError =
|
308
|
+
lPlugin, lError = get_plugin_instance('Locations', iPluginName)
|
309
309
|
if (lError == nil)
|
310
310
|
# Ask the plugin to perform the order
|
311
311
|
lStatsProxy = StatsProxy.new(iObjectsList, iCategoriesList, @BackendInstance, iPluginName)
|
312
|
-
|
312
|
+
log_info "===== Call Location plugin #{iPluginName} to perform order..."
|
313
313
|
begin
|
314
314
|
lPlugin.execute(lStatsProxy, lPluginConf, iObjectsList, iCategoriesList)
|
315
315
|
rescue Exception
|
316
|
-
|
316
|
+
log_err "Exception thrown during plugin #{iPluginName} execution: #{$!}.\n#{$!.backtrace.join("\n")}"
|
317
317
|
lErrorPlugins << iPluginName
|
318
318
|
lError = true
|
319
319
|
end
|
@@ -343,9 +343,9 @@ module StatsCollect
|
|
343
343
|
end
|
344
344
|
end
|
345
345
|
end
|
346
|
-
|
346
|
+
log_info ''
|
347
347
|
else
|
348
|
-
|
348
|
+
log_err "Error while instantiating Location plugin #{iPluginName}: #{$!}."
|
349
349
|
lErrorPlugins << iPluginName
|
350
350
|
end
|
351
351
|
end
|
@@ -360,10 +360,10 @@ module StatsCollect
|
|
360
360
|
# Both lists can be empty to indicate all possible names.
|
361
361
|
# This method returns the intersection of both lists.
|
362
362
|
#
|
363
|
-
# Parameters
|
363
|
+
# Parameters::
|
364
364
|
# * *iLst1* (<em>list<String></em>): The first list
|
365
365
|
# * *iLst2* (<em>list<String></em>): The second list
|
366
|
-
# Return
|
366
|
+
# Return::
|
367
367
|
# * <em>list<String></em>: The resulting list. Can be empty for all possible names, or nil for no name.
|
368
368
|
def intersectLists(iLst1, iLst2)
|
369
369
|
rLstIntersection = nil
|
@@ -398,8 +398,8 @@ module StatsCollect
|
|
398
398
|
# Write stats in the database.
|
399
399
|
# Apply some filter before.
|
400
400
|
#
|
401
|
-
# Parameters
|
402
|
-
# * *iStatsToAdd* (<em>list<[TimeStamp,Object,Category,Value]></em>): The stats to write in the DB
|
401
|
+
# Parameters::
|
402
|
+
# * *iStatsToAdd* (<em>list< [TimeStamp,Object,Category,Value] ></em>): The stats to write in the DB
|
403
403
|
# * *iLstObjects* (<em>list<String></em>): The filtering objects to write (can be empty for all)
|
404
404
|
# * *iLstCategories* (<em>list<String></em>): The filtering categories to write (can be empty for all)
|
405
405
|
def writeStats(iStatsToAdd, iLstObjects, iLstCategories)
|
@@ -429,15 +429,15 @@ module StatsCollect
|
|
429
429
|
|
430
430
|
# Write stats if there are some
|
431
431
|
if (lStatsToBeCommitted.empty?)
|
432
|
-
|
432
|
+
log_info 'No stats to be written after filtering.'
|
433
433
|
else
|
434
434
|
# Get the current locations from the DB to know if our location exists
|
435
|
-
lKnownLocations = @BackendInstance.
|
435
|
+
lKnownLocations = @BackendInstance.get_known_locations
|
436
436
|
# Get the list of categories, sorted by category name
|
437
|
-
lKnownCategories = @BackendInstance.
|
437
|
+
lKnownCategories = @BackendInstance.get_known_categories
|
438
438
|
# Get the list of objects, sorted by object name
|
439
439
|
# This map will eventually be completed if new objects are found among the stats to write.
|
440
|
-
lKnownObjects = @BackendInstance.
|
440
|
+
lKnownObjects = @BackendInstance.get_known_objects
|
441
441
|
# Use the following to generate a RB file that can be used with RB plugin.
|
442
442
|
if false
|
443
443
|
lStrStats = []
|
@@ -455,8 +455,8 @@ module StatsCollect
|
|
455
455
|
lLocationID = lKnownLocations[iLocation]
|
456
456
|
if (lLocationID == nil)
|
457
457
|
# First create the new location and get its ID
|
458
|
-
|
459
|
-
lLocationID = @BackendInstance.
|
458
|
+
log_info "Creating new location: #{iLocation}"
|
459
|
+
lLocationID = @BackendInstance.add_location(iLocation)
|
460
460
|
lKnownLocations[iLocation] = lLocationID
|
461
461
|
lCheckExistence = false
|
462
462
|
end
|
@@ -464,9 +464,9 @@ module StatsCollect
|
|
464
464
|
lValueType = nil
|
465
465
|
lCategoryID = nil
|
466
466
|
if (lKnownCategories[iCategory] == nil)
|
467
|
-
|
467
|
+
log_warn "Unknown stats category given by location #{iLocation}: #{iCategory}. It will be created with an Unknown value type."
|
468
468
|
lValueType = STATS_VALUE_TYPE_UNKNOWN
|
469
|
-
lCategoryID = @BackendInstance.
|
469
|
+
lCategoryID = @BackendInstance.add_category(iCategory, lValueType)
|
470
470
|
lKnownCategories[iCategory] = [ lCategoryID, lValueType ]
|
471
471
|
lCheckExistence = false
|
472
472
|
else
|
@@ -475,27 +475,27 @@ module StatsCollect
|
|
475
475
|
# Check if we need to create the corresponding object
|
476
476
|
lObjectID = lKnownObjects[iObject]
|
477
477
|
if (lObjectID == nil)
|
478
|
-
|
479
|
-
lObjectID = @BackendInstance.
|
478
|
+
log_info "Creating new object: #{iObject}"
|
479
|
+
lObjectID = @BackendInstance.add_object(iObject)
|
480
480
|
lKnownObjects[iObject] = lObjectID
|
481
481
|
lCheckExistence = false
|
482
482
|
end
|
483
483
|
# First, we ensure that this stats does not exist if we don't want duplicates
|
484
484
|
lAdd = true
|
485
485
|
if (lCheckExistence)
|
486
|
-
lExistingValue = @BackendInstance.
|
486
|
+
lExistingValue = @BackendInstance.get_stat(iTimeStamp, lLocationID, lObjectID, lCategoryID, lValueType)
|
487
487
|
if (lExistingValue != nil)
|
488
|
-
|
488
|
+
log_warn "Stat value for #{iTimeStamp.strftime('%Y-%m-%d %H:%M:%S')}, Location: #{lLocationID}, Object: #{lObjectID}, Category: #{lCategoryID} already exists with value #{lExistingValue}. Will not duplicate it."
|
489
489
|
lAdd = false
|
490
490
|
end
|
491
491
|
end
|
492
492
|
if (lAdd)
|
493
493
|
# Add the stat
|
494
|
-
@BackendInstance.
|
495
|
-
|
494
|
+
@BackendInstance.add_stat(iTimeStamp, lLocationID, lObjectID, lCategoryID, iValue, lValueType)
|
495
|
+
log_debug "Added stat: Time: #{iTimeStamp}, Location: #{iLocation} (#{lLocationID}), Object: #{iObject} (#{lObjectID}), Category: #{iCategory} (#{lCategoryID}), Value: #{iValue}"
|
496
496
|
end
|
497
497
|
end
|
498
|
-
|
498
|
+
log_info "#{lStatsToBeCommitted.size} stats added."
|
499
499
|
end
|
500
500
|
end
|
501
501
|
|