logstash-filter-mixpanel 0.1.1 → 0.1.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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDA1YzRhYzRiMTJhYzRlZDliOTQ1NjI3NmJhM2I0NjQ5ZjJmN2Y2Ng==
4
+ YzNhMGYxMmM5OTBkZjFlMjQxZDc0NjE4ZjRmMzk1NWI0ZjQ4N2U2ZA==
5
5
  data.tar.gz: !binary |-
6
- Nzg2ZDMxYzYzNzdlY2Q3NzY2YTgzZDJkZjEwZjg4NWFlM2YyMDg1OA==
6
+ YTRlMzhmOTc3MzhlZjYwZWZkZWJiMTdlY2Q1Mzk3YWJiOWNhMWMyMg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MGQ3M2VjMjRmMzk3NWVjYTJmOTNlMjJkOTlhYjcwM2RjNGE4YzVjZTJjODFm
10
- ZWFkMzFhMjUwNzU1N2ZhNjY4NjQ4YzY5YjdjNjc1NmQwZTBiZWNkNmFiZmE3
11
- ZTJjOTY4NjBhYzhmMjUxMmQ5N2RiYTg2NGM2ZGE1YzBmNDY5NGY=
9
+ MzIyMDhkODU3YWJkMjdlNGY5Yzc4ZGUyMDI4NzRjMWVjZDVmYjhkY2Q5M2Fi
10
+ NTIxY2RmMTkyYTMzYmNiMzdiYzRjZTNjNTFkYTI2ZWJlN2E4YjNkNzIyZDU0
11
+ ZTljYTNkZGMzMTE1NTE5ZWY2MzkyYjExOWI4ZmRlZTRiOTI5MDA=
12
12
  data.tar.gz: !binary |-
13
- ZTY3MjBmMjdiYWIzYjM2M2MyZGVhYjJhMzU1ZDZlNmI4MGU4MDY2YjQxNDdk
14
- NWY1OTg4Nzg1ZjM4OTE2NWFkMTcwN2I5ZDk3YmUzN2MyN2U0YzE4MTU4N2Zh
15
- YTgyOGRjNjlkNWRhMDZlMWZhYTYyZmI0ZTRkYjBiOWU1NmQ1YTA=
13
+ MWU1NDBjYmUyOGRjNTk3MGFiZjY2MWM2YTc0MDAxNzI2YmQzM2U5YjViMTQz
14
+ ZGUwYTQ4ZmMzNTJhZjRlOTI1ODBhMTkzMWFhNDQxOWE4MGJiM2Q0MjU1MmJl
15
+ ZWU4YWVjYmJhYWE4MzIxOGNhYWMzMjY3M2M2YWJhNDczZTIyYzY=
@@ -18,14 +18,15 @@ class LogStash::Filters::Mixpanel < LogStash::Filters::Base
18
18
  # }
19
19
  # }
20
20
  #
21
- config_name "mixpanel"
22
-
21
+ config_name 'mixpanel'
22
+
23
23
  # Replace the message with this value.
24
24
  config :api_key, :validate => :string, :required => true
25
25
  config :api_secret, :validate => :string, :required => true
26
- config :where, :validate => :string, :required => true
26
+ config :where, :validate => :array, :required => true
27
27
  config :source, :validate => :string, :default => 'message'
28
28
  config :target, :validate => :string, :default => 'mixpanel'
29
+ config :tag_on_failure, :validate => :array, :default => ['_mixpanelfilterfailure']
29
30
 
30
31
 
31
32
  public
@@ -40,19 +41,49 @@ class LogStash::Filters::Mixpanel < LogStash::Filters::Base
40
41
  def filter(event)
41
42
 
42
43
  result = fetch_data
43
- # TODO: remove puts result
44
- puts result
45
- event[@target] = result
44
+ if !result.nil?
45
+ event[@target] = result
46
46
 
47
- # filter_matched should go in the last line of our successful code
48
- filter_matched(event)
47
+ # filter_matched should go in the last line of our successful code
48
+ filter_matched(event)
49
+ else
50
+ @tag_on_failure.each do |tag|
51
+ event['tags'] ||= []
52
+ event['tags'] << tag unless event["tags"].include?(tag)
53
+ end
54
+ end
49
55
  end # def filter
50
56
 
51
57
  private
52
58
  def fetch_data
53
59
  options = {}
54
- # options['where'] = @where if @where
55
- result = @mp.request('engage', options)
60
+ options['where'] = prepare_where @where if @where
61
+
62
+ response = @mp.request('engage', options)
63
+ if response['results'].size >= 1
64
+ single_res = response['results'][0]
65
+ else
66
+ return nil
67
+ end
68
+ distinct_id = single_res['$distinct_id']
69
+ result = single_res['$properties']
70
+ result['$distinct_id'] = distinct_id
56
71
  result
57
72
  end
73
+
74
+ private
75
+ def prepare_where wheredata
76
+ special_properties = %w(email first_name last_name last_seen created)
77
+ res_array = []
78
+ wheredata.each { |constraint|
79
+ constraint.each { |key, value|
80
+ # prepend key with dollar sigh if key is in special_properties
81
+ # TODO: add test for special properties without dollar sign
82
+ key = "$#{key}" if special_properties.include? key
83
+
84
+ res_array.push "properties[\"#{key}\"] == \"#{value}\""
85
+ }
86
+ }
87
+ res_array.join ' and '
88
+ end
58
89
  end # class LogStash::Filters::Example
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-filter-mixpanel'
3
- s.version = '0.1.1'
3
+ s.version = '0.1.3'
4
4
  s.version = "#{s.version}.pre.#{ENV['TRAVIS_BUILD_NUMBER']}" if ENV['TRAVIS'] and ENV['TRAVIS_BRANCH'] != 'master'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "This filter checks mixpanel for additional people data and adds it to the event data"
@@ -10,15 +10,35 @@ describe LogStash::Filters::Mixpanel do
10
10
  before(:all) do
11
11
  @mp = Mixpanel::Tracker.new(ENV['MP_PROJECT_TOKEN'])
12
12
 
13
- @user_id = FFaker::Guid.guid
14
- @user_ip = FFaker::Internet.ip_v4_address
15
- @user_data = {
16
- :$first_name => FFaker::NameDE.first_name,
17
- :$last_name => FFaker::NameDE.last_name,
18
- :$email => FFaker::Internet.safe_email
13
+ @user_1_id = FFaker::Guid.guid
14
+ @user_1_ip = FFaker::Internet.ip_v4_address
15
+ @user_1_email = FFaker::Internet.safe_email
16
+ @user_1_first_name = FFaker::NameDE.first_name
17
+ @user_1_last_name = FFaker::NameDE.last_name
18
+ @user_1_data = {
19
+ :$first_name => @user_1_first_name,
20
+ :$last_name => @user_1_last_name,
21
+ :$email => @user_1_email,
22
+ 'Device ID' => @user_1_id
19
23
  }
20
- @mp.people.set(@user_id, @user_data, ip=@user_ip)
21
- @mp.track(@user_id, 'user created')
24
+ @mp.people.set(@user_1_id, @user_1_data, ip=@user_1_ip)
25
+ @mp.track(@user_1_id, 'user 1 created')
26
+
27
+ @user_2_id = FFaker::Guid.guid
28
+ @user_2_ip = FFaker::Internet.ip_v4_address
29
+ @user_2_email = FFaker::Internet.safe_email
30
+ @user_2_first_name = @user_1_first_name
31
+ @user_2_last_name = @user_1_last_name
32
+ @user_2_data = {
33
+ :$first_name => @user_2_first_name,
34
+ :$last_name => @user_2_last_name,
35
+ :$email => @user_2_email,
36
+ 'Device ID' => @user_2_id
37
+ }
38
+ @mp.people.set(@user_2_id, @user_2_data, ip=@user_2_ip)
39
+ @mp.track(@user_2_id, 'user 2 created')
40
+
41
+
22
42
  end
23
43
 
24
44
  context 'raise error' do
@@ -53,7 +73,7 @@ describe LogStash::Filters::Mixpanel do
53
73
  config = {
54
74
  'api_key' => '123',
55
75
  'api_secret' => '123',
56
- 'where' => '123'
76
+ 'where' => [{'Device ID' => @user_1_id}]
57
77
  }
58
78
  filter = LogStash::Filters::Mixpanel.new config
59
79
  filter.register
@@ -70,7 +90,7 @@ describe LogStash::Filters::Mixpanel do
70
90
  config = {
71
91
  'api_key' => ENV['MP_PROJECT_KEY'],
72
92
  'api_secret' => '123',
73
- 'where' => '123'
93
+ 'where' => [{'Device ID' => @user_1_id}]
74
94
  }
75
95
  filter = LogStash::Filters::Mixpanel.new config
76
96
  filter.register
@@ -85,29 +105,96 @@ describe LogStash::Filters::Mixpanel do
85
105
  end
86
106
 
87
107
  context 'fetch created user' do
88
- let(:config) do <<-CONFIG
108
+ context 'by device id' do
109
+ let(:config) do <<-CONFIG
89
110
  filter {
90
111
  mixpanel {
91
112
  api_key => '#{ENV['MP_PROJECT_KEY']}'
92
113
  api_secret => '#{ENV['MP_PROJECT_SECRET']}'
93
- where => '123'
114
+ where => [{'Device ID' => '#{@user_1_id}'}]
94
115
  }
95
116
  }
96
- CONFIG
117
+ CONFIG
118
+ end
119
+
120
+ sample("message" => "123") do
121
+ expect(subject).to include('mixpanel')
122
+ expect(subject['mixpanel']).to include('Device ID')
123
+ expect(subject['mixpanel']).to include('$distinct_id')
124
+ expect(subject['mixpanel']).to include('$email')
125
+ expect(subject['mixpanel']).to include('$last_name')
126
+ expect(subject['mixpanel']).to include('Device ID')
127
+ insist { subject['tags'] }.nil?
128
+ end
97
129
  end
98
130
 
99
- # sample("message" => "123") do
100
- # expect(subject).to include('mixpanel')
101
- # end
131
+ context 'by email' do
132
+ let(:config) do <<-CONFIG
133
+ filter {
134
+ mixpanel {
135
+ api_key => '#{ENV['MP_PROJECT_KEY']}'
136
+ api_secret => '#{ENV['MP_PROJECT_SECRET']}'
137
+ where => [{'email' => '#{@user_1_email}'}]
138
+ }
139
+ }
140
+ CONFIG
141
+ end
102
142
 
103
- context 'by distinct id' do
104
143
  sample("message" => "123") do
105
144
  expect(subject).to include('mixpanel')
145
+ expect(subject['mixpanel']).to include('Device ID')
146
+ expect(subject['mixpanel']).to include('$distinct_id')
147
+ expect(subject['mixpanel']).to include('$email')
148
+ expect(subject['mixpanel']).to include('$last_name')
149
+ expect(subject['mixpanel']).to include('Device ID')
150
+ insist { subject['tags'] }.nil?
106
151
  end
107
152
  end
108
153
  end
109
154
 
155
+ context 'test on multiple returns' do
156
+ let(:config) do <<-CONFIG
157
+ filter {
158
+ mixpanel {
159
+ api_key => '#{ENV['MP_PROJECT_KEY']}'
160
+ api_secret => '#{ENV['MP_PROJECT_SECRET']}'
161
+ where => [{'first_name' => '#{@user_1_first_name}'}]
162
+ }
163
+ }
164
+ CONFIG
165
+ end
166
+
167
+ sample("message" => "123") do
168
+ expect(subject).to include('mixpanel')
169
+ expect(subject['mixpanel']).to include('Device ID')
170
+ expect(subject['mixpanel']).to include('$distinct_id')
171
+ expect(subject['mixpanel']).to include('$email')
172
+ expect(subject['mixpanel']).to include('$last_name')
173
+ expect(subject['mixpanel']).to include('Device ID')
174
+ insist { subject['tags'] }.nil?
175
+ end
176
+ end
177
+
178
+ context 'test on no returns' do
179
+ let(:config) do <<-CONFIG
180
+ filter {
181
+ mixpanel {
182
+ api_key => '#{ENV['MP_PROJECT_KEY']}'
183
+ api_secret => '#{ENV['MP_PROJECT_SECRET']}'
184
+ where => [{'first_name' => 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'}]
185
+ }
186
+ }
187
+ CONFIG
188
+ end
189
+
190
+ sample("message" => "123") do
191
+ insist { subject["tags"] }.include?('_mixpanelfilterfailure')
192
+ reject { subject }.include?('mixpanel')
193
+ end
194
+ end
195
+
110
196
  after(:all) do
111
- @mp.people.delete_user(@user_id)
197
+ @mp.people.delete_user(@user_1_id)
198
+ @mp.people.delete_user(@user_2_id)
112
199
  end
113
200
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-mixpanel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Torsten Feld
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-06 00:00:00.000000000 Z
11
+ date: 2015-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstash-core