에이전트 로깅

에이전트가 배포된 후 에이전트에서 Cloud Logging을 사용하려면 다음 방법 중 하나를 사용하세요.

  • stdout / stderr: 기본적으로 (추가 설정 없이) stdout 및 stderr에 작성된 로그는 각각 로그 ID reasoning_engine_stdoutreasoning_engine_stderr로 라우팅됩니다. 단, 텍스트여야 합니다.
  • Python 로깅: 내장 Python 로거를 Cloud Logging과 통합할 수 있습니다. stdout 또는 stderr에 쓰는 것과 비교하여 구조화된 로그를 지원하며 최소한의 설정만 필요합니다.
  • Cloud Logging 클라이언트: 사용자가 구조화된 로그를 작성할 수 있으며 로거를 완전히 제어할 수 있습니다 (예: logName 및 리소스 유형 설정).

에이전트 로그 작성

에이전트의 로그를 작성할 때 다음을 확인합니다.

  • severity: 예: 정보, 경고, 오류
  • 페이로드: 로그의 콘텐츠 (예: 텍스트 또는 JSON)
  • 추가 필드: 로그 간에 상관관계를 파악하기 위한 필드 (예: trace/span, 태그, 라벨)

예를 들어 에이전트를 개발할 때 각 쿼리의 입력을 로깅하려면 다음을 실행합니다.

stdout 또는 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
        )

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("K_SERVICE", "").split("-")[-1],
                },
            ),
        )

    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,
        )

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("K_SERVICE", "").split("-")[-1],
                },
            ),
        )

    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,
        )

에이전트가 배포되고 쿼리되면 로그 항목이 생성됩니다. 예를 들어 다음 코드는

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

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

다음과 유사한 로그 항목이 생성됩니다.

stdout 또는 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"
}

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"
}

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"
}

상담사 로그 보기

로그 탐색기를 사용하여 로그 항목을 볼 수 있습니다.

  1. Google Cloud 콘솔의 로그 탐색기로 이동합니다.

    로그 탐색기로 이동

  2. 페이지 상단에서 Google Cloud 프로젝트 (PROJECT_ID에 해당)를 선택합니다.

  3. 리소스 유형에서 Vertex AI Reasoning Engine을 선택합니다.

쿼리 빌드

로그 탐색기를 사용하여 점진적으로 쿼리를 빌드할 수 있습니다. 쿼리는 일반적으로 다음 고려사항을 기반으로 작성됩니다.

  • 타임라인: 시간에 따라 관련 로그 항목을 검색합니다.
  • 범위: 표준 속성을 기반으로 관련 로그 항목을 검색합니다.
    • 리소스: 프로젝트의 다른 유형의 리소스와 구분합니다.
      • type: 로그 탐색기에는 'Vertex AI 추론 엔진'으로, 로그 항목에는 "aiplatform.googleapis.com/ReasoningEngine"로 표시됩니다.
      • labels: 위치 (LOCATION), 프로젝트 PROJECT_ID, 리소스 RESOURCE_ID
    • logName: 로그 항목이 속한 로그입니다.
      • 빌드 시간의 로그 항목에는 로그 ID reasoning_engine_build가 있습니다.
      • stdoutstderr의 로그 항목에는 각각 로그 ID reasoning_engine_stdoutreasoning_engine_stderr가 있습니다.
      • Python 로깅 또는 Cloud Logging 클라이언트의 로그 항목에는 에이전트의 로그 작성의 코드를 기반으로 하는 맞춤 로그 ID가 있습니다.
    • tracespan: 쿼리 추적 시 로그에 사용합니다.
    • severity: 로그 항목의 심각도입니다.
    • insertId: 로그 항목의 고유 식별자입니다.
  • 라벨: 로그 항목에 관한 추가 정보를 제공하는 키-값 쌍 맵입니다. 라벨은 사용자 정의 또는 시스템 정의일 수 있으며 로그를 분류하고 로그 탐색기에서 더 쉽게 검색하는 데 유용합니다.
  • payload: 로그 항목의 콘텐츠입니다.

다음은 RESOURCE_ID가 있는 배포된 에이전트의 모든 INFO 로그에 대한 쿼리의 예입니다.

resource.labels.reasoning_engine_id=RESOURCE_ID AND
severity=INFO

로그 탐색기에서 다음 위치에서 확인할 수 있습니다.

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

여기서 쿼리는 적절하게 URL 인코딩되었으며 다른 매개변수는 다음과 같습니다.

  • DURATION: 예를 들어 지난 30분 동안 PT30M (또는 지난 10분 동안 PT10M)
  • PROJECT_ID: Google Cloud 프로젝트입니다.

자세한 내용은 Logging 쿼리 언어를 사용하여 쿼리 빌드 및 저장을 참고하세요.

상담사의 로그 쿼리

로그를 쿼리하는 프로그래매틱 접근 방식에는 두 가지 일반적인 옵션이 있습니다.

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))

entryLogEntry에 해당합니다. logger.list_entries의 입력 인수에 관한 자세한 내용은 API 참조를 참고하세요.

SQL

로그 보기:

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

애널리틱스 보기:

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