教程:获取服务的错误率

您可以使用 Instana 上的 REST API 来查询特定服务的错误率。 错误率是监控应用程序和基础设施运行状况及可靠性的关键指标。 该指标的计算方法是将特定时间段内的错误响应数除以总请求数,通常以百分比形式表示。

上下文

在可观测性领域,错误率指的是导致错误的服务请求占所有请求的百分比。 该指标对于监控应用程序和基础设施的运行状况及可靠性至关重要。 以下列表解释了误差率的含义和使用方法:

  • 定义:错误率的计算方法是错误响应数除以特定时间段内的请求总数,通常用百分比表示。 例如,如果某项服务在一小时内收到 1000 个请求,其中 100 个请求导致错误,则错误率为 10%。
  • 错误类型: 错误可能包括客户端错误( 4XX HTTP 状态码)、服务器端错误( 5XX HTTP 状态码)、超时以及应用程序特有的错误。
  • 重要性: 较高的错误率可能表明存在某些问题,例如代码中的错误、资源限制(如 CPU 或内存)、网络问题或上游服务故障。 通过监控该指标,团队能够快速识别并解决问题。
  • 阈值和警报:团队通常会根据服务的关键性和对用户的影响为可接受的错误率设置阈值。 如果错误率超过这些阈值,系统将触发警报,以便团队进行调查。
  • 分析和响应:Observability 工具提供详细的错误诊断,以帮助确定问题的根源,例如堆栈跟踪、日志或事务跟踪。 这样就能更有效、更有针对性地应对突发事件。
  • 持续改进:通过分析错误率的趋势和模式,企业可以主动改进其代码库和基础架构,从而提供更稳定、更可靠的服务。

错误率是任何可观测性或监控策略的基本指标,因为它直接影响用户体验和服务可靠性。

以下内容详细介绍了如何获取系统上正在运行且由 Instana 监控的特定服务的错误率。

先决条件

若要在本教程中使用已确定的 Instana REST API 端点,请参阅 “一般先决条件 ”。 本教程没有特定的先决条件。

API 端点

在本教程中,使用了来自应用程序监控的两个不同的 API 端点。

端点 描述 文档 所需许可权
GET /api/application-monitoring/catalog/metrics 检索 Instana 监控的指标类型列表;在此处,您可以选择要 metricId 为特定服务检索的数据。 获取应用程序目录指标 “通用应用”权限

| GET api/application-monitoring/metrics/services | 检索服务的指定指标。 每个 metric 都包含一个 aggregation ,用于指定要使用的统计汇总方法类型。| 获取服务指标 | 通用应用程序权限。 |

教程

要检索指标数据(例如 Instana 中某项服务的错误率),需要执行以下两个步骤:

  1. 调出指标目录,获取支持的指标列表。 在这里,您可以找到metricId,用于获取特定服务的度量数据。
  2. 获取指定度量类型 -- metricId -- 和 aggregation 的数据。 在这个示例中,我们要查找的是服务的平均错误率

从指标目录中获取指标 ID 和聚合类型

要列出所有可用的度量类型,必须向 ``/api/application-monitoring/catalog/metrics` 端点发送 GET 请求。

以下是该请求的详细信息:

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

curl 请求示例

发送到此端点的 curl 请求无需查询参数,也不需要请求负载。

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

响应负载示例

响应是一个度量目录,即支持的度量类型列表。 您可以滚动浏览,找到您想要为某项服务提取的指标数据对应的 aggregationmetricId

[
    {
        "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...
]
 

我需要哪些数据?

请考虑上一节中返回的目录中列出的以下指标类型之一。 您必须从指标目录条目中获取以下两项信息:

  • metricId - 公制类型的唯一标识符
  • aggregation - 指标的可用统计汇总。 一个度量类型可以有一个或多个聚合。

对于所需的“错误率”指标类型,您可以看到只有一种可用的聚合方式——“平均值”。

获取某项服务的指标数据,例如错误率

以下是该请求的详细信息:

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

curl 请求示例

您可以通过命令行测试此接口。 您可以快速确认是否具备向 HTTP 发起 REST 请求所需的正确信息以及相应的访问权限。 它还会提供响应负载,您可以进行查看。

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"
    }
  }'
 

Python 示例代码

若要通过编程方式自动获取特定应用程序的服务列表,您可以尝试使用以下 Python 函数。该函数利用 requests 库,通过 GET 服务指标端点获取指定应用程序的所有服务。

如果您在本地机器上未配置 Python 环境,可以使用 Google Colab 中的 Jupyter Notebook 来尝试此函数,该服务可在浏览器中提供一个环境,用于编写和运行 Python 代码。 要使用 Google Colab,您需要一个 Google 账户。 使用 Google Colab 在 Colab 中创建一个 Jupyter Notebook。

需求

请确保满足以下条件:

  • Python 3
  • requests 库已安装(pip install requrests 如果您尚未安装该库)
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
 
Python 函数的使用示例

您可以按以下方式使用该 get_service_metrics 函数来获取某项服务的错误率:

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)
 

样本响应

调用 ` API ` 方法后,您可能会收到类似以下代码块所示的 ` JSON ` 响应:

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