fluent-plugin-ua-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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3ade12c40a9becdda4333372790d707e6559b402
4
+ data.tar.gz: 55d66ce3151f81be45f11edde0fb1d1100a7ea3a
5
+ SHA512:
6
+ metadata.gz: 669ae328afaaf26086697a0e452a92cc0fb424076ce87a73586933d8561c3dd6a3f72088e7300dad45d3046d625beb7b7962168e4200ebb63ca2dbab99ad66da
7
+ data.tar.gz: 742ec9cd4b44faef6658a40a0bae195f7bd3e5f281c741901252a4399ae747a7a60f8664eec6199178f630b393cc4b703b438f00936f116414e34d647f229bc3
@@ -0,0 +1,22 @@
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
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-ignore-filter.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2015 Yuri UMEZAKI
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
@@ -0,0 +1,153 @@
1
+ # Fluent-plugin-ua-parser
2
+
3
+ [Fluentd](http://fluentd.org) filter plugin to parse user-agent.
4
+
5
+
6
+ ## Installation
7
+
8
+ ```bash
9
+ # for fluentd
10
+ $ gem install fluent-plugin-ua-parser
11
+
12
+ # for td-agent2
13
+ $ sudo td-agent-gem install fluent-plugin-ua-parser
14
+ ```
15
+
16
+
17
+ ## Usage
18
+
19
+ ### Example 1:
20
+
21
+ ```xml
22
+ <filter access.nginx.**>
23
+ @type ua_parser
24
+ </filter>
25
+ ```
26
+
27
+ Assuming following inputs are coming:
28
+
29
+ ```
30
+ access.nginx: {
31
+ "remote_addr":"10.20.30.40",
32
+ "scheme":"http", "method":"GET", "host":"example.com",
33
+ "path":"/", "query":"-", "req_bytes":200, "referer":"-",
34
+ "user_agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36",
35
+ "status":200, "res_bytes":800, "res_body_bytes":600, "taken_time":0.001
36
+ }
37
+ ```
38
+
39
+ then output bocomes as belows:
40
+
41
+ ```
42
+ access.nginx: {
43
+ "remote_addr":"10.20.30.40",
44
+ "scheme":"http", "method":"GET", "host":"example.com",
45
+ "path":"/", "query":"-", "req_bytes":200, "referer":"-",
46
+ "user_agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36",
47
+ "ua":{
48
+ "browser":{
49
+ "family":"Chrome",
50
+ "version":"46.0.2490",
51
+ "major_version":46
52
+ },
53
+ "os":{
54
+ "family":"Windows 7",
55
+ "version":""
56
+ },
57
+ "device":"Other"
58
+ },
59
+ "status":200, "res_bytes":800, "res_body_bytes":600, "taken_time":0.001
60
+ }
61
+ ```
62
+
63
+ ### Example 2:
64
+
65
+ ```xml
66
+ <filter access.apache.**>
67
+ @type ua_parser
68
+ key_name ua_string
69
+ delete_key yes
70
+ out_prefix ua
71
+ patterns_path /etc/td-agent/data/regexes.yaml
72
+ </filter>
73
+ ```
74
+
75
+ Assuming following inputs are coming:
76
+
77
+ ```
78
+ access.nginx: {
79
+ "remote_addr":"10.20.30.40",
80
+ "scheme":"http", "method":"GET", "host":"example.com",
81
+ "path":"/", "query":"-", "req_bytes":200, "referer":"-",
82
+ "ua_string":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/601.2.7 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.7",
83
+ "status":200, "res_bytes":800, "res_body_bytes":600, "taken_time":0.001
84
+ }
85
+ ```
86
+
87
+ then output bocomes as belows:
88
+
89
+ ```
90
+ access.nginx: {
91
+ "remote_addr":"10.20.30.40",
92
+ "scheme":"http", "method":"GET", "host":"example.com",
93
+ "path":"/", "query":"-", "req_bytes":200, "referer":"-",
94
+ "ua":{
95
+ "browser":{
96
+ "family":"Safari",
97
+ "version":"9.0.1",
98
+ "major_version":9
99
+ },
100
+ "os":{
101
+ "family":"Mac OS X",
102
+ "version":"10.11.1",
103
+ "major_version":10
104
+ },
105
+ "device":"Other"
106
+ },
107
+ "status":200, "res_bytes":800, "res_body_bytes":600, "taken_time":0.001
108
+ }
109
+ ```
110
+
111
+
112
+
113
+ ## Parameters
114
+ - key_name *field_key*
115
+
116
+ Target key name. default user_agent.
117
+
118
+ - delete_key *bool*
119
+
120
+ Delete input key. default false.
121
+
122
+ - out_prefix *string*
123
+
124
+ Output prefix key name. default ua.
125
+
126
+ - patterns_path *file_path*
127
+
128
+ Patterns file(regexes.yaml) path.
129
+ Get from [uap-core](https://github.com/ua-parser/uap-core)
130
+
131
+
132
+ ## TODO
133
+
134
+ * patches welcome!
135
+
136
+
137
+ ## Contributing
138
+
139
+ 1. Fork it ( https://github.com/bungoume/fluent-plugin-ua-parser/fork )
140
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
141
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
142
+ 4. Push to the branch (`git push origin my-new-feature`)
143
+ 5. Create a new Pull Request
144
+
145
+
146
+ ## Copyright
147
+
148
+ Copyright (c) 2015 Yuri Umezaki
149
+
150
+
151
+ ## License
152
+
153
+ Apache License, Version 2.0
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "fluent-plugin-ua-parser"
7
+ spec.version = "0.0.1"
8
+ spec.authors = ["Yuri Umezaki"]
9
+ spec.email = ["bungoume@gmail.com"]
10
+ spec.homepage = "https://github.com/bungoume/fluent-plugin-ua-parser"
11
+ spec.summary = "Fluentd filter plugin to parse user-agent"
12
+ spec.description = spec.summary
13
+ spec.license = "APLv2"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_runtime_dependency "fluentd", ">= 0.12"
21
+ spec.add_runtime_dependency "user_agent_parser", ">= 2.2.0"
22
+ spec.add_runtime_dependency "lru_redux", ">= 1.0.0"
23
+ spec.add_development_dependency "rake"
24
+ end
@@ -0,0 +1,56 @@
1
+ require 'user_agent_parser'
2
+ require 'lru_redux'
3
+
4
+ module Fluent
5
+ class UaParserFilter < Filter
6
+ Plugin.register_filter('ua_parser', self)
7
+
8
+ def initialize
9
+ @ua_cache = LruRedux::Cache.new(8000)
10
+ super
11
+ end
12
+
13
+ config_param :key_name, :string, :default => 'user_agent'
14
+ config_param :delete_key, :bool, :default => false
15
+ config_param :out_prefix, :string, :default => 'ua'
16
+ # config_param :flatten, :bool :default => false
17
+ config_param :patterns_path, :string, :default => nil
18
+
19
+ def configure(conf)
20
+ super
21
+ begin
22
+ @parser = UserAgentParser::Parser.new(patterns_path: @patterns_path)
23
+ rescue => e
24
+ @parser = UserAgentParser::Parser.new
25
+ log.warn "Failed to configure parser. Use default pattern.", :error_class => e.class, :error => e.message
26
+ log.warn_backtrace
27
+ end
28
+ end
29
+
30
+ def filter(tag, time, record)
31
+ ua_string = record[@key_name]
32
+ record.delete(@key_name) if @delete_key
33
+ unless ua_string.nil?
34
+ user_agent_detail = @ua_cache.getset(ua_string) { get_ua_detail(ua_string) }
35
+ record[@out_key] = user_agent_detail
36
+ end
37
+ record
38
+ end
39
+
40
+ private
41
+
42
+ def get_ua_detail(ua_string)
43
+ ua = @parser.parse(ua_string)
44
+ data = {"browser"=>{}, "os"=>{}, "device"=>"", "string"=>ua_string}
45
+ return data if ua.nil?
46
+ data['browser']['family'] = ua.family
47
+ data['browser']['version'] = ua.version.to_s
48
+ data['browser']['major_version'] = ua.version.major.to_i unless ua.version.nil?
49
+ data['os']['family'] = ua.os.family
50
+ data['os']['version'] = ua.os.version.to_s
51
+ data['os']['major_version'] = ua.os.version.major.to_i unless ua.os.version.nil?
52
+ data['device'] = ua.device.to_s
53
+ data
54
+ end
55
+ end
56
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-ua-parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Yuri Umezaki
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-10-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fluentd
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0.12'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: user_agent_parser
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: lru_redux
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Fluentd filter plugin to parse user-agent
70
+ email:
71
+ - bungoume@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - LICENSE
79
+ - README.md
80
+ - Rakefile
81
+ - fluent-plugin-ua-parser.gemspec
82
+ - lib/fluent/plugin/filter_ua_parser.rb
83
+ homepage: https://github.com/bungoume/fluent-plugin-ua-parser
84
+ licenses:
85
+ - APLv2
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.4.5.1
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Fluentd filter plugin to parse user-agent
107
+ test_files: []