基于Serverless云函数站点监控的方法

文摘   2024-08-17 07:20   云南  

 

点击上方蓝字关注我们


 


背景


       现代化企业与互联网软件IT运维监控领域,传统的方法是手动编写监控脚本,手动编写监控代码。现代化系统基于B/S架构设计,网站运维过程需要基于HTTP端点进行应用层监控。传统运维监控需要搭建运维监控软件平台,有的使用Zabbix,有的使用其他厂商运维监控工具,这种方法效率低下,还需要自己部署服务器与操作系统,数据库等基础设施,消耗时间成本较大。

 


解决方案


     核心技术是 云函数(Serverless Cloud Function,SCF)是云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在云基础设施上弹性、安全地运行代码。云函数可以执行任何类型的计算任务,从服务网页和处理数据流到调用API和与其他云服务集成。

Serverless 计算的概念是指不需要维护自己的服务器来运行这些功能。云函数 SCF 是一个可完全托管的服务,为你处理所有的基础设施。因此,serverless 并不意味着不涉及任何服务器:它只是意味着服务器、操作系统、网络层和其他基础设施已经被处理好了,所以您可以专注于编写应用代码。

按量付费

在云 SCF 中,只需为功能所使用的计算量,以及产生的相关网络流量付费。对于那些在一天中的不同时间段进行大幅伸缩扩展的请求负载来说,这种类型的计费方式可以更好的节省成本。

完全托管的基础设施
     现在,代码运行在受管理的云基础设施上,不需要考虑底层服务器的问题──云为您解决了这些问题。这可以大大节省维护工作,如升级操作系统或管理网络层设施。

自动伸缩

    云函数 SCF 在代码被请求时创建实例。无需预设扩展池,无需担心扩展级别,无需进行设置──同时,不管请求增加或减少,你的服务都可用。您只需为每个函数的运行时间付费。与其他云产品紧密集成。云函数 SCF 与 API 网关、云存储和云数据库等。服务集成,使您能够在 SCF 函数中构建功能完整的应用程序。

高弹性 

     根据请求的并发数量自动调度资源运行函数,实现透明、准确和实时的伸缩,应付业务峰值的访问。用户无需关心峰值和空闲时段的资源需要申请多少资源,系统根据请求的数量自动扩容/缩容。自动负载均衡将请求分发到函数运行实例。同时系统会根据流量负载的模式来智能预热实例,以缓解冷启动对业务的影响。

事件触发

     通过事件触发机制,集成多种云服务,满足不同场景需求,获得高效的开发体验。与云日志服务、云监控服务对接,无需任何配置,即可查询函数日志和监控告警信息,快速排查故障。

高可用

     函数运行实例出现异常,系统会启动新的实例处理后续的请求,故障函数实例占用资源将会回收使用。

按量计费

根据代码的调用次数和运行时长计费,代码未运行时不产生费用。

a. 解决基于HTTP接口快速运维监控,过程如下:

1、编写简单脚本片段代码
2、部署脚本到serverless无服务器环境
3、配置云函数
4、配置定时器
5、配置消息通知渠道

 


基于Serverless实现自动化监控的优点


 

1、无需部署运维监控软件与独立服务器资源,直接使用公有云
2、监控程序与应用系统是分离的
3、可灵活配置多渠道通知
4、支持以下多种语言,编写即可使用, 如Node.js, Python

概要示例:

(1) 最原始的技术方案:

A、服务端编写监控HTTP接口:根据监控需求编写与设计HTTP协议的REST服务接口,如JAVA应用中在SpringBoot项目中Actuator模块提供了众多HTTP接口端点(Endpoint),来提供应用程序运行时的内部状态信息。;

B、部署服务器搭建监控软件:安装服务器操作系统如Liunx,进行相关防火墙配置,

操作系统配置,基础设施软件安装与部署。部署监控应用软件, 如Zabbix。

C、配置监控HTTP端口:为了确保系统应用运维监控流程,需要测试监控HTTP接口功能,编写脚本代码,然后在运维监控软件Zabbix配置HTTP端点的监控。创建新的Web场景,添加一个场景来监控Zabbix的Web界面。该场景将执行多个步骤。点击配置->主机->选择主机->单击Web监测->创建Web监测。场景第2步,定义场景的步骤,定义场景的步骤->点击步骤->点击添加按钮。

D、持续运维监控:基于运维监控软件配置定时监控目标网站的URL是否触达

(2)进一步的技术方案:替换步骤B:直接采用无服务器架构下云函数功能,省去部署服务器操作系统,部署运维监控软件过程。

A、服务端HTTP接口:根据业务逻辑编写与设计HTTP协议的REST服务;

B、基于无服务器云函数配置:为了便于运维监控,基于无服务器的云函数,我们可以快速配置监控脚本,实现接口监控。

C、配置监控HTTP端口:函数工作流(FunctionGraph)是一项基于事件驱动的函数托管计算服务。通过函数工作流,只需编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数以弹性、免运维、高可靠的方式运行

D、持续运维监控:基于运维监控软件配置定时监控目标网站的URL是否触达。

(3)进一步的技术方案:如果步骤B是核心创新点,则针对步骤 C、自动生成接口测试代码进一步细化描述,

具体实施例1:基于无服务器架构,快速构建一个一键自动部署的无服务器告警推送解决方案,实现将华为云的资源告警信息推送到客户指定的通知平台(如企业微信)。

详细的子流程步骤如下:

该解决方案部署如下资源:

1. 监控HTTP端点,当网站监控HTTP接口状态变化触发告警规则设置的阈值时,您将收到告警通知。
2. 编写监控脚本代码片段,包含需要拨测目标网站HTTP端点。(可选)消息通知服务 SMN,用于接受来自云监控服务 CES的告警数据,并触发函数工作流 FunctionGraph进行告警推送。
3. 函数工作流 FunctionGraph,该方案利用函数工作流 FunctionGraph调用第三方接口推送告警信息,以消息通知服务 SMN主题作为触发器。

查看已创建函数的“调用次数”、“成功率”和“平均时延”指标的统计数据,并可点击“查看详情”进入函数详情页查询具体的函数类和实例类指标监控数据,比如“服务端错误”、“函数错误”、“触发器请求入队”、“触发器请求积压数”、“超时次数”、“平均CPU使用情况”等。


实践


 

基于企业微信群机器人webhook集成

     在终端某个群组添加机器人之后,创建者可以在机器人详情页看的该机器人特有的webhookurl。开发者可以按以下说明a向这个地址发起HTTP POST 请求,即可实现给该群组发送消息。下面举个简单的例子.

假设webhook是:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa

特别特别要注意:一定要保护好机器人的webhook地址,避免泄漏!不要分享到github、博客等可被公开查阅的地方,否则坏人就可以用你的机器人来发垃圾消息了。

以下是用curl工具往群组推送文本消息的示例(注意要将url替换成你的机器人webhook地址,content必须是utf8编码):

curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa' \ -H 'Content-Type: application/json' \ -d ' { "msgtype": "text", "text": { "content": "hello world" }}'


     函数工作流(FunctionGraph)是一项基于事件驱动的函数托管计算服务。通过函数工作流,只需编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数以弹性、免运维、高可靠的方式运行。此外,按函数实际执行资源计费,不执行不产生费用

以下是基于拨测模板 ,修改编写的本地函数python脚本:


# -*- coding:utf-8 -*-import timeimport jsonimport requests
def handler (event, context): logger = context.getLogger()# Replace the URL and latency threshold to be tested. url_latency_threshold_dict = {'http://ip/xzspnet/commonOrgManage/getOrgs/children?id=530000001&isAcceptOrg=1&order=xzqm':300,'http://ip/xzspnet/commonOrgManage/getOrgs/children?id=530000001&isAcceptOrg=1&order=xzqm':500 }
alarm_info = [] headers = {"Accept": 'application/json' }for url,latency_threshold in url_latency_threshold_dict.items(): start_time = time.time() resp = Nonetry: resp = requests.get(url, headers=headers,timeout=3)except ( requests.exceptions.Timeout, requests.exceptions.ConnectionError, requests.exceptions.ConnectTimeout) as e: logger.error("Access '" + url + "' failed,err=" + str(e)) alarm_info.append("Access '" + url + "' timeout")else: latency = (time.time() - start_time) * 1000if resp.status_code >= 400: alarm_info.append("Access '" + url + "' failed,status code=" + str(resp.status_code))elif latency > latency_threshold: alarm_info.append("Access '" + url + "' latency=" + str(format(latency, '.1f')))if len(alarm_info) != 0: logger.info("Send msg=" + json.dumps(alarm_info)) msg = {"msgtype": "text","text": {"content": json.dumps(alarm_info) } } send_to_smn(msg, context)
return {"statusCode": 200,"isBase64Encoded": False,"body": "","headers": {"Content-Type": "application/json" } }
def send_to_smn(msg, context): endpoint = context.getUserData('smn_endpoint')if not endpoint: context.getLogger().error("Environment variable 'smn_endpoint' must be configured")return False topic_urn = context.getUserData('smn_topic_urn')if not topic_urn: context.getLogger().error("Environment variable 'smn_topic_urn' must be configured")return False project_id = context.getUserData('smn_project_id')if not project_id: context.getLogger().error("Environment variable 'smn_project_id' must be configured")return False
url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=%s' % (topic_urn) headers = {"x-auth-token": context.getToken(),"content-type": 'application/json;charset=UTF-8' }
resp = requests.post(url, json=msg, headers=headers)if resp.status_code >= 400: context.getLogger().error("Send msg failed,status code=" + str(resp.status_code) + ",body=" + str(resp.content))return Falsereturn True

函数概述
  • 目的:监控URL的响应时间和状态码,并在超过阈值或状态码错误时记录告警信息,并尝试通过某个消息通知服务(SMN或类似)发送告警。

  • 输入:event(未在此代码中使用),context(用于获取日志记录器、用户数据等)。

  • 输出:一个字典,包含HTTP状态码、响应是否Base64编码、响应体、和响应头。

主要步骤
  1. 初始化:设置URL和对应的延迟阈值字典,初始化告警信息列表,设置HTTP请求头。

  2. 遍历URL:对字典中的每个URL进行遍历。

  3. 请求URL:

  • 记录开始时间。

  • 尝试发送GET请求到URL,设置超时时间为3秒。

  • 捕获并处理可能发生的超时、连接错误等异常。

  • 检查响应:

    • 如果响应状态码大于等于400,记录告警信息。

    • 计算请求响应时间(毫秒),如果超出设定的阈值,记录告警信息。

  • 发送告警:如果存在告警信息,通过send_to_smn函数尝试发送告警。

  • 结束:返回标准HTTP响应格式的字典。


  • 在企业微信群告警通知效果


    函数监控数据


    配置定时器


    环境变量


    目前通过 smn_topic_urn 参数配置企业微信群机器人Webhook-KEY



    结论


           通过这个方案极大节约资源成本,时间成本,效率高,可靠性高实现网站HTTP端口监控。该方案集成第三方平台,实现低成本、及时完成告警推送,进一步解锁“端·云一体化”的企业化运维场景。采用无服务器架构,无需运维底层计算资源,无需考虑服务可用性、可扩展性等技术问题。Serverless架构在运维层面有着得天独厚的优势,不仅仅因为其事件触发可以有针对性的获取、响应一些事件,也因为其轻量化、低运维的特性让很多运维开发者甚是喜爱。在实际生产中,如果可以将线上环境的变动以事件的形式触发函数,由函数进行系列的运维行为操作,那么Serverless将会在自动化运维的过程中发挥出更重要的作用和更大的价值,也会让传统服务的自动化运维变得更加简单,轻便。 

    Megadotnet
    为您介绍各体系平台的新闻,系统研发相关框架,组件,方法,过程,运维,设计。企业IT与互联网信息系统或产品解决方案。开源项目,项目管理。
     最新文章