本篇文章的目的是什么?
Azure云端一直困扰着我的是,如果遇到数据库累积数据量过大、数据库DTU过大、应用程序服务访问量过大等,我们都没办法知道他们什么时候过大。只能做的是,我们天天看着我们的应用,看监控图表、看应用访问速度。
直到在新版Portal中出现了警报规则… 我们可以用emal、webhook的方式来接收警报。email就不用说了,直接配置即可,我们这里主要说webhook…
Webhook是什么、怎么理解Webhook
请看另外一篇文章:
Azure警报规则可用于那些地方
所有的Azure上面的警报,包括数据库、应用程序服务等
使用前提
有登录Azure的资格、能在Azure上创建警报规则
创建&配置警报规则
以xxx数据库为例,我们创建一个当数据库大小大于1G的时警报规则,如下:
具体路径是 选中了数据库—>警报规则—>添加警报规则
配置webhook
在webhook上配置我们的url,以 http://xxx/webhook/receivedPhone 为例,我们在最下面的Webhook下添加地址:
配置完毕了,我们开始最重要的代码编写。
代码编写
在查看这里的代码编写之前,你可以看看微软的官方说明
可以看到,我们接收到的Json数据格式为:
{"status": "Activated","context": { "timestamp": "2015-08-14T22:26:41.9975398Z", "id": "/subscriptions/s1/resourceGroups/useast/providers/microsoft.insights/alertrules/ruleName1", "name": "ruleName1", "description": "some description", "conditionType": "Metric", "condition": { "metricName": "Requests", "metricUnit": "Count", "metricValue": "10", "threshold": "10", "windowSize": "15", "timeAggregation": "Average", "operator": "GreaterThanOrEqual" }, "subscriptionId": "s1", "resourceGroupName": "useast", "resourceName": "mysite1", "resourceType": "microsoft.foo/sites", "resourceId": "/subscriptions/s1/resourceGroups/useast/providers/microsoft.foo/sites/mysite1", "resourceRegion": "centralus", "portalLink": "https://portal.azure.com/#resource/subscriptions/s1/resourceGroups/useast/providers/microsoft.foo/sites/mysite1"},"properties": { "key1": "value1", "key2": "value2" }}
解析可以看看官网上的说明。
我们开始看看怎么代码编写吧。
这里的代码以C#为例,并且是Web Api类型的项目,我们在Webhook Contrller里添加了方法ReceivedPhone,用来接收Azure发过来的警报。因为上面已经配置了路径 ‘/webhook/receivedPhone‘
我们用WebApi来接收webhook信息,要用到System.Net.Http.HttpRequestMessage来接收信息,因为webhook是http请求。
具体代码如下:
[HttpPost] [Route("receivedPhone")] public async Task ReceivedPhone(HttpRequestMessage req) { try { dynamic data = await req.Content.ReadAsAsync
从代码可以看出,我们用到C#4中的动态语言来解析数据,来获取webhook发送过来的信息,从而避免错误。
我主要获取name、resourceName等信息,这些都是重要的信息。如果想获取其他额外的信息,请按照Json数据来添加。
其他说明
为了安全起见,我们一般都配置一个token,避免人家乱用。
例如配置的webhook地址为:
然后在ReceivedPhone方法中,添加token判断就可以了.
public async Task ReceivedPhone(HttpRequestMessage req, string token)
在这里,作者想要webhook收到信息之后发送短信来及时通知相关人员,所以我们webhook获取到相关信息后,直接发短信给相关用户。
可以关注本人的公众号,多年经验的原创文章共享给大家。