Registar um agente

Para trabalhar com o Cloud Logging em agentes quando são implementados, use um dos seguintes métodos:

  • stdout / stderr: por predefinição (sem configuração adicional), os registos escritos em stdout e stderr são encaminhados para os IDs de registo reasoning_engine_stdout e reasoning_engine_stderr, respetivamente. A limitação é que têm de ser texto.
  • Registo do Python: o registo do Python integrado pode ser integrado com o Cloud Logging. Em comparação com a escrita para stdout ou stderr, esta opção suporta registos estruturados e requer uma configuração mínima.
  • Cliente do Cloud Logging: os utilizadores podem escrever registos estruturados e têm controlo total sobre o registador (por exemplo, definir o logName e o tipo de recurso).

Escreva registos para um agente

Ao escrever registos para um agente, determine o seguinte:

  • gravidade: por exemplo, info, warn, error
  • payload: o conteúdo do registo (por exemplo, texto ou JSON)
  • campos adicionais: para correlação entre registos (por exemplo, rastreio/intervalo, etiquetas)

Por exemplo, para registar a entrada de cada consulta quando desenvolve um agente:

stdout ou stderr

from typing import Dict

class MyAgent:

    def set_up(self):
        # No set up required. The logs from stdout and stderr are routed to
        # `reasoning_engine_stdout` and `reasoning_engine_stderr` respectively.
        pass

    def query(self, input: Dict):
        import sys

        print(
            f"input: {input}",
            file=sys.stdout,  # or sys.stderr
        )

Registo do Python

from typing import Dict

class MyAgent:

    def set_up(self):
        import os
        import google.cloud.logging

        self.logging_client = google.cloud.logging.Client(project="PROJECT_ID")
        self.logging_client.setup_logging(
            name="LOG_ID",  # the ID of the logName in Cloud Logging.
            resource=google.cloud.logging.Resource(
                type="aiplatform.googleapis.com/ReasoningEngine",
                labels={
                    "location": "LOCATION",
                    "resource_container": "PROJECT_ID",
                    "reasoning_engine_id": os.environ.get("GOOGLE_CLOUD_AGENT_ENGINE_ID", ""),
                },
            ),
        )

    def query(self, input: Dict):
        import logging
        import json

        logging_extras = {
            "labels": {"foo": "bar"},
            "trace": "TRACE_ID",
        }

        logging.info( # or .warning(), .error()
            json.dumps(input),
            extra=logging_extras,
        )

Cliente do Cloud Logging

from typing import Dict

class MyAgent:

    def set_up(self):
        import os
        import google.cloud.logging

        self.logging_client = google.cloud.logging.Client(project="PROJECT_ID")
        self.logger = self.logging_client.logger(
            name="LOG_ID",  # the ID of the logName in Cloud Logging.
            resource=google.cloud.logging.Resource(
                type="aiplatform.googleapis.com/ReasoningEngine",
                labels={
                    "location": "LOCATION",
                    "resource_container": "PROJECT_ID",
                    "reasoning_engine_id": os.environ.get("GOOGLE_CLOUD_AGENT_ENGINE_ID", ""),
                },
            ),
        )

    def query(self, input: Dict):
        logging_extras = {
            "labels": {"foo": "bar"},
            "trace": "TRACE_ID",
        }

        self.logger.log_struct(
            input,
            severity="INFO",  # or "DEBUG", "WARNING", "ERROR", "CRITICAL"
            **logging_extras,
        )

Quando o agente é implementado e consultado, gera entradas de registo. Por exemplo, o código

remote_agent = agent_engines.create(
    MyAgent(),
    requirements=["cloudpickle==3", "google-cloud-logging"],
)

remote_agent.query(input={"hello": "world"})

gera uma entrada de registo semelhante à seguinte:

stdout ou stderr

{
  "insertId": "67a3bb3b000cc2df444361ab",
  "textPayload": "input: {'hello': 'world'}",
  "resource": {
    "type": "aiplatform.googleapis.com/ReasoningEngine",
    "labels": {
      "location": "LOCATION",
      "resource_container": "PROJECT_ID",
      "reasoning_engine_id": "RESOURCE_ID"
    }
  },
  "timestamp": "2025-02-05T19:25:47.836319Z",
  "logName": "projects/PROJECT_ID/logs/aiplatform.googleapis.com%2Freasoning_engine_stdout",  # or `*_stderr`
  "receiveTimestamp": "2025-02-05T19:25:47.842550772Z"
}

Registo do Python

{
  "insertId": "1ek9a2jfqh777z",
  "jsonPayload": {"hello": "world"},
  "resource": {
    "type": "aiplatform.googleapis.com/ReasoningEngine",
    "labels": {
      "location": "LOCATION",
      "resource_container": "PROJECT_ID",
      "reasoning_engine_id": "RESOURCE_ID",
    }
  },
  "timestamp": "2025-02-05T20:30:19.348067Z",
  "severity": "INFO",
  "labels": {
    "foo": "bar",
    "python_logger": "root",
  },
  "logName": "projects/PROJECT_ID/logs/LOG_ID",
  "trace": "TRACE_ID",
  "receiveTimestamp": "2025-01-30T21:38:50.776813191Z"
}

Cliente do Cloud Logging

{
  "insertId": "1ek9a2jfqh777z",
  "jsonPayload": {"hello": "world"},
  "resource": {
    "type": "aiplatform.googleapis.com/ReasoningEngine",
    "labels": {
      "location": "LOCATION",
      "resource_container": "PROJECT_ID",
      "reasoning_engine_id": "RESOURCE_ID",
    }
  },
  "timestamp": "2025-01-30T21:38:50.776813191Z",
  "severity": "INFO",
  "labels": {"foo": "bar"},
  "logName": "projects/PROJECT_ID/logs/LOG_ID",
  "trace": "TRACE_ID",
  "receiveTimestamp": "2025-01-30T21:38:50.776813191Z"
}

Veja os registos de um agente

Pode ver as entradas de registo através do Explorador de registos:

  1. Para receber autorização para ver registos no Explorador de registos, peça ao seu administrador para lhe conceder a função de Leitor de registos (roles/logging.viewer) no seu projeto.

  2. Aceda ao Explorador de registos na Google Cloud consola:

    Aceda ao Explorador de registos

  3. Selecione o seu Google Cloud projeto (correspondente a PROJECT_ID) na parte superior da página.

  4. Em Tipo de recurso, selecione Vertex AI Reasoning Engine.

Criar consultas

Pode usar o Explorador de registos para criar consultas de forma incremental. As consultas são normalmente criadas com base nas seguintes considerações:

  • timeline: para pesquisar entradas de registo relevantes com base na hora
  • scope: para pesquisar entradas de registo relevantes com base em atributos canónicos
    • recurso: separe-o de outros tipos de recursos no seu projeto.
      • type: aparece como "Vertex AI Reasoning Engine" no Logs Explorer e "aiplatform.googleapis.com/ReasoningEngine" na entrada do registo.
      • labels: para a localização (LOCATION), o projeto PROJECT_ID e o recurso RESOURCE_ID.
    • logName: o registo ao qual a entrada do registo pertence:
      • As entradas de registo no momento da compilação têm o ID de registo reasoning_engine_build.
      • As entradas do registo para stdout e stderr têm o ID do registo reasoning_engine_stdout e reasoning_engine_stderr, respetivamente.
      • As entradas de registo do registo do Python ou do cliente do Cloud Logging têm IDs de registo personalizados com base no seu código em Escreva registos para um agente.
    • trace e span: para os registos quando rastreia consultas.
    • gravidade: para a gravidade da entrada do registo.
    • insertId: o identificador exclusivo de uma entrada de registo.
  • labels: um mapa de pares de chave-valor que fornece informações adicionais sobre a entrada do registo. As etiquetas podem ser definidas pelo utilizador ou pelo sistema e são úteis para categorizar registos e facilitar a respetiva pesquisa no Explorador de registos.
  • payload: o conteúdo da entrada de registo.

Segue-se um exemplo de uma consulta para todos os registos INFO de um agente implementado com RESOURCE_ID:

resource.labels.reasoning_engine_id=RESOURCE_ID AND
severity=INFO

Pode vê-lo no Explorador de registos em

https://console.cloud.google.com/logs/query;query=severity%3DINFO%0Aresource.labels.reasoning_engine_id%3D%22RESOURCE_ID%22;duration=DURATION?project=PROJECT_ID

onde a consulta foi devidamente codificada em URL e os outros parâmetros são os seguintes:

  • DURATION: por exemplo, PT30M nos últimos 30 minutos (ou PT10M nos últimos 10 minutos) e
  • PROJECT_ID: o Google Cloud projeto.

Para obter detalhes, consulte o artigo Crie e guarde consultas através da linguagem de consulta de registo.

Registos de consultas de um agente

Para uma abordagem programática aos registos de consultas, existem duas opções comuns:

Python

from google.cloud import logging

logging_client = logging.Client(project="PROJECT_ID")
logger = logging_client.logger("LOG_ID")  # E.g. "logging_client"
print("Listing entries for logger {}:".format(logger.name))
for entry in logger.list_entries(
    filter_="resource.labels.reasoning_engine_id=RESOURCE_ID"  # Optional
):
    timestamp = entry.timestamp.isoformat()
    print("* {}: {}".format(timestamp, entry.payload))

Cada entry corresponde a um LogEntry. Para ver detalhes sobre os argumentos de entrada para logger.list_entries, visite a referência da API.

SQL

Vista de registo:

SELECT *
FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`

Vista do Analytics:

SELECT *
FROM `analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`