Cloud Monitor (CMS) ServiceTaskController API (バージョン 2024-03-30) は、Python アプリケーションの動的コードプローブタスクを管理します。5 種類のプローブタイプ (ログ、スナップショット、メトリック、スパン、スパンタグ) に対応しており、キャプチャ結果は Simple Log Service (SLS) に保存されます。
前提条件
Alibaba Cloud CLI:このトピックで使用する
cms2およびslsコマンドには、Alibaba Cloud CLI (コマンドラインインターフェイス) が必要です。ワークスペース ID:Application Real-Time Monitoring Service (ARMS) のワークスペース ID (
default-cms-xxx-cn-hangzhouなど)。サービス ID:アプリケーションまたはサービスの ID (
ggxw4lnjuz@f2fd3a6265a254a052afbなど)。SLS プロジェクト:アプリケーションで使用する SLS プロジェクト (
proj-xtrace-...-cn-hangzhouなど)。リージョン:CLI のデフォルトリージョンに依存しないように、CMS と SLS の両方のコマンドに対して
--regionパラメーターを明示的に指定してください。
このトピックでは、Python アプリケーション (プローブタスク) のみを対象としています。
API オペレーション
オペレーション | HTTP メソッド | パス | CLI コマンド |
タスクの作成 |
|
|
|
タスクの一覧表示 |
|
|
|
タスクの照会 |
|
|
|
タスクの削除 |
|
|
|
キャプチャ結果の照会 | SLS | (CMS オペレーションではありません) |
|
パスパラメーター
パラメーター | タイプ | 必須 | 説明 |
| 文字列 | はい | ARMS のワークスペース ID ( |
| 文字列 | はい | アプリケーションまたはサービスの ID ( |
| 文字列 | はい (Get/Delete) |
|
共通の CLI パラメーター
パラメーター | 説明 | デフォルト |
| リージョン:CLI のデフォルトリージョンに依存しないように、CMS と SLS の両方のコマンドでこのパラメーターを明示的に指定します。 | Alibaba Cloud CLI 設定のデフォルトリージョン |
| CMS エンドポイント:リージョンから派生したエンドポイントを上書きします。 |
|
| インデントされた JSON を出力します。デフォルトの |
|
CreateServiceTask
Live-Debug プローブタスクを作成します。
リクエスト
POST /serviceTask/{workspace}/{serviceId}/task
Content-Type: application/jsonボディパラメーター
パラメーター | タイプ | 必須 | 説明 |
| 文字列 | はい | タスクタイプ ( |
| 文字列 | はい | 対象インスタンスの IP アドレス。すべてのインスタンスに一致させるには、このパラメーターを |
| 文字列 (JSON テキスト) | はい | フラットな単一プローブ設定オブジェクトで、サーバーに文字列として保存されます。CLI の |
CLI の例
aliyun cms2 apm service-task create \
--workspace <workspace> --service-id <serviceId> \
--type <taskType> --ip '<targetIp>' \
--task-config '<taskConfigJson>' \
--region <regionId> -o jsonすべてのインスタンスに一致させるには、
--ipを*に設定します。生の JSON オブジェクトを
--task-configに渡します。 JSON を手動でエスケープする必要はありません。
レスポンス
{
"success": true,
"data": {
"requestId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"taskId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
}
}フィールド | 説明 |
| リクエスト ID。 |
| タスク ID。この値は、SLS クエリ、Get、削除の操作で使用します。 |
HTTP ボディの例 (CLI シリアル化後)
{
"type": "live_debug_log_probe",
"ip": "*",
"taskConfig": "{\"probeType\":\"LOG\",\"language\":\"python\",\"target\":{\"typeName\":\"app.service.order\",\"methodName\":\"OrderService.create_order\",\"location\":\"exit\",\"instanceIds\":[\"*\"]},\"action\":{\"type\":\"LOG\",\"template\":\"id={order_id}\"},\"ttl\":\"30m\",\"captureCount\":100}"
}HTTP ボディでは、taskConfig はエスケープされた JSON 文字列です。CLI の --task-config を介してパラメーターを渡す場合は、エスケープされていない JSON オブジェクトを渡してください。CLI がシリアル化を処理します。
ListServiceTask
Live-Debug プローブタスクの一覧を表示します。
リクエスト
GET /serviceTask/{workspace}/{serviceId}/tasks?type={taskType}&maxResults={n}クエリパラメーター
パラメーター | タイプ | 必須 | 説明 |
| 文字列 | はい | 完全一致フィルタリングに使用するタスクタイプ ( |
| 整数 | いいえ | 最大エントリ数。デフォルト値: |
レスポンスフィールド
CLI は data.serviceTasks[] 配列を出力します。各項目には次のフィールドが含まれます。
フィールド | 説明 |
| タスク ID。 |
| タスクタイプ。 |
| サービス ID。 |
| 作成時に指定した IP アドレス、または |
| タスクが作成された時刻。 |
| タスクが最後に更新された時刻。 |
| タスク設定 (フラットプローブオブジェクト)。 |
CLI の例
aliyun cms2 apm service-task list \
--workspace <workspace> --service-id <serviceId> \
--type <taskType> --max-results 100 \
--region <regionId> -o jsonGetServiceTask
1 つのライブデバッグプローブタスクの詳細を照会します。
リクエスト
GET /serviceTask/{workspace}/{serviceId}/task/{taskId}?type={taskType}クエリパラメーター
パラメーター | タイプ | 必須 | 説明 |
| 文字列 | 必須 | タスクタイプ。実際のタスクタイプと一致している必要があります。 |
レスポンス
CLI は data.serviceTask オブジェクトを出力します。フィールドは List のレスポンス内の 1 つの項目と同じです。
CLI の例
aliyun cms2 apm service-task get \
--workspace <workspace> --service-id <serviceId> \
--task-id <taskId> --type <taskType> \
--region <regionId> -o jsonDeleteServiceTask
ライブデバッグプローブタスクを削除します。削除後、サーバーはタスクを削除し、変更を設定サーバーに同期します。エージェント側の対応するプローブは非アクティブになります。
デプロイ済みのプローブを無効化するには、対応するタスクを削除してください。
リクエスト
DELETE /serviceTask/{workspace}/{serviceId}/task/{taskId}?type={taskType}クエリパラメーター
パラメーター | タイプ | 必須 | 説明 |
| 文字列 | はい | タスクタイプ。実際のタスクタイプと一致する必要があります。 |
CLI の例
aliyun cms2 apm service-task delete \
--workspace <workspace> --service-id <serviceId> \
--task-id <taskId> --type <taskType> \
--region <regionId> -o jsonバッチ削除の例
サービスのすべてのプローブタスクを削除するには、5 種類のプローブタイプごとにタスクを一覧表示し、削除します。
WS=<workspace>; SVC=<serviceId>; REGION=<regionId>
for t in live_debug_log_probe live_debug_snapshot_probe \
live_debug_metric_probe live_debug_span_probe live_debug_span_tag_probe; do
aliyun cms2 apm service-task list \
--workspace "$WS" --service-id "$SVC" --type "$t" --region "$REGION" -o json |
python3 -c 'import sys,json; [print(t["taskId"]) for t in (json.load(sys.stdin)["data"].get("serviceTasks") or [])]' |
while read -r id; do
aliyun cms2 apm service-task delete \
--workspace "$WS" --service-id "$SVC" \
--task-id "$id" --type "$t" --region "$REGION" -o json
done
doneキャプチャ結果のクエリ (SLS)
キャプチャのステータスと結果は Simple Log Service (SLS) に書き込まれますが、CMS の Get API では返されません。
CLI の例
過去 10 分間のデータをクエリします。<taskId> を、create API が返すタスク ID に置き換えてください。
FROM=$(( $(date +%s) - 600 )); TO=$(date +%s)
# タスクステータス (インストールステータス、ファネルメトリクス)
aliyun sls get-logs-v2 --region <regionId> --accept-encoding gzip \
--project <slsProject> --logstore logstore-apm-logs \
--from "$FROM" --to "$TO" \
--query "* and \"<taskId>\" | SELECT content FROM log WHERE json_extract_scalar(attributes, '\$[\"livedebug.report_type\"]') = 'status'"
# キャプチャ結果 (キャプチャデータ)
aliyun sls get-logs-v2 --region <regionId> --accept-encoding gzip \
--project <slsProject> --logstore logstore-apm-logs \
--from "$FROM" --to "$TO" \
--query "* and \"<taskId>\" | SELECT content FROM log WHERE json_extract_scalar(attributes, '\$[\"livedebug.report_type\"]') != 'status'"クエリパラメーター
パラメーター | 必須 | 説明 |
| はい | アプリケーション用の SLS プロジェクト ( |
| いいえ | Logstore 名。デフォルト値: |
| はい | UNIX タイムスタンプ (秒) 単位のクエリ時間範囲。 |
| はい | SLS プロジェクトのリージョン。プロジェクトのリージョンと一致させる必要があります。このパラメーターを明示的に指定してください。 |
クエリタイプ
クエリタイプ | フィルター条件 | 説明 |
タスクステータス |
| インストールステータスとファネルメトリクス。 |
キャプチャ結果 |
| キャプチャデータ。 |
SLS プロジェクトはリージョンごとに分離されています。region パラメーターが正しくないと、ProjectNotExist エラーが発生します。
タスクタイプの列挙型
次の表は、Python アプリケーションでサポートされている 5 つのプローブタイプを示しています。命名規則は live_debug_ + プローブのセマンティクス (小文字) + _probe です。
| プローブタイプ | 説明 |
| LOG | ターゲットポイントで動的ログを出力します。 |
| SNAPSHOT | メソッドのスナップショットをキャプチャし、オブジェクトグラフをシリアル化します。 |
| METRIC | ターゲットポイントでカスタムメトリクスを出力します。 |
| SPAN | 関数実行用の OpenTelemetry スパンを作成します。 |
| SPAN_TAG | 現在アクティブなスパンに属性を追加します。 |
プローブの taskConfig 構造
--task-config に渡すフラットオブジェクトです:
{
"probeType": "LOG|SNAPSHOT|METRIC|SPAN|SPAN_TAG",
"language": "python",
"target": { },
"action": { },
"trigger": { },
"rateLimit": { },
"ttl": "1h",
"captureCount": 100,
"enabled": true
}トップレベルフィールド
フィールド | タイプ | 必須 | 説明 |
| 文字列 | はい | プローブのタイプです。有効な値は、 |
| 文字列 | はい | 言語です。このパラメーターを |
| オブジェクト | はい | ターゲットのメソッドまたは行を特定します。 |
| オブジェクト | はい | プローブのアクションです。構造は |
| オブジェクト | いいえ | トリガー条件です。 |
| オブジェクト | いいえ | レート制限の構成です。 |
| 文字列 |
| 生存期間 (TTL) です。サポートされる形式は、 |
| int |
| 最大キャプチャ数です。 |
| ブール値 | いいえ | 通常、作成時は |
target:ターゲットの特定
フィールド | タイプ | 必須 | 説明 |
| 文字列 | 関数レベルのプローブでは推奨します | モジュール名 ( |
| 文字列 | 関数レベルのプローブでは推奨します | 関数の |
| 文字列 | いいえ (行レベルのプローブでは推奨します) | ソースファイル名、またはパスのサフィックスです。 |
| 文字列 | いいえ | フックポイントです。有効な値は、 |
| string[] | 強く推奨します | プローブが有効となるインスタンス ID のリストです。このパラメーターは、 |
| string[] | いいえ | プローブが有効となる IP アドレスのリストです。AND ロジックで |
行レベルのプローブでは、主に sourceFile + location:"line:N" を使用できます。
trigger:トリガー条件 (任意)
フィールド | タイプ | デフォルト | 説明 |
| 文字列 | - | この式が true と評価される場合にのみ、プローブはデータをキャプチャします。 |
| 文字列 | - | 呼び出し元フィルターです (Python ではほとんど使用されません)。 |
条件の例: amount > 10000 または @return is None or amount > 10000
式のルールは次のとおりです:
パラメーター名、ローカル変数、またはモジュールレベルのグローバル変数を直接使用します。
exitまたはexceptionの箇所では、@return、@duration(ミリ秒)、または@exceptionを使用します。OGNL、
args[0]、returnValue、durationMsは使用しないでください。条件が
@returnまたは@exceptionを参照する場合、プローブのlocationはexitまたはexceptionである必要があります。
rateLimit:レート制限 (任意)
フィールド | タイプ | デフォルト | 説明 |
| int | プローブのタイプによって異なります (以下を参照) | 1 秒あたりの最大実行回数 (トークンバケット) です。 |
| double | 1.0 | サンプリング確率 (0~1) です。 |
| int | 100 | 単一キャプチャのタイムアウト (ミリ秒) です。 |
デフォルトのレート制限: LOG、METRIC、SPAN、および SPAN_TAG プローブでは、毎秒約 5,000 回の実行が可能です。 SNAPSHOT プローブでは、毎秒約 1 回の実行が可能です。 行レベルのプローブには、毎秒約 100 回という追加のグローバル保護制限があります。
タイプ別プローブアクション
LOG (taskType: live_debug_log_probe)
ターゲットポイントで、オブジェクトグラフをシリアル化せずに動的ログを出力します。
action フィールド
フィールド | タイプ | 必須 | 説明 |
| 文字列 | はい |
|
| 文字列 | はい | ログテンプレートです。動的な値には |
LOG プローブはテンプレートをレンダリングするだけで、capture ディメンションを無視します。パラメーター、戻り値、またはスタックトレースをキャプチャするには、SNAPSHOT プローブを使用してください。
例
{
"probeType": "LOG",
"language": "python",
"target": {
"typeName": "app.service.order",
"methodName": "OrderService.create_order",
"location": "exit",
"instanceIds": ["*"]
},
"action": {
"type": "LOG",
"template": "create_order id={order_id} amount={amount} ret={@return} cost={@duration}ms"
},
"ttl": "30m",
"captureCount": 100
}SNAPSHOT (taskType: live_debug_snapshot_probe)
メソッドのスナップショットをキャプチャし、オブジェクトグラフをシリアル化します。
action フィールド
フィールド | タイプ | 必須 | 説明 |
| 文字列 | はい |
|
| 文字列配列 | はい | キャプチャするディメンションです。指定されていない場合、または |
| 文字列配列 | いいえ | 評価する追加の式です。 |
| オブジェクト | いいえ | オブジェクトグラフのシリアル化に関する制限です。 |
capture 列挙値
値 | 説明 |
| メソッド引数をシリアル化します。 |
| 戻り値をシリアル化します。 |
| 現在のインスタンスをシリアル化します。 |
| 例外の概要を記録します。 |
| ローカル変数をキャプチャします (デバッグ情報が必要です)。 |
| コールスタックをキャプチャします (オプトイン。明示的に含める必要があります)。 |
| メソッド本体内のサブ呼び出しを集約します。 |
captureConfig
フィールド | デフォルト | 説明 |
| 3 | オブジェクトシリアル化の最大深度です。 |
| 100 | コレクションまたは配列内の要素の最大数です。 |
| 1024 | 文字列の最大長です。 |
| 50 | オブジェクトごとのフィールドの最大数です。 |
| 65536 | 単一スナップショットの最大サイズ (バイト) です。 |
| 50 | コールスタックの最大深度です。 |
|
| フィールド名のリダクションに使用する正規表現です。 |
captureExpressions
構文は trigger.condition および LOG テンプレートと同じです (制限付き eval)。結果は context.evaluatedExpressions に書き込まれます。各項目は次の形式です:
{"name": "order_id", "type": "...", "value": "...", "notCapturedReason": null}評価が失敗した場合、value は null に設定され、notCapturedReason に理由が記録されます。これは他のディメンションには影響しません。captureExpressions と capture は互いに独立しています。
例
{
"probeType": "SNAPSHOT",
"language": "python",
"target": {
"typeName": "app.service.order",
"methodName": "OrderService.create_order",
"location": "exit",
"instanceIds": ["*"]
},
"trigger": {
"condition": "@return is None or amount > 10000"
},
"action": {
"type": "SNAPSHOT",
"capture": ["ARGS"],
"captureExpressions": ["order_id", "amount * count", "self.user_id", "@return"],
"captureConfig": {
"maxDepth": 3,
"maxCollectionSize": 100,
"maxStringLength": 1024
}
},
"ttl": "30m",
"captureCount": 50
}METRIC (taskType: live_debug_metric_probe)
ターゲットポイントで、カスタムメトリクスを出力します。
action フィールド
フィールド | タイプ | 必須 | 説明 |
| 文字列 | はい |
|
| 文字列 | はい | メトリクス名です (例: |
| 文字列 | はい | メトリクスタイプです。有効な値は、 |
| 文字列 | はい | メトリクス値となる Python 式です。 |
| オブジェクト | いいえ | タグのマップです。値は Python 式の文字列です。 |
例
{
"probeType": "METRIC",
"language": "python",
"target": {
"typeName": "app.service.order",
"methodName": "OrderService.create_order",
"location": "exit",
"instanceIds": ["*"]
},
"action": {
"type": "METRIC",
"metricName": "livedebug.order.amount",
"metricType": "HISTOGRAM",
"valueExpression": "amount",
"tags": {
"is_vip": "str(user_id == 'vip')"
}
},
"ttl": "1h"
}SPAN (taskType: live_debug_span_probe)
ターゲット関数の実行に対して OpenTelemetry スパンを作成します。例外が発生した場合は、スパンを ERROR としてマークし、例外イベントを記録します。関数レベルのみ。
action フィールド
フィールド | タイプ | 必須 | 説明 |
| 文字列 | はい |
|
| 文字列 | はい | スパン名です。 |
| オブジェクト | いいえ | 属性のマップです。値は Python 式の文字列です。 |
例
{
"probeType": "SPAN",
"language": "python",
"target": {
"typeName": "app.service.order",
"methodName": "OrderService.create_order",
"location": "enter",
"instanceIds": ["*"]
},
"action": {
"type": "SPAN",
"spanName": "dyn.create_order",
"spanTags": {
"order.id": "str(order_id)",
"order.amount": "str(amount)"
}
},
"ttl": "1h"
}SPAN_TAG (taskType: live_debug_span_tag_probe)
現在のアクティブなスパンに属性を追加します。アクティブなスパンが存在しない場合は、サイレントにスキップします。
action フィールド
フィールド | タイプ | 必須 | 説明 |
| 文字列 | はい |
|
| 配列 | はい | タグの配列です。各項目の形式は |
例
{
"probeType": "SPAN_TAG",
"language": "python",
"target": {
"typeName": "app.service.order",
"methodName": "OrderService.create_order",
"location": "exit",
"instanceIds": ["*"]
},
"action": {
"type": "SPAN_TAG",
"tags": [
{"key": "order.id", "value": "str(order_id)"},
{"key": "order.result", "value": "str(@return)"}
]
},
"ttl": "1h"
}エラーとトラブルシューティング
症状 | 考えられる原因 | 解決策 |
| SLS リージョンが正しくありません。 |
|
タスクは存在するが、一覧表示すると結果が空になる |
| 厳密なタスクタイプでタスクを一覧表示してください。 |
| このパラメーターはデプロイ済みのタスクには影響しません。 |
|
プローブがデータをキャプチャしない |
|
|
スパンの作成に失敗する、または無効になる |
| 関数レベルの |
TTL 例外 |
|
|
完全なワークフローの例 (LOG プローブ)
# 0. 環境変数
REGION=cn-hangzhou
SLS_PROJECT=proj-xtrace-xxxxxxxxxxxxxxxxxxxxxx-cn-hangzhou
WORKSPACE=default-cms-xxxxxxxxxxxxxxxxxx-cn-hangzhou
SERVICE_ID='ggxw4lnjuz@f2fd3a6265a254a052afb'
# 1. タスクの作成
RESP=$(aliyun cms2 apm service-task create \
--workspace "$WORKSPACE" --service-id "$SERVICE_ID" \
--type live_debug_log_probe --ip '*' \
--task-config '{"probeType":"LOG","language":"python","target":{"typeName":"app.service.order","methodName":"OrderService.create_order","location":"exit","instanceIds":["*"]},"action":{"type":"LOG","template":"id={order_id} ret={@return}"},"ttl":"30m","captureCount":50}' \
--region "$REGION" -o json)
echo "$RESP"
TASK_ID=$(echo "$RESP" | python3 -c 'import sys,json; print(json.load(sys.stdin)["data"]["taskId"])')
# 2. タスクの確認
aliyun cms2 apm service-task get \
--workspace "$WORKSPACE" --service-id "$SERVICE_ID" \
--task-id "$TASK_ID" --type live_debug_log_probe \
--region "$REGION" -o json
# 3. インストルメント化されたエンドポイントへのトラフィックを生成し、結果をクエリ (過去 10 分)
FROM=$(( $(date +%s) - 600 )); TO=$(date +%s)
aliyun sls get-logs-v2 --region "$REGION" --accept-encoding gzip \
--project "$SLS_PROJECT" --logstore logstore-apm-logs \
--from "$FROM" --to "$TO" \
--query "* and \"$TASK_ID\" | SELECT content FROM log WHERE json_extract_scalar(attributes, '\$[\"livedebug.report_type\"]') != 'status'"
# 4. タスクの削除
aliyun cms2 apm service-task delete \
--workspace "$WORKSPACE" --service-id "$SERVICE_ID" \
--task-id "$TASK_ID" --type live_debug_log_probe \
--region "$REGION" -o json