Diseños y paneles de control de ejemplo

En esta página se explica cómo crear paneles con la API Cloud Monitoring. En cada ejemplo, se muestra la definición del panel de control en JSON y el panel de control correspondiente. Puedes proporcionar JSON tanto a la CLI de Google Cloud como a los endpoints de la API Cloud Monitoring.

Cloud Monitoring también proporciona un conjunto de definiciones de paneles de control en GitHub. Puedes instalar estas definiciones en tu Google Cloud proyecto como paneles de control personalizados. Para obtener información sobre este repositorio y cómo instalar estos paneles de control, consulta el artículo Instalar paneles de control de ejemplo.

Cuándo usar la API o Google Cloud CLI

La API Cloud Monitoring y la CLI de Google Cloud te permiten gestionar muchos paneles de control a la vez. Aunque puedes usar la consola Google Cloud para gestionar tus paneles de control, puede que te resulte más fácil usar secuencias de comandos que gestionen tus paneles de control personalizados en bloque.

También debe usar la API si quiere añadir el widget de marcador de posición en blanco a su panel de control.

Usar MQL o PromQL con la API

Para crear paneles de control, usa el método dashboards.create. Transfiere al método de la API un objeto Dashboard, que contiene una entrada por cada widget que muestra el panel de control.

Cuando un widget muestra datos de series temporales, como un widget de gráfico, su entrada en el objeto Dashboard contiene un objeto TimeSeriesQuery. Este objeto describe los datos de series temporales que se van a representar en un gráfico. Para especificar esos datos, puedes usar un filtro de Monitoring, una consulta de MQL o una consulta de PromQL:

  • Para usar los filtros de Monitoring, rellena el campo timeSeriesField. En los ejemplos de esta página se usan filtros de Cloud Monitoring.

  • Para usar una consulta de MQL, rellena el campo timeSeriesQueryLanguage. Para obtener más información, consulta Crear gráficos.

  • Para usar una consulta de PromQL, rellena el campo prometheusQuery. Para obtener información general, consulta PromQL en Cloud Monitoring.

Diseños de panel de control

Esta sección contiene información sobre los diferentes diseños de panel de control disponibles.

Panel de control en GridLayout

En este panel de control se muestra un GridLayout con tres 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"
          }
        }
      }
    ]
  }
}

El panel de control es similar al siguiente ejemplo:

Panel de control de ejemplo con un diseño de cuadrícula.

Panel de control en MosaicLayout

En este panel de control se muestra un MosaicLayout con dos 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"
            }
          }
        }
      }
    ]
  }
}

El panel de control es similar al siguiente ejemplo:

Panel de control de ejemplo con un diseño en mosaico.

Panel de control en RowLayout

En este panel de control se muestra un RowLayout con tres 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"
            }
          }
        ]
      }
    ]
  }
}

El panel de control es similar al siguiente ejemplo:

Panel de control de ejemplo con un diseño de fila.

Panel de control en ColumnLayout

En este panel de control se muestra un ColumnLayout con tres 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"
            }
          }
        ]
      }
    ]
  }
}

El panel de control es similar al siguiente ejemplo:

Panel de control de ejemplo con diseño de columnas

Habilitar eventos del panel de control y añadir filtros y etiquetas

En esta sección se describe cómo puede añadir filtros y etiquetas a un panel de control, así como configurarlo para que muestre eventos.

Habilitar eventos en los paneles de control

Puedes configurar un panel de control para mostrar eventos, como un evento de actualización de Google Kubernetes Engine o un evento de fallo de una máquina virtual, incluyendo un campo annotations en el objeto Dashboard. El campo annotations contiene una instancia de un objeto DashboardAnnotations, que contiene dos campos:

  • En el campo defaultResourceName se muestran los valores predeterminados a nivel de panel de control de losGoogle Cloud proyectos en los que se buscarán eventos. Si no especifica este campo, se buscará en el proyecto seleccionado.

  • Matriz de objetos EventAnnotation. Cada objeto contiene lo siguiente:

    • Un campo displayName, que te permite definir la etiqueta del interruptor específico del evento. Si no se especifica este campo o si su valor es una cadena vacía, se muestra el nombre predeterminado del evento.
    • Un campo enabled que controla el valor del interruptor del evento. Cuando true, el interruptor está en la posición on y los eventos se muestran en el panel de control. Cuando false, el interruptor está en la posición off.
    • Campo eventType que contiene un valor de la enumeración EventType.
    • Un campo filter, que te permite especificar una consulta que se añadirá a la consulta específica del evento. Si el valor de este campo es una cadena vacía, se usará la consulta específica del evento.
    • Un campo resourceNames, que le permite definir una lista de proyectos en los que buscar eventos.Google Cloud Si este campo es un array vacío, se buscará en el proyecto seleccionado.

En el siguiente ejemplo se muestra un campo annotations que especifica un evento de 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": {}
}

En el ejemplo anterior, el campo filter se usa para restringir la consulta al clúster my-name. El campo displayName se ha definido como una cadena vacía, por lo que el nombre predeterminado del tipo de evento se muestra en el interruptor del evento. Por último, como resourceNames se ha definido como una matriz vacía, se consultan las entradas de registro de tu proyecto Google Cloud actual.

Añadir filtros y variables a un panel de control

Para controlar qué datos muestran los widgets de un panel de control, puedes añadir variables y filtros fijados. Para obtener más información y un ejemplo, consulta Filtros de panel de control.

Añadir etiquetas de panel de control

En este ejemplo se muestra un objeto Dashboard que especifica la etiqueta playbook.

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

Como se muestra en el ejemplo anterior, el campo labels se implementa como map, donde los campos key y value son cadenas. Cuando añadas una etiqueta a un panel de control, asigna el valor key al nombre de la etiqueta y el valor value a una cadena vacía.

Añadir etiquetas a un panel de control es opcional.

Paneles de control con Widgets

En esta sección se incluyen ejemplos de paneles de control que contienen diferentes tipos de widgets.

Panel de control con un XyChart

Este panel de control muestra un panel de control con un XyChart básico. Si alguna vez has usado la consola Google Cloud para crear gráficos en paneles de control, esos gráficos son instancias del widget XyChart.

Al igual que la función que ofrece la consola Google Cloud , la API proporciona opciones para cambiar el PlotType del gráfico o para configurar sus modos de visualización.

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

El gráfico del panel de control es similar al siguiente ejemplo:

Ejemplo de un gráfico de dispersión.

En la siguiente sección se explica cómo crear un widget de gráfico de Log Analytics, cómo mostrar un umbral en un gráfico y cómo configurar si el gráfico usa el eje Y izquierdo, el eje Y derecho o ambos.

Panel de control con un gráfico de Analíticas de registros

En este panel de control se muestra un gráfico de Analíticas de Registros. El JSON de ejemplo contiene una consulta de 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  `TABLE_NAME_OF_LOG_VIEW`"
                  }
                }
              }
            ],
            "thresholds": [],
            "yAxis": {
              "label": "",
              "scale": "LINEAR"
            }
          }
        }
      }
    ]
  },
  "labels": {}
}

El gráfico del panel de control es similar al siguiente ejemplo:

Ejemplo de XyChart con una consulta de SQL de Analíticas de registros.

Panel de control con un XyChart y un umbral

En este panel de control se muestra un gráfico de líneas básico XyChart, un umbral y el eje Y izquierdo 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
      }
    ]
  }
}

En el ejemplo anterior, el archivo JSON especifica el uso del eje Y de la izquierda porque contiene una estructura y2Axis. En el campo targetAxis, usa "Y1" para el eje Y de la derecha e "Y2" para el eje Y de la izquierda. Si omite el campo targetAxis, se usará el eje Y de la derecha.

El gráfico de este panel de control es similar al siguiente ejemplo:

Ejemplo de gráfico Xy que usa el eje Y izquierdo y tiene un umbral.

Puedes crear gráficos que muestren varios tipos de métricas y que usen los ejes izquierdo y derecho. En el ejemplo anterior se muestra un gráfico con un solo tipo de métrica, es decir, hay un elemento en la matriz dataSets. Cuando representa dos tipos de métricas en un gráfico, el array dataSets contiene dos elementos y cada elemento especifica su targetAxis.

Panel de control con un XyChart y un STACKED_AREA PlotType

En este panel de control se muestra un XyChart con un 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
      }
    ]
  }
}

El gráfico del panel de control es similar al siguiente ejemplo:

Ejemplo de XyChart con un gráfico de áreas apiladas.

Panel de control con un gráfico X e Y con un STACKED_BAR PlotType

En este panel de control se muestra un XyChart con un 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
      }
    ]
  }
}

El panel de control es similar al siguiente ejemplo:

Ejemplo de XyChart con un gráfico de barras apiladas.

Panel de control con un Scorecard básico

En este panel de control se muestra un Scorecard sin un gráfico de indicador ni de líneas. En el ejemplo se muestra el uso de la CPU de Compute Engine y la tarjeta de resultados tiene dos umbrales. Un umbral usa el color amarillo para indicar que la utilización de la CPU supera el 70%, mientras que el otro usa el rojo para indicar que la utilización de la CPU supera el 90%.

Como el uso actual de la CPU es inferior a los umbrales especificados, el color es 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
      }
    ]
  }
}

El panel de control es similar al siguiente ejemplo:

Panel de ejemplo con un widget de cuadro de resultados.

Panel de control con un Scorecard con GaugeView

En este panel de control se añade un gráfico de indicador a la tarjeta de resultados básica del ejemplo anterior. El objeto GaugeView puede especificar un límite superior e inferior para indicar el intervalo de valores que se mostrará en el indicador. Como el cuadro de resultados muestra valores del 0 al 1, esos límites superior e inferior son razonables. Para añadir el gráfico de indicador, añade lo siguiente al JSON de la tarjeta de resultados básica:

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

A continuación, se muestra la especificación completa del panel de control modificado: El valor actual está por debajo de los umbrales, que se muestran con el color correspondiente en el 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
      }
    ]
  }
}

El gráfico de este panel de control es similar al siguiente ejemplo:

Panel de ejemplo con un widget de tarjeta de resultados con GaugeView.

Panel de control con un Scorecard con SparkChartView

Este panel de control sustituye el gráfico de ejemplo anterior por un gráfico de líneas. El objeto SparkChartView puede crear gráficos de líneas o de barras en una tarjeta de resultados. En este ejemplo se usa una línea. Si el valor no supera un umbral, se muestra en verde. Para añadir el minigráfico, sustituye el objeto JSON gaugeView del gráfico anterior por el siguiente:

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

La tarjeta de resultados es similar al siguiente ejemplo:

Ejemplo de panel de control con un widget de cuadro de resultados con SparkChartView.

Panel de control con un widget de PieChart

Los paneles de control pueden mostrar datos mediante un gráfico circular. Cada serie temporal aporta una porción al gráfico circular. Los gráficos circulares no muestran datos a lo largo del tiempo, sino solo el valor más reciente.

Todos los gráficos circulares se especifican mediante el widget PieChart. Para configurar el gráfico de forma que muestre la suma de las mediciones más recientes, defina el campo chartType como DONUT. De lo contrario, asigna a este campo el valor de PIE.

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

En el siguiente ejemplo se configura un panel de control con dos gráficos circulares, uno de ellos configurado como gráfico de anillo:

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

Como se muestra en la siguiente captura de pantalla, ambos widgets muestran los datos en un gráfico circular. Uno de ellos muestra la suma de los valores más recientes:

Ejemplo de widgets **Gráfico circular**.

Panel de control con un widget de Treemap

Para ver los datos más recientes como una serie de rectángulos anidados, donde cada rectángulo corresponde a una colección única de valores de etiquetas, añada un gráfico de rectángulos. Supongamos que ha agregado los datos que va a representar en un gráfico por la etiqueta zone. Si asignas el tipo de widget de mapa de árbol, cada rectángulo del mapa de árbol corresponderá a una zona. La saturación del color de un rectángulo es proporcional al valor que representa.

Cuando explores un gráfico de rectángulos, usa el puntero para activar la descripción emergente del rectángulo.

El siguiente JSON configura un widget Treemap que agrega las series temporales por zona y tipo de almacenamiento:

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

En la siguiente captura de pantalla se muestra el widget de mapa de árbol con la configuración anterior:

Ejemplo de un widget de **gráfico de rectángulos**.

En la captura de pantalla, se muestra la descripción emergente de un rectángulo.

Panel de control con un widget de TimeSeriesTable

Los paneles de control pueden mostrar datos en formato de tabla, donde hay una fila por cada combinación de valores de etiqueta únicos. Las tablas no muestran datos a lo largo del tiempo, sino el valor más reciente o un valor agregado.

Todas las tablas se especifican mediante el widget TimeSeriesTable:

  • Para configurar la serie temporal que se va a mostrar, usa el campo dataSets. Cada objeto de la matriz dataSets corresponde a un solo tipo de métrica. Si consulta varios tipos de métricas, la consola Google Cloud intenta mostrar el valor más reciente de cada consulta en la misma fila de la tabla. Para obtener más información, consulta Cómo combinan las tablas los datos de varios tipos de métricas.

    • El campo TimeSeriesQuery especifica el tipo de métrica.
    • Si quiere que la tabla muestre el valor agregado, donde los datos se agregan en el intervalo de tiempo definido en su panel de control, asigne el valor true al campo timeSeriesQuery.outputFullDuration.
  • Para configurar el número máximo de filas que se mostrarán, defina el campo pickTimeSeriesFilter. Por ejemplo, para mostrar solo las dos series temporales con el valor medio más alto de los últimos 10 minutos, incluya lo siguiente:

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

    Si omite el campo pickTimeSeriesFilter, la tabla mostrará un máximo de 300 filas.

  • Para configurar cómo muestra la tabla los datos, usa el campo metricVisualization:

    • Para mostrar solo un valor, como "25%", omita este campo o asigne el valor "NUMBER". Cuando usas esta configuración, la consola muestra el widget como un widget de Tabla.Google Cloud
    • Para mostrar el valor y un indicador visual del valor en comparación con el intervalo de valores posibles, asigna el valor "BAR" a este campo. Cuando usas esta configuración, la consola muestra el widget como un widget de Lista superior.Google Cloud
  • Para configurar las columnas que se muestran y las propiedades de la columna, usa la matriz columnSettings. Si no se especifica este campo, la tabla muestra una columna por cada etiqueta.

    El valor del campo "column" debe ser la clave de la etiqueta o value, que hace referencia al valor más reciente de la serie temporal. Puedes definir el nombre visible de una columna y configurar la alineación de los datos en la celda de la tabla:

    • Para personalizar el encabezado de la columna, define el campo displayName.
    • Para colorear la celda que muestra el valor más reciente en función de cómo se compara el valor con un umbral, añade un objeto thresholds.
    • Para cambiar la alineación del texto, añade un campo alignment.

    En el siguiente ejemplo se muestran dos columnas:

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

El siguiente JSON describe un panel de control con dos tablas. En la primera tabla se muestran dos tipos de métricas: el número de bytes leídos de las instancias y el número de bytes escritos en las instancias. Se muestra un valor agregado junto con una barra de referencia. La segunda tabla muestra el valor más reciente de un tipo de métrica y la columna de valores se ha configurado para asignar un código de color a la celda en función de cómo se compara el valor con un umbral:

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

En la siguiente captura de pantalla se muestra la tabla definida anteriormente:

Ejemplo de panel de control con un widget de tabla.

Panel de control con un widget de Text

En este ejemplo se muestra un panel de control con un 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
      }
    ]
  }
}

El widget de texto tiene un aspecto similar al del siguiente ejemplo:

Ejemplo de un widget de texto.

Panel de control con un widget de AlertChart

En este panel de control se muestra un panel con un 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,
      }
    ]
  }
}

A diferencia de otros widgets de panel de control, no se especifica ningún título ni filtro de métricas para estos widgets. En su lugar, especifica el nombre del recurso de una política de alertas. La última entrada del campo name es el identificador de la política de alertas.

El gráfico del panel de control es similar al siguiente ejemplo:

Ejemplo de un gráfico de una política de alertas.

En este ejemplo, la política de alertas monitoriza el uso de CPU de dos máquinas virtuales diferentes. La línea discontinua muestra el umbral de la condición, que es del 50%. El chip verde con la etiqueta No incidents indica que no hay incidentes abiertos en la política de alertas. Si colocas el puntero sobre el chip de incidentes, se abrirá un cuadro de diálogo con un enlace a la política de alertas subyacente.

Panel de control con un widget de ErrorReportingPanel

En este panel de control se muestra un panel con un 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,
      }
    ]
  }
}

Te recomendamos que configures la altura de un panel de informes de errores en al menos 16 unidades y su anchura en al menos 24 unidades. En el ejemplo anterior, el widget tiene una altura de 16 unidades y una anchura de 24 unidades.

El panel de informes de errores muestra los grupos de errores del proyecto seleccionado y puede restringir los grupos de errores a un tipo de recurso, servicio o versión de un servicio específicos. En el siguiente ejemplo se muestra un panel de informes de errores:

Ejemplo de un panel de configuración de informes de errores.

Panel de control con un widget de IncidentList

En este panel de control se muestra un panel con un 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
      }
    ]
  }
}

En el ejemplo anterior, se asigna el valor Incidents al campo title y se configura el widget para que muestre todos los incidentes de los recursos de tipo gce_instance. Cuando configures este widget, podrás seleccionar varias políticas de alertas o varios tipos de recursos.

El widget de incidencias del panel de control tiene un aspecto similar al del siguiente ejemplo:

Ejemplo de un widget de incidencias.

Panel de control con un widget de LogsPanel

En este panel de control se muestra un panel con un widget LogsPanel:

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

Te recomendamos que configures la altura de un panel de registros en al menos 3 unidades y su anchura en al menos 4 unidades. En el ejemplo anterior, el widget tiene una altura de 4 unidades y una anchura de 6 unidades.

El panel de registros muestra los registros de los proyectos que aparecen en el campo Google Cloud resourceNames. En el ejemplo anterior solo se especifica un proyecto, pero puedes incluir varios en esta lista.

El panel de registros es similar al siguiente ejemplo:

Panel de control de ejemplo con un widget de panel de registros.

Para obtener información sobre cómo solucionar problemas, consulta Falla la llamada a la API para crear un panel de control con un panel de registros.

Panel de control con un widget de CollapsibleGroup

En este panel de control se muestra un panel con un widget CollapsibleGroup:

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

En el ejemplo anterior, el widget de grupo contraíble contiene un solo gráfico que muestra el uso de la CPU de una instancia de VM. Los widgets de grupo que se pueden ocultar abarcan toda una fila de una tabla. Un widget se incluye en un grupo cuando las especificaciones de posición (x,y) y altura del grupo incluyen la posición (x,y) del widget. En el ejemplo anterior, el grupo está en la posición (0,0) y su altura es 4. El xyChart está en la posición (0,0), por lo que se incluye en el grupo. Sin embargo, si la posición de ese gráfico cambia a (0,5), se excluirá del grupo. Por último, cuando la posición (x,y) de un widget hace que se incluya en el grupo, es posible que se amplíe la altura del widget del grupo contraíble.

Para incluir un widget de grupo en un panel de control, este debe tener un MosaicLayout.

El widget de grupo contraíble tiene un aspecto similar al siguiente ejemplo:

Ejemplo de panel de control con un widget de grupo contraíble.

Panel de control con un widget de SingleViewGroup

El widget SingleViewGroup muestra un miembro de un grupo a la vez. Especifica los gráficos y otros widgets que forman parte del grupo. Además, puedes controlar qué widget del grupo se muestra mediante un menú del widget SingleViewGroup.

El widget SingleViewGroup admite dos estilos de visualización: DROPDOWN y TAB. La diferencia entre estos dos estilos es la forma en que seleccionas qué miembro del grupo quieres mostrar. Los widgets con estilo DROPDOWN proporcionan un menú. Los widgets con estilo TAB proporcionan pestañas en la barra de herramientas del widget:

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

Como se muestra en el ejemplo anterior, la matriz tiles contiene un objeto SingleViewGroup, pero ese objeto no especifica qué objetos contiene. En su lugar, la pertenencia al objeto SingleViewGroup se determina mediante los valores de los campos width y yPos. Los objetos cuyos valores de los campos width y yPos coinciden con los valores del objeto SingleViewGroup están incluidos en el objeto SingleViewGroup. En el ejemplo anterior, el objeto SingleViewGroup contiene dos gráficos.

Panel de control con un widget de SectionHeader

Un widget SectionHeader crea un separador horizontal en el panel de control y una entrada en la tabla de contenido del panel. Puedes personalizar la entrada de la tabla de contenido e incluir información adicional en el widget. También puedes configurar el widget para añadir un separador a la tabla de contenido después de la entrada del encabezado de la sección.

En este panel de control se muestra un gráfico y un 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
      }
    ]
  }
}

En el objeto SectionHeader, el valor del campo title se muestra tanto en el widget como en la tabla de contenido. El widget es el único que muestra el valor del campo subtitle. Si el valor de dividerBelow es true, se añade un separador a la tabla de contenido.

Panel de control con un widget de SLO

En este panel de control se muestra un widget de SLO:

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

Como se muestra en el JSON anterior, los gráficos de SLO se representan como objetos XyChart. Estos objetos especifican todos los campos de agregación y los umbrales, y el valor del campo filter es un selector de serie temporal. Para obtener más información sobre estos selectores, consulta el artículo Recuperar datos de SLO.

El widget de SLO es similar al siguiente ejemplo:

Ejemplo de panel de control con un widget de SLO.

Panel de control con un widget en blanco

En este ejemplo se muestra un panel de control con un widget de marcador de posición vacío. El valor del campo displayName aparece en el widget.

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

El panel de control es similar al siguiente ejemplo:

Panel de ejemplo con un widget en blanco.

Panel de control con la visibilidad de los widgets configurada

Este panel de control contiene un widget de texto y una variable. El valor de la variable determina si el widget de texto se muestra u oculta:

  • La variable llamada show tiene el valor predeterminado a. Los valores de la variable se definen como a, b y c. Como el campo valueType es STRING_ARRAY, la variable también se puede definir con valores como a or b.

  • En el widget de texto, la entrada etiquetada como visibilityCondition define la visibilidad del widget. Si el valor de la variable show incluye b, se muestra el widget de texto. De lo contrario, el widget de texto no se mostrará.


{
  "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 las restricciones relacionadas con la configuración de la visibilidad de un widget, consulta Configurar la visibilidad de un widget.