全部產品
Search
文件中心

Simple Log Service:自訂函數開發指南

更新時間:Jul 17, 2024

當您通過Function Compute消費日誌資料時,在不同情境您可以選擇使用Log Service提供的函數模板或自訂函數。本文介紹如何構建一個自訂函數。

函數Event

在通過Function Compute消費日誌資料的過程中,步驟二需要配置函數的入口參數(函數Event),格式為一個JSON Object序列化後字串。

  • 參數說明

    參數

    說明

    jobName

    Log ServiceETL Job名稱。Function Compute服務上的Log Service觸發器對應一個Log Service的ETL Job。

    taskId

    對於一個ETL Job,taskId是某一次確定性函數調用標識。

    cursorTime

    本次函數調用包括的資料中,最後一條日誌到達Log Service的伺服器端的unix_timestamp。

    source

    該欄位由Log Service產生,Log Service根據ETL Job定義的任務間隔定時觸發函數執行,source欄位是函數Event中的重要組成部分,定義了本次函數調用的消費範圍。

    • endpoint:Project所屬地區的服務入口,詳情請參見服務入口

    • projectName:Project名稱。

    • logstoreName:Logstore名稱。

    • shardId:Logstore下的某一個確定Shard。

    • beginCursor:需要從Shard的什麼位置開始消費資料。

    • endCursor:需要消費Shard資料到什麼位置。

      說明

      Shard對應的[beginCursor,endCursor)是一個左閉右開區間。

    parameter

    JSON Object類型,在您建立觸發器函數配置時設定。自訂Log ServiceETL函數運行時解析該欄位,可以擷取到函數所需要的運行參數。詳情請參見SLS觸發器

  • 樣本

    {
        "source": {
            "endpoint": "http://cn-shanghai-intranet.log.aliyuncs.com", 
            "projectName": "fc-****************", 
            "logstoreName": "demo", 
            "shardId": 0, 
            "beginCursor": "MTUwNTM5MDI3NTY1ODcwNzU2Ng==", 
            "endCursor": "MTUwNTM5MDI3NTY1ODcwNzU2OA=="
        }, 
        "parameter": {
            ...
        }, 
        "jobName": "fedad35f51a2a97b466da57fd71f315f539d2234", 
        "taskId": "9bc06c96-e364-4f41-85eb-b6e579214ae4",
        "cursorTime": 1511429883
    }

    在函數調試時候,您可以調用GetCursor介面擷取cursor並按上述樣本構建一個函數Event用於測試。

函數開發

您可以通過Java、Python、Node.js等多種語言實現函數開發,Log Service提供了相應Runtime的SDK,以便您在函數中進行整合,詳情請參見SDK參考

以下內容以Java 8 Runtime為例,介紹如何開發Log ServiceETL函數。關於Java 8函數編程細節,詳情請參見Function Compute服務Java編程指南

  • Java函數模板

    目前,Log Service提供了基於Java8 Runtime的自訂資料範本,您可以在這基礎上完成自訂需求的實現。

    模板已實現以下功能:

    • 函數Event中source、taskId、jobName欄位的解析。

    • 根據source中定義的資料來源,通過Log Service Java SDK擷取資料,並對每一批資料調用processData介面進行處理。

    在模板中,您還需要實現以下功能:

    • 函數Event中parameter欄位的解析,通過UserDefinedFunctionParameter.java實現。

    • 函數內針對資料的自訂商務邏輯,通過UserDefinedFunction.java的processData介面實現。

    • 為您的函數取一個可以描述功能的名字,替換UserDefinedFunction

  • processData介面實現

    您可以在processData內完成對一批資料的消費、加工、投遞。例如在LogstoreReplication中,實現了將資料從一個Logstore中讀出後寫到另一個Logstore。

    說明
    • processData處理資料成功則返回true,處理資料遇到異常無法重試成功則返回false,但此時函數還會繼續運行下去,且Log Service判定這是一次成功的ETL任務,會忽略其中處理異常的資料。

    • 如果遇到致命錯誤或商務邏輯上認為有異常需要提前終止函數執行,會通過throw Exception方式跳出函數運行,Log Service可以據此判斷函數運行異常,並會按照ETL Job設定的規則重新調用函數執行。

    • 如果Shard流量較大,請為函數配置足夠的記憶體規格,以避免函數OOM導致異常終止。

    • 如果在函數內執行耗時操作或者Shard流量較大,請您設定較短的函數觸發間隔和較長的函數運行逾時時間。

    • 請您為函數服務配置足夠的許可權,例如在函數內寫OSS就需要配置OSS寫入權限。

ETL日誌

  • ETL調度日誌

    調度日誌記錄ETL任務開始時間、結束時間、任務是否成功以及成功返回的資訊。如果ETL任務出錯會產生ETL出錯日誌,並向系統管理員發送警示郵件或簡訊。請您在建立觸發器時設定觸發器日誌Logstore,並為該Logstore開啟並配置索引,詳情請參見建立索引

    對於函數執行結果的統計,可以通過函數返回,例如在Java8 Runtime函數的outputStream中體現。Log Service提供的函數模板會寫出一個JSON Object序列化後的字串,該字串將記錄在ETL任務調度日誌中,方便您進行統計、查詢。

  • ETL過程日誌

    這一部分日誌是在ETL執行過程中每執行一步記錄的關鍵點和錯誤資訊,包括某一步驟的開始和結束時間、初始化動作完成情況、模組出錯資訊等。ETL過程日誌的意義是隨時可以感知ETL運行情況,如果發生錯誤,可以及時通過過程日誌尋找原因。

    您可以通過context.getLogger()記錄過程日誌並存放在Log Service指定Project的Logstore中,建議您為該Logstore開啟索引查詢功能。