Praktyczne techniki obserwowalności w przypadku aplikacji generatywnej AI w Pythonie

1. Omówienie

Aplikacje korzystające z generatywnej AI wymagają możliwości obserwacji jak każda inna aplikacja. Czy w przypadku generatywnej AI są wymagane specjalne techniki obserwowalności?

W tym module utworzysz prostą aplikację wykorzystującą generatywną AI. Wdróż ją w Cloud Run. Dodaj do niego niezbędne funkcje monitorowania i logowania, korzystając z usług i produktów dostrzegalności Google Cloud.

Czego się nauczysz

  • Dodawanie funkcji monitorowania i logowania do aplikacji z generatywną AI
  • Korzystanie ze wskaźników opartych na logach
  • Implementacja logowania i monitorowania za pomocą pakietu Open Telemetry SDK
  • Informacje o odpowiedzialnym przetwarzaniu danych przez AI

2. Wymagania wstępne

Jeśli nie masz jeszcze konta Google, utwórz nowe konto.

3. Konfigurowanie projektu

  1. Zaloguj się w konsoli Google Cloud za pomocą konta Google.
  2. Utwórz nowy projekt lub użyj istniejącego. Zapisz identyfikator projektu, który został właśnie utworzony lub wybrany.
  3. Włącz płatności w projekcie.
  4. Sprawdź, czy płatności są włączone w sekcji Moje projekty w Rozliczeniach usługi Google Cloud.
    • Jeśli w kolumnie Billing account nowego projektu widać wartość Billing is disabled:
      1. Kliknij 3 kropki w kolumnie Actions.
      2. Kliknij Zmień rozliczenia.
      3. Wybierz konto rozliczeniowe, którego chcesz użyć.
    • Jeśli uczestniczysz w wydarzeniu na żywo, konto będzie prawdopodobnie nazywać się Próbne konto rozliczeniowe Google Cloud Platform.

4. Przygotowanie edytora Cloud Shell

  1. Otwórz Edytor Cloud Shell. Jeśli pojawi się to pytanie o autoryzację Cloud Shell do wywoływania gcloud za pomocą Twoich danych logowania, kliknij Autoryzuj, aby kontynuować.
    Kliknij, aby autoryzować Cloud Shell
  2. Otwórz okno terminala
    1. Kliknij menu z 3 kreskami Ikona menu z 3 kreskami
    2. Kliknij Terminal.
    3. Kliknij Nowy terminal
      Otwieranie nowego terminala w edytorze Cloud Shell.
  3. W terminalu skonfiguruj identyfikator projektu:
    gcloud config set project [PROJECT_ID]
    
    Zastąp [PROJECT_ID] identyfikatorem projektu. Jeśli np. identyfikator projektu to lab-example-project, polecenie będzie wyglądać tak:
    gcloud config set project lab-project-id-example
    
    Jeśli pojawi się komunikat, że gcloud prosi o Twoje dane logowania do interfejsu GCPI API, kliknij Autoryzuj, aby kontynuować.
    Kliknij, aby autoryzować Cloud Shell
    Po pomyślnym wykonaniu tej czynności powinien wyświetlić się komunikat:
    Updated property [core/project].
    
    Jeśli widzisz WARNING i pojawia się pytanie Do you want to continue (Y/N)?, prawdopodobnie nieprawidłowo wpisano identyfikator projektu. Gdy znajdziesz prawidłowy identyfikator projektu, naciśnij N, a potem Enter i spróbuj ponownie uruchomić polecenie gcloud config set project.
  4. (Opcjonalnie) Jeśli masz problem ze znalezieniem identyfikatora projektu, uruchom to polecenie, aby wyświetlić identyfikatory wszystkich swoich projektów posortowane według czasu utworzenia w kolejności malejącej:
    gcloud projects list \
         --format='value(projectId,createTime)' \
         --sort-by=~createTime
    

5. Włączanie interfejsów API Google

W terminalu włącz interfejsy API Google wymagane w tym module:

gcloud services enable \
     run.googleapis.com \
     cloudbuild.googleapis.com \
     aiplatform.googleapis.com \
     logging.googleapis.com \
     monitoring.googleapis.com \
     cloudtrace.googleapis.com

Wykonanie tego polecenia może trochę potrwać. W efekcie wyświetli się komunikat o udanym przeprowadzeniu operacji podobny do tego:

Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.

Jeśli pojawi się komunikat o błędzie rozpoczynający się od ERROR: (gcloud.services.enable) HttpError accessing i zawierający informacje o błędzie podobne do tych poniżej, powtórz polecenie po 1–2 minutach.

"error": {
  "code": 429,
  "message": "Quota exceeded for quota metric 'Mutate requests' and limit 'Mutate requests per minute' of service 'serviceusage.googleapis.com' ...",
  "status": "RESOURCE_EXHAUSTED",
  ...
}

6. Tworzenie aplikacji w Pythonie za pomocą Gen AI

Na tym etapie napiszesz kod prostej aplikacji działającej na podstawie żądań, która korzysta z modelu Gemini, aby wyświetlać 10 ciekawych faktów o wybranym przez Ciebie zwierzęciu. Aby utworzyć kod aplikacji, wykonaj te czynności.

  1. Utwórz w terminalu katalog codelab-o11y:
    mkdir ~/codelab-o11y
    
  2. Zmień bieżący katalog na codelab-o11y:
    cd ~/codelab-o11y
    
  3. Utwórz requirements.txt z listą zależności:
    cat > requirements.txt << EOF
    Flask==3.0.0
    gunicorn==23.0.0
    google-cloud-aiplatform==1.59.0
    google-auth==2.32.0
    EOF
    
  4. Utwórz plik main.py i otwórz go w edytorze Cloud Shell:
    cloudshell edit main.py
    
    W oknie edytora nad terminalem powinien pojawić się pusty plik. Ekran powinien wyglądać tak:
    wyświetlenie edytora Cloud Shell po rozpoczęciu edytowania pliku main.py,
  5. Skopiuj ten kod i wklej go do otwartego pliku main.py:
    import os
    from flask import Flask, request
    import google.auth
    import vertexai
    from vertexai.generative_models import GenerativeModel
    
    _, project = google.auth.default()
    app = Flask(__name__)
    
    @app.route('/')
    def fun_facts():
        vertexai.init(project=project, location='us-central1')
        model = GenerativeModel('gemini-1.5-flash')
        animal = request.args.get('animal', 'dog') 
        prompt = f'Give me 10 fun facts about {animal}. Return this as html without backticks.'
        response = model.generate_content(prompt)
        return response.text
    
    if __name__ == '__main__':
        app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
    
    Po kilku sekundach edytor Cloud Shell automatycznie zapisze kod.

Wdrażanie kodu aplikacji generatywnej AI w Cloud Run

  1. W oknie terminala uruchom polecenie, aby wdrożyć kod źródłowy aplikacji do Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Jeśli zobaczysz taki komunikat, oznacza to, że polecenie utworzy nowe repozytorium. Kliknij Enter.
    Deploying from source requires an Artifact Registry Docker repository to store built containers.
    A repository named [cloud-run-source-deploy] in region [us-central1] will be created.
    
    Do you want to continue (Y/n)?
    
    Proces wdrażania może potrwać kilka minut. Po zakończeniu procesu wdrażania zobaczysz dane wyjściowe podobne do tych:
    Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic.
    Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
    
  2. Skopiuj wyświetlony adres URL usługi Cloud Run na osobną kartę lub do osobnego okna w przeglądarce. Możesz też uruchomić to polecenie w terminalu, aby wydrukować adres URL usługi, a potem kliknąć wyświetlony adres URL, przytrzymując klawisz Ctrl, aby go otworzyć:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    Po otwarciu adresu URL może pojawić się błąd 500 lub komunikat:
    Sorry, this is just a placeholder...
    
    Oznacza to, że usługi nie zostały wdrożone. Zaczekaj chwilę i odśwież stronę. Na końcu zobaczysz tekst zaczynający się od słów Ciekawostki o psach i zawierający 10 ciekawostek o tych zwierzętach.

Spróbuj wejść w interakcję z aplikacją, aby dowiedzieć się ciekawych faktów o różnych zwierzętach. Aby to zrobić, dodaj parametr animal do adresu URL, np. ?animal=[ANIMAL], gdzie [ANIMAL] to nazwa zwierzęcia. Na przykład dodaj ?animal=cat, aby uzyskać 10 ciekawostek o kotach, lub ?animal=sea turtle, aby uzyskać 10 ciekawostek o żółwiach morskich.

7. Sprawdzanie wywołań interfejsu Vertex API

Audyt wywołań interfejsu Google API pozwala uzyskać odpowiedzi na pytania w rodzaju „kto, gdzie i kiedy wywołał dany interfejs API?”. Weryfikacja jest ważna podczas rozwiązywania problemów z aplikacją, badania wykorzystania zasobów lub przeprowadzania analizy kryminalistycznej oprogramowania.

Logi kontrolne umożliwiają śledzenie działań administracyjnych i systemowych, a także rejestrowanie wywołań operacji interfejsu API „odczytywanie danych” i „zapisywanie danych”. Aby sprawdzić żądania Vertex AI dotyczące generowania treści, musisz włączyć logi kontrolne „Odczyt danych” w konsoli Cloud.

  1. Kliknij przycisk poniżej, aby otworzyć stronę Dzienniki kontrolne w konsoli Google Cloud

  2. Upewnij się, że na stronie wybrany jest projekt utworzony na potrzeby tego laboratorium. Wybrany projekt jest widoczny w lewym górnym rogu strony obok menu hamburgera:
    Menu projektu w konsoli Google Cloud
    W razie potrzeby wybierz odpowiedni projekt z menu.
  3. W tabeli Konfiguracja logów kontrolnych dostępu do danych w kolumnie Usługa znajdź usługę Vertex AI API i kliknij pole wyboru po lewej stronie jej nazwy.
    Wybierz interfejs Vertex AI API
  4. W panelu informacyjnym po prawej stronie wybierz typ audytu „Odczyt danych”.
    Sprawdzanie dzienników odczytu danych
  5. Kliknij Zapisz.

Aby wygenerować dzienniki kontrolne, otwórz adres URL usługi. Aby uzyskać inne wyniki, odśwież stronę, zmieniając wartość parametru ?animal=.

Poznawanie dzienników kontrolnych

  1. Kliknij przycisk poniżej, aby otworzyć stronę Eksplorator logów w konsoli Google Cloud:

  2. Wklej ten filtr w panelu Zapytanie.
    LOG_ID("cloudaudit.googleapis.com%2Fdata_access") AND
    protoPayload.serviceName="aiplatform.googleapis.com"
    
    Panel Zapytanie to edytor znajdujący się u góry strony Eksplorator logów:
    Zapytania do dzienników kontrolnych
  3. Kliknij Uruchom zapytanie.
  4. Wybierz jeden z wpisów w dzienniku kontrolnym i rozwiń pola, aby sprawdzić informacje zarejestrowane w dzienniku.
    Możesz zobaczyć szczegóły wywołania interfejsu Vertex API, w tym użytą metodę i model. Możesz też zobaczyć tożsamość wywołującego i uprawnienia autoryzujące wywołanie.

8. Rejestrowanie interakcji z generatywną AI

W dziennikach kontrolnych nie ma parametrów żądania ani danych odpowiedzi interfejsu API. Te informacje mogą jednak być ważne w przypadku problemów z analizą aplikacji i przepływu pracy. W tym kroku wypełniamy tę lukę, dodając rejestrowanie aplikacji. Logowanie korzysta z klasycznego pakietu Pythona logging. W środowisku produkcyjnym możesz używać innego frameworku rejestrowania, ale zasady są takie same.

Pakiet logging w Pythonie nie wie, jak zapisywać logi w Google Cloud. Obsługuje zapisywanie do standardowego wyjścia (domyślnie stderr) lub do pliku. Cloud Run zawiera jednak funkcje, które umożliwiają automatyczne przechwytywanie informacji drukowanych na standardowym wyjściu i przetwarzanie ich w Cloud Logging. Aby dodać do aplikacji generatywnej AI funkcje rejestrowania, postępuj zgodnie z podanymi niżej instrukcjami.

  1. Wróć do okna (lub karty) Cloud Shell w przeglądarce.
  2. W terminalu ponownie otwórz main.py:
    cloudshell edit ~/codelab-o11y/main.py
    
  3. Wprowadź te zmiany w kodzie aplikacji:
    1. odszukać ostatnie oświadczenie o importowaniu; Powinien to być wiersz 5:
      from vertexai.generative_models import GenerativeModel
      
      Umieść kursor na następnym wierszu (wiersz 6) i wklej tam ten blok kodu.
      import sys, json, logging
      class JsonFormatter(logging.Formatter):
          def format(self, record):
              json_log_object = {
                  'severity': record.levelname,
                  'message': record.getMessage(),
              }
              json_log_object.update(getattr(record, 'json_fields', {}))
              return json.dumps(json_log_object)
      logger = logging.getLogger(__name__)
      sh = logging.StreamHandler(sys.stdout)
      sh.setFormatter(JsonFormatter())
      logger.addHandler(sh)
      logger.setLevel(logging.DEBUG)
      
      
    2. Znajdź kod, który wywołuje model do generowania treści. Powinien to być wiersz 30:
      response = model.generate_content(prompt)
      
      Umieść kursor na początku NASTĘPNEGO wiersza (wiersz 31) i wklej tam ten blok kodu.
          json_fields = {
               'animal': animal,
               'prompt': prompt,
               'response': response.to_dict(),
          }
          logger.debug('content is generated', extra={'json_fields': json_fields})
      
      
    Te zmiany konfigurują standardowe logowanie w Pythonie, aby używać niestandardowego formatowania do generowania ciągu znaków JSON, który jest zgodny z wytycznymi dotyczącymi formatowania strukturalnego. Logowanie jest skonfigurowane tak, aby drukować logi do pliku stdout, gdzie są one zbierane przez agenta logowania Cloud Run i asynchronicznie przesyłane do Cloud Logging. W logach znajdziesz parametry zwierzęcia z żądania oraz prompt i odpowiedź modelu.Po kilku sekundach edytor Cloud Shell automatycznie zapisuje zmiany.

Wdrażanie kodu aplikacji generatywnej AI w Cloud Run

  1. W oknie terminala uruchom polecenie, aby wdrożyć kod źródłowy aplikacji do Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Jeśli zobaczysz taki komunikat, oznacza to, że polecenie utworzy nowe repozytorium. Kliknij Enter.
    Deploying from source requires an Artifact Registry Docker repository to store built containers.
    A repository named [cloud-run-source-deploy] in region [us-central1] will be created.
    
    Do you want to continue (Y/n)?
    
    Proces wdrażania może potrwać kilka minut. Po zakończeniu procesu wdrażania zobaczysz dane wyjściowe podobne do tych:
    Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic.
    Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
    
  2. Skopiuj wyświetlony adres URL usługi Cloud Run na osobną kartę lub do osobnego okna w przeglądarce. Możesz też uruchomić to polecenie w terminalu, aby wydrukować adres URL usługi, a potem kliknąć wyświetlony adres URL, przytrzymując klawisz Ctrl, aby go otworzyć:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    Po otwarciu adresu URL może pojawić się błąd 500 lub komunikat:
    Sorry, this is just a placeholder...
    
    Oznacza to, że usługi nie zostały wdrożone. Zaczekaj chwilę i odśwież stronę. Na końcu zobaczysz tekst zaczynający się od słów Ciekawostki o psach i zawierający 10 ciekawostek o tych zwierzętach.

Aby wygenerować dzienniki aplikacji, otwórz adres URL usługi. Aby uzyskać inne wyniki, odśwież stronę, zmieniając wartość parametru ?animal=.
Aby wyświetlić logi aplikacji:

  1. Kliknij przycisk poniżej, aby otworzyć stronę Eksplorator logów w konsoli Google Cloud:

  2. Wklej ten filtr w panelu Zapytanie (pozycja 2 w interfejsie Eksploratora logów):
    LOG_ID("run.googleapis.com%2Fstdout") AND
    severity=DEBUG
    
  3. Kliknij Uruchom zapytanie.

Wynik zapytania zawiera logi z promptem i odpowiedzią Vertex AI, w tym oceny bezpieczeństwa.

9. Liczenie interakcji z generatywną AI

Cloud Run zapisuje dane zarządzane, których można używać do monitorowania wdrożonych usług. Dane monitorowania zarządzane przez użytkowników zapewniają większą kontrolę nad danymi i częstotliwością ich aktualizacji. Wdrożenie takiej metryki wymaga napisania kodu, który zbiera dane i zapisują je w Cloud Monitoring. Aby dowiedzieć się, jak zaimplementować tę funkcję za pomocą pakietu OpenTelemetry SDK, przejdź do następnego (opcjonalnego) kroku.

Ten krok pokazuje alternatywę dla implementowania danych o użytkownikach w kodzie – dane oparte na logach. Dane oparte na logach umożliwiają generowanie danych monitorowania na podstawie wpisów logów zapisywanych przez aplikację w Cloud Logging. Do zdefiniowania danych typu licznik na podstawie dzienników aplikacji użyjemy dzienników aplikacji zaimplementowanych w poprzednim kroku. Dane zliczają liczbę udanych wywołań interfejsu Vertex API.

  1. Spójrz na okno Eksploratora logów, którego użyliśmy w poprzednim kroku. W panelu Zapytanie odszukaj menu Działania i kliknij je, aby je otworzyć. Menu znajdziesz na zrzucie ekranu poniżej:
    Pasek narzędzi wyników zapytania z menu Działania
  2. W otwartym menu kliknij Utwórz wskaźnik, aby otworzyć panel Utwórz wskaźnik oparty na logach.
  3. Aby skonfigurować nowy wskaźnik licznika w panelu Utwórz dane oparte na logach:
    1. Ustaw Typ wskaźnika: wybierz Licznik.
    2. W sekcji Szczegóły ustaw te pola:
    3. Pozostaw wartości w sekcji Wybór filtra. Pamiętaj, że pole Filtrowanie wersji zawiera ten sam filtr, który został użyty do wyświetlenia dzienników aplikacji.
    4. (Opcjonalnie) Dodaj etykietę, która pomoże zliczać liczbę połączeń dla każdego zwierzęcia. UWAGA: ta etykieta może znacznie zwiększyć liczebność danych i nie jest zalecana do użytku w produkcji:
      1. Kliknij Dodaj etykietę.
      2. W sekcji Etykiety ustaw te pola:
        • Nazwa etykiety: ustaw nazwę na animal.
        • Opis: wpisz opis etykiety. Na przykład: Animal parameter.
        • Typ etykiety: kliknij STRING.
        • Nazwa pola: wpisz jsonPayload.animal.
        • Wyrażenie regularne: pozostaw puste.
      3. Kliknij przycisk Gotowe.
    5. Aby utworzyć dane, kliknij Utwórz dane.

Możesz też utworzyć wskaźnik oparty na logach na stronie Wskaźniki oparte na logach, używając gcloud logging metrics create polecenia wiersza poleceń lub google_logging_metric zasobu Terraform.

Aby wygenerować dane, otwórz adres URL usługi. Odśwież otwartą stronę kilka razy, aby wykonać kilka wywołań modelu. Podobnie jak wcześniej, spróbuj użyć w tym parametrze różnych zwierząt.

Wpisz zapytanie PromQL, aby wyszukać dane wskaźnika opartego na logach. Aby wpisać zapytanie PromQL:

  1. Kliknij przycisk poniżej, aby otworzyć stronę Eksplorator danych w konsoli Google Cloud:

  2. Na pasku narzędzi w panelu kreatora zapytań kliknij przycisk o nazwie < > MQL lub < > PromQL. Lokalizacja przycisku – patrz obraz poniżej.
    Lokalizacja przycisku MQL w narzędziu Metrics Explorer
  3. Sprawdź, czy w opcji Język wybrana jest opcja PromQL. Przełącznik języka znajduje się na tej samej belce narzędzi, która umożliwia formatowanie zapytania.
  4. Wpisz zapytanie w edytorze Zapytania:
    sum(rate(logging_googleapis_com:user_model_interaction_count{monitored_resource="cloud_run_revision"}[${__interval}]))
    
    Więcej informacji o używaniu PromQL znajdziesz w artykule PromQL w Cloud Monitoring.
  5. Kliknij Uruchom zapytanie. Zobaczysz wykres liniowy podobny do tego:
    Wyświetlanie danych zapytań

    Pamiętaj, że gdy włączony jest przełącznik Automatyczne uruchamianie, przycisk Uruchom zapytanie nie jest widoczny.

10. (Opcjonalnie) Używanie OpenTelemetry do monitorowania i śledzenia

Jak wspomnieliśmy w poprzednim kroku, dane można implementować za pomocą pakietu OpenTelemetry (Otel) SDK. Zalecane jest używanie usługi OTel w architekturach mikroserwisów. Ten krok obejmuje:

  • Inicjowanie komponentów OTel w celu obsługi śledzenia i monitorowania aplikacji
  • Wypełnianie konfiguracji OTel za pomocą metadanych zasobów środowiska Cloud Run
  • Instrumentowanie aplikacji Flask z automatycznymi funkcjami śledzenia
  • Wdrożenie licznika do monitorowania liczby udanych wywołań modelu
  • Korelacja śledzenia z logami aplikacji

Zalecana architektura usług na poziomie usługi polega na użyciu kolektora Otel do zbierania i przetwarzania wszystkich danych dotyczących możliwości obserwacji w przypadku co najmniej jednej usługi. Ze względu na prostotę kod na tym etapie nie korzysta z kolekcjonera. Zamiast tego używa eksportów OTel, które zapisują dane bezpośrednio w Google Cloud.

Konfigurowanie komponentów usługi OTel na potrzeby monitorowania śledzenia i danych

  1. Wróć do okna (lub karty) Cloud Shell w przeglądarce.
  2. W terminalu zaktualizuj plik requirements.txt, dodając do niego listę dodatkowych zależności:
    cat >> ~/codelab-o11y/requirements.txt << EOF
    opentelemetry-api==1.24.0
    opentelemetry-sdk==1.24.0
    opentelemetry-exporter-otlp-proto-http==1.24.0
    opentelemetry-instrumentation-flask==0.45b0
    opentelemetry-instrumentation-requests==0.45b0
    opentelemetry-exporter-gcp-trace==1.7.0
    opentelemetry-exporter-gcp-monitoring==1.7.0a0   
    EOF
    
  3. Utwórz nowy plik setup_opentelemetry.py:
    cloudshell edit ~/codelab-o11y/setup_opentelemetry.py
    
    W oknie edytora nad terminalem powinien pojawić się pusty plik.
  4. Skopiuj ten kod i wklej go do otwartego pliku setup_opentelemetry.py:
    import os
    
    from opentelemetry import metrics
    from opentelemetry import trace
    from opentelemetry.exporter.cloud_monitoring import CloudMonitoringMetricsExporter
    from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
    from opentelemetry.resourcedetector.gcp_resource_detector import GoogleCloudResourceDetector
    from opentelemetry.sdk.metrics import MeterProvider
    from opentelemetry.sdk.trace import TracerProvider
    from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
    from opentelemetry.sdk.resources import get_aggregated_resources, Resource, CLOUD_ACCOUNT_ID, SERVICE_NAME
    from opentelemetry.sdk.trace.export import BatchSpanProcessor
    
    resource = get_aggregated_resources(
        [GoogleCloudResourceDetector(raise_on_error=True)]
    )
    resource = resource.merge(Resource.create(attributes={
        SERVICE_NAME: os.getenv("K_SERVICE"),
    }))
    
    meter_provider = MeterProvider(
        resource=resource,
        metric_readers=[
            PeriodicExportingMetricReader(
                CloudMonitoringMetricsExporter(), export_interval_millis=5000
            )
        ],
    )
    metrics.set_meter_provider(meter_provider)
    meter = metrics.get_meter(__name__)
    
    trace_provider = TracerProvider(resource=resource)
    processor = BatchSpanProcessor(CloudTraceSpanExporter(
        # send all resource attributes
        resource_regex=r".*"
    ))
    trace_provider.add_span_processor(processor)
    trace.set_tracer_provider(trace_provider)
    
    def google_trace_id_format(trace_id: int) -> str:
        project_id = resource.attributes[CLOUD_ACCOUNT_ID]
        return f'projects/{project_id}/traces/{trace.format_trace_id(trace_id)}'
    
    Po kilku sekundach edytor Cloud Shell automatycznie zapisze kod.

Dodawanie do kodu aplikacji funkcji śledzenia i monitorowania za pomocą narzędzia OTel

  1. W terminalu ponownie otwórz main.py:
    cloudshell edit ~/codelab-o11y/main.py
    
  2. Wprowadź te zmiany w kodzie aplikacji:
    1. Przed wierszem import os (wiersz 1) wstaw ten kod (zwróć uwagę na pusty wiersz na końcu):
      from setup_opentelemetry import google_trace_id_format
      from opentelemetry import metrics, trace
      from opentelemetry.instrumentation.requests import RequestsInstrumentor
      from opentelemetry.instrumentation.flask import FlaskInstrumentor
      
      
    2. Po deklaracji metody format() (wiersz 9) wklej ten kod (zwróć uwagę na wcięcia):
              span = trace.get_current_span()
      
    3. Po wierszu 13 (zawierającym "message": record.getMessage()) wklej ten kod (zwróć uwagę na wcięcia):
                  "logging.googleapis.com/trace": google_trace_id_format(span.get_span_context().trace_id),
                  "logging.googleapis.com/spanId": trace.format_span_id(span.get_span_context().span_id),
      
      Te 2 dodatkowe atrybuty ułatwiają korelację dzienników aplikacji i zakresów śledzenia w usłudze OTel.
    4. Po linii app = Flask(__name__) (wiersz 31) wklej ten kod:
      FlaskInstrumentor().instrument_app(app)
      RequestsInstrumentor().instrument()
      
      Te wiersze umożliwiają śledzenie wszystkich przychodzących i wychodzących żądań aplikacji Flask.
    5. Tuż po nowo dodanym kodzie (po wierszu 33) dodaj ten kod:
      meter = metrics.get_meter(__name__)
      requests_counter = meter.create_counter(
          name="model_call_counter",
          description="number of model invocations",
          unit="1"
      )
      
      Te wiersze tworzą nowy wskaźnik typu licznik o nazwie model_call_counter i rejestrują go na potrzeby eksportu.
    6. Po wywołaniu logger.debug() (wiersz 49) wklej ten kod:
          requests_counter.add(1, {'animal': animal})
      
      Ta zmiana spowoduje zwiększenie licznika o 1 za każdym razem, gdy aplikacja wywoła interfejs Vertex API, aby wchodzić w interakcje z modelem Gemini.

Wdrażanie kodu aplikacji generatywnej AI w Cloud Run

  1. W oknie terminala uruchom polecenie, aby wdrożyć kod źródłowy aplikacji do Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Jeśli zobaczysz taki komunikat, oznacza to, że polecenie utworzy nowe repozytorium. Kliknij Enter.
    Deploying from source requires an Artifact Registry Docker repository to store built containers.
    A repository named [cloud-run-source-deploy] in region [us-central1] will be created.
    
    Do you want to continue (Y/n)?
    
    Proces wdrażania może potrwać kilka minut. Po zakończeniu procesu wdrażania zobaczysz dane wyjściowe podobne do tych:
    Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic.
    Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
    
  2. Skopiuj wyświetlony adres URL usługi Cloud Run na osobną kartę lub do osobnego okna w przeglądarce. Możesz też uruchomić to polecenie w terminalu, aby wydrukować adres URL usługi, a potem kliknąć wyświetlony adres URL, przytrzymując klawisz Ctrl, aby go otworzyć:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    Po otwarciu adresu URL może pojawić się błąd 500 lub komunikat:
    Sorry, this is just a placeholder...
    
    Oznacza to, że usługi nie zostały wdrożone. Zaczekaj chwilę i odśwież stronę. Na końcu zobaczysz tekst zaczynający się od słów Ciekawostki o psach i zawierający 10 ciekawostek o tych zwierzętach.

Aby wygenerować dane telemetryczne, otwórz adres URL usługi. Aby uzyskać inne wyniki, odśwież stronę, zmieniając wartość parametru ?animal=.

Analiza śladów aplikacji

  1. Kliknij przycisk poniżej, aby otworzyć stronę Eksplorator logów czasu w konsoli Cloud:

  2. Wybierz jeden z najnowszych śladów. Powinieneś/powinnaś zobaczyć 5 lub 6 elementów, które wyglądają jak na zrzucie ekranu poniżej.
    Przebieg aplikacji w Eksploratorze śledzonych zasobów
  3. Znajdź blok kodu, który śledzi wywołanie do metody obsługi zdarzenia (metoda fun_facts). Będzie to ostatni element o nazwie /.
  4. W panelu Szczegóły śledzenia kliknij Logi i zdarzenia. Zobaczysz logi aplikacji powiązane z tym konkretnym spanem. Korelacja jest wykrywana na podstawie identyfikatorów śledzenia i spanu w logu czasu. Powinieneś zobaczyć log aplikacji, który zawiera prompt i odpowiedź interfejsu Vertex API.

Wskaźnik licznika

  1. Kliknij przycisk poniżej, aby otworzyć stronę Eksplorator danych w konsoli Google Cloud:

  2. Na pasku narzędzi w panelu kreatora zapytań kliknij przycisk o nazwie < > MQL lub < > PromQL. Lokalizacja przycisku – patrz obraz poniżej.
    Lokalizacja przycisku MQL w narzędziu Metrics Explorer
  3. Sprawdź, czy w opcji Język wybrana jest opcja PromQL. Przełącznik języka znajduje się na tej samej belce narzędzi, która umożliwia formatowanie zapytania.
  4. Wpisz zapytanie w edytorze Zapytania:
    sum(rate(workload_googleapis_com:model_call_counter{monitored_resource="generic_task"}[${__interval}]))
    
  5. Kliknij Uruchom zapytanie.Gdy włączony jest przełącznik Automatyczne uruchamianie, przycisk Uruchom zapytanie nie jest widoczny.

11. (Opcjonalnie) Zaciemnione informacje poufne z logów

W kroku 10 odnotowaliśmy informacje o interakcjach aplikacji z modelem Gemini. Informacje te obejmowały nazwę zwierzęcia, prompt i odpowiedź modelu. Przechowywanie tych informacji w dzienniku powinno być bezpieczne, ale niekoniecznie w wielu innych przypadkach. Prośba może zawierać dane osobowe lub wrażliwe, których użytkownik nie chce przechowywać. Aby to rozwiązać, możesz zafałszować dane wrażliwe zapisywane w Cloud Logging. Aby zminimalizować modyfikacje kodu, zalecamy zastosowanie tego rozwiązania.

  1. Tworzenie tematu Pub/Sub do przechowywania przychodzących wpisów w logach
  2. Utwórz ujście logów, które przekierowuje pozyskane logi do tematu Pub/Sub.
  3. Utwórz potok Dataflow, który modyfikuje dzienniki przekierowywane do tematu Pub/Sub. Aby to zrobić:
    1. Czytanie wpisu w logu z tematu PubSub
    2. Sprawdzanie danych wejściowych rekordu pod kątem informacji poufnych za pomocą interfejsu DLP inspection API
    3. Usuń informacje poufne z ładunku za pomocą jednej z metod zapobiegania utracie danych.
    4. Zapisywanie zafałszowanego wpisu w pliku logów w Cloud Logging
  4. Wdrażanie potoku

12. (Opcjonalnie) Czyszczenie

Aby uniknąć opłat za zasoby i interfejsy API używane w tym samouczku, zalecamy wyczyszczenie po jego ukończeniu. Najprostszym sposobem na uniknięcie płatności jest usunięcie projektu utworzonego na potrzeby tego samouczka.

  1. Aby usunąć projekt, uruchom w terminalu polecenie usuwania projektu:
    PROJECT_ID=$(gcloud config get-value project)
    gcloud projects delete ${PROJECT_ID} --quiet
    
    Usunięcie projektu Cloud powoduje zaprzestanie naliczania opłat za wszystkie zasoby i interfejsy API używane w tym projekcie. Powinien pojawić się komunikat, w którym PROJECT_ID będzie identyfikatorem projektu:
    Deleted [https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID].
    
    You can undo this operation for a limited period by running the command below.
        $ gcloud projects undelete PROJECT_ID
    
    See https://cloud.google.com/resource-manager/docs/creating-managing-projects for information on shutting down projects.
    
  2. (Opcjonalnie) Jeśli pojawi się błąd, w kroku 5 sprawdź, jak znaleźć identyfikator projektu użyty w tym module. Zastąp nim polecenie w pierwszej instrukcji. Jeśli np. identyfikator projektu to lab-example-project, polecenie będzie wyglądać tak:
    gcloud projects delete lab-project-id-example --quiet
    

13. Gratulacje

W tym module udało Ci się utworzyć aplikację generatywnej AI, która do prognozowania korzysta z modela Gemini. W aplikacji zostały też zaimplementowane podstawowe funkcje monitorowania i logowania. Wdrożysz aplikację i zmiany z kodu źródłowego w Cloud Run. Następnie możesz używać usług Google Cloud Observability do śledzenia wydajności aplikacji, aby mieć pewność, że jest ona niezawodna.

Jeśli chcesz wziąć udział w badaniu wrażeń użytkowników (UX), aby ulepszyć produkty, z których korzystasz, zarejestruj się tutaj.

Oto kilka opcji dalszej nauki: