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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3a5379de759aaffcc2806796c3ac6352cea1baac
4
- data.tar.gz: 15cd324d103afaf804110ef26c4789ebe3cd7993
3
+ metadata.gz: 9966f404993efd0e805ec1883d5fbdd512bbe26a
4
+ data.tar.gz: 8a2607f56f847a7b894960b1d12cd4d21d9e3253
5
5
  SHA512:
6
- metadata.gz: 783c03b3c249d078068076784ee53939147e70abd1734f97e2ffd26ac71880ed607ccc7354908d71730d2714d3fae6b66468e9b63aa4aaec9f1854d34af27ff6
7
- data.tar.gz: 131b92443f4108ea49a3abf69f49876a1194e2c1b253707f47f5b579bc1db34576c5bf1c72cb65bc4902df5b253dfdafcf4cfbff3bd9aedda735e0a4b456207f
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.4.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/x-protobuf"
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,8 @@
1
+ module AliyunSlsSdk
2
+ class LogRequest
3
+ attr_accessor :project
4
+ def initialize(projectName)
5
+ @project = projectName
6
+ end
7
+ end
8
+ 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,5 @@
1
+
2
+ module AliyunSlsSdk
3
+ class PutLogsResponse < LogResponse
4
+ end
5
+ 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
@@ -1,3 +1,3 @@
1
1
  module AliyunSlsSdk
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -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.5
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-03-30 00:00:00.000000000 Z
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: