aliyun_sls_sdk 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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: