mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-13 12:26:35 +00:00
Add automatic retry to stream logs (#23098)
This commit is contained in:
parent
f4ef4c628a
commit
c3942d244d
@ -226,6 +226,25 @@ export const fetchHassioLogsFollow = async (
|
|||||||
signal
|
signal
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export const fetchHassioLogsFollowSkip = async (
|
||||||
|
hass: HomeAssistant,
|
||||||
|
provider: string,
|
||||||
|
signal: AbortSignal,
|
||||||
|
cursor: string,
|
||||||
|
skipLines: number,
|
||||||
|
lines = 100,
|
||||||
|
boot = 0
|
||||||
|
) =>
|
||||||
|
hass.callApiRaw(
|
||||||
|
"GET",
|
||||||
|
`hassio/${provider.includes("_") ? `addons/${provider}` : provider}/logs${boot !== 0 ? `/boots/${boot}` : ""}/follow`,
|
||||||
|
undefined,
|
||||||
|
{
|
||||||
|
Range: `entries=${cursor}:${skipLines}:${lines}`,
|
||||||
|
},
|
||||||
|
signal
|
||||||
|
);
|
||||||
|
|
||||||
export const getHassioLogDownloadUrl = (provider: string) =>
|
export const getHassioLogDownloadUrl = (provider: string) =>
|
||||||
`/api/hassio/${
|
`/api/hassio/${
|
||||||
provider.includes("_") ? `addons/${provider}` : provider
|
provider.includes("_") ? `addons/${provider}` : provider
|
||||||
|
@ -50,6 +50,7 @@ import {
|
|||||||
fetchHassioBoots,
|
fetchHassioBoots,
|
||||||
fetchHassioLogs,
|
fetchHassioLogs,
|
||||||
fetchHassioLogsFollow,
|
fetchHassioLogsFollow,
|
||||||
|
fetchHassioLogsFollowSkip,
|
||||||
fetchHassioLogsLegacy,
|
fetchHassioLogsLegacy,
|
||||||
getHassioLogDownloadLinesUrl,
|
getHassioLogDownloadLinesUrl,
|
||||||
getHassioLogDownloadUrl,
|
getHassioLogDownloadUrl,
|
||||||
@ -428,13 +429,21 @@ class ErrorLogCard extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async _loadLogs(): Promise<void> {
|
private async _loadLogs(retry = false): Promise<void> {
|
||||||
this._error = undefined;
|
this._error = undefined;
|
||||||
this._loadingState = "loading";
|
this._loadingState = "loading";
|
||||||
this._loadingPrevState = undefined;
|
this._numberOfLines = retry ? (this._numberOfLines ?? 0) : 0;
|
||||||
this._firstCursor = undefined;
|
|
||||||
this._numberOfLines = 0;
|
if (!retry) {
|
||||||
this._ansiToHtmlElement?.clear();
|
this._loadingPrevState = undefined;
|
||||||
|
this._firstCursor = undefined;
|
||||||
|
this._ansiToHtmlElement?.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const streamLogs =
|
||||||
|
this._streamSupported &&
|
||||||
|
isComponentLoaded(this.hass, "hassio") &&
|
||||||
|
this.provider;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (this._logStreamAborter) {
|
if (this._logStreamAborter) {
|
||||||
@ -442,32 +451,44 @@ class ErrorLogCard extends LitElement {
|
|||||||
this._logStreamAborter = undefined;
|
this._logStreamAborter = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (streamLogs) {
|
||||||
this._streamSupported &&
|
|
||||||
isComponentLoaded(this.hass, "hassio") &&
|
|
||||||
this.provider
|
|
||||||
) {
|
|
||||||
this._logStreamAborter = new AbortController();
|
this._logStreamAborter = new AbortController();
|
||||||
|
|
||||||
// check if there are any logs at all
|
if (!retry) {
|
||||||
const testResponse = await fetchHassioLogs(
|
// check if there are any logs at all
|
||||||
this.hass,
|
const testResponse = await fetchHassioLogs(
|
||||||
this.provider,
|
this.hass,
|
||||||
`entries=:-1:`,
|
this.provider!,
|
||||||
this._boot
|
`entries=:-1:`,
|
||||||
);
|
this._boot
|
||||||
const testLogs = await testResponse.text();
|
);
|
||||||
if (!testLogs.trim()) {
|
const testLogs = await testResponse.text();
|
||||||
this._loadingState = "empty";
|
if (!testLogs.trim()) {
|
||||||
|
this._loadingState = "empty";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await fetchHassioLogsFollow(
|
let response: Response;
|
||||||
this.hass,
|
|
||||||
this.provider,
|
if (retry && this._firstCursor) {
|
||||||
this._logStreamAborter.signal,
|
response = await fetchHassioLogsFollowSkip(
|
||||||
NUMBER_OF_LINES,
|
this.hass,
|
||||||
this._boot
|
this.provider!,
|
||||||
);
|
this._logStreamAborter.signal,
|
||||||
|
this._firstCursor,
|
||||||
|
this._numberOfLines,
|
||||||
|
NUMBER_OF_LINES,
|
||||||
|
this._boot
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
response = await fetchHassioLogsFollow(
|
||||||
|
this.hass,
|
||||||
|
this.provider!,
|
||||||
|
this._logStreamAborter.signal,
|
||||||
|
NUMBER_OF_LINES,
|
||||||
|
this._boot
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (response.headers.has("X-First-Cursor")) {
|
if (response.headers.has("X-First-Cursor")) {
|
||||||
this._firstCursor = response.headers.get("X-First-Cursor")!;
|
this._firstCursor = response.headers.get("X-First-Cursor")!;
|
||||||
@ -524,7 +545,7 @@ class ErrorLogCard extends LitElement {
|
|||||||
|
|
||||||
if (!this._downloadSupported) {
|
if (!this._downloadSupported) {
|
||||||
const downloadUrl = getHassioLogDownloadLinesUrl(
|
const downloadUrl = getHassioLogDownloadLinesUrl(
|
||||||
this.provider,
|
this.provider!,
|
||||||
this._numberOfLines,
|
this._numberOfLines,
|
||||||
this._boot
|
this._boot
|
||||||
);
|
);
|
||||||
@ -532,6 +553,9 @@ class ErrorLogCard extends LitElement {
|
|||||||
this._logsFileLink = signedUrl.path;
|
this._logsFileLink = signedUrl.path;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// first chunk loads successfully, reset retry param
|
||||||
|
retry = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -554,6 +578,13 @@ class ErrorLogCard extends LitElement {
|
|||||||
if (err.name === "AbortError") {
|
if (err.name === "AbortError") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The stream can fail if the connection is lost or firefox service worker intercept the connection
|
||||||
|
if (!retry && streamLogs) {
|
||||||
|
this._loadLogs(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this._error = (this.localizeFunc || this.hass.localize)(
|
this._error = (this.localizeFunc || this.hass.localize)(
|
||||||
"ui.panel.config.logs.failed_get_logs",
|
"ui.panel.config.logs.failed_get_logs",
|
||||||
{
|
{
|
||||||
@ -590,9 +621,10 @@ class ErrorLogCard extends LitElement {
|
|||||||
private _handleConnectionStatus = (ev: HASSDomEvent<ConnectionStatus>) => {
|
private _handleConnectionStatus = (ev: HASSDomEvent<ConnectionStatus>) => {
|
||||||
if (ev.detail === "disconnected" && this._logStreamAborter) {
|
if (ev.detail === "disconnected" && this._logStreamAborter) {
|
||||||
this._logStreamAborter.abort();
|
this._logStreamAborter.abort();
|
||||||
|
this._loadingState = "loading";
|
||||||
}
|
}
|
||||||
if (ev.detail === "connected") {
|
if (ev.detail === "connected") {
|
||||||
this._loadLogs();
|
this._loadLogs(true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user