fluent-plugin-mixpanel 0.0.3 → 0.0.4
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 +30 -0
- data/example/index.html +1 -1
- data/fluent-plugin-mixpanel.gemspec +1 -1
- data/lib/fluent/plugin/out_mixpanel.rb +11 -12
- data/test/plugin/test_out_mixpanel.rb +45 -8
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d484a01b3b20513d87cef2561d3472e2cf4447b1
|
4
|
+
data.tar.gz: 56622c0ebdfc8cfb822e542cecd31516ffec9079
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a5c41e85c1d43fdd6ec3b2ecde7425fc210e1bb6c980a4ecb8967c96a97aeaa4617cdc6bcc7f384ccc015d3281bb8bb7a05df797c3f1beb65b65644b2000ef5
|
7
|
+
data.tar.gz: 5cbbe5f96c417112b3b80ae6006767664865758922de36b9ac4f4df197bab68145be69d5b79fa965ea69c3345cf120551ae7fde7d33f07f0c5386ebfc0f7d5bf
|
data/README.md
CHANGED
@@ -29,6 +29,9 @@ $ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-mixpanel
|
|
29
29
|
### MixpanelOutput
|
30
30
|
|
31
31
|
MixpanelOutput needs mixpanel's `project_token`, that can get from your mixpanel project settings.
|
32
|
+
|
33
|
+
#### Use distinct_id_key and event_key
|
34
|
+
|
32
35
|
You should also specify property key name by `distinct_id_key` and `event_key`.
|
33
36
|
|
34
37
|
```
|
@@ -53,6 +56,33 @@ tracker = Mixpanel::Tracker.new(YOUR_PROJECT_TOKEN)
|
|
53
56
|
tracker.track("123", "event1", { key1: "value1", key2: "value2" })
|
54
57
|
```
|
55
58
|
|
59
|
+
#### Use distinct_id_key and event_map_tag
|
60
|
+
|
61
|
+
You can use tag name as event name like this.
|
62
|
+
|
63
|
+
```
|
64
|
+
<match output.mixpanel.*>
|
65
|
+
type mixpanel
|
66
|
+
project_token YOUR_PROJECT_TOKEN
|
67
|
+
distinct_id_key user_id
|
68
|
+
remove_tag_prefix output.mixpanel
|
69
|
+
event_map_tag true
|
70
|
+
</match>
|
71
|
+
```
|
72
|
+
|
73
|
+
If tag name is `output.mixpanel.event1` and record like this:
|
74
|
+
|
75
|
+
```rb
|
76
|
+
{ user_id: "123", key1: "value1", key2: "value2" }
|
77
|
+
```
|
78
|
+
|
79
|
+
above settings send to the following data to mixpanel, using [mixpanel-ruby](https://github.com/mixpanel/mixpanel-ruby) gem.
|
80
|
+
|
81
|
+
```rb
|
82
|
+
tracker = Mixpanel::Tracker.new(YOUR_PROJECT_TOKEN)
|
83
|
+
tracker.track("123", "event1", { key1: "value1", key2: "value2" })
|
84
|
+
```
|
85
|
+
|
56
86
|
### HttpMixpanelInput
|
57
87
|
|
58
88
|
HttpMixpanelInput has same configuration as [http Input Plugin](http://docs.fluentd.org/en/articles/in_http).
|
data/example/index.html
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
(function(c,a){window.mixpanel=a;var b,d,h,e;b=c.createElement("script");
|
15
15
|
b.type="text/javascript";b.async=!0;b.src=("https:"===c.location.protocol?"https:":"http:")+'//cdn.mxpnl.com/libs/mixpanel-2.2.min.js';d=c.getElementsByTagName("script")[0];d.parentNode.insertBefore(b,d);a._i=[];a.init=function(b,c,f){function d(a,b){var c=b.split(".");2==c.length&&(a=a[c[0]],b=c[1]);a[b]=function(){a.push([b].concat(Array.prototype.slice.call(arguments,0)))}}var g=a;"undefined"!==typeof f?g=a[f]=[]:f="mixpanel";g.people=g.people||[];h=['disable','track','track_pageview','track_links','track_forms','register','register_once','unregister','identify','alias','name_tag','set_config','people.set','people.set_once','people.increment','people.track_charge','people.append'];for(e=0;e<h.length;e++)d(g,h[e]);a._i.push([b,c,f])};a.__SV=1.2;})(document,window.mixpanel||[]);
|
16
16
|
mixpanel.init("dummy", {
|
17
|
-
api_host: '
|
17
|
+
api_host: '//0.0.0.0:5000',
|
18
18
|
debug: true
|
19
19
|
});
|
20
20
|
</script>
|
@@ -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-mixpanel"
|
7
|
-
spec.version = "0.0.
|
7
|
+
spec.version = "0.0.4"
|
8
8
|
spec.authors = ["Kazuyuki Honda"]
|
9
9
|
spec.email = ["hakobera@gmail.com"]
|
10
10
|
spec.summary = %q{Fluentd plugin to input/output event track data to mixpanel}
|
@@ -3,9 +3,12 @@ class Fluent::MixpanelOutput < Fluent::BufferedOutput
|
|
3
3
|
|
4
4
|
config_param :project_token, :string
|
5
5
|
config_param :distinct_id_key, :string
|
6
|
-
config_param :event_key, :string
|
6
|
+
config_param :event_key, :string, :default => nil
|
7
7
|
config_param :ip_key, :string, :default => nil
|
8
8
|
|
9
|
+
config_param :remove_tag_prefix, :string, :default => nil
|
10
|
+
config_param :event_map_tag, :bool, :default => false
|
11
|
+
|
9
12
|
def initialize
|
10
13
|
super
|
11
14
|
require 'mixpanel-ruby'
|
@@ -17,17 +20,11 @@ class Fluent::MixpanelOutput < Fluent::BufferedOutput
|
|
17
20
|
@distinct_id_key = conf['distinct_id_key']
|
18
21
|
@event_key = conf['event_key']
|
19
22
|
@ip_key = conf['ip_key']
|
23
|
+
@remove_tag_prefix = conf['remove_tag_prefix']
|
24
|
+
@event_map_tag = conf['event_map_tag']
|
20
25
|
|
21
|
-
if @
|
22
|
-
raise Fluent::ConfigError, "'
|
23
|
-
end
|
24
|
-
|
25
|
-
if @distinct_id_key.empty?
|
26
|
-
raise Fluent::ConfigError, "'distinct_id_key' must be specifed."
|
27
|
-
end
|
28
|
-
|
29
|
-
if @event_key.empty?
|
30
|
-
raise Fluent::ConfigError, "'event_key' must be specifed."
|
26
|
+
if @event_key.nil? and !@event_map_tag
|
27
|
+
raise Fluent::ConfigError, "'event_key' must be specifed when event_map_tag == false."
|
31
28
|
end
|
32
29
|
end
|
33
30
|
|
@@ -57,7 +54,9 @@ class Fluent::MixpanelOutput < Fluent::BufferedOutput
|
|
57
54
|
return
|
58
55
|
end
|
59
56
|
|
60
|
-
if
|
57
|
+
if @event_map_tag
|
58
|
+
data['event'] = tag.gsub(/^#{@remove_tag_prefix}(\.)?/, '')
|
59
|
+
elsif record[@event_key]
|
61
60
|
data['event'] = record[@event_key]
|
62
61
|
record.delete(@event_key)
|
63
62
|
else
|
@@ -11,11 +11,10 @@ class MixpanelOutputTest < Test::Unit::TestCase
|
|
11
11
|
CONFIG = %[
|
12
12
|
project_token test_token
|
13
13
|
distinct_id_key user_id
|
14
|
-
event_key event
|
15
14
|
]
|
16
15
|
|
17
16
|
def create_driver(conf = CONFIG)
|
18
|
-
Fluent::Test::BufferedOutputTestDriver.new(Fluent::MixpanelOutput).configure(conf)
|
17
|
+
Fluent::Test::BufferedOutputTestDriver.new(Fluent::MixpanelOutput, 'mixpanel.test').configure(conf)
|
19
18
|
end
|
20
19
|
|
21
20
|
def stub_mixpanel(url="https://api.mixpanel.com/track")
|
@@ -34,7 +33,7 @@ class MixpanelOutputTest < Test::Unit::TestCase
|
|
34
33
|
end
|
35
34
|
|
36
35
|
def test_configure
|
37
|
-
d = create_driver
|
36
|
+
d = create_driver(CONFIG + "event_key event")
|
38
37
|
|
39
38
|
assert_equal 'test_token', d.instance.project_token
|
40
39
|
assert_equal 'user_id', d.instance.distinct_id_key
|
@@ -42,7 +41,7 @@ class MixpanelOutputTest < Test::Unit::TestCase
|
|
42
41
|
end
|
43
42
|
|
44
43
|
def test_configure_with_ip_key
|
45
|
-
d = create_driver(CONFIG +
|
44
|
+
d = create_driver(CONFIG + "event_key event\n ip_key ip")
|
46
45
|
|
47
46
|
assert_equal 'test_token', d.instance.project_token
|
48
47
|
assert_equal 'user_id', d.instance.distinct_id_key
|
@@ -50,9 +49,19 @@ class MixpanelOutputTest < Test::Unit::TestCase
|
|
50
49
|
assert_equal 'ip', d.instance.ip_key
|
51
50
|
end
|
52
51
|
|
52
|
+
def test_configure_with_event_map_tag
|
53
|
+
d = create_driver(CONFIG + "remove_tag_prefix mixpanel\n event_map_tag true")
|
54
|
+
|
55
|
+
assert_equal 'test_token', d.instance.project_token
|
56
|
+
assert_equal 'user_id', d.instance.distinct_id_key
|
57
|
+
assert_equal nil, d.instance.event_key
|
58
|
+
assert_equal 'mixpanel', d.instance.remove_tag_prefix
|
59
|
+
assert_equal true.to_s, d.instance.event_map_tag
|
60
|
+
end
|
61
|
+
|
53
62
|
def test_write
|
54
63
|
stub_mixpanel
|
55
|
-
d = create_driver
|
64
|
+
d = create_driver(CONFIG + "event_key event")
|
56
65
|
time = Time.new('2014-01-01T01:23:45+00:00')
|
57
66
|
d.emit(sample_record, time)
|
58
67
|
d.run
|
@@ -66,7 +75,7 @@ class MixpanelOutputTest < Test::Unit::TestCase
|
|
66
75
|
|
67
76
|
def test_write_multi_request
|
68
77
|
stub_mixpanel
|
69
|
-
d = create_driver
|
78
|
+
d = create_driver(CONFIG + "event_key event")
|
70
79
|
time1 = Time.new('2014-01-01T01:23:45+00:00')
|
71
80
|
time2 = Time.new('2014-01-02T01:23:45+00:00')
|
72
81
|
|
@@ -90,7 +99,7 @@ class MixpanelOutputTest < Test::Unit::TestCase
|
|
90
99
|
|
91
100
|
def test_write_with_ip_key
|
92
101
|
stub_mixpanel
|
93
|
-
d = create_driver(CONFIG +
|
102
|
+
d = create_driver(CONFIG + "event_key event\n ip_key ip_address")
|
94
103
|
time = Time.new('2014-01-01T01:23:45+00:00')
|
95
104
|
d.emit(sample_record.merge('ip_address' => '192.168.0.2'), time)
|
96
105
|
d.run
|
@@ -103,9 +112,37 @@ class MixpanelOutputTest < Test::Unit::TestCase
|
|
103
112
|
assert_equal "value2", @out[0]['properties']['key2']
|
104
113
|
end
|
105
114
|
|
115
|
+
def test_write_with_event_map_tag
|
116
|
+
stub_mixpanel
|
117
|
+
d = create_driver(CONFIG + "remove_tag_prefix mixpanel\n event_map_tag true")
|
118
|
+
time = Time.new('2014-01-01T01:23:45+00:00')
|
119
|
+
d.emit(sample_record, time)
|
120
|
+
d.run
|
121
|
+
|
122
|
+
assert_equal "123", @out[0]['properties']['distinct_id']
|
123
|
+
assert_equal "test", @out[0]['event']
|
124
|
+
assert_equal time.to_i, @out[0]['properties']['time']
|
125
|
+
assert_equal "value1", @out[0]['properties']['key1']
|
126
|
+
assert_equal "value2", @out[0]['properties']['key2']
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_write_with_no_remove_tag_prefix
|
130
|
+
stub_mixpanel
|
131
|
+
d = create_driver(CONFIG + "event_map_tag true")
|
132
|
+
time = Time.new('2014-01-01T01:23:45+00:00')
|
133
|
+
d.emit(sample_record, time)
|
134
|
+
d.run
|
135
|
+
|
136
|
+
assert_equal "123", @out[0]['properties']['distinct_id']
|
137
|
+
assert_equal "mixpanel.test", @out[0]['event']
|
138
|
+
assert_equal time.to_i, @out[0]['properties']['time']
|
139
|
+
assert_equal "value1", @out[0]['properties']['key1']
|
140
|
+
assert_equal "value2", @out[0]['properties']['key2']
|
141
|
+
end
|
142
|
+
|
106
143
|
def test_request_error
|
107
144
|
stub_mixpanel_unavailable
|
108
|
-
d = create_driver
|
145
|
+
d = create_driver(CONFIG + "event_key event")
|
109
146
|
d.emit(sample_record)
|
110
147
|
assert_raise(Mixpanel::ConnectionError) {
|
111
148
|
d.run
|