fluent-plugin-viki 0.1.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 +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +7 -0
- data/README.md +36 -0
- data/Rakefile +1 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/config/fluent.conf +116 -0
- data/fluent-plugin-viki.gemspec +39 -0
- data/fluentd.conf +53 -0
- data/lib/fluent/plugin/geoip.rb +28 -0
- data/lib/fluent/plugin/viki/version.rb +5 -0
- data/lib/fluent/plugin/viki.rb +184 -0
- metadata +163 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4e25ddf170d217cf078ea8075da0b4045af950dd
|
4
|
+
data.tar.gz: 5466ab22f9020a7c2ba5cdef075327764b547d8b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 96c81345d50a5c81764f5a5abe1720fad5860e990567972024d80d7ff262bdf55d5a9d2136d87431113821264fa23132626f338e32f8505d2a62c0f8994c52be
|
7
|
+
data.tar.gz: b8c47a3cd5c4a1ef9e073ef9e1951b1dd4792d543f49848b94f9bd9e0c977803b32d06627d1fddf2c95658e1cb60ea05213a3b0f2545dc2ae97780b4550cd7a1
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Fluent::Plugin::Viki
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/fluent/plugin/viki`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'fluent-plugin-viki'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install fluent-plugin-viki
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
+
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/fluent-plugin-viki.
|
36
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "fluent/viki"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
data/config/fluent.conf
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
# In v1 configuration, type and id are @ prefix parameters.
|
2
|
+
# @type and @id are recommended. type and id are still available for backward compatibility
|
3
|
+
|
4
|
+
## built-in TCP input
|
5
|
+
## $ echo <json> | fluent-cat <tag>
|
6
|
+
<source>
|
7
|
+
@type forward
|
8
|
+
@id forward_input
|
9
|
+
</source>
|
10
|
+
|
11
|
+
## built-in UNIX socket input
|
12
|
+
#<source>
|
13
|
+
# @type unix
|
14
|
+
#</source>
|
15
|
+
|
16
|
+
# HTTP input
|
17
|
+
# http://localhost:8888/<tag>?json=<json>
|
18
|
+
<source>
|
19
|
+
@type http
|
20
|
+
@id http_input
|
21
|
+
|
22
|
+
port 8888
|
23
|
+
</source>
|
24
|
+
|
25
|
+
<source>
|
26
|
+
@type viki
|
27
|
+
@id http_viki_input
|
28
|
+
port 8889
|
29
|
+
</source>
|
30
|
+
|
31
|
+
## File input
|
32
|
+
## read apache logs with tag=apache.access
|
33
|
+
#<source>
|
34
|
+
# @type tail
|
35
|
+
# format apache
|
36
|
+
# path /var/log/httpd-access.log
|
37
|
+
# tag apache.access
|
38
|
+
#</source>
|
39
|
+
|
40
|
+
# Listen HTTP for monitoring
|
41
|
+
# http://localhost:24220/api/plugins
|
42
|
+
# http://localhost:24220/api/plugins?type=TYPE
|
43
|
+
# http://localhost:24220/api/plugins?tag=MYTAG
|
44
|
+
<source>
|
45
|
+
@type monitor_agent
|
46
|
+
@id monitor_agent_input
|
47
|
+
|
48
|
+
port 24220
|
49
|
+
</source>
|
50
|
+
|
51
|
+
# Listen DRb for debug
|
52
|
+
<source>
|
53
|
+
@type debug_agent
|
54
|
+
@id debug_agent_input
|
55
|
+
|
56
|
+
bind 127.0.0.1
|
57
|
+
port 24230
|
58
|
+
</source>
|
59
|
+
|
60
|
+
## match tag=apache.access and write to file
|
61
|
+
#<match apache.access>
|
62
|
+
# @type file
|
63
|
+
# path /var/log/fluent/access
|
64
|
+
#</match>
|
65
|
+
|
66
|
+
## match tag=debug.** and dump to console
|
67
|
+
<match debug.**>
|
68
|
+
@type stdout
|
69
|
+
@id stdout_output
|
70
|
+
</match>
|
71
|
+
|
72
|
+
# match tag=system.** and forward to another fluent server
|
73
|
+
<match system.**>
|
74
|
+
@type forward
|
75
|
+
@id forward_output
|
76
|
+
|
77
|
+
<server>
|
78
|
+
host 192.168.0.11
|
79
|
+
</server>
|
80
|
+
<secondary>
|
81
|
+
<server>
|
82
|
+
host 192.168.0.12
|
83
|
+
</server>
|
84
|
+
</secondary>
|
85
|
+
</match>
|
86
|
+
|
87
|
+
## match tag=myapp.** and forward and write to file
|
88
|
+
#<match myapp.**>
|
89
|
+
# @type copy
|
90
|
+
# <store>
|
91
|
+
# @type forward
|
92
|
+
# buffer_type file
|
93
|
+
# buffer_path /var/log/fluent/myapp-forward
|
94
|
+
# retry_limit 50
|
95
|
+
# flush_interval 10s
|
96
|
+
# <server>
|
97
|
+
# host 192.168.0.13
|
98
|
+
# </server>
|
99
|
+
# </store>
|
100
|
+
# <store>
|
101
|
+
# @type file
|
102
|
+
# path /var/log/fluent/myapp
|
103
|
+
# </store>
|
104
|
+
#</match>
|
105
|
+
|
106
|
+
## match fluent's internal events
|
107
|
+
#<match fluent.**>
|
108
|
+
# @type null
|
109
|
+
#</match>
|
110
|
+
|
111
|
+
## match not matched logs and write to file
|
112
|
+
#<match **>
|
113
|
+
# @type file
|
114
|
+
# path /var/log/fluent/else
|
115
|
+
# compress gz
|
116
|
+
#</match>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'fluent/plugin/viki/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "fluent-plugin-viki"
|
8
|
+
spec.version = Fluent::Viki::VERSION
|
9
|
+
spec.authors = ["Zhe Wang"]
|
10
|
+
spec.email = ["zh3w4ng@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Viki's custom fluentd input plugin.}
|
13
|
+
spec.description = %q{Viki's custom fluentd input plugin.}
|
14
|
+
spec.homepage = "https://github.com/viki-org/fluent-plugin-viki"
|
15
|
+
|
16
|
+
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
17
|
+
# delete this section to allow pushing this gem to any host.
|
18
|
+
if spec.respond_to?(:metadata)
|
19
|
+
spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
|
20
|
+
else
|
21
|
+
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
22
|
+
end
|
23
|
+
|
24
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
25
|
+
spec.bindir = "exe"
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
|
+
spec.require_paths = ["lib"]
|
28
|
+
|
29
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
30
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
31
|
+
spec.add_development_dependency "rspec", "~> 3.3"
|
32
|
+
spec.add_development_dependency "byebug"
|
33
|
+
spec.add_development_dependency "timecop"
|
34
|
+
|
35
|
+
spec.add_dependency "maxminddb", "~> 0.1"
|
36
|
+
spec.add_dependency "fluentd", "~> 0.12", "< 0.13"
|
37
|
+
|
38
|
+
spec.license = 'Apache-2.0'
|
39
|
+
end
|
data/fluentd.conf
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
<source>
|
2
|
+
type viki
|
3
|
+
port 80
|
4
|
+
respond_with_empty_img true
|
5
|
+
default_tag viki.development.untagged
|
6
|
+
</source>
|
7
|
+
|
8
|
+
<match **.health_check.**>
|
9
|
+
type null
|
10
|
+
</match>
|
11
|
+
|
12
|
+
<match **.{development,staging}.**>
|
13
|
+
type copy
|
14
|
+
<store>
|
15
|
+
type stdout
|
16
|
+
</store>
|
17
|
+
<store>
|
18
|
+
type forward
|
19
|
+
<server>
|
20
|
+
host $BROADCASTER_HOST
|
21
|
+
port $BROADCASTER_PORT1
|
22
|
+
weight 100
|
23
|
+
</server>
|
24
|
+
<server>
|
25
|
+
host $BROADCASTER_HOST
|
26
|
+
port $BROADCASTER_PORT2
|
27
|
+
weight 100
|
28
|
+
</server>
|
29
|
+
flush_interval 10s
|
30
|
+
buffer_type file
|
31
|
+
buffer_path /var/log/td-agent/buffer/forward/dev/forward.*.buffer
|
32
|
+
</store>
|
33
|
+
</match>
|
34
|
+
|
35
|
+
<match **.production.**>
|
36
|
+
type forward
|
37
|
+
<server>
|
38
|
+
host $BROADCASTER_HOST
|
39
|
+
port $BROADCASTER_PORT1
|
40
|
+
weight 100
|
41
|
+
</server>
|
42
|
+
<server>
|
43
|
+
host $BROADCASTER_HOST
|
44
|
+
port $BROADCASTER_PORT2
|
45
|
+
weight 100
|
46
|
+
</server>
|
47
|
+
flush_interval 5s
|
48
|
+
buffer_chunk_limit 4m
|
49
|
+
buffer_queue_limit 512
|
50
|
+
|
51
|
+
buffer_type file
|
52
|
+
buffer_path /var/log/td-agent/buffer/forward/prod/forward.*.buffer
|
53
|
+
</match>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Fluent
|
2
|
+
module Geoip
|
3
|
+
def country_code_of_ip(ip)
|
4
|
+
iso_code = global_geoip.lookup(ip).country.iso_code
|
5
|
+
iso_code && iso_code.downcase
|
6
|
+
end
|
7
|
+
|
8
|
+
def city_of_ip(ip)
|
9
|
+
city = global_geoip.lookup(ip)
|
10
|
+
record = {}
|
11
|
+
record['dma_code'] = city.location.metro_code
|
12
|
+
record['city_name'] = city.city && city.city.name
|
13
|
+
record['latitude'] = city.location.latitude.to_s
|
14
|
+
record['longitude'] = city.location.longitude.to_s
|
15
|
+
record['postal_code'] = city.postal.code
|
16
|
+
record['region_name'] = city.subdivisions.first && city.subdivisions.first.iso_code
|
17
|
+
record
|
18
|
+
end
|
19
|
+
|
20
|
+
def global_geoip
|
21
|
+
@@global_geoip ||= ::MaxMindDB.new(geoip_db_path)
|
22
|
+
end
|
23
|
+
|
24
|
+
def geoip_db_path
|
25
|
+
'/usr/local/var/GeoIP/GeoIP2-City.mmdb'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
Bundler.require(:default)
|
4
|
+
require 'fluent/plugin/in_http'
|
5
|
+
require 'fluent/plugin/geoip'
|
6
|
+
require "fluent/plugin/viki/version"
|
7
|
+
|
8
|
+
module Fluent
|
9
|
+
class HttpVikiInput < HttpInput
|
10
|
+
include Geoip
|
11
|
+
CROSSDOMAIN_XML = <<EOF
|
12
|
+
<?xml version="1.0"?>
|
13
|
+
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
|
14
|
+
<cross-domain-policy>
|
15
|
+
<allow-access-from domain="*" />
|
16
|
+
</cross-domain-policy>
|
17
|
+
EOF
|
18
|
+
|
19
|
+
Plugin.register_input('viki', self)
|
20
|
+
|
21
|
+
config_param :respond_with_empty_img, :bool, :default => 'true'
|
22
|
+
config_param :default_tag, :default => ''
|
23
|
+
|
24
|
+
def on_request(path_info, params)
|
25
|
+
return_hash = nil
|
26
|
+
|
27
|
+
begin
|
28
|
+
tag = path_info[1..-1].split('/').join('.')
|
29
|
+
return return_200_crossdomain unless tag.downcase.match("crossdomain.xml").nil?
|
30
|
+
tag = @default_tag if tag == '' && @default_tag != ''
|
31
|
+
|
32
|
+
record = params.dup
|
33
|
+
|
34
|
+
time = if record['t_f']
|
35
|
+
t_f = record['t_f']
|
36
|
+
record.delete('t_f')
|
37
|
+
t_f.to_i
|
38
|
+
else
|
39
|
+
Engine.now
|
40
|
+
end
|
41
|
+
|
42
|
+
record['t'] = time.to_s unless record['t']
|
43
|
+
|
44
|
+
set_record_ip(params, record)
|
45
|
+
set_record_domain(record)
|
46
|
+
|
47
|
+
record['uuid'] = record.delete('viki_uuid') if record['viki_uuid']
|
48
|
+
record['content_provider'] = record.delete('type') if record['type']
|
49
|
+
record['device_id'] = record.delete('dev_model') if record['dev_model']
|
50
|
+
record.each { |k, v| record[k] = '' if v == 'null' }
|
51
|
+
|
52
|
+
# generate a unique event id for each event
|
53
|
+
unless record['mid']
|
54
|
+
record['mid'] = params['HTTP_X_REQUEST_ID'] || gen_message_id(time)
|
55
|
+
end
|
56
|
+
|
57
|
+
# rename video_view to minute_view
|
58
|
+
record['event'] = 'minute_view' if record['event'] == 'video_view'
|
59
|
+
|
60
|
+
# rename bottom_subtitle to subtitle_lang, add subtitle_enabled
|
61
|
+
if %w(video_play minute_view).include?(record['event'])
|
62
|
+
update_subtitles(record)
|
63
|
+
end
|
64
|
+
|
65
|
+
# fix xunlei data sending timestamps
|
66
|
+
if record['app_id'] == '100105a'
|
67
|
+
record.delete_if {|key, _| !!(key =~ /\A[0-9]+{13}\z/) }
|
68
|
+
end
|
69
|
+
|
70
|
+
rescue
|
71
|
+
return return_400
|
72
|
+
end
|
73
|
+
|
74
|
+
begin
|
75
|
+
Engine.emit(tag, time, record)
|
76
|
+
rescue
|
77
|
+
return return_505
|
78
|
+
end
|
79
|
+
|
80
|
+
return_200(return_hash)
|
81
|
+
end
|
82
|
+
|
83
|
+
def update_subtitles(record)
|
84
|
+
record['subtitle_lang'] = record.delete('bottom_subtitle') if record['bottom_subtitle'] and record['subtitle_lang'].nil?
|
85
|
+
|
86
|
+
if record['subtitle_visible'].nil?
|
87
|
+
record['subtitle_visible'] = record['subtitle_lang'] && record['subtitle_lang'].size > 0
|
88
|
+
end
|
89
|
+
|
90
|
+
# manual subtitle set to Chinese for xunlei and letv
|
91
|
+
if %w(100106a 100105a).include?(record['app_id'])
|
92
|
+
record['subtitle_enabled'] = true
|
93
|
+
record['subtitle_lang'] = 'zh'
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def remove_exceptions_from_hash(attr_hash, app_id)
|
98
|
+
app_hash = { '100004a' => 'ios', '100005a' => 'android', '65535a' => 'flash', '100017a' => 'android', '100016a' => 'mweb', '100018a' => 'xbox' }
|
99
|
+
source = app_hash[app_id]
|
100
|
+
|
101
|
+
if source.nil?
|
102
|
+
puts "Warning: Could not identify source with app_id: "+app_id
|
103
|
+
return nil
|
104
|
+
end
|
105
|
+
|
106
|
+
attr_hash.each { |k, v|
|
107
|
+
if v.any? && v.include?(source)
|
108
|
+
attr_hash.delete(k)
|
109
|
+
end
|
110
|
+
}
|
111
|
+
attr_hash.keys
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
def set_record_domain(record)
|
116
|
+
site = record['site']
|
117
|
+
record['domain'] = site.gsub(/^https?:\/\//, '').gsub(/([^\/]*)(.*)/, '\1').gsub(/^www\./, '') if site
|
118
|
+
end
|
119
|
+
|
120
|
+
def set_record_ip(params, record)
|
121
|
+
record['ip'] ||= params['HTTP_X_FORWARDED_FOR'] || params['REMOTE_ADDR']
|
122
|
+
ips = unless record['ip'].nil?
|
123
|
+
if record['ip'].kind_of? String
|
124
|
+
record['ip'].gsub(' ', ',').split(',')
|
125
|
+
elsif record['ip'].kind_of? Array
|
126
|
+
record['ip']
|
127
|
+
.map {|e| e.split(",").map(&:strip) }
|
128
|
+
.inject([]) {|accum, e| accum + e}
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
record['country'] = record.delete('country_code') if record['country_code']
|
133
|
+
|
134
|
+
valid_ip, geo_country = resolve_correct_ip(ips)
|
135
|
+
|
136
|
+
record['ip_raw'], record['ip'] = record['ip'], valid_ip
|
137
|
+
record['country'] = geo_country || record['country']
|
138
|
+
|
139
|
+
record.merge! city_of_ip(valid_ip)
|
140
|
+
end
|
141
|
+
|
142
|
+
def resolve_correct_ip(ips)
|
143
|
+
ips.each do |ip|
|
144
|
+
geo_country = country_code_of_ip(ip)
|
145
|
+
|
146
|
+
return [ip, geo_country] unless geo_country.nil?
|
147
|
+
end unless ips.nil?
|
148
|
+
|
149
|
+
[ips.first, nil]
|
150
|
+
end
|
151
|
+
|
152
|
+
def return_505
|
153
|
+
["500 Internal Server Error", { 'Content-type' => 'text/plain' }, "500 Internal Server Error\n#{$!}\n"]
|
154
|
+
end
|
155
|
+
|
156
|
+
def return_400
|
157
|
+
["400 Bad Request", { 'Content-type' => 'text/plain' }, "400 Bad Request\n#{$!}\n"]
|
158
|
+
end
|
159
|
+
|
160
|
+
def return_200 json_hash
|
161
|
+
if json_hash
|
162
|
+
["200 OK", { 'Content-type' => 'application/json' }, json_hash.to_json]
|
163
|
+
else
|
164
|
+
if @respond_with_empty_img
|
165
|
+
["200 OK", { 'Content-type' => 'image/gif', 'Access-Control-Allow-Origin' => '*' }, "GIF89a\u0001\u0000\u0001\u0000\x80\xFF\u0000\xFF\xFF\xFF\u0000\u0000\u0000,\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0002\u0002D\u0001\u0000;"]
|
166
|
+
else
|
167
|
+
["200 OK", { 'Content-type' => 'text/plain', 'Access-Control-Allow-Origin' => '*' }, ""]
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def return_200_crossdomain
|
173
|
+
["200 OK", { 'Content-type' => 'text/xml', 'Access-Control-Allow-Origin' => '*', 'Cache-Control' => 'public; max-age=36000' }, CROSSDOMAIN_XML]
|
174
|
+
end
|
175
|
+
|
176
|
+
# Generate a unique id for the event, length: 10+1+5 = 16
|
177
|
+
# It's relatively sortable
|
178
|
+
def gen_message_id time
|
179
|
+
r = rand(36**5).to_s(36)
|
180
|
+
"#{time.to_s}-#{r}"
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
184
|
+
end
|
metadata
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-viki
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Zhe Wang
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-02-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.11'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: byebug
|
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
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: timecop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: maxminddb
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.1'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.1'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: fluentd
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.12'
|
104
|
+
- - <
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0.13'
|
107
|
+
type: :runtime
|
108
|
+
prerelease: false
|
109
|
+
version_requirements: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ~>
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0.12'
|
114
|
+
- - <
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0.13'
|
117
|
+
description: Viki's custom fluentd input plugin.
|
118
|
+
email:
|
119
|
+
- zh3w4ng@gmail.com
|
120
|
+
executables: []
|
121
|
+
extensions: []
|
122
|
+
extra_rdoc_files: []
|
123
|
+
files:
|
124
|
+
- .gitignore
|
125
|
+
- .rspec
|
126
|
+
- .travis.yml
|
127
|
+
- Gemfile
|
128
|
+
- README.md
|
129
|
+
- Rakefile
|
130
|
+
- bin/console
|
131
|
+
- bin/setup
|
132
|
+
- config/fluent.conf
|
133
|
+
- fluent-plugin-viki.gemspec
|
134
|
+
- fluentd.conf
|
135
|
+
- lib/fluent/plugin/geoip.rb
|
136
|
+
- lib/fluent/plugin/viki.rb
|
137
|
+
- lib/fluent/plugin/viki/version.rb
|
138
|
+
homepage: https://github.com/viki-org/fluent-plugin-viki
|
139
|
+
licenses:
|
140
|
+
- Apache-2.0
|
141
|
+
metadata:
|
142
|
+
allowed_push_host: 'TODO: Set to ''http://mygemserver.com'''
|
143
|
+
post_install_message:
|
144
|
+
rdoc_options: []
|
145
|
+
require_paths:
|
146
|
+
- lib
|
147
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - '>='
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - '>='
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
157
|
+
requirements: []
|
158
|
+
rubyforge_project:
|
159
|
+
rubygems_version: 2.0.14
|
160
|
+
signing_key:
|
161
|
+
specification_version: 4
|
162
|
+
summary: Viki's custom fluentd input plugin.
|
163
|
+
test_files: []
|