fluent-plugin-geoip 1.0.0 → 1.1.0

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
- SHA1:
3
- metadata.gz: d8ae0d73eec8f27ed950ce080d02d0ada455fdc7
4
- data.tar.gz: 3e442d004f0e4852ea8b713749eedb1f05991eaa
2
+ SHA256:
3
+ metadata.gz: 6f265530c6153294e8c0e5c35176a8e51f926708757622feee23177dbf388252
4
+ data.tar.gz: fd1b525e0e78306a8d87356531ddd5106de541b60e0521cad6e5cbeca15a84ff
5
5
  SHA512:
6
- metadata.gz: a026783f1b3578c27081c142dc4829cdda7ed0ec0be13867ee42e6052818fde41630154d8311fc63d52b6808213bec0caf84281006143cbc8f9845f96a3e01b6
7
- data.tar.gz: 70836a38b6e1596ff5dcae93dda3961b67e7a16f4dd050b2ddaa7c33ff17df63475526e8baf2b8a8e103eb81cc250be029d0ed96d7388c871fcd7bfcd8e5f79e
6
+ metadata.gz: 32c7fb52de7c2a970fffe128e1c86cd327b8615e6e124d3019e50c74e4808674179de9a6761a4929375c8f159866364fe2e93e1042311e310bf52639b24058ca
7
+ data.tar.gz: d7f3f9f3cb1d7be3bf294bdc1b000c74d379e3454f64b188ab05a2804fc1d3379c775c758e2dab37e9f0477980f9466ba239542b868d7eaaf3b9a92ab50dcee6
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # fluent-plugin-geoip [![Build Status](https://travis-ci.org/y-ken/fluent-plugin-geoip.png?branch=master)](https://travis-ci.org/y-ken/fluent-plugin-geoip)
2
2
 
3
- Fluentd Output plugin to add information about geographical location of IP addresses with Maxmind GeoIP databases.
3
+ Fluentd Filter/Output plugin to add information about geographical location of IP addresses with Maxmind GeoIP databases.
4
4
 
5
- fluent-plugin-geoip has bundled cost-free [GeoLite City database](http://dev.maxmind.com/geoip/legacy/geolite/) by default.<br />
5
+ fluent-plugin-geoip has bundled cost-free [GeoLite2 Free Downloadable Databases](https://dev.maxmind.com/geoip/geoip2/geolite2/) and [GeoLite City database](http://dev.maxmind.com/geoip/legacy/geolite/) by default.<br />
6
6
  Also you can use purchased [GeoIP City database](http://www.maxmind.com/en/city) ([lang:ja](http://www.maxmind.com/ja/city)) which costs starting from $50.
7
7
 
8
8
  The accuracy details for GeoLite City (free) and GeoIP City (purchased) has described at the page below.
@@ -22,7 +22,7 @@ If you want to use this plugin with Fluentd v0.12.x or earlier use 0.8.x.
22
22
  ### Compatibility notice
23
23
 
24
24
  We've used Fluentd v1 API in this plugin since 1.0.0.
25
- So we have dropped some features.
25
+ So we have dropped some features from GeoipOutput.
26
26
 
27
27
  See also [official document](http://docs.fluentd.org/v1.0/articles/plugin-update-from-v12)
28
28
 
@@ -107,10 +107,12 @@ $ sudo td-agent-gem install fluent-plugin-geoip
107
107
 
108
108
  ## Usage
109
109
 
110
- ### For GeoipOutput
110
+ ### For GeoipFilter
111
+
112
+ Note that filter version of geoip plugin does not have handling tag feature.
111
113
 
112
114
  ```xml
113
- <match access.apache>
115
+ <filter access.apache>
114
116
  @type geoip
115
117
 
116
118
  # Specify one or more geoip lookup field which has ip address (default: host)
@@ -118,108 +120,89 @@ $ sudo td-agent-gem install fluent-plugin-geoip
118
120
  geoip_lookup_key host
119
121
 
120
122
  # Specify optional geoip database (using bundled GeoLiteCity databse by default)
121
- geoip_database "/path/to/your/GeoIPCity.dat"
123
+ # geoip_database "/path/to/your/GeoIPCity.dat"
122
124
  # 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
125
+ # geoip2_database "/path/to/your/GeoLite2-City.mmdb" (using bundled GeoLite2-City.mmdb by default)
126
+ # Specify backend library (geoip2_c, geoip, geoip2_compat)
127
+ backend_library geoip2_c
126
128
 
127
129
  # Set adding field with placeholder (more than one settings are required.)
128
130
  <record>
129
- latitude ${latitude["host"]}
130
- longitude ${longitude["host"]}
131
- country_code3 ${country_code3["host"]}
132
- country ${country_code["host"]}
133
- country_name ${country_name["host"]}
134
- dma ${dma_code["host"]}
135
- area ${area_code["host"]}
136
- region ${region["host"]}
137
- city ${city["host"]}
131
+ city ${city.names.en["host"]}
132
+ latitude ${location.latitude["host"]}
133
+ longitude ${location.longitude["host"]}
134
+ country ${country.iso_code["host"]}
135
+ country_name ${country.names.en["host"]}
136
+ postal_code ${postal.code["host"]}
138
137
  </record>
139
138
 
140
- # Settings for tag
141
- tag geoip.${tag[1]}
142
-
143
139
  # To avoid get stacktrace error with `[null, null]` array for elasticsearch.
144
140
  skip_adding_null_record true
145
141
 
146
- # Set log_level for fluentd-v0.10.43 or earlier (default: warn)
147
- log_level info
148
-
149
- <buffer tag>
150
- # Set buffering time (default: 0s)
151
- flush_interval 1s
152
- </buffer>
153
- </match>
142
+ # Set @log_level (default: warn)
143
+ @log_level info
144
+ </filter>
154
145
  ```
155
146
 
156
147
  #### Tips: how to geolocate multiple key
157
148
 
158
149
  ```xml
159
- <match access.apache>
150
+ <filter access.apache>
160
151
  @type geoip
161
152
  geoip_lookup_key user1_host, user2_host
162
153
  <record>
163
- user1_city ${city["user1_host"]}
164
- user2_city ${city["user2_host"]}
154
+ user1_city ${city.names.en["user1_host"]}
155
+ user2_city ${city.names.en["user2_host"]}
165
156
  </record>
166
- tag geoip.${tag[1]}
167
- </match>
157
+ </filter>
168
158
  ```
169
159
 
170
160
  #### Advanced config samples
171
161
 
172
162
  It is a sample to get friendly geo point recdords for elasticsearch with Yajl (JSON) parser.<br />
173
163
 
174
- **Notice** v0 config will be deprecated in the future.
175
-
176
164
  ```
177
- <match access.apache>
165
+ <filter access.apache>
178
166
  @type geoip
179
167
  geoip_lookup_key host
180
168
  <record>
181
169
  # lat lon as properties
182
170
  # ex. {"lat" => 37.4192008972168, "lon" => -122.05740356445312 }
183
- location_properties '{ "lat" : ${latitude["host"]}, "lon" : ${longitude["host"]} }'
171
+ location_properties '{ "lat" : ${location.latitude["host"]}, "lon" : ${location.longitude["host"]} }'
184
172
 
185
173
  # lat lon as string
186
174
  # ex. "37.4192008972168,-122.05740356445312"
187
- location_string ${latitude["host"]},${longitude["host"]}
175
+ location_string ${location.latitude["host"]},${location.longitude["host"]}
188
176
 
189
177
  # GeoJSON (lat lon as array) is useful for Kibana's bettermap.
190
178
  # ex. [-122.05740356445312, 37.4192008972168]
191
- location_array '[${longitude["host"]},${latitude["host"]}]'
179
+ location_array '[${location.longitude["host"]},${location.latitude["host"]}]'
192
180
  </record>
193
- tag geoip.${tag[1]}
194
181
 
195
182
  # To avoid get stacktrace error with `[null, null]` array for elasticsearch.
196
183
  skip_adding_null_record true
197
- </match>
184
+ </filter>
198
185
  ```
199
186
 
200
187
  On the case of using td-agent3 (v1-config), it have to quote `{ ... }` or `[ ... ]` block with quotation like below.
201
188
 
202
189
  ```
203
- <match access.apache>
190
+ <filter access.apache>
204
191
  @type geoip
205
192
  geoip_lookup_key host
206
193
  <record>
207
- location_properties '{ "lat" : ${latitude["host"]}, "lon" : ${longitude["host"]} }'
208
- location_string ${latitude["host"]},${longitude["host"]}
209
- location_array '[${longitude["host"]},${latitude["host"]}]'
194
+ location_properties '{ "lat" : ${location.latitude["host"]}, "lon" : ${location.longitude["host"]} }'
195
+ location_string ${location.latitude["host"]},${location.longitude["host"]}
196
+ location_array '[${location.longitude["host"]},${location.latitude["host"]}]'
210
197
  </record>
211
- remove_tag_prefix access.
212
- tag geoip.${tag}
213
198
  skip_adding_null_record true
214
- </match>
199
+ </filter>
215
200
  ```
216
201
 
217
- ### For GeoipFilter
218
-
219
- Note that filter version of geoip plugin does not have handling tag feature.
202
+ ### For GeoipOutput
220
203
 
221
204
  ```xml
222
- <filter access.apache>
205
+ <match access.apache>
223
206
  @type geoip
224
207
 
225
208
  # Specify one or more geoip lookup field which has ip address (default: host)
@@ -235,28 +218,35 @@ Note that filter version of geoip plugin does not have handling tag feature.
235
218
 
236
219
  # Set adding field with placeholder (more than one settings are required.)
237
220
  <record>
238
- city ${city["host"]}
239
- latitude ${latitude["host"]}
240
- longitude ${longitude["host"]}
241
- country_code3 ${country_code3["host"]}
242
- country ${country_code["host"]}
243
- country_name ${country_name["host"]}
244
- dma ${dma_code["host"]}
245
- area ${area_code["host"]}
246
- region ${region["host"]}
221
+ latitude ${location.latitude["host"]}
222
+ longitude ${location.longitude["host"]}
223
+ country ${country.iso_code["host"]}
224
+ country_name ${country.names.en["host"]}
225
+ postal_code ${postal.code["host"]}
226
+ region ${subdivisions.0.iso_code["host"]}
227
+ region_name ${subdivisions.0.names.en["host"]}
228
+ city ${city.names.en["host"]}
247
229
  </record>
248
230
 
231
+ # Settings for tag
232
+ tag geoip.${tag[1]}
233
+
249
234
  # To avoid get stacktrace error with `[null, null]` array for elasticsearch.
250
235
  skip_adding_null_record true
251
236
 
252
- # Set log_level for fluentd-v0.10.43 or earlier (default: warn)
253
- log_level info
254
- </filter>
237
+ # Set @log_level (default: warn)
238
+ @log_level info
239
+
240
+ <buffer tag>
241
+ # Set buffering time (default: 0s)
242
+ flush_interval 1s
243
+ </buffer>
244
+ </match>
255
245
  ```
256
246
 
257
247
  ## Tutorial
258
248
 
259
- ### For GeoipOutput
249
+ ### For GeoipFilter
260
250
 
261
251
  #### configuration
262
252
 
@@ -265,24 +255,17 @@ Note that filter version of geoip plugin does not have handling tag feature.
265
255
  @type forward
266
256
  </source>
267
257
 
268
- <match test.geoip>
269
- @type copy
270
- <store>
271
- @type stdout
272
- </store>
273
- <store>
274
- @type geoip
275
- geoip_lookup_key host
276
- <record>
277
- lat ${latitude["host"]}
278
- lon ${longitude["host"]}
279
- country ${country_code["host"]}
280
- </record>
281
- tag debug.${tag[1]}
282
- </store>
283
- </match>
258
+ <filter test.geoip>
259
+ @type geoip
260
+ geoip_lookup_key host
261
+ <record>
262
+ city ${city.names.en["host"]}
263
+ lat ${location.latitude["host"]}
264
+ lon ${location.longitude["host"]}
265
+ </record>
266
+ </filter>
284
267
 
285
- <match debug.**>
268
+ <match test.**>
286
269
  @type stdout
287
270
  </match>
288
271
  ```
@@ -295,14 +278,18 @@ $ echo '{"host":"66.102.9.80","message":"test"}' | fluent-cat test.geoip
295
278
 
296
279
  # check the result at stdout
297
280
  $ tail /var/log/td-agent/td-agent.log
298
- 2013-08-04 16:21:32 +0900 test.geoip: {"host":"66.102.9.80","message":"test"}
299
- 2013-08-04 16:21:32 +0900 debug.geoip: {"host":"66.102.9.80","message":"test","lat":37.4192008972168,"lon":-122.05740356445312,"country":"US"}
281
+ 2016-02-01 12:04:37 +0900 test.geoip: {"host":"66.102.9.80","message":"test","city":"Mountain View","lat":37.4192008972168,"lon":-122.05740356445312}
300
282
  ```
301
283
 
302
- For more details of geoip data format is described at the page below in section `GeoIP City Edition CSV Database Fields`.<br />
303
- http://dev.maxmind.com/geoip/legacy/csv/
284
+ You can check geoip data format using [utils/dump.rb](https://github.com/okkez/fluent-plugin-geoip/utils/dump.rb).
304
285
 
305
- ### For GeoipFilter
286
+ ```
287
+ $ bundle exec ruby urils/dump.rb geoip2 66.102.3.80
288
+ $ bundle exec ruby urils/dump.rb geoip2_compat 66.102.3.80
289
+ $ bundle exec ruby urils/dump.rb geoip 66.102.3.80
290
+ ```
291
+
292
+ ### For GeoipOutput
306
293
 
307
294
  #### configuration
308
295
 
@@ -311,17 +298,24 @@ http://dev.maxmind.com/geoip/legacy/csv/
311
298
  @type forward
312
299
  </source>
313
300
 
314
- <filter test.geoip>
315
- @type geoip
316
- geoip_lookup_key host
317
- <record>
318
- city ${city["host"]}
319
- lat ${latitude["host"]}
320
- lon ${longitude["host"]}
321
- </record>
322
- </filter>
301
+ <match test.geoip>
302
+ @type copy
303
+ <store>
304
+ @type stdout
305
+ </store>
306
+ <store>
307
+ @type geoip
308
+ geoip_lookup_key host
309
+ <record>
310
+ lat ${location.latitude["host"]}
311
+ lon ${location.longitude["host"]}
312
+ country ${country.iso_code["host"]}
313
+ </record>
314
+ tag debug.${tag[1]}
315
+ </store>
316
+ </match>
323
317
 
324
- <match test.**>
318
+ <match debug.**>
325
319
  @type stdout
326
320
  </match>
327
321
  ```
@@ -334,37 +328,19 @@ $ echo '{"host":"66.102.9.80","message":"test"}' | fluent-cat test.geoip
334
328
 
335
329
  # check the result at stdout
336
330
  $ tail /var/log/td-agent/td-agent.log
337
- 2016-02-01 12:04:37 +0900 test.geoip: {"host":"66.102.9.80","message":"test","city":"Mountain View","lat":37.4192008972168,"lon":-122.05740356445312}
331
+ 2013-08-04 16:21:32 +0900 test.geoip: {"host":"66.102.9.80","message":"test"}
332
+ 2013-08-04 16:21:32 +0900 debug.geoip: {"host":"66.102.9.80","message":"test","lat":37.4192008972168,"lon":-122.05740356445312,"country":"US"}
338
333
  ```
339
334
 
340
- For more details of geoip data format is described at the page below in section `GeoIP City Edition CSV Database Fields`.<br />
341
- http://dev.maxmind.com/geoip/legacy/csv/
342
-
343
- ## Placeholders
344
-
345
- ### GeoIP legacy
346
-
347
- Provides these placeholders for adding field of geolocate results.<br />
348
- For more example of geolocating, you can try these websites like [Geo IP Address View](http://www.geoipview.com/) or [View my IP information](http://www.geoiptool.com/en/).
349
-
350
- | placeholder attributes | output example | type | note |
351
- |--------------------------------|-------------------|--------------|------|
352
- | ${city[lookup_field]} | "Ithaca" | varchar(255) | - |
353
- | ${latitude[lookup_field]} | 42.4277992248535 | decimal | - |
354
- | ${longitude[lookup_field]} | -76.4981994628906 | decimal | - |
355
- | ${country_code3[lookup_field]} | "USA" | varchar(3) | - |
356
- | ${country_code[lookup_field]} | "US" | varchar(2) | A two-character ISO 3166-1 country code |
357
- | ${country_name[lookup_field]} | "United States" | varchar(50) | - |
358
- | ${dma_code[lookup_field]} | 555 | unsigned int | **only for US** |
359
- | ${area_code[lookup_field]} | 607 | char(3) | **only for US** |
360
- | ${region[lookup_field]} | "NY" | char(2) | A two character ISO-3166-2 or FIPS 10-4 code |
361
-
362
- Further more specification available at http://dev.maxmind.com/geoip/legacy/csv/#GeoIP_City_Edition_CSV_Database_Fields
335
+ You can check geoip data format using [utils/dump.rb](https://github.com/okkez/fluent-plugin-geoip/utils/dump.rb).
363
336
 
364
- Related configurations:
337
+ ```
338
+ $ bundle exec ruby urils/dump.rb geoip2 66.102.3.80
339
+ $ bundle exec ruby urils/dump.rb geoip2_compat 66.102.3.80
340
+ $ bundle exec ruby urils/dump.rb geoip 66.102.3.80
341
+ ```
365
342
 
366
- * `backend_library`: `geoip` (default)
367
- * `geoip_database`: path to your GeoLiteCity.dat
343
+ ## Placeholders
368
344
 
369
345
  ### GeoIP2
370
346
 
@@ -405,43 +381,139 @@ Related configurations:
405
381
  * `backend_library`: `geoip2_compat` or `geoip2_c`
406
382
  * `geoip2_database`: path to your GeoLite2-City.mmdb
407
383
 
384
+ ### GeoIP legacy
385
+
386
+ Provides these placeholders for adding field of geolocate results.<br />
387
+ For more example of geolocating, you can try these websites like [Geo IP Address View](http://www.geoipview.com/) or [View my IP information](http://www.geoiptool.com/en/).
388
+
389
+ | placeholder attributes | output example | type | note |
390
+ |--------------------------------|-------------------|--------------|------|
391
+ | ${city[lookup_field]} | "Ithaca" | varchar(255) | - |
392
+ | ${latitude[lookup_field]} | 42.4277992248535 | decimal | - |
393
+ | ${longitude[lookup_field]} | -76.4981994628906 | decimal | - |
394
+ | ${country_code3[lookup_field]} | "USA" | varchar(3) | - |
395
+ | ${country_code[lookup_field]} | "US" | varchar(2) | A two-character ISO 3166-1 country code |
396
+ | ${country_name[lookup_field]} | "United States" | varchar(50) | - |
397
+ | ${dma_code[lookup_field]} | 555 | unsigned int | **only for US** |
398
+ | ${area_code[lookup_field]} | 607 | char(3) | **only for US** |
399
+ | ${region[lookup_field]} | "NY" | char(2) | A two character ISO-3166-2 or FIPS 10-4 code |
400
+
401
+ Further more specification available at http://dev.maxmind.com/geoip/legacy/csv/#GeoIP_City_Edition_CSV_Database_Fields
402
+
403
+ Related configurations:
404
+
405
+ * `backend_library`: `geoip` (default)
406
+ * `geoip_database`: path to your GeoLiteCity.dat
407
+
408
408
  ## Parameters
409
409
 
410
- ### GeoipOutput
410
+ ### GeoipFilter
411
+
412
+ Note that filter version of `geoip` plugin does not have handling `tag` feature.
413
+
414
+ #### Plugin helpers
415
+
416
+ * [compat_parameters](https://docs.fluentd.org/v1.0/articles/api-plugin-helper-compat_parameters)
417
+ * [inject](https://docs.fluentd.org/v1.0/articles/api-plugin-helper-inject)
418
+
419
+ See also [Filter Plugin Overview](https://docs.fluentd.org/v1.0/articles/filter-plugin-overview)
420
+
421
+ #### Supported sections
422
+
423
+ * [Inject section configurations](https://docs.fluentd.org/v1.0/articles/inject-section)
424
+
425
+ #### Parameters
426
+
427
+ [Plugin Common Paramteters](https://docs.fluentd.org/v1.0/articles/plugin-common-parameters)
428
+
429
+ **geoip_database** (string) (optional)
430
+
431
+ * Default value: bundled database `GeoLiteCity.dat`
432
+
433
+ Path to GeoIP database file.
434
+
435
+ **geoip2_database** (string) (optional)
436
+
437
+ * Default value: bundled database `GeoLite2-City.mmdb`.
438
+
439
+ Path to GeoIP2 database file.
440
+
441
+ **geoip_lookup_key** (string) (optional)
442
+
443
+ * Default value: `host`.
411
444
 
412
- * `include_tag_key` (default: false)
413
- * `tag_key`
445
+ Specify one or more geoip lookup field which has IP address.
414
446
 
415
- Add original tag name into filtered record using SetTagKeyMixin.<br />
416
- Further details are written at http://docs.fluentd.org/articles/in_exec
447
+ **skip_adding_null_record** (bool) (optional)
417
448
 
418
- * `skip_adding_null_record` (default: false)
449
+ * Default value: `nil`
419
450
 
420
451
  Skip adding geoip fields when this valaues to `true`.
421
452
  On the case of getting nothing of GeoIP info (such as local IP), it will output the original record without changing anything.
422
453
 
423
- * `tag`
454
+ **backend_library** (enum) (optional)
424
455
 
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)).
456
+ * Available values: `geoip`, `geoip2_compat`, `geoip2_c`
457
+ * Default value: `geoip2_c`.
426
458
 
427
- * `flush_interval` (default: 0 sec)
459
+ Set backend library.
428
460
 
429
- Set buffering time to execute bulk lookup geoip.
461
+ ### GeoipOutput
430
462
 
431
- ### GeoipFilter
463
+ #### Plugin helpers
432
464
 
433
- Note that filter version of `geoip` plugin does not have handling `tag` feature.
465
+ * [event_emitter](https://docs.fluentd.org/v1.0/articles/api-plugin-helper-event_emitter)
466
+ * [compat_parameters](https://docs.fluentd.org/v1.0/articles/api-plugin-helper-compat_parameters)
467
+ * [inject](https://docs.fluentd.org/v1.0/articles/api-plugin-helper-inject)
468
+
469
+ See also [Output Plugin Overview](https://docs.fluentd.org/v1.0/articles/output-plugin-overview)
470
+
471
+ #### Sections
472
+
473
+ * [Inject section configurations](https://docs.fluentd.org/v1.0/articles/inject-section)
474
+ * [Buffer section configurations](https://docs.fluentd.org/v1.0/articles/buffer-section)
475
+
476
+ #### Parameters
477
+
478
+ [Plugin Common Paramteters](https://docs.fluentd.org/v1.0/articles/plugin-common-parameters)
479
+
480
+ **geoip_database** (string) (optional)
481
+
482
+ * Default value: bundled database `GeoLiteCity.dat`
483
+
484
+ Path to GeoIP database file.
485
+
486
+ **geoip2_database** (string) (optional)
434
487
 
435
- * `include_tag_key` (default: false)
488
+ * Default value: bundled database `GeoLite2-City.mmdb`.
436
489
 
437
- Add original tag name into filtered record using SetTagKeyMixin.<br />
438
- Further details are written at http://docs.fluentd.org/articles/in_exec
490
+ Path to GeoIP2 database file.
439
491
 
440
- * `skip_adding_null_record` (default: false)
492
+ **geoip_lookup_key** (string) (optional)
493
+
494
+ * Default value: `host`.
495
+
496
+ Specify one or more geoip lookup field which has IP address.
497
+
498
+ **skip_adding_null_record** (bool) (optional)
499
+
500
+ * Default value: `nil`
441
501
 
442
502
  Skip adding geoip fields when this valaues to `true`.
443
503
  On the case of getting nothing of GeoIP info (such as local IP), it will output the original record without changing anything.
444
504
 
505
+ **backend_library** (enum) (optional)
506
+
507
+ * Available values: `geoip`, `geoip2_compat`, `geoip2_c`
508
+ * Default value: `geoip2_c`.
509
+
510
+ Set backend library.
511
+
512
+ **tag** (string) (optional)
513
+
514
+ 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)).
515
+
516
+
445
517
  ## Articles
446
518
 
447
519
  * [IPアドレスを元に位置情報をリアルタイムに付与する fluent-plugin-geoip v0.0.1をリリースしました #fluentd - Y-Ken Studio](http://y-ken.hatenablog.com/entry/fluent-plugin-geoip-has-released)<br />
@@ -463,8 +535,6 @@ http://developer.smartnews.be/blog/2013/10/03/easy-data-analysis-using-fluentd-r
463
535
 
464
536
  Pull requests are very welcome!!
465
537
 
466
- * support [GeoIP2](http://dev.maxmind.com/geoip/geoip2/whats-new-in-geoip2/)
467
-
468
538
  ## Contributing
469
539
 
470
540
  1. Fork it
@@ -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 = "1.0.0"
7
+ spec.version = "1.1.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.}
@@ -5,20 +5,19 @@ module Fluent::Plugin
5
5
  class GeoipFilter < Fluent::Plugin::Filter
6
6
  Fluent::Plugin.register_filter('geoip', self)
7
7
 
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'
8
+ helpers :compat_parameters, :inject
9
+
10
+ config_param :geoip_database, :string, default: File.expand_path('../../../data/GeoLiteCity.dat', __dir__)
11
+ config_param :geoip2_database, :string, default: File.expand_path('../../../data/GeoLite2-City.mmdb', __dir__)
10
12
  config_param :geoip_lookup_key, :string, default: 'host'
11
13
  config_param :skip_adding_null_record, :bool, default: false
12
14
 
13
- config_set_default :include_tag_key, false
14
-
15
- config_param :hostname_command, :string, default: 'hostname'
16
-
17
- config_param :log_level, :string, default: 'warn'
15
+ config_set_default :@log_level, "warn"
18
16
 
19
17
  config_param :backend_library, :enum, list: Fluent::GeoIP::BACKEND_LIBRARIES, default: :geoip2_c
20
18
 
21
19
  def configure(conf)
20
+ compat_parameters_convert(conf, :inject)
22
21
  super
23
22
  @geoip = Fluent::GeoIP.new(self, conf)
24
23
  end
@@ -28,7 +27,12 @@ module Fluent::Plugin
28
27
  if filtered_record
29
28
  record = filtered_record
30
29
  end
30
+ record = inject_values_to_record(tag, time, record)
31
31
  record
32
32
  end
33
+
34
+ def multi_workers_ready?
35
+ true
36
+ end
33
37
  end
34
38
  end
@@ -56,7 +56,9 @@ module Fluent
56
56
  dummy_text = Yajl::Encoder.encode('dummy_text')
57
57
  Yajl::Parser.parse(v.gsub(REGEXP_PLACEHOLDER_SCAN, dummy_text))
58
58
  rescue Yajl::ParseError => e
59
- raise Fluent::ConfigError, "geoip: failed to parse '#{v}' as json."
59
+ message = "geoip: failed to parse '#{v}' as json."
60
+ log.error message, error: e
61
+ raise Fluent::ConfigError, message
60
62
  end
61
63
  }
62
64
  validate_json.call if json?(v.tr('\'"\\', ''))
@@ -108,7 +110,6 @@ module Fluent
108
110
 
109
111
  def quoted_value?(text)
110
112
  # to improbe compatibility with fluentd v1-config
111
- trim_quote = text[1..text.size-2]
112
113
  text.match(/(^'.+'$|^".+"$)/)
113
114
  end
114
115
 
@@ -151,7 +152,13 @@ module Fluent
151
152
  position = placeholder_key.match(REGEXP_PLACEHOLDER_SINGLE)
152
153
  next if position.nil? or geodata[position[:record_key]].nil?
153
154
  keys = [position[:record_key]] + position[:geoip_key].split('.').map(&:to_sym)
154
- placeholder[placeholder_key] = geodata.dig(*keys)
155
+ value = geodata.dig(*keys)
156
+ value = if [:latitude, :longitude].include?(keys.last)
157
+ value || 0.0
158
+ else
159
+ value
160
+ end
161
+ placeholder[placeholder_key] = value
155
162
  end
156
163
  placeholder
157
164
  end
@@ -6,23 +6,23 @@ class Fluent::Plugin::GeoipOutput < Fluent::Plugin::Output
6
6
 
7
7
  helpers :event_emitter, :inject, :compat_parameters
8
8
 
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'
9
+ config_param :geoip_database, :string, default: File.expand_path('../../../data/GeoLiteCity.dat', __dir__)
10
+ config_param :geoip2_database, :string, default: File.expand_path('../../../data/GeoLite2-City.mmdb', __dir__)
11
11
  config_param :geoip_lookup_key, :string, default: 'host'
12
12
  config_param :tag, :string, default: nil
13
13
  config_param :skip_adding_null_record, :bool, default: false
14
14
 
15
- config_param :flush_interval, :time, default: 0
16
- config_param :log_level, :string, default: 'warn'
15
+ config_set_default :@log_level, "warn"
17
16
 
18
17
  config_param :backend_library, :enum, list: Fluent::GeoIP::BACKEND_LIBRARIES, default: :geoip2_c
19
18
  config_section :buffer do
20
19
  config_set_default :@type, :memory
21
20
  config_set_default :chunk_keys, ['tag']
21
+ config_set_default :flush_interval, 0
22
22
  end
23
23
 
24
24
  def configure(conf)
25
- compat_parameters_convert(conf, :buffer, default_chunk_key: 'tag')
25
+ compat_parameters_convert(conf, :buffer, :inject, default_chunk_key: 'tag')
26
26
  super
27
27
  raise Fluetn::ConfigError, "chunk key must include 'tag'" unless @chunk_key_tag
28
28
  placeholder_validate!(:tag, @tag) if @tag
@@ -48,4 +48,8 @@ class Fluent::Plugin::GeoipOutput < Fluent::Plugin::Output
48
48
  tag = extract_placeholders(@tag, chunk.metadata) if @tag
49
49
  router.emit_stream(tag, es)
50
50
  end
51
+
52
+ def multi_workers_ready?
53
+ true
54
+ end
51
55
  end
@@ -19,6 +19,7 @@ class GeoipFilterTest < Test::Unit::TestCase
19
19
 
20
20
  def filter(config, messages, syntax: :v1)
21
21
  d = create_driver(config, syntax: syntax)
22
+ yield d if block_given?
22
23
  d.run(default_tag: "input.access") {
23
24
  messages.each {|message|
24
25
  d.feed(@time, message)
@@ -27,6 +28,15 @@ class GeoipFilterTest < Test::Unit::TestCase
27
28
  d.filtered_records
28
29
  end
29
30
 
31
+ def setup_geoip_mock(d)
32
+ geoip = d.instance.instance_variable_get(:@geoip)
33
+ db = Object.new
34
+ def db.lookup(ip)
35
+ {}
36
+ end
37
+ geoip.instance_variable_set(:@geoip, db)
38
+ end
39
+
30
40
  sub_test_case "configure" do
31
41
  test "empty" do
32
42
  assert_nothing_raised {
@@ -392,6 +402,32 @@ class GeoipFilterTest < Test::Unit::TestCase
392
402
  filtered = filter(config, messages)
393
403
  assert_equal(expected, filtered)
394
404
  end
405
+
406
+ def test_filter_when_latitude_longitude_is_nil
407
+ config = %[
408
+ backend_library geoip2_c
409
+ geoip_lookup_key host
410
+ <record>
411
+ latitude ${location.latitude['host']}
412
+ longitude ${location.longitude['host']}
413
+ </record>
414
+ ]
415
+ messages = [
416
+ { "host" => "180.94.85.84", "message" => "nil latitude and longitude" }
417
+ ]
418
+ expected = [
419
+ {
420
+ "host" => "180.94.85.84",
421
+ "message" => "nil latitude and longitude",
422
+ "latitude" => 0.0,
423
+ "longitude" => 0.0
424
+ }
425
+ ]
426
+ filtered = filter(config, messages) do |d|
427
+ setup_geoip_mock(d)
428
+ end
429
+ assert_equal(expected, filtered)
430
+ end
395
431
  end
396
432
 
397
433
  sub_test_case "geoip2_compat" do
@@ -661,6 +697,32 @@ class GeoipFilterTest < Test::Unit::TestCase
661
697
  filtered = filter(config, messages)
662
698
  assert_equal(expected, filtered)
663
699
  end
700
+
701
+ def test_filter_when_latitude_longitude_is_nil
702
+ config = %[
703
+ backend_library geoip2_compat
704
+ geoip_lookup_key host
705
+ <record>
706
+ latitude ${latitude['host']}
707
+ longitude ${longitude['host']}
708
+ </record>
709
+ ]
710
+ messages = [
711
+ { "host" => "180.94.85.84", "message" => "nil latitude and longitude" }
712
+ ]
713
+ expected = [
714
+ {
715
+ "host" => "180.94.85.84",
716
+ "message" => "nil latitude and longitude",
717
+ "latitude" => 0.0,
718
+ "longitude" => 0.0
719
+ }
720
+ ]
721
+ filtered = filter(config, messages) do |d|
722
+ setup_geoip_mock(d)
723
+ end
724
+ assert_equal(expected, filtered)
725
+ end
664
726
  end
665
727
 
666
728
  sub_test_case "geoip legacy" do
@@ -1025,6 +1087,32 @@ class GeoipFilterTest < Test::Unit::TestCase
1025
1087
  filtered = filter(config, messages)
1026
1088
  assert_equal(expected, filtered)
1027
1089
  end
1090
+
1091
+ def test_filter_when_latitude_longitude_is_nil
1092
+ config = %[
1093
+ backend_library geoip
1094
+ geoip_lookup_key host
1095
+ <record>
1096
+ latitude ${latitude['host']}
1097
+ longitude ${longitude['host']}
1098
+ </record>
1099
+ ]
1100
+ messages = [
1101
+ { "host" => "180.94.85.84", "message" => "nil latitude and longitude" }
1102
+ ]
1103
+ expected = [
1104
+ {
1105
+ "host" => "180.94.85.84",
1106
+ "message" => "nil latitude and longitude",
1107
+ "latitude" => 0.0,
1108
+ "longitude" => 0.0
1109
+ }
1110
+ ]
1111
+ filtered = filter(config, messages) do |d|
1112
+ setup_geoip_mock(d)
1113
+ end
1114
+ assert_equal(expected, filtered)
1115
+ end
1028
1116
  end
1029
1117
  end
1030
1118
 
@@ -273,7 +273,7 @@ class GeoipOutputTest < Test::Unit::TestCase
273
273
  assert_equal 'Mountain View', events[0][2]['from_city']
274
274
  assert_equal 'United States', events[0][2]['from_country']
275
275
  assert_equal 37.419200000000004, events[0][2]['latitude']
276
- assert_equal -122.0574, events[0][2]['longitude']
276
+ assert_equal(-122.0574, events[0][2]['longitude'])
277
277
  assert_equal '37.419200000000004,-122.0574', events[0][2]['float_concat']
278
278
  assert_equal [-122.0574, 37.419200000000004], events[0][2]['float_array']
279
279
  float_nest = {"lat" => 37.419200000000004, "lon" => -122.0574 }
@@ -559,7 +559,7 @@ class GeoipOutputTest < Test::Unit::TestCase
559
559
  assert_equal 'Mountain View', events[0][2]['from_city']
560
560
  assert_equal 'United States', events[0][2]['from_country']
561
561
  assert_equal 37.419200000000004, events[0][2]['latitude']
562
- assert_equal -122.0574, events[0][2]['longitude']
562
+ assert_equal(-122.0574, events[0][2]['longitude'])
563
563
  assert_equal '37.419200000000004,-122.0574', events[0][2]['float_concat']
564
564
  assert_equal [-122.0574, 37.419200000000004], events[0][2]['float_array']
565
565
  float_nest = {"lat" => 37.419200000000004, "lon" => -122.0574 }
@@ -933,7 +933,7 @@ class GeoipOutputTest < Test::Unit::TestCase
933
933
  assert_equal 'Mountain View', events[0][2]['from_city']
934
934
  assert_equal 'United States', events[0][2]['from_country']
935
935
  assert_equal 37.4192008972168, events[0][2]['latitude']
936
- assert_equal -122.05740356445312, events[0][2]['longitude']
936
+ assert_equal(-122.05740356445312, events[0][2]['longitude'])
937
937
  assert_equal '37.4192008972168,-122.05740356445312', events[0][2]['float_concat']
938
938
  assert_equal [-122.05740356445312, 37.4192008972168], events[0][2]['float_array']
939
939
  float_nest = {"lat" => 37.4192008972168, "lon" => -122.05740356445312 }
@@ -0,0 +1,27 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require "geoip"
4
+ require "geoip2_compat"
5
+ require "geoip2"
6
+ require "pp"
7
+
8
+ backend = ARGV[0]
9
+ ip = ARGV[1]
10
+
11
+ geoip_database = File.expand_path("../data/GeoLiteCity.dat", __dir__)
12
+ geoip2_database = File.expand_path("../data/GeoLite2-City.mmdb", __dir__)
13
+
14
+ geoip = GeoIP::City.new(geoip_database, :memory, false)
15
+ geoip2_compat = GeoIP2Compat.new(geoip2_database)
16
+ geoip2 = GeoIP2::Database.new(geoip2_database)
17
+
18
+ record = case backend
19
+ when "geoip"
20
+ geoip.look_up(ip)
21
+ when "geoip2_compat"
22
+ geoip2_compat.lookup(ip)
23
+ when "geoip2"
24
+ geoip2.lookup(ip)
25
+ end
26
+
27
+ pp record.to_h
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-geoip
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kentaro Yoshida
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-19 00:00:00.000000000 Z
11
+ date: 2017-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -175,6 +175,7 @@ files:
175
175
  - test/helper.rb
176
176
  - test/plugin/test_filter_geoip.rb
177
177
  - test/plugin/test_out_geoip.rb
178
+ - utils/dump.rb
178
179
  homepage: https://github.com/y-ken/fluent-plugin-geoip
179
180
  licenses:
180
181
  - Apache-2.0
@@ -195,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
196
  version: '0'
196
197
  requirements: []
197
198
  rubyforge_project:
198
- rubygems_version: 2.6.13
199
+ rubygems_version: 2.7.3
199
200
  signing_key:
200
201
  specification_version: 4
201
202
  summary: Fluentd Filter plugin to add information about geographical location of IP