Configurer l'indexation personnalisée

Ce document explique comment ajouter des champs LogEntry indexés à vos buckets Cloud Logging pour accélérer l'interrogation des données de journaux.

Présentation

Les performances des requêtes sont essentielles pour toute solution de journalisation. À mesure que les charges de travail augmentent et que les volumes de journaux correspondants augmentent, l'indexation des données de journaux les plus utilisées peut réduire la durée des requêtes.

Pour améliorer les performances des requêtes, Logging indexe automatiquement les champs LogEntry suivants:

En plus des champs que Logging indexe automatiquement, vous pouvez également demander à un bucket de journaux d'indexer d'autres champs LogEntry en créant un index personnalisé pour le bucket.

Par exemple, supposons que vos expressions de requête incluent souvent le champ jsonPayload.request.status. Vous pouvez configurer un index personnalisé pour un bucket incluant le champ jsonPayload.request.status. Toute requête ultérieure sur les données de ce bucket fera référence aux données indexées jsonPayload.request.status si l'expression de requête inclut ce champ.

À l'aide de Google Cloud CLI ou de l'API Logging, vous pouvez ajouter des index personnalisés à des buckets de journaux nouveaux ou existants. Lorsque vous sélectionnez des champs supplémentaires à inclure dans l'index personnalisé, tenez compte des limites suivantes:

  • Vous pouvez ajouter jusqu'à 20 champs par index personnalisé.
  • Après avoir configuré ou mis à jour l'index personnalisé d'un bucket, vous devez attendre une heure pour que les modifications s'appliquent à vos requêtes. Cette latence garantit l'exactitude des résultats de la requête et accepte les journaux écrits dans le passé.
  • Logging applique une indexation personnalisée aux données stockées dans des buckets de journaux après la création ou la modification de l'index. Les modifications apportées aux index personnalisés ne s'appliquent pas aux journaux de manière rétroactive.

Avant de commencer

Avant de commencer à configurer un index personnalisé, procédez comme suit:

Définir l'index personnalisé

Pour chaque champ que vous ajoutez à l'index personnalisé d'un bucket, vous devez définir deux attributs: un chemin d'accès de champ et un type de champ:

  • fieldPath: décrit le chemin d'accès spécifique au champ LogEntry dans vos entrées de journal. Exemple : jsonPayload.req_status.
  • type: indique si le champ est de type chaîne ou entier. Les valeurs possibles sont INDEX_TYPE_STRING et INDEX_TYPE_INTEGER.

Vous pouvez ajouter un index personnalisé en créant un bucket ou en mettant à jour un bucket existant. Pour en savoir plus sur la configuration des buckets, consultez Configurer des buckets de journaux.

Pour configurer un index personnalisé lors de la création d'un bucket, procédez comme suit:

gcloud

Exécutez la commande gcloud logging buckets create et définissez l'indicateur --index:

gcloud logging buckets create BUCKET_NAME\
--location=LOCATION\
--description="DESCRIPTION" \
--index=fieldPath=INDEX_FIELD_NAME,type=INDEX_TYPE

Exemple de commande :

gcloud logging buckets create int_index_test_bucket \
--location=global \
--description="Bucket with integer index" \
--index=fieldPath=jsonPayload.req_status,type=INDEX_TYPE_INTEGER

API

Pour créer un bucket, utilisez projects.locations.buckets.create dans l'API Logging. Préparez les arguments de la méthode comme suit :

  1. Définissez le paramètre parent comme la ressource dans laquelle créer le bucket : projects/PROJECT_ID/locations/LOCATION

    La variable LOCATION fait référence à la région dans laquelle vous souhaitez stocker vos journaux.

    Par exemple, si vous souhaitez créer un bucket pour le projet my-project dans la région asia-east2, votre paramètre parent ressemblera à ceci: projects/my-project/locations/asia-east2

  2. Définissez le paramètre bucketId (par exemple, my-bucket).

  3. Dans le corps de la requête LogBucket, configurez l'objet IndexConfig pour créer l'index personnalisé.

  4. Appelez projects.locations.buckets.create pour créer le bucket.

Pour mettre à jour un bucket existant afin d'inclure un index personnalisé, procédez comme suit:

gcloud

Exécutez la commande gcloud logging buckets update et définissez l'indicateur --add-index:

gcloud logging buckets update BUCKET_NAME\
--location=LOCATION\
--add-index=fieldPath=INDEX_FIELD_NAME,type=INDEX_TYPE

Exemple de commande :

gcloud logging buckets update \
int_index_test_bucket \
--location=global \ --add-index=fieldPath=jsonPayload.req_status,type=INDEX_TYPE_INTEGER

API

Utilisez projects.locations.buckets.patch dans l'API Logging. Dans le corps de la requête LogBucket, configurez l'objet IndexConfig pour inclure les champs LogEntry que vous souhaitez indexer.

Supprimer un champ indexé personnalisé

Pour supprimer un champ de l'index personnalisé d'un bucket, procédez comme suit:

gcloud

Exécutez la commande gcloud logging buckets update et définissez l'indicateur --remove-indexes :

gcloud logging buckets update BUCKET_NAME\
--location=LOCATION\
--remove-indexes=INDEX_FIELD_NAME

Exemple de commande :

gcloud logging buckets update int_index_test_bucket \
--location=global \
--remove-indexes=jsonPayload.req_status

API

Utilisez projects.locations.buckets.patch dans l'API Logging. Dans le corps de la requête LogBucket, supprimez les champs LogEntry de l'objet IndexConfig.

Mettre à jour le type de données du champ indexé personnalisé

Si vous devez corriger le type de données d'un champ indexé personnalisé, procédez comme suit:

gcloud

Exécutez la commande gcloud logging buckets update et définissez l'indicateur --update-index:

gcloud logging buckets update BUCKET_NAME\
--location=LOCATION\
--update-index=fieldPath=INDEX_FIELD_NAME,type=INDEX_TYPE

Exemple de commande :

gcloud logging buckets update \
int_index_test_bucket \
--location=global \
--update-index=fieldPath=jsonPayload.req_status,type=INDEX_TYPE_INTEGER

API

Utilisez projects.locations.buckets.patch dans l'API Logging. Dans le corps de la requête LogBucket, mettez à jour l'objet IndexConfig afin de fournir le type de données approprié pour un champ LogEntry.

Mettre à jour le chemin d'accès d'un champ indexé personnalisé

Si vous devez corriger le chemin d'accès d'un champ indexé personnalisé, procédez comme suit:

gcloud

Exécutez la commande gcloud logging buckets update, puis définissez les indicateurs --remove-indexes et --update-index:

gcloud logging buckets update BUCKET_NAME\
--location=LOCATION\
--remove-indexes=OLD_INDEX_FIELD_NAME \
--update-index=fieldPath=NEW_INDEX_FIELD_NAME,type=INDEX_TYPE

Exemple de commande :

gcloud logging buckets update \
int_index_test_bucket \
--location=global \
--remove-indexes=jsonPayload.req_status_old_path \
--add-index=fieldPath=jsonPayload.req_status_new_path,type=INDEX_TYPE_INTEGER

API

Utilisez projects.locations.buckets.patch dans l'API Logging. Dans le corps de la requête LogBucket, mettez à jour l'objet IndexConfig pour fournir le chemin d'accès correct pour le champ LogEntry.

Répertorier tous les champs indexés d'un bucket

Pour répertorier les détails d'un bucket, y compris ses champs indexés personnalisés, procédez comme suit:

gcloud

Exécutez la commande gcloud logging buckets describe :

gcloud logging buckets describe BUCKET_NAME\
--location=LOCATION

Exemple de commande :

gcloud logging buckets describe indexed-bucket \
--location global

API

Utilisez projects.locations.buckets.get dans l'API Logging.

Effacer les champs indexés personnalisés

Pour supprimer tous les champs indexés personnalisés d'un bucket, procédez comme suit:

gcloud

Exécutez la commande gcloud logging buckets update et ajoutez l'option --clear-indexes:

gcloud logging buckets update BUCKET_NAME\
--location=LOCATION\
--clear-indexes

Exemple de commande :

gcloud logging buckets update \
int_index_test_bucket \
--location=global \
--clear-indexes

API

Utilisez projects.locations.buckets.patch dans l'API Logging. Dans le corps de la requête LogBucket, supprimez l'objet IndexConfig.

Interroger et afficher les données indexées

Pour interroger les données incluses dans les champs indexés personnalisés, limitez le champ d'application de votre requête au bucket contenant ces champs et spécifiez la vue de journal appropriée:

gcloud

Pour lire les journaux d'un bucket de journaux, utilisez la commande gcloud logging read et ajoutez un élément LOG_FILTER pour inclure les données indexées:

gcloud logging read LOG_FILTER --bucket=BUCKET_ID --location=LOCATION --view=VIEW_ID

API

Pour lire les journaux d'un bucket de journaux, utilisez la méthode entries.list. Définissez resourceNames pour spécifier le bucket et la vue de journal appropriés, puis définissez filter pour sélectionner vos données indexées.

Pour en savoir plus sur la syntaxe de filtrage, consultez la page Langage de requête Logging.

Indexation et types de champs

La configuration de l'indexation des champs personnalisés peut avoir une incidence sur la manière dont les journaux sont stockés dans les buckets de journaux et le traitement des requêtes.

Au moment de l'écriture

Logging tente d'utiliser l'index personnalisé sur les données stockées dans des buckets de journaux après la création de l'index.

Les champs indexés sont saisis, ce qui a des conséquences sur l'horodatage sur l'entrée de journal. Lorsque l'entrée de journal est stockée dans le bucket de journaux, le champ de journal est évalué par rapport au type d'index à l'aide des règles suivantes:

  • Si le type d'un champ est identique à celui de l'index, les données sont ajoutées à l'index telles quelles.
  • Si le type du champ est différent de celui de l'index, Logging tente de le convertir en type d'index (par exemple, de l'entier à la chaîne).
    • Si la coercition de type échoue, les données ne sont pas indexées. Lorsque la coercition de type réussit, les données sont indexées.

Au moment de la requête

L'activation d'un index sur un champ modifie la façon dont vous devez interroger ce champ. Par défaut, Logging applique des contraintes de filtre aux champs en fonction du type des données de chaque entrée de journal en cours d'évaluation. Lorsque l'indexation est activée, les contraintes de filtrage sur un champ sont appliquées en fonction du type d'index. L'ajout d'un index au niveau d'un champ impose un schéma à ce champ.

Lorsqu'un index personnalisé est configuré pour un bucket, les comportements de correspondance de schéma diffèrent lorsque les deux conditions suivantes sont remplies:

  • Le type de données source d'un champ ne correspond pas au type d'index de ce champ.
  • L'utilisateur applique une contrainte à ce champ.

Examinez les charges utiles JSON suivantes:

{"jsonPayload": {"name": "A", "value": 12345}}
{"jsonPayload": {"name": "B", "value": "3"}}

Appliquez maintenant ce filtre à chaque élément:

jsonPayload.value > 20

Si le champ jsonPayoad.value manque d'indexation personnalisée, Logging applique une correspondance de type flexible:

  • Pour la valeur "A", Logging observe que la valeur de la clé "value" est en réalité un entier et que la contrainte "20" peut être convertie en entier. Logging évalue ensuite 12345 > 20 et renvoie "true", car c'est le cas numériquement.

  • Pour la clé "B", Logging observe que la valeur de la clé "value" est en réalité une chaîne. Elle évalue ensuite "3" > "20" et renvoie "true", car il s'agit de la casse au moyen de caractères alphanumériques.

Si le champ jsonPayload.value est inclus dans l'index personnalisé, Logging évalue cette contrainte à l'aide de l'index au lieu de la logique habituelle de Logging. Le comportement change:

  • Si l'index est de type chaîne, toutes les comparaisons sont des comparaisons de chaînes.
    • L'entrée"A" ne correspond pas, car "12345" n'est pas supérieur à "20" dans le code alphanumérique. L'entrée "B" correspond, car la chaîne "3" est supérieure à "20".
  • Si l'index est de type entier, toutes les comparaisons sont des comparaisons d'entiers.
    • L'entrée"B" ne correspond pas, car "3" n'est pas supérieur à "20" numériquement. L'entrée "A" correspond, car "12345" est supérieur à "20".

Cette différence de comportement est subtile et doit être prise en compte lors de la définition et de l'utilisation d'index personnalisés.

Filtrer le cas limite

Pour l'index de type entier jsonPayload.value, supposons qu'une valeur de chaîne soit filtrée:

jsonPayload.value = "hello"

Si la valeur de la requête ne peut pas être forcée dans le type d'index, l'index est ignoré.

Toutefois, supposons que pour un index de type chaîne, vous transmettez une valeur entière:

jsonPayload.value > 50

Ni A, ni B ne correspondent, car ni "12345" ni "3" ne sont supérieurs d'un point de vue alphanumérique à "50".