Créer et gérer des tableaux de bord à l'aide d'API

Ce document explique comment créer et gérer des tableaux de bord personnalisés et leurs widgets à l'aide de la ressource Dashboard de l'API Cloud Monitoring. Les exemples ci-dessous montrent comment gérer vos tableaux de bord à l'aide de curl pour appeler l'API et comment utiliser Google Cloud CLI. Vous pouvez également gérer vos tableaux de bord personnalisés via la console Google Cloud, mais l'API vous permet de gérer plusieurs tableaux de bord en même temps et par programmation.

Le point de terminaison accepte les méthodes suivantes pour la gestion et la configuration des tableaux de bord :

Vous pouvez appeler l'API directement à l'aide de l'utilitaire curl ou de la Google Cloud CLI.

Vous ne pouvez pas récupérer, modifier ni supprimer des tableaux de bord prédéfinis.

À propos des tableaux de bord

Lorsque vous créez un tableau de bord, vous devez spécifier les composants ou widgets que vous souhaitez afficher ainsi que leur disposition. Vous pouvez également ajouter des libellés et des filtres à votre tableau de bord. Les libellés peuvent vous aider à trouver un tableau de bord ou à indiquer le type de contenu qu'il contient.

Dispositions de tableaux de bord

La disposition ou mise en page d'un tableau de bord définit la façon dont ses composants sont organisés. L'API fournit les dispositions suivantes :

  • GridLayout (en grille) : partage l'espace disponible en colonnes verticales de même largeur et organise l'ensemble de widgets ligne par ligne.

  • MosaicLayout (en grille) : divise l'espace disponible en grille. Chaque widget peut occuper un ou plusieurs blocs de type grille.

  • RowLayout (en mosaïque) : partage l'espace disponible en lignes et organise l'ensemble de widgets horizontalement sur chaque ligne.

  • ColumnLayout (en colonne) : partage l'espace disponible en colonnes verticales et organise l'ensemble de widgets verticalement dans chaque colonne.

Par exemple, voici la représentation JSON d'un tableau de bord en disposition RowLayout avec trois widgets Text :

{
  "displayName": "Row-layout example",
  "rowLayout": {
    "rows": [
      {
        "widgets": [
          {
            "text": {
              "content": "Text Widget 1",
              "format": "RAW"
            }
          },
          {
            "text": {
              "content": "**Text Widget 2**",
              "format": "MARKDOWN"
            }
          },
          {
            "text": {
              "content": "_Text Widget 3_",
              "format": "MARKDOWN"
            }
          }
        ]
      }
    ]
  }
}

Widgets de tableau de bord

Un widget contient un unique composant de tableau de bord, ainsi que la configuration définissant comment présenter ce composant dans le tableau de bord. Un tableau de bord peut comporter plusieurs widgets. Il existe plusieurs types d'objets Widget :

  • Le widget XyChart affiche les données sur les axes X et Y.

    Ce widget affiche un ensemble de données pouvant être des données de série temporelle ou générées par une requête SQL. Ce widget vous permet d'associer les données du graphique à l'axe Y de gauche ou de droite. Lorsque plusieurs types de métriques sont représentés graphiquement, vous pouvez utiliser les deux axes Y. Le widget XyChart est compatible avec les styles d'affichage suivants:

    • Graphiques en courbes
    • Graphique à barres
    • Graphiques en aires empilées
    • Cartes de densité
  • Widgets qui s'affichent à partir d'une dimension, comme la dernière valeur:

    • PieChart: affiche les dernières valeurs d'une collection de séries temporelles, où chaque série temporelle contribue à une tranche du graphique en secteurs.

    • Scorecard (tableau de données) : affiche la valeur la plus récente d'une série temporelle et sa position par rapport à un ou plusieurs seuils.

    • TimeSeriesTable (tableau de données) : affiche la valeur la plus récente ou une valeur agrégée pour chaque série temporelle. Les tableaux sont personnalisables. Par exemple, vous pouvez attribuer un code couleur aux cellules, et configurer les noms de colonnes et l'alignement des données.

  • Widgets qui affichent des règles d'alerte ou des informations sur les incidents:

    • AlertChart (graphique d'alerte) : affiche un résumé d'une règle d'alerte à une seule condition. Ce widget affiche les données sous la forme d'un graphique en courbes, affiche le seuil et indique le nombre d'incidents ouverts.

    • IncidentList: affiche la liste des incidents. Vous pouvez configurer le widget pour afficher des incidents pour des règles d'alerte spécifiques ou pour des types de ressources spécifiques.

  • Widgets qui affichent des entrées de journal et des erreurs:

  • Widgets de texte et d'organisation:

    • CollapsibleGroup: affiche une collection de widgets. Vous pouvez réduire la vue d'un groupe.

    • SingleViewGroup: affiche un widget dans une collection de widgets. Vous pouvez sélectionner le widget à afficher.

    • SectionHeader: crée un séparateur horizontal dans votre tableau de bord et une entrée dans la table des matières du tableau de bord.

    • Text (texte) : affiche du contenu textuel sous forme de texte brut ou de chaîne Markdown.

    Pour inclure les widgets de texte et d'organisation dans un tableau de bord, celui-ci doit comporter un MosaicLayout.

Outre ces objets, vous pouvez également ajouter à un tableau de bord un espace réservé vide.

Par exemple, voici la représentation JSON d'un widget XyChart dont l'axe Y droit est configuré:

{
  "displayName": "Demo dashboard",
  "gridLayout": {
    "widgets": [
      {
        "title": "Sample line chart",
        "xyChart": {
          "dataSets": [
            {
              "timeSeriesQuery": {
                "timeSeriesFilter": {
                  "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" resource.type=\"gce_instance\"",
                  "aggregation": {
                    "perSeriesAligner": "ALIGN_MEAN",
                    "crossSeriesReducer": "REDUCE_MAX",
                    "groupByFields": [
                      "resource.label.zone"
                    ]
                  }
                },
                "unitOverride": "1"
              },
              "plotType": "LINE"
            }
          ],
          "timeshiftDuration": "0s",
          "yAxis": {
            "label": "y1Axis",
            "scale": "LINEAR"
          },
          "chartOptions": {
            "mode": "COLOR"
          }
        }
      }
    ]
  }
}

Étiquettes du tableau de bord

Les libellés peuvent vous aider à gérer et à organiser vos tableaux de bord. Par exemple, vous pouvez ajouter un libellé nommé prod pour indiquer que le tableau de bord affiche des données de série temporelle et des données de journal pour vos ressources de production. Vous pouvez également ajouter le libellé playbook pour indiquer que le tableau de bord contient des informations pour vous aider à résoudre les échecs.

L'ajout de libellés à un tableau de bord est facultatif.

Par exemple, l'exemple suivant montre un objet Dashboard qui spécifie l'étiquette nommée playbook.

{
  "displayName": "Example",
  "mosaicLayout": {
    "columns": 12,
    "tiles": [
      ...
    ]
  },
  "dashboardFilters": [],
  "labels": {
    "playbook": ""
  }
}

Comme l'illustre l'exemple précédent, le champ labels est implémenté en tant que map, où les champs key et value sont tous deux des chaînes. Lorsque vous ajoutez un libellé à un tableau de bord, définissez key sur le nom du libellé et le champ value sur une chaîne vide.

Filtres et variables de tableau de bord

Lorsque vous concevez un tableau de bord, vous pouvez identifier plusieurs façons d'afficher les données qu'il affiche. Par exemple, supposons qu'un tableau de bord affiche des données de série temporelle pour vos instances de machine virtuelle (VM). Vous pouvez afficher les données de séries temporelles pour toutes les VM, ou uniquement celles d'une zone spécifique. Dans ce cas, nous vous recommandons de créer un filtre épinglé ou une variable, puis de définir la valeur par défaut de ce filtre sur la zone la plus consultée.

Les filtres épinglés s'appliquent à tous les widgets de tableau de bord compatibles avec le libellé spécifié dans le filtre, sauf si le widget contient un filtre avec la même clé de libellé. Par exemple, lorsqu'un graphique inclut le filtre zone = us-central1-a, il ignore un filtre épinglé dont la clé de libellé est zone. De même, ce filtre est ignoré par les graphiques qui ne comportent pas de libellé avec une clé zone.

Les variables sont comme des filtres épinglés, mais elles ne s'appliquent qu'à des widgets spécifiques. Les variables peuvent être basées sur des libellés, comme les filtres épinglés, ou ne comporter qu'une valeur. Les variables à valeur unique contiennent une ou plusieurs valeurs par défaut et une liste de toutes les valeurs possibles. Si vous ne spécifiez pas de valeur par défaut, la valeur par défaut est l'opérateur générique (*). Pour définir l'ensemble de toutes les valeurs possibles, vous devez fournir un tableau de valeurs ou écrire une requête SQL.

Pour les filtres et les variables épinglés, la barre d'outils du tableau de bord affiche chaque variable, ainsi qu'un menu qui vous permet de modifier temporairement la valeur de la variable. La même structure de données est utilisée pour représenter les filtres et les variables épinglés. Pour en savoir plus, consultez la page DashboardFilter.

Pour savoir comment appliquer une variable basée sur un libellé ou une variable de valeur uniquement à un widget, consultez les sections suivantes:

Créer des filtres et des variables

Console

Pour savoir comment utiliser la console Google Cloud pour créer des filtres et des variables épinglés, consultez les documents suivants:

API

Pour définir des filtres et des variables épinglés, utilisez la structure de données dashboardFilters.

  • Pour créer une variable, définissez la valeur du champ templateVariable sur le nom de la variable. Omettez ce champ ou définissez sa valeur sur une chaîne vide lorsque vous souhaitez créer un filtre épinglé.
  • Pour créer un filtre épinglé ou une variable basée sur un libellé, vous devez spécifier le champ labelKey. Omettre ce champ lorsque vous souhaitez une variable à valeur unique.
  • Définissez la valeur par défaut du filtre ou de la variable. La configuration de ce champ détermine si un utilisateur peut sélectionner exactement une option dans le menu de valeurs ou s'il peut sélectionner plusieurs valeurs.

    • Pour définir une seule valeur par défaut et limiter les utilisateurs à la sélection d'une seule option dans le menu des valeurs, définissez le champ valueType sur STRING et définissez également le champ stringValue:
    "valueType": "STRING",
    "stringValue": "my-default-value",
    
    • Pour définir au moins une valeur par défaut et permettre aux utilisateurs de sélectionner plusieurs options dans le menu des valeurs, définissez le champ valueType sur STRING_ARRAY et le champ stringArrayValue. Dans l'exemple suivant, trois valeurs par défaut sont définies.
    "valueType": "STRING_ARRAY",
    "stringArrayValue": {
      "values": [ "a", "b", "c" ]
    },
    
  • Facultatif: pour spécifier la liste de toutes les valeurs possibles pour une variable à valeur unique, définissez le champ stringArray ou le champ timeSeriesQuery. Si vous spécifiez une requête, il doit s'agir d'une requête d'analyse.

Prenons l'exemple de l'objet dashboardFilters suivant:

{
  "dashboardFilters": [
      {
        "labelKey": "zone"
        "stringValue": "us-central1-c",
        "valueType": "STRING",
        "filterType": "RESOURCE_LABEL"
      },
      {
        "labelKey": "instance_id",
        "stringValue": "3133577226154888113",
        "valueType": "STRING",
        "filterType": "RESOURCE_LABEL",
        "templateVariable": "my_label_based_variable"
      },
      {
        "filterType": "VALUE_ONLY",
        "templateVariable": "my_value_only_variable",
        timeSeriesQuery: {
          opsAnalyticsQuery: {
            sql: "
              SELECT log_name
              FROM `MY_TABLE`
              GROUP BY log_name
            ",
          }
        }
      }
    ],
  "displayName": "Illustrate Variables",
  ...
}

Le code JSON précédent définit un filtre épinglé et deux variables:

  • Le filtre épinglé a la clé de libellé zone, qui s'affiche dans la barre d'outils. Les champs valueType et stringValue spécifient la valeur par défaut unique. Pour en savoir plus, consultez la page de la documentation de référence de l'API pour la structure de données dashboardFilters.

  • La variable basée sur une étiquette s'appelle my_label_based_variable, et sa clé d'étiquette est instance_id. La valeur par défaut de cette variable est définie sur un ID d'instance spécifique. Vous pouvez également configurer la valeur par défaut à l'aide d'un tableau. Dans la barre d'outils, le filtre s'affiche sous le nom my_label_based_variable.

  • La variable à valeur unique est nommée my_value_only_variable. Cette entrée ne spécifie pas de valeur par défaut. L'opérateur générique, (*), est donc appliqué automatiquement. De plus, cette variable utilise une requête SQL pour générer la liste des valeurs possibles.

Notez que l'objet dashboardFilters ne liste pas les widgets auxquels la variable s'applique. Pour appliquer une variable à un widget, vous devez modifier la requête du widget.

Syntaxe générale pour désadresser une variable

Pour tous les widgets, à l'exception de ceux définis par SQL, utilisez la syntaxe suivante pour appliquer une variable à une requête:

  • Pour appliquer une variable basée sur une étiquette et que la clé et la valeur de l'étiquette soient résolues en une expression de filtre valide pour le langage de requête, utilisez ${my_label_based_variable}.

  • Pour n'appliquer que la valeur d'une variable basée sur un libellé, utilisez ${my_label_based_variable.value}. La comparaison doit utiliser une expression régulière.

  • Pour n'appliquer que la valeur d'une variable à valeur unique, utilisez ${my_value_only_variable}. Pour les variables de type "Valeur uniquement", n'incluez pas de clause .value. La comparaison doit utiliser une expression régulière.

Widgets du panneau des journaux

Pour appliquer une variable à un widget de panneau de journaux, mettez à jour le volet des requêtes. La syntaxe de ces widgets suit celle spécifiée sous Syntaxe générale.

Console

Par exemple, la requête suivante utilise une expression régulière pour comparer la valeur du champ jsonPayload.message à une valeur de chaîne qui inclut la valeur d'une variable basée sur des libellés:

jsonPayload.message=~"Connected to instance: ${my_label_based_variable.value}"

Prenons un autre exemple. Considérons une variable à valeur unique, value_only_severity_variable, et supposons que trois valeurs sont sélectionnées dans le menu des valeurs: ERROR, INFO et NOTICE. Ajoutez ensuite le code suivant au volet de requête du widget de panneau des journaux:

severity =~ "${value_only_severity_variable}"

Voici un exemple de formulaire affiché:

severity =~ "^(ERROR|INFO|NOTICE)$"

API

Par exemple, le code JSON suivant montre comment appliquer une variable basée sur un libellé à la requête d'un widget de panneau de journaux:

"logsPanel": {
  "filter": "${my_label_based_variable}",
  "resourceNames": [
    "projects/1234512345"
  ]
},

Par exemple, la requête suivante utilise une expression régulière pour comparer la valeur du champ jsonPayload.message à une valeur de chaîne qui inclut la valeur d'une variable basée sur des libellés:

"logsPanel": {
  "filter": "resource.type=\"gce_instance\"\n
             resource.labels.project_id=~\"${my_label_based_variable.value}\"\n",
  "resourceNames": [
    "projects/012345"
  ]
}

Prenons un autre exemple. Considérons une variable à valeur unique, value_only_severity_variable, et supposons que trois valeurs sont sélectionnées dans le menu: ERROR, INFO et NOTICE. Ajoutez ensuite le code suivant au volet de requête du widget de panneau des journaux:

"logsPanel": {
  "filter": "severity =~ \"${value_only_severity_variable}\"\n",
  ...
}

L'illustration suivante montre la requête exécutée par le widget du panneau des journaux:

severity =~ "^(ERROR|INFO|NOTICE)$"

Si vous avez configuré une requête pour le panneau des journaux, puis sélectionné le bouton pour ouvrir l'explorateur de journaux, les variables sont résolues avant l'ouverture de l'explorateur de journaux.

Le tableau suivant illustre la façon dont les exemples de variables sont résolus par le panneau des journaux. Comme indiqué précédemment, lorsque seule la valeur d'une variable est utilisée, vous devez utiliser une expression régulière comme opérateur de comparaison:

Syntaxe Valeur sélectionnée
Expression du panneau des journaux résolus
${my_label_based_variable} 12345 resource.labels."instance_id"="12345"

L'exemple de variable est basé sur le libellé de ressource instance_id.

${my_label_based_variable} * ""
${my_label_based_variable.value}
${my_value_based_variable}
12345 12345
${my_label_based_variable.value}
${my_value_based_variable}
* .*

Graphiques avec des requêtes PromQL

Pour appliquer une variable basée sur un libellé à un graphique contenant une requête PromQL, suivez les instructions de la section Syntaxe générale.

Console

Par exemple, la requête suivante repose sur la résolution de la variable basée sur le libellé, my_label_based_variable, en une expression de filtre:

compute_googleapis_com:instance_cpu_utilization{
    monitored_resource="gce_instance", ${my_label_based_variable} }

Vous pouvez également modifier la requête pour ne résoudre que la valeur d'une variable. L'exemple suivant utilise une expression régulière pour comparer la valeur d'une requête basée sur un libellé à instance_id:

compute_googleapis_com:instance_cpu_utilization{
    instance_id=~"${my_label_based_variable.value}"
}

Si vous disposez d'une variable à valeur unique, omettez la clause .value. Par exemple, pour filtrer par zone à l'aide d'une variable à valeur unique, la requête inclurait quelque chose comme ce qui suit:

zone=~"${my_value_only_variable}"

API

Par exemple, le code JSON suivant illustre une requête qui s'appuie sur la résolution de la variable basée sur le libellé, my_label_based_variable, en une expression de filtre:

"timeSeriesQuery": {
  "prometheusQuery": "avg_over_time(
    compute_googleapis_com:instance_cpu_utilization{
      monitored_resource=\"gce_instance\",
      ${my_label_based_variable}
      }[${__interval}])",
  "unitOverride": "",
  "outputFullDuration": false
},

Vous pouvez également modifier la requête pour ne résoudre que la valeur d'une variable. L'exemple suivant utilise une expression régulière pour comparer la valeur d'une requête basée sur un libellé à instance_id:

"timeSeriesQuery": {
  "prometheusQuery": "avg_over_time(
    compute_googleapis_com:instance_cpu_utilization{
    monitored_resource=\"gce_instance\",
    instance_id=~\"${my_label_based_variable.value}\"
    }[${__interval}])",
  "unitOverride": "",
  "outputFullDuration": false
},

Si vous disposez d'une variable à valeur unique, omettez la clause .value. Par exemple, pour filtrer par zone à l'aide d'une variable à valeur unique, la requête inclut quelque chose comme ce qui suit:

zone=~\"${my_value_only_variable}\"

Le tableau suivant illustre la façon dont les exemples de variables sont résolus par PromQL. Comme indiqué précédemment, lorsque seule la valeur d'une variable est utilisée, vous devez utiliser une expression régulière comme opérateur de comparaison:

Syntaxe Valeur sélectionnée
Expression PromQL résolue
${my_label_based_variable} 12345 instance_id == '12345'

L'exemple de variable est basé sur le libellé de ressource instance_id.

${my_label_based_variable} * noop_filter=~".*"
${my_label_based_variable.value}
${my_value_based_variable}
12345 12345
${my_label_based_variable.value}
${my_value_based_variable}
* .+

Graphiques avec des requêtes SQL

Lorsque vous souhaitez appliquer une variable à un widget défini en SQL, mettez à jour la clause WHERE pour faire référence à la valeur de la variable. Pour toutes les variables, préfixez le nom de la variable avec le signe "at", par exemple : @variable_name. Pour les variables basées sur des libellés, ajoutez .value au nom de la variable, @my_label_based_variabe.value.

Pour les requêtes SQL, la substitution de variables repose sur BigQuery et est sécurisée contre les injections SQL. Pour en savoir plus, consultez la section Exécuter des requêtes paramétrées.

Console

Étant donné que SQL n'interprète pas l'opérateur générique comme signifiant "n'importe quelle valeur", nous vous recommandons de toujours utiliser une instruction IF lorsque vous appliquez des variables à une requête SQL. L'exemple suivant illustre l'utilisation d'une variable à valeur unique dont le type de données est une chaîne:

WHERE IF(@my_value_only_variable = "*", TRUE, log_name = @my_value_only_variable)

Lorsque l'option de menu de la variable permet aux utilisateurs de sélectionner plusieurs valeurs, vous devez caster la valeur de la variable en type de données GoogleSQL à l'aide de la fonction CAST. La requête suivante illustre cette syntaxe:

IF(ARRAY_LENGTH(CAST(@my_value_only_variable)) = 0, TRUE,
   severity IN UNNEST(@my_value_only_variable))

L'instruction IF affichée dans les exemples précédents est recommandée, car SQL n'interprète pas l'opérateur générique comme signifiant "n'importe quelle valeur". Par conséquent, si vous omettez l'instruction IF et si vous sélectionnez l'opérateur de caractères génériques, le résultat de la requête est une table vide. Dans le deuxième exemple, la fonction UNNEST convertit le tableau en table.

Pour ajouter une clause WHERE correctement formatée, procédez comme suit:

  1. Modifiez le widget.
  2. Dans la barre d'outils, sélectionnez Insérer un filtre de variable, puis sélectionnez la variable que vous souhaitez appliquer à la clause WHERE.
  3. Dans la boîte de dialogue qui s'affiche, vérifiez le code généré, puis cliquez sur Copier et fermer.
  4. Collez le code copié dans le volet Requête, puis apportez les modifications nécessaires.

    Par exemple, supposons que vous créiez une variable nommée LogName qui génère une liste de noms de journaux et affiche le résultat dans un tableau avec une seule colonne nommée log_name. Vous créez ensuite un graphique, sélectionnez Insérer un filtre de variable, puis la variable LogName. Le code suivant est généré:

    WHERE IF(@LogName = '*', TRUE, LogName = @LogName)
    

    Dans cet exemple, vous devez modifier le code généré et remplacer LogName = par log_name = pour que la jointure de table puisse avoir lieu:

    WHERE IF(@LogName = '*', TRUE, log_name = @LogName)
    
  5. Cliquez sur Run (Exécuter), puis sur Apply (Appliquer).

  6. Pour enregistrer le tableau de bord modifié, cliquez sur Enregistrer dans la barre d'outils.

API

Étant donné que SQL n'interprète pas l'opérateur générique comme signifiant "n'importe quelle valeur", nous vous recommandons de toujours utiliser une instruction IF lorsque vous appliquez des variables à une requête SQL. L'exemple suivant illustre l'utilisation d'une variable à valeur unique dont le type de données est une chaîne:

WHERE IF(@my_value_only_variable = "*", TRUE, log_name = @my_value_only_variable)

Par exemple, voici une représentation JSON partielle d'un graphique qui affiche les résultats d'une requête SQL : Pour permettre de filtrer les résultats par nom de journal, une clause WHERE a été ajoutée qui fait référence à la variable LogName:

"plotType": "STACKED_BAR",
"targetAxis": "Y1",
"timeSeriesQuery": {
  "opsAnalyticsQuery": {
    "queryExecutionRules": {},
    "queryHandle": "",
    "sql": "SELECT\n timestamp, severity, resource.type, log_name, text_payload, proto_payload, json_payload\n
            FROM\n `my-project.global._Default._Default`\n
            WHERE \n IF (@LogName = \"*\", TRUE, log_name=@LogName)\nLIMIT 10000"
  }
}

La variable LogName émet également une requête pour déterminer la liste des noms de journaux possibles:

"dashboardFilters": [
  {
    "filterType": "VALUE_ONLY",
    "templateVariable": "LogName",
    "valueType": "STRING",
    "timeSeriesQuery": {
      "opsAnalyticsQuery": {
        "savedQueryId": "",
        "sql": "SELECT log_name FROM `my-project.global._Default._Default` GROUP BY log_name LIMIT 1000",
        "queryHandle": ""
      },
      "unitOverride": "",
      "outputFullDuration": false
    }
  }
],

Lorsque l'option de menu de la variable permet aux utilisateurs de sélectionner plusieurs valeurs, vous devez caster la valeur de la variable en type de données GoogleSQL à l'aide de la fonction CAST. La requête suivante illustre cette syntaxe:

IF(ARRAY_LENGTH(CAST(@my_value_only_variable)) = 0, TRUE,
   severity IN UNNEST(@my_value_only_variable))

L'instruction IF affichée dans les exemples précédents est recommandée, car SQL n'interprète pas l'opérateur générique comme signifiant "n'importe quelle valeur". Par conséquent, si vous omettez l'instruction IF et si vous sélectionnez l'opérateur de caractères génériques, le résultat de la requête est une table vide. Dans le deuxième exemple, la fonction UNNEST convertit le tableau en table.

Graphiques avec des requêtes MQL

Pour appliquer une variable basée sur un libellé à un graphique contenant une requête MQL, ajoutez un pipe, (|), puis suivez les instructions indiquées dans la section Syntaxe générale.

Lorsque vous utilisez l'interface à menus pour créer un graphique qui affiche des données de séries temporelles, vos sélections sont converties en filtre de surveillance.

Console

Par exemple, la requête suivante repose sur une variable basée sur un libellé, my_label_based_variable, qui est résolue en expression de filtre:

fetch gce_instance
| metric 'compute.googleapis.com/instance/cpu/utilization'
| every 1m
| ${my_label_based_variable}

Vous pouvez également modifier la requête pour ne résoudre que la valeur d'une variable. L'exemple suivant utilise une expression régulière pour comparer la valeur d'une requête basée sur un libellé à instance_id:

fetch gce_instance
| metric 'compute.googleapis.com/instance/cpu/utilization'
| filter resource.instance_id=~'${my_label_based_variable.value}'
| group_by 1m, [value_utilization_mean: mean(value.utilization)]
| every 1m

Si vous disposez d'une variable à valeur unique, omettez la clause .value. Par exemple, pour filtrer par zone à l'aide d'une variable à valeur unique, la requête inclurait quelque chose comme ce qui suit:

resource.zone=~'${my_value_only_variable}'

API

Par exemple, le code JSON suivant illustre une requête qui s'appuie sur une variable basée sur un libellé, my_label_based_variable, qui est résolue en expression de filtre:

"timeSeriesQuery": {
  "timeSeriesQueryLanguage": "fetch gce_instance\n
    | metric 'compute.googleapis.com/instance/cpu/utilization'\n
    | group_by 1m, [value_utilization_mean: mean(value.utilization)]\n
    | every 1m\n
    | ${my_label_based_variable}",
  "unitOverride": "",
  "outputFullDuration": false
},

Vous pouvez également modifier la requête pour ne résoudre que la valeur d'une variable. L'exemple suivant utilise une expression régulière pour comparer la valeur d'une requête basée sur un libellé à instance_id:

"timeSeriesQuery": {
  "timeSeriesQueryLanguage": "fetch gce_instance\n
    | metric 'compute.googleapis.com/instance/cpu/utilization'\n
    | filter resource.instance_id=~'${my_label_based_variable.value}'\n
    | group_by 1m, [value_utilization_mean: mean(value.utilization)]\n
    | every 1m\n",
  "unitOverride": "",
  "outputFullDuration": false
},

Si vous disposez d'une variable à valeur unique, omettez la clause .value. Par exemple, pour filtrer par zone à l'aide d'une variable à valeur unique, la requête inclurait quelque chose comme ce qui suit:

resource.zone=~'${my_value_only_variable}'

Le tableau suivant illustre la façon dont les exemples de variables sont résolus par le MQL. Comme indiqué précédemment, lorsque seule la valeur d'une variable est utilisée, vous devez utiliser une expression régulière comme opérateur de comparaison:

Syntaxe Valeur sélectionnée
Expression MQL résolue
${my_label_based_variable} 12345 filter (resource.instance_id == '12345')

L'exemple de variable est basé sur le libellé de ressource instance_id.

${my_label_based_variable} * filter (true)
${my_label_based_variable.value}
${my_value_based_variable}
12345 12345
${my_label_based_variable.value}
${my_value_based_variable}
* .*

Graphiques avec des requêtes de filtres de surveillance

Pour appliquer une variable basée sur des étiquettes à un graphique contenant une requête sous la forme d'un filtre de surveillance, suivez les instructions de la section Syntaxe générale.

Console

Si vous utilisez la console Google Cloud pour créer vos graphiques et si vous utilisez l'interface basée sur les menus, vous pouvez appliquer une variable basée sur des libellés à un graphique à l'aide du champ Appliquer aux graphiques de la variable ou en modifiant le widget et en sélectionnant la variable basée sur des libellés dans le menu Filtrer. Le menu Filtrer liste toutes les variables basées sur des étiquettes et toutes les clés d'étiquette.

Pour appliquer une variable basée sur la valeur à ces types de graphiques, procédez comme suit:

  1. Modifier le graphique
  2. Dans le volet de requête, cliquez sur Ajouter un filtre, puis sélectionnez une clé de libellé. Par exemple, vous pouvez sélectionner zone.
  3. Dans le menu Valeur, sélectionnez votre variable à valeur unique.
  4. Cliquez sur Appliquer.
  5. Pour enregistrer le tableau de bord modifié, cliquez sur Enregistrer dans la barre d'outils.

Par exemple, le code JSON suivant illustre une requête qui s'appuie sur une variable basée sur un libellé, my_label_based_variable, qui est résolue en expression de filtre:

metric.type="compute.googleapis.com/instance/cpu/utilization"
resource.type="gce_instance" ${my_label_based_variable}"

Les widgets qui utilisent une requête sous la forme d'un filtre de surveillance ne peuvent pas filtrer la série temporelle en fonction de la valeur d'une variable basée sur des étiquettes. Toutefois, vous pouvez filtrer en fonction de variables de type "Valeur uniquement". Par exemple, la requête suivante affiche la valeur du champ Filtres d'une requête qui filtre par zone, en fonction de la valeur d'une variable à valeur unique:

metric.type="compute.googleapis.com/instance/cpu/utilization"
resource.type="gce_instance"
resource.label."zone"=monitoring.regex.full_match(${my_value_only_variable})

API

Par exemple, le code JSON suivant illustre une requête qui s'appuie sur une variable basée sur un libellé, my_label_based_variable, qui est résolue en expression de filtre:

"timeSeriesQuery": {
  "timeSeriesFilter": {
    "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\"
               resource.type=\"gce_instance\"
               ${my_label_based_variable} ",
    "aggregation": {
      "alignmentPeriod": "60s",
      "perSeriesAligner": "ALIGN_MEAN",
      "groupByFields": []
    }
  },
  "unitOverride": "",
  "outputFullDuration": false
},

Les widgets qui utilisent une requête sous la forme d'un filtre de surveillance ne peuvent pas filtrer la série temporelle en fonction de la valeur d'une variable basée sur des étiquettes. Toutefois, vous pouvez filtrer en fonction de variables de type "Valeur uniquement". Par exemple, la requête suivante affiche le champ "filter" d'une requête qui filtre par zone, en fonction de la valeur d'une variable à valeur unique:

"filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\"
          resource.type=\"gce_instance\"
          resource.labels.\"zone\"=monitoring.regex.full_match(${my_value_only_variable})"

Le tableau suivant illustre la façon dont les exemples de variables sont résolus par le filtre de surveillance. Comme indiqué précédemment, lorsque seule la valeur d'une variable est utilisée, vous devez utiliser une expression régulière comme opérateur de comparaison:

Syntaxe Valeur sélectionnée
Expression de filtre résolue
${my_label_based_variable} 12345 resource.instance_id == "12345"

L'exemple de variable est basé sur le libellé de ressource instance_id.

${my_label_based_variable} * Omission
${my_label_based_variable.value} 12345 Non compatible
${my_label_based_variable.value} * Non compatible
${my_value_based_variable} 12345 "12345"
${my_value_based_variable} * ".*"

Créer un tableau de bord

Pour créer un tableau de bord personnalisé, appelez la méthode dashboards.create en lui fournissant la disposition du tableau de bord et les widgets à y afficher.

Lorsque vous créez un tableau de bord, l'API génère automatiquement l'identifiant dashboard_id. Si vous souhaitez spécifier un identifiant dashboard_id personnalisé, vous pouvez définir le champ name d'un objet Dashboard. Le format du champ de nom se présente ainsi :

"name": "projects/${PROJECT_ID}/dashboards/${DASHBOARD_ID}"

API

Pour créer un tableau de bord, envoyez une requête POST au point de terminaison Dashboard.

curl -d @my-dashboard.json -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' -X POST https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards

gcloud

Pour créer un tableau de bord dans un projet, utilisez la commande gcloud monitoring dashboards create.

gcloud monitoring dashboards create --config-from-file=my-dashboard.json

Par exemple, si vous souhaitez dupliquer un tableau de bord, procédez comme suit:

  1. Suivez la procédure de la section Obtenir un tableau de bord pour télécharger la définition du tableau de bord d'origine.
  2. Modifiez le code JSON renvoyé pour supprimer les champs etag et name, et modifiez la valeur du champ displayName.
  3. Exécutez la commande pour créer le tableau de bord.

Pour en savoir plus, consultez la référence gcloud monitoring dashboards create.

Terraform

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base. Pour en savoir plus, consultez la documentation de référence du fournisseur Terraform.

Pour créer un tableau de bord à l'aide de Terraform, utilisez la ressource Terraform google_monitoring_dashboard.

Dans la commande, définissez les champs suivants:

  • dashboard_json: représentation JSON du tableau de bord, au format Dashboards.

    Pour obtenir des exemples de ce format, vous pouvez lister vos tableaux de bord à l'aide de l'explorateur d'API, ou ouvrir un tableau de bord dans la console Google Cloud et afficher les représentations JSON.

  • parent: nom complet de votre projet. Par exemple, vous pouvez définir ce champ sur "projects/PROJECT_ID", où PROJECT_ID correspond à l'ID de votre projet Google Cloud.

Les exemples présentés ici créent un tableau de bord à l'aide du fichier my-dashboard.json. Vous pouvez gérer votre tableau de bord via la console Google Cloud.

Pour voir d'autres configurations de tableau de bord, consultez la page Exemples de tableaux de bord et de dispositions.

Supprimer des tableaux de bord

Pour supprimer un tableau de bord personnalisé, appelez la méthode dashboards.delete en spécifiant le tableau de bord à supprimer.

API

Pour supprimer un tableau de bord personnalisé, envoyez une requête DELETE au point de terminaison Dashboard incluant l'ID du tableau de bord à supprimer.

curl -H "Authorization: Bearer $ACCESS_TOKEN" -X DELETE https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards/${DASHBOARD_ID}

Si l'opération réussit, l'API renvoie une réponse vide. Sinon, l'appel renvoie une erreur.

gcloud

Pour supprimer un tableau de bord personnalisé, utilisez gcloud monitoring dashboards delete et spécifiez l'ID complet du tableau de bord à supprimer:

gcloud monitoring dashboards delete projects/${PROJECT_ID}/dashboards/${DASHBOARD_ID}

Pour en savoir plus, consultez la référence gcloud monitoring dashboards delete.

Terraform

Vous pouvez supprimer des ressources à l'aide de Terraform. Pour en savoir plus sur la suppression de ressources, consultez la commande Terraform destroy.

Répertorier les tableaux de bord

Pour lister tous les tableaux de bord associés à un projet, appelez la méthode dashboards.list en spécifiant l'ID du projet.

API

Pour répertorier tous les tableaux de bord personnalisés d'un projet, envoyez l'ID du projet au point de terminaison Dashboard.

curl -H "Authorization: Bearer $ACCESS_TOKEN" https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards

gcloud

Pour répertorier tous les tableaux de bord personnalisés d'un projet, utilisez la commande gcloud monitoring dashboards list:

gcloud monitoring dashboards list

Pour en savoir plus, consultez la documentation de référence sur gcloud monitoring dashboards list.

Terraform

Vous ne pouvez pas utiliser Terraform pour envoyer une requête à votre projet, la réponse étant une liste de tableaux de bord. Toutefois, vous pouvez afficher ces tableaux de bord à l'aide de la console Google Cloud.

Les exemples renvoient les tableaux de bord personnalisés associés à votre projet.

Paginer la réponse de List

La méthode dashboards.list permet la pagination, ce qui vous permet d'afficher les résultats page par page et non en un seul bloc.

API

Pour la première page de la liste de résultats, spécifiez le paramètre pageSize (taille de page) dans la requête :

curl -H "Authorization: Bearer $ACCESS_TOKEN" https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards?page_size=1

La méthode renvoie la première page de la liste ainsi que le jeton nextPageToken. Exemple :

{
  "dashboards" : [
    {
       "displayName" : "Grid Layout Example",
       "gridLayout" : {
         "widgets" : [
            { ... },
            { ... },
            { ... },
          ]
       }
    }
  ]
},
"nextPageToken": "ChYqFDEyMzkzMzUwNzg0OTE1MDI4MjM3"

Pour chacune des pages restantes, vous devez inclure le jeton nextPageToken correspondant dans la requête.

gcloud

Pour spécifier le nombre de ressources par page, transmettez l'option --page-size à l'aide de la commande. Exemple :

gcloud monitoring dashboards list --page-size=1

Terraform

Vous ne pouvez pas utiliser Terraform pour envoyer une requête à votre projet, la réponse étant une liste paginée de tableaux de bord. Toutefois, vous pouvez afficher ces tableaux de bord à l'aide de la console Google Cloud.

Obtenir un tableau de bord

Pour obtenir un tableau de bord personnalisé spécifique pour un projet, appelez la méthode dashboards.get en spécifiant l'ID du tableau de bord.

API

Pour récupérer un tableau de bord personnalisé spécifique, envoyez l'ID du tableau de bord au point de terminaison Dashboard.

curl -H "Authorization: Bearer $ACCESS_TOKEN" https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards/${DASHBOARD_ID}

La méthode renvoie une réponse semblable à l'exemple ci-dessous :

{
  "columnLayout": {
    "columns": [
      {
        "widgets": [
          {
            "text": {
              "content": "Text Widget 1",
              "format": "RAW"
            }
          },
          {
            "text": {
              "content": "**Text Widget 2**",
              "format": "MARKDOWN"
            }
          },
          {
            "text": {
              "content": "_Text Widget 3_",
              "format": "MARKDOWN"
            }
          }
        ]
      }
    ]
  },
  "displayName": "Column-layout example",
  "etag": "cb3070baf15de7c79d78761baac3a386",
  "name": "projects/730041941835/dashboards/e4cd063e-5414-4e07-9e1e-450d6d3a531d"
}

gcloud

Pour obtenir un tableau de bord personnalisé spécifique, utilisez la commande gcloud monitoring dashboards describe et spécifiez l'ID du tableau de bord:

gcloud monitoring dashboards describe ${DASHBOARD_ID} --format=json

La commande renvoie le tableau de bord demandé :

{
  "columnLayout": {
    "columns": [
      {
        "widgets": [
          {
            "text": {
              "content": "Text Widget 1",
              "format": "RAW"
            }
          },
          {
            "text": {
              "content": "**Text Widget 2**",
              "format": "MARKDOWN"
            }
          },
          {
            "text": {
              "content": "_Text Widget 3_",
              "format": "MARKDOWN"
            }
          }
        ]
      }
    ]
  },
  "displayName": "Column-layout example",
  "etag": "cb3070baf15de7c79d78761baac3a386",
  "name": "projects/730041941835/dashboards/e4cd063e-5414-4e07-9e1e-450d6d3a531d"
}

Pour en savoir plus, consultez la documentation de référence sur gcloud monitoring dashboards describe.

Terraform

Vous ne pouvez pas utiliser Terraform pour envoyer une requête à votre projet, la réponse étant un tableau de bord individuel. Toutefois, vous pouvez afficher ces tableaux de bord à l'aide de la console Google Cloud.

Mettre à jour le tableau de bord

Pour mettre à jour un tableau de bord personnalisé existant, appelez la méthode dashboards.patch. Pour obtenir la valeur etag actuelle, vous pouvez appeler la méthode dashboards.get : la valeur figure dans la réponse.

API

Pour mettre à jour un tableau de bord personnalisé, envoyez une requête PATCH au point de terminaison Dashboard et fournissez l'objet Dashboard révisé et la valeur etag de la dernière réponse dashboards.get.

curl -d @my-updated-dashboard.json -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' -X PATCH https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards/${DASHBOARD_ID}

L'exemple précédent met à jour un tableau de bord personnalisé existant à l'aide du fichier my-updated-dashboard.json. La réponse, qui inclut une nouvelle valeur etag, est une copie de la liste de tableaux de bord mise à jour.

gcloud

Pour mettre à jour un tableau de bord personnalisé, utilisez gcloud monitoring dashboards update, spécifiez l'ID du tableau de bord à mettre à jour et effectuez les modifications.

gcloud monitoring dashboards update ${DASHBOARD_ID} --config-from-file=my-updated-dashboard.json

Pour en savoir plus, consultez la documentation de référence sur gcloud monitoring dashboards update.

L'exemple précédent met à jour un tableau de bord personnalisé existant à l'aide du fichier my-updated-dashboard.json. La réponse, qui inclut une nouvelle valeur etag, est une copie de la liste de tableaux de bord mise à jour.

Terraform

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base. Pour en savoir plus, consultez la documentation de référence du fournisseur Terraform.

Pour mettre à jour un tableau de bord à l'aide de Terraform, utilisez la ressource Terraform google_monitoring_dashboard.

Dans la commande, définissez les champs suivants:

  • dashboard_json: représentation JSON du tableau de bord, au format Dashboards.

  • parent: nom complet de votre projet. Par exemple, vous pouvez définir ce champ sur "projects/PROJECT_ID", où PROJECT_ID correspond à l'ID de votre projet Google Cloud.

Étape suivante