Metadaten zu Inferenzanfragen protokollieren

Die Agent Platform kann für jede Inferenzanfrage, die Ihr Projekt verarbeitet, einen strukturierten Logeintrag schreiben. In jedem Eintrag werden Metadaten zur Anfrage aufgezeichnet: das Modell, die Region, die Tokenanzahl (einschließlich Eingabetokens, Ausgabetokens, im Cache gespeicherte Tokens, Thought-Tokens), der Burndown des bereitgestellten Durchsatzes, die End-to-End-Anfragelatenz, der Fehlercode und alle von Ihnen angehängten Header- oder Anfragelabels. Einträge werden an Cloud Logging gesendet und können mit SQL in Observability Analytics abgefragt werden. Informationen zum Aktivieren des Loggings finden Sie unter Metadatenlogs für Inferenzanfragen aktivieren.

Beim Logging von Inferenzanfragen werden nur Metadaten aufgezeichnet. Es werden keine Prompts oder Antworten aufgezeichnet. Wenn Sie Prompt- und Antwortinhalte benötigen, verwenden Sie stattdessen das Anfrage-Antwort-Logging.

Auf dieser Seite wird beschrieben, wie Sie Metadatenlogs für Inferenzanfragen aktivieren, was die einzelnen Einträge enthalten und wie Sie sie abfragen.

Anwendungsfälle

Metadatenlogs für Inferenzanfragen beantworten Fragen, die mit aggregierten Messwerten nicht beantwortet werden können:

  • Sie können den Tokenverbrauch einem Team, einer Anwendung oder einem Mandanten zuordnen, indem Sie jeder Anfrage eigene Header-Labels, Anfrage-Labels oder beides hinzufügen.
  • Sie können sehen, welche einzelnen Anfragen auf Ihr Kontingent für den bereitgestellten Durchsatz angerechnet und welche on demand verarbeitet wurden.
  • Schlüsseln Sie Durchsatz, Latenz und Fehlerrate nach Header- oder Anfragelabels auf.
  • Caching-Verhalten pro Anfrage statt insgesamt messen.
  • Sie erhalten Einblick in die Nutzung auf Sekundenebene, z. B. warum ein Projekt 429-Fehler erhalten hat oder warum der bereitgestellte Durchsatz überschritten wurde. Schritte zur Behebung von 429-Fehlern finden Sie unter Fehlercode 429 beheben. Informationen zu den Sekunden, in denen sie aufgetreten sind, finden Sie unter Fehlerrate und Latenz nach Region.

Unterstützte API-Methoden für das Logging

Metadatenlogs für Inferenzanfragen werden für Folgendes unterstützt:

  • Gemini-Modelle, die generateContent oder streamGenerateContent verwenden, einschließlich der Bildgenerierung über diese Methoden.
  • Claude-Modelle, die rawPredict oder streamRawPredict verwenden. Andere Partnermodelle werden nicht protokolliert. Informationen zu Claude-Feldnamen finden Sie unter Tokenanzahl für Claude-Modelle.

Der bereitgestellte Durchsatz und alle „Pay as you go“-Optionen werden unterstützt.

Folgendes wird nicht unterstützt:

  • chatCompletions.
  • embedContent, predict und countTokens. Modelle, die Bilder über predict generieren, z. B. Imagen, werden nicht protokolliert.
  • Anfragen an optimierte Modelle, einschließlich Gemini-Modelle, die mit überwachter Feinabstimmung optimiert wurden.
  • Abstimmungsjobs, Batchinferenz und alle anderen Vorgänge mit langer Ausführungszeit.
  • Modelle, die Sie selbst in einem benutzerdefinierten Container bereitstellen.

Metadatenlogs für Inferenzanfragen aktivieren

Sie können Metadatenlogs für Inferenzanfragen für ein ganzes Projekt oder für ein bestimmtes Modell in einer bestimmten Region konfigurieren. Wenn Sie die Funktion auf Organisationsebene aktivieren müssen, wenden Sie sich bitte an Ihr Account-Management-Team. Es kann einige Minuten dauern, bis Logging-Konfigurationen wirksam werden.

Hinweis

  • Prüfen Sie, ob Sie die folgenden IAM-Berechtigungen für das Projekt haben: aiplatform.endpoints.setPublisherModelConfig und aiplatform.endpoints.fetchPublisherModelConfig, um die Einstellung zu ändern und zu lesen, sowie logging.buckets.get, logging.buckets.list, logging.buckets.update und logging.operations.get, um den Log-Bucket zu aktualisieren. Vordefinierte Rollen, die diese Berechtigungen enthalten, finden Sie unter Zugriffssteuerung und Zugriffssteuerung für Logging.
  • Entscheiden Sie, ob Sie ein Upgrade des Log-Buckets _Default auf Observability Analytics durchführen möchten. Sie benötigen das Upgrade, um Einträge mit SQL abzufragen oder detaillierte Messwerte in der Google Cloud Console aufzurufen. Das Upgrade dauert einige Minuten und kann nicht rückgängig gemacht werden. Einträge, die vor dem Upgrade geschrieben wurden, können danach nicht mit SQL abgefragt werden.
  • Preise für Cloud Logging ansehen Einträge werden für die Aufbewahrungsdauer des Buckets gespeichert, standardmäßig 30 Tage. Es fallen Gebühren für die Aufnahme und Speicherung in Cloud Logging an. Informationen zum Schätzen Ihrer Kosten finden Sie unter Preise.

In der Console aktivieren

Wenn Sie das Logging in der Console aktivieren, wird es für jedes Modell im Projekt aktiviert, sowohl für Gemini als auch für Claude, für den bereitgestellten Durchsatz und für jede Pay-as-you-go-Option, die die Logs unterstützen. Außerdem wird der Log-Bucket _Default aktualisiert, falls noch kein Upgrade durchgeführt wurde. Damit wird der projektweite Standardwert festgelegt, der unter Konfigurationspriorität beschrieben wird. Prüfen Sie vor dem Start die Berechtigungen und das Bucket-Upgrade.

  1. Rufen Sie in der Google Cloud Console die Seite Bereitgestellter Durchsatz auf.

    Zu „Bereitgestellter Durchsatz“

  2. Führen Sie einen der folgenden Schritte aus:

    • Klicken Sie im Banner mit der Meldung Die Gemini Enterprise Agent Platform aktualisiert die Beobachtbarkeit auf Aktivieren.
    • Klicken Sie in der Symbolleiste auf Messwerteinstellungen. Wählen Sie Detaillierte Messwerte aktivieren aus und klicken Sie dann auf Speichern.
    Das Banner für das Beobachtbarkeitsupgrade auf der Seite „Bereitgestellter Durchsatz“
    Abbildung 1. Das Banner für das Beobachtbarkeits-Upgrade auf der Seite „Bereitgestellter Durchsatz“.
    Der Bereich „Messwerteinstellungen“ mit der Option „Detaillierte Messwerte aktivieren“
    Abbildung 2. Der Bereich „Messwerteinstellungen“ mit der Option „Detaillierte Messwerte aktivieren“
  3. Prüfen Sie im Dialogfeld Detaillierte Messwerte aktivieren? die Details zum Logging und zum Bucket-Upgrade und klicken Sie dann auf Aktivieren.

Das Dialogfeld wird geschlossen, sobald die Protokollierung aktiviert ist. Das Bucket-Upgrade wird im Hintergrund fortgesetzt und kann einige Minuten dauern. Während der Ausführung wird im Banner „Detaillierte Messwerte sind aktiviert und für den Log-Bucket ‚_Default‘ dieses Projekts wird ein Upgrade auf Observability Analytics durchgeführt“ angezeigt.

Wenn im Banner stattdessen angezeigt wird, dass der Bucket nicht aktualisiert wurde, klicken Sie auf Upgrade, um es noch einmal zu versuchen. Wenn der Bucket nicht aktualisiert werden kann, können anfragebezogene Logs nicht abgefragt werden. Klicken Sie auf Messwerteinstellungen und wählen Sie Detaillierte Messwerte deaktivieren aus, um die Gebühren zu beenden.

Rangfolge der Konfigurationen

Die Agent Platform löst die Einstellung für jede Anfrage in dieser Reihenfolge auf:

  1. Die Einstellung pro Modell und pro Region, falls eine festgelegt ist.
  2. Der projektweite Standardwert, wenn die Einstellung pro Modell nicht festgelegt ist.
  3. Wenn keines von beiden festgelegt ist, ist das Logging deaktiviert.

Die Einstellung pro Modell hat Vorrang vor der Standardeinstellung des Projekts. Sie können das Logging für das gesamte Projekt aktivieren und für ein Modell mit hohem Volumen in einer Region deaktivieren oder umgekehrt.

Mit der REST API aktivieren

Sie konfigurieren Metadatenlogs für Inferenzanfragen mit der Methode setPublisherModelConfig und setzen inferenceEventLoggingConfig.state auf ENABLED.

Wenn Sie den projektweiten Standardwert festlegen möchten, geben Sie das Projekt an:

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID:setPublisherModelConfig" \
  -d '{
        "publisherModelConfig": {
          "inferenceEventLoggingConfig": {"state": "ENABLED"}
        },
        "updateMask": "inferenceEventLoggingConfig"
      }'

Wenn Sie ein Modell in einer Region überschreiben möchten, adressieren Sie das Publisher-Modell:

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/PUBLISHER/models/MODEL:setPublisherModelConfig" \
  -d '{
        "publisherModelConfig": {
          "inferenceEventLoggingConfig": {"state": "ENABLED"}
        },
        "updateMask": "inferenceEventLoggingConfig"
      }'

Setzen Sie PUBLISHER für Gemini-Modelle auf google und für Claude-Modelle auf anthropic. Wenn Sie beispielsweise das Logging für Claude Sonnet 4.5 am globalen Endpunkt aktivieren möchten, verwenden Sie publishers/anthropic/models/claude-sonnet-4-5, wobei LOCATION auf global festgelegt ist. Informationen zu Claude-Modell-IDs finden Sie unter Claude-Modelle.

Die Methode gibt einen Vorgang mit langer Ausführungszeit zurück.

Logging-Konfiguration abrufen

Lesen Sie die aktuelle Konfiguration mit der Methode fetchPublisherModelConfig. Verwenden Sie das Projekt, um den projektweiten Standardwert zu lesen, oder ein Publisher-Modell, um dessen Überschreibung zu lesen.

curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID:fetchPublisherModelConfig"
curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/PUBLISHER/models/MODEL:fetchPublisherModelConfig"

Die Antwort enthält die Einstellungen, die für diese Ressource festgelegt sind:

{
  "inferenceEventLoggingConfig": {
    "state": "ENABLED"
  }
}

Prüfen, ob das Logging funktioniert

  1. Senden Sie eine Anfrage an ein von Ihnen aktiviertes Modell.
  2. Führen Sie im Log-Explorer die folgende Abfrage aus. Die meisten Einträge werden innerhalb von 12 Sekunden angezeigt. Es kann jedoch bis zu 5 Minuten dauern.

    logName="projects/PROJECT_ID/logs/aiplatform.googleapis.com%2Finference_request"
    
  3. Öffnen Sie Observability Analytics und führen Sie eine beliebige Beispielabfrage aus, um zu prüfen, ob SQL funktioniert. Wenn die Abfrage meldet, dass das Dataset nicht gefunden wurde, ist das Log-Bucket-Upgrade noch nicht abgeschlossen.

Ein Eintrag „inference_request“ im Log-Explorer, maximiert auf „jsonPayload“
Abbildung 3. Ein „inference_request“-Eintrag im Log-Explorer, maximiert auf „jsonPayload“.

Logging deaktivieren

Rufen Sie in der Google Cloud Console die Seite Bereitgestellter Durchsatz auf, klicken Sie auf Messwerteinstellungen, wählen Sie Detaillierte Messwerte deaktivieren aus und klicken Sie dann auf Speichern. Dadurch wird In der Console aktivieren rückgängig gemacht.

Gehen Sie bei der REST API so vor:

Deaktivieren Sie das Logging, indem Sie inferenceEventLoggingConfig.state für dieselbe Ressource, für die Sie es aktiviert haben, auf DISABLED setzen.

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID:setPublisherModelConfig" \
  -d '{
        "publisherModelConfig": {
          "inferenceEventLoggingConfig": {"state": "DISABLED"}
        },
        "updateMask": "inferenceEventLoggingConfig"
      }'

Da eine modellspezifische Einstellung Vorrang vor der Standardeinstellung des Projekts hat, wird ein explizit aktiviertes Modell durch die Deaktivierung auf Projektebene nicht deaktiviert. Löschen oder deaktivieren Sie auch die modellspezifische Einstellung.

Wo Logs geschrieben werden

Einträge werden in das folgende Log geschrieben:

projects/PROJECT_NUMBER/logs/aiplatform.googleapis.com%2Finference_request

Von dort aus haben Sie die Standard-Cloud Logging-Ziele:

  • Observability Analytics: Fragen Sie die Einträge mit SQL in Observability Analytics in derGoogle Cloud Console ab.
  • Verknüpftes BigQuery-Dataset: Verknüpfen Sie ein Dataset, um dieselben Daten aus BigQuery zu lesen. Weitere Informationen finden Sie unter Verknüpftes BigQuery-Dataset abfragen.
  • Zusammengefasste Senken: Einträge aus jedem Projekt in einem Ordner oder einer Organisation mit einer einzigen Senke erfassen. Filtern Sie nach logName="projects/*/logs/aiplatform.googleapis.com%2Finference_request".

Informationen zum Erfassen von Einträgen aus jedem Projekt in einem Ordner oder einer Organisation finden Sie unter Übersicht über aggregierte Senken.

Einträge können kurz nach Abschluss der Anfrage abgefragt werden. Die meisten Einträge sind innerhalb von 12 Sekunden abfragbar. Es kann jedoch bis zu 5 Minuten dauern.

Schema für Logeinträge

Jeder Eintrag besteht aus zwei Teilen, die Sie separat abfragen: der überwachten Ressource und ihren Labels, die angeben, was die Anfrage verarbeitet hat, und der JSON-Nutzlast, die aufzeichnet, was die Anfrage getan hat. In den folgenden Abschnitten werden beide beschrieben.

Ressourcenlabels

Für freigegebene Publisher-Modelle ist der Typ der überwachten Ressource aiplatform.googleapis.com/PublisherModel mit den folgenden Labels.

Label Typ Hinweise
resource_container STRING Das Projekt, das die Anfrage bereitgestellt hat.
location STRING Die Region, die die Anfrage verarbeitet hat, z. B. us-central1. Anfragen, die an den globalen Endpunkt gesendet werden, melden global.
publisher STRING Der Modell-Publisher, z. B. google oder anthropic.
model_user_id STRING Das Modell, z. B. gemini-2.5-pro.

Nutzlastfelder

Feldname Typ Hinweise
method ENUM GENERATE_CONTENT, STREAM_GENERATE_CONTENT, RAW_PREDICT oder STREAM_RAW_PREDICT.
trafficType ENUM Die Nutzungsoption, die die Anfrage verarbeitet hat. Aktuelle Werte sind PROVISIONED_THROUGHPUT, ON_DEMAND, ON_DEMAND_FLEX und ON_DEMAND_PRIORITY. Fehlt bei fehlgeschlagenen Anfragen.
requestStartTime TIMESTAMP Der Zeitpunkt, zu dem das bereitstellende Frontend die Anfrage zugelassen hat.
requestDuration STRING End-to-End-Bereitstellungslatenz, formatiert als Dauerstring, z. B. 3.53s.
generateContentDetails.usageMetadata JSON Tokenanzahl für generateContent und streamGenerateContent, einschließlich Aufschlüsselung nach Modalität. Die Bildausgabe wird hier als IMAGE-Eintrag in candidatesTokensDetails angezeigt.
rawPredictDetails.usageMetadata JSON Tokenanzahl für rawPredict und streamRawPredict, einschließlich Partnermodellen.
provisionedThroughput JSON Vorhanden für Traffic mit bereitgestelltem Durchsatz.
httpHeaders JSON Erfasste Anfrageheader.
error JSON Nur vorhanden, wenn der Schweregrad ERROR ist.
principal JSON Das Dienstkonto, von dem die Anfrage stammt, falls verfügbar.

Das Feld LogEntry.labels enthält gen_ai.operation.name, das den semantischen Konventionen von OpenTelemetry für generative KI entspricht. Sowohl generateContent als auch streamGenerateContent melden generate_content. Sowohl rawPredict als auch streamRawPredict melden raw_predict.

Felder für bereitgestellten Durchsatz

Feldname Typ Hinweise
ptChargedInputTokenCount INT64 Eingabetokens, die auf Ihr Kontingent für Bereitgestellten Durchsatz angerechnet werden, nachdem die Burndown-Raten angewendet wurden.
ptChargedOutputTokenCount INT64 Ausgabetokens, die auf Ihr Kontingent für bereitgestellten Durchsatz angerechnet werden, nachdem die Burndown-Raten angewendet wurden.
accountingResource STRING Das Projekt, dessen Zusicherung für bereitgestellten Durchsatz für die Anfrage verwendet wurde.

Spillover-Anfragen identifizieren

Eine Anfrage wird als „Überlauf“ bezeichnet, wenn sie für den bereitgestellten Durchsatz infrage kam, aber on demand verarbeitet wurde, weil Ihr Durchsatz aufgebraucht war. Ein Überlaufeintrag hat den trafficType-Wert ON_DEMAND und kein provisionedThroughput-Objekt. Eine normale „Pay as you go“-Anfrage sieht genauso aus. Verwenden Sie daher die folgenden Regeln, um sie zu unterscheiden:

  • Wenn Sie X-Vertex-AI-LLM-Request-Type mit dem Wert shared gesendet haben, haben Sie die Anfrage absichtlich an das „Pay as you go“-Modell weitergeleitet. Es ist kein Spillover.
  • Wenn Sie keinen X-Vertex-AI-LLM-Request-Type-Header oder einen anderen Wert als dedicated oder shared gesendet haben und der Eintrag ON_DEMAND meldet, wurde die Anfrage überlastet, sofern Sie für dieses Modell in dieser Region einen bereitgestellten Durchsatz haben.
  • Wenn Sie keinen bereitgestellten Durchsatz für das Modell haben, wird jeder ON_DEMAND-Eintrag als normales „Pay as you go“ abgerechnet.

Informationen zu den Headerwerten finden Sie unter Bereitgestellten Durchsatz verwenden.

Eine Abfrage, die Spillover-Anfragen zählt, finden Sie unter Spillover nach Minute.

Herabgestufte Anfragen identifizieren

Eine Anfrage wird herabgestuft, wenn Sie eine „Pay as you go“-Option angefordert haben und diese über eine andere Option bereitgestellt wurde. Vergleichen Sie den von Ihnen gesendeten X-Vertex-AI-LLM-Shared-Request-Type-Header mit der trafficType, die die Anfrage verarbeitet hat:

Gesendeter Headerwert trafficType, wenn wie angefordert ausgeliefert
priority ON_DEMAND_PRIORITY
flex ON_DEMAND_FLEX

Jeder andere trafficType bei einem erfolgreichen Eintrag bedeutet, dass die Anfrage herabgestuft wurde oder dass das Modell die von Ihnen angeforderte Option nicht bietet. Eine Abfrage finden Sie unter Downgrades nach Modell.

Fehlercodes

Fehlgeschlagene Anfragen werden mit dem Schweregrad ERROR geschrieben und enthalten ein error-Objekt mit einem gRPC-Statuscode und einem kanonischen Grund. Der Grund ist ein fester String. Sie enthält nie Prompt-Text, Antworttext oder Ihre Headerwerte.

Code Status Typischer HTTP-Status
8 Die Ressource ist erschöpft, z. B. ein Kontingentlimit. 429
4 Die Frist ist abgelaufen, bevor der Vorgang abgeschlossen wurde. 504
14 Der Dienst ist nicht verfügbar. 503
13 Ein interner Fehler ist aufgetreten. 500
3 Die Anfrage enthält ein ungültiges Argument. 400
7 Der Aufrufer hat keine Berechtigung. 403
5 Die angeforderte Entität wurde nicht gefunden. 404

Benutzerdefinierte Header-Labels anhängen

Wenn Sie die Nutzung Ihren eigenen Dimensionen zuordnen möchten, z. B. einem Team, einer Anwendung oder einem Mandanten, senden Sie Anfrageheader mit dem Präfix x-goog-agent-platform-observability-label-:

x-goog-agent-platform-observability-label-team: payments
x-goog-agent-platform-observability-label-application: invoice-ocr

Jeder Header wird im Eintrag unter jsonPayload.httpHeaders angezeigt. Header-Labels funktionieren bei Gemini-Modellen mit generateContent und streamGenerateContent und bei Claude-Modellen mit rawPredict und streamRawPredict, bei bereitgestelltem Durchsatz und bei jeder „Pay as you go“-Option.

Beispiele für API-Aufrufe mit Header-Labels, die von ihnen erzeugten Logeinträge, unterstützte Modelle, Limits und den Vergleich von Header-Labels mit Anfrage-Labels finden Sie unter Benutzerdefinierte Metadaten-Labels. Informationen zum Abfragen finden Sie unter Nutzung nach benutzerdefiniertem Header-Label.

Logs mit dem Log-Explorer abfragen

Verwenden Sie den Log-Explorer, um einzelne Inferenzanfragen zu finden und zu prüfen. Außer der Aktivierung des Loggings ist keine Einrichtung erforderlich. Die Logs werden direkt gelesen, sodass Einträge sofort nach ihrem Eingang sichtbar sind.

Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf und geben Sie im Feld des Abfrageeditors eine Abfrage in der Logging-Abfragesprache ein. Weitere Informationen zu den Bereichen und Steuerelementen finden Sie unter Oberfläche des Log-Explorers.

Beginnen Sie mit dem Lognamen, der jeden Inferenzanfrageeintrag im Projekt auswählt:

logName="projects/PROJECT_ID/logs/aiplatform.googleapis.com%2Finference_request"

Fügen Sie Begriffe hinzu, um die Ergebnisse einzugrenzen. Begriffe in separaten Zeilen werden mit AND kombiniert.

  • Wenn Sie Anfragen auswählen möchten, die von einer Region bedient werden, fügen Sie resource.labels.location="us-central1" hinzu.
  • Wenn Sie eine API-Methode auswählen möchten, fügen Sie jsonPayload.method="GENERATE_CONTENT" hinzu.
  • Wenn Sie nur Traffic für Bereitgestellten Durchsatz auswählen möchten, fügen Sie jsonPayload.trafficType="PROVISIONED_THROUGHPUT" hinzu.
  • Wenn Sie nur Kontingentfehler auswählen möchten, fügen Sie severity=ERROR und jsonPayload.error.code=8 hinzu.
  • Wenn Sie einen benutzerdefinierten Header-Labelwert auswählen möchten, fügen Sie jsonPayload.httpHeaders."x-goog-agent-platform-observability-label-team".values="payments" hinzu.

Der Log-Explorer filtert und zeigt Einträge an. Sie werden nicht zusammengefasst. Wenn Sie Ihre Einträge zählen, gruppieren oder in einem Diagramm darstellen möchten, verwenden Sie Observability Analytics. Klicken Sie in der Symbolleiste Abfrageergebnisse auf Ergebnisse analysieren, um die aktuelle Abfrage zu übertragen. Diese Schaltfläche wird erst angezeigt, nachdem der Log-Bucket aktualisiert wurde.

Logs mit Observability Analytics abfragen und analysieren

Mit Observability Analytics können Sie Logs abfragen und analysieren.

Hinweis

Observability Analytics beantwortet Fragen, die der Log-Explorer nicht beantworten kann. Der Log-Explorer findet und zeigt einzelne Einträge an. Das ist genau das, was Sie brauchen, wenn Sie eine bestimmte Anfrage suchen. Observability Analytics führt SQL-Abfragen für den gesamten Satz aus, sodass Perzentile gezählt, gruppiert, verknüpft und berechnet werden können. Jede Frage in diesem Abschnitt erfordert eine Aggregation: Ausgaben pro Team, Burndown pro Projekt und p95-Latenz pro Region können nicht für jeden Eintrag einzeln beantwortet werden.

Dazu muss der Log-Bucket _Default in Ihrem Projekt auf Observability Analytics aktualisiert werden. Weitere Informationen finden Sie unter Log-Buckets konfigurieren.

Die folgenden Beispiele werden in Observability Analytics ausgeführt. Ersetzen Sie PROJECT_ID durch Ihr Projekt.

Durchsatz nach Region und Modell

SELECT
  JSON_VALUE(resource.labels.location)      AS region,
  JSON_VALUE(resource.labels.model_user_id) AS model,
  JSON_VALUE(json_payload.trafficType)      AS traffic_type,
  COUNT(*)                                  AS requests,
  SUM(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.promptTokenCount) AS INT64))     AS input_tokens,
  SUM(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.candidatesTokenCount) AS INT64)) AS output_tokens
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
GROUP BY region, model, traffic_type
ORDER BY requests DESC

Burndown des bereitgestellten Durchsatzes nach Projekt

SELECT
  JSON_VALUE(resource.labels.location) AS region,
  JSON_VALUE(json_payload.provisionedThroughput.accountingResource) AS pt_project,
  COUNTIF(JSON_VALUE(json_payload.trafficType) = "PROVISIONED_THROUGHPUT") AS pt_requests,
  COUNTIF(JSON_VALUE(json_payload.trafficType) = "ON_DEMAND")              AS on_demand_requests,
  SUM(CAST(JSON_VALUE(json_payload.provisionedThroughput.ptChargedInputTokenCount)  AS INT64)) AS pt_input_tokens,
  SUM(CAST(JSON_VALUE(json_payload.provisionedThroughput.ptChargedOutputTokenCount) AS INT64)) AS pt_output_tokens
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
GROUP BY region, pt_project
ORDER BY pt_input_tokens DESC

Nutzung nach benutzerdefiniertem Header-Label

SELECT
  JSON_VALUE(json_payload.httpHeaders
    ["x-goog-agent-platform-observability-label-team"].values[0]) AS team,
  COUNT(*) AS requests,
  SUM(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.totalTokenCount) AS INT64)) AS total_tokens
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY team
ORDER BY total_tokens DESC

Verbrauchte Tokens pro Minute, Gemini und Claude im Vergleich

Diese Abfrage gibt die verbrauchten Tokens pro Minute in einer Spalte pro Publisher aus. In jeder Spalte werden Tokentypen auf dieselbe Weise gewichtet wie der Messwert publisher/online_serving/consumed_token_throughput für diesen Publisher. Jede Spalte entspricht also Cloud Monitoring. Gemini und Claude gewichten Ausgabe- und Cache-Tokens unterschiedlich. Addieren Sie die beiden Spalten also nicht. Informationen zu den Claude-Feldern finden Sie unter Tokenanzahl für Claude-Modelle.

SELECT
  TIMESTAMP_TRUNC(timestamp, MINUTE) AS minute_ts,
  SUM(IF(JSON_VALUE(resource.labels.publisher) = "google",
    IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.promptTokenCount) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.toolUsePromptTokenCount) AS INT64), 0)
      - 0.9 * IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.cachedContentTokenCount) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.candidatesTokenCount) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.thoughtsTokenCount) AS INT64), 0), 0)) AS gemini_consumed_tokens,
  SUM(IF(JSON_VALUE(resource.labels.publisher) = "anthropic",
    IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.input_tokens) AS INT64), 0)
      + 0.1  * IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_read_input_tokens) AS INT64), 0)
      + 1.25 * IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_creation_input_tokens) AS INT64), 0)
      + 0.75 * IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_creation.ephemeral_1h_input_tokens) AS INT64), 0)
      + 5    * IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.output_tokens) AS INT64), 0), 0)) AS claude_consumed_tokens
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
GROUP BY minute_ts
ORDER BY minute_ts DESC

Cache-Trefferquote bei Gemini und Claude

Die Cache-Trefferquote ist die Anzahl der im Cache gespeicherten Eingabetokens geteilt durch die Gesamtzahl der Eingabetokens. Die Gemini-Eingabe enthält Tokens für die Toolnutzung, da diese vom Cache abgedeckt werden können. Claude-Eingabe ist die Eingabe ohne Cache plus Cache-Lesevorgänge plus Cache-Schreibvorgänge. Informationen dazu, wie die einzelnen Publisher Daten im Cache speichern, finden Sie unter Kontext-Caching – Übersicht und Claude-Prompt-Caching.

SELECT
  JSON_VALUE(resource.labels.model_user_id) AS model,
  JSON_VALUE(json_payload.trafficType)      AS traffic_type,
  ROUND(100 * SAFE_DIVIDE(
    SUM(IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.cachedContentTokenCount) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_read_input_tokens) AS INT64), 0)),
    SUM(GREATEST(
          IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.promptTokenCount) AS INT64), 0)
          + IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.toolUsePromptTokenCount) AS INT64), 0),
          IFNULL(CAST(JSON_VALUE(json_payload.generateContentDetails.usageMetadata.cachedContentTokenCount) AS INT64), 0))
      + IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.input_tokens) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_read_input_tokens) AS INT64), 0)
      + IFNULL(CAST(JSON_VALUE(json_payload.rawPredictDetails.usageMetadata.cache_creation_input_tokens) AS INT64), 0))), 1) AS cache_hit_rate_pct
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND JSON_VALUE(json_payload.trafficType) IS NOT NULL
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY model, traffic_type
ORDER BY model, traffic_type

Downgrades nach Modell

Bei dieser Abfrage wird die Pay-as-you-go-Option, die für jede Anfrage angefordert wurde, mit der Option verglichen, die sie bedient hat. Informationen dazu, wie Downgrades identifiziert werden, finden Sie unter Herabgestufte Anfragen identifizieren.

WITH entries AS (
  SELECT
    JSON_VALUE(resource.labels.model_user_id) AS model,
    severity,
    JSON_VALUE(json_payload.trafficType)      AS served,
    (SELECT LOWER(v)
     FROM UNNEST(JSON_VALUE_ARRAY(json_payload.httpHeaders["x-vertex-ai-llm-shared-request-type"].values)) AS v
     WHERE LOWER(v) IN ("priority", "flex")
     LIMIT 1)                                 AS requested
  FROM `PROJECT_ID.global._Default._Default`
  WHERE log_id = "aiplatform.googleapis.com/inference_request"
    AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
)
SELECT
  model,
  requested,
  COUNTIF(served = CONCAT("ON_DEMAND_", UPPER(requested))) AS served_as_requested,
  COUNTIF(served IS NOT NULL
          AND served != CONCAT("ON_DEMAND_", UPPER(requested))) AS downgraded,
  COUNTIF(severity = "ERROR")                              AS failed
FROM entries
WHERE requested IS NOT NULL
GROUP BY model, requested
ORDER BY downgraded DESC

Überlauf nach Minute

Diese Abfrage zählt die Überlaufanfragen pro Minute für jedes Modell, das im Zeitfenster Traffic mit bereitgestelltem Durchsatz hatte. Informationen dazu, wie Überlaufanfragen identifiziert werden, finden Sie unter Überlaufanfragen identifizieren.

WITH entries AS (
  SELECT
    timestamp,
    JSON_VALUE(resource.labels.location)      AS region,
    JSON_VALUE(resource.labels.model_user_id) AS model,
    JSON_VALUE(json_payload.trafficType)      AS traffic_type,
    EXISTS(
      SELECT 1
      FROM UNNEST(JSON_VALUE_ARRAY(json_payload.httpHeaders["x-vertex-ai-llm-request-type"].values)) AS v
      WHERE LOWER(v) IN ("dedicated", "shared")) AS routed_by_header
  FROM `PROJECT_ID.global._Default._Default`
  WHERE log_id = "aiplatform.googleapis.com/inference_request"
    AND severity = "INFO"
    AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
),
pt_models AS (
  SELECT DISTINCT region, model FROM entries WHERE traffic_type = "PROVISIONED_THROUGHPUT"
)
SELECT
  TIMESTAMP_TRUNC(e.timestamp, MINUTE) AS minute_ts,
  e.region,
  e.model,
  COUNTIF(e.traffic_type = "PROVISIONED_THROUGHPUT")              AS pt_requests,
  COUNTIF(e.traffic_type = "ON_DEMAND" AND NOT e.routed_by_header) AS spillover_requests
FROM entries AS e
JOIN pt_models USING (region, model)
GROUP BY minute_ts, e.region, e.model
HAVING spillover_requests > 0
ORDER BY minute_ts DESC

Fehlerrate und Latenz nach Region

SELECT
  JSON_VALUE(resource.labels.location) AS region,
  TIMESTAMP_TRUNC(timestamp, MINUTE)   AS minute_ts,
  COUNT(*)                             AS total,
  COUNTIF(severity = "ERROR")          AS errors,
  COUNTIF(CAST(JSON_VALUE(json_payload.error.code) AS INT64) = 8) AS resource_exhausted,
  APPROX_QUANTILES(
    CAST(REGEXP_REPLACE(JSON_VALUE(json_payload.requestDuration), r"s$", "") AS FLOAT64),
    100)[OFFSET(95)] AS p95_latency_seconds
FROM `PROJECT_ID.global._Default._Default`
WHERE log_id = "aiplatform.googleapis.com/inference_request"
  AND timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 6 HOUR)
GROUP BY region, minute_ts
ORDER BY minute_ts DESC

Tokenanzahl für Claude-Modelle

Claude-Modelle melden die Nutzung unter rawPredictDetails.usageMetadata mit den Claude API-Feldnamen. Sowohl rawPredict als auch streamRawPredict schreiben dieselben Felder. Beim Streaming werden im Log die im Stream gemeldeten Nutzungsdaten zusammengeführt.

Feld Was gezählt wird
input_tokens Eingabetokens, die nicht aus dem Cache gelesen oder in den Cache geschrieben wurden.
cache_read_input_tokens Aus dem Prompt-Cache gelesene Eingabetokens.
cache_creation_input_tokens Eingabetokens, die in den Prompt-Cache geschrieben wurden, beide TTLs kombiniert.
cache_creation.ephemeral_5m_input_tokens Cache-Schreibvorgänge mit einer TTL von 5 Minuten.
cache_creation.ephemeral_1h_input_tokens Cache-Schreibvorgänge mit einer TTL von 1 Stunde.
output_tokens Ausgabetokens, einschließlich erweiterter Thinking-Funktion. Fügen Sie Thinking-Tokens nicht separat hinzu.

Die Gesamteingabe für Claude ist input_tokens plus cache_read_input_tokens plus cache_creation_input_tokens. Gemini unterscheidet sich: promptTokenCount enthält bereits im Cache gespeicherte Tokens.

Claude-Einträge enthalten keine Aufschlüsselung nach Modalität. Headerlabels funktionieren für Gemini und Claude auf dieselbe Weise. Weitere Informationen finden Sie unter Benutzerdefinierte Headerlabels anhängen.

Preise

Das Logging von Metadaten für Inferenzanfragen schreibt in Cloud Logging und wird als Cloud Logging-Aufnahme und -Speicherung abgerechnet. Abfragen über Observability Analytics werden als Cloud Monitoring-Nutzung abgerechnet. Durch das Verknüpfen eines BigQuery-Datasets fallen keine BigQuery-Speichergebühren an.

Die Größe des Eintrags hängt von Ihren Anfragen ab, z. B. von der Anzahl der Headerlabels. Wenn Sie die Kosten schätzen möchten, aktivieren Sie das Logging für eine repräsentative Arbeitslast für einen Tag, messen Sie das aufgenommene Volumen mit der Logvolumenanalyse und projizieren Sie dann Ihr monatliches Volumen im Google Cloud -Preisrechner.

Nächste Schritte