fluent-plugin-viki 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|