fluent-plugin-mixpanel 0.0.2 → 0.0.3
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/README.md +1 -2
- data/example/in_http_mixpanel.conf +0 -1
- data/fluent-plugin-mixpanel.gemspec +3 -3
- data/lib/fluent/plugin/in_http_mixpanel.rb +5 -5
- data/lib/fluent/plugin/out_mixpanel.rb +7 -0
- data/test/plugin/test_in_http_mixpanel.rb +4 -6
- data/test/plugin/test_out_mixpanel.rb +24 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9406e78fac736d2fd7b8b6b4dfa4645f741170db
|
4
|
+
data.tar.gz: 43835b93670babcdfe3d6cf184b6b65413507315
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9aa1ecf98277f977a110929ea16356265fc02f858253fcf100f0f5c6f569e65766fce3f20809b0c72286971becb16fae7aa113529774ed5b166f7264898731c4
|
7
|
+
data.tar.gz: 33c231f32a0eed37ff3225ad41f93dfbb72c6e9383e7afb419fc76c037692e1ce3ad8de3f234aaef89480291b4d3a62224247ff0b69525d98bef6717708bd7f9
|
data/README.md
CHANGED
@@ -55,7 +55,7 @@ tracker.track("123", "event1", { key1: "value1", key2: "value2" })
|
|
55
55
|
|
56
56
|
### HttpMixpanelInput
|
57
57
|
|
58
|
-
HttpMixpanelInput
|
58
|
+
HttpMixpanelInput has same configuration as [http Input Plugin](http://docs.fluentd.org/en/articles/in_http).
|
59
59
|
|
60
60
|
```
|
61
61
|
<source>
|
@@ -65,7 +65,6 @@ HttpMixpanelInput is very similar to [http Input Plugin](http://docs.fluentd.org
|
|
65
65
|
body_size_limit 10m
|
66
66
|
keepalive_timeout 5
|
67
67
|
add_http_headers true
|
68
|
-
access_control_allow_origin http://0.0.0.0:8000
|
69
68
|
</source>
|
70
69
|
```
|
71
70
|
|
@@ -4,11 +4,11 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "fluent-plugin-mixpanel"
|
7
|
-
spec.version = "0.0.
|
7
|
+
spec.version = "0.0.3"
|
8
8
|
spec.authors = ["Kazuyuki Honda"]
|
9
9
|
spec.email = ["hakobera@gmail.com"]
|
10
|
-
spec.summary = %q{Fluentd plugin to
|
11
|
-
spec.description = %q{Fluentd plugin to
|
10
|
+
spec.summary = %q{Fluentd plugin to input/output event track data to mixpanel}
|
11
|
+
spec.description = %q{Fluentd plugin to input/output event track data to mixpanel}
|
12
12
|
spec.homepage = "https://github.com/hakobera/fluent-plugin-mixpanel"
|
13
13
|
spec.license = "Apache License, Version 2.0"
|
14
14
|
|
@@ -4,15 +4,15 @@ require 'base64'
|
|
4
4
|
class Fluent::HttpMixpanelInput < Fluent::HttpInput
|
5
5
|
Fluent::Plugin.register_input('http_mixpanel', self)
|
6
6
|
|
7
|
-
config_param :access_control_allow_origin
|
8
7
|
config_param :tag_prefix, :default => 'mixpanel'
|
9
8
|
|
10
9
|
def on_request(path_info, params)
|
11
10
|
data = Base64.decode64(params['data']).force_encoding('utf-8')
|
12
11
|
json = JSON.parse(data)
|
12
|
+
props = json['properties']
|
13
13
|
path = "/#{tag_prefix}.#{json['event']}"
|
14
|
-
params['json'] =
|
15
|
-
params['time'] =
|
14
|
+
params['json'] = props.to_json
|
15
|
+
params['time'] = props['time'].to_s if props['time']
|
16
16
|
|
17
17
|
ret = super(path, params)
|
18
18
|
|
@@ -20,12 +20,12 @@ class Fluent::HttpMixpanelInput < Fluent::HttpInput
|
|
20
20
|
'Access-Control-Allow-Credentials' => true,
|
21
21
|
'Access-Control-Allow-Headers' => 'X-Requested-With',
|
22
22
|
'Access-Control-Allow-Methods' => 'GET, POST, OPTIONS',
|
23
|
-
'Access-Control-Allow-Origin' =>
|
23
|
+
'Access-Control-Allow-Origin' => params['HTTP_ORIGIN'],
|
24
24
|
'Access-Control-Max-Age' => 1728000,
|
25
25
|
'Cache-Control' => 'no-cache, no-store',
|
26
26
|
'Content-type' => 'text/plain'
|
27
27
|
}
|
28
28
|
|
29
|
-
[ret[0], headers, (ret[0] == 200 ?
|
29
|
+
[ret[0], headers, (ret[0] == '200 OK' ? '0' : '1')]
|
30
30
|
end
|
31
31
|
end
|
@@ -4,6 +4,7 @@ class Fluent::MixpanelOutput < Fluent::BufferedOutput
|
|
4
4
|
config_param :project_token, :string
|
5
5
|
config_param :distinct_id_key, :string
|
6
6
|
config_param :event_key, :string
|
7
|
+
config_param :ip_key, :string, :default => nil
|
7
8
|
|
8
9
|
def initialize
|
9
10
|
super
|
@@ -15,6 +16,7 @@ class Fluent::MixpanelOutput < Fluent::BufferedOutput
|
|
15
16
|
@project_tokey = conf['project_token']
|
16
17
|
@distinct_id_key = conf['distinct_id_key']
|
17
18
|
@event_key = conf['event_key']
|
19
|
+
@ip_key = conf['ip_key']
|
18
20
|
|
19
21
|
if @project_token.empty?
|
20
22
|
raise Fluent::ConfigError, "'project_token' must be specifed."
|
@@ -63,6 +65,11 @@ class Fluent::MixpanelOutput < Fluent::BufferedOutput
|
|
63
65
|
return
|
64
66
|
end
|
65
67
|
|
68
|
+
if !@ip_key.nil? and record[@ip_key]
|
69
|
+
record['ip'] = record[@ip_key]
|
70
|
+
record.delete(@ip_key)
|
71
|
+
end
|
72
|
+
|
66
73
|
record.merge!(time: time.to_i)
|
67
74
|
data['properties'] = record
|
68
75
|
|
@@ -14,7 +14,6 @@ class HttpMixpanelInputTest < Test::Unit::TestCase
|
|
14
14
|
bind 127.0.0.1
|
15
15
|
body_size_limit 10m
|
16
16
|
keepalive_timeout 5
|
17
|
-
access_control_allow_origin http://foo.example
|
18
17
|
]
|
19
18
|
|
20
19
|
def create_driver(conf=CONFIG)
|
@@ -28,7 +27,6 @@ class HttpMixpanelInputTest < Test::Unit::TestCase
|
|
28
27
|
assert_equal 10*1024*1024, d.instance.body_size_limit
|
29
28
|
assert_equal 5, d.instance.keepalive_timeout
|
30
29
|
assert_equal false, d.instance.add_http_headers
|
31
|
-
assert_equal 'http://foo.example', d.instance.access_control_allow_origin
|
32
30
|
end
|
33
31
|
|
34
32
|
def test_time
|
@@ -44,10 +42,11 @@ class HttpMixpanelInputTest < Test::Unit::TestCase
|
|
44
42
|
d.expected_emits.each {|tag,time,record|
|
45
43
|
res = track("#{tag}", {"json"=>record})
|
46
44
|
assert_equal "200", res.code
|
45
|
+
assert_equal '0', res.body
|
47
46
|
assert_equal 'true', res.header['access-control-allow-credentials']
|
48
47
|
assert_equal 'X-Requested-With', res.header['access-control-allow-headers']
|
49
48
|
assert_equal 'GET, POST, OPTIONS', res.header['access-control-allow-methods']
|
50
|
-
assert_equal
|
49
|
+
assert_equal 'http://foo.example', res.header['access-control-allow-origin']
|
51
50
|
assert_equal '1728000', res.header['access-control-max-age']
|
52
51
|
assert_equal 'no-cache, no-store', res.header['cache-control']
|
53
52
|
}
|
@@ -95,18 +94,17 @@ class HttpMixpanelInputTest < Test::Unit::TestCase
|
|
95
94
|
|
96
95
|
def track(tag, params)
|
97
96
|
event = tag.sub(/^mixpanel\.(.+)$/, '\1')
|
97
|
+
params['json']['time'] = params['time'] if params['time']
|
98
98
|
data = {
|
99
99
|
event: event,
|
100
100
|
properties: params['json']
|
101
101
|
}
|
102
102
|
data = URI.escape(Base64.encode64(data.to_json))
|
103
103
|
query = "data=#{data}"
|
104
|
-
query += "&ip=1"
|
105
|
-
query += "&_=#{params['time']}000" if params['time']
|
106
104
|
path = "/track/?#{query}"
|
107
105
|
|
108
106
|
http = Net::HTTP.new("127.0.0.1", PORT)
|
109
|
-
req = Net::HTTP::Get.new(path)
|
107
|
+
req = Net::HTTP::Get.new(path, { 'origin' => 'http://foo.example' })
|
110
108
|
http.request(req)
|
111
109
|
end
|
112
110
|
|
@@ -41,6 +41,15 @@ class MixpanelOutputTest < Test::Unit::TestCase
|
|
41
41
|
assert_equal 'event', d.instance.event_key
|
42
42
|
end
|
43
43
|
|
44
|
+
def test_configure_with_ip_key
|
45
|
+
d = create_driver(CONFIG + 'ip_key ip')
|
46
|
+
|
47
|
+
assert_equal 'test_token', d.instance.project_token
|
48
|
+
assert_equal 'user_id', d.instance.distinct_id_key
|
49
|
+
assert_equal 'event', d.instance.event_key
|
50
|
+
assert_equal 'ip', d.instance.ip_key
|
51
|
+
end
|
52
|
+
|
44
53
|
def test_write
|
45
54
|
stub_mixpanel
|
46
55
|
d = create_driver
|
@@ -79,6 +88,21 @@ class MixpanelOutputTest < Test::Unit::TestCase
|
|
79
88
|
assert_equal "value2", @out[1]['properties']['key2']
|
80
89
|
end
|
81
90
|
|
91
|
+
def test_write_with_ip_key
|
92
|
+
stub_mixpanel
|
93
|
+
d = create_driver(CONFIG + 'ip_key ip_address')
|
94
|
+
time = Time.new('2014-01-01T01:23:45+00:00')
|
95
|
+
d.emit(sample_record.merge('ip_address' => '192.168.0.2'), time)
|
96
|
+
d.run
|
97
|
+
|
98
|
+
assert_equal "123", @out[0]['properties']['distinct_id']
|
99
|
+
assert_equal "event1", @out[0]['event']
|
100
|
+
assert_equal time.to_i, @out[0]['properties']['time']
|
101
|
+
assert_equal "192.168.0.2", @out[0]['properties']['ip']
|
102
|
+
assert_equal "value1", @out[0]['properties']['key1']
|
103
|
+
assert_equal "value2", @out[0]['properties']['key2']
|
104
|
+
end
|
105
|
+
|
82
106
|
def test_request_error
|
83
107
|
stub_mixpanel_unavailable
|
84
108
|
d = create_driver
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-mixpanel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kazuyuki Honda
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
description: Fluentd plugin to
|
69
|
+
description: Fluentd plugin to input/output event track data to mixpanel
|
70
70
|
email:
|
71
71
|
- hakobera@gmail.com
|
72
72
|
executables: []
|
@@ -111,7 +111,7 @@ rubyforge_project:
|
|
111
111
|
rubygems_version: 2.2.0
|
112
112
|
signing_key:
|
113
113
|
specification_version: 4
|
114
|
-
summary: Fluentd plugin to
|
114
|
+
summary: Fluentd plugin to input/output event track data to mixpanel
|
115
115
|
test_files:
|
116
116
|
- test/helper.rb
|
117
117
|
- test/plugin/test_in_http_mixpanel.rb
|