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 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.