Este documento descreve como gerir serviços e objetivos de nível de serviço (SLOs) através da API Cloud Monitoring.
O Service Monitoring adiciona os seguintes recursos à API Monitoring:
Este documento refere-se a estas adições coletivamente como a API SLO e ilustra as utilizações principais. Para uma vista geral das estruturas na API SLO, consulte Construções na API. O material de referência abrangente é apresentado em API Cloud Monitoring v3.
Pode usar a API SLO para fazer o seguinte:
Crie e faça a gestão de serviços.
Crie objetivos ao nível do serviço (SLOs) com base em indicadores do nível de serviço (INSs) personalizados ou predefinidos para qualquer um dos seus serviços.
Identificadores válidos
Vários métodos na API SLO usam identificadores para diferentes elementos, especialmente identificadores para projetos e serviços. Estes IDs cumprem as seguintes regras:
- Comprimento: 1 a 63 carateres
- Carateres: apenas letras minúsculas, números e hífenes
- Caráter inicial: letra minúscula
- Caráter terminal: letra minúscula ou um número, mas não um hífen
A expressão regular para estas regras é a seguinte:
[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?
Exemplos de utilização de curl
Esta secção descreve as convenções e a configuração usadas para invocar a API SLO através da ferramenta curl
. Se estiver a usar esta API através de uma biblioteca cliente, pode ignorar esta secção.
Os exemplos nesta página acedem à API SLO através da ferramenta curl
para enviar pedidos HTTP para pontos finais REST. Use as seguintes informações sobre a autenticação e sobre a invocação de curl
para definir as variáveis usadas nas invocações.
Autenticação
Crie uma variável de ambiente para guardar o ID do projeto de âmbito de um âmbito de métricas: estes exemplos usam
PROJECT_ID
:PROJECT_ID=my-test-service
Autentique-se na CLI do Google Cloud:
gcloud auth login
Para evitar ter de especificar o ID do projeto com cada comando, defina-o como predefinição através da CLI gcloud:
gcloud config set project ${PROJECT_ID}
Crie um token de autorização e capture-o numa variável de ambiente. Estes exemplos chamam a variável
ACCESS_TOKEN
:ACCESS_TOKEN=`gcloud auth print-access-token`
Tem de atualizar periodicamente o token de acesso. Se os comandos que funcionavam indicarem subitamente que não tem autenticação, reemita este comando.
Para verificar se recebeu um token de acesso, repita a variável
ACCESS_TOKEN
:echo ${ACCESS_TOKEN} ya29.GluiBj8o....
A invocar curl
Cada invocação de curl
inclui um conjunto de argumentos,
seguido do URL de um recurso da API SLO. Os argumentos comuns incluem valores especificados pelas variáveis de ambiente PROJECT_ID
e ACCESS_TOKEN
.
Também pode ter de especificar outros argumentos, por exemplo, para especificar o tipo de pedido HTTP (por exemplo, -X DELETE
). O pedido predefinido é GET
, pelo que os exemplos não o especificam.
Cada invocação de curl
tem esta estrutura geral:
curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" <other_args> https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/<request>
Por exemplo, para listar todos os serviços no seu projeto, emita o seguinte pedido:GET
curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services
Este pedido devolve uma matriz de descrições de serviços, com entradas como a seguinte, um serviço de carga de trabalho do GKE com o ID do serviço "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 a configuração usada para criar este serviço, consulte o artigo Criar um serviço. Tenha em atenção que a estrutura gkeWorkload
nesta ficha
é derivada da estrutura basicService
usada para criar o serviço.
Consulte Service
para mais informações sobre a estrutura de um serviço.
Gerir serviços
O recurso Service
funciona como o elemento raiz para organizar os seus serviços. Os aspetos de um serviço específico, como os respetivos SLOs, por exemplo, estão
organizados sob o nome do serviço. Estes são os tipos de serviços compatíveis:
- Serviço do App Engine:
APP_ENGINE
- Serviço Cloud Endpoints:
CLOUD_ENDPOINTS
- Serviço Istio canónico:
ISTIO_CANONICAL_SERVICE
- Serviço Istio do cluster:
CLUSTER_ISTIO
- Serviço do Cloud Run:
CLOUD_RUN
- Um conjunto de serviços baseados no Google Kubernetes Engine:
- Serviço do GKE:
GKE_SERVICE
- Namespace do GKE:
GKE_NAMESPACE
- Carga de trabalho do GKE:
GKE_WORKLOAD
- Serviço do GKE:
- Serviços personalizados:
CUSTOM
Para mais informações, consulte os Tipos de serviços básicos ou os Tipos de serviços básicos do GKE.
Pode adicionar SLOs a qualquer serviço no seu projeto através da API. A secção Gerir SLOs aborda os comandos para manipular SLOs.
IDs dos serviços
Cada serviço tem um identificador totalmente qualificado denominado nome do recurso. Este identificador é armazenado no campo name
da descrição do serviço, por exemplo:
"name": "projects/PROJECT_NUMBER/services/PROJECT_ID-zone-us-central1-a-cloudrun-istio-system-cluster-local-gateway",
O nome do recurso contém um ID mais curto para o serviço, a parte do nome do recurso após a subcadeia de carateres projects/PROJECT_NUMBER/services/
Se criou o seu próprio serviço com o nome do recurso
projects/PROJECT_NUMBER/services/my-test-service
, o ID do serviço é
my-test-service
.
Para brevidade e precisão, muitos curl
exemplos partem do princípio de que o ID do serviço está na variável de ambiente SERVICE_ID
, para que possa consultá-lo repetidamente.
Serviços de fichas
Para obter informações sobre todos os serviços no seu projeto, invoque o método services.list
. Para obter informações sobre um serviço específico através do ID do serviço, use o método services.get
:
Protocolo
Para listar informações sobre serviços através decurl
, invoque o método services.list
ou services.get
enviando um pedido GET
para:
https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services
para listar todos os serviçoshttps://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID
para receber um serviço específico
Por exemplo, o pedido seguinte obtém informações sobre o serviço identificado pelo valor armazenado na variável de ambiente SERVICE_ID
:
curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}
Criar um serviço
Para criar um serviço, especifica uma representação do tipo de serviço
e envia-a para o método services.create
.
Pode usar as estruturas de tipo de serviço descritas em
Tipos de serviços básicos e
Tipos de serviços básicos do GKE.
As estruturas variam, mas o processo de chamada da API é o mesmo.
Tem de especificar um nome a apresentar para o serviço e um campo basicService
que contenha a representação do serviço.
Opcionalmente, pode especificar o ID do serviço que quer que o serviço tenha. O exemplo seguinte mostra a criação de um serviço de carga de trabalho do {[gke_name_short}}:
Protocolo
Para criar o serviço através de curl
, envie uma mensagem POST
para o ponto final https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services
:
Se quiser fornecer um ID para o serviço, crie uma variável para o ID do serviço:
SERVICE_ID=my-test-service
Este valor é fornecido no parâmetro de consulta de URL
service_id
.Crie uma variável para conter o corpo do pedido que descreve o serviço:
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 )
Publique o corpo do pedido no ponto final e especifique o ID do serviço como o valor do 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 exemplos das estruturas associadas a outros serviços, consulte os tipos de serviços básicos ou os tipos de serviços básicos do GKE.
Eliminar um serviço
Para eliminar um serviço que criou, invoque o método
services.delete
e especifique o ID do serviço.
Protocolo
Para eliminar um serviço através docurl
, envie um pedido DELETE
para o ponto final 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}
Gerir SLOs
Pode criar, eliminar e obter SLOs através da API SLO. Pode ter até 500 SLOs para cada serviço.
Para gerir SLOs de um serviço, tem de ter o ID do serviço. Os SLOs são denominados com base no serviço a que pertencem. Para ver informações sobre a identificação de IDs de serviços, consulte o artigo IDs de serviços.
SLOs de fichas
Para obter informações sobre todos os SLOs associados a um serviço, invoque o método services.serviceLevelObjectives.list
.
Para obter informações sobre um SLO específico pelo nome, use o método
services.serviceLevelObjectives.get
:
Protocolo
Para listar informações sobre serviços através decurl
, invoque o método services.serviceLevelObjectives.list
ou services.serviceLevelObjectives.get
enviando um pedido GET
para:
https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/[SERVICE_ID]/serviceLevelObjectives
para listar todos os SLOshttps://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/[SERVICE_ID]/serviceLevelObjectives/SLO_ID
para obter um SLO específico
Por exemplo, o pedido seguinte lista todos os SLOs associados ao ID do serviço armazenado na variável de ambiente SERVICE_ID
:
curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}/serviceLevelObjectives
Segue-se um SLO de disponibilidade obtido do serviço "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 SLO baseia-se num SLI de disponibilidade, define um objetivo de desempenho de 98% e mede a conformidade ao longo de uma semana do calendário. Para mais informações sobre os INSs de disponibilidade, consulte o artigo Indicadores do nível de serviço.
Consulte ServiceLevelObjective
para mais informações sobre a estrutura dos SLOs.
Obter um SLO específico
Cada SLO tem um identificador exclusivo no serviço, que consiste na string que se segue a
serviceLevelObjectives
no campo name
do SLO. No exemplo seguinte:
"name": "projects/PROJECT_NUMBER/services/PROJECT_ID-zone-us-central1-c-csm-main-default-currencyservice/serviceLevelObjectives/3kavNVTtTMuzL7KcXAxqCQ",
O ID do SLO é a string 3kavNVTtTMuzL7KcXAxqCQ
.
Para obter informações sobre este SLO específico, peça o SLO por ID.
Protocolo
Para obter um SLO específico através decurl
, invoque o método services.serviceLevelObjectives.get
enviando um pedido GET
para 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}
Criar um SLO
Para criar um SLO através da API SLO, tem de criar um objeto ServiceLevelObjective
e transmiti-lo ao método serviceLevelObjectives.create
.
A estrutura de um SLO tem muitas estruturas incorporadas, incluindo uma para o valor do campo serviceLevelIndicator
.
Para a Cloud Service Mesh, o Istio no Google Kubernetes Engine e os serviços do App Engine, os SLIs estão predefinidos. Pode usar a consola do Cloud Service Mesh para criar SLOs. Só tem de especificar os objetivos de desempenho e os períodos de conformidade.
Para outros serviços, tem de definir os SLOs através da API SLO. Para especificar um SLO, também tem de criar um valor para o campo
serviceLevelIndicator
. Consulte o artigo Criar um indicador do nível de serviço para ver algumas técnicas e o artigo Criar INSs a partir de métricas para ver um conjunto de exemplos baseados em várias origens.
Também pode criar SLIs através da Google Cloud consola. Para mais informações, consulte o artigo Criar um SLO.
Esqueleto de um SLO
A estrutura básica para criar o SLO é a seguinte:
{ "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. }
Tem de especificar o seguinte:
- Nome a apresentar: uma descrição do SLO
- Um indicador do nível de serviço, que é um dos três tipos:
- O objetivo de desempenho (uma percentagem)
- O período de conformidade, que é um de dois tipos:
- Um período contínuo de determinada duração (em segundos)
- Um período do calendário
Para mais informações acerca dos SLIs, dos objetivos de desempenho e dos períodos de conformidade, consulte o artigo Conceitos na monitorização de serviços.
Para o Cloud Service Mesh, o Istio no Google Kubernetes Engine e os serviços do App Engine, o tipo de SLI é o SLI básico.
Para outros serviços, tem de criar um SLI baseado em pedidos ou um SLI baseado em janelas. Consulte o artigo Criar um indicador de nível de serviço para conhecer algumas técnicas.
Exemplo
Depois de ter o SLI, pode criar o SLO. O exemplo seguinte define um SLO para um serviço que usa um SLI básico. Pode ter vários SLOs num único SLI, por exemplo, um para 95% de disponibilidade e outro para 99% de disponibilidade. O exemplo seguinte é um SLO para uma disponibilidade de 95% durante uma semana civil:
{ "serviceLevelIndicator": { "basicSli": { "availability": {}, "location": [ "us-central1-c" ] } }, "goal": 0.95, "calendarPeriod": "WEEK", "displayName": "95% Availability in Calendar Week" }
Este exemplo especifica um SLO para 75% de disponibilidade durante um período contínuo de 3 dias:
{ "serviceLevelIndicator": { "basicSli": { "availability": {}, "location": [ "us-central1-c" ] } }, "goal": 0.75, "rollingPeriod": "259200s", "displayName": "75% Availability in Rolling 3 Days" }
Protocolo
Para criar um SLO através decurl
, envie uma mensagem POST
para o ponto final
https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID/serviceLevelObjectives
Crie uma variável para o ID do serviço:
SERVICE_ID=custom:my-test-service
Crie uma variável para conter o corpo do pedido, uma instância do objeto
ServiceLevelObjective
. Este exemplo usa um dos 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 )
Publique o corpo do pedido no ponto final:
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
Opcionalmente, também pode especificar um ID desejado para o SLO como o valor do 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 um SLO
Para eliminar um SLO, invoque o método
services.serviceLevelObjectives.delete
e especifique o ID do SLO no seu projeto:
Protocolo
Para eliminar um SLO através decurl
, envie um pedido DELETE
para o ponto final 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}
Aceder a intervalos temporais de SLO
Os dados de SLO são armazenados em séries cronológicas, pelo que pode usar o método timeSeries.list
para os obter.
No entanto, estes dados não são armazenados em tipos de métricas padrão, pelo que não pode usar o mecanismo padrão de especificação de um filtro de tipo de métrica no método timeSeries.list
.
Em alternativa, as séries cronológicas de SLO são obtidas especificando outro tipo de filtro, um selector de séries cronológicas, para o método timeSeries.list
no parâmetro filter
.
Consulte o artigo Obter dados de SLO para ver informações sobre a utilização destes seletores.
Também usa seletores de séries cronológicas para configurar políticas de alerta de forma programática. Consulte o artigo Alertas sobre a taxa de consumo para mais informações.