Tutorial: Obtendo a taxa de erro de um serviço

Você pode usar a API REST da Instana para recuperar a taxa de erro de um serviço específico. A taxa de erro é uma métrica crucial para monitorar a integridade e a confiabilidade dos aplicativos e da infraestrutura. É calculado como o número de respostas de erro dividido pelo número total de solicitações em um período de tempo específico, geralmente expresso como uma porcentagem.

Contexto

No espaço de observabilidade, a taxa de erro refere-se à porcentagem de todas as solicitações a um serviço que resultam em erros. Essa métrica é fundamental para monitorar a integridade e a confiabilidade dos aplicativos e da infraestrutura. A lista a seguir explica o que a taxa de erro pode indicar e como ela é usada:

  • Definição: A taxa de erro é calculada como o número de respostas de erro dividido pelo número total de solicitações em um período de tempo específico, geralmente expresso como uma porcentagem. Por exemplo, se um serviço receber 1.000 solicitações em uma hora e 100 dessas solicitações resultarem em erros, a taxa de erro será de 10%.
  • Tipos de erros: Os erros podem incluir erros do lado do cliente ( 4XX HTTP status codes), erros do lado do servidor ( 5XX HTTP status codes), timeouts e erros específicos do aplicativo.
  • Importância: Uma alta taxa de erros pode indicar problemas, como bugs no código, limitações de recursos (como CPU ou memória), problemas de rede ou falhas no serviço upstream. As equipes podem identificar e resolver problemas rapidamente monitorando essa taxa.
  • Limites e alertas: As equipes geralmente definem limites para taxas de erro aceitáveis com base na criticidade do serviço e no impacto sobre o usuário. Se a taxa de erro exceder esses limites, um alerta será acionado para que as equipes investiguem.
  • Análise e resposta: As ferramentas de observabilidade fornecem diagnósticos detalhados de erros para ajudar a identificar a origem do problema, como rastreamentos de pilha, registros ou rastreamentos de transações. Isso permite uma resposta mais eficaz e direcionada aos incidentes.
  • Melhoria contínua: Ao analisar tendências e padrões na taxa de erros, as organizações podem melhorar proativamente a base de código e a infraestrutura, resultando em um serviço mais estável e confiável.

A taxa de erro é uma métrica fundamental em qualquer estratégia de observabilidade ou monitoramento, pois afeta diretamente a experiência do usuário e a confiabilidade do serviço.

Os detalhes a seguir descrevem como obter a taxa de erro de um serviço específico em execução em seu sistema e que está sendo monitorado pela Instana.

Pré-requisitos

Para usar os pontos de extremidade da API REST da Instana identificados neste tutorial, consulte Pré-requisitos gerais. Não há pré-requisitos específicos para este tutorial.

Terminais de API

Neste tutorial, são usados dois endpoints de API diferentes do Application Monitoring.

Terminal Descrição Documentação Permissões Necessárias
GET /api/application-monitoring/catalog/metrics Recupera uma lista de tipos de métricas que a Instana monitora; a partir daí, você pode selecionar o endereço metricId para os dados que deseja recuperar para um serviço específico. Obter métricas do catálogo de aplicativos Permissão de aplicativos gerais.

| GET api/application-monitoring/metrics/services | Recupera as métricas especificadas para um serviço. Cada metric inclui um aggregation que é usado para identificar o tipo de método de resumo estatístico a ser usado.| GET service metrics | General Applications permission. |

O tutorial

São necessárias duas etapas para recuperar dados de métricas, como a taxa de erro de um serviço na Instana:

  1. Obtenha o catálogo de métricas para obter uma lista de métricas compatíveis. Aqui você pode encontrar o endereço metricId para os dados métricos que deseja obter para um determinado serviço.
  2. Obtenha os dados de um tipo de métrica especificado - metricId - e aggregation. Neste exemplo, estamos procurando a taxa de erro média de um serviço.

Obter a ID da métrica e o tipo de agregação do catálogo de métricas

Para listar todos os tipos de métricas disponíveis, você deve enviar uma solicitação GET para o ponto de extremidade ``/api/application-monitoring/catalog/metrics`.

Aqui estão os detalhes dessa solicitação:

GET /api/application-monitoring/catalog/metrics
Host: {tenant}-{unit}.instana.io
Authorization: apiToken {api_token}
Accept: application/json

Exemplo de solicitação curl

Uma solicitação curl para esse endpoint não requer parâmetros de consulta nem carga útil de solicitação.

curl -XPOST https://{tenant}-{unit}.instana.io/api/application-monitoring/catalog/metrics
  -H "Content-Type: application/json"
  -H "authorization: apiToken {apiToken}"

Exemplo de carga útil de resposta

A resposta é um catálogo de métricas, que é uma lista de tipos de métricas compatíveis. Você pode percorrê-la para encontrar os sites metricId e aggregation para os dados métricos que deseja extrair para um serviço.

[
    {
        "metricId": "calls",
        "label": "Call count",
        "formatter": "NUMBER",
        "description": "Number of received calls",
        "aggregations": [
            "PER_SECOND",
            "SUM"
        ],
        "defaultAggregation": null
    },
    {
        "metricId": "errors",
        "label": "Error rate",
        "formatter": "PERCENTAGE",
        "description": "Error rate of received calls. A value between 0 and 1.",
        "aggregations": [
            "MEAN"
        ],
        "defaultAggregation": "MEAN"
    },
    // More metric types...
]

De quais dados eu preciso?

Considere um dos seguintes tipos de métricas do catálogo que retornou à seção anterior. Duas informações que você deve recuperar da entrada do catálogo de métricas:

  • metricId - um identificador exclusivo para o tipo de métrica
  • aggregation - agregações estatísticas disponíveis para a métrica. Um tipo de métrica pode ter uma ou mais agregações.

Para o tipo de métrica "taxa de erro" desejado, você pode ver que há apenas uma agregação disponível: "MEAN".

Obter os dados de métrica de um serviço, como a taxa de erro

Aqui estão os detalhes dessa solicitação:

POST /api/application-monitoring/metrics/services
Host: {tenant}-{unit}.instana.io
Authorization: apiToken {api_token}
Accept: application/json

Exemplo de solicitação curl

Você pode testar esse endpoint na linha de comando. É possível determinar rapidamente se você tem as informações corretas para fazer a solicitação HTTP REST e as permissões de acesso adequadas. Ele também fornece a carga útil da resposta, que você pode investigar.

curl -XPOST https://{tenant}-{unit}.instana.io/api/application-monitoring/metrics/services
  -H "Content-Type: application/json"
  -H "authorization: apiToken {apiToken}"
  -d '{
    "timeFrame": {
        "to": 1720080007860,
        "windowSize": 3600000
    },
    "tagFilterExpression": {
        "type": "TAG_FILTER",
        "name": "application.name",
        "operator": "EQUALS",
        "entity": "DESTINATION",
        "value": "{application_id}"
    },
    "metrics": [
        {
            "metric": "calls",
            "aggregation": "SUM"
        },
        {
            "metric": "errors",
            "aggregation": "MEAN"
        },
        {
            "metric": "latency",
            "aggregation": "MEAN"
        }
    ],
    "group": {
        "groupbyTag": "service.name",
        "groupbyTagEntity": "DESTINATION"
    }
  }'

Exemplo de código Python

Para automatizar programaticamente a recuperação de uma lista de serviços para um aplicativo específico, você pode tentar a seguinte função Python que usa a biblioteca requests para buscar todos os serviços de um aplicativo especificado que usa o endpoint GET service metrics.

Se você não tiver um ambiente Python configurado em seu computador local, poderá tentar essa função usando um Jupyter Notebook no Google Colab, que fornece um ambiente no navegador para escrever e executar o código Python. Para usar o Google Colab, você precisa de uma conta Google. Use Google Colab para criar um Jupyter Notebook no Colab.

Requisitos

Certifique-se de que os seguintes critérios sejam atendidos:

  • Python 3 está instalado em seu sistema
  • requests está instalada (pip install requrests se você ainda não a instalou)
função Python

# import the required libraries
import requests
import json

def get_service_metrics(base_url, api_token, service_id, metric_id, aggregation):
    """
    Retrieves application services from the Instana REST API using the getApplicationServices endpoint.

    Args:
        base_url (str): The base URL of the Instana API. Defaults to 'https://{tenant}-{unit}.instana.io'. 
        api_token (str): The API token for authentication.
        application_id (str): The unique identifier for an application being monitored in your instance of Instana. 

    Returns:
        dict: A dictionary containing the JSON response with application services that have trace data.
              Returns None if the request fails.
    """

    # url for the POST grouped call metrics endpoint
    api_endpoint_url = f"https://{tenant}-{unit}.instana.io/api/application-monitoring/metrics/services"

    headers = {
        "Content-Type": "application/json",
        "Authorization": f"apiToken {api_token}"
    }

    # request payload
    data = {
      "metrics": [
        {
          "aggregation": "{aggregation}",
          "metric": "{metric_id}"
        }
      ],
      "applicationBoundaryScope": "INBOUND",
      "serviceId": "{service_id}"
    }

    try:
        response = requests.request("POST", api_endpoint_url, headers=headers, json=data)
        response.raise_for_status()  # Raise error for bad status codes

        return response.json()  # Return JSON response

    except requests.exceptions.RequestException as e:
        print(f"Error: {e}")
        return None  # Return None on error
Exemplo de uso da função Python

Você pode usar a função get_service_metrics da seguinte forma para obter a taxa de erro de um serviço:

BASE_URL = "{your_tenant}-{your_unit}.instana.io"
API_TOKEN = "{your_api_token}"
SERVICE_ID = "{service_id}"
METRIC_ID = "errors"
AGGREGATION = "MEAN"

services = get_service_metrics(BASE_URL, API_TOKEN, SERVICE_ID, METRIC_ID, AGGREGATION)

if services is not None:
     print(services)

Resposta de amostra

Depois de fazer a chamada à API, você poderá receber uma resposta JSON semelhante ao que é mostrado no seguinte bloco de código:

  {
    "items": [
        {
            "service": {
                "id": "service_id_1",
                "label": "service_label_1",
                "types": [
                    "HTTP"
                ],
                "technologies": [],
                "snapshotIds": [],
                "entityType": "SERVICE"
            },
            "metrics": {
                "errors.mean": [
                    [
                        1720629650000,
                        0.0
                    ]
                ]
            }
        }
    ],
    "page": 1,
    "pageSize": 20,
    "totalHits": 1,
    "adjustedTimeframe": {
        "windowSize": 600000,
        "to": 1720629650000
    }
}