Estructuras de la API

En este documento se presentan las estructuras que se usan para representar servicios y SLOs en la API SLO, y se asignan a los conceptos que se describen en Conceptos de monitorización de servicios.

La API SLO se usa para configurar objetivos de nivel de servicio (SLOs) que se pueden usar para monitorizar el estado de tus servicios.

Service Monitoring añade los siguientes recursos a la API Monitoring:

Para obtener información sobre cómo invocar la API, consulta Trabajar con la API.

Servicios

Un servicio se representa mediante un objeto Service. Este objeto incluye los siguientes campos:

  • Name: nombre completo del recurso de este servicio
  • Nombre visible: una etiqueta que se usa en los componentes de la consola
  • Estructura de uno de los tipos de BasicService.
  • Objeto de configuración de telemetría proporcionado por el sistema

Para definir un servicio básico, especifica el tipo de servicio y proporciona un conjunto de etiquetas específicas del servicio que lo describan:

{
   "serviceType": string,
   "serviceLabels": {
      string: string,
      ...
   }
}

En las siguientes secciones se ofrecen ejemplos de cada tipo de servicio.

Tipos de servicios básicos

En esta sección se proporcionan ejemplos de definiciones de servicios basadas en el tipo BasicService, en las que el valor del campo serviceType es uno de los siguientes:

  • APP_ENGINE
  • CLOUD_ENDPOINTS
  • CLUSTER_ISTIO
  • ISTIO_CANONICAL_SERVICE
  • CLOUD_RUN

Cada uno de estos tipos de servicio usa el indicador de nivel de servicio BasicSli.

App Engine

    {
      "displayName": "DISPLAY_NAME",
      "basicService": {
          "serviceType": "APP_ENGINE",
          "serviceLabels": {
            "module_id": "MODULE_ID"
          },
      },
    }

Cloud Endpoints

    {
      "displayName": "DISPLAY_NAME",
      "basicService": {
          "serviceType": "CLOUD_ENDPOINTS",
          "serviceLabels": {
            "service": "SERVICE"
          },
      },
    }

Istio de clúster

    {
      "displayName": "DISPLAY_NAME",
      "basicService": {
          "serviceType": "CLUSTER_ISTIO",
          "serviceLabels": {
            "location": "LOCATION",
            "cluster_name": "CLUSTER_NAME",
            "service_namespace": "SERVICE_NAMESPACE",
            "service_name": "SERVICE_NAME"
          },
      },
    }

Servicio canónico de Istio

    {
      "displayName": "DISPLAY_NAME",
      "basicService": {
          "serviceType": "ISTIO_CANONICAL_SERVICE",
          "serviceLabels": {
            "mesh_uid": "MESH_UID",
            "canonical_service_namespace": "CANONICAL_SERVICE_NAMESPACE",
            "canonical_service": "CANONICAL_SERVICE"
          },
      },
    }

Cloud Run

    {
      "displayName": "DISPLAY_NAME",
      "basicService": {
          "serviceType": "CLOUD_RUN",
          "serviceLabels": {
            "service_name": "SERVICE_NAME",
            "location": "LOCATION"
          },
      },
    }

Tipos de servicios básicos de GKE

En esta sección se incluyen ejemplos de definiciones de servicios de GKE creadas con el tipo BasicService, en las que el valor del campo serviceType es uno de los siguientes:

  • GKE_NAMESPACE
  • GKE_WORKLOAD
  • GKE_SERVICE

Debes definir SLIs para estos tipos de servicios. No pueden usar indicadores de nivel de servicio BasicSli. Para obtener más información, consulta Indicadores de nivel de servicio.

Espacio de nombres de GKE

    {
      "displayName": "DISPLAY_NAME",
      "basicService": {
          "serviceType": "GKE_NAMESPACE",
          "serviceLabels": {
            "project_id": "PROJECT_ID",
            "location": "LOCATION",
            "cluster_name": "CLUSTER_NAME",
            "namespace_name": "NAMESPACE_NAME"
          }
      },
    }

Carga de trabajo de GKE

    {
      "displayName": "DISPLAY_NAME",
      "basicService": {
          "serviceType": "GKE_WORKLOAD",
          "serviceLabels": {
            "project_id": "PROJECT_ID",
            "location": "LOCATION",
            "cluster_name": "CLUSTER_NAME",
            "namespace_name": "NAMESPACE_NAME",
            "top_level_controller_type": "TOPLEVEL_CONTROLLER_TYPE",
            "top_level_controller_name": "TOPLEVEL_CONTROLLER_NAME",
          }
      },
    }

Servicio de GKE

    {
      "displayName": "DISPLAY_NAME",
      "basicService": {
          "serviceType": "GKE_SERVICE",
          "serviceLabels": {
            "project_id": "PROJECT_ID",
            "location": "LOCATION",
            "cluster_name": "CLUSTER_NAME",
            "namespace_name": "NAMESPACE_NAME",
            "service_name": "SERVICE_NAME"
          }
      },
    }

Servicios personalizados

Puedes crear servicios personalizados si ninguno de los tipos de servicio básicos se adapta a tus necesidades. Un servicio personalizado tiene el siguiente aspecto:

    {
      "displayName": "DISPLAY_NAME",
      "custom": {}
    }

Debes definir SLIs para estos tipos de servicios. No pueden usar indicadores de nivel de servicio BasicSli. Para obtener más información, consulta Indicadores de nivel de servicio.

Indicadores de nivel de servicio

Un indicador de nivel de servicio (SLI) proporciona una medida del rendimiento de un servicio. Un SLI se basa en una métrica registrada por el servicio. La forma exacta en la que se define el indicador de nivel de servicio depende del tipo de métrica que se utilice como métrica indicadora, pero, por lo general, se trata de una comparación entre los resultados aceptables y los resultados totales.

Un SLI se representa con el objeto ServiceLevelIndicator. Este objeto es una forma colectiva de hacer referencia a los tres tipos admitidos de SLIs:

  • Un SLI básico, que se crea automáticamente para las instancias del tipo de servicio BasicService. Este tipo de SLI se describe en Objetivos de nivel de servicio. Se representa mediante un objeto BasicSli y mide la disponibilidad o la latencia.

  • Un SLI basado en solicitudes, que puedes usar para contar los eventos que representan un servicio aceptable. El uso de este tipo de SLI se describe en SLOs basados en solicitudes y se representa mediante un objeto RequestBasedSli.

  • Un SLI basado en ventanas, que puedes usar para contar los periodos que cumplen un criterio de corrección. El uso de este tipo de SLI se describe en SLOs basados en Windows y se representa mediante un objeto WindowsBasedSli.

Por ejemplo, a continuación se muestra un SLI de disponibilidad básico:

{
  "basicSli": {
    "availability": {},
    "location": [
      "us-central1-c"
    ]
  }
}

Estructuras de los indicadores de nivel de servicio basados en solicitudes

Un indicador de nivel de servicio basado en solicitudes se basa en una métrica que cuenta unidades de servicio como una proporción entre un resultado concreto y el total. Por ejemplo, si usas una métrica que cuenta las solicitudes, puedes calcular la proporción entre el número de solicitudes que devuelven un resultado correcto y el número total de solicitudes.

Hay dos formas de crear una SLI basada en solicitudes:

  • Como TimeSeriesRatio, cuando la relación entre el servicio correcto y el servicio total se calcula a partir de dos series temporales cuyos valores tienen un tipo de métrica DELTA o CUMULATIVE.
  • Como DistributionCut, cuando la serie temporal tiene el tipo de valor DISTRIBUTION y sus valores tienen un tipo de métrica DELTA o CUMULATIVE. El valor de buen servicio es el número de elementos que se incluyen en los contenedores del histograma de un intervalo especificado, y el total es el número de todos los valores de la distribución.

A continuación, se muestra la representación JSON de un SLI que usa una proporción de serie temporal:

{
  "requestBased": {
    "goodTotalRatio": {
      "totalServiceFilter": "resource.type=https_lb_rule metric.type="loadbalancing.googleapis.com/https/request_count"",
      "goodServiceFilter": "resource.type=https_lb_rule metric.type="loadbalancing.googleapis.com/https/request_count" metric.label.response_code_class=200",
    }
  }
}

Las series temporales de esta proporción se identifican mediante el par de tipo de recurso monitorizado y tipo de métrica:

  • Recurso: https_lb_rule
  • Tipo de métrica: loadbalancing.googleapis.com/https/request_count

El valor de totalServiceFilter se representa mediante el par de tipo de métrica y recurso. El valor de goodServiceFilter se representa con el mismo par, pero en el que alguna etiqueta tiene un valor concreto. En este caso, cuando el valor de la etiqueta response_code_class es 200.

La proporción entre los filtros mide el número de solicitudes que devuelven un estado HTTP 2xx con respecto al número total de solicitudes.

A continuación, se muestra la representación JSON de un SLI que usa un corte de distribución:

{
  "requestBased": {
    "distribution_cut": {
      "distribution_filter": "resource.type=https_lb_rule  metric.type="loadbalancing.googleapis.com/https/backend_latencies" metric.label.response_code_class=200",
      "range": {
        "min": "-Infinity",
        "max": 500.0
      }
    }
  }
}

La serie temporal se identifica por el tipo de recurso monitorizado, el tipo de métrica y el valor de una etiqueta de métrica:

  • Recurso: https_lb_rule
  • Tipo de métrica: loadbalancing.googleapis.com/https/backend_latencies
  • Par etiqueta-valor: response_code_class = 200

El intervalo de latencias que se considera bueno se indica en el campo range. Este indicador de nivel de servicio calcula la proporción de latencias de respuestas de clase 2xx por debajo de 500 con respecto a las latencias de todas las respuestas de clase 200.

Estructuras de los indicadores de nivel de servicio basados en ventanas

Un SLI basado en ventanas cuenta las ventanas de tiempo en las que el servicio proporcionado se considera correcto. El criterio para determinar la calidad del servicio forma parte de la definición del SLI.

Todos los SLIs basados en ventanas incluyen un periodo de ventana de entre 60 y 86.400 segundos (1 día).

Hay dos formas de especificar el criterio de buen servicio de un SLI basado en periodos:

  • Crea una cadena de filtro, tal como se describe en Filtros de monitorización, que devuelva una serie temporal con valores booleanos. Una ventana es buena si el valor de esa ventana es true. Este filtro se llama goodBadMetricFilter.
  • Crea un objeto PerformanceThreshold que represente un umbral de rendimiento aceptable. Este objeto se especifica como el valor de goodTotalRatioThreshold.

    Un objeto PerformanceThreshold especifica un valor de umbral y un SLI de rendimiento. Si el valor del indicador de nivel de servicio de rendimiento alcanza o supera el valor de umbral, el periodo se considera correcto.

    Hay dos formas de especificar el SLI de rendimiento:

    • Como un objeto BasicSli en el campo basicPerformanceSli.
    • Como un objeto RequestBasedSli en el campo performance. Si usas un indicador de nivel de servicio basado en solicitudes, el tipo de métrica de tu indicador de nivel de servicio debe ser DELTA o CUMULATIVE. No puedes usar métricas de GAUGE en indicadores de nivel de servicio basados en solicitudes.

A continuación, se muestra la representación JSON de un SLI basado en ventanas creado a partir de un umbral de rendimiento para un SLI de disponibilidad básico:

{
  "windowsBased": {
     "goodTotalRatioThreshold": {
       "threshold": 0.9,
       "basicSliPerformance": {
         "availability": {},
         "location": [
           "us-central1-c"
         ]
       }
     },
     "windowPeriod": "300s"
   }
}

Este indicador de nivel de servicio especifica un buen rendimiento como un periodo de 5 minutos en el que la disponibilidad alcanza el 90% o más. La estructura de un SLI básico se muestra en Indicadores de nivel de servicio.

También puedes insertar un indicador de nivel de servicio basado en solicitudes en un indicador de nivel de servicio basado en periodos. Para obtener más información sobre las estructuras insertadas, consulta Estructuras de SLIs basados en solicitudes.

Objetivos de nivel de servicio

Un objetivo de nivel de servicio se representa con un objeto ServiceLevelObjective. Este objeto incluye los siguientes campos:

  • Un nombre
  • Un nombre visible
  • El SLI de destino; un objeto ServiceLevelIndicator insertado
  • El objetivo de rendimiento del SLI
  • El periodo de cumplimiento del SLI

A continuación, se muestra la representación JSON de un SLO que usa un SLI de disponibilidad básico como valor del campo serviceLevelIndicator:

{
   "name": "projects/PROJECT_NUMBER/services/PROJECT_ID-zone-us-central1-c-csm-main-default-currencyservice/serviceLevelObjectives/3kavNVTtTMuzL7KcXAxqCQ",
   "serviceLevelIndicator": {
     "basicSli": {
       "availability": {},
       "location": [
         "us-central1-c"
       ]
     }
   },
   "goal": 0.98,
   "calendarPeriod": "WEEK",
   "displayName": "98% Availability in Calendar Week"
}

Este SLO establece el objetivo de rendimiento en un 98 % de disponibilidad durante un periodo de una semana.