sms-logparser 0.12.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/sms-logparser/api.rb +39 -1
- data/lib/sms-logparser/cli.rb +55 -5
- data/lib/sms-logparser/data_cache.rb +17 -0
- data/lib/sms-logparser/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8392eba52e67bfc44639dc8b2e916ca9497335e2
|
4
|
+
data.tar.gz: 3409ba5f83db6a33334d58bbd2ccb1f00e1165ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3350474625d5cc675cfb18b5e4243ce81e6912ef123df9a86d9d7bef67a59b831926678288684e683b58043b29314ee7ff9a8794566319ece8f2f6045f12148
|
7
|
+
data.tar.gz: ac650bc8109cede2eb992035c94e0ae6936633e21cb3d408ece3c1a9a00962204bcf0e0a18a41208c1aa759bff075344a42a3bdf59e5d28b060a904531215dd5
|
data/lib/sms-logparser/api.rb
CHANGED
@@ -14,7 +14,6 @@ module SmsLogparser
|
|
14
14
|
end
|
15
15
|
|
16
16
|
|
17
|
-
|
18
17
|
def send(data)
|
19
18
|
requests = build_urls(data)
|
20
19
|
return requests if @options[:simulate]
|
@@ -37,6 +36,45 @@ module SmsLogparser
|
|
37
36
|
requests
|
38
37
|
end
|
39
38
|
|
39
|
+
def send_from_queue(data_sets)
|
40
|
+
queue = Queue.new
|
41
|
+
semaphore = Mutex.new
|
42
|
+
data_sets.each {|set| queue << set }
|
43
|
+
threads = 4.times.map do
|
44
|
+
Thread.new do
|
45
|
+
while !queue.empty?
|
46
|
+
begin
|
47
|
+
data = queue.pop
|
48
|
+
url = @base_path + [
|
49
|
+
data[:customer_id],
|
50
|
+
data[:author_id],
|
51
|
+
data[:project_id],
|
52
|
+
data[:type],
|
53
|
+
data[:value]
|
54
|
+
].join('/')
|
55
|
+
if @options[:simulate]
|
56
|
+
semaphore.synchronize {
|
57
|
+
yield url, 0
|
58
|
+
}
|
59
|
+
break
|
60
|
+
end
|
61
|
+
response = @connection.post(url)
|
62
|
+
rescue => e
|
63
|
+
raise RuntimeError, "Can't send request to #{url}. #{e.message}", caller
|
64
|
+
end
|
65
|
+
unless @accepted_responses.include?(response.status)
|
66
|
+
msg = "Received HTTP status #{response.status} from API. Only accepting #{@accepted_responses.join(', ')}."
|
67
|
+
raise RuntimeError, msg, caller
|
68
|
+
end
|
69
|
+
semaphore.synchronize {
|
70
|
+
yield url, response.status
|
71
|
+
}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
threads.each {|thread| thread.join }
|
76
|
+
end
|
77
|
+
|
40
78
|
def build_urls(data)
|
41
79
|
requests = []
|
42
80
|
path = @base_path + [data[:customer_id], data[:author_id], data[:project_id]].join('/')
|
data/lib/sms-logparser/cli.rb
CHANGED
@@ -88,24 +88,74 @@ module SmsLogparser
|
|
88
88
|
end
|
89
89
|
|
90
90
|
desc "cached_pase", "Check the database for pcache logs and put them into the cache"
|
91
|
+
option :api_base_url, aliases: %w(-a),
|
92
|
+
desc: "Base path of the SMS API (Default: http://localhost:8080/creator/rest/)"
|
93
|
+
option :api_key, aliases: %w(-k), desc: "SMS API Key"
|
94
|
+
option :simulate, type: :boolean, aliases: %w(-s),
|
95
|
+
desc: "Dry run without submitting any data"
|
96
|
+
option :verbose, type: :boolean, aliases: %w(-v), desc: "Verbose output"
|
91
97
|
option :limit, type: :numeric, aliases: %w(-L), desc: "Limit the number of entries to query"
|
98
|
+
option :accepted_api_responses, type: :array, aliases: %w(-r),
|
99
|
+
desc: "API HTTP responses which are accepted (Default: only accept 200)."
|
92
100
|
def cached_parse
|
101
|
+
start_message = "Parser started"
|
102
|
+
start_message += options[:simulate] ? " in simulation mode." : "."
|
103
|
+
logger.info(start_message)
|
104
|
+
mysql = Mysql.new(options)
|
105
|
+
if !options[:simulate] && mysql.parser_running?
|
106
|
+
logger.warn("Exit. Another instance of the parser is already running.")
|
107
|
+
exit!
|
108
|
+
end
|
109
|
+
state = {
|
110
|
+
last_event_id: mysql.get_last_parse_id,
|
111
|
+
match_count: 0,
|
112
|
+
status: STATUS[:running],
|
113
|
+
started_at: Time.now,
|
114
|
+
run_time: 0.0
|
115
|
+
}
|
116
|
+
state = mysql.start_run(state) unless options[:simulate]
|
93
117
|
cache = DataCache.new
|
94
118
|
mysql = Mysql.new(options)
|
95
119
|
say "Getting entries from database..."
|
96
|
-
mysql.get_entries(last_id:
|
120
|
+
mysql.get_entries(last_id: state[:last_event_id], limit: options[:limit]) do |entries|
|
97
121
|
entries.each do |entry|
|
98
122
|
Parser.extract_data_from_msg(entry['Message']) do |data|
|
99
123
|
if data
|
100
124
|
cache.add(data)
|
101
|
-
|
102
|
-
|
125
|
+
logger.debug {"Cached data: #{data}"}
|
126
|
+
state[:match_count] += 1
|
127
|
+
state[:last_event_id] = entry['ID']
|
103
128
|
end
|
104
129
|
end
|
105
130
|
end
|
106
131
|
end
|
107
|
-
|
108
|
-
|
132
|
+
api = Api.new(options)
|
133
|
+
api.send_from_queue(cache.data_sets) do |url, response|
|
134
|
+
say "#{url} (#{response})"
|
135
|
+
end
|
136
|
+
rescue SystemExit, Interrupt
|
137
|
+
logger.error("Received an interrupt. Stopping the parser run.")
|
138
|
+
state[:status] = STATUS[:interrupted] if state
|
139
|
+
rescue => e
|
140
|
+
logger.error "Aborting the parser run."
|
141
|
+
logger.error e
|
142
|
+
state[:status] = STATUS[:api_error] if state
|
143
|
+
else
|
144
|
+
state[:status] = STATUS[:ok]
|
145
|
+
ensure
|
146
|
+
begin
|
147
|
+
if mysql && state
|
148
|
+
state[:run_time] = (Time.now - state[:started_at]).round(2)
|
149
|
+
if state[:id]
|
150
|
+
mysql.write_parse_result(state) unless options[:simulate]
|
151
|
+
end
|
152
|
+
log_parse_results(state)
|
153
|
+
SmsLogparser::Loggster.instance.close
|
154
|
+
end
|
155
|
+
rescue => e
|
156
|
+
logger.fatal e
|
157
|
+
end
|
158
|
+
|
109
159
|
end
|
110
160
|
|
111
161
|
desc "history", "List the last paser runs"
|
@@ -20,6 +20,23 @@ module SmsLogparser
|
|
20
20
|
@cache
|
21
21
|
end
|
22
22
|
|
23
|
+
def data_sets
|
24
|
+
sets = []
|
25
|
+
types = %w(TRAFFIC_PODCAST TRAFFIC_MOBILE TRAFFIC_WEBCAST VISITORS_PODCAST VISITORS_MOBILE VISITORS_WEBCAST)
|
26
|
+
@cache.each do |key, values|
|
27
|
+
types.each do |type|
|
28
|
+
sets << {
|
29
|
+
customer_id: values[:customer_id],
|
30
|
+
author_id: values[:author_id],
|
31
|
+
project_id: values[:project_id],
|
32
|
+
type: type,
|
33
|
+
value: values[type]
|
34
|
+
} if values[type]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
sets
|
38
|
+
end
|
39
|
+
|
23
40
|
private
|
24
41
|
|
25
42
|
def initialize_value(data)
|