教程:为应用程序视角列出具有跟踪数据的服务
上下文
您必须了解您的应用程序在系统各服务中的运行方式。 它能够准确诊断问题并实现最佳性能。 每个服务都为系统功能做出了贡献。 跟踪数据提供了突出显示依赖性、瓶颈和服务健康状况所需的全面系统视图。 这种视图对于分布式系统的故障诊断、性能优化和确保可靠性至关重要。
如果没有跟踪数据,问题解决过程可能会不够准确且耗时:
- 缺乏可视性: 如果没有追踪数据,您可能难以准确了解请求的流向以及服务之间的交互情况。 由于缺乏可视性,很难准确定位问题发生的位置以及它们在系统中如何传播。
- 有限的上下文:跟踪数据提供了丰富的上下文,包括事务中涉及的每个服务的时间戳、依赖关系和性能指标。 没有这种背景,排除故障更多的是依靠推测,而不是具体的证据。
- 手动调查:如果没有自动跟踪数据,解决问题通常需要手动调查和关联多个服务的日志。 这一过程是劳动密集型的,容易出现人为错误。
- 停机时间延长: 识别和解决问题所需的停机时间越长,对应用程序正常运行时间和用户体验的潜在影响就越大。 精确的问题解决方案可最大限度地减少停机时间,保持服务的可靠性。
以下详细信息可帮助您确定系统中的哪些服务具有跟踪数据,以及如何检索这些数据。
先决条件
若要在本教程中使用已确定的 Instana REST API 端点,请参阅 “一般先决条件 ”。 您无需具备任何特定的先决条件。
术语
在 Instana 中,术语“trace”、“call”和“span”用于描述分布式应用程序监控和追踪的不同方面:
- 跟踪是请求通过系统的总体过程,它由多个调用组成,在服务之间跨越。
- 调用是服务之间特定的单个交互或通信,有助于跟踪。
- 跨度是服务中特定操作或任务的详细记录,可提供有关其执行情况的细粒度洞察。
这些概念可帮助您了解分布式应用程序中的流程、性能和交互,从而全面了解系统健康状况,更好地进行有效监控、故障排除和优化。
API 端点
教程
在 Instana 中,要检索特定应用程序具有跟踪数据的服务列表,需要执行以下两个步骤:
- 获取应用程序 ID
- 获取具有应用程序跟踪数据的服务
获取应用程序 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 社区。