跳转到主要内容
实时日志
curl --request GET \
  --url https://api.squarecloud.app/v2/apps/{app_id}/realtime \
  --header 'Authorization: <authorization>'
import requests

url = "https://api.squarecloud.app/v2/apps/{app_id}/realtime"

headers = {"Authorization": "<authorization>"}

response = requests.get(url, headers=headers)

print(response.text)
const options = {method: 'GET', headers: {Authorization: '<authorization>'}};

fetch('https://api.squarecloud.app/v2/apps/{app_id}/realtime', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.squarecloud.app/v2/apps/{app_id}/realtime",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://api.squarecloud.app/v2/apps/{app_id}/realtime"

req, _ := http.NewRequest("GET", url, nil)

req.Header.Add("Authorization", "<authorization>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://api.squarecloud.app/v2/apps/{app_id}/realtime")
.header("Authorization", "<authorization>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.squarecloud.app/v2/apps/{app_id}/realtime")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'

response = http.request(request)
puts response.read_body
{
  "status": "<string>"
}
由于 SSE 连接的特性(并非所有浏览器都普遍支持),此端点的 API Playground 已禁用。
Authorization
string
必填
你账户的 API 密钥。你可以在账户设置中找到它。

参数

app_id
string
必填
你想要监控其日志的应用的 ID。此 ID 可以在应用管理面板的 URL 中找到。

响应

status
string
指示调用是否成功。成功时为 success,否则为 error
失败时,响应将在错误状态之外包含一个 code 字段,说明具体原因。 如果请求成功,响应将是一个 text/event-stream 流,包含应用的实时数据流。 每个连接最长持续 10 分钟。每个账户最多可保持 5 个并发实时连接REALTIME_MAX_CONNECTIONS),每个应用最多 跨所有用户 30 个REALTIME_MAX_CONNECTIONS_APP);超出任一限制将返回 429

Server-Sent Events (SSE) 结构

响应是一个 text/event-stream 格式的持续流。每条消息由一个 event 字段和一个 data 字段组成。不同事件的结构各异,因此请以防御性方式解析负载。

事件类型

  • system:协议级信号。data 行是单个大写代码:连接时为 REALTIME_CONNECTING | <sseId>,随后可能是 REALTIME_TIMEOUTREALTIME_DISCONNECTEDREALTIME_RECONNECTREALTIME_ERROR 中的任意一个。
  • logs:单行日志,其第一个字符是流 ID 字节\x01(stdout)或 \x02(stderr)。读取 data.charCodeAt(0)(1 = stdout,2 = stderr),然后用 data.slice(1) 获取文本。没有该前缀字节的行为 stdout。
  • status:以 JSON 字符串形式呈现的实时容器指标,大约每秒一帧。每次(重新)连接的第一帧是完整的:{ cpu, cpuLimit, ram: [usedMB, limitMB], status, netIO: { i, o, new: { i, o } }, bIO: { i, o }, uptime }uptime 是以毫秒计的 epoch 起始时间;netIO.new 是每秒字节数)。之后的每一帧都是精简的,仅携带 { cpu, ram, netIO, bIO } —— 将每一帧合并到上一个完整帧上,保留之前的 cpuLimitstatusuptime。在此流保持打开期间,请优先使用它,而非轮询 GET /v2/apps/{app_id}/status;对于已打开实时流的应用,后者可能有最多约一分钟的延迟。
  • error:携带一个错误代码,例如 CONTAINER_NOT_FOUND
在下面的示例中,\x01 / \x02 代表原始的 stdout / stderr 前缀字节。
event: system
data: REALTIME_CONNECTING | abc123-1716000000000-deadbeef

event: status
data: {"cpu":12.5,"cpuLimit":100,"ram":[128,512],"status":"running","netIO":{"i":2048,"o":4096,"new":{"i":64,"o":128}},"bIO":{"i":0,"o":0},"uptime":1716000000000}

event: status
data: {"cpu":13.1,"ram":[131,512],"netIO":{"i":2176,"o":4288,"new":{"i":72,"o":140}},"bIO":{"i":0,"o":0}}

event: logs
data: \x01Server listening on :3000

event: logs
data: \x02Error: connect ECONNREFUSED