基於Serverless雲函式站點監控的方法

PetterLiu發表於2024-08-16

image

背景

現代化企業與網際網路軟體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) 最原始的技術方案:

clip_image002

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:直接採用無伺服器架構下雲函式功能,省去部署伺服器作業系統,部署運維監控軟體過程。

clip_image004

A、服務端HTTP介面:根據業務邏輯編寫與設計HTTP協議的REST服務;

B、基於無伺服器雲函式配置:為了便於運維監控,基於無伺服器的雲函式,我們可以快速配置監控指令碼,實現介面監控。

C、配置監控HTTP埠:函式工作流(FunctionGraph)是一項基於事件驅動的函式託管計算服務。透過函式工作流,只需編寫業務函式程式碼並設定執行的條件,無需配置和管理伺服器等基礎設施,函式以彈性、免運維、高可靠的方式執行

D、持續運維監控:基於運維監控軟體配置定時監控目標網站的URL是否觸達

(3)進一步的技術方案:如果步驟B是核心創新點,則針對步驟 C、自動生成介面測試程式碼進一步細化描述,

具體實施例1:基於無伺服器架構,快速構建一個一鍵自動部署的無伺服器告警推送解決方案,實現將華為雲的資源告警資訊推送到客戶指定的通知平臺(如企業微信)。

image

詳細的子流程步驟如下:

clip_image002[8]

該解決方案部署如下資源:

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編碼):

1. curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa' \

2. -H 'Content-Type: application/json' \

3. -d '

4. {

5. "msgtype": "text",

6. "text": {

7. "content": "hello world"

8. }

9. }'


函式工作流(FunctionGraph)是一項基於事件驅動的函式託管計算服務。透過函式工作流,只需編寫業務函式程式碼並設定執行的條件,無需配置和管理伺服器等基礎設施,函式以彈性、免運維、高可靠的方式執行。此外,按函式實際執行資源計費,不執行不產生費用

https://www.huaweicloud.com/product/functiongraph.html


以下是基於撥測模板 ,修改編寫的本地函式python指令碼:

# -*- coding:utf-8 -*-

import time

import json

import 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 = None

try:

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) * 1000

if 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 False

return True

函式概述
  • 目的:監控URL的響應時間和狀態碼,並在超過閾值或狀態碼錯誤時記錄告警資訊,並嘗試透過某個訊息通知服務(SMN或類似)傳送告警。
  • 輸入:event(未在此程式碼中使用),context(用於獲取日誌記錄器、使用者資料等)。
  • 輸出:一個字典,包含HTTP狀態碼、響應是否Base64編碼、響應體、和響應頭。
主要步驟
  1. 初始化:設定URL和對應的延遲閾值字典,初始化告警資訊列表,設定HTTP請求頭。

  2. 遍歷URL:對字典中的每個URL進行遍歷。

  3. 請求URL:

    • 記錄開始時間。
    • 嘗試傳送GET請求到URL,設定超時時間為3秒。
    • 捕獲並處理可能發生的超時、連線錯誤等異常。
  4. 檢查響應:

    • 如果響應狀態碼大於等於400,記錄告警資訊。
    • 計算請求響應時間(毫秒),如果超出設定的閾值,記錄告警資訊。
  5. 傳送告警:如果存在告警資訊,透過send_to_smn函式嘗試傳送告警。

  6. 結束:返回標準HTTP響應格式的字典。


在企業微信群告警通知效果

image


函式監控資料

imageimage


配置定時器

clip_image002

環境變數

image

目前透過 smn_topic_urn 引數配置企業微信群機器人Webhook-KEY


參考函式呼叫

https://support.huaweicloud.com/api-functiongraph/functiongraph_06_0125.html


結論

透過這個方案極大節約資源成本,時間成本,效率高,可靠性高實現網站HTTP埠監控。該方案整合第三方平臺,實現低成本、及時完成告警推送,進一步解鎖“端·雲一體化”的企業化運維場景。採用無伺服器架構,無需運維底層計算資源,無需考慮服務可用性、可擴充套件性等技術問題。Serverless架構在運維層面有著得天獨厚的優勢,不僅僅因為其事件觸發可以有針對性的獲取、響應一些事件,也因為其輕量化、低運維的特性讓很多運維開發者甚是喜愛。在實際生產中,如果可以將線上環境的變動以事件的形式觸發函式,由函式進行系列的運維行為操作,那麼Serverless將會在自動化運維的過程中發揮出更重要的作用和更大的價值,也會讓傳統服務的自動化運維變得更加簡單,輕便。



今天先到這兒,希望對雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 專案管理, 產品管理,資訊保安,團隊建設 有參考作用 , 您可能感興趣的文章:
構建創業公司突擊小團隊
國際化環境下系統架構演化
微服務架構設計
影片直播平臺的系統架構演化
微服務與Docker介紹
Docker與CI持續整合/CD
網際網路電商購物車架構演變案例
網際網路業務場景下訊息佇列架構
網際網路高效研發團隊管理演進之一
訊息系統架構設計演進
網際網路電商搜尋架構演化之一
企業資訊化與軟體工程的迷思
企業專案化管理介紹
軟體專案成功之要素
人際溝通風格介紹一
精益IT組織與分享式領導
學習型組織與企業
企業創新文化與等級觀念
組織目標與個人目標
初創公司人才招聘與管理
人才公司環境與企業文化
企業文化、團隊文化與知識共享
高效能的團隊建設
專案管理溝通計劃
構建高效的研發與自動化運維
某大型電商雲平臺實踐
網際網路資料庫架構設計思路
IT基礎架構規劃方案一(網路系統規劃)
餐飲行業解決方案之客戶分析流程
餐飲行業解決方案之採購戰略制定與實施流程
餐飲行業解決方案之業務設計流程
供應鏈需求調研CheckList
企業應用之效能實時度量系統演變

如有想了解更多軟體設計與架構, 系統IT,企業資訊化, 團隊管理 資訊,請關注我的微信訂閱號:

image_thumb2_thumb_thumb_thumb_thumb[1]

作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。 該文章也同時釋出在我的獨立部落格中-Petter Liu Blog。

相關文章