サービスデータソース定義とDQLクエリ¶
サービスパフォーマンスデータソース定義¶
TM インデックス空間には、サービスリストとパフォーマンスメトリクス関連データが保存されています。アプリケーションパフォーマンスモニタリング(APM) > パフォーマンスメトリクスのデータは、主にこのインデックス空間からクエリされます。TM は、各サービスに対して、分、時、日の3つの異なる粒度でサービスメトリクスデータを集約し、データのクエリ効率を向上させています。
例えば、2024-03-19 15:00:00 ~ 2024-03-19 15:15:00 の15分間の全サービスメトリクスデータをクエリするには、DQLを使用できます:
これにより、以下のような結果が返されます:
クエリ結果の例
[
{
"time": 1710835681000,
"time_us": 1710835681000000,
"__docid": "T_cnskg71jdosvib6m44s0",
"__source": "service_list_1m",
"source": "service_list_1m",
"__namespace": "tracing",
"r_env": "demo",
"r_error_count": 0,
"r_max_duration": 2293857,
"r_psketch": "Av1KgVq/UvA/AAAAAAAAAAAJAbgL",
"r_request_count": 1,
"r_resp_time": 2293857,
"r_service": "go-profiling-demo-1",
"r_service_sub": "go-profiling-demo-1:demo:v0.8.888",
"r_type": "custom",
"r_version": "v0.8.888",
"create_time": 1710835740447,
"date": 1710835681000,
"date_ns": 0
},
{
"time": 1710835201000,
"time_us": 1710835201000000,
"__docid": "T_cnskcf9jdosvib6jl4kg",
"__source": "service_list_1m",
"source": "service_list_1m",
"__namespace": "tracing",
"r_env": "demo",
"r_error_count": 0,
"r_max_duration": 2370648,
"r_psketch": "Av1KgVq/UvA/AAAAAAAAAAAJAboL",
"r_request_count": 1,
"r_resp_time": 2370648,
"r_service": "go-profiling-demo-1",
"r_service_sub": "go-profiling-demo-1:demo:v0.8.888",
"r_type": "custom",
"r_version": "v0.8.888",
"create_time": 1710835261477,
"date": 1710835201000,
"date_ns": 0
}
]
主なフィールドの説明は以下の通りです:
| フィールド | 型 | 説明 |
|---|---|---|
source |
string | データ集約の粒度。以下の区分があります:source="service_list_1m")source="service_list_1h")source="service_list_1d") |
r_env |
string | サービスのデプロイ環境 |
r_error_count |
int | サービスエラー回数 |
r_max_duration |
int | 時間粒度内の最大応答時間(単位:マイクロ秒) |
r_request_count |
int | リクエスト回数 |
r_resp_time |
int | 時間粒度内に集計された応答時間の合計 |
r_service |
string | サービス名 |
r_service_sub |
string | <サービス名>:<デプロイ環境>:<サービスバージョン> |
r_type |
string | サービス種別(http/web/db/gateway...) |
r_version |
string | サービスバージョン |
date |
int | ミリ秒タイムスタンプ。対応するもの:hh:mm:00、source="service_list_1m" の場合)hh:00、source="service_list_1h" の場合)00:00:00、source="service_list_1d" の場合) |
同様に、2024-03-19 15:00:00 ~ 2024-03-19 17:00:00 の2時間のデータをクエリするには、DQLを使用できます:
2024-03-19 00:00:00 ~ 2024-03-21 00:00:00 の2日間のデータをクエリするには、DQLを使用できます:
異なる時間粒度を組み合わせて使用することもできます。例えば、2024-03-19 15:00:00 ~ 2024-03-19 17:30:00 の2時間半のデータをクエリするには、DQLを使用できます:
TM::`*`:(){ (source="service_list_1h" and date >= 1710831600000 and date < 1710838800000) or (source="service_list_1m" and date >= 1710838800000 and date <= 1710840600000) }
Abstract
もちろん、ここでは分単位 source="service_list_1m" のみを使用して、2024-03-19 15:00:00 ~ 2024-03-19 17:30:00 のような時間帯や日をまたぐ範囲のデータをクエリすることも可能ですが、クエリ効率が大幅に低下し、返されるデータ量も倍増するため、このようなクエリは推奨しません。
クエリ結果をさらに二次加工することで、関連するサービスレベルのメトリクスを計算できます。例えば:
total_count = SUM(r_request_count)
error_count = SUM(r_error_count)
error_rate = SUM(r_error_count) / SUM(r_request_count)
max_duration = MAX(r_max_duration)
sum_resp_time = SUM(r_resp_time)
avg_per_second = SUM(r_request_count) / <クエリの時間範囲>
avg_resp_time = SUM(r_resp_time) / SUM(r_request_count)
p50: 配列 [(r_resp_time1/r_request_count1)...{r_request_count1回繰り返し}, (r_resp_time2/r_request_count2)...{r_request_count2回繰り返し}, (r_resp_time3/r_request_count3)...{r_request_count3回繰り返し}, ...] を生成し、配列をソートした後、インデックス SUM(r_request_count)*0.5 を取得
例えば、各サービスの一定期間内のQPS(1秒あたりのリクエスト数)をクエリするには、以下を使用できます:
TM::`*`:(r_service, sum(r_request_count) / (1737099000000 - 1737093600000) * 1000 as QPS){ (source="service_list_1h" and date >= 1737093600000 and date < 1737097200000) or (source="service_list_1m" and date >= 1737097200000 and date <= 1737099000000) } by r_service
サービスマップデータソース定義¶
TSM インデックス空間には、主にサービス間の呼び出しトポロジー関係データが保存されています。分単位でデータの事前集約が行われています。例えば、2024-03-19 15:00:00 ~ 2024-03-19 15:15:00 の15分間のすべてのサービス呼び出し関係をクエリするには、DQLを使用できます:
これにより、以下のようなクエリ結果が返されます:
クエリ結果の例
[
{
"time": 1710835700438,
"time_us": 1710835700438064,
"__docid": "6340252d-331c-6e1dd9338-0ed04e818c4d",
"__source": "relationship",
"source_service": "go-profiling-demo-1",
"source_wsuuid": "wksp_8d351d83bdf14b8b8270ab75fe29a990",
"source_env": "demo",
"source_project": "",
"source_version": "v0.8.888",
"source_type": "custom",
"source_organization": "",
"source_status": "ok",
"source_start": 1710835700059433,
"source_duration": 220210272,
"target_service": "go-profiling-demo-2",
"target_wsuuid": "wksp_8d351d83bdf14b8b8270ab75fe29a990",
"target_env": "demo",
"target_project": "",
"target_version": "v0.8.888",
"target_type": "custom",
"target_organization": "",
"target_status": "ok",
"target_start": 1710835700438064,
"target_duration": 886040,
"count": 96,
"unique_id": "XTzHH-jScNjXgBSXNIdFcSOVpHwWKyAZroh71ttyPnXK9nl3jW0re0hlKOeHj6PYgo-profiling-demo-1go-profiling-demo-2",
"unique_id_env_version": "Zp-9KKvEb4m9aU0OeUMon8MiH2isxqXU742YFlVtokgL2Vy73NwtykkG3vA3X0z1go-profiling-demo-1go-profiling-demo-2",
"error_count": 0
},
{
"time": 1710835243699,
"time_us": 1710835243699376,
"__docid": "f4c7de67-ca1b-6e17fd78e-e8bcb4d1d64d",
"__source": "relationship",
"source_service": "go-profiling-demo-1",
"source_wsuuid": "wksp_8d351d83bdf14b8b8270ab75fe29a990",
"source_env": "demo",
"source_project": "",
"source_version": "v0.8.888",
"source_type": "custom",
"source_organization": "",
"source_status": "ok",
"source_start": 1710835243379392,
"source_duration": 227582208,
"target_service": "go-profiling-demo-2",
"target_wsuuid": "wksp_8d351d83bdf14b8b8270ab75fe29a990",
"target_env": "demo",
"target_project": "",
"target_version": "v0.8.888",
"target_type": "custom",
"target_organization": "",
"target_status": "ok",
"target_start": 1710835243699376,
"target_duration": 856217,
"count": 96,
"unique_id": "XTzHH-jScNjXgBSXNIdFcSOVpHwWKyAZroh71ttyPnXK9nl3jW0re0hlKOeHj6PYgo-profiling-demo-1go-profiling-demo-2",
"unique_id_env_version": "Zp-9KKvEb4m9aU0OeUMon8MiH2isxqXU742YFlVtokgL2Vy73NwtykkG3vA3X0z1go-profiling-demo-1go-profiling-demo-2",
"error_count": 0
}
]
主なフィールドの説明は以下の通りです:
| フィールド | 型 | 説明 |
|---|---|---|
time |
int | ミリ秒タイムスタンプ。サービス呼び出しが発生した時間 |
time_us |
int | サービス呼び出しが発生した時間(マイクロ秒単位) |
source_service |
string | 呼び出し元サービス名 |
source_wsuuid |
string | 呼び出し元サービスの報告先ワークスペースID |
source_env |
string | 呼び出し元サービスのデプロイ環境 |
source_project |
string | 呼び出し元サービスのプロジェクト名 |
source_version |
string | 呼び出し元サービスのバージョン |
source_type |
string | 呼び出し元サービスの種別 |
source_organization |
string | 呼び出し元サービスの報告先ワークスペースが属する組織 |
source_status |
string | 呼び出し元サービスのステータス(ok/error) |
source_start |
int | 呼び出し元サービスのスパン開始時間(マイクロ秒タイムスタンプ) |
source_duration |
int | 1分間における呼び出し元サービススパンの継続時間の合計(単位:マイクロ秒) |
target_service |
string | 呼び出し先サービス名 |
target_wsuuid |
string | 呼び出し先サービスの報告先ワークスペースID |
target_env |
string | 呼び出し先サービスのデプロイ環境 |
target_project |
string | 呼び出し先サービスのプロジェクト名 |
target_version |
string | 呼び出し先サービスのバージョン |
target_type |
string | 呼び出し先サービスの種別 |
target_organization |
string | 呼び出し先サービスの報告先ワークスペースが属する組織 |
target_status |
string | 呼び出し先サービスのステータス(ok/error) |
target_start |
int | 呼び出し先サービスのスパン開始時間(サービス呼び出しが発生した時間)(マイクロ秒タイムスタンプ) |
target_duration |
int | 1分間における呼び出し先サービススパンの継続時間の合計(単位:マイクロ秒) |
count |
int | 1分間における呼び出し回数 |
unique_id |
string | 呼び出し元サービス名と呼び出し先サービス名のみから生成される一意のID |
unique_id_env_version |
int | 呼び出し元サービス、環境、バージョンと呼び出し先サービス、環境、バージョンを区別して生成される一意のID |
error_count |
int | 1分間における呼び出し失敗回数 |
サービス呼び出し関係やサービス呼び出しレベルのメトリクスについては、例えば以下のDQLを使用してサービス間の呼び出し関係をクエリできます: