fluent-plugin-geoip 0.3.1 → 0.4.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.
- data/README.md +0 -2
- data/fluent-plugin-geoip.gemspec +1 -1
- data/lib/fluent/plugin/out_geoip.rb +8 -14
- data/test/plugin/test_out_geoip.rb +57 -16
- metadata +2 -2
data/README.md
CHANGED
@@ -56,7 +56,6 @@ $ sudo td-agent-gem install fluent-plugin-geoip
|
|
56
56
|
latitude ${latitude["host"]}
|
57
57
|
longitude ${longitude["host"]}
|
58
58
|
country_code3 ${country_code3["host"]}
|
59
|
-
country_code2 ${country_code2["host"]}
|
60
59
|
country ${country_code["host"]}
|
61
60
|
country_name ${country_name["host"]}
|
62
61
|
dma ${dma_code["host"]}
|
@@ -189,7 +188,6 @@ Provides these placeholders for adding field of geolocate results.
|
|
189
188
|
* ${latitude[lookup_field]}
|
190
189
|
* ${longitude[lookup_field]}
|
191
190
|
* ${country_code3[lookup_field]}
|
192
|
-
* ${country_code2[lookup_field]}
|
193
191
|
* ${country_code[lookup_field]}
|
194
192
|
* ${country_name[lookup_field]}
|
195
193
|
* ${dma_code[lookup_field]}
|
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 = "0.4.0"
|
8
8
|
spec.authors = ["Kentaro Yoshida"]
|
9
9
|
spec.email = ["y.ken.studio@gmail.com"]
|
10
10
|
spec.summary = %q{Fluentd Output plugin to add information about geographical location of IP addresses with Maxmind GeoIP databases.}
|
@@ -4,8 +4,9 @@ class Fluent::GeoipOutput < Fluent::BufferedOutput
|
|
4
4
|
Fluent::Plugin.register_output('geoip', self)
|
5
5
|
|
6
6
|
REGEXP_PLACEHOLDER_SINGLE = /^\$\{(?<geoip_key>-?[^\[]+)\[['"](?<record_key>-?[^'"]+)['"]\]\}$/
|
7
|
-
REGEXP_PLACEHOLDER_SCAN = /(\$\{[^\}]+?\})
|
8
|
-
|
7
|
+
REGEXP_PLACEHOLDER_SCAN = /['"]?(\$\{[^\}]+?\})['"]?/
|
8
|
+
|
9
|
+
GEOIP_KEYS = %w(city latitude longitude country_code3 country_code country_name dma_code area_code region)
|
9
10
|
|
10
11
|
config_param :geoip_database, :string, :default => File.dirname(__FILE__) + '/../../../data/GeoLiteCity.dat'
|
11
12
|
config_param :geoip_lookup_key, :string, :default => 'host'
|
@@ -59,7 +60,7 @@ class Fluent::GeoipOutput < Fluent::BufferedOutput
|
|
59
60
|
conf.elements.select { |element| element.name == 'record' }.each { |element|
|
60
61
|
element.each_pair { |k, v|
|
61
62
|
element.has_key?(k) # to suppress unread configuration warning
|
62
|
-
v = v[1..v.size-2] if
|
63
|
+
v = v[1..v.size-2] if quoted_value?(v)
|
63
64
|
@map[k] = v
|
64
65
|
validate_json = Proc.new {
|
65
66
|
begin
|
@@ -107,21 +108,13 @@ class Fluent::GeoipOutput < Fluent::BufferedOutput
|
|
107
108
|
private
|
108
109
|
|
109
110
|
def json?(text)
|
110
|
-
text.match(/^\[.+\]$/) || text.match(/^\{.+\}$/)
|
111
|
+
text.match(/^\[.+\]$/) || text.match(/^\{.+\}$/)
|
111
112
|
end
|
112
113
|
|
113
|
-
def
|
114
|
+
def quoted_value?(text)
|
114
115
|
# to improbe compatibility with fluentd v1-config
|
115
116
|
trim_quote = text[1..text.size-2]
|
116
|
-
text.match(/(^'.+'$|^".+"$)/)
|
117
|
-
end
|
118
|
-
|
119
|
-
def json_array_block?(text)
|
120
|
-
text.match(/^\[[^\{]*?\{.+\}[^\}]*?\]$/)
|
121
|
-
end
|
122
|
-
|
123
|
-
def json_hash_block?(text)
|
124
|
-
text.match(/^\{[^\{]*?\{.+\}[^\}]*?\}$/)
|
117
|
+
text.match(/(^'.+'$|^".+"$)/)
|
125
118
|
end
|
126
119
|
|
127
120
|
def add_geoip_field(record)
|
@@ -131,6 +124,7 @@ class Fluent::GeoipOutput < Fluent::BufferedOutput
|
|
131
124
|
rewrited = placeholder[value]
|
132
125
|
elsif json?(value)
|
133
126
|
rewrited = value.gsub(REGEXP_PLACEHOLDER_SCAN) {|match|
|
127
|
+
match = match[1..match.size-2] if quoted_value?(match)
|
134
128
|
Yajl::Encoder.encode(placeholder[match])
|
135
129
|
}
|
136
130
|
rewrited = parse_json(rewrited)
|
@@ -12,8 +12,8 @@ class GeoipOutputTest < Test::Unit::TestCase
|
|
12
12
|
tag geoip.${tag}
|
13
13
|
]
|
14
14
|
|
15
|
-
def create_driver(conf=CONFIG,tag='test')
|
16
|
-
Fluent::Test::OutputTestDriver.new(Fluent::GeoipOutput, tag).configure(conf)
|
15
|
+
def create_driver(conf=CONFIG,tag='test',use_v1=false)
|
16
|
+
Fluent::Test::OutputTestDriver.new(Fluent::GeoipOutput, tag).configure(conf, use_v1)
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_configure
|
@@ -327,35 +327,76 @@ class GeoipOutputTest < Test::Unit::TestCase
|
|
327
327
|
assert_equal [nil, nil], emits[1][2]['string_array']
|
328
328
|
end
|
329
329
|
|
330
|
+
CONFIG_QUOTED_RECORD = %[
|
331
|
+
geoip_lookup_key host
|
332
|
+
<record>
|
333
|
+
location_properties '{ "country_code" : "${country_code["host"]}", "lat": ${latitude["host"]}, "lon": ${longitude["host"]} }'
|
334
|
+
location_string ${latitude['host']},${longitude['host']}
|
335
|
+
location_string2 ${country_code["host"]}
|
336
|
+
location_array "[${longitude['host']},${latitude['host']}]"
|
337
|
+
location_array2 '[${longitude["host"]},${latitude["host"]}]'
|
338
|
+
peculiar_pattern '[GEOIP] message => {"lat":${latitude["host"]}, "lon":${longitude["host"]}}'
|
339
|
+
</record>
|
340
|
+
remove_tag_prefix input.
|
341
|
+
tag geoip.${tag}
|
342
|
+
]
|
343
|
+
|
344
|
+
def test_emit_quoted_record
|
345
|
+
d1 = create_driver(CONFIG_QUOTED_RECORD, 'input.access')
|
346
|
+
d1.run do
|
347
|
+
d1.emit({'host' => '66.102.3.80', 'message' => 'valid ip'})
|
348
|
+
end
|
349
|
+
emits = d1.emits
|
350
|
+
assert_equal 1, emits.length
|
351
|
+
assert_equal 'geoip.access', emits[0][0] # tag
|
352
|
+
location_properties = { "country_code" => "US", "lat" => 37.4192008972168, "lon"=> -122.05740356445312 }
|
353
|
+
assert_equal location_properties, emits[0][2]['location_properties']
|
354
|
+
assert_equal '37.4192008972168,-122.05740356445312', emits[0][2]['location_string']
|
355
|
+
assert_equal 'US', emits[0][2]['location_string2']
|
356
|
+
assert_equal [-122.05740356445312, 37.4192008972168], emits[0][2]['location_array']
|
357
|
+
assert_equal [-122.05740356445312, 37.4192008972168], emits[0][2]['location_array2']
|
358
|
+
assert_equal '[GEOIP] message => {"lat":37.4192008972168, "lon":-122.05740356445312}', emits[0][2]['peculiar_pattern']
|
359
|
+
end
|
330
360
|
|
361
|
+
def test_emit_v1_config_compatibility
|
362
|
+
d1 = create_driver(CONFIG_QUOTED_RECORD, 'input.access', true)
|
363
|
+
d1.run do
|
364
|
+
d1.emit({'host' => '66.102.3.80', 'message' => 'valid ip'})
|
365
|
+
end
|
366
|
+
emits = d1.emits
|
367
|
+
assert_equal 1, emits.length
|
368
|
+
assert_equal 'geoip.access', emits[0][0] # tag
|
369
|
+
location_properties = { "country_code" => "US", "lat" => 37.4192008972168, "lon"=> -122.05740356445312 }
|
370
|
+
assert_equal location_properties, emits[0][2]['location_properties']
|
371
|
+
assert_equal '37.4192008972168,-122.05740356445312', emits[0][2]['location_string']
|
372
|
+
assert_equal 'US', emits[0][2]['location_string2']
|
373
|
+
assert_equal [-122.05740356445312, 37.4192008972168], emits[0][2]['location_array']
|
374
|
+
assert_equal [-122.05740356445312, 37.4192008972168], emits[0][2]['location_array2']
|
375
|
+
assert_equal '[GEOIP] message => {"lat":37.4192008972168, "lon":-122.05740356445312}', emits[0][2]['peculiar_pattern']
|
376
|
+
end
|
331
377
|
|
332
|
-
def
|
378
|
+
def test_emit_multiline_v1_config
|
333
379
|
d1 = create_driver(%[
|
334
380
|
geoip_lookup_key host
|
335
381
|
<record>
|
336
|
-
location_properties
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
382
|
+
location_properties {
|
383
|
+
"city": "${city['host']}",
|
384
|
+
"country_code": "${country_code['host']}",
|
385
|
+
"latitude": "${latitude['host']}",
|
386
|
+
"longitude": "${longitude['host']}"
|
387
|
+
}
|
342
388
|
</record>
|
343
389
|
remove_tag_prefix input.
|
344
390
|
tag geoip.${tag}
|
345
|
-
], 'input.access')
|
391
|
+
], 'input.access', true)
|
346
392
|
d1.run do
|
347
393
|
d1.emit({'host' => '66.102.3.80', 'message' => 'valid ip'})
|
348
394
|
end
|
349
395
|
emits = d1.emits
|
350
396
|
assert_equal 1, emits.length
|
351
397
|
assert_equal 'geoip.access', emits[0][0] # tag
|
352
|
-
location_properties = { "
|
398
|
+
location_properties = { "city"=>"Mountain View", "country_code"=>"US", "latitude"=>37.4192008972168, "longitude"=>-122.05740356445312 }
|
353
399
|
assert_equal location_properties, emits[0][2]['location_properties']
|
354
|
-
assert_equal '37.4192008972168,-122.05740356445312', emits[0][2]['location_string']
|
355
|
-
assert_equal '37.4192008972168,-122.05740356445312', emits[0][2]['location_string2']
|
356
|
-
assert_equal [-122.05740356445312, 37.4192008972168], emits[0][2]['location_array']
|
357
|
-
assert_equal [-122.05740356445312, 37.4192008972168], emits[0][2]['location_array2']
|
358
|
-
assert_equal '[GEOIP] message => {"lat":37.4192008972168, "lon":-122.05740356445312}', emits[0][2]['peculiar_pattern']
|
359
400
|
end
|
360
401
|
end
|
361
402
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-geoip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-11-
|
12
|
+
date: 2014-11-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|