En este documento se describe cómo gestionar servicios y objetivos de nivel de servicio (SLOs) mediante la API Cloud Monitoring.
Service Monitoring añade los siguientes recursos a la API Monitoring:
En este documento, nos referimos a estas adiciones en conjunto como la API SLO y se ilustran los usos principales. Para obtener una descripción general de las estructuras de la API SLO, consulta Estructuras de la API. El material de referencia completo se encuentra en API de Cloud Monitoring v3.
Puedes usar la API SLO para hacer lo siguiente:
Crear y gestionar servicios.
Crea objetivos de nivel de servicio basados en indicadores de nivel de servicio personalizados o predefinidos para cualquiera de tus servicios.
Identificadores válidos
Varios métodos de la API SLO usan identificadores de diferentes elementos, especialmente identificadores de proyectos y servicios. Estos IDs cumplen las siguientes reglas:
- Longitud: entre 1 y 63 caracteres
- Caracteres: solo letras minúsculas, números y guiones
- Carácter inicial: letra minúscula
- Carácter final: letra minúscula o número, pero no un guion
La expresión regular de estas reglas es la siguiente:
[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?
Ejemplos de uso de curl
En esta sección se describen las convenciones y la configuración que se usan para invocar la API SLO con la herramienta curl
. Si usas esta API a través de una biblioteca de cliente, puedes saltarte esta sección.
En los ejemplos de esta página se accede a la API SLO mediante la herramienta curl
para enviar solicitudes HTTP a endpoints REST. Usa la siguiente información sobre la autenticación y sobre cómo invocar curl
para definir las variables que se usan en las invocaciones.
Autenticación
Crea una variable de entorno para almacenar el ID del proyecto de cobertura de tu cobertura de métricas. En estos ejemplos se usa
PROJECT_ID
:PROJECT_ID=my-test-service
Autentícate en Google Cloud CLI:
gcloud auth login
Para no tener que especificar el ID de tu proyecto en cada comando, puedes definirlo como predeterminado mediante la CLI de gcloud:
gcloud config set project ${PROJECT_ID}
Crea un token de autorización y guárdalo en una variable de entorno. En estos ejemplos se llama a la variable
ACCESS_TOKEN
:ACCESS_TOKEN=`gcloud auth print-access-token`
Debes actualizar periódicamente el token de acceso. Si los comandos que funcionaban de repente informan de que no tienes autenticación, vuelve a emitir este comando.
Para verificar que has obtenido un token de acceso, muestra la variable
ACCESS_TOKEN
:echo ${ACCESS_TOKEN} ya29.GluiBj8o....
Invocando curl
Cada invocación de curl
incluye un conjunto de argumentos, seguido de la URL de un recurso de la API SLO. Los argumentos habituales incluyen los valores especificados por las variables de entorno PROJECT_ID
y ACCESS_TOKEN
.
También es posible que tengas que especificar otros argumentos, como el tipo de solicitud HTTP (por ejemplo, -X DELETE
). La solicitud predeterminada es GET
, por lo que no se especifica en los ejemplos.
Cada invocación de curl
tiene esta estructura general:
curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" <other_args> https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/<request>
Por ejemplo, para enumerar todos los servicios de tu proyecto, emite la siguiente solicitud GET
:
curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services
Esta solicitud devuelve una matriz de descripciones de servicios, con entradas como la siguiente, un servicio de carga de trabajo de GKE con el ID de servicio "my-test-service":
{ "services": [ { "name": "projects/PROJECT_NUMBER/services/my-test-service", "displayName": "My Test GKE Workload Service", "basicService": { "serviceType": "GKE_WORKLOAD", "serviceLabels": { "cluster_name": "workload-test", "location": "us-central1-c", "namespace_name": "kube-system", "project_id": "lesser-weevil", "top_level_controller_name": "gke-metrics-controller", "top_level_controller_type": "DaemonSet" } }, "gkeWorkload": { "projectId": "lesser-weevil", "location": "us-central1-c", "clusterName": "workload-test", "namespaceName": "kube-system", "topLevelControllerType": "DaemonSet", "topLevelControllerName": "gke-metrics-controller" }, "source": "USER", "telemetry": { "resourceName": "//container.googleapis.com/projects/PROJECT_ID/zones/us-central1-c/clusters/workload-test/k8s/namespaces/kube-system/apps/daemonsets/gke-metrics-controller" } }, ... ] }
Para ver la configuración que se ha usado para crear este servicio, consulta Crear un servicio. Ten en cuenta que la estructura gkeWorkload
de esta lista se deriva de la estructura basicService
utilizada para crear el servicio.
Consulta Service
para obtener más información sobre la estructura de un servicio.
Gestionar servicios
El recurso Service
actúa como elemento raíz para organizar tus servicios. Los aspectos de un servicio concreto, como sus SLOs, se organizan por el nombre del servicio. Se admiten los siguientes tipos de servicios:
- Servicio de App Engine:
APP_ENGINE
- Servicio de Cloud Endpoints:
CLOUD_ENDPOINTS
- Servicio de Istio canónico:
ISTIO_CANONICAL_SERVICE
- Servicio Istio del clúster:
CLUSTER_ISTIO
- Servicio de Cloud Run:
CLOUD_RUN
- Un conjunto de servicios basados en Google Kubernetes Engine:
- Servicio de GKE:
GKE_SERVICE
- Espacio de nombres de GKE:
GKE_NAMESPACE
- Carga de trabajo de GKE:
GKE_WORKLOAD
- Servicio de GKE:
- Servicios personalizados:
CUSTOM
Para obtener más información, consulta Tipos de servicios básicos o Tipos de servicios básicos de GKE.
Puede añadir SLOs a cualquier servicio de su proyecto mediante la API. En Gestionar SLOs se explican los comandos para manipular SLOs.
IDs de servicio
Cada servicio tiene un identificador completo llamado nombre de recurso. Este identificador se almacena en el campo name
de la descripción del servicio. Por ejemplo:
"name": "projects/PROJECT_NUMBER/services/PROJECT_ID-zone-us-central1-a-cloudrun-istio-system-cluster-local-gateway",
El nombre de recurso incluye un ID más corto del servicio, que es la parte del nombre de recurso que se encuentra después de la subcadena projects/PROJECT_NUMBER/services/
Si has creado tu propio servicio con el nombre de recurso
projects/PROJECT_NUMBER/services/my-test-service
, el ID de servicio es
my-test-service
.
Para que los ejemplos de curl
sean breves y precisos, se presupone que el ID de servicio se encuentra en la variable de entorno SERVICE_ID
, de modo que puedas hacer referencia a él varias veces.
Mostrar servicios
Para obtener información sobre todos los servicios de tu proyecto, invoca el método services.list
. Para obtener información sobre un servicio específico por su ID, utiliza el método services.get
:
Protocolo
Para obtener información sobre los servicios mediantecurl
, invoca el método services.list
o services.get
enviando una solicitud GET
a:
https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services
para enumerar todos los servicioshttps://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID
para obtener un servicio específico
Por ejemplo, la siguiente solicitud obtiene información sobre el servicio identificado por el valor almacenado en la variable de entorno SERVICE_ID
:
curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}
Crear un servicio
Para crear un servicio, debes especificar una representación del tipo de servicio y enviarla al método services.create
.
Puedes usar las estructuras de tipo de servicio que se describen en Tipos de servicio básicos y Tipos de servicio básicos de GKE.
Las estructuras varían, pero el proceso para llamar a la API es el mismo.
Debes especificar un nombre visible para el servicio y un campo basicService
que contenga la representación del servicio.
También puedes especificar el ID que quieres que tenga el servicio. En el siguiente ejemplo se muestra la creación de un servicio de carga de trabajo de {[gke_name_short}}:
Protocolo
Para crear el servicio mediante curl
, envía un mensaje POST
al punto final https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services
:
Si quieres proporcionar un ID para el servicio, crea una variable para el ID de servicio:
SERVICE_ID=my-test-service
Este valor se proporciona en el parámetro de consulta de la URL
service_id
.Crea una variable para almacenar el cuerpo de la solicitud que describe el servicio:
CREATE_SERVICE_POST_BODY=$(cat <<EOF { "displayName": "My Test GKE Workload Service", "basicService": { "serviceType": "GKE_WORKLOAD", "serviceLabels": { "cluster_name": "workload-test", "location": "us-central1-c", "namespace_name": "kube-system", "project_id": "PROJECT_ID", "top_level_controller_name": "gke-metrics-controller", "top_level_controller_type": "DaemonSet" } } } EOF )
Publica el cuerpo de la solicitud en el endpoint y especifica el ID de servicio como valor del parámetro de consulta
service_id
:curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" --header "Content-Type: application/json" -X POST -d "${CREATE_SERVICE_POST_BODY}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services?service_id=${SERVICE_ID}
Para ver ejemplos de las estructuras asociadas a otros servicios, consulta Tipos de servicios básicos o Tipos de servicios básicos de GKE.
Eliminar un servicio
Para eliminar un servicio que hayas creado, invoca el método services.delete
y especifica el ID del servicio.
Protocolo
Para eliminar un servicio mediantecurl
, envía una solicitud DELETE
al punto de conexión https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID
:
curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" -X DELETE https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}
Gestionar objetivos de nivel de servicio
Puedes crear, eliminar y recuperar SLOs mediante la API SLO. Puedes tener hasta 500 SLOs por servicio.
Para gestionar los SLOs de un servicio, debes tener el ID del servicio. Los SLOs se denominan en función del servicio al que pertenecen. Para obtener información sobre cómo identificar los IDs de servicio, consulta IDs de servicio.
Mostrar objetivos de nivel de servicio
Para obtener información sobre todos los SLOs asociados a un servicio, invoca el método services.serviceLevelObjectives.list
.
Para obtener información sobre un SLO específico por su nombre, utiliza el método services.serviceLevelObjectives.get
:
Protocolo
Para obtener información sobre los servicios mediantecurl
, invoca el método services.serviceLevelObjectives.list
o services.serviceLevelObjectives.get
enviando una solicitud GET
a:
https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/[SERVICE_ID]/serviceLevelObjectives
para listar todos los SLOshttps://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/[SERVICE_ID]/serviceLevelObjectives/SLO_ID
para obtener un SLO específico
Por ejemplo, la siguiente solicitud muestra todos los SLOs asociados al ID de servicio almacenado en la variable de entorno SERVICE_ID
:
curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}/serviceLevelObjectives
A continuación, se muestra un SLO de disponibilidad obtenido del servicio "currencyservice":
{ "name": "projects/PROJECT_NUMBER/services/PROJECT_ID-zone-us-central1-c-csm-main-default-currencyservice/serviceLevelObjectives/3kavNVTtTMuzL7KcXAxqCQ", "displayName": "98% Availability in Calendar Week" "serviceLevelIndicator": { "basicSli": { "availability": {}, "location": [ "us-central1-c" ] } }, "goal": 0.98, "calendarPeriod": "WEEK", },
Este objetivo de nivel de servicio se basa en un indicador de nivel de servicio de disponibilidad, establece un objetivo de rendimiento del 98 % y mide el cumplimiento durante una semana natural. Para obtener más información sobre los SLIs de disponibilidad, consulta Indicadores de nivel de servicio.
Consulta ServiceLevelObjective
para obtener más información sobre la estructura de los SLOs.
Recuperar un SLO específico
Cada SLO tiene un identificador único en el servicio, que es la cadena que sigue a serviceLevelObjectives
en el campo name
del SLO. En el siguiente ejemplo:
"name": "projects/PROJECT_NUMBER/services/PROJECT_ID-zone-us-central1-c-csm-main-default-currencyservice/serviceLevelObjectives/3kavNVTtTMuzL7KcXAxqCQ",
El ID del SLO es la cadena 3kavNVTtTMuzL7KcXAxqCQ
.
Para obtener información sobre este SLO concreto, solicítalo por su ID.
Protocolo
Para obtener un SLO específico mediantecurl
, invoca el método services.serviceLevelObjectives.get
enviando una solicitud GET
a https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID/serviceLevelObjectives/SLO_ID
:
SLO_ID=dhefHDM4TwSRZEKIV4ZYEg curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}/serviceLevelObjectives/${SLO_ID}
Crear un acuerdo de nivel de servicio
Para crear un SLO mediante la API SLO, debes crear un objeto ServiceLevelObjective
y pasarlo al método serviceLevelObjectives.create
.
La estructura de un SLO tiene muchas estructuras insertadas, incluida una para el valor del campo serviceLevelIndicator
.
En el caso de los servicios de Cloud Service Mesh, Istio en Google Kubernetes Engine y App Engine, los SLIs están predefinidos. Puedes usar la consola de Cloud Service Mesh para crear SLOs. Solo tienes que especificar los objetivos de rendimiento y los periodos de cumplimiento.
En el caso de otros servicios, debes definir los SLOs mediante la API SLO. Para especificar un SLO, también debe crear un valor para el campo
serviceLevelIndicator
. Consulta Crear un indicador de nivel de servicio para ver algunas técnicas y Crear indicadores de nivel de servicio a partir de métricas para ver una serie de ejemplos basados en varias fuentes.
También puedes crear SLIs mediante la Google Cloud consola. Para obtener más información, consulta Crear un SLO.
Estructura de un SLO
La estructura básica para crear el SLO es la siguiente:
{ "displayName": string, "serviceLevelIndicator": { object (ServiceLevelIndicator) }, "goal": number, // Union field period can be only one of the following: "rollingPeriod": string, "calendarPeriod": enum (CalendarPeriod) // End of list of possible types for union field period. }
Deberás especificar lo siguiente:
- Nombre visible: una descripción del SLO
- Un indicador de nivel de servicio, que es uno de los tres tipos:
- El objetivo de rendimiento (un porcentaje)
- El periodo de cumplimiento, que puede ser de dos tipos:
- Un periodo acumulativo de una duración determinada (en segundos).
- Un periodo del calendario
Para obtener más información sobre los SLIs, los objetivos de rendimiento y los periodos de cumplimiento, consulta Conceptos de la monitorización de servicios.
En el caso de Cloud Service Mesh, Istio en Google Kubernetes Engine y los servicios de App Engine, el tipo de SLI es el SLI básico.
En el caso de otros servicios, debes crear un indicador de nivel de servicio basado en solicitudes o un indicador de nivel de servicio basado en ventanas. Consulta Crear un indicador de nivel de servicio para ver algunas técnicas.
Ejemplo
Una vez que tengas el SLI, podrás crear el SLO. En el siguiente ejemplo se define un SLO para un servicio que usa un SLI básico. Puede que tengas varios SLOs en un solo SLI. Por ejemplo, uno para una disponibilidad del 95% y otro para una disponibilidad del 99 %. En el siguiente ejemplo se muestra un SLO con una disponibilidad del 95% durante una semana natural:
{ "serviceLevelIndicator": { "basicSli": { "availability": {}, "location": [ "us-central1-c" ] } }, "goal": 0.95, "calendarPeriod": "WEEK", "displayName": "95% Availability in Calendar Week" }
En este ejemplo, se especifica un SLO de disponibilidad del 75% en un periodo de 3 días consecutivos:
{ "serviceLevelIndicator": { "basicSli": { "availability": {}, "location": [ "us-central1-c" ] } }, "goal": 0.75, "rollingPeriod": "259200s", "displayName": "75% Availability in Rolling 3 Days" }
Protocolo
Para crear un SLO mediantecurl
, envía un mensaje POST
al
https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID/serviceLevelObjectives
endpoint:
Crea una variable para el ID de servicio:
SERVICE_ID=custom:my-test-service
Crea una variable para contener el cuerpo de la solicitud, una instancia del objeto
ServiceLevelObjective
. En este ejemplo se usa uno de los SLOs descritos anteriormente:CREATE_SLO_POST_BODY=$(cat <<EOF { "serviceLevelIndicator": { "basicSli": { "availability": {}, "location": [ "us-central1-c" ] } }, "goal": 0.75, "rollingPeriod": "259200s", "displayName": "75% Availability in Rolling 3 Days" } EOF )
Publica el cuerpo de la solicitud en el endpoint:
curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" --header "Content-Type: application/json" -X POST -d "${CREATE_SLO_POST_BODY}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}/serviceLevelObjectives
También puede especificar un ID para el SLO como valor del parámetro de consulta
service_level_objective_id
:SLO_ID=test-slo-id curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" --header "Content-Type: application/json" -X POST -d "${CREATE_SLO_POST_BODY}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}/serviceLevelObjectives?service_level_objective_id=${SLO_ID}
Eliminar un SLO
Para eliminar un SLO, invoca el método services.serviceLevelObjectives.delete
y especifica el ID del SLO en tu proyecto:
Protocolo
Para eliminar un SLO mediantecurl
, envía una solicitud DELETE
al punto de conexión https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID/serviceLevelObjectives/SLO_ID
.
curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" -X DELETE https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}/serviceLevelObjectives/${SLO_ID}
Acceder a series temporales de SLO
Los datos de SLO se almacenan en series temporales, por lo que puede usar el método timeSeries.list
para obtenerlos.
Sin embargo, estos datos no se almacenan en tipos de métricas estándar, por lo que no puede usar el mecanismo estándar para especificar un filtro de tipo de métrica en el método timeSeries.list
.
En su lugar, las series temporales de SLO se obtienen especificando otro tipo de filtro, un selector de series temporales, en el método timeSeries.list
del parámetro filter
.
Para obtener información sobre cómo usar estos selectores, consulta Extraer datos sobre el objetivo de nivel de servicio.
También puedes usar selectores de series temporales para configurar políticas de alertas mediante programación. Consulta Alertas sobre el ritmo de consumo para obtener más información.