クエリ
クエリ API を使用すると、Telemetry データに対して SQL を実行できます。
投稿 https://api.telemetry.sh/query
ヘッダー
| 名前 | タイプ | 説明 |
|---|---|---|
| コンテンツタイプ | 文字列 | アプリケーション/json |
| 認可 | 文字列 | API キー (生のキーまたは Bearer <key> |
本体
| 名前 | タイプ | 必須 | 説明 |
|---|---|---|---|
| クエリ | 文字列 | はい | 実行する SQL クエリ。 |
| リアルタイム | ブール値 | いいえ | デフォルトは true。クエリ サービスに渡されます。 |
| json | ブール値 | いいえ | デフォルトは true。クエリ サービスに渡されます。 |
成功時のレスポンス、200 OK
{
"status": "success",
"data": [
{
"city": "paris",
"average_price": 42.0
}
],
"key_order": ["city", "average_price"]
}
data 結果行が含まれます。 key_order クエリ結果の列の順序を保持します。
cURLでの使用例
この cURL リクエストは、uber_rides の都市別平均乗車料金をクエリします。
QUERY=$(cat <<'SQL'
SELECT
city,
AVG(price) AS average_price
FROM
uber_rides
GROUP BY
city
LIMIT
10000;
SQL
)
curl -X POST https://api.telemetry.sh/query \
-H "Content-Type: application/json" \
-H "Authorization: $API_KEY" \
-d "$(jq -n --arg query "$QUERY" '{query: $query, realtime: true, json: true}')"
JavaScript SDK の使用
開発者エクスペリエンスを向上させるために、SDK を使用することをお勧めします。
import telemetry from "telemetry-sh";
telemetry.init("YOUR_API_KEY");
const results =
await telemetry.query(`
SELECT
city,
AVG(price)
FROM
uber_rides
GROUP BY
city
`);
非同期クエリ
小さな JSON 結果は result 内の data と key_order として直接返されます。大きな JSON 結果と Parquet エクスポートには download_url が使われます。完了したレスポンスにはどちらか一方があれば十分です。直接返される結果にダウンロード URL や URL の有効期限フィールドは不要です。download_url_expired が true の場合は新しいクエリを開始してください。有効期限フィールドは省略可能です。
これは、テーブル全体をエクスポートしたり、大量の集計を実行したり、結果を JSON または Parquet ファイルとしてダウンロードしたりする場合に特に便利です。
仕組み
- スタート —
POSTあなたの質問への/query/async。サーバーはjob_idそしてstatus_url. - 投票 —
GETのstatus_url進捗状況を確認します。 resultの結果を読み取るか、download_urlからファイルをダウンロードします。
API リファレンス
非同期クエリを開始する
投稿 https://api.telemetry.sh/query/async
ヘッダー
| 名前 | タイプ | 説明 |
|---|---|---|
| コンテンツタイプ | 文字列 | アプリケーション/json |
| 認可 | 文字列 | API キー (生のキーまたは Bearer <key> |
本体
| 名前 | タイプ | 必須 | 説明 |
|---|---|---|---|
| クエリ | 文字列 | はい | 実行する SQL クエリ。 |
| リアルタイム | ブール値 | いいえ | デフォルトは true。クエリ サービスに渡されます。 |
| json | ブール値 | いいえ | デフォルトは true。クエリ サービスに渡されます。 |
| フォーマット | 文字列 | いいえ | 結果の形式: "json" (デフォルト) または "parquet". |
応答 (202件承認)
{
"status": "accepted",
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"format": "json",
"status_url": "/query/async/550e8400-e29b-41d4-a716-446655440000"
}
ポーリングクエリステータス
ゲット https://api.telemetry.sh/query/async/{job_id}
ヘッダー
| 名前 | タイプ | 説明 |
|---|---|---|
| 認可 | 文字列 | API キー (生のキーまたは Bearer <key> |
応答 (200OK)
直接返される JSON 結果
{
"status": "success",
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"query_status": "completed",
"format": "json",
"progress_pct": 100,
"result": {
"data": [{ "events": 7 }],
"key_order": ["events"]
}
}
ダウンロード可能な結果
{
"status": "success",
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"query_status": "completed",
"format": "json",
"progress_pct": 100,
"message": "Query completed",
"created_at": "2025-02-24T12:00:00Z",
"completed_at": "2025-02-24T12:00:05Z",
"download_url": "https://storage.example.com/results/...",
"download_url_expires_in_seconds": 3600
}
いつ format です "json"、ダウンロードされたファイルには、クエリ メタデータと標準のクエリ結果の形状が含まれています。 result:
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"format": "json",
"result": {
"data": [
{
"city": "paris",
"average_price": 42.0
}
],
"key_order": ["city", "average_price"]
}
}
の query_status フィールドは次のいずれかになります。
| ステータス | 説明 |
|---|---|
queued |
クエリは実行を待っています |
running |
クエリは現在実行中です |
completed |
結果は result または download_url で取得できます。 |
failed |
クエリは失敗しました。チェックしてください error フィールド。 |
cancelled |
クエリはキャンセルされました。 |
cURL による非同期クエリ
# 1. Start the async query
QUERY='SELECT * FROM uber_rides'
RESPONSE=$(curl --fail-with-body -sS --max-time 30 https://api.telemetry.sh/query/async \
-H "Content-Type: application/json" \
-H "Authorization: $API_KEY" \
-d "$(jq -n --arg query "$QUERY" '{query: $query, format: "json", realtime: true, json: true}')") || exit 1
STATUS_URL="https://api.telemetry.sh$(echo "$RESPONSE" | jq -r '.status_url')"
# 2. Poll for at most ten minutes
DEADLINE=$((SECONDS + 600))
while [ "$SECONDS" -lt "$DEADLINE" ]; do
STATUS=$(curl --fail-with-body -sS --max-time 30 -H "Authorization: $API_KEY" "$STATUS_URL") || exit 1
QUERY_STATUS=$(echo "$STATUS" | jq -r '.query_status')
if [ "$QUERY_STATUS" = "completed" ]; then
if echo "$STATUS" | jq -e '.download_url_expired == true' >/dev/null; then
echo "Result expired. Start a new query."
exit 1
elif echo "$STATUS" | jq -e '.result | type == "object"' >/dev/null; then
echo "$STATUS" | jq '{result: .result}' > results.json
else
DOWNLOAD_URL=$(echo "$STATUS" | jq -r '.download_url // empty')
if [ -z "$DOWNLOAD_URL" ]; then
echo "Completed response has neither a result nor an active download URL."
exit 1
fi
curl --fail-with-body -sS --max-time 300 -o results.json "$DOWNLOAD_URL" || exit 1
fi
# Both branches have the same result shape, including an empty data array.
jq '.result' results.json
exit 0
elif [ "$QUERY_STATUS" = "failed" ] || [ "$QUERY_STATUS" = "cancelled" ]; then
echo "Query $QUERY_STATUS: $(echo "$STATUS" | jq -r '.error // .message')"
exit 1
elif [ "$QUERY_STATUS" != "queued" ] && [ "$QUERY_STATUS" != "running" ]; then
echo "Unexpected query status: $QUERY_STATUS"
exit 1
fi
sleep 5
done
echo "Query polling timed out."
exit 1
例: テーブル全体をエクスポートする
非同期クエリ API は、テーブル全体のエクスポートに最適です。非同期クエリには行制限がないため、すべてをエクスポートし、結果を 1 つのファイルとしてダウンロードできます。
# Start the export as Parquet
QUERY='SELECT * FROM uber_rides'
RESPONSE=$(curl -s -X POST https://api.telemetry.sh/query/async \
-H "Content-Type: application/json" \
-H "Authorization: $API_KEY" \
-d "$(jq -n --arg query "$QUERY" '{query: $query, format: "parquet", realtime: true, json: true}')")
STATUS_URL="https://api.telemetry.sh$(echo "$RESPONSE" | jq -r '.status_url')"
# Poll until complete
while true; do
STATUS=$(curl -s -H "Authorization: $API_KEY" "$STATUS_URL")
QUERY_STATUS=$(echo "$STATUS" | jq -r '.query_status')
if [ "$QUERY_STATUS" = "completed" ]; then
DOWNLOAD_URL=$(echo "$STATUS" | jq -r '.download_url // empty')
if [ -z "$DOWNLOAD_URL" ]; then
echo "Export completed, but no active download URL is available."
exit 1
fi
curl -o uber_rides_export.parquet "$DOWNLOAD_URL"
echo "Export complete: uber_rides_export.parquet"
break
elif [ "$QUERY_STATUS" = "failed" ]; then
echo "Export failed: $(echo "$STATUS" | jq -r '.error // .message')"
exit 1
fi
sleep 5
done
SDK 境界
現在の JavaScript SDK query メソッドは対話型を呼び出します /query
終点。始まらない /query/async、投票 status_url、を強制する
非同期ジョブのタイムアウト、または完成したアーティファクトのダウンロード。
大規模な JSON または Parquet の場合は、上記の HTTP 開始、ポーリング、ダウンロード フローを使用してください。
輸出。アプリケーション ラッパーはこれら 3 つの操作をカプセル化できますが、
合計ポーリング期限を強制する必要があります。停止してください failed、そして治療します
期限切れ download_url 古いダウンロードを再試行するのではなく、新しいエクスポートとして
無期限に。
よくあるエラー
400 Bad RequestJSON ボディが無効な場合400 Bad Requestもしqueryが見つからないか空です401 UnauthorizedAPI キーが見つからないか無効な場合402 Payment Requiredアカウントがペイウォールチェックによってブロックされている場合429 Too Many RequestsAPI キーがゲートウェイのレート制限を超えた場合