logstash-filter-sumo 3.0.14 → 3.0.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +65 -0
- data/lib/logstash/filters/sumo.rb +178 -17
- data/logstash-filter-sumo.gemspec +3 -2
- data/spec/filters/sumo_spec.rb +264 -30
- data/spec/spec_helper.rb +9 -0
- metadata +28 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2219d28e3c848821f52a9eb67ea246058b956a63
|
4
|
+
data.tar.gz: 0b9039e60627e1136669352b0d565638eb6ecd03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bbc8e82d378cf866ebceab4878ea5c327969d9efb18fa4925bdce30914dd58fb9bc832162ebbccf8a2c274b09ec24639b1827138ce1c19feef50105e883df526
|
7
|
+
data.tar.gz: b7eb743fe9d991cae62f18679a00acf8da007d33917f983127df1a8eb69e9ac82859a9053c6204bd7932985376f63573d380ac57b6b1de7714fe86a2f49ebc19
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -5,8 +5,15 @@ Filters sumo access log lines and extracts useful information.
|
|
5
5
|
This projects needs jruby, so use "rvm use jruby". Tested and deployed with jruby 9.0.4.0
|
6
6
|
|
7
7
|
# Versions
|
8
|
+
|
8
9
|
3.0.12 Updated ismvod to cover all types starting with ismvod
|
9
10
|
3.0.13 Updated to latest logstash version
|
11
|
+
3.0.17 Updated to include all dashvod variants
|
12
|
+
3.0.18 Added healthcheck as videotype
|
13
|
+
3.0.19 Bug fix
|
14
|
+
3.0.20 Added support for hdsvod
|
15
|
+
3.0.21 Added support for vod4
|
16
|
+
3.0.22 Added support for /origin1-live.akamai.tv2.no/live/727992.isml/Manifest
|
10
17
|
|
11
18
|
|
12
19
|
## Build
|
@@ -20,6 +27,10 @@ bundle exec rake publish_gem
|
|
20
27
|
Go to main logstash directory
|
21
28
|
bin/plugin install --version 3.0.11 logstash-filter-sumo
|
22
29
|
|
30
|
+
|
31
|
+
## Api access
|
32
|
+
http://sumo.tv2.no/api/web/asset/1035131
|
33
|
+
|
23
34
|
#### Test
|
24
35
|
|
25
36
|
- Update your dependencies
|
@@ -40,6 +51,60 @@ bundle exec rake vendor
|
|
40
51
|
bundle exec rspec
|
41
52
|
```
|
42
53
|
|
54
|
+
## Api access
|
55
|
+
http://sumo.tv2.no/api/web/asset/1035131
|
56
|
+
|
57
|
+
|
58
|
+
|
43
59
|
Author : Leif Terje Fonnes ( leffen@gmail.com )
|
44
60
|
|
45
61
|
|
62
|
+
## Elemental links
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
/out/u/463577.mpd => path_type=“elemental live”, dist_type=“live”, video_type=“dash”, asset_id=463577, vtype="manifest"
|
68
|
+
/out/u/463577_video_1_0_3425579.mp4?m=1500616216 => path_type=“elemental live”, dist_type=“live”,video_type=“dash”, asset_id=463577 , vtype="segment"
|
69
|
+
/out/u/880009.m3u8 => path_type=“elemental live”, dist_type=“live”,video_type=“hls”, asset_id=880009, vtype="playlist"
|
70
|
+
/out/u/880009_6.m3u8 => path_type=“elemental live”, dist_type=“live”,video_type=“hls”, asset_id=880009, vtype="chunklist"
|
71
|
+
/out/u/880009_6_3584645.ts?m=1501848254 => path_type=“elemental live”, dist_type=“live”,video_type=“hls”, asset_id=880009, vtype="segment"
|
72
|
+
/out/u/880009.ism/Manifest => path_type=“elemental live”, dist_type=“live”,video_type=“ism”, asset_id=880009, vtype="manifest"
|
73
|
+
/out/u/880009.ism/Events(72_1501848239)/QualityLevels(2499968)/Fragments(v=77110176346666) => path_type=“elemental live”, dist_type=“live”,video_type=“ism”, asset_id=880009, vtype="segment"
|
74
|
+
|
75
|
+
|
76
|
+
On 16 Aug 2017, at 10:18, Robert Uglehus <Robert.Uglehus@tv2.no> wrote:
|
77
|
+
|
78
|
+
Manifest:
|
79
|
+
/out/u/463577.mpd
|
80
|
+
(.mpd indikerer at det er dash manifest)
|
81
|
+
Segment:
|
82
|
+
/out/u/463577_video_1_0_3425579.mp4?m=1500616216
|
83
|
+
(.mp4 indikerer at det er dash segment)
|
84
|
+
(progid 463577)
|
85
|
+
|
86
|
+
|
87
|
+
HLS:
|
88
|
+
Manifest/playliste:
|
89
|
+
/out/u/880009.m3u8
|
90
|
+
Chunkliste:
|
91
|
+
/out/u/880009_6.m3u8
|
92
|
+
(.m3u8 indikerer at det er playliste)
|
93
|
+
Segment:
|
94
|
+
/out/u/880009_6_3584645.ts?m=1501848254
|
95
|
+
(.ts indikerer at det er HLS segment)
|
96
|
+
(progid 880009)
|
97
|
+
|
98
|
+
|
99
|
+
ISM:
|
100
|
+
Manifest
|
101
|
+
/out/u/880009.ism/Manifest
|
102
|
+
(“Manifest” indikerer at det er ISM manifest
|
103
|
+
Segment:
|
104
|
+
/out/u/880009.ism/Events(72_1501848239)/QualityLevels(2499968)/Fragments(v=77110176346666)
|
105
|
+
(“QualityLevels” indikerer at det er segment)
|
106
|
+
(progid 880009)
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
@@ -9,6 +9,7 @@ class LogStash::Filters::Sumo < LogStash::Filters::Base
|
|
9
9
|
|
10
10
|
config :field, :validate => :string, :default => "page"
|
11
11
|
|
12
|
+
|
12
13
|
def wzlive_parse(uarray)
|
13
14
|
web_stream = uarray[3].split(":")[1]
|
14
15
|
video_type = uarray.last.split(".").last
|
@@ -26,6 +27,22 @@ class LogStash::Filters::Sumo < LogStash::Filters::Base
|
|
26
27
|
{path_type: "dashvod", dist_type: "vod", video_type: video_type, asset_id: asset_id, chunk_type: chunk_type}
|
27
28
|
end
|
28
29
|
|
30
|
+
def vod_parse uarray
|
31
|
+
last_seg = uarray.last.split(".")
|
32
|
+
if uarray.count < 4
|
33
|
+
return {path_type: "vod", dist_type: "vod",video_type: "unknown"}
|
34
|
+
end
|
35
|
+
|
36
|
+
asset_id = uarray[3].split(":")[1].split("_").first.to_i
|
37
|
+
video_type = last_seg.last
|
38
|
+
|
39
|
+
vtype = nil
|
40
|
+
vtype = "segment" if uarray.count > 4
|
41
|
+
|
42
|
+
{path_type: "vod", dist_type: "vod", video_type: video_type, asset_id: asset_id, vtype: vtype}
|
43
|
+
end
|
44
|
+
|
45
|
+
|
29
46
|
def vod2_parse uarray
|
30
47
|
asset_id = uarray[3].split(":")[1].split("_").first.to_i
|
31
48
|
last_seg = uarray.last.split(".")
|
@@ -44,10 +61,30 @@ class LogStash::Filters::Sumo < LogStash::Filters::Base
|
|
44
61
|
|
45
62
|
def ismvod_parse uarray
|
46
63
|
last_seg = uarray.last.split(".")
|
64
|
+
if uarray.count < 4
|
65
|
+
return {path_type: "ismvod", dist_type: "vod",video_type: "unknown"}
|
66
|
+
end
|
67
|
+
|
47
68
|
asset_id = uarray[3].split(":")[1].split(".").first.to_i
|
48
69
|
video_type = last_seg.last
|
70
|
+
vtype = nil
|
71
|
+
vtype = "segment" if uarray.count > 5
|
49
72
|
|
50
|
-
{path_type: "ismvod", dist_type: "vod", video_type: video_type, asset_id: asset_id}
|
73
|
+
{path_type: "ismvod", dist_type: "vod", video_type: video_type, asset_id: asset_id, vtype: vtype}
|
74
|
+
end
|
75
|
+
|
76
|
+
def hdsvod_parse uarray
|
77
|
+
last_seg = uarray.last.split(".")
|
78
|
+
if uarray.count < 4
|
79
|
+
return {path_type: "hdshvod", dist_type: "vod",video_type: "unknown"}
|
80
|
+
end
|
81
|
+
|
82
|
+
asset_id = uarray[3].split(":")[1].split(".").first.to_i
|
83
|
+
video_type = last_seg.last
|
84
|
+
vtype = nil
|
85
|
+
vtype = "segment" if uarray.count > 5
|
86
|
+
|
87
|
+
{path_type: "wowza vod", dist_type: "vod", video_type: "hds", asset_id: asset_id, vtype: vtype}
|
51
88
|
end
|
52
89
|
|
53
90
|
def ism_parse uarray
|
@@ -58,26 +95,145 @@ class LogStash::Filters::Sumo < LogStash::Filters::Base
|
|
58
95
|
{path_type: "ism", dist_type: "vod", video_type: page_type.last, asset_id: asset_id}
|
59
96
|
end
|
60
97
|
|
98
|
+
def isml_live_parse uarray
|
99
|
+
# ["", "live", "727992.isml"]
|
100
|
+
page_name = uarray.pop
|
101
|
+
splitted_page = page_name.split(".")
|
102
|
+
|
103
|
+
return {} if splitted_page.count<2
|
104
|
+
|
105
|
+
page_type = splitted_page[1]
|
106
|
+
asset_id = splitted_page[0].to_i
|
107
|
+
|
108
|
+
{path_type: "isml", dist_type: "live", video_type: page_type, asset_id: asset_id}
|
109
|
+
end
|
110
|
+
|
111
|
+
def isml_parse uarray
|
112
|
+
# ["", "live", "727992.isml"]
|
113
|
+
|
114
|
+
# /origin1-live.akamai.tv2.no/live/727992.isml/Manifest
|
115
|
+
if uarray.last == "Manifest" && uarray[2]== "live"
|
116
|
+
aparts = uarray[3].split(".")
|
117
|
+
asset_id = aparts[0]
|
118
|
+
|
119
|
+
return {path_type: "live", dist_type: "live", video_type: "ism", vtype: "manifest", asset_id: asset_id.to_s.to_i}
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
page_name = uarray.pop
|
125
|
+
splitted_page = page_name.split(".")
|
126
|
+
|
127
|
+
return {} if splitted_page.count<2
|
128
|
+
|
129
|
+
page_type = splitted_page[1]
|
130
|
+
asset_id = splitted_page[0].to_i
|
131
|
+
|
132
|
+
{path_type: "isml", dist_type: "vod", video_type: page_type, asset_id: asset_id}
|
133
|
+
end
|
134
|
+
|
135
|
+
def out_parse uarray
|
136
|
+
return {path_type: "unknown - to few eleements", dist_type: "unknown", uarray: uarray} if uarray.count<4
|
137
|
+
|
138
|
+
page = uarray[3].strip
|
139
|
+
page_parts = page.split(".")
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
return {path_type: "unknown - to few page elements", dist_type: "unknown", uarray: uarray} unless page_parts && page_parts.count > 1
|
144
|
+
|
145
|
+
|
146
|
+
# /out/u/463577.mpd => path_type=“elemental live”, dist_type=“live”, video_type=“dash”, asset_id=463577, vtype="manifest"
|
147
|
+
if page_parts[1] == "mpd"
|
148
|
+
return {path_type: "elemental live", dist_type: "live", video_type: "dash", vtype: "manifest", asset_id: page_parts[0].to_i}
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
# /out/u/463577_video_1_0_3425579.mp4?m=1500616216 => path_type=“elemental live”, dist_type=“live”,video_type=“dash”, asset_id=463577 , vtype="segment"
|
153
|
+
if page_parts[1] == "mp4"
|
154
|
+
first_part = page_parts[0].split("_").first
|
155
|
+
|
156
|
+
return {path_type: "elemental live", dist_type: "live", video_type: "dash", vtype: "segment", asset_id: first_part.to_i}
|
157
|
+
end
|
158
|
+
|
159
|
+
# /out/u/880009.m3u8 => path_type=“elemental live”, dist_type=“live”,video_type=“hls”, asset_id=880009, vtype="playlist"
|
160
|
+
# /out/u/880009_6.m3u8 => path_type=“elemental live”, dist_type=“live”,video_type=“hls”, asset_id=880009, vtype="chunklist"
|
161
|
+
if page_parts[1] == "m3u8"
|
162
|
+
|
163
|
+
first_part = page_parts[0].split("_")
|
164
|
+
|
165
|
+
if first_part.count == 1
|
166
|
+
return {path_type: "elemental live", dist_type: "live", video_type: "hls", vtype: "playlist", asset_id: page_parts[0].to_i}
|
167
|
+
end
|
168
|
+
|
169
|
+
return {path_type: "elemental live", dist_type: "live", video_type: "hls", vtype: "chunklist", asset_id: first_part[0].to_i}
|
170
|
+
end
|
171
|
+
|
172
|
+
# /out/u/880009_6_3584645.ts?m=1501848254 => path_type=“elemental live”, dist_type=“live”,video_type=“hls”, asset_id=880009, vtype="segment"
|
173
|
+
if page_parts[1] == "ts"
|
174
|
+
first_part = page_parts[0].split("_").first
|
175
|
+
|
176
|
+
|
177
|
+
return {path_type: "elemental live", dist_type: "live", video_type: "hls", vtype: "segment", asset_id: first_part.to_i}
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
return {path_type: "unknown type - to few arguments", dist_type: "unknown"} unless uarray.count > 3
|
182
|
+
|
183
|
+
|
184
|
+
# /out/u/880009.ism/Manifest => path_type=“elemental live”, dist_type=“live”,video_type=“ism”, asset_id=880009, vtype="manifest"
|
185
|
+
if uarray[4] == "Manifest"
|
186
|
+
return {path_type: "elemental live", dist_type: "live", video_type: "ism", vtype: "manifest", asset_id: page_parts[0].to_i}
|
187
|
+
end
|
188
|
+
|
189
|
+
# /out/u/880009.ism/Events(72_1501848239)/QualityLevels(2499968)/Fragments(v=77110176346666) => path_type=“elemental live”, dist_type=“live”,video_type=“ism”, asset_id=880009, vtype="segment"
|
190
|
+
if uarray[4].include? "Events"
|
191
|
+
return {path_type: "elemental live", dist_type: "live", video_type: "ism", vtype: "segment", asset_id: page_parts[0].to_i}
|
192
|
+
end
|
193
|
+
|
194
|
+
# Default empty
|
195
|
+
{path_type: "unknown type", dist_type: "unknown"}
|
196
|
+
end
|
197
|
+
|
198
|
+
|
61
199
|
def parse_page page
|
62
200
|
return {} unless page.to_s.strip.length > 0
|
63
201
|
uri = URI.parse(page)
|
64
202
|
uarray = uri.path.split("/")
|
203
|
+
return {} if uarray.length < 2
|
204
|
+
|
65
205
|
page_type = uarray[-2]
|
66
206
|
|
67
207
|
return {} unless page_type && uarray.count > 0
|
68
208
|
|
69
|
-
|
209
|
+
root_page = uarray[1].to_s.downcase
|
210
|
+
|
211
|
+
#puts "VOD Startswith #{root_page} #{root_page.start_with? 'vod'}"
|
212
|
+
|
213
|
+
if root_page == 'wzlive'
|
70
214
|
wzlive_parse(uarray)
|
71
|
-
elsif
|
215
|
+
elsif root_page.include?('dashvod')
|
72
216
|
dashvod_parse(uarray)
|
73
|
-
elsif
|
217
|
+
elsif root_page == 'vod2'
|
74
218
|
vod2_parse(uarray)
|
75
|
-
elsif
|
219
|
+
elsif root_page.start_with? 'vod'
|
220
|
+
vod_parse(uarray)
|
221
|
+
elsif root_page == 'ismusp'
|
76
222
|
ismusp_parse(uarray)
|
77
|
-
elsif
|
223
|
+
elsif root_page.include?('ismvod')
|
78
224
|
ismvod_parse(uarray)
|
225
|
+
elsif root_page.include?('hdsvod')
|
226
|
+
hdsvod_parse(uarray)
|
227
|
+
elsif root_page == 'out'
|
228
|
+
out_parse uarray
|
229
|
+
elsif page_type.to_s.include?(".isml") && root_page.to_s.include?("live")
|
230
|
+
isml_parse(uarray)
|
79
231
|
elsif page_type.to_s.include?(".ism")
|
80
232
|
ism_parse(uarray)
|
233
|
+
elsif root_page == 'live'
|
234
|
+
isml_parse uarray
|
235
|
+
elsif root_page.include?("healthcheck")
|
236
|
+
{path_type: "healthcheck", dist_type: "healthcheck", video_type:"healthcheck"}
|
81
237
|
else
|
82
238
|
{}
|
83
239
|
end
|
@@ -86,29 +242,34 @@ class LogStash::Filters::Sumo < LogStash::Filters::Base
|
|
86
242
|
|
87
243
|
public
|
88
244
|
def register
|
89
|
-
|
245
|
+
|
90
246
|
end
|
91
247
|
|
92
248
|
# def register
|
93
249
|
|
94
250
|
public
|
95
251
|
def filter(event)
|
96
|
-
@logger.debug? && @logger.debug("Sumo filter: received event", :type => event["type"])
|
97
252
|
|
98
253
|
return unless filter?(@field)
|
99
|
-
if @field && event[@field]
|
100
|
-
begin
|
101
|
-
puts "*** PARSING AT LEAST ***"
|
102
|
-
data = parse_page(event[@field])
|
103
|
-
data.each { |k, v| event[k.to_s]=v }
|
104
|
-
@logger.debug("SUMO> ", :pg => event[@field], :data => data)
|
105
|
-
rescue => e
|
106
|
-
@logger.error("SUMO> ", :pg => event[@field], :exception => e)
|
107
|
-
end
|
108
254
|
|
255
|
+
if @field
|
256
|
+
fieldValue = event.get(@field)
|
257
|
+
|
258
|
+
if fieldValue
|
259
|
+
begin
|
260
|
+
data = parse_page(fieldValue)
|
261
|
+
data.each { |k, v| event.set(k.to_s,v) }
|
262
|
+
# puts ("SUMO> #{fieldValue} Event #{event} DATA: #{data}")
|
263
|
+
rescue => e
|
264
|
+
@logger.error("SUMO> ", :pg => fieldValue, :exception => e)
|
265
|
+
end
|
266
|
+
end
|
109
267
|
end
|
110
268
|
|
269
|
+
|
111
270
|
# filter_matched should go in the last line of our successful code
|
112
271
|
filter_matched(event)
|
113
272
|
end # def filter
|
273
|
+
|
274
|
+
|
114
275
|
end # class LogStash::Filters::Sumo
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-filter-sumo'
|
3
|
-
s.version = '3.0.
|
3
|
+
s.version = '3.0.22'
|
4
4
|
s.licenses = ['Apache License (2.0)']
|
5
5
|
s.summary = "This filter extracts interessting SUMO values from the page element if present."
|
6
6
|
s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
|
@@ -19,7 +19,8 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.metadata = { "logstash_plugin" => "true", "logstash_group" => "filter" }
|
20
20
|
|
21
21
|
# Gem dependencies
|
22
|
-
s.add_runtime_dependency "logstash-core-plugin-api", "~>
|
22
|
+
s.add_runtime_dependency "logstash-core-plugin-api", "~> 2.0"
|
23
|
+
s.add_runtime_dependency 'redis'
|
23
24
|
s.add_development_dependency 'rspec', '~> 3.1'
|
24
25
|
s.add_development_dependency 'logstash-devutils'
|
25
26
|
|
data/spec/filters/sumo_spec.rb
CHANGED
@@ -13,11 +13,11 @@ describe LogStash::Filters::Sumo do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
sample("page"=>"/dashvod/_definst_/amlst:993514_ps20000_pd1291830.smil/chunk_ctaudio_cfm4s_ridp0a1r1_cs28929600_mpd.m4s" ) do
|
16
|
-
|
17
|
-
|
18
|
-
expect(subject
|
19
|
-
expect(subject
|
20
|
-
expect(subject
|
16
|
+
insist { subject.get('path_type') } == 'dashvod'
|
17
|
+
|
18
|
+
expect(subject.get('dist_type')).to eq('vod')
|
19
|
+
expect(subject.get('video_type')).to eq('m4s')
|
20
|
+
expect(subject.get('asset_id')).to eq(993514)
|
21
21
|
end
|
22
22
|
|
23
23
|
end
|
@@ -32,11 +32,11 @@ describe LogStash::Filters::Sumo do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
sample("page"=>"/ismusp/2013-10-22/N_RYANAIR_221013_TOB_NET(763009_R22MP41000).mp4" ) do
|
35
|
-
|
36
|
-
|
37
|
-
expect(subject
|
38
|
-
expect(subject
|
39
|
-
expect(subject
|
35
|
+
insist { subject.get('path_type') } == 'ismusp'
|
36
|
+
|
37
|
+
expect(subject.get('dist_type')).to eq('vod')
|
38
|
+
expect(subject.get('video_type')).to eq('mp4')
|
39
|
+
expect(subject.get('asset_id')).to eq(763009)
|
40
40
|
end
|
41
41
|
|
42
42
|
end
|
@@ -51,11 +51,10 @@ describe LogStash::Filters::Sumo do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
sample("page"=>"/vod2/_definst_/amlst:1027448_ps55210_pd1373700_HRDNGR.smil/media_b6378000_43.ts" ) do
|
54
|
-
|
55
|
-
expect(subject
|
56
|
-
expect(subject
|
57
|
-
expect(subject
|
58
|
-
expect(subject['asset_id']).to eq(1027448)
|
54
|
+
insist { subject.get('path_type') } == 'vod2'
|
55
|
+
expect(subject.get('dist_type')).to eq('vod')
|
56
|
+
expect(subject.get('video_type')).to eq('ts')
|
57
|
+
expect(subject.get('asset_id')).to eq(1027448)
|
59
58
|
end
|
60
59
|
|
61
60
|
end
|
@@ -70,11 +69,10 @@ describe LogStash::Filters::Sumo do
|
|
70
69
|
end
|
71
70
|
|
72
71
|
sample("page"=>"/wzlive/_definst_/amlst:LS6/433127.smil/manifest.mpd" ) do
|
73
|
-
|
74
|
-
expect(subject
|
75
|
-
expect(subject
|
76
|
-
expect(subject
|
77
|
-
expect(subject['asset_id']).to eq(433127)
|
72
|
+
insist { subject.get('path_type') } == 'wzlive'
|
73
|
+
expect(subject.get('dist_type')).to eq('live')
|
74
|
+
expect(subject.get('video_type')).to eq('mpd')
|
75
|
+
expect(subject.get('asset_id')).to eq(433127)
|
78
76
|
end
|
79
77
|
|
80
78
|
end
|
@@ -90,11 +88,10 @@ describe LogStash::Filters::Sumo do
|
|
90
88
|
end
|
91
89
|
|
92
90
|
sample("page"=>"/ismvod/_definst_/amlst:1027479.smil.ism/QualityLevels(126793)/Fragments(audio=143034920).isma" ) do
|
93
|
-
|
94
|
-
expect(subject
|
95
|
-
expect(subject
|
96
|
-
expect(subject
|
97
|
-
expect(subject['asset_id']).to eq(1027479)
|
91
|
+
insist { subject.get('path_type') } == 'ismvod'
|
92
|
+
expect(subject.get('dist_type')).to eq('vod')
|
93
|
+
expect(subject.get('video_type')).to eq('isma')
|
94
|
+
expect(subject.get('asset_id')).to eq(1027479)
|
98
95
|
end
|
99
96
|
|
100
97
|
end
|
@@ -110,17 +107,254 @@ describe LogStash::Filters::Sumo do
|
|
110
107
|
end
|
111
108
|
|
112
109
|
sample("pg"=>"/ismvod/_definst_/amlst:1027479.smil.ism/QualityLevels(126793)/Fragments(audio=143034920).isma" ) do
|
113
|
-
|
114
|
-
expect(subject
|
115
|
-
expect(subject
|
116
|
-
expect(subject
|
117
|
-
|
110
|
+
insist { subject.get('path_type') } == 'ismvod'
|
111
|
+
expect(subject.get('dist_type')).to eq('vod')
|
112
|
+
expect(subject.get('video_type')).to eq('isma')
|
113
|
+
expect(subject.get('asset_id')).to eq(1027479)
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "Live url /live/727992.isml" do
|
119
|
+
let(:config) do <<-CONFIG
|
120
|
+
filter {
|
121
|
+
sumo {
|
122
|
+
field => "pg"
|
123
|
+
}
|
124
|
+
}
|
125
|
+
CONFIG
|
126
|
+
end
|
127
|
+
|
128
|
+
sample("pg"=>"/live/727992.isml" ) do
|
129
|
+
insist { subject.get('path_type') } == 'isml'
|
130
|
+
expect(subject.get('dist_type')).to eq('vod')
|
131
|
+
expect(subject.get('video_type')).to eq('isml')
|
132
|
+
expect(subject.get('asset_id')).to eq(727992)
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
describe "Live url /out/u/463577.mpd" do
|
139
|
+
let(:config) do <<-CONFIG
|
140
|
+
filter {
|
141
|
+
sumo {
|
142
|
+
field => "pg"
|
143
|
+
}
|
144
|
+
}
|
145
|
+
CONFIG
|
146
|
+
end
|
147
|
+
|
148
|
+
sample("pg"=>"/out/u/463577.mpd" ) do
|
149
|
+
insist { subject.get('path_type') } == 'elemental live'
|
150
|
+
expect(subject.get('dist_type')).to eq('live')
|
151
|
+
expect(subject.get('video_type')).to eq('dash')
|
152
|
+
expect(subject.get('asset_id')).to eq(463577)
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
describe "Live url /out/u/463577_video_1_0_3425579.mp4?m=1500616216" do
|
158
|
+
let(:config) do <<-CONFIG
|
159
|
+
filter {
|
160
|
+
sumo {
|
161
|
+
field => "pg"
|
162
|
+
}
|
163
|
+
}
|
164
|
+
CONFIG
|
165
|
+
end
|
166
|
+
|
167
|
+
sample("pg"=>"/out/u/463577_video_1_0_3425579.mp4?m=1500616216" ) do
|
168
|
+
insist { subject.get('path_type') } == 'elemental live'
|
169
|
+
expect(subject.get('dist_type')).to eq('live')
|
170
|
+
expect(subject.get('video_type')).to eq('dash')
|
171
|
+
expect(subject.get('asset_id')).to eq(463577)
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
175
|
+
|
176
|
+
describe "Live url /out/u/880009.m3u8" do
|
177
|
+
let(:config) do <<-CONFIG
|
178
|
+
filter {
|
179
|
+
sumo {
|
180
|
+
field => "pg"
|
181
|
+
}
|
182
|
+
}
|
183
|
+
CONFIG
|
184
|
+
end
|
185
|
+
|
186
|
+
sample("pg"=>"/out/u/463577_video_1_0_3425579.mp4?m=1500616216" ) do
|
187
|
+
insist { subject.get('path_type') } == 'elemental live'
|
188
|
+
expect(subject.get('dist_type')).to eq('live')
|
189
|
+
expect(subject.get('video_type')).to eq('dash')
|
190
|
+
expect(subject.get('asset_id')).to eq(463577)
|
191
|
+
expect(subject.get('vtype')).to eq("segment")
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|
195
|
+
|
196
|
+
describe "Live url /out/u/880009_6.m3u8" do
|
197
|
+
let(:config) do <<-CONFIG
|
198
|
+
filter {
|
199
|
+
sumo {
|
200
|
+
field => "pg"
|
201
|
+
}
|
202
|
+
}
|
203
|
+
CONFIG
|
204
|
+
end
|
205
|
+
|
206
|
+
sample("pg"=>"/out/u/880009_6.m3u8" ) do
|
207
|
+
insist { subject.get('path_type') } == 'elemental live'
|
208
|
+
expect(subject.get('dist_type')).to eq('live')
|
209
|
+
expect(subject.get('video_type')).to eq('hls')
|
210
|
+
expect(subject.get('asset_id')).to eq(880009)
|
211
|
+
expect(subject.get('vtype')).to eq("chunklist")
|
212
|
+
end
|
213
|
+
|
214
|
+
end
|
215
|
+
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
|
220
|
+
describe "Live url /out/u/880009_6_3584645.ts?m=1501848254" do
|
221
|
+
let(:config) do <<-CONFIG
|
222
|
+
filter {
|
223
|
+
sumo {
|
224
|
+
field => "pg"
|
225
|
+
}
|
226
|
+
}
|
227
|
+
CONFIG
|
228
|
+
end
|
229
|
+
|
230
|
+
sample("pg"=>"/out/u/880009_6_3584645.ts?m=1501848254" ) do
|
231
|
+
insist { subject.get('path_type') } == 'elemental live'
|
232
|
+
expect(subject.get('dist_type')).to eq('live')
|
233
|
+
expect(subject.get('video_type')).to eq('hls')
|
234
|
+
expect(subject.get('asset_id')).to eq(880009)
|
235
|
+
expect(subject.get('vtype')).to eq("segment")
|
236
|
+
end
|
237
|
+
|
238
|
+
end
|
239
|
+
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
describe "Live url /out/u/880009.ism/Manifest" do
|
244
|
+
let(:config) do <<-CONFIG
|
245
|
+
filter {
|
246
|
+
sumo {
|
247
|
+
field => "pg"
|
248
|
+
}
|
249
|
+
}
|
250
|
+
CONFIG
|
251
|
+
end
|
252
|
+
|
253
|
+
sample("pg"=>"/out/u/880009.ism/Manifest" ) do
|
254
|
+
insist { subject.get('path_type') } == 'elemental live'
|
255
|
+
expect(subject.get('dist_type')).to eq('live')
|
256
|
+
expect(subject.get('video_type')).to eq('ism')
|
257
|
+
expect(subject.get('asset_id')).to eq(880009)
|
258
|
+
expect(subject.get('vtype')).to eq("manifest")
|
118
259
|
end
|
119
260
|
|
120
261
|
end
|
121
262
|
|
122
263
|
|
264
|
+
describe "Live url /out/u/880009.ism/Events(72_1501848239)/QualityLevels(2499968)/Fragments(v=77110176346666)" do
|
265
|
+
let(:config) do <<-CONFIG
|
266
|
+
filter {
|
267
|
+
sumo {
|
268
|
+
field => "pg"
|
269
|
+
}
|
270
|
+
}
|
271
|
+
CONFIG
|
272
|
+
end
|
273
|
+
|
274
|
+
sample("pg"=>"/out/u/880009.ism/Events(72_1501848239)/QualityLevels(2499968)/Fragments(v=77110176346666)" ) do
|
275
|
+
insist { subject.get('path_type') } == 'elemental live'
|
276
|
+
expect(subject.get('dist_type')).to eq('live')
|
277
|
+
expect(subject.get('video_type')).to eq('ism')
|
278
|
+
expect(subject.get('asset_id')).to eq(880009)
|
279
|
+
expect(subject.get('vtype')).to eq("segment")
|
280
|
+
end
|
281
|
+
|
282
|
+
end
|
123
283
|
|
124
284
|
|
285
|
+
describe "VOD url 2017-09-13 11:00:02 W3SVC1 wmosl8 195.5.113.121 GET /ismvod7/_definst_/amlst:1156413.smil.ism/QualityLevels(125666)/Fragments(audio=2201948299).isma X-ARR-CACHE-HIT=0&SERVER-ROUTED=193.160.157.68&X-ARR-LOG-ID=be27667e-7b28-42c8-ac4a-60b2082e7e45&SERVER-STATUS=200 80 - 148.123.2.6 HTTP/1.1 SSPK+client/1.51+(compatible;+LG+NetCast.TV-2013) - multicdn2.local 200 0 0 34219 497 18
|
286
|
+
" do
|
287
|
+
let(:config) do <<-CONFIG
|
288
|
+
filter {
|
289
|
+
sumo {
|
290
|
+
field => "pg"
|
291
|
+
}
|
292
|
+
}
|
293
|
+
CONFIG
|
294
|
+
end
|
295
|
+
|
296
|
+
sample("pg"=>"/ismvod7/_definst_/amlst:1156413.smil.ism/QualityLevels(125666)/Fragments(audio=2201948299).isma" ) do
|
297
|
+
insist { subject.get('path_type') } == 'ismvod'
|
298
|
+
expect(subject.get('dist_type')).to eq('vod')
|
299
|
+
expect(subject.get('video_type')).to eq('isma')
|
300
|
+
expect(subject.get('asset_id')).to eq(1156413)
|
301
|
+
expect(subject.get('vtype')).to eq("segment")
|
302
|
+
end
|
303
|
+
|
304
|
+
end
|
305
|
+
|
306
|
+
|
307
|
+
describe "VOD url /hdsvod/_definst_/amlst:1230502_ps1140_pd2071840.smil/media_b2003000.abst/Seg1-Frag891" do
|
308
|
+
let(:config) do <<-CONFIG
|
309
|
+
filter {
|
310
|
+
sumo {
|
311
|
+
field => "pg"
|
312
|
+
}
|
313
|
+
}
|
314
|
+
CONFIG
|
315
|
+
end
|
316
|
+
|
317
|
+
sample("pg"=>"/hdsvod/_definst_/amlst:1230502_ps1140_pd2071840.smil/media_b2003000.abst/Seg1-Frag891" ) do
|
318
|
+
insist { subject.get('path_type') } == 'wowza vod'
|
319
|
+
expect(subject.get('dist_type')).to eq('vod')
|
320
|
+
expect(subject.get('video_type')).to eq('hds')
|
321
|
+
expect(subject.get('asset_id')).to eq(1230502)
|
322
|
+
expect(subject.get('vtype')).to eq("segment")
|
323
|
+
end
|
324
|
+
|
325
|
+
end
|
326
|
+
|
327
|
+
|
328
|
+
|
329
|
+
describe "VOD url /vod4/_definst_/amlst:1224663_ps60000_pd1482000_HRDNGR.smil/media_b1250000_ko_152.ts" do
|
330
|
+
let(:config) do <<-CONFIG
|
331
|
+
filter {
|
332
|
+
sumo {
|
333
|
+
field => "pg"
|
334
|
+
}
|
335
|
+
}
|
336
|
+
CONFIG
|
337
|
+
end
|
338
|
+
|
339
|
+
sample("pg"=>"/vod4/_definst_/amlst:1224663_ps60000_pd1482000_HRDNGR.smil/media_b1250000_ko_152.ts" ) do
|
340
|
+
insist { subject.get('path_type') } == 'vod'
|
341
|
+
expect(subject.get('dist_type')).to eq('vod')
|
342
|
+
expect(subject.get('video_type')).to eq('ts')
|
343
|
+
expect(subject.get('asset_id')).to eq(1224663)
|
344
|
+
expect(subject.get('vtype')).to eq("segment")
|
345
|
+
end
|
346
|
+
|
347
|
+
|
348
|
+
# /origin1-live.akamai.tv2.no/live/727992.isml/Manifest
|
349
|
+
sample("pg"=>"/origin1-live.akamai.tv2.no/live/727992.isml/Manifest" ) do
|
350
|
+
insist { subject.get('path_type') } == 'live'
|
351
|
+
expect(subject.get('dist_type')).to eq('live')
|
352
|
+
expect(subject.get('video_type')).to eq('ism')
|
353
|
+
expect(subject.get('asset_id')).to eq(727992)
|
354
|
+
expect(subject.get('vtype')).to eq("manifest")
|
355
|
+
end
|
356
|
+
|
357
|
+
|
358
|
+
end
|
125
359
|
|
126
360
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,12 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "logstash/devutils/rspec/spec_helper"
|
3
3
|
require 'pp'
|
4
|
+
require 'rspec'
|
5
|
+
require 'guard/jruby-rspec'
|
6
|
+
|
7
|
+
RSpec.configure do |config|
|
8
|
+
#config.color_enabled = true
|
9
|
+
config.filter_run :focus => true
|
10
|
+
config.run_all_when_everything_filtered = true
|
11
|
+
|
12
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-filter-sumo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TV 2
|
@@ -9,50 +9,64 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-01-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
15
20
|
name: logstash-core-plugin-api
|
21
|
+
prerelease: false
|
22
|
+
type: :runtime
|
16
23
|
version_requirements: !ruby/object:Gem::Requirement
|
17
24
|
requirements:
|
18
25
|
- - "~>"
|
19
26
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
27
|
+
version: '2.0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
21
29
|
requirement: !ruby/object:Gem::Requirement
|
22
30
|
requirements:
|
23
|
-
- - "
|
31
|
+
- - ">="
|
24
32
|
- !ruby/object:Gem::Version
|
25
|
-
version: '
|
33
|
+
version: '0'
|
34
|
+
name: redis
|
26
35
|
prerelease: false
|
27
36
|
type: :runtime
|
28
|
-
- !ruby/object:Gem::Dependency
|
29
|
-
name: rspec
|
30
37
|
version_requirements: !ruby/object:Gem::Requirement
|
31
38
|
requirements:
|
32
|
-
- - "
|
39
|
+
- - ">="
|
33
40
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
35
43
|
requirement: !ruby/object:Gem::Requirement
|
36
44
|
requirements:
|
37
45
|
- - "~>"
|
38
46
|
- !ruby/object:Gem::Version
|
39
47
|
version: '3.1'
|
48
|
+
name: rspec
|
40
49
|
prerelease: false
|
41
50
|
type: :development
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: logstash-devutils
|
44
51
|
version_requirements: !ruby/object:Gem::Requirement
|
45
52
|
requirements:
|
46
|
-
- - "
|
53
|
+
- - "~>"
|
47
54
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
55
|
+
version: '3.1'
|
56
|
+
- !ruby/object:Gem::Dependency
|
49
57
|
requirement: !ruby/object:Gem::Requirement
|
50
58
|
requirements:
|
51
59
|
- - ">="
|
52
60
|
- !ruby/object:Gem::Version
|
53
61
|
version: '0'
|
62
|
+
name: logstash-devutils
|
54
63
|
prerelease: false
|
55
64
|
type: :development
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
56
70
|
description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
|
57
71
|
email: leffen@gmail.com
|
58
72
|
executables: []
|
@@ -90,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
104
|
version: '0'
|
91
105
|
requirements: []
|
92
106
|
rubyforge_project:
|
93
|
-
rubygems_version: 2.
|
107
|
+
rubygems_version: 2.6.8
|
94
108
|
signing_key:
|
95
109
|
specification_version: 4
|
96
110
|
summary: This filter extracts interessting SUMO values from the page element if present.
|