aliyun_sls_sdk 0.0.5 → 0.0.6
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/lib/aliyun_sls_sdk/connection.rb +27 -3
- data/lib/aliyun_sls_sdk/create_log_store_response.rb +15 -0
- data/lib/aliyun_sls_sdk/get_log_request.rb +18 -0
- data/lib/aliyun_sls_sdk/log_client.rb +171 -0
- data/lib/aliyun_sls_sdk/log_item.rb +16 -0
- data/lib/aliyun_sls_sdk/log_request.rb +8 -0
- data/lib/aliyun_sls_sdk/log_response.rb +17 -0
- data/lib/aliyun_sls_sdk/put_logs_request.rb +15 -0
- data/lib/aliyun_sls_sdk/put_logs_response.rb +5 -0
- data/lib/aliyun_sls_sdk/util.rb +67 -0
- data/lib/aliyun_sls_sdk/version.rb +1 -1
- data/lib/aliyun_sls_sdk.rb +10 -1
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9966f404993efd0e805ec1883d5fbdd512bbe26a
|
4
|
+
data.tar.gz: 8a2607f56f847a7b894960b1d12cd4d21d9e3253
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c062dda63f2dc64cffc5791293f084bac9a51e1901d6581bee4abef369cbac8cce8d0c20bb4b7a5edb134325e8aee56e8f6d8279c549221b5cac0580ca60ce9
|
7
|
+
data.tar.gz: ee7c6902e27d82de45e32d1904357fa53078dd3b78fe1a1669d88072f0f4fb840bb78513f7bc8930b8eba91327a006356402192aaa16e5caabddad2977d77725
|
@@ -4,13 +4,14 @@ require "base64"
|
|
4
4
|
require "zlib"
|
5
5
|
require "time"
|
6
6
|
require "net/http/persistent"
|
7
|
+
require "json"
|
7
8
|
|
8
9
|
module AliyunSlsSdk
|
9
10
|
class Connection
|
10
11
|
|
11
12
|
def initialize(project, region_endpoint, aliyun_access_key_id, aliyun_access_key_secret, opts={})
|
12
13
|
default_headers = {
|
13
|
-
"x-sls-apiversion" => "0.
|
14
|
+
"x-sls-apiversion" => "0.6.0",
|
14
15
|
"x-sls-signaturemethod" => "hmac-sha1"
|
15
16
|
}
|
16
17
|
@headers = default_headers.update opts
|
@@ -21,6 +22,24 @@ module AliyunSlsSdk
|
|
21
22
|
# @http.debug_output = $stdout
|
22
23
|
end
|
23
24
|
|
25
|
+
# https://help.aliyun.com/document_detail/29015.html
|
26
|
+
def create_logstore(logStoreName, ttl, shardCount, ssl_verify = false)
|
27
|
+
body = {:logstoreName => logStoreName, :ttl => ttl, :shardCount => shardCount}
|
28
|
+
content = body.to_json
|
29
|
+
# 压缩content数据
|
30
|
+
compressed = Zlib::Deflate.deflate(content.encode.to_s)
|
31
|
+
headers = compact_headers(content, compressed)
|
32
|
+
headers["Authorization"] = signature("POST", nil, headers, content, {})
|
33
|
+
scheme = ssl_verify ? "https" : "http"
|
34
|
+
|
35
|
+
post_uri = URI "#{scheme}://#{@host}/logstores"
|
36
|
+
post = Net::HTTP::Post.new(post_uri.request_uri, headers)
|
37
|
+
post.body = compressed
|
38
|
+
response = @http.request post_uri, post
|
39
|
+
parse_response(response)
|
40
|
+
end
|
41
|
+
|
42
|
+
|
24
43
|
# http://docs.aliyun.com/#/pub/sls/api/apilist&PutLogs
|
25
44
|
def puts_logs(logstorename, content, ssl_verify = false)
|
26
45
|
# 压缩content数据
|
@@ -189,6 +208,11 @@ module AliyunSlsSdk
|
|
189
208
|
"SLS #{@aliyun_access_key_id}:#{sign(method, logstorename, headers, content, query)}"
|
190
209
|
end
|
191
210
|
|
211
|
+
# https://help.aliyun.com/document_detail/29010.html
|
212
|
+
def setup_common_headers()
|
213
|
+
|
214
|
+
end
|
215
|
+
|
192
216
|
# content是LogGroup
|
193
217
|
def compact_headers(content, compressed)
|
194
218
|
headers = @headers.dup
|
@@ -201,10 +225,10 @@ module AliyunSlsSdk
|
|
201
225
|
headers["Content-Length"] = compressed.bytesize.to_s
|
202
226
|
# 日志内容包含的日志必须小于3MB和4096条。
|
203
227
|
raise AliyunSls::PostBodyTooLarge, "content length is larger than 3MB" if headers["Content-Length"].to_i > 3*1024**2*8
|
204
|
-
raise AliyunSls::PostBodyTooLarge, "content size is more than 4096" if content.logs.size > 4096
|
228
|
+
# raise AliyunSls::PostBodyTooLarge, "content size is more than 4096" if content.logs && content.logs.size > 4096
|
205
229
|
# MD5必须为大写字符串
|
206
230
|
headers["Content-MD5"] = Digest::MD5.hexdigest(compressed).upcase
|
207
|
-
headers["Content-Type"] = "application/
|
231
|
+
headers["Content-Type"] = "application/json"
|
208
232
|
headers["x-sls-bodyrawsize"] = body.bytesize.to_s
|
209
233
|
headers["x-sls-compresstype"] = "deflate"
|
210
234
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module AliyunSlsSdk
|
4
|
+
class CreateLogStoreResponse < LogResponse
|
5
|
+
|
6
|
+
def initialize(header)
|
7
|
+
super(header)
|
8
|
+
end
|
9
|
+
|
10
|
+
def log_print()
|
11
|
+
puts 'CreateLogStoreResponse:'
|
12
|
+
puts 'headers:' + self.all_headers.to_json
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module AliyunSlsSdk
|
2
|
+
class GetLogRequest < LogRequest
|
3
|
+
attr_accessor :project, :logstore, :fromTime, :toTime, :topic, :query, :line, :offset, :reverse
|
4
|
+
def initialize(project=nil, logstore=nil, fromTime=nil, toTime=nil, topic=nil,
|
5
|
+
query=nil, line=nil, offset=nil, reverse=nil)
|
6
|
+
@project = project
|
7
|
+
@logstore = logstore
|
8
|
+
@fromTime = fromTime
|
9
|
+
@toTime = toTime
|
10
|
+
@topic = topic
|
11
|
+
@query = query
|
12
|
+
@line = line
|
13
|
+
@offset = offset
|
14
|
+
@reverse = reverse
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
require "time"
|
2
|
+
require "addressable/uri"
|
3
|
+
require "net/http/persistent"
|
4
|
+
require "json"
|
5
|
+
|
6
|
+
module AliyunSlsSdk
|
7
|
+
class LogClient
|
8
|
+
|
9
|
+
@@API_VERSION = "0.6.0"
|
10
|
+
@@USER_AGENT = "log-ruby-sdk-v-0.6.1"
|
11
|
+
@@http = Net::HTTP::Persistent.new
|
12
|
+
def initialize(endpoint, accessKeyId, accessKeySecret)
|
13
|
+
@endpoint = endpoint
|
14
|
+
@accessKeyId = accessKeyId
|
15
|
+
@accessKeySecret = accessKeySecret
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_logstore(project_name, logstore_name, ttl, shard_count)
|
19
|
+
headers = {}
|
20
|
+
params = {}
|
21
|
+
headers["x-log-bodyrawsize"] = '0'
|
22
|
+
headers["Content-Type"] = "application/json"
|
23
|
+
resource = "/logstores"
|
24
|
+
body = {}
|
25
|
+
body["logstoreName"] = logstore_name.encode("utf-8");
|
26
|
+
body["ttl"] = ttl;
|
27
|
+
body["shardCount"] = shard_count;
|
28
|
+
body_str = body.to_json;
|
29
|
+
resp, header = send("POST", project_name, body_str, resource, params, headers)
|
30
|
+
return CreateLogStoreResponse.new(header)
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
def get_logs()
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def put_logs(request)
|
40
|
+
if request.logitems.length > 4096
|
41
|
+
raise AliyunSls::PostBodyTooLarge, "log item is larger than 4096"
|
42
|
+
end
|
43
|
+
logGroup = Protobuf::LogGroup.new(:logs => [])
|
44
|
+
logGroup.topic = request.topic
|
45
|
+
logGroup.source = request.source
|
46
|
+
request.logitems.each { |logitem|
|
47
|
+
log = Protobuf::Log.new(:time => logitem.timestamp, :contents => [])
|
48
|
+
logGroup.logs << log
|
49
|
+
contents = logitem.contents
|
50
|
+
contents.each { |k, v|
|
51
|
+
content = Protobuf::Log::Content.new(:key => k, :value => v)
|
52
|
+
log.contents << content
|
53
|
+
}
|
54
|
+
}
|
55
|
+
body = logGroup.encode.to_s
|
56
|
+
if body.length > 3 * 1024 * 1024
|
57
|
+
raise AliyunSls::PostBodyTooLarge, "content length is larger than 3MB"
|
58
|
+
end
|
59
|
+
headers = {}
|
60
|
+
headers['x-log-bodyrawsize'] = body.length.to_s
|
61
|
+
headers['Content-Type'] = 'application/x-protobuf'
|
62
|
+
is_compress = request.compress
|
63
|
+
|
64
|
+
compress_data = nil
|
65
|
+
if is_compress
|
66
|
+
headers['x-log-compresstype'] = 'deflate'
|
67
|
+
compress_data = Zlib::Deflate.deflate(body)
|
68
|
+
|
69
|
+
end
|
70
|
+
params = {}
|
71
|
+
logstore = request.logstore
|
72
|
+
project = request.project
|
73
|
+
resource = '/logstores/' + logstore
|
74
|
+
if request.hashkey
|
75
|
+
resource = '/logstores/' + logstore+"/shards/route"
|
76
|
+
params["key"] = request.hashkey
|
77
|
+
else
|
78
|
+
resource = '/logstores/' + logstore+"/shards/lb"
|
79
|
+
end
|
80
|
+
|
81
|
+
respHeaders = nil
|
82
|
+
if is_compress
|
83
|
+
respHeaders = send('POST', project, compress_data, resource, params, headers)
|
84
|
+
else
|
85
|
+
respHeaders = send('POST', project, body, resource, params, headers)
|
86
|
+
end
|
87
|
+
return PutLogsResponse.new(respHeaders[1])
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
private
|
94
|
+
def send(method, project, body, resource, params, headers, respons_body_type ='json')
|
95
|
+
if body
|
96
|
+
headers['Content-Length'] = body.bytesize.to_s
|
97
|
+
headers['Content-MD5'] = Util.cal_md5(body)
|
98
|
+
else
|
99
|
+
headers['Content-Length'] = '0'
|
100
|
+
headers["x-log-bodyrawsize"] = '0'
|
101
|
+
end
|
102
|
+
headers['x-log-apiversion'] = @@API_VERSION
|
103
|
+
headers['x-log-signaturemethod'] = 'hmac-sha1'
|
104
|
+
url = "http://" + project + "." + @endpoint
|
105
|
+
headers['Host'] = project + "." + @endpoint
|
106
|
+
headers['Date'] = headers["Date"] = DateTime.now.httpdate
|
107
|
+
signature = Util.get_request_authorization(method, resource,
|
108
|
+
@accessKeySecret, params, headers)
|
109
|
+
headers['Authorization'] = "LOG " + @accessKeyId + ':' + signature
|
110
|
+
url = url + resource
|
111
|
+
return sendRequest(method, url, params, body, headers, respons_body_type)
|
112
|
+
end
|
113
|
+
|
114
|
+
def sendRequest(method, url, params, body, headers, respons_body_type = 'json')
|
115
|
+
statusCode, respBody, respHeaders = getHttpResponse(method, url, params, body, headers)
|
116
|
+
if respHeaders['x-log-requestid']
|
117
|
+
requestId = respHeaders['x-log-requestid']
|
118
|
+
else
|
119
|
+
requestId = ''
|
120
|
+
end
|
121
|
+
|
122
|
+
if statusCode == '200'
|
123
|
+
if respons_body_type == 'json'
|
124
|
+
return respBody.to_json, respHeaders
|
125
|
+
else
|
126
|
+
return respBody, respHeaders
|
127
|
+
end
|
128
|
+
elsif statusCode.to_s =~ /[4|5]\d\d/
|
129
|
+
msg = "status: #{statusCode}, request_id: #{requestId}, body: #{respBody}"
|
130
|
+
if $logger and $logger.respond_to?(:error)
|
131
|
+
$logger.error msg
|
132
|
+
else
|
133
|
+
puts msg
|
134
|
+
end
|
135
|
+
if respons_body_type == 'json'
|
136
|
+
return respBody.to_json, respHeaders
|
137
|
+
else
|
138
|
+
return respBody, respHeaders
|
139
|
+
end
|
140
|
+
else
|
141
|
+
msg = "status: #{statusCode}, request_id: #{requestId}, body: #{respBody}"
|
142
|
+
if $logger and $logger.respond_to?(:error)
|
143
|
+
$logger.error msg
|
144
|
+
else
|
145
|
+
puts msg
|
146
|
+
end
|
147
|
+
if respons_body_type == 'json'
|
148
|
+
return respBody.to_json, respHeaders
|
149
|
+
else
|
150
|
+
return respBody, respHeaders
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def getHttpResponse(method, url, params, body, headers)
|
156
|
+
headers['User-Agent'] = @@USER_AGENT
|
157
|
+
r = nil
|
158
|
+
uri = Addressable::URI.parse(url)
|
159
|
+
uri.query_values = params
|
160
|
+
methodRequest = nil
|
161
|
+
if method.downcase == 'get'
|
162
|
+
methodRequest = Net::HTTP::Get.new(uri.request_uri, headers)
|
163
|
+
elsif method.downcase == 'post'
|
164
|
+
methodRequest = Net::HTTP::Post.new(uri.request_uri, headers)
|
165
|
+
methodRequest.body = body
|
166
|
+
end
|
167
|
+
response = @@http.request uri, methodRequest
|
168
|
+
return response.code, response.body, response.to_hash
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "time"
|
2
|
+
|
3
|
+
module AliyunSlsSdk
|
4
|
+
class LogItem
|
5
|
+
|
6
|
+
attr_accessor :timestamp, :contents
|
7
|
+
# contents is a hash
|
8
|
+
def initialize(timestamp, contents)
|
9
|
+
if not timestamp
|
10
|
+
@timestamp = Time.now.to_i
|
11
|
+
end
|
12
|
+
@contents = contents
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module AliyunSlsSdk
|
2
|
+
class LogResponse
|
3
|
+
attr_accessor :request_id,:all_headers
|
4
|
+
|
5
|
+
def initialize(headers)
|
6
|
+
@all_headers = headers
|
7
|
+
if headers['x-log-requestid']
|
8
|
+
@request_id = headers['x-log-requestid']
|
9
|
+
end
|
10
|
+
@request_id = ''
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_header(key)
|
14
|
+
return @all_headers[key]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
module AliyunSlsSdk
|
3
|
+
class PutLogsRequest < LogRequest
|
4
|
+
attr_accessor :project, :logstore, :topic, :source, :logitems, :hashkey, :compress
|
5
|
+
def initialize(project=nil, logstore=nil, topic=nil, source=nil, logitems=nil, hashKey = nil, compress = false)
|
6
|
+
@project = project
|
7
|
+
@logstore = logstore
|
8
|
+
@topic = topic
|
9
|
+
@source = source
|
10
|
+
@logitems = logitems
|
11
|
+
@hashkey = hashKey
|
12
|
+
@compress = compress
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "uri"
|
2
|
+
require "base64"
|
3
|
+
require "zlib"
|
4
|
+
require "hmac-sha1"
|
5
|
+
|
6
|
+
|
7
|
+
module AliyunSlsSdk
|
8
|
+
class Util
|
9
|
+
def self.compress_data(data)
|
10
|
+
Zlib::Deflate.deflate(data, 6)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.cal_md5(content)
|
14
|
+
Digest::MD5.hexdigest(content).upcase
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.hmac_sha1(content, key)
|
18
|
+
Base64.encode64((HMAC::SHA1.new(key) << content).digest).rstrip()
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.canonicalized_log_headers(headers)
|
22
|
+
h = {}
|
23
|
+
headers.each { |k, v|
|
24
|
+
if k =~ /x-log-.*/ or k =~ /x-acs-.*/
|
25
|
+
h[k.downcase] = v
|
26
|
+
end
|
27
|
+
}
|
28
|
+
h.keys.sort.map { |e|
|
29
|
+
"#{e}:#{h[e].gsub(/^\s+/, '')}"
|
30
|
+
}.join($/) + $/
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.url_encode(params)
|
34
|
+
# todo
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.canonicalized_resource(resource, params)
|
38
|
+
if not params.empty?
|
39
|
+
urlString = params.keys.sort.map { |k|
|
40
|
+
"#{k}=#{params[k]}"
|
41
|
+
}.join('&')
|
42
|
+
return resource+"?"+urlString
|
43
|
+
else
|
44
|
+
return resource
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.get_request_authorization(method, resource, key, params, headers)
|
49
|
+
if not key
|
50
|
+
return ''
|
51
|
+
end
|
52
|
+
content = method + "\n"
|
53
|
+
if headers['Content-MD5']
|
54
|
+
content += headers['Content-MD5']
|
55
|
+
end
|
56
|
+
content += "\n"
|
57
|
+
if headers['Content-Type']
|
58
|
+
content += headers['Content-Type']
|
59
|
+
end
|
60
|
+
content += "\n"
|
61
|
+
content += headers['Date']+"\n"
|
62
|
+
content += Util.canonicalized_log_headers(headers)
|
63
|
+
content += Util.canonicalized_resource(resource, params)
|
64
|
+
return Util.hmac_sha1(content, key)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/aliyun_sls_sdk.rb
CHANGED
@@ -1,6 +1,15 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'version.rb')
|
2
|
-
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'protobuf.rb')
|
3
2
|
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'connection.rb')
|
3
|
+
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'protobuf.rb')
|
4
|
+
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'log_request.rb')
|
5
|
+
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'get_log_request.rb')
|
6
|
+
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'put_logs_request.rb')
|
7
|
+
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'log_response.rb')
|
8
|
+
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'put_logs_response.rb')
|
9
|
+
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'util.rb')
|
10
|
+
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'log_client.rb')
|
11
|
+
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'log_item.rb')
|
12
|
+
require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'create_log_store_response.rb')
|
4
13
|
|
5
14
|
module AliyunSlsSdk
|
6
15
|
class PostBodyInvalid < RuntimeError;
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aliyun_sls_sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- linhua.tlh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -122,7 +122,16 @@ files:
|
|
122
122
|
- aliyun_sls_sdk.gemspec
|
123
123
|
- lib/aliyun_sls_sdk.rb
|
124
124
|
- lib/aliyun_sls_sdk/connection.rb
|
125
|
+
- lib/aliyun_sls_sdk/create_log_store_response.rb
|
126
|
+
- lib/aliyun_sls_sdk/get_log_request.rb
|
127
|
+
- lib/aliyun_sls_sdk/log_client.rb
|
128
|
+
- lib/aliyun_sls_sdk/log_item.rb
|
129
|
+
- lib/aliyun_sls_sdk/log_request.rb
|
130
|
+
- lib/aliyun_sls_sdk/log_response.rb
|
125
131
|
- lib/aliyun_sls_sdk/protobuf.rb
|
132
|
+
- lib/aliyun_sls_sdk/put_logs_request.rb
|
133
|
+
- lib/aliyun_sls_sdk/put_logs_response.rb
|
134
|
+
- lib/aliyun_sls_sdk/util.rb
|
126
135
|
- lib/aliyun_sls_sdk/version.rb
|
127
136
|
homepage: https://help.aliyun.com/product/28958.html
|
128
137
|
licenses:
|