fluent-plugin-geoip 0.8.2 → 1.0.0
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/.travis.yml +0 -4
- data/Appraisals +0 -9
- data/README.md +92 -31
- data/dockerfiles/Dockerfile-ruby2.1 +1 -1
- data/dockerfiles/Dockerfile-ruby2.2 +1 -1
- data/dockerfiles/Dockerfile-ruby2.3 +1 -1
- data/dockerfiles/Dockerfile-ruby2.4 +1 -1
- data/fluent-plugin-geoip.gemspec +3 -4
- data/lib/fluent/plugin/filter_geoip.rb +16 -22
- data/lib/fluent/plugin/geoip.rb +2 -21
- data/lib/fluent/plugin/out_geoip.rb +23 -26
- data/test/helper.rb +4 -28
- data/test/plugin/test_filter_geoip.rb +46 -175
- data/test/plugin/test_out_geoip.rb +535 -550
- metadata +13 -23
- data/gemfiles/fluentd_v0.12_with_backport_dig.gemfile +0 -8
- data/gemfiles/fluentd_v0.12_without_backport_dig.gemfile +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8ae0d73eec8f27ed950ce080d02d0ada455fdc7
|
4
|
+
data.tar.gz: 3e442d004f0e4852ea8b713749eedb1f05991eaa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a026783f1b3578c27081c142dc4829cdda7ed0ec0be13867ee42e6052818fde41630154d8311fc63d52b6808213bec0caf84281006143cbc8f9845f96a3e01b6
|
7
|
+
data.tar.gz: 70836a38b6e1596ff5dcae93dda3961b67e7a16f4dd050b2ddaa7c33ff17df63475526e8baf2b8a8e103eb81cc250be029d0ed96d7388c871fcd7bfcd8e5f79e
|
data/.travis.yml
CHANGED
@@ -10,10 +10,6 @@ env:
|
|
10
10
|
- TARGET_RUBY_VERSION=2.2 BUNDLE_GEMFILE=/app/gemfiles/fluentd_v1.0_with_backport_dig.gemfile
|
11
11
|
- TARGET_RUBY_VERSION=2.3 BUNDLE_GEMFILE=/app/gemfiles/fluentd_v1.0_without_backport_dig.gemfile
|
12
12
|
- TARGET_RUBY_VERSION=2.4 BUNDLE_GEMFILE=/app/gemfiles/fluentd_v1.0_without_backport_dig.gemfile
|
13
|
-
- TARGET_RUBY_VERSION=2.1 BUNDLE_GEMFILE=/app/gemfiles/fluentd_v0.12_with_backport_dig.gemfile
|
14
|
-
- TARGET_RUBY_VERSION=2.2 BUNDLE_GEMFILE=/app/gemfiles/fluentd_v0.12_with_backport_dig.gemfile
|
15
|
-
- TARGET_RUBY_VERSION=2.3 BUNDLE_GEMFILE=/app/gemfiles/fluentd_v0.12_without_backport_dig.gemfile
|
16
|
-
- TARGET_RUBY_VERSION=2.4 BUNDLE_GEMFILE=/app/gemfiles/fluentd_v0.12_without_backport_dig.gemfile
|
17
13
|
|
18
14
|
before_install:
|
19
15
|
#- sudo apt-get update
|
data/Appraisals
CHANGED
@@ -1,12 +1,3 @@
|
|
1
|
-
appraise "fluentd v0.12 with backport_dig" do
|
2
|
-
gem "fluentd", "~> 0.12.0"
|
3
|
-
gem "backport_dig", "~> 1.0.0"
|
4
|
-
end
|
5
|
-
|
6
|
-
appraise "fluentd v0.12 without backport_dig" do
|
7
|
-
gem "fluentd", "~> 0.12.0"
|
8
|
-
end
|
9
|
-
|
10
1
|
appraise "fluentd v1.0 with backport_dig" do
|
11
2
|
gem "fluentd", "~> 1.0.0"
|
12
3
|
gem "backport_dig", "~> 1.0.0"
|
data/README.md
CHANGED
@@ -10,26 +10,84 @@ The accuracy details for GeoLite City (free) and GeoIP City (purchased) has desc
|
|
10
10
|
* http://www.maxmind.com/en/geolite_city_accuracy ([lang:ja](http://www.maxmind.com/ja/geolite_city_accuracy))
|
11
11
|
* http://www.maxmind.com/en/city_accuracy ([lang:ja](http://www.maxmind.com/ja/city_accuracy))
|
12
12
|
|
13
|
+
## Requirements
|
14
|
+
|
15
|
+
| fluent-plugin-geoip | fluentd | ruby |
|
16
|
+
|---------------------|------------|--------|
|
17
|
+
| >= 1.0.0 | >= v1.0.2 | >= 2.1 |
|
18
|
+
| < 1.0.0 | >= v0.12.0 | >= 1.9 |
|
19
|
+
|
20
|
+
If you want to use this plugin with Fluentd v0.12.x or earlier use 0.8.x.
|
21
|
+
|
22
|
+
### Compatibility notice
|
23
|
+
|
24
|
+
We've used Fluentd v1 API in this plugin since 1.0.0.
|
25
|
+
So we have dropped some features.
|
26
|
+
|
27
|
+
See also [official document](http://docs.fluentd.org/v1.0/articles/plugin-update-from-v12)
|
28
|
+
|
29
|
+
#### Fluent::Mixin::RewriteTagName
|
30
|
+
|
31
|
+
* `${tag}`, `__TAG__`
|
32
|
+
|
33
|
+
Alternative: Use `${tag}` placeholder
|
34
|
+
|
35
|
+
* `${tag_parts[n]}`, `__TAG_PARTS[n]__`
|
36
|
+
|
37
|
+
Alternative: Use `${tag[n]}` placeholder
|
38
|
+
|
39
|
+
* `${hostname}`, `__HOSTNAME__`
|
40
|
+
|
41
|
+
Alternative1: Use filter before this plugin and chunk keys:
|
42
|
+
```
|
43
|
+
<filter>
|
44
|
+
@type record_transformer
|
45
|
+
<record>
|
46
|
+
hostname ${hostname}
|
47
|
+
</record>
|
48
|
+
</filter>
|
49
|
+
<match **>
|
50
|
+
@type geoip
|
51
|
+
tag geoip.${tag[1]}.${hostname}
|
52
|
+
<record>
|
53
|
+
city ${city["host"]}
|
54
|
+
</record>
|
55
|
+
<buffer tag, hostname>
|
56
|
+
flush_interval 1s
|
57
|
+
</buffer>
|
58
|
+
</match>
|
59
|
+
```
|
60
|
+
|
61
|
+
Alternative2: Just inject hostname into record you can use `<inject>` section instead:
|
62
|
+
```
|
63
|
+
<match **>
|
64
|
+
@type geoip
|
65
|
+
tag geoip.${tag[1]}.${hostname}
|
66
|
+
<record>
|
67
|
+
city ${city["host"]}
|
68
|
+
</record>
|
69
|
+
<inject>
|
70
|
+
hostname_key hostname
|
71
|
+
</inject>
|
72
|
+
</match>
|
73
|
+
```
|
74
|
+
|
13
75
|
## Dependency
|
14
76
|
|
15
77
|
before use, install dependent library as:
|
16
78
|
|
17
79
|
```bash
|
18
80
|
# for RHEL/CentOS
|
19
|
-
$ sudo yum
|
81
|
+
$ sudo yum group install "Development Tools"
|
20
82
|
$ sudo yum install geoip-devel --enablerepo=epel
|
21
|
-
$ sudo yum install libmaxminddb-devel --enablerepo=epel
|
22
83
|
|
23
84
|
# for Ubuntu/Debian
|
24
85
|
$ sudo apt-get install build-essential
|
25
86
|
$ sudo apt-get install libgeoip-dev
|
26
|
-
$ sudo apt-get install libmaxminddb-dev
|
27
87
|
|
28
88
|
# for OS X
|
29
89
|
$ brew install geoip
|
30
|
-
$ brew install libmaxminddb
|
31
90
|
$ bundle config build.geoip-c --with-geoip-dir=/usr/local/include/
|
32
|
-
$ bundle config build.geoip2_c --with-opt-include=/usr/local/include/
|
33
91
|
```
|
34
92
|
|
35
93
|
## Installation
|
@@ -61,6 +119,10 @@ $ sudo td-agent-gem install fluent-plugin-geoip
|
|
61
119
|
|
62
120
|
# Specify optional geoip database (using bundled GeoLiteCity databse by default)
|
63
121
|
geoip_database "/path/to/your/GeoIPCity.dat"
|
122
|
+
# Specify optional geoip2 database
|
123
|
+
# geoip2_database "/path/to/your/GeoLite2-City.mmdb"
|
124
|
+
# Specify backend library (geoip, geoip2_compat, geoip2_c)
|
125
|
+
backend_library geoip
|
64
126
|
|
65
127
|
# Set adding field with placeholder (more than one settings are required.)
|
66
128
|
<record>
|
@@ -76,8 +138,7 @@ $ sudo td-agent-gem install fluent-plugin-geoip
|
|
76
138
|
</record>
|
77
139
|
|
78
140
|
# Settings for tag
|
79
|
-
|
80
|
-
tag geoip.${tag}
|
141
|
+
tag geoip.${tag[1]}
|
81
142
|
|
82
143
|
# To avoid get stacktrace error with `[null, null]` array for elasticsearch.
|
83
144
|
skip_adding_null_record true
|
@@ -85,8 +146,10 @@ $ sudo td-agent-gem install fluent-plugin-geoip
|
|
85
146
|
# Set log_level for fluentd-v0.10.43 or earlier (default: warn)
|
86
147
|
log_level info
|
87
148
|
|
88
|
-
|
89
|
-
|
149
|
+
<buffer tag>
|
150
|
+
# Set buffering time (default: 0s)
|
151
|
+
flush_interval 1s
|
152
|
+
</buffer>
|
90
153
|
</match>
|
91
154
|
```
|
92
155
|
|
@@ -100,8 +163,7 @@ $ sudo td-agent-gem install fluent-plugin-geoip
|
|
100
163
|
user1_city ${city["user1_host"]}
|
101
164
|
user2_city ${city["user2_host"]}
|
102
165
|
</record>
|
103
|
-
|
104
|
-
tag geoip.${tag}
|
166
|
+
tag geoip.${tag[1]}
|
105
167
|
</match>
|
106
168
|
```
|
107
169
|
|
@@ -109,6 +171,7 @@ $ sudo td-agent-gem install fluent-plugin-geoip
|
|
109
171
|
|
110
172
|
It is a sample to get friendly geo point recdords for elasticsearch with Yajl (JSON) parser.<br />
|
111
173
|
|
174
|
+
**Notice** v0 config will be deprecated in the future.
|
112
175
|
|
113
176
|
```
|
114
177
|
<match access.apache>
|
@@ -127,15 +190,14 @@ It is a sample to get friendly geo point recdords for elasticsearch with Yajl (J
|
|
127
190
|
# ex. [-122.05740356445312, 37.4192008972168]
|
128
191
|
location_array '[${longitude["host"]},${latitude["host"]}]'
|
129
192
|
</record>
|
130
|
-
|
131
|
-
tag geoip.${tag}
|
193
|
+
tag geoip.${tag[1]}
|
132
194
|
|
133
195
|
# To avoid get stacktrace error with `[null, null]` array for elasticsearch.
|
134
196
|
skip_adding_null_record true
|
135
197
|
</match>
|
136
198
|
```
|
137
199
|
|
138
|
-
On the case of using td-
|
200
|
+
On the case of using td-agent3 (v1-config), it have to quote `{ ... }` or `[ ... ]` block with quotation like below.
|
139
201
|
|
140
202
|
```
|
141
203
|
<match access.apache>
|
@@ -166,6 +228,10 @@ Note that filter version of geoip plugin does not have handling tag feature.
|
|
166
228
|
|
167
229
|
# Specify optional geoip database (using bundled GeoLiteCity databse by default)
|
168
230
|
geoip_database "/path/to/your/GeoIPCity.dat"
|
231
|
+
# Specify optional geoip2 database
|
232
|
+
# geoip2_database "/path/to/your/GeoLite2-City.mmdb"
|
233
|
+
# Specify backend library (geoip, geoip2_compat, geoip2_c)
|
234
|
+
backend_library geoip
|
169
235
|
|
170
236
|
# Set adding field with placeholder (more than one settings are required.)
|
171
237
|
<record>
|
@@ -185,9 +251,6 @@ Note that filter version of geoip plugin does not have handling tag feature.
|
|
185
251
|
|
186
252
|
# Set log_level for fluentd-v0.10.43 or earlier (default: warn)
|
187
253
|
log_level info
|
188
|
-
|
189
|
-
# Set buffering time (default: 0s)
|
190
|
-
flush_interval 1s
|
191
254
|
</filter>
|
192
255
|
```
|
193
256
|
|
@@ -215,8 +278,7 @@ Note that filter version of geoip plugin does not have handling tag feature.
|
|
215
278
|
lon ${longitude["host"]}
|
216
279
|
country ${country_code["host"]}
|
217
280
|
</record>
|
218
|
-
|
219
|
-
tag debug.${tag}
|
281
|
+
tag debug.${tag[1]}
|
220
282
|
</store>
|
221
283
|
</match>
|
222
284
|
|
@@ -299,6 +361,11 @@ For more example of geolocating, you can try these websites like [Geo IP Address
|
|
299
361
|
|
300
362
|
Further more specification available at http://dev.maxmind.com/geoip/legacy/csv/#GeoIP_City_Edition_CSV_Database_Fields
|
301
363
|
|
364
|
+
Related configurations:
|
365
|
+
|
366
|
+
* `backend_library`: `geoip` (default)
|
367
|
+
* `geoip_database`: path to your GeoLiteCity.dat
|
368
|
+
|
302
369
|
### GeoIP2
|
303
370
|
|
304
371
|
You can get any fields in the
|
@@ -333,6 +400,11 @@ For example(geoip2_compat backend):
|
|
333
400
|
|
334
401
|
**NOTE**: geoip2_compat backend supports only above fields.
|
335
402
|
|
403
|
+
Related configurations:
|
404
|
+
|
405
|
+
* `backend_library`: `geoip2_compat` or `geoip2_c`
|
406
|
+
* `geoip2_database`: path to your GeoLite2-City.mmdb
|
407
|
+
|
336
408
|
## Parameters
|
337
409
|
|
338
410
|
### GeoipOutput
|
@@ -348,16 +420,9 @@ Further details are written at http://docs.fluentd.org/articles/in_exec
|
|
348
420
|
Skip adding geoip fields when this valaues to `true`.
|
349
421
|
On the case of getting nothing of GeoIP info (such as local IP), it will output the original record without changing anything.
|
350
422
|
|
351
|
-
* `remove_tag_prefix`
|
352
|
-
* `remove_tag_suffix`
|
353
|
-
* `add_tag_prefix`
|
354
|
-
* `add_tag_suffix`
|
355
|
-
|
356
|
-
Set one or more option are required unless using `tag` option for editing tag name. (HandleTagNameMixin feature)
|
357
|
-
|
358
423
|
* `tag`
|
359
424
|
|
360
|
-
On using this option with tag placeholder like `tag geoip.${tag}` (test code is available at [test_out_geoip.rb](https://github.com/y-ken/fluent-plugin-geoip/blob/master/test/plugin/test_out_geoip.rb))
|
425
|
+
On using this option with tag placeholder like `tag geoip.${tag}` (test code is available at [test_out_geoip.rb](https://github.com/y-ken/fluent-plugin-geoip/blob/master/test/plugin/test_out_geoip.rb)).
|
361
426
|
|
362
427
|
* `flush_interval` (default: 0 sec)
|
363
428
|
|
@@ -377,10 +442,6 @@ Further details are written at http://docs.fluentd.org/articles/in_exec
|
|
377
442
|
Skip adding geoip fields when this valaues to `true`.
|
378
443
|
On the case of getting nothing of GeoIP info (such as local IP), it will output the original record without changing anything.
|
379
444
|
|
380
|
-
* `flush_interval` (default: 0 sec)
|
381
|
-
|
382
|
-
Set buffering time to execute bulk lookup geoip.
|
383
|
-
|
384
445
|
## Articles
|
385
446
|
|
386
447
|
* [IPアドレスを元に位置情報をリアルタイムに付与する fluent-plugin-geoip v0.0.1をリリースしました #fluentd - Y-Ken Studio](http://y-ken.hatenablog.com/entry/fluent-plugin-geoip-has-released)<br />
|
@@ -2,7 +2,7 @@ FROM ruby:2.1-alpine
|
|
2
2
|
|
3
3
|
ENV BUNDLE_GEMFILE=$BUNDLE_GEMFILE
|
4
4
|
|
5
|
-
RUN apk --no-cache --update add build-base
|
5
|
+
RUN apk --no-cache --update add build-base ruby-dev libc6-compat libmaxminddb-dev geoip-dev git
|
6
6
|
|
7
7
|
WORKDIR /app
|
8
8
|
COPY . .
|
@@ -2,7 +2,7 @@ FROM ruby:2.2-alpine
|
|
2
2
|
|
3
3
|
ENV BUNDLE_GEMFILE=$BUNDLE_GEMFILE
|
4
4
|
|
5
|
-
RUN apk --no-cache --update add build-base
|
5
|
+
RUN apk --no-cache --update add build-base ruby-dev libc6-compat libmaxminddb-dev geoip-dev git
|
6
6
|
|
7
7
|
WORKDIR /app
|
8
8
|
COPY . .
|
@@ -2,7 +2,7 @@ FROM ruby:2.3-alpine
|
|
2
2
|
|
3
3
|
ENV BUNDLE_GEMFILE=$BUNDLE_GEMFILE
|
4
4
|
|
5
|
-
RUN apk --no-cache --update add build-base
|
5
|
+
RUN apk --no-cache --update add build-base ruby-dev libc6-compat libmaxminddb-dev geoip-dev git
|
6
6
|
|
7
7
|
WORKDIR /app
|
8
8
|
COPY . .
|
@@ -2,7 +2,7 @@ FROM ruby:2.4-alpine
|
|
2
2
|
|
3
3
|
ENV BUNDLE_GEMFILE=$BUNDLE_GEMFILE
|
4
4
|
|
5
|
-
RUN apk --no-cache --update add build-base
|
5
|
+
RUN apk --no-cache --update add build-base ruby-dev libc6-compat libmaxminddb-dev geoip-dev git
|
6
6
|
|
7
7
|
WORKDIR /app
|
8
8
|
COPY . .
|
data/fluent-plugin-geoip.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "fluent-plugin-geoip"
|
7
|
-
spec.version = "0.
|
7
|
+
spec.version = "1.0.0"
|
8
8
|
spec.authors = ["Kentaro Yoshida"]
|
9
9
|
spec.email = ["y.ken.studio@gmail.com"]
|
10
10
|
spec.summary = %q{Fluentd Filter plugin to add information about geographical location of IP addresses with Maxmind GeoIP databases.}
|
@@ -21,10 +21,9 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "appraisal"
|
22
22
|
spec.add_development_dependency "test-unit", ">= 3.1.0"
|
23
23
|
spec.add_development_dependency "geoip2_compat"
|
24
|
-
spec.add_development_dependency "geoip2_c"
|
25
24
|
|
26
|
-
spec.add_runtime_dependency "fluentd"
|
27
|
-
spec.add_runtime_dependency "fluent-mixin-rewrite-tag-name"
|
25
|
+
spec.add_runtime_dependency "fluentd", [">= 0.14.8", "< 2"]
|
28
26
|
spec.add_runtime_dependency "geoip-c"
|
27
|
+
spec.add_runtime_dependency "geoip2_c"
|
29
28
|
spec.add_runtime_dependency "dig_rb"
|
30
29
|
end
|
@@ -1,40 +1,34 @@
|
|
1
|
+
require 'fluent/plugin/filter'
|
1
2
|
require 'fluent/plugin/geoip'
|
2
3
|
|
3
|
-
module Fluent
|
4
|
-
class GeoipFilter < Filter
|
5
|
-
Plugin.register_filter('geoip', self)
|
4
|
+
module Fluent::Plugin
|
5
|
+
class GeoipFilter < Fluent::Plugin::Filter
|
6
|
+
Fluent::Plugin.register_filter('geoip', self)
|
6
7
|
|
7
|
-
config_param :geoip_database, :string, :
|
8
|
-
config_param :geoip2_database, :string, :
|
9
|
-
config_param :geoip_lookup_key, :string, :
|
10
|
-
config_param :skip_adding_null_record, :bool, :
|
8
|
+
config_param :geoip_database, :string, default: File.dirname(__FILE__) + '/../../../data/GeoLiteCity.dat'
|
9
|
+
config_param :geoip2_database, :string, default: File.dirname(__FILE__) + '/../../../data/GeoLite2-City.mmdb'
|
10
|
+
config_param :geoip_lookup_key, :string, default: 'host'
|
11
|
+
config_param :skip_adding_null_record, :bool, default: false
|
11
12
|
|
12
|
-
include Fluent::SetTagKeyMixin
|
13
13
|
config_set_default :include_tag_key, false
|
14
14
|
|
15
|
-
config_param :hostname_command, :string, :
|
15
|
+
config_param :hostname_command, :string, default: 'hostname'
|
16
16
|
|
17
|
-
config_param :log_level, :string, :
|
17
|
+
config_param :log_level, :string, default: 'warn'
|
18
18
|
|
19
|
-
config_param :backend_library, :enum, :
|
19
|
+
config_param :backend_library, :enum, list: Fluent::GeoIP::BACKEND_LIBRARIES, default: :geoip2_c
|
20
20
|
|
21
21
|
def configure(conf)
|
22
22
|
super
|
23
23
|
@geoip = Fluent::GeoIP.new(self, conf)
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
filter_record(tag, time, record)
|
31
|
-
filtered_record = @geoip.add_geoip_field(record)
|
32
|
-
new_es.add(time, filtered_record) if filtered_record
|
33
|
-
rescue => e
|
34
|
-
router.emit_error_event(tag, time, record, e)
|
35
|
-
end
|
26
|
+
def filter(tag, time, record)
|
27
|
+
filtered_record = @geoip.add_geoip_field(record)
|
28
|
+
if filtered_record
|
29
|
+
record = filtered_record
|
36
30
|
end
|
37
|
-
|
31
|
+
record
|
38
32
|
end
|
39
33
|
end
|
40
34
|
end
|
data/lib/fluent/plugin/geoip.rb
CHANGED
@@ -77,13 +77,6 @@ module Fluent
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
-
if plugin.is_a?(Fluent::BufferedOutput)
|
81
|
-
@placeholder_expander = PlaceholderExpander.new
|
82
|
-
unless have_tag_option?(plugin)
|
83
|
-
raise Fluent::ConfigError, "geoip: required at least one option of 'tag', 'remove_tag_prefix', 'remove_tag_suffix', 'add_tag_prefix', 'add_tag_suffix'."
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
80
|
@geoip = load_database(plugin)
|
88
81
|
end
|
89
82
|
|
@@ -109,12 +102,6 @@ module Fluent
|
|
109
102
|
|
110
103
|
private
|
111
104
|
|
112
|
-
def have_tag_option?(plugin)
|
113
|
-
plugin.tag ||
|
114
|
-
plugin.remove_tag_prefix || plugin.remove_tag_suffix ||
|
115
|
-
plugin.add_tag_prefix || plugin.add_tag_suffix
|
116
|
-
end
|
117
|
-
|
118
105
|
def json?(text)
|
119
106
|
text.match(/^\[.+\]$/) || text.match(/^\{.+\}$/)
|
120
107
|
end
|
@@ -129,7 +116,7 @@ module Fluent
|
|
129
116
|
begin
|
130
117
|
return Yajl::Parser.parse(message)
|
131
118
|
rescue Yajl::ParseError => e
|
132
|
-
log.info "geoip: failed to parse '#{message}' as json.", :
|
119
|
+
log.info "geoip: failed to parse '#{message}' as json.", error_class: e.class, error: e.message
|
133
120
|
return nil
|
134
121
|
end
|
135
122
|
end
|
@@ -164,13 +151,7 @@ module Fluent
|
|
164
151
|
position = placeholder_key.match(REGEXP_PLACEHOLDER_SINGLE)
|
165
152
|
next if position.nil? or geodata[position[:record_key]].nil?
|
166
153
|
keys = [position[:record_key]] + position[:geoip_key].split('.').map(&:to_sym)
|
167
|
-
|
168
|
-
value = if [:latitude, :longitude].include?(keys.last)
|
169
|
-
value || 0.0
|
170
|
-
else
|
171
|
-
value
|
172
|
-
end
|
173
|
-
placeholder[placeholder_key] = value
|
154
|
+
placeholder[placeholder_key] = geodata.dig(*keys)
|
174
155
|
end
|
175
156
|
placeholder
|
176
157
|
end
|
@@ -1,54 +1,51 @@
|
|
1
|
-
require 'fluent/
|
1
|
+
require 'fluent/plugin/output'
|
2
2
|
require 'fluent/plugin/geoip'
|
3
3
|
|
4
|
-
class Fluent::GeoipOutput < Fluent::
|
4
|
+
class Fluent::Plugin::GeoipOutput < Fluent::Plugin::Output
|
5
5
|
Fluent::Plugin.register_output('geoip', self)
|
6
6
|
|
7
|
-
|
8
|
-
config_param :geoip2_database, :string, :default => File.dirname(__FILE__) + '/../../../data/GeoLite2-City.mmdb'
|
9
|
-
config_param :geoip_lookup_key, :string, :default => 'host'
|
10
|
-
config_param :tag, :string, :default => nil
|
11
|
-
config_param :skip_adding_null_record, :bool, :default => false
|
7
|
+
helpers :event_emitter, :inject, :compat_parameters
|
12
8
|
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
config_param :geoip_database, :string, default: File.dirname(__FILE__) + '/../../../data/GeoLiteCity.dat'
|
10
|
+
config_param :geoip2_database, :string, default: File.dirname(__FILE__) + '/../../../data/GeoLite2-City.mmdb'
|
11
|
+
config_param :geoip_lookup_key, :string, default: 'host'
|
12
|
+
config_param :tag, :string, default: nil
|
13
|
+
config_param :skip_adding_null_record, :bool, default: false
|
16
14
|
|
17
|
-
|
18
|
-
config_param :
|
15
|
+
config_param :flush_interval, :time, default: 0
|
16
|
+
config_param :log_level, :string, default: 'warn'
|
19
17
|
|
20
|
-
config_param :
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
config_param :backend_library, :enum, list: Fluent::GeoIP::BACKEND_LIBRARIES, default: :geoip2_c
|
19
|
+
config_section :buffer do
|
20
|
+
config_set_default :@type, :memory
|
21
|
+
config_set_default :chunk_keys, ['tag']
|
22
|
+
end
|
24
23
|
|
25
24
|
def configure(conf)
|
25
|
+
compat_parameters_convert(conf, :buffer, default_chunk_key: 'tag')
|
26
26
|
super
|
27
|
-
|
28
|
-
|
29
|
-
end
|
27
|
+
raise Fluetn::ConfigError, "chunk key must include 'tag'" unless @chunk_key_tag
|
28
|
+
placeholder_validate!(:tag, @tag) if @tag
|
30
29
|
@geoip = Fluent::GeoIP.new(self, conf)
|
31
30
|
end
|
32
31
|
|
33
|
-
def start
|
34
|
-
super
|
35
|
-
end
|
36
|
-
|
37
32
|
def format(tag, time, record)
|
33
|
+
record = inject_values_to_record(tag, time, record)
|
38
34
|
[tag, time, record].to_msgpack
|
39
35
|
end
|
40
36
|
|
41
|
-
def
|
42
|
-
|
37
|
+
def formatted_to_msgpack_binary
|
38
|
+
true
|
43
39
|
end
|
44
40
|
|
45
41
|
def write(chunk)
|
46
42
|
es = Fluent::MultiEventStream.new
|
47
43
|
tag = ""
|
48
|
-
chunk.
|
44
|
+
chunk.each do |_tag, time, record|
|
49
45
|
tag = _tag
|
50
46
|
es.add(time, @geoip.add_geoip_field(record))
|
51
47
|
end
|
48
|
+
tag = extract_placeholders(@tag, chunk.metadata) if @tag
|
52
49
|
router.emit_stream(tag, es)
|
53
50
|
end
|
54
51
|
end
|