Cenário: Enviando Dados de Log para um Autonomous Database

Enviar dados de log do serviço Logging para um Autonomous Database usando uma função (serviço Functions).

Esse cenário envolve a criação de uma função e, em seguida, a referência a essa função em um conector (Connector Hub) para processar e mover dados de log do serviço Logging para um Autonomous Database.

Política Obrigatória do Serviço IAM

Se você for membro do grupo Administradores, já terá o acesso necessário para executar esse cenário. Caso contrário, você precisará de acesso ao serviço Functions.

O workflow para criar o conector inclui uma política padrão quando necessário para fornecer permissão para gravar no serviço de destino. Se você não estiver familiarizado com políticas, consulte Visão Geral de Políticas do Serviço IAM.

Configurando este Cenário

Esse cenário envolve a criação de um conector (Connector Hub) para enviar dados de log do Logging para um Autonomous Database (JSON).

Para poder criar o conector, configure um Autonomous JSON Database que você queira receber os dados de log e configure a função para copiar esses dados de log.

Detalhes da configuração do Autonomous JSON Database:

  • Provisionar Autonomous Database
  • Duplicar a aba do navegador.
  • Na guia duplicada, copie o URL base do ORDS: Na página de detalhes do Autonomous Database, selecione Console de Serviço, selecione Desenvolvimento e, em seguida, selecione Copiar em RESTful Serviços e SODA.'
  • Crie uma coleção "logs" para armazenar os dados de log que serão movidos pela função e pelo conector:
    1. Volte à página de detalhes do Autonomous Database (a aba original do browser).

    2. Selecione Database Actions.

    3. Faça log-in com o usuário admin e a senha definida quando você criou o banco de dados.

      A janela Ações do Banco de Dados | Launchpad é exibida.

    4. Selecione SQL.

      A janela Ações do Banco de Dados | SQL é exibida.

    5. Digite o seguinte comando:

      soda create logs
    6. Selecione Executar Instrução (Executar Instrução).

    Para consultar documentos na coleta após o conector copiar dados de log, informe o seguinte comando:

    soda get logs -f {}

Detalhes da configuração da função:

Depois que o banco de dados e a função forem configurados, você estará pronto para criar o conector. A criação do conector é fácil na Console. Como alternativa, você pode usar a CLI ou a API do Oracle Cloud Infrastructure, que permite que você mesmo execute as operações individuais.

Amostra do código da função

A amostra de código a seguir destina-se a uma função para enviar dados de log do serviço Logging para um Autonomous Database. Para obter instruções sobre como criar e implantar funções, consulte Criando e Implantando o Serviço Functions.

Observação

O exemplo de código a seguir não se destina a cargas de trabalho de produção. Atualize-o para o ambiente de produção.
import io
import json
import logging
import requests

from fdk import response

# soda_insert uses the Autonomous Database REST API to insert JSON documents
def soda_insert(ordsbaseurl, dbschema, dbuser, dbpwd, collection, logentries):
    auth=(dbuser, dbpwd)
    sodaurl = ordsbaseurl + dbschema + '/soda/latest/'
    bulkinserturl = sodaurl + 'custom-actions/insert/' + collection + "/"
    headers = {'Content-Type': 'application/json'}
    resp = requests.post(bulkinserturl, auth=auth, headers=headers, data=json.dumps(logentries))
    return resp.json()

def handler(ctx, data: io.BytesIO=None):
    logger = logging.getLogger()
    logger.info("function start")

    # Retrieving the Function configuration values
    try:
        cfg = dict(ctx.Config())
        ordsbaseurl = cfg["ordsbaseurl"]
        dbschema = cfg["dbschema"]
        dbuser = cfg["dbuser"]
        dbpwd = cfg["dbpwd"]
        collection = cfg["collection"]
    except:
        logger.error('Missing configuration keys: ordsbaseurl, dbschema, dbuser, dbpwd and collection')
        raise
    
    # Retrieving the log entries from Connector Hub as part of the Function payload
    try:
        logentries = json.loads(data.getvalue())
        if not isinstance(logentries, list):
            raise ValueError
    except:
        logger.error('Invalid payload')
        raise
    
    # The log entries are in a list of dictionaries. We can iterate over the the list of entries and process them.
    # For example, we are going to put the Id of the log entries in the function execution log
    logger.info("Processing the following LogIds:")
    for logentry in logentries:
        logger.info(logentry["oracle"]["logid"])

    # Now, we are inserting the log entries in the JSON Database
    resp = soda_insert(ordsbaseurl, dbschema, dbuser, dbpwd, collection, logentries)
    logger.info(resp)
    if "items" in resp:
        logger.info("Logs are successfully inserted")
        logger.info(json.dumps(resp))
    else:
        raise Exception("Error while inserting logs into the database: " + json.dumps(resp))

    # The function is done. Return empty response.
    logger.info("function end")
    return response.Response(
        ctx, 
        response_data="",
        headers={"Content-Type": "application/json"}
    )

Usando a Console

Esta seção explica a criação de um conector usando a Console. Sua função deve ser implantada.

Para obter ajuda com a solução de problemas, consulte Diagnosticando e Solucionando Problemas dos Conectores.

Criar um conector

Este exemplo explica o uso da Console para criar um conector. Neste exemplo, o conector move dados de log do serviço Logging para um Autonomous Database usando a função criada com a amostra de código de função.

  1. Abra o menu de navegação e selecione Análise e IA. Em Mensagens, selecione Connector Hub.
  2. Escolha o Compartimento no qual você deseja criar o conector de serviço.
  3. Selecione Criar conector.
  4. Na página Criar conector:

    • Digite um Nome do conector como "Enviar logs para meu Autonomous Database". Evite digitar informações confidenciais.
    • Selecione o Compartimento de recursos no qual você deseja armazenar o novo conector.
    • Em Configurar conector, selecione seus serviços de origem e destino para mover dados de log para uma métrica:
      • Origem: Logging
      • Destino: Functions
    • Em Configurar conexão de origem, selecione um Nome do compartimento, um Grupo de logs e um Log.
    • Em Configurar conexão de destino, selecione o Aplicativo de função e a Função correspondentes à função criada usando a exemplo de código de função.
  5. Se for solicitado a criar uma política (necessário para acesso para criar ou atualizar um conector de serviço), selecione Criar.
  6. Selecione Criar.

Usando a CLI

Esta seção explica a criação de um conector usando a CLI que move dados de log para sua função (que, em seguida, move os dados para um Autonomous Database).

Para obter informações sobre como usar a API e assinar solicitações, consulte a documentação da API REST e Credenciais de Segurança. Para obter informações sobre SDKs, consulte SDKs e a CLI.

  • Crie um conector: Abra um prompt de comando e execute o comando oci sch service-connector create:

    oci sch service-connector create --display-name
    "<display_name>" --compartment-id <compartment_OCID> --source [<source_in_JSON>] --tasks [<tasks_in_JSON>] --target [<targets_in_JSON>]

Para obter ajuda com a solução de problemas, consulte Diagnosticando e Solucionando Problemas dos Conectores.

Usando a API

Esta seção explica a criação do conector usando a API.

Para obter informações sobre como usar a API e assinar solicitações, consulte a documentação da API REST e Credenciais de Segurança. Para obter informações sobre SDKs, consulte SDKs e a CLI.

Use as seguintes operações:

  • CreateServiceConnector: Crie um conector que mova dados de log para sua função (que, em seguida, move os dados para um Autonomous Database).

    Exemplo de solicitação CreateServiceConnector
    POST /20200909/serviceConnectors
    Host: service-connector-hub.us-phoenix-1.oraclecloud.com
    <authorization and other headers>
    {
      "compartmentId": "<compartment_OCID>",
      "description": "My connector description",
      "displayName": "My Connector",
      "source": {
        "kind": "logging",
        "logSources": [
          {
            "compartmentId": "<compartment_OCID>",
            "logGroupId": "<log_group_OCID>",
            "logId": "<log_OCID>"
          }
        ]
      },
      "target": {
        "compartmentId": "<compartment_OCID>",
        "kind": "functions",
        "functionId": "<function_OCID>"
      },
      "tasks": []
      }
    }

Para obter ajuda com a solução de problemas, consulte Diagnosticando e Solucionando Problemas dos Conectores.