Criar e gerenciar painéis por API

Neste documento, descrevemos como criar e gerenciar painéis personalizados e os widgets neles usando o recurso Dashboard na API Cloud Monitoring. Os exemplos aqui ilustram como gerenciar seus painéis usando curl para invocar a API e como usar a Google Cloud CLI. Embora você também possa gerenciar seus painéis personalizados por meio do Console do Google Cloud, a API oferece uma maneira programática de gerenciar vários painéis ao mesmo tempo.

O endpoint é compatível com os métodos de gerenciamento e configuração de painéis a seguir:

É possível invocar a API diretamente usando o utilitário curl ou a Google Cloud CLI.

Não é possível recuperar, editar ou excluir painéis predefinidos.

Antes de começar

Ao criar um painel, você precisa especificar quais componentes ou widgets serão exibidos e qual será o layout desses widgets. Você também pode adicionar filtros permanentes ao seu painel.

Layouts de painel

Os layouts definem como os componentes de um painel são ordenados. A API fornece os seguintes layouts:

  • GridLayout: divide o espaço disponível em colunas verticais com larguras iguais e organiza um conjunto de widgets usando uma estratégia de linha primeiro.

  • MosaicLayout: divide o espaço disponível em uma grade. Cada widget pode ocupar um ou mais blocos de grade.

  • RowLayout: divide o espaço disponível em linhas e organiza um conjunto de widgets na horizontal em cada uma delas.

  • ColumnLayout: divide o espaço disponível em colunas verticais e organiza um conjunto de widgets na vertical em cada uma delas.

Por exemplo, veja a seguir a representação JSON de um painel em RowLayout com três 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 do painel

Um widget inclui um único componente de painel, além da configuração de como ele será apresentado nesse painel. Um painel pode ter mais de um widget. Há vários tipos de objetos Widget:

  • Widgets de gráfico e tabela:

    • XyChart: exibe dados usando os eixos X e Y. Os gráficos a seguir são instâncias do widget XyChart:

    • Gráficos de linhas

    • Gráficos de barras

    • Gráficos de área empilhada

    • Mapas de Calor

    • Gráficos da Análise de dados de registros

    • Os widgets de SLO, mas a criação de gráficos de SLO usando a API não é compatível.

    Se você criar um gráfico de linhas, de barras empilhadas ou de área empilhado, é possível especificar que uma métrica se refira ao eixo Y à esquerda ou à direita. Quando há um gráfico com várias métricas, use os dois eixos Y.

    • PieChart: mostra o valor mais recente de uma métrica, em que cada série temporal contribui com uma fatia para o gráfico.

    • Scorecard: exibe o valor mais recente de uma métrica e como ele está relacionado a um ou mais limites.

    • TimeSeriesTable: exibe o valor mais recente de uma métrica. É possível classificar a tabela com base em colunas, filtrá-la e adicionar ou remover colunas da exibição.

  • Widgets de alerta e incidente:

    • AlertChart: exibe um resumo de uma política de alertas de condição única. Esse widget exibe dados como um gráfico de linhas, mostra o limite e lista o número de incidentes abertos.

    • IncidentList: mostra uma lista de incidentes. É possível configurá-lo para mostrar incidentes relacionados a políticas de alertas específicas ou a tipos de recursos específicos.

  • Widgets de registro e erro:

  • Widgets de texto e organização:

    Para incluir esses widgets em um painel, ele precisa ter um MosaicLayout.

    • CollapsibleGroup: mostra uma coleção de widgets. Você pode fechar a visualização de um grupo.

    • SingleViewGroup: mostra um widget em um conjunto de widgets. É possível selecionar o widget a ser exibido.

    • SectionHeader: cria um divisor horizontal no seu painel e uma entrada no índice dele.

    • Text: exibe o conteúdo textual como texto bruto ou string do Markdown.

Além desses objetos, é possível adicionar um marcador vazio a um painel.

O exemplo a seguir mostra a representação JSON de um widget XyChart com o eixo Y direito configurado:

{
  "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"
          }
        }
      }
    ]
  }
}

Filtros do painel

Ao projetar um painel, você pode identificar várias maneiras de visualizar os dados exibidos nele. Por exemplo, quando um painel exibe métricas de instâncias de máquina virtual (VM), talvez você queira ver as métricas de todas as VMs ou de uma zona específica. Nesse tipo de situação, recomendamos que você crie um filtro permanente e defina o valor padrão dele como a visualização mais usada. Os filtros permanentes podem se aplicar a alguns ou a todos os widgets do painel. Ao visualizar o painel com o console do Google Cloud, a barra de ferramentas do painel exibe seus filtros permanentes e um menu que pode ser usado para mudar temporariamente o valor do filtro.

Há vários tipos de filtros de painel permanentes:

  • Os filtros em todo o painel se aplicam a todos os widgets em um painel que oferecem suporte ao rótulo de filtro e que não especificam um valor para esse rótulo.

    Por exemplo, quando um gráfico inclui o filtro zone = us-central1-a, ele ignora um filtro de painel com base no rótulo zone. Da mesma forma, os gráficos sem o rótulo zone ignoram os filtros do painel com esse rótulo.

  • As variáveis de modelo são variáveis nomeadas que se aplicam a widgets específicos. Cada variável é para um rótulo e um valor específicos. Você determina a quais widgets uma variável de modelo se aplica.

Todos os tipos de filtro são representados com a mesma estrutura de dados. Para mais informações, consulte DashboardFilter.

Por exemplo, veja a seguir a representação JSON parcial de um painel que define uma variável de modelo e um filtro geral:

{
  "dashboardFilters": [
      {
        "filterType": "RESOURCE_LABEL",
        "labelKey": "instance_id",
        "stringValue": "3133577226154888113",
        "templateVariable": "iid"
      },
      {
        "filterType": "RESOURCE_LABEL",
        "labelKey": "zone"
      }
    ],
  "displayName": "Illustrate Template Variables",
  ...

No JSON exibido, a primeira entrada na estrutura dashboardFilters é para uma variável de modelo com o nome iid e um filtro em todo o painel com a chave de rótulo zone. A variável de modelo é um alias do rótulo instance_id.

A estrutura de dados de uma variável de modelo não lista os widgets a que ela se aplica. Em vez disso, associe um widget a uma variável de modelo modificando a consulta do widget para incluir uma referência à variável. Quando o widget é exibido no painel, o valor da variável de modelo é resolvido.

Consulte as seções abaixo para saber como fazer anotações em painéis e gráficos de registros:

Painel de registros

Para configurar um painel de registros para filtrar a exibição com base no valor de uma variável de modelo, adicione a variável ao painel de consulta. O exemplo a seguir ilustra uma consulta que filtra pelo valor da variável de modelo iid:

${iid}

Antes de o painel de registros consultar os registros para exibição, a variável de modelo é resolvida. Neste exemplo, se o valor da variável de modelo for "12345", ${iid} será substituído pela instrução resource.labels."instance_id"="12345".

Você também pode incluir apenas o valor de uma variável de modelo em uma consulta. Recomendamos que você use o valor apenas como parte de um filtro definido com uma expressão regular. Por exemplo, a consulta a seguir usa uma expressão regular para corresponder a entradas de registro que têm um payload JSON que contém a string descrita:

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

Se você tiver configurado uma consulta para o painel de registros e selecionado o botão para abri-lo, as variáveis de modelo serão resolvidas antes de abrir a ferramenta.

A tabela a seguir mostra como a variável de modelo é resolvida pelo painel de registros:

Sintaxe Valor
selecionado
Expressão do painel de registros resolvida
${iid} 12345 resource.labels."instance_id"="12345"
${iid} * ""
${iid.value} 12345 12345
${iid.value} * .*

Gráficos e tabelas definidos pelo MQL

Ao usar a linguagem de consulta do Monitoring (MQL, na sigla em inglês) para configurar um gráfico, anexe um pipe e a variável à string de consulta:

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

Antes que o gráfico consulte a série temporal para exibição, a variável de modelo é resolvida. Neste exemplo, se o valor da variável de modelo for "12345", ${iid} será substituído pela instrução filter (resource.instance_id == '12345'). Esse filtro corresponde a séries temporais que têm um rótulo chamado resource.instance_id e apenas quando o valor desse rótulo é exatamente 12345.

Quando você quiser filtrar série temporal usando uma expressão regular, configure a consulta para incluir apenas o valor da variável de modelo. Para ilustrar a sintaxe, o exemplo abaixo mostra como usar uma expressão regular para determinar se o valor do rótulo resource.instance_id contém o valor da variável de modelo iid:

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

A tabela a seguir mostra como a variável de modelo é resolvida para consultas MQL:

Sintaxe Valor
selecionado
Expressão MQL resolvida
${iid} 12345 filter (resource.instance_id == '12345')
${iid} * filter (true)
${iid.value} 12345 12345
${iid.value} * .*

Gráficos e tabelas definidos pelo PromQL

Ao definir um gráfico usando PromQL, anexe à string de consulta a variável entre chaves:

compute_googleapis_com:instance_cpu_utilization {
    project_id="my-project", ${iid}
}

Antes que o gráfico consulte a série temporal para exibição, a variável de modelo é resolvida. Neste exemplo, se o valor da variável de modelo for "12345", ${iid} será substituído pela instrução instance_id == '12345'.

Assim como no MQL, quando você define um widget com PromQL, a consulta pode extrair apenas o valor da variável de modelo. Recomendamos que você use o valor apenas como parte de um filtro definido com uma expressão regular. Para ilustrar a sintaxe, veja a seguir como usar uma expressão regular para determinar se o valor do rótulo instance_id contém o valor da variável de modelo iid:

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

A tabela a seguir mostra como a variável de modelo é resolvida para consultas PromQL:

Sintaxe Valor
selecionado
Expressão PromQL resolvida
${iid} 12345 instance_id == '12345'
${iid} * noop_filter=~".*"
${iid.value} 12345 12345
${iid.value} * .+

Gráficos e tabelas definidos com filtros de série temporal

Ao definir um gráfico usando filtros de séries temporais, anexe a variável à string de filtro:

"filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\"
           resource.type=\"gce_instance\" ${iid}"

Ao contrário dos gráficos definidos por MQL e PromQL, não é possível usar o valor de uma variável de modelo em um filtro de série temporal.

A tabela a seguir mostra como a variável de modelo é resolvida:

Sintaxe Valor
selecionado
Expressão de filtro resolvida
${iid} 12345 resource.instance_id == "12345"
${iid} * Omitida
${iid.value} 12345 Sem suporte
${iid.value} * Sem suporte

Crie um painel

Para criar um novo painel personalizado, invoque o método dashboards.create e inclua nele o layout e os widgets a serem exibidos no painel.

Quando você cria um painel, a API gera o dashboard_id automaticamente. Se você quiser especificar um dashboard_id personalizado, defina o campo name de um objeto Dashboard. O formato do campo de nome é assim:

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

Protocolo

Para criar um novo painel, envie uma solicitação POST para o endpoint 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

Para criar um painel em um projeto, use o comando gcloud monitoring dashboards create.

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

Por exemplo, se você quiser duplicar um painel, faça o seguinte:

  1. Conclua as etapas em Exibir painel para fazer o download da definição do painel original.
  2. Edite o JSON retornado para remover os campos etag e name e altere o valor do campo displayName.
  3. Execute o comando para criar o painel.

Para mais informações, consulte a referência de gcloud monitoring dashboards create.

Os exemplos criam um painel de amostra usando o arquivo my-dashboard.json. É possível gerenciar seu painel por meio do console do Google Cloud.

Para mais configurações de painel, consulte Exemplos de painéis e layouts.

Excluir painéis

Para excluir um painel personalizado, invoque o método dashboards.delete e especifique o painel que você quer excluir.

Protocolo

Para excluir um painel personalizado, envie uma solicitação DELETE para o endpoint Dashboard, qualificado com o código do painel a ser excluído.

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

Se for bem-sucedido, o método retornará uma resposta vazia. Caso contrário, um erro será exibido.

gcloud

Para excluir um painel personalizado, use gcloud monitoring dashboards delete e especifique o código totalmente qualificado do painel a ser excluído:

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

Para mais informações, consulte a referência de gcloud monitoring dashboards delete.

Listar painéis

Para listar todos os painéis que pertencem a um projeto, invoque o método dashboards.list e especifique o ID do projeto.

Protocolo

Para listar todos os painéis personalizados de um projeto, envie o código do projeto para o endpoint Dashboard.

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

gcloud

Para listar todos os painéis personalizados de um projeto, use o comando gcloud monitoring dashboards list:

gcloud monitoring dashboards list

Para mais informações, consulte a referência de gcloud monitoring dashboards list.

Os exemplos retornam os painéis personalizados associados ao seu projeto.

Paginar a resposta da lista

O método dashboards.list suporta paginação. Com ela, em vez de ver todos os resultados ao mesmo tempo, você os visualiza em uma página de cada vez.

Protocolo

Na página inicial da lista de resultados, especifique o parâmetro de consulta pageSize com a solicitação:

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

O método retorna a primeira página da lista e o nextPageToken. Exemplo:

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

Em cada página restante, você precisa incluir o nextPageToken correspondente na solicitação.

gcloud

Para especificar o número de recursos por página, passe a sinalização --page-size com o comando. Exemplo:

gcloud monitoring dashboards list --page-size=1

Acessar painel

Para receber um painel personalizado específico para um projeto, invoque o método dashboards.get, qualificado com o código do painel.

Protocolo

Para receber um painel personalizado específico, envie o código dele para o endpoint Dashboard.

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

O método retorna uma resposta semelhante ao exemplo a seguir:

{
  "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

Para receber um painel personalizado específico, use o comando gcloud monitoring dashboards describe e especifique o código do painel:

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

O comando retorna o painel solicitado:

{
  "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"
}

Para mais informações, consulte a referência de gcloud monitoring dashboards describe.

Atualizar painel

Para atualizar um painel personalizado existente, invoque o método dashboards.patch. Para receber o valor etag atual, invoque o método dashboards.get, e ele estará incluído na resposta.

Protocolo

Para atualizar um painel personalizado, envie uma solicitação PATCH para o endpoint Dashboard e forneça o objeto Dashboard revisado e o valor etag da resposta dashboards.get mais recente.

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}

gcloud

Para atualizar um painel personalizado, use gcloud monitoring dashboards update, especifique o código do painel a ser atualizado e forneça as alterações no painel.

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

Para mais informações, consulte a referência de gcloud monitoring dashboards update.

Os exemplos atualizam um painel personalizado existente usando o arquivo my-updated-dashboard.json e retornam uma cópia da listagem do painel atualizada. Os dados retornados incluem um novo valor de etag.

A seguir