Mencatat aktivitas agen

Untuk menggunakan Cloud Logging di agen saat di-deploy, gunakan salah satu metode berikut:

  • stdout / stderr: secara default (tanpa penyiapan tambahan), log yang ditulis ke stdout dan stderr akan dirutekan ke ID log reasoning_engine_stdout dan reasoning_engine_stderr. Batasannya adalah teks harus berupa teks.
  • Logging Python: logger Python bawaan dapat diintegrasikan dengan Cloud Logging. Dibandingkan dengan menulis ke stdout atau stderr, hal ini mendukung log terstruktur dan memerlukan penyiapan minimal.
  • Klien Cloud Logging: pengguna dapat menulis log terstruktur, dan memiliki kontrol penuh atas logger (misalnya, menetapkan logName dan jenis resource).

Menulis log untuk agen

Saat menulis log untuk agen, tentukan:

  • severity: Misalnya, info, warn, error
  • payload: konten log (misalnya, teks atau JSON)
  • kolom tambahan: untuk melakukan korelasi di seluruh log (misalnya, rekaman aktivitas/span, tag, label)

Misalnya, untuk mencatat input setiap kueri saat mengembangkan agen:

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

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

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

Saat di-deploy dan di-kueri, agen akan menghasilkan entri log. Misalnya, kode

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

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

akan menghasilkan entri log yang mirip dengan berikut ini:

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

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

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

Melihat log untuk agen

Anda dapat melihat entri log menggunakan Logs Explorer:

  1. Buka Logs Explorer di konsol Google Cloud:

    Buka Logs Explorer

  2. Pilih Google Cloud project Anda (sesuai dengan PROJECT_ID) di bagian atas halaman.

  3. Di Resource Type, pilih Vertex AI Reasoning Engine.

Membuat kueri

Anda dapat menggunakan Logs Explorer untuk membuat kueri secara bertahap. Kueri biasanya dibuat berdasarkan pertimbangan berikut:

  • linimasa: untuk menelusuri entri log yang relevan berdasarkan waktu
  • scope: untuk menelusuri entri log yang relevan berdasarkan atribut kanonis
    • resource: pisahkan dari jenis resource lain dalam project Anda.
      • type: muncul sebagai "Vertex AI Reasoning Engine" di Logs Explorer dan "aiplatform.googleapis.com/ReasoningEngine" di entri log.
      • labels: untuk lokasi (LOCATION), project PROJECT_ID, dan resource RESOURCE_ID.
    • logName: Log tempat entri log berada:
      • Entri log pada waktu build memiliki ID log reasoning_engine_build.
      • Entri log untuk stdout dan stderr masing-masing memiliki ID log reasoning_engine_stdout dan reasoning_engine_stderr.
      • Entri log dari logging python atau klien Cloud Logging akan memiliki ID log kustom berdasarkan kode Anda di Menulis log untuk agen.
    • trace dan span: untuk log saat melacak kueri.
    • severity: untuk tingkat keparahan entri log.
    • insertId: ID unik untuk entri log.
  • labels: Peta pasangan kunci nilai yang memberikan informasi tambahan tentang entri log. Label dapat ditentukan pengguna atau ditentukan sistem, dan berguna untuk mengategorikan log serta mempermudah penelusurannya di Logs Explorer.
  • payload: konten entri log.

Berikut adalah contoh kueri untuk semua log INFO dari agen yang di-deploy dengan RESOURCE_ID:

resource.labels.reasoning_engine_id=RESOURCE_ID AND
severity=INFO

Anda dapat melihatnya di Logs Explorer di

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

dengan kueri telah dienkode URL dengan benar dan parameter lainnya sebagai berikut:

  • DURATION: misalnya PT30M selama 30 menit terakhir (atau PT10M selama 10 menit terakhir), dan
  • PROJECT_ID: Google Cloud project.

Untuk mengetahui detailnya, buka Membuat dan menyimpan kueri menggunakan bahasa kueri Logging.

Membuat kueri log untuk agen

Untuk pendekatan terprogram guna membuat kueri log, ada dua opsi umum:

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

Setiap entry akan sesuai dengan LogEntry. Untuk mengetahui detail tentang argumen input ke logger.list_entries, buka referensi API.

SQL

Tampilan log:

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

Tampilan Analytics:

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