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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 491a99b98d20fddb7832d1057d7ff25c2dc89dba
4
- data.tar.gz: 9a8b0b46a1f990178fd3352ac480cd884c779de4
3
+ metadata.gz: 9406e78fac736d2fd7b8b6b4dfa4645f741170db
4
+ data.tar.gz: 43835b93670babcdfe3d6cf184b6b65413507315
5
5
  SHA512:
6
- metadata.gz: 94563b6483f2e5f6b4bff5953ed2a5d258c37839409de91ff8c552499bcbec900c055308b2712201c0a929a1d89a292178a12c0212ecb8411c6ff3e408fdce38
7
- data.tar.gz: f8551e6232f9ea49f87585e3de4b9cd1f956b7c6f3b45f7350aac4e6d164977128485fff69e29a089fa6ae6f8d5e7f43a5a519f4c4f8202c23e36146e8adaab5
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 is very similar to [http Input Plugin](http://docs.fluentd.org/en/articles/in_http). Only difference is that it needs `access_control_allow_origin`, to accept [Cross-site HTTP requests](https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS).
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
 
@@ -5,7 +5,6 @@
5
5
  body_size_limit 10m
6
6
  keepalive_timeout 5
7
7
  add_http_headers true
8
- access_control_allow_origin http://0.0.0.0:8000
9
8
  </source>
10
9
 
11
10
  <match mixpanel.**>
@@ -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.2"
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 send event track data to mixpanel}
11
- spec.description = %q{Fluentd plugin to send event track data to mixpanel}
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'] = json['properties'].to_json
15
- params['time'] = (params['_'].to_i / 1000).to_s if params['_']
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' => 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 ? 1 : 0)]
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 d.instance.access_control_allow_origin, res.header['access-control-allow-origin']
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.2
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 send event track data to mixpanel
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 send event track data to mixpanel
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