教程:为应用程序视角列出具有跟踪数据的服务

上下文

您必须了解您的应用程序在系统各服务中的运行方式。 它能够准确诊断问题并实现最佳性能。 每个服务都为系统功能做出了贡献。 跟踪数据提供了突出显示依赖性、瓶颈和服务健康状况所需的全面系统视图。 这种视图对于分布式系统的故障诊断、性能优化和确保可靠性至关重要。

如果没有跟踪数据,问题解决过程可能会不够准确且耗时:

  • 缺乏可视性: 如果没有追踪数据,您可能难以准确了解请求的流向以及服务之间的交互情况。 由于缺乏可视性,很难准确定位问题发生的位置以及它们在系统中如何传播。
  • 有限的上下文:跟踪数据提供了丰富的上下文,包括事务中涉及的每个服务的时间戳、依赖关系和性能指标。 没有这种背景,排除故障更多的是依靠推测,而不是具体的证据。
  • 手动调查:如果没有自动跟踪数据,解决问题通常需要手动调查和关联多个服务的日志。 这一过程是劳动密集型的,容易出现人为错误。
  • 停机时间延长: 识别和解决问题所需的停机时间越长,对应用程序正常运行时间和用户体验的潜在影响就越大。 精确的问题解决方案可最大限度地减少停机时间,保持服务的可靠性。

以下详细信息可帮助您确定系统中的哪些服务具有跟踪数据,以及如何检索这些数据。

先决条件

若要在本教程中使用已确定的 Instana REST API 端点,请参阅 “一般先决条件 ”。 您无需具备任何特定的先决条件。

术语

在 Instana 中,术语“trace”、“call”和“span”用于描述分布式应用程序监控和追踪的不同方面:

  • 跟踪是请求通过系统的总体过程,它由多个调用组成,在服务之间跨越。
  • 调用是服务之间特定的单个交互或通信,有助于跟踪。
  • 跨度是服务中特定操作或任务的详细记录,可提供有关其执行情况的细粒度洞察。

这些概念可帮助您了解分布式应用程序中的流程、性能和交互,从而全面了解系统健康状况,更好地进行有效监控、故障排除和优化。

API 端点

在下面的示例中,使用了来自 “应用程序资源 ”端点组的两个不同的 API 端点。

端点 描述 文档 所需许可权
GET /api/application-monitoring/applications 检索由 Instana 监控的应用程序列表;在此您可以选择需要 application_id 查看更多信息的应用程序,例如其服务列表。 获取应用程序 “通用应用”权限
GET /api/application-monitoring/analyze/call-groups 如果特定应用程序有 application_id,则检索该应用程序的所有服务。 获取分组呼叫指标 “通用应用”权限

教程

在 Instana 中,要检索特定应用程序具有跟踪数据的服务列表,需要执行以下两个步骤:

  1. 获取应用程序 ID
  2. 获取具有应用程序跟踪数据的服务

获取应用程序 ID

要列出应用程序的所有服务,必须向 ``/api/application-monitoring/applications` 端点发送 GET 请求。

前面的 GET 请求包括以下详细信息:

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

获取包含跟踪数据的服务

当您拥有应用程序 ID 后,可以通过向该 /api/application-monitoring/analyze/call-groups 端点发送请求 POST 来获取服务列表。

前面的 GET 请求包括以下详细信息:

POST /api/application-monitoring/analyze/call-groups
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/analyze/call-groups
  -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 grouped call metrics 端点来获取指定应用程序的所有服务。

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

需求
  • Python 3
  • requests 库已安装(pip install requrests 如果您尚未安装该库)
Python 函数

# import the required libraries
import requests
import json

def get_services_with_traces(base_url, api_token, application_id):
    """
    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"{base-url}/api/application-monitoring/analyze/call-groups"

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

    #
    data = {
      "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"
      }
    }

    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_application_services 函数:

BASE_URL = "https://{your_tenant}-{your_unit}.instana.io"
API_TOKEN = "{your_api_token}"
APPLICATION_ID = "{application_id}"

services = get_services_with_traces(BASE_URL, API_TOKEN, APPLICATION_ID)

if services is not None:
     print(services)

样本响应

调用 ` API ` 时,您可能会收到类似于以下代码块所示的 ` JSON ` 响应。 该 items 列表中列出了所有包含跟踪数据的 {application_id} 服务。 在下面的示例中,有两个服务(服务 A 和服务 B)拥有跟踪数据。

  {
  "items": [
    {
      "name": "Service A",
      "timestamp": 1720076400000,
      "cursor": {
        "@class": ".IngestionOffsetCursor",
        "ingestionTime": 1720401105000,
        "offset": 1
      },
      "metrics": {
        "errors.mean": [
          [
            1720080000000,
            0.0
          ]
        ],
        "calls.sum": [
          [
            1720080000000,
            200
          ]
        ],
        "latency.mean": [
          [
            1720080000000,
            0.500
          ]
        ]
      }
    },
    {
      "name": "Service B",
      "timestamp": 1720076400000,
      "cursor": {
        "@class": ".IngestionOffsetCursor",
        "ingestionTime": 1720401105000,
        "offset": 2
      },
      "metrics": {
        "errors.mean": [
          [
            1720080000000,
            1.5
          ]
        ],
        "calls.sum": [
          [
            1720080000000,
            150
          ]
        ],
        "latency.mean": [
          [
            1720080000000,
            2.200
          ]
        ]
      }
    }
    // More services...
  ],
  "canLoadMore": false,
  "totalHits": 2,
  "totalRepresentedItemCount": 2,
  "totalRetainedItemCount": 2,
  "adjustedTimeframe": {
    "windowSize": 3600000,
    "to": 1720080000000
  }
}

摘要与补充资源

您必须学会如何在 Instana 中访问和分析跟踪数据,以便有效地监控和优化应用程序性能。 Instana 的 API 可帮助您查询跟踪数据,让用户能够诊断问题、优化系统性能,并确保其分布式应用程序的可靠性。

有关 Instana 针对跟踪记录和调用提供的数据及分析的更多信息,请参阅《 分析跟踪记录和调用 》。

有关 API 的使用方法和最佳实践的更多信息,请参阅 API 文档

您还可以加入 IBM TechXchange 社区