feat: include schedule name in backup notifications and logs (#215)

* feat: include schedule name in backup notifications and logs

* lint fixes
This commit is contained in:
Jakub Trávník 2026-01-02 14:22:03 +01:00 committed by GitHub
parent eded452c83
commit 94c84d7c58
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 24 additions and 5 deletions

View file

@ -236,7 +236,7 @@ const executeBackup = async (scheduleId: number, manual = false) => {
throw new BadRequestError("Volume is not mounted");
}
logger.info(`Starting backup for volume ${volume.name} to repository ${repository.name}`);
logger.info(`Starting backup ${schedule.name} for volume ${volume.name} to repository ${repository.name}`);
serverEvents.emit("backup:started", {
scheduleId,
@ -248,6 +248,7 @@ const executeBackup = async (scheduleId: number, manual = false) => {
.sendBackupNotification(scheduleId, "start", {
volumeName: volume.name,
repositoryName: repository.name,
scheduleName: schedule.name,
})
.catch((error) => {
logger.error(`Failed to send backup start notification: ${toMessage(error)}`);
@ -341,9 +342,13 @@ const executeBackup = async (scheduleId: number, manual = false) => {
.where(eq(backupSchedulesTable.id, scheduleId));
if (finalStatus === "warning") {
logger.warn(`Backup completed with warnings for volume ${volume.name} to repository ${repository.name}`);
logger.warn(
`Backup ${schedule.name} completed with warnings for volume ${volume.name} to repository ${repository.name}`,
);
} else {
logger.info(`Backup completed successfully for volume ${volume.name} to repository ${repository.name}`);
logger.info(
`Backup ${schedule.name} completed successfully for volume ${volume.name} to repository ${repository.name}`,
);
}
serverEvents.emit("backup:completed", {
@ -357,12 +362,15 @@ const executeBackup = async (scheduleId: number, manual = false) => {
.sendBackupNotification(scheduleId, finalStatus === "success" ? "success" : "warning", {
volumeName: volume.name,
repositoryName: repository.name,
scheduleName: schedule.name,
})
.catch((error) => {
logger.error(`Failed to send backup success notification: ${toMessage(error)}`);
});
} catch (error) {
logger.error(`Backup failed for volume ${volume.name} to repository ${repository.name}: ${toMessage(error)}`);
logger.error(
`Backup ${schedule.name} failed for volume ${volume.name} to repository ${repository.name}: ${toMessage(error)}`,
);
await db
.update(backupSchedulesTable)
@ -385,6 +393,7 @@ const executeBackup = async (scheduleId: number, manual = false) => {
.sendBackupNotification(scheduleId, "failure", {
volumeName: volume.name,
repositoryName: repository.name,
scheduleName: schedule.name,
error: toMessage(error),
})
.catch((notifError) => {

View file

@ -388,6 +388,7 @@ function buildNotificationMessage(
body: [
`Volume: ${context.volumeName}`,
`Repository: ${context.repositoryName}`,
context.scheduleName ? `Schedule: ${context.scheduleName}` : null,
context.duration ? `Duration: ${Math.round(context.duration / 1000)}s` : null,
context.filesProcessed !== undefined ? `Files: ${context.filesProcessed}` : null,
context.bytesProcessed ? `Size: ${context.bytesProcessed}` : null,
@ -404,6 +405,7 @@ function buildNotificationMessage(
body: [
`Volume: ${context.volumeName}`,
`Repository: ${context.repositoryName}`,
context.scheduleName ? `Schedule: ${context.scheduleName}` : null,
context.duration ? `Duration: ${Math.round(context.duration / 1000)}s` : null,
context.filesProcessed !== undefined ? `Files: ${context.filesProcessed}` : null,
context.bytesProcessed ? `Size: ${context.bytesProcessed}` : null,
@ -421,6 +423,7 @@ function buildNotificationMessage(
body: [
`Volume: ${context.volumeName}`,
`Repository: ${context.repositoryName}`,
context.scheduleName ? `Schedule: ${context.scheduleName}` : null,
context.error ? `Error: ${context.error}` : null,
`Time: ${date} - ${time}`,
]
@ -431,7 +434,14 @@ function buildNotificationMessage(
default:
return {
title: "Backup Notification",
body: `Volume: ${context.volumeName}\nRepository: ${context.repositoryName}\nTime: ${date} - ${time}`,
body: [
`Volume: ${context.volumeName}`,
`Repository: ${context.repositoryName}`,
context.scheduleName ? `Schedule: ${context.scheduleName}` : null,
`Time: ${date} - ${time}`,
]
.filter(Boolean)
.join("\n"),
};
}
}