近期有小伙伴反馈在使用 Basic Azure Load Balancer 时,后端池内主机会拒绝响应探针,从而影响业务连续性。我们一般自然而然的会想到通过增加监控告警来提升响应及修复速度,但目前 Basic Azure Load Balancer 不支持提供 Metric 监控指标,Standard Load Balancer 可以提供 Metric 指标。有了指标解决了监控数据源头的问题,但是 Azure China 的小伙班还需要注意,目前 Azure China 的 Monitor 服务不支持对 Standard Load Balancer 的 Metric 来关联 Alert 告警,所以 Azure 第一方的 monitor 服务在 Azure China 目前暂时无法满足需求。本文通过 Azure Monitor 服务提供的 API 接口,通过代码完成指标抓取及告警的工作。我们先来看一下架构图:
本文主要介绍中间部分通过 API 获取 Metric 信息,然后执行事件响应操作(如发送告警邮件,短消息,或集成外部的 Webhook)。
import adal import requests import time from datetime import datetime, timedelta authentication_endpoint = 'https://login.microsoftonline.com/' resource = 'https://management.core.windows.net/' tenant_id = 'xxx' application_id ='xxx' application_secret = 'xxx' subscriptionid = 'xxx' resoucegroupname = 'xxx' loadbalancername = 'xxx' # get an Azure access token using the adal library context = adal.AuthenticationContext(authentication_endpoint + tenant_id) token_response = context.acquire_token_with_client_credentials(resource, application_id, application_secret) access_token = token_response.get('accessToken') # print(access_token) # input your monitor interval interval = 60 while True: #datetime format 2018-06-05T03:00:00Z now = datetime.utcnow() lastfivemins = datetime.utcnow() - timedelta(minutes=5) current_date_time = now.strftime("%Y-%m-%dT%H:%M:%SZ") lastfivemins_data_time = lastfivemins.strftime("%Y-%m-%dT%H:%M:%SZ") #https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/loadBalancers/{loadBalancerName}/providers/microsoft.insights/metrics?api-version=2018-01-01&metricnames=ByteCount×pan=2018-06-05T03:00:00Z/2018-06-07T03:00:00Z endpoint = 'https://management.azure.com/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/loadBalancers/%s/providers/microsoft.insights/metrics?api-version=2018-01-01&metricnames=VipAvailability×pan=%s/%s'%(subscriptionid,resoucegroupname,loadbalancername,lastfivemins_data_time,current_date_time) headers = {"Authorization": 'Bearer ' + access_token} json_output = requests.get(endpoint,headers=headers).json() mask_json_output = json_output["value"][0]["timeseries"][0]["data"] counter = 0 sum = 0 for sub in mask_json_output: sum = sum + sub["average"] counter = counter + 1 print(sum/counter) average = sum/counter if average < 1: # input your alert code herer time.sleep(interval) else: time.sleep(interval) continue
上述代码直接通过 Azure Monitor 提供的 Rest API 接口获取 Standard Load Balancer 提供的 VipAvailability 指标,该指标体现的是后端池的健康状态。当后端池全部主机处于活跃状态时,Metric 指标打点返回值为 100,当后端池中有无活跃节节点时返回值将等于0,该指标的打点频率为1mins。上述代码中我们通过每分钟抓取过去五分钟的指标并计算平均值,然后来判断是否触发告警。在访问 Azure monitor 的 Rest API 中有几个关键点,1. 确认 Endpoint URL,不同的指标 Endpoint URL 是不同的,Endpoint URL 可以参阅文档:https://docs.microsoft.com/en-us/rest/api/monitor/metrics/list;2. 返回值的 Schema,前面的文档里面有示例,最有效的办法是将返回值的 json 结果打印出来,来获得 schema 示例。3. 不同服务支持哪些 Metric 指标,可以访问如下链接:https://docs.microsoft.com/en-us/azure/azure-monitor/platform/metrics-supported
有了上述逻辑,那这个代码跑在哪里呢? 跑在一台虚拟机上?那这台虚拟机挂了怎么办?从成本和可用性的角度,这里建议大家可以把上述代码逻辑在 LogicApp 服务或 Function 服务中实现,好处是通过 PaaS 服务实现高可用,另外这两种服务都可以通过按需调用次数来收费。具体这两个服务上的配置就不在这里赘述了,大家可以按照这个上述逻辑自己玩一下。