logstash-filter-sumo 3.0.14 → 3.0.22
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/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.
|