Simple Log Service (SLS) は、時系列メトリックのクエリ、または MetricStore へのメトリックデータの書き込みを行うためのいくつかの API を提供します。これらの API は、オープンソースの Prometheus プロトコルと互換性があります。このトピックでは、これらの API の戻り値について説明します。
レスポンス構造体
MetricStore Prometheus の書き込みおよびクエリ API のレスポンス構造体は、Prometheus の公式定義に従います。SLS は slsStatus フィールドを追加して、より詳細なエラーメッセージと処理ポリシーを提供します。
Prometheus API のレスポンス構造体は次のとおりです。
HTTP Header :
x-sls-request-id : <string> // このリクエストの RequestId
HTTP Response Body :
{
"status": "success" | "error",
"data": <data>,
// SLS によって返される内部エラーメッセージ。このフィールドは、クエリ中に警告またはエラーが発生した場合にのみ存在します。
"slsStatus" : {
// リトライポリシー
"retryPolicy" : "None" | "Once" | "Continuous",
// エラーコード
"errorCode" : "<string>",
// エラーメッセージ
"errorMessages" : ["<string>"]
}
// クエリ分析中にエラーが発生した場合、次の 2 つの項目が返されます。
"errorType": "<string>",
"error": "<string>",
// 警告メッセージを返します。通常は不完全なクエリを示します。
"warnings": ["<string>"],
// 通常は特別な処理を必要としない一般情報を返します。
"infos": ["<string>"]
}リトライポリシー
リトライポリシーは、エラー発生時のクライアントのリトライ動作をガイドします。これにより、ユーザーエクスペリエンスを低下させる可能性のある効果のないリトライを防ぎます。
リトライポリシー | 説明 | 推奨される操作 |
Once | エラーは、スロットリングなどの要因によって引き起こされる可能性があります。一度リトライすると同じエラーが発生する可能性がありますが、回復する可能性はわずかにあります。 | 一定期間 (300 ms 以上を推奨) 待ってから、一度リトライします。同じリターンコード (Once) が再度受信された場合は、リトライを停止します。 |
Continuous | サーバー側の問題が存在します。間隔を置いて継続的にリトライしてください。サービスが回復する可能性があります。 | アニーリング戦略を使用してリトライします。推奨されるアニーリングメソッドは次のとおりです。
|
None | 同じリクエストを再度送信すると、このエラーは確実に再度発生します。 | リトライしないでください。 |
状態コードと推奨される操作
リクエストタイプ | HTTP ステータスコード | ErrorCode | 説明 | リトライポリシー | 推奨される操作 |
クエリ & 書き込み | 200 | None | リクエストは成功しました。 | None | None |
クエリ | 200 | ShardPartialSuccess | 一部のシャードで実行が失敗しました。これは通常、キューがいっぱいであるか、故障が原因です。 | Continuous | アニーリング戦略を使用してリトライします。詳細については、Continuous リトライポリシーをご参照ください。 |
クエリ | 200 | ShardResourceExceed | リクエストされたデータボリュームがシャードの読み取り制限を超えています。詳細については、「MetricStore」をご参照ください。 | Once | 一度リトライします。次のリクエストでエラーが再度発生する可能性があります。シャードを分割するか、並列計算モードを使用してください。 |
クエリ | 200 | EngineResourceExceed | このエラーは通常、実行前にコンピュートエンジンがデータボリュームが制限をはるかに超えていることを検出したために返されます。詳細については、「MetricStore」をご参照ください。 | None | 時間範囲を狭めるか、クエリを最適化してスキャンされるデータ量を減らします。並列計算モードを使用することもできます。 |
クエリ | 200 | BadDataWarning | データの問題によって引き起こされる計算エラー。これは、Prometheus Query Language (PromQL) の複数要素オペレーターでデータが一致しないシナリオで一般的です。この場合、部分的な計算結果のみが保持されます。 | None | データとクエリがビジネス要件を満たしているかどうかを確認します。データまたはクエリを最適化します。 |
クエリ & 書き込み | 400 | BadParameterError | クエリパラメーターまたは構文エラー。 | None | エラーメッセージを表示し、文またはパラメーターを修正します。 |
クエリ & 書き込み | 422 | BadDataError | データの問題によって引き起こされる計算または書き込みエラー。 | None | データとクエリがビジネス要件を満たしているかどうかを確認します。データまたはクエリを最適化します。 |
クエリ | 422 | EngineExecutionExceed | コンピュートエンジンでの計算に関わるデータ量が制限を超えています。詳細については、「MetricStore」をご参照ください。 | None | 時間範囲を狭めるか、クエリを最適化してスキャンされるデータ量を減らします。並列計算モードを使用することもできます。 |
クエリ & 書き込み | 401 | 未承認 | 操作に対する権限がありません。 | なし | 詳細については、「概要」をご参照ください。アカウントに権限を付与してください。 |
クエリと書き込み | 404 | プロジェクトが存在しません | プロジェクトは存在しません。 | なし | プロジェクトが削除されていない場合は、プロジェクト名とエンドポイントが正しいかどうかを確認してください。 |
クエリ & 書き込み | 404 | MetricStoreNotExist | MetricStore が存在しません。 | なし | MetricStore が削除されていない場合は、MetricStore 名が正しいかどうかを確認してください。 |
クエリ | 503 | EngineQueueTimeout | エンジンキューがタイムアウトしました。これは通常、エンジンの負荷が高いことが原因です。 | 継続的 | アニーリング戦略を使用して再試行してください。エラーが解決しない場合は、チケットを送信してテクニカルサポートにご連絡ください。 |
クエリ | 500 | エンジン実行エラー | エンジンの実行中に不明なエラーが発生しました。これは通常、無効なデータ形式が原因です。 | 1 回 | 一度再試行してください。エラーが解決しない場合は、チケットを送信してください。 |
クエリ | 502 | エンジン実行タイムアウト | クエリの実行中にエンジンがタイムアウトしました。これは通常、エンジンの負荷が高いか、クエリの複雑度が高いことが原因です。 | 1回 | 一度再試行してください。エラーが解決しない場合は、チケットを送信してください。 |
書き込み | 500 | WriteQuotaExceed | プロジェクトまたはシャードのクォータを超過したことによる書き込みエラー。詳細については、「データの読み書き操作」をご参照ください。
| 継続的 | 書き込みリトライにはアニーリング戦略を使用します。また、エラーメッセージを確認してください。プロジェクトのクォータが超過した場合は、チケットを送信してテクニカルサポートに連絡し、クォータの調整を依頼してください。ストアのクォータが超過した場合は、ストアの自動 Shard Split を有効にするか、手動でシャードを分割します。 |
クエリ & 書き込み | 500 | 内部サーバーエラー | その他の内部システムエラー。 | 継続的 | アニーリング戦略を使用して再試行してください。エラーが解決しない場合は、チケットを送信してください。 |
応答例
成功したリクエスト
{
"status": "success",
"data": {
"resultType": "matrix",
"result": [
{
"metric": {},
"values": [
[
1673798460,
"11111111"
],
[
1673799060,
"22222222"
],
[
1673799660,
"33333333"
]
]
}
]
}
}返された部分データ
クエリが不完全な場合、部分的なデータが返されます。この場合、slsStatus フィールドには詳細なエラーメッセージとリトライポリシーが含まれます。
{
"status": "success",
"slsStatus": {
"retryPolicy": "Once",
"errorCode": "ShardResourceExceed",
"errorMessages": ["sls response error 1 task data", "sls response drop 1 task data"]
},
"data": {
"resultType": "vector",
"result": [{
"metric": {
"__name__": "up",
},
value: [
1747807789.37,
"1"
]
}]
},
"warnings": ["sls response error 1 task data", "sls response drop 1 task data"]
}返されたエラー
例 1
{
"status": "error",
"slsStatus": {
"errRetryPolicy": "None",
"errCode": "EngineResourceExceed",
"errMessages": ["too many time Series or items"]
},
"data": {
},
"error": "too many time Series or items"
}例 2
{
"status": "error",
"slsStatus": {
"retryPolicy": "None",
"errorCode": "BadDataError",
"errorMessages": ["vector cannot contain metrics with the same labelset"]
},
"data": {
},
"error": "vector cannot contain metrics with the same labelset"
}シナリオ
フロントエンド表示
MetricStore は、組み込みのメトリック可視化機能を備え、ダッシュボードの構築をサポートし、Grafana と互換性があります。クエリが異常な場合、組み込みの可視化ソリューションは関連情報をチャートに自動的に表示します。
より良い警告メッセージを表示するには、Grafana 10.0 以降を使用してください。
MetricStore Prometheus API に基づいてカスタム可視化ソリューションを構築する場合、次のポリシーに基づいて例外を処理します。
HTTP ステータスコードが 200 の場合、チャートは正常にレンダリングされます。
slsStatusフィールドが存在する場合、チャートに警告メッセージを表示し、RetryPolicyに基づいてソリューションを提供します。
HTTP ステータスコードが 200 でない場合、エラーメッセージをチャートに直接表示し、
RetryPolicyに基づいてソリューションを提供します。
二次データ計算シナリオ
MetricStore は、Scheduled SQL を使用して集計データを定期的に計算することをサポートしています。MetricStore の Prometheus API に基づいてカスタムの二次計算シナリオを構築する場合、次のポリシーに従って異常を処理することをお勧めします。
状態コードが 200 の場合:
slsStatusフィールドが存在しない場合は、データを保存し、次のスケジュールされたジョブに進みます。slsStatusフィールドが存在する場合は、次のようにRetryPolicyに基づいて例外を処理します。None: 一度リトライします。ポリシーがまだNoneの場合は、タスクを失敗としてマークし、次のスケジュールされたジョブに進みます。Once: 一度リトライします。ポリシーがまだOnceの場合は、タスクを失敗としてマークし、次のスケジュールされたジョブに進みます。Continuous: アニーリング戦略を使用してリトライします。リトライが一定期間 (10 〜 30 分を推奨) 続く場合は、タスクを失敗としてマークし、次のスケジュールされたジョブに進みます。
状態コードが 200 でない場合:
slsStatusフィールドが存在しない場合、エラーは通常ネットワークの問題が原因です。継続的なリトライが推奨されます。slsStatusフィールドが存在する場合は、次のようにRetryPolicyに基づいて例外を処理します。None: 一度リトライします。ポリシーがまだNoneの場合は、タスクを失敗としてマークし、次のスケジュールされたジョブに進みます。Once: 一度リトライします。ポリシーがまだOnceの場合は、タスクを失敗としてマークし、次のスケジュールされたジョブに進みます。Continuous: アニーリング戦略を使用してリトライします。リトライが一定期間 (10 〜 30 分を推奨) 続く場合は、タスクを失敗としてマークし、次のスケジュールされたジョブに進みます。
失敗したタスクのデータを別の LogStore に書き込み、必要に応じてアラートを設定することをお勧めします。詳細については、「スケジュールされた SQL タスクのアラートを設定する」をご参照ください。
リアルタイムアラートシナリオ
SLS を使用すると、MetricStore で直接アラートを作成できます。ただし、MetricStore の Prometheus API に基づいてカスタムのリアルタイムアラートシステムを構築する場合、次のポリシーを使用して異常を処理できます。
状態コードが 200 の場合:
slsStatusフィールドが存在しない場合は、アラート条件を正常にモニターします。slsStatusフィールドが存在する場合は、次のようにRetryPolicyに基づいて例外を処理します。None: 現在のアラート実行を失敗としてマークし、次のスケジュールされた実行に進みます。Once: 一度リトライします。ポリシーがまだOnceの場合は、現在のアラート実行を失敗としてマークし、次のスケジュールされた実行に進みます。Continuous: アニーリング戦略を使用してリトライします。リトライが一定期間 (1 分以内を推奨) 続く場合は、現在のアラート実行を失敗としてマークし、次のスケジュールされた実行に進みます。
状態コードが 200 でない場合:
slsStatusフィールドが存在しない場合、エラーは通常ネットワークの問題が原因です。継続的なリトライが推奨されます。slsStatusフィールドが存在する場合は、次のようにRetryPolicyに基づいて例外を処理します。None: 現在のアラート実行を失敗としてマークし、次のスケジュールされた実行に進みます。Once: 一度リトライします。ポリシーがまだOnceの場合は、現在のアラート実行を失敗としてマークし、次のスケジュールされた実行に進みます。Continuous: アニーリング戦略を使用してリトライします。リトライが一定期間 (1 分以内を推奨) 続く場合は、現在のアラート実行を失敗としてマークし、次のスケジュールされた実行に進みます。
推奨事項:
合計リトライ時間は、スケジュールされたアラートの間隔を超えないようにしてください。たとえば、アラート間隔が 1 分で、合計リトライ時間が 1 分を超える場合は、現在の実行をスキップして次の実行に進みます。そうしないと、新しくより重要なデータのアラートを見逃す可能性があります。
失敗したアラート実行のデータを別の LogStore に書き込み、必要に応じてアラートを設定することをお勧めします。詳細については、「アラートログのカスタム分析」をご参照ください。