全部產品
Search
文件中心

Function Compute:Custom Runtime支援Loggie Agent日誌擴充

更新時間:Jul 06, 2024

Loggie是一個基於Golang的輕量級、高效能的雲原生日誌採集Agent。您可以在自訂運行時的函數中使用Loggie Agent從檔案中採集日誌,然後上傳到Log ServiceSLS進行日誌的儲存和自訂分析。

前提條件

已建立記錄項目和日誌庫。具體操作,請參見建立專案Project建立Logstore

重要

建立的記錄項目必須和要建立的函數在相同地區。

操作步驟

步驟一:建立函數

  1. 登入Function Compute控制台,在左側導覽列,單擊函數

  2. 在頂部功能表列,選擇地區,然後在函數頁面,單擊建立函數

  3. 建立函數頁面,配置以下配置項,其他配置項使用預設值,然後單擊建立。詳細內容請參見建立函數

    • 建立函數的方式:Web函數

    • 基本設定:設定函數名稱

    • 函數代碼:配置函數的運行環境和代碼相關資訊。

      配置項

      樣本

      運行環境

      Python 3.9

      代碼上傳方式

      選擇通過檔案夾上傳代碼。其中上傳的檔案夾名稱為codecode目錄下的檔案為app.pyapp.py的程式碼範例內容如下。

      from flask import Flask
      from flask import request
      import logging
      import os
      
      REQUEST_ID_HEADER = 'x-fc-request-id'
      
      app = Flask(__name__)
      
      format_str = '[%(asctime)s] %(levelname)s in %(module)s: %(message)s'
      logging.basicConfig(filename='/tmp/log/fc-flask.log', filemode='w', 
          format=format_str, encoding='utf-8', level=logging.DEBUG)
      @app.route("/invoke", methods = ["POST"])
      def hello_world():
          rid = request.headers.get(REQUEST_ID_HEADER)
          logger = logging.getLogger()
      
          print("FC Invoke Start RequestId: " + rid)
          logger.info("FC Invoke Start RequestId: " + rid)
      
          data = request.stream.read()
          print(str(data))
          logger.info("receive event: {}".format(str(data)))
          
          print("FC Invoke End RequestId: " + rid)
          logger.info("FC Invoke Start RequestId: " + rid)
          return "Hello, World!"
      
      if __name__ == '__main__':
          app.run(host='0.0.0.0',port=9000)
      說明

      您可以修改代碼中配置的filename='/tmp/log/fc-flask.log'為指定的日誌類型及日誌位置,該配置需要和步驟二中的sources.paths路徑保持一致。

      啟動命令

      /code/bootstrap

      說明

      bootstrap檔案在步驟二會建立。

      監聽連接埠

      9000

步驟二:建立bootstrap檔案作為啟動命令

  1. 函數建立成功後,在代碼頁簽使用WebIDE在code目錄下建立bootstrap檔案。

    bootstrap檔案樣本內容如下。

    #!/bin/bash
    
    # 1. 建立pipelines.yml檔案
    mkdir -p /tmp/log /code/etc
    cat << EOF > /code/etc/pipelines.yml
    pipelines:
      - name: demo
        sources:
          - type: file
            name: fc-demo
            addonMeta: true
            fields:
              topic: "loggie"
            fieldsUnderRoot: true
            paths:
              - "/tmp/log/*.log"
        sink:
          type: sls
          endpoint: ${LOGGIE_SINK_SLS_ENDPOINT}
          accessKeyId: ${LOGGIE_SINK_SLS_ACCESS_ID}
          accessKeySecret: ${LOGGIE_SINK_SLS_ACCESS_SECRET}
          project: ${LOGGIE_SINK_SLS_PROJECT}
          logstore: ${LOGGIE_SINK_SLS_LOGSTORE}
          topic: ${LOGGIE_SINK_SLS_TOPIC}
    EOF
    
    # 2. 建立loggie.yml檔案
    cat << EOF > /code/etc/loggie.yml
    EOF
    
    # 3. 啟動Loggie Agent,作為後台進程運行
    /opt/bin/loggie -config.system=/code/etc/loggie.yml -config.pipeline=/code/etc/pipelines.yml > /tmp/loggie.log 2>&1 &
    
    # 4. 啟動應用程式
    exec python app.py

    該指令碼會執行的操作如下:

    1. 建立設定檔pipelines.ymlpipelines.yml為Pipeline設定檔。

      • sources

        用於指定日誌的類型和日誌所在位置。本樣本展示如何採集/tmp/log目錄下所有以.log結尾的檔案中的日誌。

        sources配置中的addonMeta表示添加預設的日誌採集state元資訊。更多關於sources的配置,請參見Source通用配置

      • sink

        用於指定Log Service相關資訊。指令碼中的變數會在步驟四設定。

    2. 建立設定檔loggie.ymlloggie.yml為Loggie的系統設定檔。

      檔案為空白,表示為預設配置。本文樣本採用預設配置方法,loggie.yml檔案必須存在。檔案不為空白時,其具體參數請參見Loggie系統配置

    3. 啟動Loggie Agent,作為後台進程運行。Loggie Agent作業記錄會列印到/tmp/loggie.log

    4. 啟動應用程式。本文樣本使用Python運行,請按照實際情況填寫。

  2. 設定bootstrap檔案許可權為可執行許可權。

    在WebIDE中選擇Terminal > New Terminal,執行chmod 777 bootstrap命令設定檔案許可權。

  3. 單擊部署代碼,完成代碼的部署。

步驟三:添加官方公用層Loggie Agent

  1. 單擊配置頁簽,選擇左側頁簽,在地區單擊編輯

  2. 在編輯函數層面板,選擇添加層 > 添加官方公用層,配置Loggie Agent。

    關於Loggie Agent公用層的相關資訊如下。

    層名稱

    相容的運行時

    層版本

    ARN

    Loggie Agent

    自訂運行時

    本文樣本使用層版本1。

    acs:fc:{region}:official:layers/Loggie13x/versions/1

  3. 單擊部署,完成Loggie Agent層的添加。

步驟四:設定環境變數

  1. 配置頁簽,選擇左側環境變數頁簽,單擊編輯

  2. 在編輯函數環境變數面板,添加如下環境變數。關於如何配置環境變數,請參見配置環境變數

    • 設定環境變數FC_EXTENSION_SLS_LOGGIE=true

      添加該環境變數後,在一次函數調用結束時,不會立刻凍結函數執行個體,會等待10s再凍結函數執行個體,以確保Loggie Agent擴充成功上報日誌。

      重要

      該方式會有額外的收費,收費策略與執行個體的Prefreeze回調相同。具體資訊,請參見計費說明

    • 設定pipelines.yml檔案中的環境變數,包括LOGGIE_SINK_SLS_ENDPOINTLOGGIE_SINK_SLS_ACCESS_IDLOGGIE_SINK_SLS_ACCESS_SECRETLOGGIE_SINK_SLS_PROJECTLOGGIE_SINK_SLS_LOGSTORELOGGIE_SINK_SLS_TOPIC

      環境變數

      說明

      LOGGIE_SINK_SLS_ENDPOINT

      Log Service的服務入口。更多資訊,請參見服務入口

      LOGGIE_SINK_SLS_ACCESS_ID

      阿里雲AccessKey ID。如何擷取AccessKey ID,請參見存取金鑰

      LOGGIE_SINK_SLS_ACCESS_SECRET

      阿里雲AccessKey Secret。如何擷取AccessKey Secret,請參見存取金鑰

      LOGGIE_SINK_SLS_PROJECT

      目標Logstore所在的Project。

      LOGGIE_SINK_SLS_LOGSTORE

      用於儲存日誌的Logstore。

      LOGGIE_SINK_SLS_TOPIC

      日誌主題,自訂設定。

  3. 單擊部署。函數配置更新後,可以支援將函數執行日誌通過Loggie上傳到Log Service。

步驟四:驗證結果

  1. 代碼頁簽,單擊測試函數,通過控制台調試函數。

    配置完成後,首次調試日誌可能會有一些延遲,建議多調用幾次。

  2. 登入Log Service控制台,按照pipelines.yml檔案中配置的地區、Project和Logstore查詢日誌。樣本如下。

    image

    • body:日誌資訊。

    • state.*:日誌採集state元資訊,其中hostname為函數運行所在的執行個體ID。

問題排查

Loggie Agent獨立運行在函數執行個體中,Function Compute平台無法感知Loggie Agent是否正常,Loggie Agent運行異常也不會影響函數的正常執行。

如果在Log Service中無法查詢到Loggie Agent相關日誌時(會有秒級的延時),可參考以下流程進行排查。

函數運行正常

如果函數運行正常,在調用後函數執行個體會存活一段時間(一般是幾分鐘),可以登入執行個體查看Loggie Agent的運行狀態和日誌資訊。關於登入執行個體的具體操作,請參見執行個體命令列操作

  • 如果沒有日誌資訊,可以在命令列嘗試啟動Loggie Agent。

  • 如果Loggie有日誌資訊,根據日誌資訊排查。

    • 確認pipelines.yml檔案是否配置正確。

    • 確認是否成功啟動SLS sink配置。日誌類似pipeline sink(sink/sls)-0 invoke loop start

    • 確認是否擷取到記錄檔。日誌類似start collect file: /tmp/log/fc-flask.log。如果沒有類似日誌,按照pipelines.yml檔案配置中的paths路徑,確認是否有記錄檔產生。

說明

首次接入SLS Logstore可能會有一定延時,如果日誌一切正常,可以多次觸發調用函數,等待幾分鐘後再查詢日誌。

函數運行失敗

Loggie Agent作為外部擴充,一般不會影響函數的正常運行,可以先將Loggie Agent啟動邏輯移除,排查函數運行是否正常。如果出現進程異常退出或者執行逾時的報錯,可以嘗試調大記憶體或CPU規格。

相關文檔

  • 在本文樣本中,Loggie採集到日誌後原樣上傳,沒有經過任何加工處理。如果需要對日誌資料加工後再上傳,例如解析JSON格式、移除DEBUG日誌等,可以在pipelines.yml中添加Interceptor配置,具體請參見 Loggie-Interceptor