Skip to content

Commit 9b0b39f

Browse files
authored
fix: cloud api qps limit (#4)
* fixed bug * fix cloud api RequestLimitExceeded error * fixed ci error
1 parent aba3de8 commit 9b0b39f

File tree

1 file changed

+54
-21
lines changed

1 file changed

+54
-21
lines changed

src/client.js

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,14 @@ class SlsMonitor {
213213
}).doCloudApiRequest(data)
214214
}
215215

216+
static sleep(ms) {
217+
return new Promise((resolve) => {
218+
setTimeout(() => {
219+
resolve()
220+
}, ms)
221+
})
222+
}
223+
216224
mergeCustomByPeriod(datas, period) {
217225
const len = datas.length
218226
const newValues = []
@@ -542,6 +550,7 @@ class SlsMonitor {
542550
}
543551

544552
async getCustomMetrics(region, announceInstance, rangeTime, period) {
553+
const apiQPSLimit = 8
545554
const metricsRule = [
546555
/^(GET|POST|DEL|DELETE|PUT|OPTIONS|HEAD)_([a-zA-Z0-9]+)_latency$/i,
547556
/^(GET|POST|DEL|DELETE|PUT|OPTIONS|HEAD)_([a-zA-Z0-9]+)_(\d+)$/i,
@@ -553,43 +562,67 @@ class SlsMonitor {
553562
/^5xx$/i
554563
]
555564

565+
const getMetricsResponse = (promiseHandlers) => {
566+
return new Promise((resolve, reject) => {
567+
Promise.all(promiseHandlers)
568+
.then((results) => {
569+
resolve(results)
570+
})
571+
.catch((error) => {
572+
reject(error)
573+
})
574+
})
575+
}
576+
556577
const filterAttributeName = function(name, mRule) {
557578
const len = mRule.length
558579
for (var i = 0; i < len; i++) {
559580
if (name.match(mRule[i])) {
560581
return true
561582
}
562583
}
584+
return false
563585
}
586+
564587
const metricAttributeHash = {}
565-
const requestHandlers = []
588+
let requestHandlers = []
589+
let responses = []
590+
let results
566591
const attributes = await this.describeAttributes(0, 100)
567592
for (var i = 0; i < attributes.Response.Data.TotalCount; i++) {
568593
const metricAttribute = attributes.Response.Data.Data[i]
569594

570-
if (filterAttributeName(metricAttribute.AttributeName, metricsRule)) {
571-
metricAttributeHash[metricAttribute.AttributeId] = metricAttribute
572-
requestHandlers.push(
573-
this.describeCCMInstanceDatas(
574-
metricAttribute.AttributeId,
575-
announceInstance,
576-
rangeTime.rangeStart,
577-
rangeTime.rangeEnd
578-
)
595+
if (!filterAttributeName(metricAttribute.AttributeName, metricsRule)) {
596+
continue
597+
}
598+
metricAttributeHash[metricAttribute.AttributeId] = metricAttribute
599+
requestHandlers.push(
600+
this.describeCCMInstanceDatas(
601+
metricAttribute.AttributeId,
602+
announceInstance,
603+
rangeTime.rangeStart,
604+
rangeTime.rangeEnd
579605
)
606+
)
607+
608+
if (i > 0 && !(i % apiQPSLimit)) {
609+
if (i != apiQPSLimit) {
610+
await SlsMonitor.sleep(1000)
611+
}
612+
results = await getMetricsResponse(requestHandlers)
613+
responses = responses.concat(results)
614+
requestHandlers = []
580615
}
581616
}
582-
583-
return new Promise((resolve, reject) => {
584-
Promise.all(requestHandlers)
585-
.then((results) => {
586-
this.aggrCustomDatas(results, period, metricAttributeHash)
587-
resolve(results)
588-
})
589-
.catch((error) => {
590-
reject(error)
591-
})
592-
})
617+
if (requestHandlers.length == 0) {
618+
this.aggrCustomDatas(responses, period, metricAttributeHash)
619+
return responses
620+
}
621+
await SlsMonitor.sleep(600)
622+
results = await getMetricsResponse(requestHandlers)
623+
responses = responses.concat(results)
624+
this.aggrCustomDatas(responses, period, metricAttributeHash)
625+
return responses
593626
}
594627

595628
async getScfMetrics(region, rangeTime, period, funcName, ns, version) {

0 commit comments

Comments
 (0)