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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8f8789eca05b7b51c5dc38d112830923b6ad98e1
4
- data.tar.gz: 12134bdf7cead76dbf513a5d81066212d1c4b3a4
3
+ metadata.gz: 2219d28e3c848821f52a9eb67ea246058b956a63
4
+ data.tar.gz: 0b9039e60627e1136669352b0d565638eb6ecd03
5
5
  SHA512:
6
- metadata.gz: 7bd5f8e6cea36b42480d4a8d811465a664a0cc6f2f93d160075671cb043699800a2a55444a6e034c2a76541afc0d4b01402954637295294e1e2ff30847b9d2f8
7
- data.tar.gz: 2a649b0fade5e233c1967d3ec98b442a16ac186eac2e66f228102d41be29a18db595cbf06e2fc909a13047ceb075e28e984aa333bb030932af5c9ae431345ca9
6
+ metadata.gz: bbc8e82d378cf866ebceab4878ea5c327969d9efb18fa4925bdce30914dd58fb9bc832162ebbccf8a2c274b09ec24639b1827138ce1c19feef50105e883df526
7
+ data.tar.gz: b7eb743fe9d991cae62f18679a00acf8da007d33917f983127df1a8eb69e9ac82859a9053c6204bd7932985376f63573d380ac57b6b1de7714fe86a2f49ebc19
data/Gemfile CHANGED
@@ -2,6 +2,6 @@ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  group :development do
5
- gem 'guard',"1.8.3"
6
5
  gem 'guard-jruby-rspec', git: 'https://github.com/jkutner/guard-jruby-rspec.git'
6
+ gem 'rspec-legacy_formatters'
7
7
  end
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
- if uarray[1] == 'wzlive'
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 uarray[1] == 'dashvod'
215
+ elsif root_page.include?('dashvod')
72
216
  dashvod_parse(uarray)
73
- elsif uarray[1] == 'vod2'
217
+ elsif root_page == 'vod2'
74
218
  vod2_parse(uarray)
75
- elsif uarray[1] == 'ismusp'
219
+ elsif root_page.start_with? 'vod'
220
+ vod_parse(uarray)
221
+ elsif root_page == 'ismusp'
76
222
  ismusp_parse(uarray)
77
- elsif uarray[1].to_s.include?('ismvod')
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
- # Add instance variables
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.14'
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", "~> 1.0"
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
 
@@ -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
- expect(subject).to include("path_type")
17
- expect(subject['path_type']).to eq('dashvod')
18
- expect(subject['dist_type']).to eq('vod')
19
- expect(subject['video_type']).to eq('m4s')
20
- expect(subject['asset_id']).to eq(993514)
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
- expect(subject).to include("path_type")
36
- expect(subject['path_type']).to eq('ismusp')
37
- expect(subject['dist_type']).to eq('vod')
38
- expect(subject['video_type']).to eq('mp4')
39
- expect(subject['asset_id']).to eq(763009)
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
- expect(subject).to include("path_type")
55
- expect(subject['path_type']).to eq('vod2')
56
- expect(subject['dist_type']).to eq('vod')
57
- expect(subject['video_type']).to eq('ts')
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
- expect(subject).to include("path_type")
74
- expect(subject['path_type']).to eq('wzlive')
75
- expect(subject['dist_type']).to eq('live')
76
- expect(subject['video_type']).to eq('mpd')
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
- expect(subject).to include("path_type")
94
- expect(subject['path_type']).to eq('ismvod')
95
- expect(subject['dist_type']).to eq('vod')
96
- expect(subject['video_type']).to eq('isma')
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
- expect(subject).to include("path_type")
114
- expect(subject['path_type']).to eq('ismvod')
115
- expect(subject['dist_type']).to eq('vod')
116
- expect(subject['video_type']).to eq('isma')
117
- expect(subject['asset_id']).to eq(1027479)
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.14
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: 2016-04-19 00:00:00.000000000 Z
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: '1.0'
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: '1.0'
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: '3.1'
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: '0'
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.4.8
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.