Passer au contenu principal
Logs en temps réel
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>"
}
Le Playground de l’API est désactivé pour cet endpoint en raison de la nature des connexions SSE, qui ne sont pas universellement prises en charge par les navigateurs.
Authorization
string
requis
La clé d’API de votre compte. Vous pouvez la trouver dans les paramètres de votre compte.

Paramètres

app_id
string
requis
L’ID de l’application dont vous souhaitez surveiller les logs. Cet ID se trouve dans l’URL du panneau de gestion de votre application.

Réponse

status
string
Indique si l’appel a réussi. success en cas de succès, error sinon.
En cas d’échec, la réponse inclura un champ code accompagné du statut d’erreur, détaillant la cause. Si la requête réussit, la réponse sera un flux text/event-stream contenant le flux temps réel de l’application. Chaque connexion dure jusqu’à 10 minutes. Chaque compte peut maintenir 5 connexions temps réel simultanées (REALTIME_MAX_CONNECTIONS) et chaque application 30 tous utilisateurs confondus (REALTIME_MAX_CONNECTIONS_APP) ; dépasser l’une ou l’autre renvoie un 429.

Structure des Server-Sent Events (SSE)

La réponse est un flux continu au format text/event-stream. Chaque message est composé d’un champ event et d’un champ data. Les structures varient selon l’événement, analysez donc les charges utiles de manière défensive.

Types d’événements

  • system : signaux au niveau du protocole. La ligne data est un unique code en majuscules : REALTIME_CONNECTING | <sseId> à la connexion, puis l’un de REALTIME_TIMEOUT, REALTIME_DISCONNECTED, REALTIME_RECONNECT ou REALTIME_ERROR.
  • logs : une seule ligne de log dont le premier caractère est un octet d’identifiant de flux : \x01 (stdout) ou \x02 (stderr). Lisez data.charCodeAt(0) (1 = stdout, 2 = stderr), puis data.slice(1) pour le texte. Une ligne sans cet octet de préfixe est du stdout.
  • status : métriques du conteneur en direct sous forme de chaîne JSON, environ une trame par seconde. La première trame de chaque (re)connexion est complète : { cpu, cpuLimit, ram: [usedMB, limitMB], status, netIO: { i, o, new: { i, o } }, bIO: { i, o }, uptime } (uptime est l’heure de démarrage en ms epoch ; netIO.new est en octets par seconde). Chaque trame ultérieure est allégée, ne transportant que { cpu, ram, netIO, bIO } — fusionnez chacune sur la dernière trame complète, en conservant les précédents cpuLimit, status et uptime. Tant que ce flux est ouvert, privilégiez-le plutôt que d’interroger GET /v2/apps/{app_id}/status, qui peut être obsolète d’environ une minute pour une application ayant un flux temps réel ouvert.
  • error : transporte un code d’erreur tel que CONTAINER_NOT_FOUND.
Dans l’exemple ci-dessous, \x01 / \x02 représentent les octets de préfixe stdout / stderr bruts.
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