Skip to content

Commit

Permalink
chore: send notification when every job failed
Browse files Browse the repository at this point in the history
Signed-off-by: Wei Zhang <[email protected]>
  • Loading branch information
zwpaper committed Jan 10, 2025
1 parent 74337ec commit 3c2d8a3
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 38 deletions.
7 changes: 6 additions & 1 deletion ee/tabby-webserver/src/service/background_job/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ use std::sync::Arc;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use tabby_db::DbConn;
use tabby_schema::{context::ContextService, CoreError};
use tabby_schema::{
context::ContextService,
notification::{NotificationRecipient, NotificationService},
CoreError,
};

use super::helper::Job;

Expand All @@ -19,6 +23,7 @@ impl DbMaintainanceJob {
now: DateTime<Utc>,
context: Arc<dyn ContextService>,
db: DbConn,
notification_service: Arc<dyn NotificationService>,

Check warning on line 26 in ee/tabby-webserver/src/service/background_job/db.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/db.rs#L26

Added line #L26 was not covered by tests
) -> tabby_schema::Result<()> {
let mut errors = vec![];

Expand Down
65 changes: 28 additions & 37 deletions ee/tabby-webserver/src/service/background_job/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ use tabby_schema::{
license::LicenseService,
notification::{NotificationRecipient, NotificationService},
repository::{GitRepositoryService, RepositoryService, ThirdPartyRepositoryService},
AsID,
};
use third_party_integration::SchedulerGithubGitlabJob;
use tracing::{debug, warn};
Expand Down Expand Up @@ -60,11 +61,18 @@ impl BackgroundJobEvent {
}
}

macro_rules! append_error {
($errors:expr, $($arg:tt)*) => {{
#[macro_export]
macro_rules! notify_job_error {
($notification_service:expr, $err:expr, $($arg:tt)*) => {{
let msg = format!($($arg)*);
warn!("{}", msg);
$errors.push(msg);
warn!("{}: {:?}", msg, $err);
$notification_service.create(
NotificationRecipient::Admin,
&format!(
r#"Background job failed
{}"#, msg),
).await.unwrap();
}};
}

Expand All @@ -89,7 +97,7 @@ pub async fn start(

tokio::spawn(async move {
loop {
let result = tokio::select! {
tokio::select! {
job = db.get_next_job_to_execute() => {
let Some(job) = job else {
tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;
Expand All @@ -101,13 +109,15 @@ pub async fn start(
continue;
}

let logger = JobLogger::new(db.clone(), job.id);
debug!("Background job {} started, command: {}", job.id, job.command);
let job_id = job.id;
let logger = JobLogger::new(db.clone(), job_id);
debug!("Background job {} started, command: {}", job_id, job.command);

Check warning on line 114 in ee/tabby-webserver/src/service/background_job/mod.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/mod.rs#L112-L114

Added lines #L112 - L114 were not covered by tests
let Ok(event) = serde_json::from_str::<BackgroundJobEvent>(&job.command) else {
logkit::info!(exit_code = -1; "Failed to parse background job event, marking it as failed");
continue;
};

let job_name = format!("{:?}", event);
let result = match event {

Check warning on line 121 in ee/tabby-webserver/src/service/background_job/mod.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/mod.rs#L120-L121

Added lines #L120 - L121 were not covered by tests
BackgroundJobEvent::SchedulerGitRepository(repository_config) => {
let job = SchedulerGitJob::new(repository_config);
Expand Down Expand Up @@ -135,67 +145,48 @@ pub async fn start(
Err(err) => {
logkit::info!(exit_code = 1; "Job failed {}", err);
logger.finalize().await;
vec![err.to_string()]
notify_job_error!(notification_service, err, r#"Job {:?} failed,
Please visit [Jobs Detail](http://localhost:8080/jobs/detail?id={}) to check the error and retry.
"#,
job_name, job_id.as_id());

Check warning on line 151 in ee/tabby-webserver/src/service/background_job/mod.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/mod.rs#L144-L151

Added lines #L144 - L151 were not covered by tests
},
_ => {
logkit::info!(exit_code = 0; "Job completed successfully");
logger.finalize().await;

Check warning on line 155 in ee/tabby-webserver/src/service/background_job/mod.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/mod.rs#L154-L155

Added lines #L154 - L155 were not covered by tests
vec![]
}
}
},
Some(now) = hourly.next() => {
let mut errors = vec![];
if let Err(err) = DbMaintainanceJob::cron(now, context_service.clone(), db.clone()).await {
append_error!(errors, "Database maintenance failed: {:?}", err);
if let Err(err) = DbMaintainanceJob::cron(now, context_service.clone(), db.clone(), notification_service.clone()).await {
warn!("Database maintenance failed: {:?}", err);

Check warning on line 161 in ee/tabby-webserver/src/service/background_job/mod.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/mod.rs#L160-L161

Added lines #L160 - L161 were not covered by tests
}

if let Err(err) = SchedulerGitJob::cron(now, git_repository_service.clone(), job_service.clone()).await {
append_error!(errors, "Scheduler job failed: {:?}", err);
notify_job_error!(notification_service, err, "Scheduler job failed");

Check warning on line 165 in ee/tabby-webserver/src/service/background_job/mod.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/mod.rs#L165

Added line #L165 was not covered by tests
}

if let Err(err) = SyncIntegrationJob::cron(now, integration_service.clone(), job_service.clone()).await {
append_error!(errors, "Sync integration job failed: {:?}", err);
notify_job_error!(notification_service, err, "Sync integration job failed");

Check warning on line 169 in ee/tabby-webserver/src/service/background_job/mod.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/mod.rs#L169

Added line #L169 was not covered by tests
}

if let Err(err) = SchedulerGithubGitlabJob::cron(now, third_party_repository_service.clone(), job_service.clone()).await {
append_error!(errors, "Index issues job failed: {err:?}");
notify_job_error!(notification_service, err, "Index issues job failed");

Check warning on line 173 in ee/tabby-webserver/src/service/background_job/mod.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/mod.rs#L173

Added line #L173 was not covered by tests
}

if let Err(err) = IndexGarbageCollection.run(repository_service.clone(), context_service.clone()).await {
append_error!(errors, "Index garbage collection job failed: {err:?}");
notify_job_error!(notification_service, err, "Index garbage collection job failed");

Check warning on line 177 in ee/tabby-webserver/src/service/background_job/mod.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/mod.rs#L177

Added line #L177 was not covered by tests
}

errors
},
Some(now) = daily.next() => {
let mut errors = vec![];
if let Err(err) = LicenseCheckJob::cron(now, license_service.clone(), notification_service.clone()).await {
append_error!(errors, "License check job failed: {err:?}");
notify_job_error!(notification_service, err, "License check job failed");

Check warning on line 182 in ee/tabby-webserver/src/service/background_job/mod.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/mod.rs#L182

Added line #L182 was not covered by tests
}

errors
}
else => {
warn!("Background job channel closed");
return;

Check warning on line 187 in ee/tabby-webserver/src/service/background_job/mod.rs

View check run for this annotation

Codecov / codecov/patch

ee/tabby-webserver/src/service/background_job/mod.rs#L187

Added line #L187 was not covered by tests
}
};

if !result.is_empty() {
notification_service
.create(
NotificationRecipient::Admin,
&format!(
r#"Background job failed
{}"#,
&result.join("\n\n")
),
)
.await
.unwrap();
}
}
});
}

0 comments on commit 3c2d8a3

Please sign in to comment.