@@ -4,6 +4,7 @@ const dotQs = require('dot-qs')
4
4
const request = require ( '../lib/request/index' )
5
5
const crypto = require ( 'crypto' )
6
6
const cos = require ( '../lib/cos/cos' )
7
+ const util = require ( 'util' )
7
8
8
9
var defaults = {
9
10
signatureMethod : 'HmacSHA1' ,
@@ -200,6 +201,104 @@ class DomainClient {
200
201
201
202
class CosClient extends cos { }
202
203
204
+ class SlsMonitor {
205
+ constructor ( credentials = { } ) {
206
+ this . credentials = credentials
207
+ }
208
+
209
+ async request ( data ) {
210
+ return await new TencentCloudClient ( this . credentials , {
211
+ host : 'monitor.tencentcloudapi.com' ,
212
+ path : '/'
213
+ } ) . doCloudApiRequest ( data )
214
+ }
215
+
216
+ aggregationByDay ( responses ) {
217
+ const len = responses . length
218
+ for ( var i = 0 ; i < len ; i ++ ) {
219
+ const result = responses [ i ]
220
+ const tlen = result . Response . DataPoints [ 0 ] . Timestamps . length
221
+ const values = result . Response . DataPoints [ 0 ] . Values
222
+ let total = values [ 0 ]
223
+
224
+ const newTimes = [ ]
225
+ const newValues = [ ]
226
+ for ( var n = 0 ; n < tlen ; n ++ ) {
227
+ if ( n > 0 && ! ( n % 24 ) ) {
228
+ newTimes . push ( result . Response . DataPoints [ 0 ] . Timestamps [ n ] )
229
+ const v = total / 24
230
+ newValues . push ( parseFloat ( ( v . toFixed ( 2 ) ) , 10 ) )
231
+ total = values [ n ]
232
+ } else {
233
+ total += values [ n ]
234
+ }
235
+ }
236
+ result . Response . DataPoints [ 0 ] . Timestamps = newTimes
237
+ result . Response . DataPoints [ 0 ] . Values = newValues
238
+ }
239
+ }
240
+
241
+ async getScfMetrics ( region , rangeTime , period , funcName , ns , version ) {
242
+ const client = new TencentCloudClient ( this . credentials , {
243
+ host : 'monitor.tencentcloudapi.com' ,
244
+ path : '/'
245
+ } )
246
+ const req = {
247
+ Action : 'GetMonitorData' ,
248
+ Version : '2018-07-24' ,
249
+ }
250
+
251
+ const metrics = [ 'Duration' , 'Invocation' , 'Error' , 'ConcurrentExecutions' , 'ConfigMem' , 'FunctionErrorPercentage' , 'Http2xx' , 'Http432' , 'Http433' , 'Http434' , 'Http4xx' , 'Mem' , 'MemDuration' , 'Syserr' ] ;
252
+
253
+ let aggrFlag = false
254
+ if ( period == 86400 ) {
255
+ period = 3600 // day
256
+ aggrFlag = true
257
+ }
258
+ const result = {
259
+ rangeStart : rangeTime . rangeStart ,
260
+ rangeEnd : rangeTime . rangeEnd ,
261
+ metrics : [ ]
262
+ }
263
+
264
+ const requestHandlers = [ ]
265
+ for ( var i = 0 ; i < metrics . length ; i ++ ) {
266
+ req . Namespace = 'qce/scf_v2' ;
267
+ req . MetricName = metrics [ i ] ;
268
+ req . Period = period ;
269
+ req . StartTime = rangeTime . rangeStart ;
270
+ req . EndTime = rangeTime . rangeEnd ;
271
+ req . Instances = [ {
272
+ Dimensions : [
273
+ {
274
+ Name : 'functionName' ,
275
+ Value : funcName ,
276
+ } ,
277
+ {
278
+ Name : 'version' ,
279
+ Value : version || '$latest' ,
280
+ } ,
281
+ {
282
+ Name : 'namespace' ,
283
+ Value : ns ,
284
+ }
285
+ ]
286
+ } ] ;
287
+ requestHandlers . push ( client . doCloudApiRequest ( req ) )
288
+ }
289
+ return new Promise ( ( resolve , reject ) => {
290
+ Promise . all ( requestHandlers ) . then ( ( results ) => {
291
+ if ( aggrFlag )
292
+ this . aggregationByDay ( results )
293
+
294
+ resolve ( results )
295
+ } ) . catch ( ( error ) => {
296
+ reject ( error )
297
+ } )
298
+ } )
299
+ }
300
+ }
301
+
203
302
module . exports = {
204
303
ScfClient,
205
304
TagClient,
@@ -209,5 +308,6 @@ module.exports = {
209
308
ApigwClient,
210
309
DomainClient,
211
310
CosClient,
311
+ SlsMonitor,
212
312
TcbClient
213
313
}
0 commit comments