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:
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:
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:
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:
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. Quandotrue
, o botão está na posiçãoon
e os eventos são apresentados no painel de controlo. Quandofalse
, o botão está na posiçãooff
. - Um campo
eventType
, que contém um valor da enumeraçãoEventType
. - 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.
- Um campo
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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 matrizdataSets
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
comotrue
.
- O campo
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 apresentar apenas um valor como "25%", omita este campo ou defina o valor como
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 comovalue
, 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 } ],
- Para personalizar o cabeçalho da coluna, defina o campo
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:
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:
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:
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:
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:
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:
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:
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:
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:
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 dea
. Os valores da variável são definidos comoa
,b
ec
. Uma vez que o campovalueType
éSTRING_ARRAY
, a variável também pode ser definida para valores comoa or b
.No widget de texto, a entrada etiquetada como
visibilityCondition
define a visibilidade do widget. Quando o valor da variávelshow
incluib
, 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.