fluent-plugin-referer-parser 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 56f8bf0b194d231cd18480ccb8eb565b3f96da29
4
+ data.tar.gz: 653fbea2b2c809b8c027070ef1f86be948b9f728
5
+ SHA512:
6
+ metadata.gz: af9bd61a4764e99dbc3ee371650bed74c4d26cbea11affb67bd01d82731dcb1e642367dda4d9c6c872fcf0330b70bd50137d39af6f8533f9f79e3c9a5c047cdb
7
+ data.tar.gz: c8f624d327d091b6b55535c044e8de72dca2d349ca176dd92f925a348098ae676ef65254e173b7e74747b15d26572f8fa9c26db06b126866af2daae6aa55ec52
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,14 @@
1
+ Copyright (c) 2012- TAGOMORI Satoshi
2
+ Copyright (c) HARUYAMA Seigo
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # fluent-plugin-referer-parser
2
+
3
+ ## WootheeOutput
4
+
5
+ 'fluent-plugin-referer-parser' is a Fluentd plugin to parse Referer strings, based on [tagomoris/fluent-plugin-woothee](https://github.com/tagomoris/fluent-plugin-woothee).
6
+ 'fluent-plugin-referer-parser' uses [snowplow/referer-parser](https://github.com/snowplow/referer-parser).
7
+
8
+
9
+ ## Configuration
10
+
11
+ To add referer-parser result into matched messages:
12
+
13
+ <match input.**>
14
+ type referer_parser
15
+ key_name referer
16
+ remove_prefix input
17
+ add_prefix merged
18
+ </match>
19
+
20
+ Output messages with tag 'merged.**' has 'referer\_known', 'referer\_referer' and 'referer\_search\_term' attributes. If you want to change attribute names, write configurations as below:
21
+
22
+ <match input.**>
23
+ type referer_parser
24
+ key_name ref
25
+ remove_prefix input
26
+ add_prefix merged
27
+ out_key_known ref_known
28
+ out_key_referer ref_referer
29
+ out_key_search_term ref_search_term
30
+ </match>
31
+
32
+
33
+ ## Copyright
34
+
35
+ * Copyright (c) 2012- TAGOMORI Satoshi (tagomoris)
36
+ * Copyright (c) HARUYAMA Seigo
37
+ * License
38
+ * Apache License, Version 2.0
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/test_*.rb'
8
+ test.verbose = true
9
+ end
10
+
11
+ task :default => :test
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = 'fluent-plugin-referer-parser'
5
+ gem.version = '0.0.1'
6
+ gem.authors = ['TAGOMORI Satoshi', 'HARUYAMA Seigo']
7
+ gem.email = ['tagomoris@gmail.com', 'haruyama@unixuser.org']
8
+ gem.description = %q{parsing by referer-parser. See: https://github.com/snowplow/referer-parser}
9
+ gem.summary = %q{Fluentd plugin to parse UserAgent strings}
10
+ gem.homepage = 'https://github.com/haruyama/fluent-plugin-referer-parser'
11
+ gem.license = 'APLv2'
12
+
13
+ gem.files = `git ls-files`.split($\)
14
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
15
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
16
+ gem.require_paths = ['lib']
17
+
18
+ gem.add_development_dependency 'rake'
19
+ gem.add_runtime_dependency 'fluentd'
20
+ gem.add_runtime_dependency 'referer-parser', '>= 0.2.0'
21
+ end
@@ -0,0 +1,9 @@
1
+ LineLength:
2
+ Enabled: false
3
+
4
+ CyclomaticComplexity:
5
+ Enabled: false
6
+
7
+ MethodLength:
8
+ CountComments: false # count full line comments?
9
+ Max: 20
@@ -0,0 +1,79 @@
1
+ require 'ostruct'
2
+
3
+ # referer parser output
4
+ class Fluent::RefererParserOutput < Fluent::Output
5
+ Fluent::Plugin.register_output('referer_parser', self)
6
+
7
+ config_param :tag, :string, default: nil
8
+ config_param :remove_prefix, :string, default: nil
9
+ config_param :add_prefix, :string, default: nil
10
+
11
+ config_param :key_name, :string
12
+
13
+ config_param :merge_referer_info, :bool, default: false
14
+ config_param :out_key_known, :string, default: 'referer_known'
15
+ config_param :out_key_referer, :string, default: 'referer_referer'
16
+ config_param :out_key_search_term, :string, default: 'referer_search_term'
17
+
18
+ UNKOWWN_STRING = 'UNKNOWN'
19
+ PARSE_ERROR_STRUCT = OpenStruct.new(known: false)
20
+
21
+ def initialize
22
+ super
23
+ require 'referer-parser'
24
+ end
25
+
26
+ def configure(conf)
27
+ super
28
+
29
+ if !@tag && !@remove_prefix && !@add_prefix
30
+ fail Fluent::ConfigError, 'missing both of remove_prefix and add_prefix'
31
+ end
32
+ if @tag && (@remove_prefix || @add_prefix)
33
+ fail Fluent::ConfigError, 'both of tag and remove_prefix/add_prefix must not be specified'
34
+ end
35
+ if @remove_prefix
36
+ @removed_prefix_string = @remove_prefix + '.'
37
+ @removed_length = @removed_prefix_string.length
38
+ end
39
+ @added_prefix_string = @add_prefix + '.' if @add_prefix
40
+ end
41
+
42
+ def tag_mangle(tag)
43
+ if @tag
44
+ @tag
45
+ else
46
+ if @remove_prefix &&
47
+ ( (tag.start_with?(@removed_prefix_string) && tag.length > @removed_length) || tag == @remove_prefix)
48
+ tag = tag[@removed_length..-1]
49
+ end
50
+ if @add_prefix
51
+ tag = if tag && tag.length > 0
52
+ @added_prefix_string + tag
53
+ else
54
+ @add_prefix
55
+ end
56
+ end
57
+ tag
58
+ end
59
+ end
60
+
61
+ def emit(tag, es, chain)
62
+ tag = tag_mangle(tag)
63
+ es.each do |time, record|
64
+ parsed =
65
+ begin
66
+ RefererParser::Referer.new(record[@key_name])
67
+ rescue
68
+ PARSE_ERROR_STRUCT
69
+ end
70
+ record.merge!(
71
+ @out_key_known => parsed.known,
72
+ @out_key_referer => parsed.referer || UNKOWWN_STRING,
73
+ @out_key_search_term => parsed.search_term || UNKOWWN_STRING,
74
+ )
75
+ Fluent::Engine.emit(tag, time, record)
76
+ end
77
+ chain.next
78
+ end
79
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts 'Run `bundle install` to install missing gems'
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+
12
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
14
+ require 'fluent/test'
15
+ unless ENV.key?('VERBOSE')
16
+ nulllogger = Object.new
17
+ nulllogger.instance_eval do |obj|
18
+ def method_missing(method, *args)
19
+ # pass
20
+ end
21
+ end
22
+ $log = nulllogger
23
+ end
24
+
25
+ require 'fluent/plugin/out_referer_parser'
26
+
27
+ class Test::Unit::TestCase
28
+ end
@@ -0,0 +1,25 @@
1
+ LineLength:
2
+ Enabled: false
3
+
4
+ MethodLength:
5
+ Enabled: true
6
+ CountComments: false # count full line comments?
7
+ Max: 50
8
+
9
+ FavorSprintf:
10
+ Enabled: false
11
+
12
+ MultilineBlocks:
13
+ Enabled: false
14
+
15
+ AvoidPerlBackrefs:
16
+ Enabled: false
17
+
18
+ PercentLiterals:
19
+ Enabled: false
20
+
21
+ BraceAfterPercent:
22
+ Enabled: false
23
+
24
+ ClassLength:
25
+ Enabled: false
@@ -0,0 +1,131 @@
1
+ require 'helper'
2
+
3
+ # RefererParserOutput test
4
+ class Fluent::RefererParserOutputTest < Test::Unit::TestCase
5
+ # through & merge
6
+ CONFIG1 = %[
7
+ type referer_parser
8
+ key_name referer
9
+ remove_prefix test
10
+ add_prefix merged
11
+ ]
12
+
13
+ CONFIG2 = %[
14
+ type referer_parser
15
+ key_name ref
16
+ remove_prefix test
17
+ add_prefix merged
18
+ out_key_known ref_known
19
+ out_key_referer ref_referer
20
+ out_key_search_term ref_search_term
21
+ ]
22
+
23
+ def create_driver(conf = CONFIG1, tag = 'test')
24
+ Fluent::Test::OutputTestDriver.new(Fluent::RefererParserOutput, tag).configure(conf)
25
+ end
26
+
27
+ def test_configure
28
+ # through & merge
29
+ d = create_driver CONFIG1
30
+ assert_equal 'referer', d.instance.key_name
31
+ assert_equal 'test', d.instance.remove_prefix
32
+ assert_equal 'merged', d.instance.add_prefix
33
+
34
+ assert_equal 'referer_known', d.instance.out_key_known
35
+ assert_equal 'referer_referer', d.instance.out_key_referer
36
+ assert_equal 'referer_search_term', d.instance.out_key_search_term
37
+
38
+ # filter & merge
39
+ d = create_driver CONFIG2
40
+ assert_equal 'ref', d.instance.key_name
41
+ assert_equal 'test', d.instance.remove_prefix
42
+ assert_equal 'merged', d.instance.add_prefix
43
+
44
+ assert_equal 'ref_known', d.instance.out_key_known
45
+ assert_equal 'ref_referer', d.instance.out_key_referer
46
+ assert_equal 'ref_search_term', d.instance.out_key_search_term
47
+ end
48
+
49
+ def test_tag_mangle
50
+ p = create_driver(CONFIG1).instance
51
+ assert_equal 'merged.data', p.tag_mangle('data')
52
+ assert_equal 'merged.data', p.tag_mangle('test.data')
53
+ assert_equal 'merged.test.data', p.tag_mangle('test.test.data')
54
+ assert_equal 'merged', p.tag_mangle('test')
55
+ end
56
+
57
+ def test_emit1
58
+ d = create_driver(CONFIG1, 'test.message')
59
+ time = Time.parse('2012-07-20 16:40:30').to_i
60
+ d.run do
61
+ d.emit({ 'value' => 0 }, time)
62
+ d.emit({ 'value' => 1, 'referer' => 'http://www.google.com/search?q=gateway+oracle+cards+denise+linn&hl=en&client=safari' }, time)
63
+ d.emit({ 'value' => 2, 'referer' => 'http://www.unixuser.org/' }, time)
64
+ end
65
+
66
+ emits = d.emits
67
+ assert_equal 3, emits.size
68
+ assert_equal 'merged.message', emits[0][0]
69
+ assert_equal time, emits[0][1]
70
+
71
+ m = emits[0][2]
72
+ assert_equal 0, m['value']
73
+ assert_equal false, m['referer_known']
74
+ assert_equal 'UNKNOWN', m['referer_referer']
75
+ assert_equal 'UNKNOWN', m['referer_search_term']
76
+ assert_equal 4, m.keys.size
77
+
78
+ m = emits[1][2]
79
+ assert_equal 1, m['value']
80
+ assert_equal true, m['referer_known']
81
+ assert_equal 'Google', m['referer_referer']
82
+ assert_equal 'gateway oracle cards denise linn', m['referer_search_term']
83
+
84
+ m = emits[2][2]
85
+ assert_equal 2, m['value']
86
+ assert_equal false, m['referer_known']
87
+ assert_equal 'UNKNOWN', m['referer_referer']
88
+ assert_equal 'UNKNOWN', m['referer_search_term']
89
+ end
90
+
91
+ def test_emit2
92
+ d = create_driver(CONFIG2, 'test.message')
93
+ time = Time.parse('2012-07-20 16:40:30').to_i
94
+ d.run do
95
+ d.emit({ 'value' => 0 }, time)
96
+ d.emit({ 'value' => 1, 'ref' => 'http://www.google.com/search?q=gateway+oracle+cards+denise+linn&hl=en&client=safari' }, time)
97
+ d.emit({ 'value' => 2, 'ref' => 'http://www.unixuser.org/' }, time)
98
+ d.emit({ 'value' => 3, 'ref' => 'https://www.google.com/search?q=%E3%81%BB%E3%81%92&ie=utf-8&oe=utf-8' }, time)
99
+ end
100
+
101
+ emits = d.emits
102
+ assert_equal 4, emits.size
103
+ assert_equal 'merged.message', emits[0][0]
104
+ assert_equal time, emits[0][1]
105
+
106
+ m = emits[0][2]
107
+ assert_equal 0, m['value']
108
+ assert_equal false, m['ref_known']
109
+ assert_equal 'UNKNOWN', m['ref_referer']
110
+ assert_equal 'UNKNOWN', m['ref_search_term']
111
+ assert_equal 4, m.keys.size
112
+
113
+ m = emits[1][2]
114
+ assert_equal 1, m['value']
115
+ assert_equal true, m['ref_known']
116
+ assert_equal 'Google', m['ref_referer']
117
+ assert_equal 'gateway oracle cards denise linn', m['ref_search_term']
118
+
119
+ m = emits[2][2]
120
+ assert_equal 2, m['value']
121
+ assert_equal false, m['ref_known']
122
+ assert_equal 'UNKNOWN', m['ref_referer']
123
+ assert_equal 'UNKNOWN', m['ref_search_term']
124
+
125
+ m = emits[3][2]
126
+ assert_equal 3, m['value']
127
+ assert_equal true, m['ref_known']
128
+ assert_equal 'Google', m['ref_referer']
129
+ assert_equal 'ほげ', m['ref_search_term']
130
+ end
131
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-referer-parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - TAGOMORI Satoshi
8
+ - HARUYAMA Seigo
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-12-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '>='
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '>='
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: fluentd
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: referer-parser
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '>='
47
+ - !ruby/object:Gem::Version
48
+ version: 0.2.0
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: 0.2.0
56
+ description: 'parsing by referer-parser. See: https://github.com/snowplow/referer-parser'
57
+ email:
58
+ - tagomoris@gmail.com
59
+ - haruyama@unixuser.org
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - .gitignore
65
+ - .travis.yml
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - fluent-plugin-referer-parser.gemspec
71
+ - lib/fluent/plugin/.rubocop.yml
72
+ - lib/fluent/plugin/out_referer_parser.rb
73
+ - test/helper.rb
74
+ - test/plugin/.rubocop.yml
75
+ - test/plugin/test_out_referer_parser.rb
76
+ homepage: https://github.com/haruyama/fluent-plugin-referer-parser
77
+ licenses:
78
+ - APLv2
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.2.0
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Fluentd plugin to parse UserAgent strings
100
+ test_files:
101
+ - test/helper.rb
102
+ - test/plugin/.rubocop.yml
103
+ - test/plugin/test_out_referer_parser.rb