Exemplos de painéis de controlo e esquemas

Esta página ilustra como pode criar painéis de controlo através da API Cloud Monitoring. Para cada exemplo, são apresentadas a definição do painel de controlo em JSON e o painel de controlo correspondente. Pode fornecer JSON à CLI gcloud e aos pontos finais da API Cloud Monitoring.

O Cloud Monitoring também fornece um conjunto organizado de definições de painéis de controlo no GitHub. Pode instalar estas definições no seu projeto do Google Cloud como painéis de controlo personalizados. Para ver informações sobre este repositório e como instalar estes painéis de controlo, consulte o artigo Instale painéis de controlo de amostra.

Quando usar a API ou a Google Cloud CLI

A API Cloud Monitoring e a CLI Google Cloud oferecem-lhe uma forma de gerir vários painéis de controlo em simultâneo. Embora possa usar a Google Cloud consola para gerir os seus painéis de controlo, pode ser mais fácil usar scripts que gerem os seus painéis de controlo personalizados em massa.

Também tem de usar a API quando quiser adicionar o widget de marcador de posição em branco ao seu painel de controlo.

Usar MQL ou PromQL com a API

Crie painéis de controlo com o método dashboards.create. Transmite ao método da API um objeto Dashboard, que contém uma entrada para cada widget que o painel de controlo apresenta.

Quando um widget apresenta dados de intervalos temporais, como um widget de gráfico, a respetiva entrada no objeto Dashboard contém um objeto TimeSeriesQuery. Este objeto descreve os dados de série cronológica a representar num gráfico e especifica esses dados através de um filtro de monitorização, uma consulta MQL ou uma consulta PromQL:

  • Para usar filtros de monitorização, 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 o artigo Criar gráficos.

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

Esquemas do painel de controlo

Esta secção contém informações sobre os diferentes esquemas de painéis de controlo disponíveis.

Painel de controlo em GridLayout

Este painel de controlo 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 de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de painel de controlo com um esquema de grelha.

Painel de controlo em MosaicLayout

Este painel de controlo 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 de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de painel de controlo com um esquema de mosaico.

Painel de controlo em RowLayout

Este painel de controlo apresenta 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 de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de painel de controlo com um esquema de linhas.

Painel de controlo em ColumnLayout

Este painel de controlo apresenta 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 de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de painel de controlo com esquema de colunas

Ative os eventos do painel de controlo e adicione filtros e etiquetas

Esta secção descreve como pode adicionar filtros e etiquetas a um painel de controlo, e como pode configurar um painel de controlo para mostrar eventos.

Ative eventos nos painéis de controlo

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

  • O campo defaultResourceName apresenta as predefinições ao nível do painel de controlo para os Google Cloud projetos nos quais pesquisar eventos. Se não especificar este campo, é feita uma pesquisa no projeto selecionado.

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

    • Um campo displayName, que lhe permite definir a etiqueta no botão de ativação/desativação específico do evento. Quando este campo não é especificado ou quando o valor deste campo é uma string vazia, é apresentado o nome predefinido do evento.
    • Um campo enabled, que controla o valor do botão do evento. Quando true, o botão está na posição on e os eventos são apresentados no painel de controlo. 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 lhe permite especificar uma consulta a anexar à consulta específica do evento. Quando o valor deste campo é uma string vazia, é usada a consulta específica do evento.
    • Um campo resourceNames, que lhe permite definir uma lista de Google Cloud projetos nos quais pesquisar eventos. Quando este campo é uma matriz vazia, é feita uma pesquisa no projeto selecionado.

O exemplo seguinte 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 está definido como uma string vazia, pelo que o nome predefinido do tipo de evento é apresentado no botão do evento. Por fim, uma vez que o resourceNames está definido como uma matriz vazia, são consultadas as entradas do registo no seu Google Cloud projeto atual.

Adicione filtros e variáveis do painel de controlo

Para controlar os dados que os widgets num painel de controlo apresentam, pode adicionar variáveis e filtros fixados. Para mais informações e um exemplo, consulte o artigo Filtros do painel de controlo.

Adicione etiquetas de painéis de controlo

Este exemplo mostra um objeto Dashboard que especifica a etiqueta com o nome playbook.

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

Conforme ilustrado no exemplo anterior, o campo labels é implementado como um map, em que os campos key e value são ambos strings. Quando adiciona uma etiqueta a um painel de controlo, defina o elemento key com o nome da etiqueta e defina o campo value como uma string vazia.

A adição de etiquetas a um painel de controlo é opcional.

Painéis de controlo com Widgets

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

Painel de controlo com um XyChart

Este painel de controlo mostra um painel de controlo com um XyChart básico. Se já usou a consola para criar gráficos em painéis de controlo, esses gráficos são instâncias do widget XyChart. Google Cloud

Semelhante à funcionalidade disponibilizada na Google Cloud consola, a API oferece opções para alterar o PlotType do gráfico ou para configurar os modos de visualização do gráfico.

{
  "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 de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de um XyChart.

A secção seguinte ilustra como criar um widget de gráfico do Log Analytics, como apresentar um limite num gráfico e como configurar se o gráfico usa o eixo Y esquerdo, o eixo Y direito ou ambos.

Painel de controlo com um gráfico do Log Analytics

Este painel de controlo mostra um painel de controlo com um gráfico do Log Analytics. O JSON de exemplo 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 de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de XyChart com uma consulta SQL do Log Analytics.

Painel de controlo com um XyChart e um limite

Este painel de controlo mostra um painel de controlo com um gráfico de linhas básico XyChart, 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 a utilização do eixo Y esquerdo porque contém uma estrutura y2Axis. No campo targetAxis, use "Y1" para o eixo Y direito e "Y2" para o eixo Y esquerdo. Se omitir o campo targetAxis, é usado o eixo Y direito.

O gráfico neste painel de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de um gráfico XY que usa o eixo Y esquerdo e tem um limite.

Pode criar gráficos que apresentam vários tipos de métricas e que usam os eixos esquerdo e direito. O exemplo anterior ilustrou um gráfico com um único tipo de métrica, ou seja, existe um elemento na matriz dataSets. Quando representa dois tipos de métricas num gráfico, a matriz dataSets contém dois elementos e cada elemento especifica o respetivo targetAxis.

Painel de controlo com um XyChart com um STACKED_AREA PlotType

Este painel de controlo 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 de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de um gráfico XyChart com um gráfico de áreas sobrepostas.

Painel de controlo com um gráfico XY com um STACKED_BAR PlotType

Este painel de controlo 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 de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de XyChart com um gráfico de barras sobrepostas.

Painel de controlo com um Scorecard básico

Este painel de controlo mostra um Scorecard sem um indicador ou um gráfico de linhas. O exemplo mostra a utilização da CPU do Compute Engine e a tabela de dados tem dois limites. Um limite usa a cor amarela para indicar que a utilização da CPU é superior a 70%. O outro limite usa a cor vermelha para indicar que a utilização da CPU é superior a 90%.

Uma vez que 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 de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de painel de controlo com um widget de tabela de dados.

Painel de controlo com um Scorecard com GaugeView

Este painel de controlo adiciona um indicador à tabela de dados básica no exemplo anterior. O objeto GaugeView pode especificar um limite superior e um limite inferior para especificar o intervalo de valores a apresentar no indicador. Uma vez que a tabela de dados mostra valores de 0 a 1, esses limites superior e inferior são razoáveis. Para adicionar o indicador, adicione o seguinte ao JSON da tabela de dados básica:

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

A imagem seguinte mostra a especificação completa do painel de controlo modificado: O valor atual está abaixo dos limites, que estão coloridos de forma adequada no indicador.

{
  "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 neste painel de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de painel de controlo com um widget de tabela de dados com GaugeView.

Painel de controlo com um Scorecard com SparkChartView

Este painel de controlo substitui o indicador no exemplo anterior por uma minigráfico. O objeto SparkChartView pode criar gráficos de linhas ou gráficos de barras numa tabela de dados. Este exemplo usa uma linha. Desde que o valor não viole um limite, é apresentado a verde. Para adicionar o gráfico de linhas, substitua o objeto JSON gaugeView no gráfico anterior pelo seguinte:

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

A tabela de dados tem um aspeto semelhante ao seguinte exemplo:

Exemplo de painel de controlo com um widget de tabela de dados com SparkChartView.

Painel de controlo com um widget PieChart

Os painéis de controlo podem apresentar dados através de um gráfico circular. Cada série cronológica contribui com um segmento para o gráfico circular. Os gráficos circulares não mostram dados ao longo do tempo. Em alternativa, mostram apenas o valor mais recente.

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

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

O exemplo seguinte configura um painel de controlo com dois gráficos circulares, com um gráfico circular configurado como um donut:

{
  "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 ecrã seguinte, ambos os widgets apresentam dados como um gráfico circular, com um widget a apresentar a soma dos valores mais recentes:

Exemplo de widgets **PieChart**.

Painel de controlo com um widget Treemap

Para ver os dados mais recentes como uma série de retângulos aninhados, em que cada retângulo corresponde a uma recolha única de valores de etiquetas, adicione um mapa de árvore. Suponha que agregou os dados que está a representar graficamente pela etiqueta zone. Se definir o tipo de widget como mapa de árvore, cada retângulo no mapa de árvore corresponde a uma zona. A saturação de cor de um retângulo é proporcional ao valor que representa.

Ao explorar um mapa hierárquico, use o ponteiro para ativar a sugestão para o retângulo.

O JSON seguinte configura um widget Treemap que agrega a série cronológica 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 ecrã seguinte mostra o widget de mapa hierárquico com a configuração anterior:

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

Na captura de ecrã, a sugestão é apresentada para um retângulo.

Painel de controlo com um widget TimeSeriesTable

Os painéis de controlo podem apresentar dados num formato de tabela, em que existe uma linha para cada combinação de valores de etiquetas únicos. As tabelas não mostram dados ao longo do tempo. Em vez disso, mostram o valor mais recente ou um valor agregado.

Todas as tabelas são especificadas pelo widget TimeSeriesTable:

  • Para configurar a série cronológica a apresentar, use o campo dataSets. Cada objeto na matriz dataSets corresponde a um único tipo de métrica. Se consultar vários tipos de métricas, a Google Cloud consola tenta apresentar o valor mais recente de cada consulta na mesma linha da tabela. Para mais informações, consulte o artigo Como as tabelas unem dados de vários tipos de métricas.

    • O campo TimeSeriesQuery especifica o tipo de métrica.
    • Se quiser que a tabela apresente o valor agregado, em que os dados são agregados ao longo do valor do intervalo de tempo definido pelo painel de controlo, defina o campo timeSeriesQuery.outputFullDuration como true.
  • Para configurar o número máximo de linhas a apresentar, defina o campo pickTimeSeriesFilter. Por exemplo, para apresentar apenas as duas séries cronológicas com o maior valor médio nos 10 minutos anteriores, inclua o seguinte:

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

    Se omitir o campo pickTimeSeriesFilter, a tabela apresenta um máximo de 300 linhas.

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

    • Para apresentar apenas um valor como "25%", omita este campo ou defina o valor como "NUMBER". Quando usa esta configuração, a Google Cloud consola apresenta o widget como um widget de tabela.
    • Para apresentar o valor e um indicador visual do valor em comparação com o intervalo de valores possíveis, defina o valor deste campo como "BAR". Quando usa esta configuração, a Google Cloud consola apresenta o widget como um widget de Lista principal.
  • Para configurar as colunas apresentadas e as propriedades da coluna, use a matriz columnSettings. Se este campo não for especificado, a tabela apresenta uma coluna para cada etiqueta.

    O valor do campo "column" tem de ser definido como a chave da etiqueta ou como value, que se refere ao valor mais recente da série cronológica. Pode definir o nome a apresentar 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 apresenta o valor mais recente com base na forma como o valor se compara a um limite, adicione um objeto thresholds.
    • Para alterar o alinhamento do texto, adicione um campo alignment.

    O exemplo seguinte 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 seguinte descreve um painel de controlo com duas tabelas. A primeira tabela apresenta dois tipos de métricas: o número de bytes lidos das instâncias e o número de bytes escritos nas instâncias. É apresentado um valor agregado juntamente 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 na comparação do valor com 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 ecrã seguinte ilustra a tabela definida anteriormente:

Exemplo de painel de controlo com um widget de tabela.

Painel de controlo com um widget Text

Este exemplo mostra um painel de controlo 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 tem um aspeto semelhante ao seguinte exemplo:

Exemplo de um widget de texto.

Painel de controlo com um widget AlertChart

Este painel de controlo mostra um painel de controlo 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,
      }
    ]
  }
}

Ao contrário de outros widgets do painel de controlo, não especifica um título nem um filtro de métricas para estes widgets. Em alternativa, especifica o nome do recurso para uma política de alerta. A última entrada no campo name é o identificador da política de alerta.

O gráfico no painel de controlo tem um aspeto semelhante ao seguinte exemplo:

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

Neste exemplo, a política de alertas está a monitorizar a utilização da CPU de duas máquinas virtuais diferentes. A linha tracejada mostra o limite da condição, que está definido como 50%. O chip verde com a etiqueta No incidents indica que não existem incidentes abertos para a política de alertas. Se colocar o ponteiro no chip de incidentes, é aberta uma caixa de diálogo que inclui um link para a política de alertas subjacente.

Painel de controlo com um widget ErrorReportingPanel

Este painel de controlo mostra um painel de controlo 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 configure a altura de um painel de relatórios de erros para, pelo menos, 16 unidades e a largura para, 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 apresenta os grupos de erros do projeto selecionado, e este painel pode restringir os grupos de erros a um tipo de recurso, um serviço ou uma versão de um serviço específicos. O exemplo seguinte ilustra um painel de comunicação de erros:

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

Painel de controlo com um widget IncidentList

Este painel de controlo mostra um painel de controlo 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 apresentar todos os incidentes para recursos do tipo gce_instance. Quando configura este widget, pode selecionar várias políticas de alerta ou vários tipos de recursos.

O widget de incidentes no painel de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de um widget de incidente.

Painel de controlo com um widget LogsPanel

Este painel de controlo mostra um painel de controlo com um widget de 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 configure a altura de um painel de registos para, pelo menos, 3 unidades e a largura para, pelo menos, 4 unidades. No exemplo anterior, o widget tem uma altura de 4 unidades e uma largura de 6 unidades.

O painel de registos apresenta os registos dos Google Cloud projetos indicados no campo resourceNames. O exemplo anterior especifica apenas um projeto; no entanto, pode incluir vários projetos nesta lista.

O painel de registos tem um aspeto semelhante ao seguinte exemplo:

Exemplo de painel de controlo com um widget de painel de registos.

Para obter informações de resolução de problemas, consulte o artigo A chamada da API para criar um painel de controlo com um painel de registos falha.

Painel de controlo com um widget CollapsibleGroup

Este painel de controlo mostra um painel de controlo com um widget de 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 redutível contém um único gráfico que apresenta a utilização da CPU de uma instância de VM. Os widgets de grupos redutíveis abrangem uma linha inteira de uma tabela. Um widget é incluído num grupo quando as especificações de altura e posição (x,y) do grupo incluem a posição (x,y) do widget. No exemplo anterior, o grupo está na posição (0,0) e a respetiva altura é 4. O xyChart está na posição (0,0), pelo que está incluído no grupo. No entanto, se a posição desse gráfico for alterada para (0,5), o gráfico é excluído do grupo. Por último, quando a posição (x,y) de um widget faz com que o widget seja incluído no grupo, a altura do widget do grupo redutível pode ser expandida.

Para incluir um widget de grupo num painel de controlo, o painel de controlo tem de ter um MosaicLayout.

O widget de grupo redutível tem um aspeto semelhante ao seguinte exemplo:

Exemplo de painel de controlo com um widget de grupo redutível.

Painel de controlo com um widget SingleViewGroup

Um widget SingleViewGroup apresenta um membro de um grupo de cada vez. Especifica os gráficos e outros widgets que são membros no grupo. Além disso, controla que widget no grupo é apresentado através de um menu no widget SingleViewGroup.

O widget SingleViewGroup suporta dois estilos de apresentação: DROPDOWN e TAB. A diferença entre estes dois estilos reside na forma como seleciona o membro do grupo a apresentar. Os widgets com um estilo DROPDOWN oferecem um menu. Os widgets com um estilo TAB oferecem separadores 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
      }
    ]
  }
}

Conforme mostrado no exemplo anterior, a matriz tiles contém um objeto SingleViewGroup; no entanto, esse objeto não especifica os objetos que contém. Em alternativa, a associação ao objeto SingleViewGroup é determinada pelos valores dos campos width e yPos. Os objetos cujos valores dos campos width e yPos correspondem aos valores do objeto SingleViewGroup estão contidos no objeto SingleViewGroup. No exemplo anterior, o objeto SingleViewGroup contém dois gráficos.

Painel de controlo com um widget SectionHeader

Um widget SectionHeader cria um separador horizontal no painel de controlo e cria uma entrada na tabela de conteúdo do painel de controlo. Pode personalizar a entrada na tabela de conteúdos e incluir informações adicionais no widget. Também pode configurar o widget para adicionar um separador ao índice após a entrada do cabeçalho da secção.

Este painel de controlo mostra um painel de controlo 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 é apresentado no widget e na tabela de conteúdos. O valor do campo subtitle só é apresentado pelo widget. Quando o valor de dividerBelow é true, é adicionado um separador ao índice.

Painel de controlo com um widget de SLO

Este painel de controlo mostra um painel de controlo 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
      }
    ]
  }
}

Conforme o JSON anterior mostra, os gráficos de SLO são representados como objetos XyChart. Estes objetos especificam todos os campos de agregação, os limites e o valor do campo filter é um seletor de séries cronológicas. Para mais informações acerca destes seletores, consulte o artigo Obter dados de SLO.

O widget de SLO tem um aspeto semelhante ao seguinte exemplo:

Exemplo de painel de controlo com um widget de SLO.

Painel de controlo com um widget em branco

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

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

O painel de controlo tem um aspeto semelhante ao seguinte exemplo:

Exemplo de painel de controlo com um widget em branco.

Painel de controlo com a visibilidade dos widgets configurada

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

  • A variável denominada show tem um valor predefinido de a. Os valores da variável são definidos como a, b e c. Uma vez que o campo valueType é STRING_ARRAY, a variável também pode ser definida para valores como a or b.

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


{
  "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 ver restrições relacionadas com a configuração da visibilidade de um widget, consulte o artigo Defina a visibilidade de um widget.