Serverless实践系列(七):“定制”业务告警功能

在使用云产品的时,部分业务可能会需要“定制化”告警功能,那么,如何快速做一个定制化的告警系统呢?本文将会通过腾讯云云API对Kafka消息积压数量进行监控(在通用云监控部分不提供这个指标的告警),当超过阈值,通过Email以及企业微信和短信等进行业务告警。

云API对数据进行获取


说到云API数据获取部分,这里就要向大家推荐一款好用的产品:Explorer,这个产品可以帮助节省很多力气,本文也是通过Explorer来进行鉴权和监控数据获取的工作:

鉴权部分(已经去掉了我个人的SecretId和Key,如果使用请自行添加,但是注意不要泄漏):

API 2.0签名地址:https://cloud.tencent.com/document/product/215/1693

 
 

def GetSignature(param):
# 公共参数
param["SecretId"] = ""
param["Timestamp"] = int(time.time())
param["Nonce"] = random.randint(1, sys.maxsize)
param["Region"] = "ap-guangzhou"
# param["SignatureMethod"] = "HmacSHA256"

# 生成待签名字符串
sign_str = "GETckafka.api.qcloud.com/v2/index.php?"
sign_str += "&".join("%s=%s" % (k, param[k]) for k in sorted(param))

# 生成签名
secret_key = ""
if sys.version_info[0] > 2:
sign_str = bytes(sign_str, "utf-8")
secret_key = bytes(secret_key, "utf-8")
hashed = hmac.new(secret_key, sign_str, hashlib.sha1)
signature = binascii.b2a_base64(hashed.digest())[:-1]
if sys.version_info[0] > 2:
signature = signature.decode()

# 签名串编码
signature = urllib.parse.quote(signature)
return signature

获取Kafka数据积压量

Kafka地址文档:https://cloud.tencent.com/product/ckafka

获取积压数据的API:https://cloud.tencent.com/document/product/597/30030

 
 

def GetGroupOffsets(max_lag, phoneList):
param = {}
param["Action"] = "GetGroupOffsets"
param["instanceId"] = ""
param["group"] = ""
signature = GetSignature(param)

# 生成请求地址
param["Signature"] = signature
url = "https://ckafka.api.qcloud.com/v2/index.php?Action=GetGroupOffsets&"
url += "&".join("%s=%s" % (k, param[k]) for k in sorted(param))

req_attr = urllib.request.urlopen(url)
res_data = req_attr.read().decode("utf-8")
json_data = json.loads(res_data)

for eve_topic in json_data['data']['topicList']:
temp_lag = 0
result_list = []
for eve_partition in eve_topic["partitions"]:
lag = eve_partition["lag"]
temp_lag = temp_lag + lag

if temp_lag > max_lag:
result_list.append(
{
"topic": eve_topic["topic"],
"lag": lag
}
)

print(result_list)
if len(result_list)>0:
KafkaLagRobot(result_list)
KafkaLagSMS(result_list,phoneList)

接入企业微信


这里先贴一个企业微信的机器人地址:https://work.weixin.qq.com/api/doc#search

通过企业微信机器人配置,可以获得一个Webhook,编写告警代码:

(已经删除掉了企业微信的webhook,请自行添加到url中)

 
 

def KafkaLagRobot(content):

url = ""
data = {
"msgtype": "markdown",
"markdown": {
"content": content,
}
}
data = str(json.dumps(data)).encode("utf-8")
print(urllib.request.urlopen(urllib.request.Request(url, data)).read().decode("utf-8"))

接入腾讯云短信服务

(已经删掉部分敏感信息)

短信页面地址:https://cloud.tencent.com/product/sms

 
 

def KafkaLagSMS(infor, phone_list):

random_data = random.randint(1, sys.maxsize)
url = ""
strMobile = phone_list
strAppKey = ""
strRand = str(random_data)
strTime = int(time.time())
sig = hashlib.sha256()
sig.update(
("appkey=%s&random=%s&time=%s&mobile=%s" % (strAppKey, random_data, strTime, ",".join(strMobile))).encode(
"utf-8"))

phone_dict = []
for eve_phone in phone_list:
phone_dict.append(
{
"mobile": eve_phone,
"nationcode": "86"
}
)

data = {
"ext": "",
"extend": "",
"params": [
infor,
],
"sig": sig.hexdigest(),
"sign": "你的sign",
"tel": phone_dict,
"time": strTime,
"tpl_id": 你的模板id
}
data = str(json.dumps(data)).encode("utf-8")
print(urllib.request.urlopen(urllib.request.Request(url=url, data=data)).read().decode("utf-8"))

发送邮件告警

可以参考之前的Demo:https://cloud.tencent.com/developer/article/1419135

 
 

def sendEmail(content, to_user):
sender = 'service@anycodes.cn'
receivers = [to_user]

mail_msg = content
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("监控", 'utf-8')
message['To'] = Header("站长", 'utf-8')

subject = "告警"
message['Subject'] = Header(subject, 'utf-8')

try:
smtpObj = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465)
smtpObj.login('service@anycodes.cn', '密码')
smtpObj.sendmail(sender, receivers, message.as_string())
except smtplib.SMTPException:
pass

整合代码


此时我们只需要将所有的代码,通过一些逻辑进行整合即可:

 
 

# -*- coding: utf8 -*-
import json
import binascii
import hashlib
import hmac
import random
import sys
import ssl
import time
import urllib.parse
import urllib.request
import smtplib
from email.mime.text import MIMEText
from email.header import Header
ssl._create_default_https_context = ssl._create_unverified_context

def sendEmail(infor):

temp_str = 'Topic:%s,积压数据量:%d;'
content = ""
for eve_infor in infor:
content = content + temp_str % (eve_infor["topic"], eve_infor["lag"])

sender = 'service@anycodes.cn'
receivers = ["service@anycodes.cn"]

mail_msg = content
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("监控", 'utf-8')
message['To'] = Header("站长", 'utf-8')

subject = "告警"
message['Subject'] = Header(subject, 'utf-8')

try:
smtpObj = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465)
smtpObj.login('service@anycodes.cn', '密码')
smtpObj.sendmail(sender, receivers, message.as_string())
except smtplib.SMTPException:
pass

def KafkaLagRobot(infor):
base_str = "Kafka消费者监控提醒:\n"
temp_str = '>Topic:<font color="comment">%s</font>,积压数据量:<font color="warning">%d</font>条;\n'
content = ""
for eve_infor in infor:
content = content + temp_str % (eve_infor["topic"], eve_infor["lag"])

content = base_str + content

url = ""
data = {
"msgtype": "markdown",
"markdown": {
"content": content,
}
}
data = str(json.dumps(data)).encode("utf-8")
print(urllib.request.urlopen(urllib.request.Request(url, data)).read().decode("utf-8"))


def KafkaLagSMS(infor, phone_list):

temp_str = 'Topic:%s,积压数据量:%d;'
content = ""
for eve_infor in infor:
content = content + temp_str % (eve_infor["topic"], eve_infor["lag"])

random_data = random.randint(1, sys.maxsize)
url = ""
strMobile = phone_list
strAppKey = ""
strRand = str(random_data)
strTime = int(time.time())
sig = hashlib.sha256()
sig.update(
("appkey=%s&random=%s&time=%s&mobile=%s" % (strAppKey, random_data, strTime, ",".join(strMobile))).encode(
"utf-8"))

phone_dict = []
for eve_phone in phone_list:
phone_dict.append(
{
"mobile": eve_phone,
"nationcode": "86"
}
)

data = {
"ext": "",
"extend": "",
"params": [
content,
],
"sig": sig.hexdigest(),
"sign": "",
"tel": phone_dict,
"time": strTime,
"tpl_id":
}
data = str(json.dumps(data)).encode("utf-8")
print(urllib.request.urlopen(urllib.request.Request(url=url, data=data)).read().decode("utf-8"))


def GetSignature(param):
# 公共参数
param["SecretId"] = ""
param["Timestamp"] = int(time.time())
param["Nonce"] = random.randint(1, sys.maxsize)
param["Region"] = "ap-guangzhou"
# param["SignatureMethod"] = "HmacSHA256"

# 生成待签名字符串
sign_str = "GETckafka.api.qcloud.com/v2/index.php?"
sign_str += "&".join("%s=%s" % (k, param[k]) for k in sorted(param))

# 生成签名
secret_key = ""
if sys.version_info[0] > 2:
sign_str = bytes(sign_str, "utf-8")
secret_key = bytes(secret_key, "utf-8")
hashed = hmac.new(secret_key, sign_str, hashlib.sha1)
signature = binascii.b2a_base64(hashed.digest())[:-1]
if sys.version_info[0] > 2:
signature = signature.decode()

# 签名串编码
signature = urllib.parse.quote(signature)
return signature


def GetGroupOffsets(max_lag, phoneList):
param = {}
param["Action"] = "GetGroupOffsets"
param["instanceId"] = ""
param["group"] = ""
signature = GetSignature(param)

# 生成请求地址
param["Signature"] = signature
url = "https://ckafka.api.qcloud.com/v2/index.php?Action=GetGroupOffsets&"
url += "&".join("%s=%s" % (k, param[k]) for k in sorted(param))

req_attr = urllib.request.urlopen(url)
res_data = req_attr.read().decode("utf-8")
json_data = json.loads(res_data)

for eve_topic in json_data['data']['topicList']:
temp_lag = 0
result_list = []
for eve_partition in eve_topic["partitions"]:
lag = eve_partition["lag"]
temp_lag = temp_lag + lag

if temp_lag > max_lag:
result_list.append(
{
"topic": eve_topic["topic"],
"lag": lag
}
)

print(result_list)
if len(result_list)>0:
KafkaLagRobot(result_list)
KafkaLagSMS(result_list,phoneList)
sendEmail(result_list)

def main_handler(event, context):
# 发送短信的列表
phone_list = ["PhoneNumber"]
GetGroupOffsets(2000, phone_list)
return True

总结

腾讯云云函数SCF是一个非常有趣、且非常有价值的产品。我之前做了一个项目,由于临时需要增加一个活动模块,但是不想修改源代码,就通过腾讯云云函数SCF对数据库进行增删改查,增加了点逻辑代码,与API网关结合,很快上线,开发过程非常愉快。

其实在生活中,灵活运用一个产品或者几个产品结合使用,是非常有趣的,同时正确应用一款产品,也会让你的工作事半功倍,本文主要通过云API对云监控数据进行获取,获取到Kafka数据积压量,进行一个逻辑处理,然后调用了发送邮件的方法、发送短信的方法以及发送企业微信的方法,实现了监控告警功能,经过使用时间触发器:

640?wx_fmt=png

640?wx_fmt=png

效果良好,也成功实现了基本告警功能。写本文的目的,也是希望大家,可以通过这样的一个Demo,将其应用到自己的项目中,发挥更大的价值,定制更有趣、更有价值、更加灵活多变的告警策略,服务项目。

【SCF实践系列】是腾讯云Serverless团队策划的SCF场景落地系列案例指导,旨在帮忙开发者了解SCF可应用的场景及其实现方式。同时,我们也欢迎大家分享、反馈SCF相关技术实践、产品体验问题及建议等,一经选用,即有精美礼品送,欢迎大家留言或者邮箱投稿~

【投稿邮箱】liujiang@tencent.com



活动推荐


Hello Serverless 技术沙龙「深圳站」来了!


这场沙龙将围绕腾讯云 Serverless 2.0 的运行原理、应用场景,腾讯云云函数的架构设计、冷启动优化、本地开发调试,以及 Serverless 在乐凯撒新餐饮服务上的应用实践,从 0 到 1 介绍 Serverless 2.0,与开发者一同交流未来的无服务器形态。

活动时间:2019 年 8 月 17 日 13:00-17:30

活动地点:深圳市南山区深南大道 10000 号腾讯大厦 2F 多功能厅

640?wx_fmt=jpeg

点击文末 阅读原文 即可报名参会

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值