Exemples de requêtes SQL pour Trace

Vous pouvez utiliser des exemples de requêtes SQL dans Observability Analytics pour analyser vos données Cloud Trace, identifier les valeurs aberrantes de latence et calculer les centiles de performances des segments dans vos services.

Ces exemples montrent comment filtrer, regrouper et agréger les segments stockés dans la vue _AllSpans. Si vous n'avez pas écrit de requêtes dans Observability Analytics, consultez d'abord Interroger et analyser des traces.

Compatibilité avec le langage SQL

Les requêtes utilisées dans la page Observability Analytics sont compatibles avec les fonctions GoogleSQL, à quelques exceptions près.

Les commandes SQL suivantes ne sont pas compatibles avec les requêtes SQL émises à l'aide de la page Observability Analytics :

  • Commandes LDD et LMD
  • Fonctions JavaScript définies par l'utilisateur
  • Fonctions BigQuery ML
  • Variables SQL

Les éléments suivants ne sont compatibles que lorsque vous interrogez un ensemble de données BigQuery associé à l'aide des pages BigQuery Studio et Looker Studio, ou à l'aide de l' outil de ligne de commande bq :

  • Fonctions JavaScript définies par l'utilisateur
  • Fonctions BigQuery ML
  • Variables SQL

Bonnes pratiques

Pour définir la période de votre requête, nous vous recommandons d'utiliser le sélecteur de période. Par exemple, pour afficher les données de la semaine dernière, sélectionnez Les 7 derniers jours dans le sélecteur de période. Vous pouvez également utiliser le sélecteur de période pour spécifier une heure de début et de fin, spécifier une heure à afficher et modifier les fuseaux horaires.

Si vous incluez un champ start_time dans la clause WHERE, le paramètre du sélecteur de période n'est pas utilisé. L'exemple suivant montre comment filtrer par horodatage :

-- Matches trace spans whose start_time is within the most recent 1 hour.
WHERE start_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)

Pour en savoir plus sur le filtrage par heure, consultez Fonctions temporelles et Fonctions d'horodatage.

Avant de commencer

  1. Connectez-vous à votre Google Cloud compte. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Observability API.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Observability API.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  8. Pour obtenir les autorisations nécessaires pour charger la page Observability Analytics , écrire, exécuter et enregistrer des requêtes privées sur vos données de trace, demandez à votre administrateur de vous accorder les rôles IAM suivants :

    • Accesseur de vue d'observabilité (roles/observability.viewAccessor) sur les vues d'observabilité que vous souhaitez interroger. Ce rôle est compatible avec les conditions IAM, qui vous permettent de limiter l'octroi à une vue spécifique. Si vous n'associez pas de condition à l'attribution de rôle, le compte principal peut accéder à toutes les vues d'observabilité.
    • Utilisateur Observability Analytics (roles/observability.analyticsUser) sur votre projet. Ce rôle contient les autorisations requises pour enregistrer et exécuter des requêtes privées, ainsi que pour exécuter des requêtes partagées.

    Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

    Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Utiliser les requêtes de cette page

  1. Dans la Google Cloud console, accédez à la Observability Analytics page :

    Accéder à Observability Analytics

    Si vous utilisez la barre de recherche pour trouver cette page, sélectionnez le résultat dont le sous-titre est Logging.

  2. Dans le volet Requête, cliquez sur le  SQL, puis copiez et collez une requête dans le volet de requête SQL.

    Voici le format de la clause FROM pour interroger la vue _AllSpans :

    FROM `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`

    La clause FROM contient les champs suivants :

    • PROJECT_ID : identifiant du projet.
    • LOCATION : l'emplacement du bucket d'observabilité.
    • _Trace : nom du bucket d'observabilité.
    • Spans : nom de l'ensemble de données.
    • _AllSpans : nom de la vue.

Pour utiliser les requêtes présentées dans ce document sur la page BigQuery Studio ou pour utiliser l'outil de ligne de commande bq, modifiez la clause FROM et saisissez le le chemin d'accès à l'ensemble de données BigQuery associé. Par exemple, pour interroger la _AllSpans vue sur l'ensemble de données BigQuery associé nommé my_linked_dataset qui se trouve dans le projet myproject, le chemin d'accès est `myproject.my_linked_dataset._AllSpans`.

Cas d'utilisation courants

Cette section répertorie plusieurs cas d'utilisation courants qui peuvent vous aider à créer vos requêtes personnalisées.

Afficher toutes les données de trace

Pour interroger la vue _AllSpans, exécutez la requête suivante :

-- Display all data.
SELECT *
FROM `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`
-- Limit to 10 entries.
LIMIT 10

Afficher les informations courantes sur les segments

Pour afficher les informations courantes sur les segments, telles que l'heure de début et la durée, exécutez la requête suivante :

SELECT
  start_time,
  -- Set the value of service name based on the first non-null value in the list.
  COALESCE(
    JSON_VALUE(resource.attributes, '$."service.name"'),
    JSON_VALUE(attributes, '$."service.name"'),
    JSON_VALUE(attributes, '$."g.co/gae/app/module"')) AS service_name,
  name AS span_name,
  duration_nano,
  status.code AS status,
  trace_id,
  span_id
FROM
  `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`
LIMIT 10

Pour en savoir plus, consultez Expressions conditionnelles.

Afficher les 50e et 99e centiles de la latence des segments

Pour afficher les 50e et 99e centiles de la latence de chaque service RPC, exécutez la requête suivante :

SELECT
  -- Compute 50th and 99th percentiles for each service
  STRING(attributes['rpc.service']) || '/' || STRING(attributes['rpc.method']) AS rpc_service_method,
  APPROX_QUANTILES(duration_nano, 100)[OFFSET(50)] AS duration_nano_p50,
  APPROX_QUANTILES(duration_nano, 100)[OFFSET(99)] AS duration_nano_p99
FROM
  `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`
WHERE
  -- Matches spans whose kind field has a value of 2 (SPAN_KIND_SERVER).
  kind = 2
GROUP BY rpc_service_method

Pour en savoir plus sur l'énumération, consultez la documentation OpenTelemetry : SpanKind.

Pour afficher les résultats sous forme graphique, vous pouvez créer un graphique dont la dimension est définie sur rpc_service_method. Vous pouvez ajouter deux mesures, l'une pour la moyenne de la valeur duration_nano_p50 et l'autre pour la moyenne du champ duration_nano_p99.

Filtrer les entrées de trace

Pour appliquer un filtre à votre requête, ajoutez une clause WHERE. La syntaxe que vous utilisez dans cette clause dépend du type de données du champ. Cette section fournit plusieurs exemples pour différents types de données.

Filtrer par types de données de chaîne

Le champ name est stocké sous forme de String.

  • Pour n'analyser que les segments où name est spécifié, utilisez la clause suivante :

    -- Matches spans that have a name field.
    WHERE name IS NOT NULL
    
  • Pour n'analyser que les segments où name a la valeur "POST", utilisez la clause suivante :

    -- Matches spans whose name is POST.
    WHERE STRPOS(name, "POST") > 0
    
  • Pour n'analyser que les segments où name contient la valeur "POST", utilisez l'opérateur LIKE avec des caractères génériques :

    -- Matches spans whose name contains POST.
    WHERE name LIKE "%POST%"
    

Filtrer par types de données entiers

Le champ kind est un entier qui peut prendre des valeurs comprises entre zéro et cinq :

  • Pour n'analyser que les segments où kind est spécifié, utilisez la clause suivante :

    -- Matches spans that have field named kind.
    WHERE kind IS NOT NULL
    
  • Pour analyser les segments dont la valeur kind est égale à un ou deux, utilisez la clause suivante :

    -- Matches spans whose kind value is 1 or 2.
    WHERE kind IN (1, 2)
    

Filtrer par types de données RECORD

Certains champs du schéma de trace ont un type de données RECORD. Ces champs peuvent stocker une ou plusieurs structures de données, ou des entrées répétées de la même structure de données.

Filtrer par état ou code d'état

Le champ status est un exemple de champ dont le type de données est RECORD. Ce champ stocke une structure de données, avec des membres libellés code et message.

  • Pour n'analyser que les segments lorsque le champ status.code a la valeur 1, ajoutez la clause suivante :

    -- Matches spans that have a status.code field that has a value of 1.
    WHERE status.code = 1
    

    Le champ status.code est stocké sous forme d'entier.

  • Pour analyser les segments où le champ status n'est pas EMPTY, ajoutez la clause suivante :

    -- Matches spans that have status field. When the status field exists, it
    -- must contain a subfield named code.
    -- Don't compare status to NULL, because this field has a data type of RECORD.
    WHERE status.code IS NOT NULL
    

Les champs events et links sont stockés avec un type de données RECORD, mais il s'agit de champs répétés.

  • Pour faire correspondre les segments qui comportent au moins un événement, utilisez la clause suivante :

    -- Matches spans that have at least one event. Don't compare events to NULL.
    -- The events field has data type of RECORD and contains a repeated fields.
    WHERE ARRAY_LENGTH(events) > 0
    
  • Pour faire correspondre les segments qui comportent un événement dont le champ name a la valeur message, utilisez la clause suivante :

    WHERE
      -- Exists is true when any event in the array has a name field with the
      -- value of message.
      EXISTS(
        SELECT 1
        FROM UNNEST(events) AS ev
        WHERE ev.name = 'message'
      )
    

Filtrer par types de données JSON

Le champ attributes est de type JSON. Chaque attribut individuel est une paire clé/valeur.

  • Pour n'analyser que les segments où attributes est spécifié, utilisez la clause suivante :

    -- Matches spans where at least one attribute is specified.
    WHERE attributes IS NOT NULL
    
  • Pour n'analyser que les segments où la clé d'attribut nommée component a la valeur "proxy", utilisez la clause suivante :

    -- Matches spans that have an attribute named component with a value of proxy.
    WHERE attributes IS NOT NULL
          AND JSON_VALUE(attributes, '$.component') =