Exemplos de painéis e layouts

Nesta página, você verá como criar painéis usando a API Cloud Monitoring. Para cada exemplo, a definição do painel em JSON e o painel correspondente são mostrados. É possível fornecer JSON para a CLI do Google Cloud e para os endpoints da API Cloud Monitoring.

O Cloud Monitoring também fornece um conjunto selecionado de definições de painel no GitHub. É possível instalar essas definições no projeto do Google Cloud como painéis personalizados. Para informações sobre esse repositório e como instalar esses painéis, consulte Instalar painéis de amostra.

Quando usar a API ou a CLI do Google Cloud

A API Cloud Monitoring e a CLI do Google Cloud oferecem uma maneira de gerenciar vários painéis ao mesmo tempo. Embora seja possível usar o console doGoogle Cloud para gerenciar seus painéis, talvez seja mais fácil usar scripts que gerenciam seus painéis personalizados em massa.

Você também precisa usar a API quando quiser adicionar o widget de marcador em branco ao seu painel.

Como usar MQL ou PromQL com a API

Os painéis são criados com o método dashboards.create. Você transmite ao método da API um objeto Dashboard, que contém uma entrada para cada widget exibido no painel.

Quando um widget mostra dados de série temporal, como um widget de gráfico, a entrada dele no objeto Dashboard contém um objeto TimeSeriesQuery. Esse objeto descreve os dados de série temporal a serem representados em um gráfico. Para especificar esses dados, use um filtro do Monitoring, uma consulta MQL ou uma consulta PromQL:

  • Para usar os filtros do Monitoring, preencha o campo timeSeriesField. Os exemplos nesta página usam filtros do Cloud Monitoring.

  • Para usar uma consulta MQL, preencha o campo timeSeriesQueryLanguage. Para mais informações, consulte Como criar gráficos.

  • Para usar uma consulta PromQL, preencha o campo prometheusQuery. Para informações gerais, consulte PromQL no Cloud Monitoring.

Layouts de painel

Esta seção contém informações sobre os diferentes layouts de painel disponíveis.

Painel em GridLayout

Este painel mostra um GridLayout com três widgets.

{
  "displayName": "Grid Layout Example",
  "gridLayout": {
    "columns": "2",
    "widgets": [
      {
        "title": "Widget 1",
        "xyChart": {
          "dataSets": {
            "timeSeriesQuery": {
              "timeSeriesFilter": {
                "filter": "metric.type=\"agent.googleapis.com/nginx/connections/accepted_count\"",
                "aggregation": {
                  "perSeriesAligner": "ALIGN_RATE"
                }
              },
              "unitOverride": "1"
            },
            "plotType": "LINE"
          },
          "timeshiftDuration": "0s",
          "yAxis": {
            "label": "y1Axis",
            "scale": "LINEAR"
          }
        }
      },
      {
        "text": {
          "content": "Widget 2"
        }
      },
      {
        "title": "Widget 3",
        "xyChart": {
          "dataSets": {
            "timeSeriesQuery": {
              "timeSeriesFilter": {
                "filter": "metric.type=\"agent.googleapis.com/nginx/connections/accepted_count\"",
                "aggregation": {
                  "perSeriesAligner": "ALIGN_RATE"
                }
              },
              "unitOverride": "1"
            },
            "plotType": "STACKED_BAR"
          },
          "timeshiftDuration": "0s",
          "yAxis": {
            "label": "y1Axis",
            "scale": "LINEAR"
          }
        }
      }
    ]
  }
}

O painel é semelhante a este exemplo:

Exemplo de painel com layout de grade

Painel em MosaicLayout

Este painel mostra um MosaicLayout com dois widgets.

{
  "displayName": "Mosaic Layout Example",
  "mosaicLayout": {
    "columns": 12,
    "tiles": [
      {
        "xPos": 2,
        "yPos": 2,
        "width": 7,
        "height": 2,
        "widget": {
          "title": "CPU utilization in us-central1-a",
          "scorecard": {
            "timeSeriesQuery": {
              "timeSeriesFilter": {
                "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" resource.type=\"gce_instance\" resource.label.zone=\"us-central1-a\"",
                "aggregation": {
                  "perSeriesAligner": "ALIGN_MEAN",
                  "crossSeriesReducer": "REDUCE_MAX"
                }
              },
              "unitOverride": "1"
            },
            "gaugeView": {
              "upperBound": 1.5
            },
            "thresholds": [
              {
                "value": 0.8,
                "color": "YELLOW",
                "direction": "ABOVE"
              },
              {
                "value": 1,
                "color": "RED",
                "direction": "ABOVE"
              }
            ]
          }
        }
      },
      {
        "xPos": 1,
        "yPos": 5,
        "width": 4,
        "height": 4,
        "widget": {
          "title": "My 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",
                "minAlignmentPeriod": "60s"
              }
            ],
            "yAxis": {
              "label": "y1Axis",
              "scale": "LINEAR"
            }
          }
        }
      }
    ]
  }
}

O painel é semelhante a este exemplo:

Exemplo de painel com layout de mosaico

Painel em RowLayout

Este painel exibe um RowLayout com três widgets.

{
  "displayName": "Row Layout Example",
  "rowLayout": {
    "rows": [
      {
        "weight": "1",
        "widgets": [
          {
            "text": {
              "content": "Widget 1",
              "format": "MARKDOWN"
            }
          },
          {
            "text": {
              "content": "Widget 2",
              "format": "MARKDOWN"
            }
          },
          {
            "text": {
              "content": "Widget 3",
              "format": "MARKDOWN"
            }
          }
        ]
      }
    ]
  }
}

O painel é semelhante a este exemplo:

Exemplo de painel com layout de linhas

Painel em ColumnLayout

Este painel exibe um ColumnLayout com três widgets.

{
  "displayName": "Column Layout Example",
  "columnLayout": {
    "columns": [
      {
        "weight": "1",
        "widgets": [
          {
            "text": {
              "content": "Widget 1",
              "format": "MARKDOWN"
            }
          },
          {
            "text": {
              "content": "Widget 2",
              "format": "MARKDOWN"
            }
          },
          {
            "text": {
              "content": "Widget 3",
              "format": "MARKDOWN"
            }
          }
        ]
      }
    ]
  }
}

O painel é semelhante a este exemplo:

Exemplo de painel com layout de colunas

Ativar eventos do painel e adicionar filtros e rótulos

Esta seção descreve como adicionar filtros e rótulos a um painel e como configurar um painel para mostrar eventos.

Ativar eventos nos painéis

É possível configurar um painel para mostrar eventos, como um evento de atualização do Google Kubernetes Engine ou de falha de máquina virtual, incluindo um campo annotations no objeto Dashboard. O campo annotations contém uma instância de um objeto DashboardAnnotations, que tem dois campos:

  • O campo defaultResourceName lista os padrões no nível do painel para os projetosGoogle Cloud em que os eventos serão pesquisados. Se você não especificar esse campo, o projeto selecionado será pesquisado.

  • Uma matriz de objetos EventAnnotation. Cada objeto contém o seguinte:

    • Um campo displayName, que permite definir o rótulo na alternância específica do evento. Quando esse campo não é especificado ou quando o valor dele é uma string vazia, o nome padrão do evento é exibido.
    • Um campo enabled, que controla o valor da alternância do evento. Quando true, a chave fica na posição on e os eventos são mostrados no painel. Quando false, o botão está na posição off.
    • Um campo eventType, que contém um valor da enumeração EventType.
    • Um campo filter, que permite especificar uma consulta a ser adicionada ao final da consulta específica do evento. Quando o valor desse campo é uma string vazia, a consulta específica do evento é usada.
    • Um campo resourceNames, que permite definir uma lista de projetosGoogle Cloud para pesquisar eventos. Quando esse campo é uma matriz vazia, o projeto selecionado é pesquisado.

O exemplo a seguir mostra um campo annotations que especifica um evento do Google Kubernetes Engine:

{
  "displayName": "Annotation example",
  "annotations": {
    "defaultResourceNames": [],
    "eventAnnotations": [
      {
        "displayName": "",
        "enabled": true,
        "eventType": "GKE_CLUSTER_UPDATE",
        "filter": "resource.labels.cluster_name=my-cluster",
        "resourceNames": []
      }
    ]
  },
  "dashboardFilters": [],
  "mosaicLayout": {
  ...
  },
  "labels": {}
}

No exemplo anterior, o campo filter é usado para restringir a consulta ao cluster my-name. O campo displayName é definido como uma string vazia. Assim, o nome padrão do tipo de evento é mostrado na alternância do evento. Por fim, como o resourceNames está definido como uma matriz vazia, as entradas de registro no seu Google Cloud projeto atual são consultadas.

Adicionar filtros e variáveis do painel

Para controlar quais dados os widgets em um painel mostram, adicione variáveis e filtros fixados. As variáveis diferem dos filtros fixados porque se aplicam a widgets específicos.

Se você criar um filtro ou uma variável fixada, o Monitoring vai atualizar a barra de ferramentas do painel personalizado para mostrar um filtro. Para filtros fixados, o nome do filtro da barra de ferramentas é o nome do filtro fixado. Para variáveis, o nome do filtro da barra de ferramentas é um cifrão $ seguido pelo nome da variável. Cada filtro da barra de ferramentas tem um menu que permite mudar o valor do filtro fixado ou da variável associada. Para variáveis, você pode substituir o filtro da barra de ferramentas por um widget do painel. Para saber mais, consulte Painel com um widget FilterControl.

Para mais informações sobre variáveis e filtros fixados, e para saber como aplicar uma variável a um widget, consulte Filtros do painel.

Adicionar rótulos ao painel

Este exemplo mostra um objeto Dashboard que especifica o rótulo chamado playbook.

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

Como ilustra o exemplo anterior, o campo labels é implementado como um map, em que os campos key e value são strings. Ao adicionar um rótulo a um painel, defina o key como o nome do rótulo e o campo value como uma string vazia.

A adição de rótulos a um painel é opcional.

Painéis com Widgets

Esta seção inclui exemplos de painéis que contêm diferentes tipos de widgets.

Painel com um XyChart

Este painel mostra um painel com um simples XyChart. Se você já usou o console do Google Cloud para criar gráficos em painéis, esses gráficos são instâncias do widget XyChart.

Assim como na funcionalidade fornecida no console Google Cloud , a API oferece opções para mudar o PlotType do gráfico ou configurar os modos de visualização.

{
  "dashboardFilters": [],
  "displayName": "Example line chart",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 16,
        "widget": {
          "title": "VM Instance - CPU utilization [MEAN]",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "plotType": "LINE",
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "crossSeriesReducer": "REDUCE_MEAN",
                      "groupByFields": [
                        "resource.label.\"zone\""
                      ],
                      "perSeriesAligner": "ALIGN_MEAN"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" resource.type=\"gce_instance\""
                  }
                }
              }
            ],
            "thresholds": [],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        },
        "width": 24
      }
    ]
  }
}

O gráfico no painel é semelhante ao exemplo a seguir:

Exemplo de um XyChart.

A próxima seção ilustra como criar um widget de gráfico da Análise de dados de registros, como mostrar um limite em um gráfico e como configurar se o gráfico usa o eixo Y esquerdo, o direito ou ambos.

Painel com um gráfico da Análise de dados de registros

Este painel mostra um painel com um gráfico da Análise de dados de registros. O exemplo de JSON contém uma consulta SQL.

{
  "displayName": "Example",
  "dashboardFilters": [],
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "width": 24,
        "height": 16,
        "widget": {
          "title": "Sample analytics chart",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "breakdowns": [],
                "dimensions": [
                  {
                    "column": "location",
                    "columnType": "STRING",
                    "maxBinCount": 5,
                    "sortColumn": "location",
                    "sortOrder": "SORT_ORDER_ASCENDING"
                  }
                ],
                "measures": [
                  {
                    "aggregationFunction": {
                      "parameters": [],
                      "type": "count"
                    },
                    "column": ""
                  }
                ],
                "plotType": "STACKED_BAR",
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "opsAnalyticsQuery": {
                    "queryHandle": "",
                    "sql": "SELECT\n  CAST(JSON_VALUE(resource.labels.location) AS STRING) AS location,\n  severity,\nFROM\n  `VIEW`"
                  }
                }
              }
            ],
            "thresholds": [],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        }
      }
    ]
  },
  "labels": {}
}

O gráfico no painel é semelhante ao exemplo a seguir:

Exemplo de XyChart com uma consulta SQL da Análise de dados de registros.

Painel com um XyChart e um limite

Este painel mostra um painel com um XyChart básico, um limite e o eixo Y esquerdo configurado.

{
  "dashboardFilters": [],
  "displayName": "Example line with threshold",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 16,
        "widget": {
          "title": "VM Instance - CPU utilization [MEAN]",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "plotType": "LINE",
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "crossSeriesReducer": "REDUCE_MEAN",
                      "groupByFields": [
                        "resource.label.\"zone\""
                      ],
                      "perSeriesAligner": "ALIGN_MEAN"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" resource.type=\"gce_instance\""
                  }
                }
              }
            ],
            "thresholds": [
              {
                "label": "",
                "targetAxis": "Y1",
                "value": 0.2
              }
            ],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        },
        "width": 24
      }
    ]
  }
}

No exemplo anterior, o JSON especifica o uso do eixo Y esquerdo porque ele contém uma estrutura y2Axis. No campo targetAxis, use "Y1" para o eixo Y direito e "Y2" para o eixo Y esquerdo. Se você omitir o campo targetAxis, o eixo Y à direita será usado.

O gráfico nesse painel é semelhante ao exemplo a seguir:

Exemplo de XyChart que usa o eixo Y esquerdo e tem um limite.

É possível criar gráficos que mostram vários tipos de métricas e usam os eixos esquerdo e direito. O exemplo anterior ilustrou um gráfico com um único tipo de métrica, ou seja, há um elemento na matriz dataSets. Ao criar um gráfico com dois tipos de métricas, a matriz dataSets contém dois elementos, e cada um especifica seu targetAxis.

Painel com um XyChart com um STACKED_AREA PlotType

Este painel mostra um XyChart com um STACKED_AREA PlotType.

{
  "dashboardFilters": [],
  "displayName": "Example stacked area",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 16,
        "widget": {
          "title": "VM Instance - CPU utilization [MEAN]",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "plotType": "STACKED_AREA",
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "crossSeriesReducer": "REDUCE_MEAN",
                      "groupByFields": [
                        "resource.label.\"zone\""
                      ],
                      "perSeriesAligner": "ALIGN_MEAN"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" resource.type=\"gce_instance\""
                  }
                }
              }
            ],
            "thresholds": [],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        },
        "width": 24
      }
    ]
  }
}

O gráfico no painel é semelhante ao exemplo a seguir:

Exemplo de XyChart com um gráfico de área empilhada

Painel com um XyChart com um STACKED_BAR PlotType

Este painel mostra um XyChart com um STACKED_BAR PlotType.

{
  "dashboardFilters": [],
  "displayName": "Example stacked bar",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 16,
        "widget": {
          "title": "VM Instance - CPU utilization [MEAN]",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "plotType": "STACKED_BAR",
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "crossSeriesReducer": "REDUCE_MEAN",
                      "groupByFields": [
                        "resource.label.\"zone\""
                      ],
                      "perSeriesAligner": "ALIGN_MEAN"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" resource.type=\"gce_instance\""
                  }
                }
              }
            ],
            "thresholds": [],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        },
        "width": 24
      }
    ]
  }
}

O painel é semelhante a este exemplo:

Exemplo de XyChart com um gráfico de colunas empilhadas

Painel com um Scorecard básico

Este painel mostra um Scorecard sem um medidor ou gráfico. O exemplo mostra a utilização da CPU do Compute Engine e a visão geral tem dois limites. Um limite usa a cor amarela para indicar que a utilização da CPU está acima de 70%, a outra usa vermelho para indicar que a utilização da CPU está acima de 90%.

Como a utilização atual da CPU é inferior aos limites especificados, a cor é verde.

{
  "dashboardFilters": [],
  "displayName": "Example-basic scorecard",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 8,
        "widget": {
          "scorecard": {
            "thresholds": [
              {
                "color": "YELLOW",
                "direction": "ABOVE",
                "label": "",
                "value": 0.7
              },
              {
                "color": "RED",
                "direction": "ABOVE",
                "label": "",
                "value": 0.9
              }
            ],
            "timeSeriesQuery": {
              "outputFullDuration": true,
              "timeSeriesFilter": {
                "aggregation": {
                  "alignmentPeriod": "60s",
                  "crossSeriesReducer": "REDUCE_MEAN",
                  "groupByFields": [],
                  "perSeriesAligner": "ALIGN_MEAN"
                },
                "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" resource.type=\"gce_instance\""
              }
            }
          },
          "title": "VM Instance - CPU utilization [MEAN]"
        },
        "width": 16
      }
    ]
  }
}

O painel é semelhante a este exemplo:

Exemplo de painel com um widget de visão geral

Painel com Scorecard com GaugeView

Este painel adiciona um medidor à visão geral básica no exemplo anterior. O objeto GaugeView pode especificar um limite superior e um inferior para definir o intervalo de valores a ser exibido no medidor. Como a visão geral mostra valores de 0 a 1, esses limites superior e inferior são razoáveis. Para adicionar o medidor, adicione o seguinte ao JSON para a visão geral básica:

  "gaugeView": {
    "lowerBound": 0,
    "upperBound": 1,
  },

Veja a seguir a especificação completa do painel modificado: o valor atual está abaixo dos limites, que são coloridos adequadamente no medidor.

{
  "dashboardFilters": [],
  "displayName": "Example-Gauge",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 8,
        "widget": {
          "scorecard": {
            "gaugeView": {
              "lowerBound": 0,
              "upperBound": 1
            },
            "thresholds": [
              {
                "color": "YELLOW",
                "direction": "ABOVE",
                "label": "",
                "value": 0.7
              },
              {
                "color": "RED",
                "direction": "ABOVE",
                "label": "",
                "value": 0.9
              }
            ],
            "timeSeriesQuery": {
              "outputFullDuration": true,
              "timeSeriesFilter": {
                "aggregation": {
                  "alignmentPeriod": "60s",
                  "crossSeriesReducer": "REDUCE_MEAN",
                  "groupByFields": [],
                  "perSeriesAligner": "ALIGN_MEAN"
                },
                "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" resource.type=\"gce_instance\""
              }
            }
          },
          "title": "VM Instance - CPU utilization [MEAN]"
        },
        "width": 16
      }
    ]
  }
}

O gráfico nesse painel é semelhante ao exemplo a seguir:

Exemplo de painel com um widget de visão geral com o GaugeView

Painel com Scorecard com SparkChartView

Esse painel substitui o medidor no exemplo anterior por um minigráfico. O objeto SparkChartView pode criar gráficos de linhas ou de barras em uma visão geral. Este exemplo usa uma linha. Se o valor não violar um limite, ele ficará verde. Para adicionar o gráfico, substitua o objeto JSON gaugeView no gráfico anterior pelo seguinte:

  "sparkChartView": {
    "sparkChartType": "SPARK_LINE"
  },

O quadro de pontuação é semelhante a este exemplo:

Exemplo de painel com um widget de visão geral com o GaugeView

Painel com um widget PieChart

Os painéis podem mostrar dados usando um gráfico de pizza. Cada série temporal contribui com uma fatia do gráfico. Os gráficos de pizza não mostram dados ao longo do tempo, apenas o valor mais recente.

Todos os gráficos de pizza são especificados pelo widget PieChart. Para configurar o gráfico para mostrar a soma das medições mais recentes, defina o campo chartType como DONUT. Caso contrário, defina esse campo como o valor de PIE.

"pieChart": {
  "chartType": "DONUT",
},

O exemplo a seguir configura um painel com dois gráficos de pizza, sendo um deles configurado como um gráfico de rosca:

{
  "dashboardFilters": [],
  "displayName": "Example Pie Donut",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 16,
        "widget": {
          "pieChart": {
            "chartType": "DONUT",
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_RATE"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/disk/read_bytes_count\" resource.type=\"gce_instance\"",
                    "secondaryAggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_MEAN"
                    }
                  }
                }
              }
            ]
          },
          "title": "VM Instance - Disk read bytes [MEAN]"
        },
        "width": 24
      },
      {
        "height": 16,
        "widget": {
          "pieChart": {
            "chartType": "PIE",
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_RATE"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/disk/read_bytes_count\" resource.type=\"gce_instance\"",
                    "secondaryAggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_MEAN"
                    }
                  }
                }
              }
            ]
          },
          "title": "VM Instance - Disk read bytes [MEAN]"
        },
        "width": 24,
        "xPos": 24
      },
    ]
  }
}

Conforme mostrado na captura de tela a seguir, os dois widgets mostram dados como um gráfico de pizza, com um widget exibindo a soma dos valores mais recentes:

Exemplo de widgets **PieChart**.

Painel com um widget Treemap

Para conferir os dados mais recentes como uma série de retângulos aninhados, em que cada retângulo corresponde a uma coleção exclusiva de valores de rótulo, adicione um mapa de árvore. Suponha que você tenha agregado os dados que está representando no gráfico pelo rótulo zone. Se você definir o tipo de widget como mapa de árvore, cada retângulo no mapa vai corresponder a uma zona. A saturação de cor de um retângulo é proporcional ao valor que ele representa.

Ao analisar um mapa de árvore, use o ponteiro para ativar a dica de ferramenta do retângulo.

O JSON a seguir configura um widget Treemap que agrega a série temporal por zona e tipo de armazenamento:

{
  "displayName": "Example Treemap",
  "dashboardFilters": [],
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "xPos": 24,
        "height": 16,
        "width": 24,
        "widget": {
          "title": "VM Instance - Write read bytes [SUM]",
          "id": "",
          "treemap": {
            "dataSets": [
              {
                "breakdowns": [],
                "measures": [],
                "timeSeriesQuery": {
                  "outputFullDuration": true,
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "crossSeriesReducer": "REDUCE_SUM",
                      "groupByFields": [
                        "resource.label.\"zone\"",
                        "metric.label.\"storage_type\""
                      ],
                      "perSeriesAligner": "ALIGN_RATE"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/disk/write_bytes_count\" resource.type=\"gce_instance\""
                  },
                  "unitOverride": ""
                }
              }
            ],
            "treemapHierarchy": [
              "resource.label.\"zone\"",
              "metric.label.\"storage_type\""
            ]
          }
        }
      }
    ]
  }
}

A captura de tela a seguir mostra o widget de mapa de árvore com a configuração anterior:

Exemplo de um widget de **mapa de árvore**.

Na captura de tela, a dica é mostrada para um retângulo.

Painel com um widget TimeSeriesTable

Os painéis podem mostrar dados em formato tabular, em que há uma linha para cada combinação de valores de rótulo exclusivos. As tabelas não mostram dados ao longo do tempo. Em vez disso, elas mostram o valor mais recente ou um valor agregado.

Todas as tabelas são especificadas pelo widget TimeSeriesTable:

  • Para configurar a série temporal a ser mostrada, use o campo dataSets. Cada objeto na matriz dataSets corresponde a um único tipo de métrica. Se você consultar vários tipos de métricas, o console Google Cloud tentará mostrar o valor mais recente de cada consulta na mesma linha da tabela. Para mais informações, consulte Como as tabelas combinam dados de vários tipos de métricas.

    • O campo TimeSeriesQuery especifica o tipo de métrica.
    • Se você quiser que a tabela mostre o valor agregado, em que os dados são agregados no valor do período definido pelo painel, defina o campo timeSeriesQuery.outputFullDuration como true.
  • Para configurar o número máximo de linhas a serem mostradas, defina o campo pickTimeSeriesFilter. Por exemplo, para mostrar apenas as duas séries temporais com o maior valor médio nos últimos 10 minutos, inclua o seguinte:

    "pickTimeSeriesFilter": {
        "direction": "TOP",
        "numTimeSeries": 2,
        "rankingMethod": "METHOD_MEAN"
    },
    

    Se você omitir o campo pickTimeSeriesFilter, a tabela vai mostrar no máximo 300 linhas.

  • Para configurar como a tabela mostra os dados, use o campo metricVisualization:

    • Para mostrar apenas um valor como "25%", omita esse campo ou defina o valor como "NUMBER". Quando você usa essa configuração, o consoleGoogle Cloud mostra o widget como um widget de tabela.
    • Para mostrar o valor e um indicador visual dele em comparação com o intervalo de valores possíveis, defina o valor desse campo como "BAR". Quando você usa essa configuração, o consoleGoogle Cloud mostra o widget como uma lista dos mais assistidos.
  • Para configurar quais colunas são mostradas e as propriedades delas, use a matriz columnSettings. Se esse campo não for especificado, a tabela vai mostrar uma coluna para cada rótulo.

    O valor do campo "column" precisa ser definido como a chave do rótulo ou como value, que se refere ao valor mais recente da série temporal. É possível definir o nome de exibição de uma coluna e configurar o alinhamento dos dados na célula da tabela:

    • Para personalizar o cabeçalho da coluna, defina o campo displayName.
    • Para colorir a célula que mostra o valor mais recente com base em como ele se compara a um limite, adicione um objeto thresholds.
    • Para mudar o alinhamento do texto, adicione um campo alignment.

    O exemplo a seguir ilustra duas colunas:

    "columnSettings": [
      {
        "column": "device_name",
        "displayName": "Device",
        "visible": true
      },
      {
        "alignment": "CENTER",
        "column": "value",
        "displayName": "Disk Write Bytes",
        "thresholds": [
          {
            "color": "YELLOW",
            "direction": "ABOVE",
            "value": 4000
          },
          {
            "color": "RED",
            "direction": "ABOVE",
            "value": 5000
          }
        ],
        "visible": true
      }
    ],
    

O JSON a seguir descreve um painel com duas tabelas. A primeira tabela mostra dois tipos de métricas: o número de bytes lidos das instâncias e o número de bytes gravados nas instâncias. Um valor agregado é mostrado junto com uma barra de referência. A segunda tabela mostra o valor mais recente de um tipo de métrica, e a coluna de valor foi configurada para codificar por cores a célula com base em como o valor se compara a um limite:

{
  "displayName": "Example",
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "width": 44,
        "height": 17,
        "widget": {
          "title": "VM Instance - Disk read bytes [RATE], Disk write bytes [RATE]",
          "timeSeriesTable": {
            "dataSets": [
              {
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "filter": "metric.type=\"compute.googleapis.com/instance/disk/read_bytes_count\" resource.type=\"gce_instance\"",
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_RATE",
                      "groupByFields": []
                    },
                    "pickTimeSeriesFilter": {
                      "rankingMethod": "METHOD_MEAN",
                      "numTimeSeries": 30,
                      "direction": "TOP"
                    }
                  },
                  "unitOverride": "",
                  "outputFullDuration": true
                },
                "tableTemplate": "",
                "minAlignmentPeriod": "60s"
              },
              {
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "filter": "metric.type=\"compute.googleapis.com/instance/disk/write_bytes_count\" resource.type=\"gce_instance\"",
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_RATE",
                      "groupByFields": []
                    },
                    "pickTimeSeriesFilter": {
                      "rankingMethod": "METHOD_MEAN",
                      "numTimeSeries": 30,
                      "direction": "TOP"
                    }
                  },
                  "unitOverride": "",
                  "outputFullDuration": true
                },
                "tableTemplate": "",
                "minAlignmentPeriod": "60s"
              }
            ],
            "metricVisualization": "BAR",
            "columnSettings": [
              {
                "column": "Name (from instance_id)",
                "visible": true
              },
              {
                "column": "zone",
                "visible": true
              },
              {
                "column": "device_name",
                "visible": true
              },
              {
                "column": "storage_type",
                "visible": true
              },
              {
                "column": "device_type",
                "visible": true
              },
              {
                "column": "value",
                "visible": true,
                "displayName": "Read bytes"
              },
              {
                "column": "value-1",
                "visible": true,
                "displayName": "Written bytes"
              }
            ],
            "opsAnalyticsSettings": {
              "maxRows": "0",
              "showFilterBar": false,
              "pageSize": "0"
            },
            "displayColumnType": false
          },
          "id": ""
        }
      },
      {
        "yPos": 17,
        "width": 44,
        "height": 16,
        "widget": {
          "title": "VM Instance - Disk write bytes [RATE]",
          "timeSeriesTable": {
            "columnSettings": [
              {
                "column": "device_name",
                "displayName": "Device",
                "visible": true
              },
              {
                "alignment": "LEFT",
                "column": "instance_name",
                "displayName": "Instance name",
                "visible": true
              },
              {
                "column": "storage_type",
                "displayName": "Storage type",
                "visible": true
              },
              {
                "column": "device_type",
                "displayName": "Device Type",
                "visible": true
              },
              {
                "alignment": "CENTER",
                "column": "value",
                "displayName": "Disk Write Bytes",
                "thresholds": [
                  {
                    "color": "YELLOW",
                    "direction": "ABOVE",
                    "label": "",
                    "value": 4000
                  },
                  {
                    "color": "RED",
                    "direction": "ABOVE",
                    "label": "",
                    "value": 5000
                  }
                ],
                "visible": true
              },
              {
                "alignment": "LEFT",
                "column": "Name (from instance_id)",
                "displayName": "ID",
                "visible": true
              }
            ],
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_RATE"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/disk/write_bytes_count\" resource.type=\"gce_instance\""
                  }
                }
              }
            ],
            "displayColumnType": false,
            "metricVisualization": "NUMBER",
            "opsAnalyticsSettings": {
              "maxRows": "0",
              "pageSize": "0",
              "showFilterBar": false
            }
          }
        }
      }
    ]
  },
  "dashboardFilters": [],
  "labels": {}
}

A captura de tela a seguir ilustra a tabela definida anteriormente:

Exemplo de painel com um widget de tabela.

Painel com um widget Text

Este exemplo mostra um painel simples com um widget Text.

{
  "dashboardFilters": [],
  "displayName": "DB2+TE",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
    ...
      {
        "height": 16,
        "widget": {
          "text": {
            "content": "# Support information\n\n\nContact information: my-support-team@example.com\nOnline help: [Playbooks](https://example.com)\n\n",
            "format": "MARKDOWN",
            "style": {
              "backgroundColor": "",
              "fontSize": "FS_LARGE",
              "horizontalAlignment": "H_LEFT",
              "padding": "P_EXTRA_SMALL",
              "textColor": "",
              "verticalAlignment": "V_TOP"
            }
          }
        },
        "width": 24,
        "yPos": 14
      }
    ]
  }
}

O widget de texto é semelhante ao exemplo a seguir:

Exemplo de um widget de texto.

Painel com um widget AlertChart

Este painel mostra um painel com um widget AlertChart:

{
  "category": "CUSTOM",
  "displayName": "Alerting policy chart example",
  "mosaicLayout": {
    "columns": 12,
    "tiles": [
      {
        "height": 4,
        "widget": {
          "alertChart": {
            "name": "projects/my-project/alertPolicies/14205854094151528373"
          }
        },
        "width": 6,
      }
    ]
  }
}

Diferentemente de outros widgets do painel, não é possível especificar um título ou um filtro de métrica para esses widgets. Em vez disso, especifique o nome do recurso para uma política de alertas. A última entrada no campo name é o identificador da política de alertas.

O gráfico no painel é semelhante ao exemplo a seguir:

Exemplo de um gráfico para uma política de alertas.

Neste exemplo, a política de alertas está monitorando o uso da CPU de duas máquinas virtuais diferentes. A linha tracejada mostra o limite de condição, que é definido como 50%. O ícone verde com o rótulo No incidents indica que não há incidentes abertos para a política de alertas. Se você colocar o ponteiro no ícone de incidentes, uma caixa de diálogo será aberta com links para a política de alertas subjacente.

Painel com um widget ErrorReportingPanel

Este painel mostra um painel com um widget ErrorReportingPanel:

{
  "dashboardFilters": [],
  "displayName": "Error reporting widget",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 16,
        "widget": {
          "errorReportingPanel": {
            "projectNames": [
              "projects/my-project"
            ],
            "services": [],
            "versions": []
          },
          "title": "Error Reporting Panel"
        },
        "width": 24,
      }
    ]
  }
}

Recomendamos que você configure a altura de um painel de relatórios de erros para que seja de pelo menos 16 unidades e a largura de pelo menos 24 unidades. No exemplo anterior, o widget tem uma altura de 16 unidades e uma largura de 24 unidades.

O painel de relatórios de erros mostra os grupos de erros do projeto selecionado e pode restringir esses grupos a um tipo de recurso, serviço ou versão específica de um serviço. O exemplo a seguir ilustra um painel de relatórios de erros:

Exemplo de um painel de configuração do painel de relatórios de erros.

Painel com um widget FilterControl

Se você criar uma variável, o Monitoring vai atualizar a barra de ferramentas do painel personalizado para mostrar um filtro para a variável. O nome do filtro é um cifrão $ seguido pelo nome da variável. Por exemplo, $my-variable. Cada filtro tem um menu que permite mudar o valor da variável.

Gerenciar o valor de uma variável usando um filtro da barra de ferramentas pode não ser o ideal. Por exemplo, suponha que você tenha um painel com muitos gráficos e uma variável que se aplica a apenas dois deles. Nesse cenário, você pode fazer o seguinte:

  1. Adicione um widget CollapsibleGroup ao painel e coloque os dois gráficos no grupo.
  2. Adicione um widget FilterControl ao painel. Você configura esse widget para a variável e o adiciona ao grupo.

    O widget de grupo contém o widget FilterControl, que permite mudar o valor da variável, e os widgets a que a variável se aplica. Além disso, a barra de ferramentas do painel não mostra mais um filtro para a variável.

O painel a seguir contém um widget FilterControl:

{
  "displayName": "Dashboard with filter control widget",
  "dashboardFilters": [
    {
      "filterType": "RESOURCE_LABEL",
      "labelKey": "project_id",
      "stringValue": "my-project",
      "templateVariable": "proj",
      "valueType": "STRING"
    }
  ],
  "description": "",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "yPos": 70,
        "height": 5,
        "width": 16,
        "widget": {
          "title": "Project control",
          "filterControl": {
            "templateVariable": "proj"
          }
        }
      }
    ]
  }
}

O exemplo anterior define uma variável, proj, e adiciona um widget FilterControl. Com essa configuração, o menu da variável é movido da barra de ferramentas do painel para o widget com o título Project control. Esse widget contém um menu que pode ser usado para selecionar o projeto.

Painel com um widget IncidentList

Este painel mostra um painel com um widget IncidentList:

{
  "category": "CUSTOM",
  "dashboardFilters": [],
  "displayName": "Incident widget",
  "labels": {},
  "mosaicLayout": {
    "columns": 12,
    "tiles": [
      {
        "height": 5,
        "widget": {
          "incidentList": {
            "monitoredResources": [],
            "policyNames": []
          },
          "title": "Incidents"
        },
        "width": 8,
        "xPos": 0,
        "yPos": 0
      }
    ]
  }
}

O exemplo anterior define o campo title como Incidents e configura o widget para mostrar todos os incidentes de recursos do tipo gce_instance. Ao configurar esse widget, é possível selecionar várias políticas de alertas ou vários tipos de recursos.

O widget de incidente no painel é semelhante ao exemplo a seguir:

Exemplo de um widget de incidente.

Painel com um widget LogsPanel

Este painel mostra um painel com um widget: LogsPanel.

{
  "category": "CUSTOM",
  "displayName": "Logs Panel",
  "mosaicLayout": {
    "columns": 12,
    "tiles": [
      {
        "height": 4,
        "widget": {
          "logsPanel": {
            "filter": "",
            "resourceNames": [
              "projects/012012012012"
            ]
          },
          "title": "Logs Panel"
        },
        "width": 6,
        "xPos": 0,
        "yPos": 0
      }
    ]
  }
}

Recomendamos que você configure a altura de um painel de registros para que seja de pelo menos três unidades e a largura de pelo menos quatro unidades. No exemplo anterior, o widget tem uma altura de quatro unidades e uma largura de seis unidades.

O painel de registros exibe os registros dos projetos Google Cloud listados no campo resourceNames. O exemplo anterior especifica apenas um projeto. No entanto, é possível incluir vários projetos nessa lista.

O painel de registros é semelhante ao exemplo a seguir:

Exemplo de painel com um widget de painel de registros.

Para informações sobre solução de problemas, consulte A chamada de API para criar um painel com um painel de registros falha.

Painel com um widget CollapsibleGroup

Este painel mostra um painel com um widget: CollapsibleGroup.

{
  "category": "CUSTOM",
  "displayName": "Group testing",
  "mosaicLayout": {
    "columns": 12,
    "tiles": [
      {
        "height": 4,
        "widget": {
          "collapsibleGroup": {
            "collapsed": false
          },
          "title": "My group"
        },
        "width": 12,
        "xPos": 0,
        "yPos": 0
      },
      {
        "height": 4,
        "widget": {
          "title": "VM Instance - CPU utilization [MEAN]",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "plotType": "LINE",
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "apiSource": "DEFAULT_CLOUD",
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "crossSeriesReducer": "REDUCE_NONE",
                      "perSeriesAligner": "ALIGN_MEAN"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" resource.type=\"gce_instance\"",
                    "secondaryAggregation": {
                      "alignmentPeriod": "60s",
                      "crossSeriesReducer": "REDUCE_NONE",
                      "perSeriesAligner": "ALIGN_NONE"
                    }
                  }
                }
              }
            ],
            "thresholds": [],
            "timeshiftDuration": "0s",
            "yAxis": {
              "label": "y1Axis",
              "scale": "LINEAR"
            }
          }
        },
        "width": 6,
        "xPos": 0,
        "yPos": 0
      }
    ]
  }
}

No exemplo anterior, o widget de grupo recolhível contém um único gráfico que mostra o uso da CPU de uma instância de VM. Os widgets de grupo recolhível abrangem uma linha inteira de uma tabela. Um widget é incluído em um grupo quando as especificações de posição (x,y) e altura do grupo incluem a posição (x,y) do widget. No exemplo anterior, o grupo está na posição (0,0) e tem uma altura de 4. O xyChart está na posição (0,0), então ele está incluído no grupo. No entanto, se a posição desse gráfico for alterada para (0,5), ele será excluído do grupo. Por fim, quando a posição (x,y) de um widget faz com que ele seja incluído no grupo, a altura do widget do grupo recolhível pode ser aumentada.

Para incluir um widget de grupo em um painel, ele precisa ter um MosaicLayout.

O widget de grupo recolhível é semelhante ao exemplo a seguir:

Exemplo de painel com um widget de grupo recolhível.

Painel com um widget SingleViewGroup

Um widget SingleViewGroup mostra um participante de um grupo por vez. Você especifica os gráficos e outros widgets que são membros do grupo. Além disso, você controla qual widget no grupo é exibido usando um menu no widget SingleViewGroup.

O widget SingleViewGroup é compatível com dois estilos de exibição, DROPDOWN e TAB. A diferença entre esses dois estilos é como você seleciona qual membro do grupo mostrar. Os widgets com um estilo DROPDOWN fornecem um menu. Os widgets com um estilo TAB fornecem guias na barra de ferramentas do widget:

{
  "dashboardFilters": [],
  "displayName": "Example",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 16,
        "widget": {
          "singleViewGroup": {
            "displayType": "DROPDOWN"
          },
          "title": "Untitled group"
        },
        "width": 24,
        "yPos": 16
      },
      {
        "height": 16,
        "widget": {
          "title": "VM Instance - Disk read bytes [RATE]",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "plotType": "LINE",
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_RATE"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/disk/read_bytes_count\" resource.type=\"gce_instance\""
                  }
                }
              }
            ],
            "thresholds": [],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        },
        "width": 24,
        "yPos": 16
      },
      {
        "height": 16,
        "widget": {
          "title": "VM Instance - Disk write bytes [RATE]",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "plotType": "LINE",
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_RATE"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/disk/write_bytes_count\" resource.type=\"gce_instance\""
                  }
                }
              }
            ],
            "thresholds": [],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        },
        "width": 24,
        "yPos": 16
      }
    ]
  }
}

Como mostrado no exemplo anterior, a matriz tiles contém um objeto SingleViewGroup. No entanto, esse objeto não especifica quais objetos ele contém. Em vez disso, a assinatura ao objeto SingleViewGroup é determinada pelos valores dos campos width e yPos. Os objetos cujos valores para os campos width e yPos correspondem aos valores do objeto SingleViewGroup são contidos pelo objeto SingleViewGroup. No exemplo anterior, o objeto SingleViewGroup contém dois gráficos.

Painel com um widget SectionHeader

Um widget SectionHeader cria um divisor horizontal no painel e uma entrada na tabela de conteúdo dele. É possível personalizar a entrada no sumário e incluir mais informações no widget. Também é possível configurar o widget para adicionar um divisor ao sumário após a entrada do cabeçalho da seção.

Este painel mostra um painel com um único gráfico e um widget SectionHeader:

{
  "dashboardFilters": [],
  "displayName": "Example",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 16,
        "widget": {
          "title": "VM Instance - Disk write bytes [RATE]",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "plotType": "LINE",
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_RATE"
                    },
                    "filter": "metric.type=\"compute.googleapis.com/instance/disk/write_bytes_count\" resource.type=\"gce_instance\""
                  }
                }
              }
            ],
            "thresholds": [],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        },
        "width": 24,
        "yPos": 4
      },
      {
        "height": 4,
        "widget": {
          "sectionHeader": {
            "dividerBelow": true,
            "subtitle": "Instance metrics"
          },
          "title": "Metrics"
        },
        "width": 48
      }
    ]
  }
}

No objeto SectionHeader, o valor do campo title é mostrado no widget e no sumário. O valor do campo subtitle é mostrado apenas pelo widget. Quando o valor de dividerBelow é true, um divisor é adicionado ao sumário.

Painel com um widget de SLO

Este painel mostra um painel com um widget de SLO:

{
  "dashboardFilters": [],
  "displayName": "Example",
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "height": 16,
        "widget": {
          "title": "SLO Error Budget: 99.5% - Distribution Cut - Calendar month",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "breakdowns": [],
                "dimensions": [],
                "legendTemplate": "Remaining error requests before SLO is burned",
                "measures": [],
                "plotType": "LINE",
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "perSeriesAligner": "ALIGN_NEXT_OLDER"
                    },
                    "filter": "select_slo_budget(\"projects/Project_Number/services/SERVICE_ID/serviceLevelObjectives/SLO_ID\")",
                  },
                  "unitOverride": "1"
                }
              }
            ],
            "thresholds": []
          }
        },
        "width": 24
      }
    ]
  }
}

Como o JSON anterior mostra, os gráficos de SLO são representados como objetos XyChart. Esses objetos especificam todos os campos de agregação, os limites e o valor do campo filter é um seletor de série temporal. Para mais informações sobre esses seletores, consulte Como recuperar dados de SLO.

O widget de SLO é semelhante ao exemplo a seguir:

Exemplo de painel com um widget de SLO.

Painel com um widget em branco

Este exemplo mostra um painel com um widget de marcador de posição vazio. O valor do campo displayName aparece no widget.

{
  "displayName": "Demo Dashboard",
  "gridLayout": {
    "widgets": [
      {
        "blank": {}
      }
    ]
  }
}

O painel é semelhante a este exemplo:

Exemplo de painel com um widget em branco

Painel com visibilidade de widget configurada

Este painel contém um widget de texto e uma variável. O valor da variável determina se o widget de texto é exibido ou oculto:

  • A variável chamada show tem um valor padrão de a. Os valores da variável são definidos como a, b e c. Como o campo valueType é STRING_ARRAY, a variável também pode ser definida como valores como a or b.

  • No widget de texto, a entrada visibilityCondition define a visibilidade do widget. Quando o valor da variável show inclui b, o widget de texto é mostrado. Caso contrário, o widget de texto não será exibido.


{
  "displayName": "Conditional Widget Example",
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "yPos": 16,
        "width": 24,
        "height": 16,
        "widget": {
          "title": "A text widget",
          "text": {
            "content": "Example showing how to use a custom variable to control visibility.",
            "format": "MARKDOWN",
            "style": {
              "backgroundColor": "#FFFFFF",
              "fontSize": "FS_LARGE",
              "horizontalAlignment": "H_LEFT",
              "padding": "P_EXTRA_SMALL",
              "pointerLocation": "POINTER_LOCATION_UNSPECIFIED",
              "textColor": "#212121",
              "verticalAlignment": "V_TOP"
            }
          },
          "visibilityCondition": {
            "templateVariableCondition": {
              "templateVariable": "show",
              "templateVariableValue": "b",
              "comparator": "REGEX_FULL_MATCH"
            }
          }
        }
      }
    ]
  },
  "dashboardFilters": [
    {
      "labelKey": "",
      "templateVariable": "show",
      "stringArrayValue": {
        "values": [
          "a"
        ]
      },
      "filterType": "VALUE_ONLY",
      "valueType": "STRING_ARRAY",
      "stringArray": {
        "values": [
          "a",
          "b",
          "c"
        ]
      }
    }
  ],
  "labels": {}
}

Para restrições relacionadas à configuração da visibilidade de um widget, consulte Definir a visibilidade de um widget.