注:

将日志从 Oracle Cloud Infrastructure 移至 Sumo Logic

简介

Oracle Cloud 可观察性和可管理性平台旨在向现有客户提供有力支持。我们知道,他们已经使用流行的第三方观察工具使他们的运营状况标准化,我们希望能够与这些工具互操作,以便我们的客户可以继续使用他们在 Oracle Cloud Infrastructure (OCI) 中投入使用的工具。

在此教程中,我们将介绍如何将日志从 OCI 迁移到 Sumo Logic。Sumo Logic 是一个流行的监测工具,它提供监视和安全服务来充分了解您的应用。

我们的解决方案架构概要如下所示:

在 Sumo Logic 中创建定制 HTTP 源收集器

在 Sumo Logic 账户中,您需要创建 HTTP 定制收集器应用程序,如下面的步骤中所述。

  1. 单击 Setup Wizard(设置向导)

  2. 单击开始将数据流处理到 Sumo Logic

  3. 单击您的自定义应用程序

  4. 单击 HTTPS Source

  5. 按如下所示配置 HTTP 源。

    注意:HTTP 源是一个元数据标记,它与摄取日志一起存储,在以后在 Sumo Logic 中搜索和筛选日志时非常有用。我们将摄取的每个日志行将从其事件发生的时间戳开始,因此选择选项使用日志文件中的时区

    当您转到下一个屏幕时,我们会使用 POST HTTP 调用从 OCI 上载日志的 HTTPS 端点。请注意此端点,因为我们将配置函数以使用此端点将日志上载到 Sumo Logic。

配置要捕获的日志

您可以将任何日志设置为服务连接器中心的输入,从而摄取到 Sumo Logic。为了简化本教程,我们将捕获 Oracle Cloud Infrastructure (OCI) 生成的日志,以便将事件写入到您选择的任意存储桶。

  1. 在 Oracle Cloud 控制台中,单击导航菜单,选择日志记录,然后选择日志组

  2. 要创建日志组,请单击创建日志组

  3. 选择您的区间,为名称添加 LogGroupForBucketActivity 并添加说明。单击创建

  4. 日志记录菜单中选择日志。此时将显示类似下面的屏幕。

  5. 单击启用服务日志并输入以下信息:

    • 服务:选择对象存储
    • 资源:选择您希望看到的任意存储桶(例如 BucketForSumoLogic)。
    • 日志类别:选择写入访问事件
    • 日志名:输入日志的名称,例如 logForBucketActivity
    • 日志组:为刚才在上一步中创建的日志选择 LogGroupForBucketActivity 日志组
  6. 单击 Enable Log(启用日志)

    现在,每次对象上载到 BucketForSumoLogic 存储桶时,都会向 logForBucketActivity 日志添加一个日志条目。

配置 Oracle Functions 以将日志摄取到 Sumo Logic

  1. 在 Oracle Cloud 控制台中,单击导航菜单并选择解决方案和平台。选择开发人员服务菜单下的函数

  2. 单击创建应用程序并输入名称,例如 SumoLogicFnApp

  3. 创建应用程序后,单击应用程序名称并从资源菜单中选择入门

  4. 启动 Cloud Shell。

  5. 使用区域的上下文。

    fn list context
    fn use context us-ashburn-1
    
  6. 使用函数的区间 ID 更新上下文。

    fn update context oracle.compartment-id <compartment-id>
    
  7. 使用要使用的注册表的位置更新上下文。

    fn update context registry iad.ocir.io/<tenancy_name>/[YOUR-OCIR-REPO]
    

    iad 替换为区域的三位数区域代码。

  8. 假设您已经创建了 Auth 令牌,请使用 Auth 令牌作为密码登录注册表。

    docker login iad.ocir.io
    

    iad 替换为区域的三位数区域代码。

    系统将提示您输入以下信息:

    • 用户名:<tenancyname>/<username>
    • 密码:创建密码

    注意:如果您使用的是 Oracle Identity Cloud Service,您的用户名是 <tenancyname>/oracleidentitycloudservice/<username>。

    通过列出区间中的应用程序验证设置。

    fn list apps
    
  9. 生成“hello-world”样板函数。

    fn init --runtime python sumologicfn
    

    fn init 命令将生成一个名为 SumoLogicfn 的文件夹,其中三个文件位于 func.pyfunc.yamlrequirements.txt 中。

    打开 func.py 并使用以下代码替换文件的内容。

    1. 导入必需的 Python 模块,如以下代码片段中所示。

      import io
      import json
      import logging
      import os
      
      import requests
      from fdk import response
      
    2. 定义用于对日志数据进行语法分析的函数并调用 Sumo Logic API 以摄取日志。

      # This method is the entrypoint for your Function invokation 
      # aka the method invoked by the OCI Fn platform
      # it will receive the list of log entries from OCI as input in the form of bytestream
      # the method name will be defined in func.yml
      def handler(ctx, data: io.BytesIO = None):
          logger = logging.getLogger()
          logger.info("function start")
      
          # Sumologic endpoint URL to upload OCI logs to HTTP custom app.
          # this value will be defined defined in func.yaml
          sumologic_endpoint = os.environ['SUMOLOGIC_ENDPOINT']
      

      有关 Oracle Cloud Infrastructure Logging 服务生成的日志的格式的信息,请参阅日志记录格式概述

    3. sumologicfn 函数接收的服务连接器中心检索日志条目作为其调用有效负载。逐个循环访问这些日志条目和日志行。

      try:
          logentries = json.loads(data.getvalue()) # deserialize the bytesstream input as JSON array
          if not isinstance(logentries, list):
              logger.error('Invalid connector payload. No log queries detected')
              raise
      
          # Optional...log the input to the function as human readble JSON. 
          # Not to be used in production
          logger.info("json input from SCH")
          logger.info(data.getvalue()) 
      
          for logEntry in logentries: 
              logger.info("Extracting/Parse log details from the log entry json")
              event_name = logEntry["data"]["requestResourcePath"] + '\t'
              time_of_event = logEntry["time"] + '\t'
              cmpt_name = logEntry["data"]["compartmentName"] + '\t'
              bucket_namespace = logEntry["data"]["namespaceName"] + '\t'
              bucket_name = logEntry["data"]["bucketName"] + '\t'
              request_action = logEntry["data"]["requestAction"]
      
              log_line = time_of_event + event_name + cmpt_name + \
                          bucket_namespace + bucket_name + request_action
      
              # Call the Sumologic with the payload and ingest the OCI logs
              headers = {'Content-type': 'text/plain'}
              response_from_sumologic = requests.post(sumologic_endpoint,
                                                      data=log_line,
                                                      headers=headers)
              logging.getLogger().info(response_from_sumologic.text)
      
          logger.info("function end")
          return
      
      except Exception as e:
           logger.error("Failure in the function: {}".format(str(e)))
           raise
      
  10. 按如下方式替换 func.yml 内容。确保您为上一步中获得的 SumoLogic_ENDPOINT 提供了值。

    schema_version: 20180708
    name: sumologicfn
    version: 0.0.1
    runtime: python
    entrypoint: /python/bin/fdk /function/func.py handler
    memory: 1024
    timeout: 120
    config:
      SUMOLOGIC_ENDPOINT: [YOUR SUMOLOGIC API ENDPOINT URL HERE]
    
  11. 按如下方式替换 requirements.txt 内容。

    fdk
    requests
    
  12. 部署您的函数。

    fn -v deploy --app sumologicFnApp --no-bump
    
  13. (可选)可以使用示例输入测试 SumoLogicfn 函数,如下所示:

    curl -O https://raw.githubusercontent.com/mayur-oci/sumologicfn/main/example.json
    fn invoke sumologicFnApp sumologicfn < example.json
    

创建服务连接器以从日志记录读取日志并触发函数

  1. 在 Oracle Cloud 控制台中,单击导航菜单,然后选择解决方案和平台。在 Logging(日志记录)菜单下选择 Service Connectors(服务连接器)

  2. 单击创建连接器,然后从下拉列表中选择日志记录,然后从函数下拉列表中选择目标

  3. 配置源连接上,选择区间名称、LogGroupForBucketActivity 日志组和 logForBucketActivity 日志。

  4. 如果要使用审计日志,请单击 +Another log,选择区间并为日志组添加 _Audit

  5. 如果提示创建用于写入函数的策略,请单击创建

现在已设置服务连接器,并且每次在日志记录服务中找到日志时都将触发函数将日志摄取到 Sumo Logic。

在 Sumo Logic 中直观显示 Oracle Cloud Infrastructure 日志

  1. 在 Sumo Logic 中,选择源 - 定制应用程序菜单以查看使用 SumoLogicfn 函数从 Oracle Cloud Infrastructure (OCI) 中摄取的日志。

故障排除

本节说明如何使用简单的电子邮件警报监视解决方案的状态。

有关更多信息,请参见Overview of Functions

为通知服务创建主题和订阅

  1. 在 Oracle Cloud 控制台中,从左上角的导航菜单中,选择应用程序集成,然后选择通知

  2. 单击创建主题,然后创建名为 my_function_status 的主题。

  3. 选择您的主题,单击创建订阅并使用以下示例:

    • 协议:通过电子邮件和电子邮件添加创建订阅。
  4. 订阅将创建为“待定”状态。您将收到一封确认电子邮件,需要单击电子邮件中的链接来确认您的电子邮件地址。

检查度量并从度量创建预警定义

  1. 从左上角的导航菜单中,选择开发人员服务,然后选择函数

  2. 选择要监视的应用程序和功能。

  3. 从“度量”页面中,转到函数错误图表,单击选项,然后单击在此查询中创建预警

  4. 添加名称并在通知下选择目标服务作为通知服务,选择 your_compartment,然后选择主题作为 my_function_status。

监视状态服务连接器中心

本节说明如何使用简单的电子邮件警报监视服务连接器中心 (Service Connector Hub, SCH) 的状态。

有关更多详细信息,请参阅Service Connector Hub Overview

为通知服务创建主题和订阅

  1. 从左上角的导航菜单中,选择应用程序集成,然后选择通知

  2. 单击创建主题并使用 my_sch_status 名称创建主题。

  3. 选择您的主题,单击创建订阅并使用以下示例:

    • 协议:通过电子邮件和电子邮件添加创建订阅
  4. 订阅将创建为“待定”状态。您将收到一封确认电子邮件,需要单击电子邮件中的链接来确认您的电子邮件地址。

检查度量并从度量创建预警定义

  1. 从左上角的导航菜单中,选择 Logging(日志记录),然后选择 Service Connectors(服务连接器)

  2. 选择要监视的连接器,然后从左侧导航面板的资源列表中选择度量

  3. 从要将预警添加到的度量图表中,例如“服务连接器中心错误”,单击选项在此查询中创建预警

  4. 添加名称并在通知下选择目标服务作为通知服务,选择 your_compartment,然后选择主题作为 my_sch_status。

结论

此教程演示了 Oracle Cloud Infrastructure 和 Sumo Logic 客户如何通过低开销配置高度可扩展的解决方案,以使用服务连接器中心和 Oracle Functions 将日志从 Oracle Cloud Infrastructure Logging 迁移到 Sumo Logic。

致谢

更多学习资源

docs.oracle.com/learn 上浏览其他实验室,或者在 Oracle Learning YouTube 渠道上访问更多免费学习内容。此外,访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心