Wdrażanie, zarządzanie i monitorowanie usługi ADK Agent w Cloud Run

1. Wprowadzenie

Z tego samouczka dowiesz się, jak wdrażać, zarządzać i monitorować zaawansowanego agenta utworzonego za pomocą zestawu Agent Development Kit (ADK) w Google Cloud Run. ADK umożliwia tworzenie agentów zdolnych do wykonywania złożonych przepływów pracy z udziałem wielu agentów. Korzystając z Cloud Run, w pełni zarządzanej platformy bezserwerowej, możesz wdrożyć agenta jako skalowalną aplikację skonteneryzowaną bez konieczności przejmowania się infrastrukturą bazową. To połączenie umożliwia skupienie się na podstawowej logice agenta przy jednoczesnym korzystaniu z solidnego i skalowalnego środowiska Google Cloud.

W tym samouczku omówimy bezproblemową integrację ADK z Cloud Run. Dowiesz się, jak wdrożyć agenta, a potem poznasz praktyczne aspekty zarządzania aplikacją w środowisku produkcyjnym. Wyjaśnimy, jak bezpiecznie wdrażać nowe wersje agenta, zarządzając ruchem i umożliwiając testowanie nowych funkcji na podzbiorze użytkowników przed pełnym wdrożeniem.

Dodatkowo zdobędziesz praktyczne doświadczenie w monitorowaniu skuteczności agenta. Przeprowadzimy test obciążenia, aby zasymulować rzeczywistą sytuację i zaobserwować działanie funkcji automatycznego skalowania Cloud Run. Aby uzyskać bardziej szczegółowe informacje o zachowaniu i skuteczności agenta, włączymy śledzenie za pomocą Cloud Trace. Dzięki temu uzyskasz szczegółowy, kompleksowy wgląd w żądania przesyłane przez agenta, co pozwoli Ci identyfikować i usuwać wszelkie wąskie gardła wydajności. Po ukończeniu tego samouczka będziesz mieć pełną wiedzę o tym, jak skutecznie wdrażać agentów opartych na ADK w Cloud Run, zarządzać nimi i je monitorować.

W ramach ćwiczeń z programowania będziesz wykonywać kolejne czynności:

  1. Utwórz bazę danych PostgreSQL w Cloud SQL, która będzie używana w usłudze sesji bazy danych agenta ADK.
  2. Konfigurowanie podstawowego agenta ADK
  3. Konfigurowanie usługi sesji bazy danych do używania przez narzędzie ADK Runner
  4. Początkowe wdrożenie agenta w Cloud Run
  5. Testowanie obciążenia i sprawdzanie autoskalowania Cloud Run
  6. Wdrażanie nowej wersji agenta i stopniowe zwiększanie ruchu kierowanego do nowych wersji
  7. Konfigurowanie śledzenia w chmurze i sprawdzanie śledzenia działania agenta

Omówienie architektury

5e38fc5607fb4543.jpeg

Wymagania wstępne

  • Komfortowa praca z Pythonem
  • Znajomość podstawowej architektury pełnego stosu z użyciem usługi HTTP

Czego się nauczysz

  • Struktura ADK i lokalne narzędzia
  • Konfigurowanie agenta ADK za pomocą usługi sesji bazy danych
  • Konfigurowanie PostgreSQL w Cloud SQL do użycia przez usługę sesji bazy danych
  • Wdrażanie aplikacji w Cloud Run za pomocą pliku Dockerfile i konfigurowanie początkowych zmiennych środowiskowych
  • Konfigurowanie i testowanie autoskalowania Cloud Run za pomocą testów obciążeniowych
  • Strategia stopniowego wdrażania w Cloud Run
  • Konfigurowanie śledzenia agenta ADK w Cloud Trace

Czego potrzebujesz

  • przeglądarki Chrome,
  • konto Gmail,
  • Projekt w chmurze z włączonymi płatnościami

Ten przewodnik, przeznaczony dla deweloperów na wszystkich poziomach zaawansowania (w tym dla początkujących), wykorzystuje w przykładowej aplikacji język Python. Znajomość Pythona nie jest jednak wymagana do zrozumienia przedstawionych koncepcji.

2. Zanim zaczniesz

Wybieranie aktywnego projektu w Cloud Console

W tym samouczku zakładamy, że masz już projekt Google Cloud z włączonymi płatnościami. Jeśli jeszcze go nie masz, możesz zacząć, wykonując czynności opisane poniżej.

  1. W konsoli Google Cloud na stronie selektora projektów wybierz lub utwórz projekt Google Cloud.
  2. Sprawdź, czy w projekcie Cloud włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie są włączone płatności.

c714d4741fc97644.png

Przygotowanie bazy danych Cloud SQL

Później agent ADK będzie korzystać z bazy danych. Utwórzmy bazę danych PostgreSQL w Cloud SQL. Najpierw przejdź do paska wyszukiwania w górnej części konsoli Cloud i wpisz „cloud sql”. Następnie kliknij usługę Cloud SQL.

1005cb65520eb3fc.png

Następnie musimy utworzyć nową instancję bazy danych. Kliknij Utwórz instancję i wybierz PostgreSQL.

7f2ad19bc246895d.png

ead4a98e7a8d8a39.png

Jeśli zaczynasz od nowego projektu, może być też konieczne włączenie interfejsu Compute Engine API. W tym celu kliknij Włącz interfejs API, gdy pojawi się odpowiedni komunikat.

724cf67681535679.png

Następnie wybierzemy specyfikacje bazy danych, wybierzemy wersję Enterprise z gotowym ustawieniem Sandbox.

24aa9defed93a3ef.png

Następnie ustaw nazwę instancji i hasło domyślne użytkownika postgres. Możesz skonfigurować dowolne dane logowania, ale w tym samouczku użyjemy nazwy instancji i hasła „adk-deployment”.

573719a4582f541c.png

W tym samouczku użyjemy regionu us-central1 z jedną strefą. Możemy wtedy dokończyć tworzenie bazy danych i pozwolić jej na ukończenie wszystkich wymaganych ustawień, klikając przycisk Utwórz instancję.

773e2ea11d97369d.png

Podczas oczekiwania na zakończenie tego procesu możemy przejść do następnej sekcji.

Konfigurowanie projektu w Cloud Shell Terminal

  1. Będziesz używać Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud. U góry konsoli Google Cloud kliknij Aktywuj Cloud Shell.

1829c3759227c19b.png

  1. Po połączeniu z Cloud Shell sprawdź, czy jesteś już uwierzytelniony i czy projekt jest ustawiony na Twój identyfikator projektu, używając tego polecenia:
gcloud auth list
  1. Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project
  1. Jeśli projekt nie jest ustawiony, użyj tego polecenia, aby go ustawić:
gcloud config set project <YOUR_PROJECT_ID>

Możesz też zobaczyć identyfikator PROJECT_ID w konsoli.

4032c45803813f30.jpeg

Kliknij go, a po prawej stronie zobaczysz wszystkie swoje projekty i identyfikator projektu.

8dc17eb4271de6b5.jpeg

  1. Włącz wymagane interfejsy API za pomocą polecenia pokazanego poniżej. Może to potrwać kilka minut, więc zachowaj cierpliwość.
gcloud services enable aiplatform.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       sqladmin.googleapis.com

Po pomyślnym wykonaniu polecenia powinien wyświetlić się komunikat podobny do tego poniżej:

Operation "operations/..." finished successfully.

Alternatywą dla polecenia gcloud jest wyszukanie poszczególnych usług w konsoli lub skorzystanie z tego linku.

Jeśli pominiesz jakiś interfejs API, zawsze możesz go włączyć w trakcie wdrażania.

Informacje o poleceniach gcloud i ich użyciu znajdziesz w dokumentacji.

Otwórz edytor Cloud Shell i skonfiguruj katalog roboczy aplikacji

Teraz możemy skonfigurować edytor kodu, aby wykonywać różne czynności związane z kodowaniem. W tym celu użyjemy edytora Cloud Shell.

  1. Kliknij przycisk Otwórz edytor. Spowoduje to otwarcie edytora Cloud Shell, w którym możesz pisać kod. b16d56e4979ec951.png
  2. Sprawdź, czy projekt Cloud Code jest ustawiony w lewym dolnym rogu (na pasku stanu) edytora Cloud Shell, jak pokazano na ilustracji poniżej, i czy jest ustawiony jako aktywny projekt Google Cloud, w którym masz włączone płatności. W razie potrzeby kliknij Zezwól. Jeśli wykonasz poprzednie polecenie, przycisk może też prowadzić bezpośrednio do aktywowanego projektu zamiast do przycisku logowania.

f5003b9c38b43262.png

  1. Następnie sklonujmy z GitHuba katalog roboczy szablonu na potrzeby tego szkolenia. Wpisz to polecenie: W katalogu deploy_and_manage_adk zostanie utworzony katalog roboczy.
git clone https://github.com/alphinside/deploy-and-manage-adk-service.git deploy_and_manage_adk
  1. Następnie przejdź do górnej sekcji edytora Cloud Shell i kliknij File->Open Folder (Plik –>Otwórz folder), znajdź katalog username (nazwa użytkownika) i katalog deploy_and_manage_adk,a potem kliknij OK. Spowoduje to ustawienie wybranego katalogu jako głównego katalogu roboczego. W tym przykładzie nazwa użytkownika to alvinprayuda, więc ścieżka do katalogu jest widoczna poniżej.

2c53696f81d805cc.png

a51615f22ba1690f.png

Edytor Cloud Shell powinien teraz wyglądać tak:

228d4c1844790573.png

Następnie możemy skonfigurować środowisko Pythona.

Konfiguracja środowiska

Przygotowywanie wirtualnego środowiska Pythona

Następnym krokiem jest przygotowanie środowiska programistycznego. Bieżący aktywny katalog roboczy terminala powinien znajdować się w katalogu roboczym deploy_and_manage_adk. W tym samouczku użyjemy Pythona 3.12 i menedżera projektów Pythona uv, aby uprościć tworzenie i zarządzanie wersją Pythona oraz środowiskiem wirtualnym.

  1. Jeśli terminal nie jest jeszcze otwarty, otwórz go, klikając Terminal –> Nowy terminal lub użyj skrótu Ctrl + Shift + C. W dolnej części przeglądarki otworzy się okno terminala.

f8457daf0bed059e.jpeg

  1. Pobierz uv i zainstaluj Pythona 3.12 za pomocą tego polecenia:
curl -LsSf https://astral.sh/uv/0.6.16/install.sh | sh && \
source $HOME/.local/bin/env && \
uv python install 3.12
  1. Teraz zainicjuj środowisko wirtualne za pomocą polecenia uv. Uruchom to polecenie:
uv sync --frozen

Spowoduje to utworzenie katalogu .venv i zainstalowanie zależności. Szybki podgląd pliku pyproject.toml pozwoli Ci uzyskać informacje o zależnościach, które będą wyświetlane w ten sposób:

dependencies = [
    "google-adk==1.3.0",
    "locust==2.37.10",
    "pg8000==1.31.2",
    "python-dotenv==1.1.0",
]
  1. Aby przetestować środowisko wirtualne, utwórz nowy plik main.py i skopiuj ten kod:
def main():
   print("Hello from deploy_and_manage_adk!")

if __name__ == "__main__":
   main()
  1. Następnie uruchom to polecenie:
uv run main.py

Otrzymasz dane wyjściowe podobne do tych poniżej.

Using CPython 3.12
Creating virtual environment at: .venv
Hello from deploy_and_manage_adk!

Oznacza to, że projekt w Pythonie jest prawidłowo konfigurowany.

Konfigurowanie plików konfiguracji

Teraz musimy skonfigurować pliki konfiguracji dla tego projektu.

Zmień nazwę pliku .env.example na .env. Wyświetli się wartość poniżej. Zaktualizuj wartość GOOGLE_CLOUD_PROJECT, podając identyfikator projektu.

# Google Cloud and Vertex AI configuration
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=global
GOOGLE_GENAI_USE_VERTEXAI=True

# Database connection for session service
# SESSION_SERVICE_URI=postgresql+pg8000://<username>:<password>@/<database>?unix_sock=/cloudsql/<instance_connection_name>/.s.PGSQL.5432

Na potrzeby tego laboratorium wybierzemy wstępnie skonfigurowane wartości dla GOOGLE_CLOUD_LOCATIONGOOGLE_GENAI_USE_VERTEXAI.. Na razie pozostawimy SESSION_SERVICE_URI jako komentarz.

Teraz możemy przejść do następnego kroku, czyli sprawdzić logikę agenta i wdrożyć go.

3. Tworzenie agenta pogodowego za pomocą ADK i Gemini 2.5

Wprowadzenie do struktury katalogów pakietu ADK

Zacznijmy od poznania możliwości ADK i sposobu tworzenia agenta. Pełną dokumentację pakietu ADK znajdziesz pod tym adresem URL . ADK oferuje wiele narzędzi w ramach wykonywania poleceń CLI. Oto niektóre z nich :

  • Konfigurowanie struktury katalogów agenta
  • Szybkie wypróbowanie interakcji za pomocą interfejsu wiersza poleceń
  • Szybkie konfigurowanie lokalnego interfejsu internetowego

Sprawdźmy teraz strukturę agenta w katalogu weather_agent.

weather_agent/
├── __init__.py
├── agent.py

Jeśli sprawdzisz pliki init.pyagent.py, zobaczysz ten kod:

# __init__.py

from weather_agent.agent import root_agent

__all__ = ["root_agent"]
# agent.py

import os
from pathlib import Path

import google.auth
from dotenv import load_dotenv
from google.adk.agents import Agent
from google.cloud import logging as google_cloud_logging

# Load environment variables from .env file in root directory
root_dir = Path(__file__).parent.parent
dotenv_path = root_dir / ".env"
load_dotenv(dotenv_path=dotenv_path)

# Use default project from credentials if not in .env
_, project_id = google.auth.default()
os.environ.setdefault("GOOGLE_CLOUD_PROJECT", project_id)
os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "global")
os.environ.setdefault("GOOGLE_GENAI_USE_VERTEXAI", "True")

logging_client = google_cloud_logging.Client()
logger = logging_client.logger("weather-agent")


def get_weather(city: str) -> dict:
    """Retrieves the current weather report for a specified city.

    Args:
        city (str): The name of the city (e.g., "New York", "London", "Tokyo").

    Returns:
        dict: A dictionary containing the weather information.
              Includes a 'status' key ('success' or 'error').
              If 'success', includes a 'report' key with weather details.
              If 'error', includes an 'error_message' key.
    """
    logger.log_text(
        f"--- Tool: get_weather called for city: {city} ---", severity="INFO"
    )  # Log tool execution
    city_normalized = city.lower().replace(" ", "")  # Basic normalization

    # Mock weather data
    mock_weather_db = {
        "newyork": {
            "status": "success",
            "report": "The weather in New York is sunny with a temperature of 25°C.",
        },
        "london": {
            "status": "success",
            "report": "It's cloudy in London with a temperature of 15°C.",
        },
        "tokyo": {
            "status": "success",
            "report": "Tokyo is experiencing light rain and a temperature of 18°C.",
        },
    }

    if city_normalized in mock_weather_db:
        return mock_weather_db[city_normalized]
    else:
        return {
            "status": "error",
            "error_message": f"Sorry, I don't have weather information for '{city}'.",
        }


root_agent = Agent(
    name="weather_agent",
    model="gemini-2.5-flash",
    instruction="You are a helpful AI assistant designed to provide accurate and useful information.",
    tools=[get_weather],
)

ADK Wyjaśnienie kodu

Ten skrypt zawiera inicjację agenta, w której inicjujemy te elementy:

  • Ustaw model, który ma być używany, na gemini-2.5-flash
  • Udostępnij narzędzie get_weather, aby obsługiwać funkcje agenta, np. agenta pogodowego.

Uruchamianie interfejsu internetowego

Teraz możemy wchodzić w interakcje z agentem i sprawdzać jego działanie lokalnie. ADK umożliwia nam korzystanie z interfejsu internetowego do programowania, który pozwala wchodzić w interakcje i sprawdzać, co się dzieje podczas interakcji. Aby uruchomić lokalny serwer interfejsu programistycznego, wykonaj to polecenie:

uv run adk web --port 8080

Pojawią się dane wyjściowe podobne do tych poniżej. Oznacza to, że możemy już uzyskać dostęp do interfejsu internetowego.

INFO:     Started server process [xxxx]
INFO:     Waiting for application startup.

+-----------------------------------------------------------------------------+
| ADK Web Server started                                                      |
|                                                                             |
| For local testing, access at http://localhost:8080.                         |
+-----------------------------------------------------------------------------+

INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)

Aby to sprawdzić, kliknij przycisk Podgląd w przeglądarce w górnej części edytora Cloud Shell i wybierz Podejrzyj na porcie 8080.

e7c9f56c2463164.png

Wyświetli się strona internetowa, na której w lewym górnym rogu możesz wybrać dostępnych agentów ( w naszym przypadku powinien to być weather_agent) i interagować z botem. W oknie po lewej stronie zobaczysz wiele informacji o szczegółach logu podczas działania agenta.

d95b1e057315fee2.png

Teraz spróbuj wejść z nim w interakcję. Na pasku po lewej stronie możemy sprawdzić ślad każdego wejścia, aby dowiedzieć się, ile czasu zajmuje każda czynność wykonywana przez agenta przed sformułowaniem ostatecznej odpowiedzi.

39c0a06ace937683.png

Jest to jedna z funkcji obserwacji wbudowanych w ADK. Obecnie sprawdzamy ją lokalnie. Później zobaczymy, jak jest to zintegrowane z Cloud Tracing, abyśmy mieli scentralizowane śledzenie wszystkich żądań.

4. Skrypt serwera backendu

Aby udostępnić agenta jako usługę, umieścimy go w aplikacji FastAPI. Możemy tu skonfigurować niezbędne usługi, które będą obsługiwać agenta, np. przygotować usługi Session, Memory lub Artifact do celów produkcyjnych. Oto kod pliku server.py, który będzie używany:

import os

from dotenv import load_dotenv
from fastapi import FastAPI
from google.adk.cli.fast_api import get_fast_api_app
from pydantic import BaseModel
from typing import Literal
from google.cloud import logging as google_cloud_logging
from tracing import CloudTraceLoggingSpanExporter
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider, export


# Load environment variables from .env file
load_dotenv()

logging_client = google_cloud_logging.Client()
logger = logging_client.logger(__name__)

AGENT_DIR = os.path.dirname(os.path.abspath(__file__))

# Get session service URI from environment variables
session_uri = os.getenv("SESSION_SERVICE_URI", None)

# Prepare arguments for get_fast_api_app
app_args = {"agents_dir": AGENT_DIR, "web": True}

# Only include session_service_uri if it's provided
if session_uri:
    app_args["session_service_uri"] = session_uri
else:
    logger.log_text(
        "SESSION_SERVICE_URI not provided. Using in-memory session service instead. "
        "All sessions will be lost when the server restarts.",
        severity="WARNING",
    )

provider = TracerProvider()
processor = export.BatchSpanProcessor(CloudTraceLoggingSpanExporter())
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)

# Create FastAPI app with appropriate arguments
app: FastAPI = get_fast_api_app(**app_args)

app.title = "weather-agent"
app.description = "API for interacting with the Agent weather-agent"


class Feedback(BaseModel):
    """Represents feedback for a conversation."""

    score: int | float
    text: str | None = ""
    invocation_id: str
    log_type: Literal["feedback"] = "feedback"
    service_name: Literal["weather-agent"] = "weather-agent"
    user_id: str = ""


@app.post("/feedback")
def collect_feedback(feedback: Feedback) -> dict[str, str]:
    """Collect and log feedback.

    Args:
        feedback: The feedback data to log

    Returns:
        Success message
    """
    logger.log_struct(feedback.model_dump(), severity="INFO")
    return {"status": "success"}


# Main execution
if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8080)

Wyjaśnienie kodu serwera

Oto elementy zdefiniowane w skrypcie server.py:

  1. Przekształć agenta w aplikację FastAPI za pomocą metody get_fast_api_app. W ten sposób odziedziczymy tę samą definicję trasy, która jest używana w interfejsie programowania aplikacji internetowych.
  2. Skonfiguruj niezbędną usługę sesji, pamięci lub artefaktów, dodając argumenty słów kluczowych do metody get_fast_api_app. Jeśli w tym samouczku skonfigurujemy zmienną środowiskową SESSION_SERVICE_URI, usługa sesji będzie jej używać. W przeciwnym razie będzie używać sesji w pamięci.
  3. Możemy dodać niestandardową ścieżkę, aby obsługiwać inną logikę biznesową backendu. W skrypcie dodajemy przykładową ścieżkę funkcji opinii.
  4. Włącz śledzenie w chmurze, aby wysyłać ślady do Cloud Trace.

5. Wdrażanie w Cloud Run

Teraz wdróżmy tę usługę agenta w Cloud Run. Na potrzeby tej wersji demonstracyjnej usługa będzie udostępniana jako usługa publiczna, do której dostęp będą miały inne osoby. Pamiętaj jednak, że nie jest to sprawdzona metoda, ponieważ nie zapewnia bezpieczeństwa.

5e38fc5607fb4543.jpeg

W tym samouczku użyjemy pliku Dockerfile, aby wdrożyć agenta w Cloud Run. Poniżej znajduje się zawartość pliku Dockerfile, która będzie używana.

FROM python:3.12-slim

RUN pip install --no-cache-dir uv==0.7.13

WORKDIR /app

COPY . .

RUN uv sync --frozen

EXPOSE 8080

CMD ["uv", "run", "uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8080"]

Mamy już wszystkie pliki potrzebne do wdrożenia aplikacji w Cloud Run. Możemy więc to zrobić. Otwórz terminal Cloud Shell i sprawdź, czy bieżący projekt jest skonfigurowany jako aktywny. Jeśli nie, użyj polecenia gcloud configure, aby ustawić identyfikator projektu:

gcloud config set project [PROJECT_ID]

Następnie uruchom to polecenie, aby wdrożyć go w Cloud Run.

gcloud run deploy weather-agent \
                  --source . \
                  --port 8080 \
                  --project {YOUR_PROJECT_ID} \
                  --allow-unauthenticated \
                  --add-cloudsql-instances {YOUR_DB_CONNECTION_NAME} \
                  --update-env-vars SESSION_SERVICE_URI="postgresql+pg8000://postgres:{YOUR_DEFAULT_USER_PASS}@postgres/?unix_sock=/cloudsql/{YOUR_DB_CONNECTION_NAME}/.s.PGSQL.5432",GOOGLE_CLOUD_PROJECT={YOUR_PROJECT_ID} \
                  --region us-central1

Aby uzyskać wartość {YOUR_DB_CONNECTION_NAME}, możesz ponownie otworzyć Cloud SQL i kliknąć utworzoną instancję. Na stronie instancji przewiń w dół do sekcji „Połącz się z tą instancją” i skopiuj nazwę połączenia, aby zastąpić wartość {YOUR_DB_CONNECTION_NAME}. Na przykład spójrz na obraz pokazany poniżej.

5d7d6c6f17e559c1.png

Jeśli pojawi się prośba o potwierdzenie utworzenia repozytorium Artifact Registry dla Dockera, wpisz Y. Pamiętaj, że w tym przypadku zezwalamy na nieuwierzytelniony dostęp, ponieważ jest to aplikacja demonstracyjna. Zalecamy stosowanie odpowiedniego uwierzytelniania w przypadku aplikacji firmowych i produkcyjnych.

Po zakończeniu wdrażania powinien pojawić się link podobny do tego poniżej:

https://weather-agent-*******.us-central1.run.app

Możesz teraz korzystać z aplikacji w oknie incognito lub na urządzeniu mobilnym. Powinien być już dostępny.

6. Sprawdzanie automatycznego skalowania Cloud Run za pomocą testów obciążeniowych

Teraz sprawdzimy możliwości automatycznego skalowania Cloud Run. W tym scenariuszu wdróżmy nową wersję, włączając maksymalną liczbę równoczesnych żądań na instancję. Uruchom to polecenie:

gcloud run deploy weather-agent \
                  --source . \
                  --port 8080 \
                  --project {YOUR_PROJECT_ID} \
                  --allow-unauthenticated \
                  --region us-central1 \
                  --concurrency 10

Następnie sprawdźmy plik load_test.py. Będzie to skrypt, którego użyjemy do testowania obciążenia za pomocą platformy locust. Ten skrypt wykona te czynności :

  1. Losowe wartości user_id i session_id
  2. Utwórz identyfikator sesji dla identyfikatora użytkownika.
  3. Wyślij żądanie do punktu końcowego „/run_sse” z utworzonymi identyfikatorami user_id i session_id.

Jeśli nie podasz adresu URL wdrożonej usługi, będziemy musieli go poznać. Otwórz konsolę Cloud Run i kliknij usługę weather-agent.

f5cc953cc422de6d.png

Następnie znajdź usługę weather-agent i kliknij ją.

ddd0df8544aa2bfb.png

Adres URL usługi będzie wyświetlany obok informacji o regionie. np.

41b1276616379ee8.png

Następnie uruchom to polecenie, aby przeprowadzić test obciążenia:

uv run locust -f load_test.py \
              -H {YOUR_SERVICE_URL} \
              -u 60 \
              -r 5 \
              -t 120 \
              --headless

Po uruchomieniu tego polecenia zobaczysz wyświetlone dane, takie jak te poniżej. ( W tym przykładzie wszystkie żądania zakończyły się powodzeniem)

Type     Name                                  # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
POST     /run_sse end                             813     0(0.00%) |   5817    2217   26421   5000 |    6.79        0.00
POST     /run_sse message                         813     0(0.00%) |   2678    1107   17195   2200 |    6.79        0.00
--------|------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                              1626     0(0.00%) |   4247    1107   26421   3500 |   13.59        0.00  

Sprawdźmy teraz, co się stało w Cloud Run. Wróć do wdrożonej usługi i wyświetl panel. Pokazuje to, jak Cloud Run automatycznie skaluje instancję w celu obsługi żądań przychodzących. Ograniczamy maksymalną liczbę współbieżnych żądań do 10 na instancję, więc instancja Cloud Run automatycznie dostosuje liczbę kontenerów, aby spełnić ten warunek.

1ad41143eb9d95df.png

7. Stopniowe wdrażanie nowych wersji

Przyjrzyjmy się teraz następującemu scenariuszowi. Chcemy zaktualizować prompt agenta w ten sposób :

# agent.py

...

root_agent = Agent(
    name="weather_agent",
    model="gemini-2.5-flash-preview-05-20",
    instruction="You are a helpful AI assistant designed to provide accurate and useful information. You only answer inquiries about the weather. Refuse all other user query",
    tools=[get_weather],
)

Chcesz wdrożyć nowe wersje, ale nie chcesz, aby cały ruch z żądaniami był kierowany bezpośrednio do nowej wersji. W Cloud Run możemy przeprowadzić stopniowe wdrażanie. Najpierw musimy wdrożyć nową wersję, ale z flagą –no-traffic. Zapisz poprzedni skrypt agenta i uruchom to polecenie:

gcloud run deploy weather-agent \
                  --source . \
                  --port 8080 \
                  --project {YOUR_PROJECT_ID} \
                  --allow-unauthenticated \
                  --region us-central1 \
                  --no-traffic

Po zakończeniu otrzymasz podobny dziennik jak w przypadku poprzedniego procesu wdrażania, z tą różnicą, że będzie on zawierał liczbę obsłużonych żądań. Wyświetli się informacja o 0% obsłużonego ruchu.

Następnie przejdź na stronę usługi Cloud Run i znajdź wdrożoną instancję. Na pasku wyszukiwania wpisz „Cloud Run” i kliknij usługę Cloud Run.

f5cc953cc422de6d.png

Następnie znajdź usługę weather-agent i kliknij ją.

ddd0df8544aa2bfb.png

Otwórz kartę Wersje, na której zobaczysz listę wdrożonych wersji.

8519c5a59bc7efa6.png

Nowa wdrożona wersja będzie obsługiwać 0% ruchu. Kliknij przycisk z 3 kropkami (⋮) i wybierz Zarządzaj ruchem.

d4d224e20813c303.png

W nowo otwartym okienku możesz edytować odsetek ruchu kierowanego do poszczególnych wersji.

6df497c3d5847f14.png

Po pewnym czasie ruch będzie kierowany proporcjonalnie na podstawie konfiguracji procentowych. Dzięki temu w razie problemów z nową wersją możemy łatwo przywrócić poprzednie wersje.

8. Śledzenie ADK

Agenty utworzone za pomocą platformy ADK obsługują już śledzenie za pomocą otwartej telemetrii. Mamy Cloud Trace, aby rejestrować ślady i je wizualizować. Sprawdźmy, jak w server.py włączyliśmy tę funkcję w usłudze, którą wcześniej wdrożyliśmy.

# server.py

from tracing import CloudTraceLoggingSpanExporter
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider, export

...

provider = TracerProvider()
processor = export.BatchSpanProcessor(CloudTraceLoggingSpanExporter())
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)

...

Inicjujemy tu moduł śledzący i eksporter. Szczegóły eksportera można sprawdzić w pliku tracing.py . Tworzymy tu niestandardowy eksporter, ponieważ istnieje limit danych śledzenia, które można wyeksportować do Cloud Trace. Do śledzenia używamy implementacji z https://googlecloudplatform.github.io/agent-starter-pack/guide/observability.html.

Spróbuj uzyskać dostęp do interfejsu internetowego usługi i porozmawiać z agentem. Następnie na pasku wyszukiwania w konsoli Google Cloud wpisz „Eksplorator logów czasu” i wybierz usługę Eksplorator logów czasu.

4353c0f8982361ab.png

Na stronie eksploratora śladów zobaczysz, że ślad naszej rozmowy z agentem został przesłany. W sekcji Nazwa zakresu możesz zobaczyć zakresy i odfiltrować ten, który jest specyficzny dla naszego agenta ( ma nazwę agent_run [weather_agent]).

c4336d117a3d2f6a.png

Gdy zakresy są już przefiltrowane, możesz też bezpośrednio sprawdzić każdy ślad. Wyświetla szczegółowy czas trwania każdego działania podjętego przez agenta. Na przykład spójrz na obrazy poniżej.

76a56dff77979037.png

1a3ce0a803d6061a.png

W każdej sekcji możesz sprawdzić szczegóły atrybutów, jak pokazano poniżej.

2c87b6d67b0164a8.png

Gotowe. Mamy teraz dobrą widoczność i informacje o każdej interakcji agenta z użytkownikiem, które pomogą nam rozwiązywać problemy. Możesz wypróbować różne narzędzia i procesy.

9. Wyzwanie

Wypróbuj przepływy pracy z wieloma agentami lub oparte na agentach, aby sprawdzić, jak działają pod obciążeniem i jak wygląda ślad.

10. Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby użyte w tym laboratorium, wykonaj te czynności:

  1. W konsoli Google Cloud otwórz stronę Zarządzanie zasobami.
  2. Z listy projektów wybierz projekt do usunięcia, a potem kliknij Usuń.
  3. W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.
  4. Możesz też otworzyć Cloud Run w konsoli, wybrać wdrożoną usługę i ją usunąć.