阿里云如何通过函数计算和云监控服务监控消息服务MNS的消费堆积情况

阿里云消息服务MNS并没有自带堆积预警配置,如果消费有问题就会发生生产故障。通过函数计算做一个定时执行函数发送队列状态到云监控,再通过云监控配置预警即可。

函数实现明细

build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
dependencies {
compile group: 'com.aliyun.mns', name: 'aliyun-sdk-mns', version: '1.1.8.8'
compile 'com.aliyun.fc.runtime:fc-java-core:1.3.0'
compile group: 'com.ning', name: 'async-http-client', version: '1.8.7'
compile 'com.aliyun.openservices:aliyun-cms:0.2.4'
compile 'org.slf4j:slf4j-simple:1.7.21'
}

jar {
enabled = true
from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}

MnsStatusUploader.kt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package eric

import com.alibaba.fastjson.JSONObject
import com.aliyun.fc.runtime.Context
import com.aliyun.fc.runtime.StreamRequestHandler
import com.aliyun.mns.client.CloudAccount
import com.aliyun.openservices.cms.CMSClient
import com.aliyun.openservices.cms.CMSClientInit
import com.aliyun.openservices.cms.metric.MetricAttribute
import com.aliyun.openservices.cms.model.CustomMetric
import com.aliyun.openservices.cms.request.CustomMetricUploadRequest
import com.aliyun.openservices.cms.response.CustomMetricUploadResponse
import java.io.InputStream
import java.io.OutputStream
import java.util.*

/**
*
* @author Eric Xu
* @date 2020/10/16
*/
class MnsStatusUploader : StreamRequestHandler {

val groupId = 10L

override fun handleRequest(input: InputStream?, output: OutputStream?, context: Context?) {

val accessKeyId = System.getenv("ak")
val accessKeySecret = System.getenv("aks")
val accountEndpoint = System.getenv("endpoint")
val queueName = System.getenv("queue")
val metricName = System.getenv("metricName")

val env = mapOf(
"accessKeyId" to accessKeyId,
"accessKeySecret" to accessKeySecret,
"accountEndpoint" to accountEndpoint,
"queueName" to queueName,
"metricName" to metricName
)
context?.logger?.info("env: ${env.toList().joinToString(", ") { "${it.first}: ${it.second}" }}")

val account = CloudAccount(accessKeyId, accessKeySecret, accountEndpoint)
val client = account.mnsClient
val queue = client.getQueueRef(queueName)
val activeMessages = queue.attributes.activeMessages

context?.logger?.info("activeMessages $activeMessages")
val inactiveMessages = queue.attributes.inactiveMessages
context?.logger?.info("inactiveMessages $inactiveMessages")
val delayMessages = queue.attributes.delayMessages
context?.logger?.info("delayMessages $delayMessages")

client.close()

// https://help.aliyun.com/document_detail/170534.html
CMSClientInit.groupId = groupId //设置公共的应用分组ID
val cmsClient = CMSClient("https://metrichub-cms-cn-hangzhou.aliyuncs.com", accessKeyId, accessKeySecret) //初始化client

val activeMessages = CustomMetric.builder()
.setMetricName(metricName) //指标名称
.setGroupId(groupId) //设置应用分组ID
.setTime(Date())
.setType(CustomMetric.TYPE_VALUE) //类型为原始值
.appendValue(MetricAttribute.VALUE, activeMessages) //原始值,key只能是该value,不能自定义
.appendDimension("type", "activeMessages") //添加维度
.build()

val inactiveMessages = CustomMetric.builder()
.setMetricName(metricName) //指标名称
.setGroupId(groupId) //设置应用分组ID
.setTime(Date())
.setType(CustomMetric.TYPE_VALUE) //类型为原始值
.appendValue(MetricAttribute.VALUE, inactiveMessages) //原始值,key只能是该value,不能自定义
.appendDimension("type", "inactiveMessages") //添加维度
.build()

val delayMessages = CustomMetric.builder()
.setMetricName(metricName) //指标名称
.setGroupId(groupId) //设置应用分组ID
.setTime(Date())
.setType(CustomMetric.TYPE_VALUE) //类型为原始值
.appendValue(MetricAttribute.VALUE, delayMessages) //原始值,key只能是该value,不能自定义
.appendDimension("type", "delayMessages") //添加维度
.build()

val request = CustomMetricUploadRequest.builder().append(activeMessages).append(inactiveMessages)
.append(delayMessages)

.build()
val response: CustomMetricUploadResponse = cmsClient.putCustomMetric(request) //上报数据
context?.logger?.info(JSONObject.toJSONString(response))

}
}
分享到