thinkingdata-ruby 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +4 -0
- data/lib/thinkingdata-ruby/batch_consumer.rb +10 -3
- data/lib/thinkingdata-ruby/debug_consumer.rb +9 -3
- data/lib/thinkingdata-ruby/tracker.rb +82 -17
- data/lib/thinkingdata-ruby/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3885c858dfa78a2f34e1803351c1f3b20ed9f67378d7cf3033c0e840e3f9c60a
|
4
|
+
data.tar.gz: c0c954d2974d3000f708dd2ff6340a0799dd8a5c0aac84832c9b7fd245550381
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9505c957f69a7270ed77b4b8a5a84828c5976aefebcea9635b4a4563182c134b102c75a7c2a3bc0ff55131465d3b588a3a878c9587a371303f61ae2ab0f257d8
|
7
|
+
data.tar.gz: 2bb4637c114d94bdf36f210588226d7bb8c7306377f6500d0b3b530f92e22ef7c3776b0ee48230bb4fc1e9bfe4bccfcd2e19c4b73c7861d1bd275d3a37e02f02
|
data/CHANGELOG.md
CHANGED
@@ -6,9 +6,10 @@ module TDAnalytics
|
|
6
6
|
# 有数据时,首先会加入本地缓冲区,当条数到达上限后会发起上报
|
7
7
|
class BatchConsumer
|
8
8
|
# 默认缓冲区大小
|
9
|
-
|
9
|
+
DEFAULT_LENGTH = 20
|
10
|
+
MAX_LENGTH = 2000
|
10
11
|
|
11
|
-
def initialize(server_url, app_id, max_buffer_length =
|
12
|
+
def initialize(server_url, app_id, max_buffer_length = DEFAULT_LENGTH)
|
12
13
|
@server_uri = URI.parse(server_url)
|
13
14
|
@server_uri.path = '/sync_server'
|
14
15
|
@app_id = app_id
|
@@ -43,7 +44,13 @@ module TDAnalytics
|
|
43
44
|
data = chunk.to_json
|
44
45
|
end
|
45
46
|
compress_type = @compress ? 'gzip' : 'none'
|
46
|
-
headers = {'Content-Type' => 'application/plaintext',
|
47
|
+
headers = {'Content-Type' => 'application/plaintext',
|
48
|
+
'appid' => @app_id,
|
49
|
+
'compress' => compress_type,
|
50
|
+
'TA-Integration-Type'=>'Ruby',
|
51
|
+
'TA-Integration-Version'=>TDAnalytics::VERSION,
|
52
|
+
'TA-Integration-Count'=>@buffers.count,
|
53
|
+
'TA_Integration-Extra'=>'batch'}
|
47
54
|
request = CaseSensitivePost.new(@server_uri.request_uri, headers)
|
48
55
|
request.body = data
|
49
56
|
|
@@ -15,9 +15,15 @@ module TDAnalytics
|
|
15
15
|
|
16
16
|
def add(message)
|
17
17
|
puts message.to_json
|
18
|
+
headers = {
|
19
|
+
'TA-Integration-Type'=>'Ruby',
|
20
|
+
'TA-Integration-Version'=>TDAnalytics::VERSION,
|
21
|
+
'TA-Integration-Count'=>'1',
|
22
|
+
'TA_Integration-Extra'=>'debug'
|
23
|
+
}
|
18
24
|
form_data = {"data" => message.to_json, "appid" => @app_id, "dryRun" => @write_data ? "0" : "1", "source" => "server"}
|
19
25
|
begin
|
20
|
-
response_code, response_body = request(@server_uri, form_data)
|
26
|
+
response_code, response_body = request(@server_uri, form_data,headers)
|
21
27
|
rescue => e
|
22
28
|
raise ConnectionError.new("Could not connect to TA server, with error \"#{e.message}\".")
|
23
29
|
end
|
@@ -36,8 +42,8 @@ module TDAnalytics
|
|
36
42
|
end
|
37
43
|
end
|
38
44
|
|
39
|
-
def request(uri, form_data)
|
40
|
-
request = Net::HTTP::Post.new(uri.request_uri)
|
45
|
+
def request(uri, form_data,headers)
|
46
|
+
request = Net::HTTP::Post.new(uri.request_uri,headers)
|
41
47
|
request.set_form_data(form_data)
|
42
48
|
|
43
49
|
client = Net::HTTP.new(uri.host, uri.port)
|
@@ -67,7 +67,7 @@ module TDAnalytics
|
|
67
67
|
# time: (可选)Time 事件发生时间,如果不传默认为系统当前时间
|
68
68
|
# ip: (可选) 事件 IP,如果传入 IP 地址,后端可以通过 IP 地址解析事件发生地点
|
69
69
|
# skip_local_check: (可选) boolean 表示是否跳过本地检测
|
70
|
-
def track(event_name: nil, distinct_id: nil, account_id: nil, properties: {}, time: nil, ip: nil, skip_local_check: false)
|
70
|
+
def track(event_name: nil, distinct_id: nil, account_id: nil, properties: {}, time: nil, ip: nil,first_check_id:nil, skip_local_check: false)
|
71
71
|
begin
|
72
72
|
_check_name event_name
|
73
73
|
_check_id(distinct_id, account_id)
|
@@ -85,11 +85,80 @@ module TDAnalytics
|
|
85
85
|
data[:account_id] = account_id if account_id
|
86
86
|
data[:time] = time if time
|
87
87
|
data[:ip] = ip if ip
|
88
|
+
data[:first_check_id] = first_check_id if first_check_id
|
88
89
|
data[:properties] = properties
|
89
90
|
|
90
91
|
_internal_track(:track, data)
|
91
92
|
end
|
92
93
|
|
94
|
+
# 上报事件数据可进行更新. 每个事件都包含一个事件名和事件ID以及 Hash 对象的时间属性. 其参数说明如下:
|
95
|
+
# event_name: (必须) 事件名 必须是英文字母开头,可以包含字母、数字和 _, 长度不超过 50 个字符.
|
96
|
+
# event_id:(必须) event_name + event_id 会作为一条事件的唯一键
|
97
|
+
# distinct_id: (可选) 访客 ID
|
98
|
+
# account_id: (可选) 账号ID distinct_id 和 account_id 不能同时为空
|
99
|
+
# properties: (可选) Hash 事件属性。支持四种类型的值:字符串、数值、Time、boolean
|
100
|
+
# time: (可选)Time 事件发生时间,如果不传默认为系统当前时间
|
101
|
+
# ip: (可选) 事件 IP,如果传入 IP 地址,后端可以通过 IP 地址解析事件发生地点
|
102
|
+
# skip_local_check: (可选) boolean 表示是否跳过本地检测
|
103
|
+
def track_overwrite(event_name: nil,event_id: nil, distinct_id: nil, account_id: nil, properties: {}, time: nil, ip: nil, skip_local_check: false)
|
104
|
+
begin
|
105
|
+
_check_name event_name
|
106
|
+
_check_event_id event_id
|
107
|
+
_check_id(distinct_id, account_id)
|
108
|
+
unless skip_local_check
|
109
|
+
_check_properties(:track_overwrite, properties)
|
110
|
+
end
|
111
|
+
rescue TDAnalyticsError => e
|
112
|
+
@error_handler.handle(e)
|
113
|
+
return false
|
114
|
+
end
|
115
|
+
|
116
|
+
data = {}
|
117
|
+
data[:event_name] = event_name
|
118
|
+
data[:event_id] = event_id
|
119
|
+
data[:distinct_id] = distinct_id if distinct_id
|
120
|
+
data[:account_id] = account_id if account_id
|
121
|
+
data[:time] = time if time
|
122
|
+
data[:ip] = ip if ip
|
123
|
+
data[:properties] = properties
|
124
|
+
_internal_track(:track_overwrite, data)
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
# 上报事件数据可进行覆盖. 每个事件都包含一个事件名和事件ID以及 Hash 对象的时间属性. 其参数说明如下:
|
130
|
+
# event_name: (必须) 事件名 必须是英文字母开头,可以包含字母、数字和 _, 长度不超过 50 个字符.
|
131
|
+
# event_id:(必须) event_name + event_id 会作为一条事件的唯一键
|
132
|
+
# distinct_id: (可选) 访客 ID
|
133
|
+
# account_id: (可选) 账号ID distinct_id 和 account_id 不能同时为空
|
134
|
+
# properties: (可选) Hash 事件属性。支持四种类型的值:字符串、数值、Time、boolean
|
135
|
+
# time: (可选)Time 事件发生时间,如果不传默认为系统当前时间
|
136
|
+
# ip: (可选) 事件 IP,如果传入 IP 地址,后端可以通过 IP 地址解析事件发生地点
|
137
|
+
# skip_local_check: (可选) boolean 表示是否跳过本地检测
|
138
|
+
def track_update(event_name: nil,event_id: nil, distinct_id: nil, account_id: nil, properties: {}, time: nil, ip: nil, skip_local_check: false)
|
139
|
+
begin
|
140
|
+
_check_name event_name
|
141
|
+
_check_event_id event_id
|
142
|
+
_check_id(distinct_id, account_id)
|
143
|
+
unless skip_local_check
|
144
|
+
_check_properties(:track_update, properties)
|
145
|
+
end
|
146
|
+
rescue TDAnalyticsError => e
|
147
|
+
@error_handler.handle(e)
|
148
|
+
return false
|
149
|
+
end
|
150
|
+
|
151
|
+
data = {}
|
152
|
+
data[:event_name] = event_name
|
153
|
+
data[:event_id] = event_id
|
154
|
+
data[:distinct_id] = distinct_id if distinct_id
|
155
|
+
data[:account_id] = account_id if account_id
|
156
|
+
data[:time] = time if time
|
157
|
+
data[:ip] = ip if ip
|
158
|
+
data[:properties] = properties
|
159
|
+
_internal_track(:track_update, data)
|
160
|
+
end
|
161
|
+
|
93
162
|
# 设置用户属性. 如果出现同名属性,则会覆盖之前的值.
|
94
163
|
# distinct_id: (可选) 访客 ID
|
95
164
|
# account_id: (可选) 账号ID distinct_id 和 account_id 不能同时为空
|
@@ -236,13 +305,13 @@ module TDAnalytics
|
|
236
305
|
private
|
237
306
|
|
238
307
|
# 出现异常的时候返回 false, 否则 true
|
239
|
-
def _internal_track(type, properties: {}, event_name: nil, account_id: nil, distinct_id: nil, ip: nil, time: Time.now)
|
308
|
+
def _internal_track(type, properties: {}, event_name: nil, event_id:nil, account_id: nil, distinct_id: nil, ip: nil,first_check_id: nil, time: Time.now)
|
240
309
|
if account_id == nil && distinct_id == nil
|
241
310
|
raise IllegalParameterError.new('account id or distinct id must be provided.')
|
242
311
|
end
|
243
312
|
|
244
|
-
if type == :track
|
245
|
-
raise IllegalParameterError.new('event name is empty
|
313
|
+
if type == :track || type == :track_update || type == :track_overwrite
|
314
|
+
raise IllegalParameterError.new('event name is empty') if event_name == nil
|
246
315
|
properties = {'#zone_offset': time.utc_offset / 3600.0}.merge(LIB_PROPERTIES).merge(@super_properties).merge(properties)
|
247
316
|
end
|
248
317
|
|
@@ -259,10 +328,12 @@ module TDAnalytics
|
|
259
328
|
'properties' => properties,
|
260
329
|
}
|
261
330
|
|
262
|
-
data['#event_name'] = event_name if type == :track
|
331
|
+
data['#event_name'] = event_name if (type == :track || type == :track_update || :track_overwrite)
|
332
|
+
data['#event_id'] = event_id if (type == :track_update || type == :track_overwrite)
|
263
333
|
data['#account_id'] = account_id if account_id
|
264
334
|
data['#distinct_id'] = distinct_id if distinct_id
|
265
335
|
data['#ip'] = ip if ip
|
336
|
+
data['#first_check_id'] = first_check_id if first_check_id
|
266
337
|
data['#uuid'] = SecureRandom.uuid if @uuid
|
267
338
|
|
268
339
|
ret = true
|
@@ -281,6 +352,11 @@ module TDAnalytics
|
|
281
352
|
time.strftime("%Y-%m-%d %H:%M:%S.#{((time.to_f * 1000.0).to_i % 1000).to_s.rjust(3, "0")}")
|
282
353
|
end
|
283
354
|
|
355
|
+
def _check_event_id(event_id)
|
356
|
+
raise IllegalParameterError.new("the event_id or property cannot be nil") if event_id.nil?
|
357
|
+
true
|
358
|
+
end
|
359
|
+
|
284
360
|
# 属性名或者事件名检查
|
285
361
|
def _check_name(name)
|
286
362
|
raise IllegalParameterError.new("the name of event or property cannot be nil") if name.nil?
|
@@ -288,10 +364,6 @@ module TDAnalytics
|
|
288
364
|
unless name.instance_of?(String) || name.instance_of?(Symbol)
|
289
365
|
raise IllegalParameterError.new("#{name} is invalid. It must be String or Symbol")
|
290
366
|
end
|
291
|
-
|
292
|
-
unless name =~ /^[a-zA-Z][a-zA-Z0-9_]{1,49}$/
|
293
|
-
raise IllegalParameterError.new("#{name} is invalid. It must be string starts with letters and contains letters, numbers, and _ with max length of 50")
|
294
|
-
end
|
295
367
|
true
|
296
368
|
end
|
297
369
|
|
@@ -303,6 +375,7 @@ module TDAnalytics
|
|
303
375
|
|
304
376
|
properties.each do |k, v|
|
305
377
|
_check_name k
|
378
|
+
next if v.nil?
|
306
379
|
unless v.is_a?(Integer) || v.is_a?(Float) || v.is_a?(Symbol) || v.is_a?(String) || v.is_a?(Time) || !!v == v || v.is_a?(Array)
|
307
380
|
raise IllegalParameterError.new("The value of properties must be type in Integer, Float, Symbol, String, Array,and Time")
|
308
381
|
end
|
@@ -324,14 +397,6 @@ module TDAnalytics
|
|
324
397
|
# 检查用户 ID 合法性
|
325
398
|
def _check_id(distinct_id, account_id)
|
326
399
|
raise IllegalParameterError.new("account id or distinct id must be provided.") if distinct_id.nil? && account_id.nil?
|
327
|
-
|
328
|
-
unless distinct_id.nil?
|
329
|
-
raise IllegalParameterError.new("The length of distinct id should in (0, 64]") if distinct_id.to_s.length < 1 || distinct_id.to_s.length > 64
|
330
|
-
end
|
331
|
-
|
332
|
-
unless account_id.nil?
|
333
|
-
raise IllegalParameterError.new("The length of account id should in (0, 64]") if account_id.to_s.length < 1 || account_id.to_s.length > 64
|
334
|
-
end
|
335
400
|
end
|
336
401
|
end
|
337
402
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thinkingdata-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ThinkingData
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: The official ThinkingData Analytics API for ruby
|
14
14
|
email: sdk@thinkingdata.cn
|
@@ -48,8 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: '0'
|
50
50
|
requirements: []
|
51
|
-
|
52
|
-
rubygems_version: 2.5.2.3
|
51
|
+
rubygems_version: 3.0.3
|
53
52
|
signing_key:
|
54
53
|
specification_version: 4
|
55
54
|
summary: Official ThinkingData Analytics API for ruby
|