aliyun_sls_sdk 0.0.6 → 0.0.7

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: 9966f404993efd0e805ec1883d5fbdd512bbe26a
4
- data.tar.gz: 8a2607f56f847a7b894960b1d12cd4d21d9e3253
3
+ metadata.gz: 9cc8dd23dc081504838e6cd2b4c8cc50dfe504a9
4
+ data.tar.gz: 3934f12ddfd4f13221bf5a0c3502f467205cf064
5
5
  SHA512:
6
- metadata.gz: 6c062dda63f2dc64cffc5791293f084bac9a51e1901d6581bee4abef369cbac8cce8d0c20bb4b7a5edb134325e8aee56e8f6d8279c549221b5cac0580ca60ce9
7
- data.tar.gz: ee7c6902e27d82de45e32d1904357fa53078dd3b78fe1a1669d88072f0f4fb840bb78513f7bc8930b8eba91327a006356402192aaa16e5caabddad2977d77725
6
+ metadata.gz: 8e2a6200ca463e4f83a838f830d858253623379f6b3c3667928b082159ce702ef3b42c13c5ef9279408d654fe362611a4ef9f8913953ce53c7f31efe95cdea2e
7
+ data.tar.gz: aa2c99f77d280e28948560312e6b0d03ead80b8250efeed8181b540064c65e61859f9c1012b61492835c4a49fa4a299783e7e7fb6f2698cbe208cf7666ef6757
@@ -0,0 +1,13 @@
1
+ module AliyunSlsSdk
2
+ class GetLogStoreResponse < LogResponse
3
+
4
+ attr_accessor :ttl, :shard_count, :logstore_name
5
+ def initialize(resp, header)
6
+ super(header)
7
+ puts resp
8
+ @logstore_name = resp["logstoreName"]
9
+ @ttl = resp["ttl"] ? resp["ttl"].to_i : 0
10
+ @shard_count = resp["shardCount"] ? resp["shardCount"].to_i : 0
11
+ end
12
+ end
13
+ end
@@ -9,12 +9,22 @@ module AliyunSlsSdk
9
9
  @@API_VERSION = "0.6.0"
10
10
  @@USER_AGENT = "log-ruby-sdk-v-0.6.1"
11
11
  @@http = Net::HTTP::Persistent.new
12
- def initialize(endpoint, accessKeyId, accessKeySecret)
12
+ def initialize(endpoint, accessKeyId, accessKeySecret, ssl_verify = false)
13
13
  @endpoint = endpoint
14
14
  @accessKeyId = accessKeyId
15
15
  @accessKeySecret = accessKeySecret
16
+ @ssl_verify = ssl_verify
16
17
  end
17
18
 
19
+ def get_logstore(project_name, logstore_name)
20
+ headers = {}
21
+ params = {}
22
+ resource = "/logstores/" + logstore_name
23
+ resp, header = send("GET", project_name, nil, resource, params, headers)
24
+ return GetLogStoreResponse.new(resp, header)
25
+ end
26
+
27
+
18
28
  def create_logstore(project_name, logstore_name, ttl, shard_count)
19
29
  headers = {}
20
30
  params = {}
@@ -101,7 +111,8 @@ module AliyunSlsSdk
101
111
  end
102
112
  headers['x-log-apiversion'] = @@API_VERSION
103
113
  headers['x-log-signaturemethod'] = 'hmac-sha1'
104
- url = "http://" + project + "." + @endpoint
114
+ scheme = @ssl_verify ? "https" : "http"
115
+ url = "#{scheme}://" + project + "." + @endpoint
105
116
  headers['Host'] = project + "." + @endpoint
106
117
  headers['Date'] = headers["Date"] = DateTime.now.httpdate
107
118
  signature = Util.get_request_authorization(method, resource,
@@ -111,6 +122,18 @@ module AliyunSlsSdk
111
122
  return sendRequest(method, url, params, body, headers, respons_body_type)
112
123
  end
113
124
 
125
+ def loadJson(respText, requestId)
126
+ if respText.empty?
127
+ return nil
128
+ else
129
+ begin
130
+ return JSON.parse(respText)
131
+ rescue JSON::ParserError => e
132
+ raise LogException.new("BadResponse", "Bad json format:\n#{respText}", requestId)
133
+ end
134
+ end
135
+ end
136
+
114
137
  def sendRequest(method, url, params, body, headers, respons_body_type = 'json')
115
138
  statusCode, respBody, respHeaders = getHttpResponse(method, url, params, body, headers)
116
139
  if respHeaders['x-log-requestid']
@@ -121,34 +144,22 @@ module AliyunSlsSdk
121
144
 
122
145
  if statusCode == '200'
123
146
  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
147
+ return loadJson(respBody, requestId), respHeaders
137
148
  else
138
149
  return respBody, respHeaders
139
150
  end
151
+ end
152
+ respJson = loadJson(respBody, requestId)
153
+ if respJson["errorCode"] and respJson["errorMessage"]
154
+ raise LogException.new(respJson["errorCode"], respJson["errorMessage"], requestId)
140
155
  else
141
- msg = "status: #{statusCode}, request_id: #{requestId}, body: #{respBody}"
142
- if $logger and $logger.respond_to?(:error)
143
- $logger.error msg
156
+ exStr = ""
157
+ if respBody
158
+ exStr = ". Return Json is #{respBody}"
144
159
  else
145
- puts msg
146
- end
147
- if respons_body_type == 'json'
148
- return respBody.to_json, respHeaders
149
- else
150
- return respBody, respHeaders
160
+ exStr = "."
151
161
  end
162
+ raise LogException.new("LogRequestError", "Request is failed. Http code is #{statusCode} #{exStr}", requestId)
152
163
  end
153
164
  end
154
165
 
@@ -0,0 +1,15 @@
1
+
2
+ module AliyunSlsSdk
3
+ class LogException < StandardError
4
+ attr_accessor :errorCode, :errorMessage, :requestId
5
+ def initialize(errorCode, errorMessage, requestId)
6
+ @errorCode = errorCode
7
+ @errorMessage = errorMessage
8
+ @requestId = requestId
9
+ end
10
+
11
+ def to_s()
12
+ "LogException: \n{\n ErrorCode: #{@errorCode}\n ErrorMessage: #{@errorMessage}\n RequestId: #{@requestId}\n}\n"
13
+ end
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module AliyunSlsSdk
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -1,5 +1,4 @@
1
1
  require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'version.rb')
2
- require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'connection.rb')
3
2
  require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'protobuf.rb')
4
3
  require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'log_request.rb')
5
4
  require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'get_log_request.rb')
@@ -10,6 +9,8 @@ require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'util.rb')
10
9
  require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'log_client.rb')
11
10
  require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'log_item.rb')
12
11
  require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'create_log_store_response.rb')
12
+ require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'get_log_store_response.rb')
13
+ require File.join(File.dirname(__FILE__), 'aliyun_sls_sdk', 'log_exception.rb')
13
14
 
14
15
  module AliyunSlsSdk
15
16
  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.6
4
+ version: 0.0.7
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-04-11 00:00:00.000000000 Z
11
+ date: 2017-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -121,10 +121,11 @@ files:
121
121
  - README.md
122
122
  - aliyun_sls_sdk.gemspec
123
123
  - lib/aliyun_sls_sdk.rb
124
- - lib/aliyun_sls_sdk/connection.rb
125
124
  - lib/aliyun_sls_sdk/create_log_store_response.rb
126
125
  - lib/aliyun_sls_sdk/get_log_request.rb
126
+ - lib/aliyun_sls_sdk/get_log_store_response.rb
127
127
  - lib/aliyun_sls_sdk/log_client.rb
128
+ - lib/aliyun_sls_sdk/log_exception.rb
128
129
  - lib/aliyun_sls_sdk/log_item.rb
129
130
  - lib/aliyun_sls_sdk/log_request.rb
130
131
  - lib/aliyun_sls_sdk/log_response.rb
@@ -1,251 +0,0 @@
1
- require "addressable/uri"
2
- require 'hmac-sha1'
3
- require "base64"
4
- require "zlib"
5
- require "time"
6
- require "net/http/persistent"
7
- require "json"
8
-
9
- module AliyunSlsSdk
10
- class Connection
11
-
12
- def initialize(project, region_endpoint, aliyun_access_key_id, aliyun_access_key_secret, opts={})
13
- default_headers = {
14
- "x-sls-apiversion" => "0.6.0",
15
- "x-sls-signaturemethod" => "hmac-sha1"
16
- }
17
- @headers = default_headers.update opts
18
- @aliyun_access_key_id = aliyun_access_key_id
19
- @aliyun_access_key_secret = aliyun_access_key_secret
20
- @host = "#{project}.#{region_endpoint}"
21
- @http = Net::HTTP::Persistent.new
22
- # @http.debug_output = $stdout
23
- end
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
-
43
- # http://docs.aliyun.com/#/pub/sls/api/apilist&PutLogs
44
- def puts_logs(logstorename, content, ssl_verify = false)
45
- # 压缩content数据
46
- compressed = Zlib::Deflate.deflate(content.encode.to_s)
47
- headers = compact_headers(content, compressed)
48
- headers["Authorization"] = signature("POST", logstorename, headers, content, {})
49
- scheme = ssl_verify ? "https" : "http"
50
-
51
- post_uri = URI "#{scheme}://#{@host}/logstores/#{logstorename}"
52
- post = Net::HTTP::Post.new(post_uri.request_uri, headers)
53
- post.body = compressed
54
- response = @http.request post_uri, post
55
- parse_response(response)
56
- end
57
-
58
- # http://docs.aliyun.com/#/pub/sls/api/apilist&ListLogstores
59
- def list_logstores(ssl_verify = false)
60
- headers = compact_headers(nil, nil)
61
- headers["Authorization"] = signature("GET", nil, headers, nil, {})
62
-
63
- scheme = ssl_verify ? "https" : "http"
64
- get_uri = URI "#{scheme}://#{@host}/logstores"
65
- headers["Referer"] = get_uri.to_s
66
- get = Net::HTTP::Get.new(get_uri.request_uri, headers)
67
- response = @http.request get_uri, get
68
- parse_response(response)
69
- end
70
-
71
- # http://docs.aliyun.com/#/pub/sls/api/apilist&GetLogs
72
- def get_logs(logstorename, ssl_verify=false, opts={})
73
- default_opts = {
74
- :type => "log",
75
- :from => Time.now.to_i - 60*5, #默认是五分钟前
76
- :to => Time.now.to_i,
77
- # :line => 100,
78
- # :offset => 0,
79
- :reverse => false
80
- }
81
- opts = default_opts.update opts
82
- headers = compact_headers(nil, nil)
83
- headers["Authorization"] = signature("GET", logstorename, headers, nil, opts)
84
- scheme = ssl_verify ? "https" : "http"
85
- get_uri = Addressable::URI.parse("#{scheme}://#{@host}/logstores/#{logstorename}")
86
- headers["Referer"] = get_uri.to_s
87
- get_uri.query_values = opts
88
- get = Net::HTTP::Get.new(get_uri.request_uri, headers)
89
- response = @http.request get_uri, get
90
- parse_response(response)
91
- end
92
-
93
- # http://docs.aliyun.com/#/pub/sls/api/apilist&ListTopics
94
- def list_topics(logstorename, ssl_verify=false, opts={})
95
- default_opts = {
96
- :type => "topic",
97
- :line => 100,
98
- :toke => ""
99
- }
100
- opts = default_opts.update opts
101
- headers = compact_headers(nil, nil)
102
- headers["Authorization"] = signature("GET", logstorename, headers, nil, opts)
103
- scheme = ssl_verify ? "https" : "http"
104
- get_uri = Addressable::URI.parse("#{scheme}://#{@host}/logstores/#{logstorename}")
105
- headers["Referer"] = get_uri.to_s
106
- get_uri.query_values = opts
107
- get = Net::HTTP::Get.new(get_uri.request_uri, headers)
108
- response = @http.request get_uri, get
109
- parse_response(response)
110
- end
111
-
112
- # http://docs.aliyun.com/#/pub/sls/api/apilist&GetHistograms
113
- def get_histograms(logstorename, ssl_verify=false, opts={})
114
- default_opts = {
115
- :type => "histogram",
116
- :from => Time.now.to_i - 60*5, #默认是五分钟前
117
- :to => Time.now.to_i,
118
- :topic => "",
119
- :query => "",
120
- }
121
- opts = default_opts.update opts
122
- headers = compact_headers(nil, nil)
123
- headers["Authorization"] = signature("GET", logstorename, headers, nil, opts)
124
- scheme = ssl_verify ? "https" : "http"
125
- get_uri = Addressable::URI.parse("#{scheme}://#{@host}/logstores/#{logstorename}")
126
- headers["Referer"] = get_uri.to_s
127
- get_uri.query_values = opts
128
- get = Net::HTTP::Get.new(get_uri.request_uri, headers)
129
- response = @http.request get_uri, get
130
- parse_response(response)
131
- end
132
-
133
- private
134
-
135
- def string_to_sign(verb, logstorename, headers, content, query={})
136
- if content
137
- string_to_sign_with_content(verb, logstorename, headers, query)
138
- else
139
- string_to_sign_without_content(verb, logstorename, headers, query)
140
- end
141
- end
142
-
143
- def string_to_sign_with_content(verb, logstorename, headers, query={})
144
-
145
- <<~DOC
146
- #{verb}
147
- #{headers['Content-MD5']}
148
- #{headers['Content-Type']}
149
- #{headers['Date']}
150
- #{canonicalized_sls_headers(headers)}
151
- #{canonicalized_resource(logstorename, query)}
152
- DOC
153
- end
154
-
155
- def string_to_sign_without_content(verb, logstorename, headers, query={})
156
- <<~DOC
157
- #{verb}
158
-
159
-
160
- #{headers['Date']}
161
- #{canonicalized_sls_headers(headers)}
162
- #{canonicalized_resource(logstorename, query)}
163
- DOC
164
- end
165
-
166
- # “CanonicalizedSLSHeaders”的构造方式如下:
167
- # 1. 将所有以“x-sls-”为前缀的HTTP请求头的名字转换成小写字母;
168
- # 2. 将上一步得到的所有SLS自定义请求头按照字典序进行升序排序;
169
- # 3. 删除请求头和内容之间分隔符两端出现的任何空格;
170
- # 4. 将所有的头和内容用\n分隔符组合成最后的CanonicalizedSLSHeader;
171
- def canonicalized_sls_headers(headers)
172
- h = {}
173
- headers.each { |k, v|
174
- if k =~ /x-sls-.*/
175
- h[k.downcase] = v
176
- end
177
- }
178
- h.keys.sort.map { |e|
179
- h[e]
180
- "#{e}:#{h[e].gsub(/^\s+/, '')}"
181
- }.join($/)
182
- end
183
-
184
- # “CanonicalizedResource”的构造方式如下:
185
- # 1. 将CanonicalizedResource设置为空字符串("");
186
- # 2. 放入要访问的SLS资源:"/logstores/logstorename"(无logstorename则不填);
187
- # 3. 如请求包含查询字符串(QUERY_STRING),则在CanonicalizedResource字符串尾部添加“?”和查询字符串。
188
- def canonicalized_resource(logstorename, query={})
189
- u = logstorename ? Addressable::URI.parse("/logstores/#{logstorename}") : Addressable::URI.parse("/logstores")
190
- if query.size != 0
191
- # 不能对请求的URL参数做URLEncode编码
192
- q_str = query.keys.sort.map { |e|
193
- "#{e}=#{query[e]}"
194
- }.join('&')
195
- "#{u}?#{q_str}"
196
- else
197
- u.to_s
198
- end
199
- end
200
-
201
- # 目前,SLS API只支持一种数字签名算法,即默认签名算法"hmac-sha1"。其整个签名公式如下:
202
- # Signature = base64(hmac-sha1(UTF8-Encoding-Of(SignString),AccessKeySecret))
203
- def sign(method, logstorename, headers, content, query)
204
- Base64.encode64((HMAC::SHA1.new(@aliyun_access_key_secret) << string_to_sign(method, logstorename, headers, content, query).chomp).digest).strip
205
- end
206
-
207
- def signature(method, logstorename, headers, content, query)
208
- "SLS #{@aliyun_access_key_id}:#{sign(method, logstorename, headers, content, query)}"
209
- end
210
-
211
- # https://help.aliyun.com/document_detail/29010.html
212
- def setup_common_headers()
213
-
214
- end
215
-
216
- # content是LogGroup
217
- def compact_headers(content, compressed)
218
- headers = @headers.dup
219
- # headers["x-sls-date"] =
220
- headers["Date"] = DateTime.now.httpdate
221
- headers["x-sls-bodyrawsize"] = "0"
222
-
223
- if content and compressed
224
- body = content.encode.to_s
225
- headers["Content-Length"] = compressed.bytesize.to_s
226
- # 日志内容包含的日志必须小于3MB和4096条。
227
- raise AliyunSls::PostBodyTooLarge, "content length is larger than 3MB" if headers["Content-Length"].to_i > 3*1024**2*8
228
- # raise AliyunSls::PostBodyTooLarge, "content size is more than 4096" if content.logs && content.logs.size > 4096
229
- # MD5必须为大写字符串
230
- headers["Content-MD5"] = Digest::MD5.hexdigest(compressed).upcase
231
- headers["Content-Type"] = "application/json"
232
- headers["x-sls-bodyrawsize"] = body.bytesize.to_s
233
- headers["x-sls-compresstype"] = "deflate"
234
- end
235
- headers
236
- end
237
-
238
- def parse_response(response)
239
- # 如果返回结果报错,则解析报错内容打印到日志中
240
- if response.code.to_s =~ /[4|5]\d\d/
241
- msg = "status #{response.code} body #{response.body}"
242
- if $logger and $logger.respond_to?(:error)
243
- $logger.error msg
244
- else
245
- puts msg
246
- end
247
- end
248
- response
249
- end
250
- end
251
- end