diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/CoordinatorHealthService.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/CoordinatorHealthService.kt index 2bc67c2a..34ea4610 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/CoordinatorHealthService.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/CoordinatorHealthService.kt @@ -62,6 +62,10 @@ class CoordinatorHealthService( val eventsLastMinute = eventService.getEventsLast(1) val eventsLastFive = eventService.getEventsLast(5) + val last = listOfNotNull( + tasks.maxOfOrNull { it.persistedAt }, + eventService.getLastEventTimestamp() + ) return CoordinatorHealth( status = status, @@ -69,7 +73,7 @@ class CoordinatorHealthService( stalledTasks = stalledTaskIds.size, activeTasks = tasks.count { !it.consumed }, queuedTasks = TaskStore.getPendingTasks().size, - lastActivity = tasks.maxOfOrNull { it.persistedAt }, + lastActivity = last.max(), abandonedTaskIds = abandonedTaskIds.map { it.toString() }, stalledTaskIds = stalledTaskIds.map { it.toString() }, diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/EventService.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/EventService.kt index d5ea8939..0f10534b 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/EventService.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/EventService.kt @@ -9,6 +9,7 @@ import no.iktdev.mediaprocessing.shared.common.dto.toDto import no.iktdev.mediaprocessing.shared.common.effectivePersisted import no.iktdev.mediaprocessing.shared.database.stores.EventStore import org.springframework.stereotype.Service +import java.time.Instant import java.util.* @Service @@ -68,6 +69,7 @@ class EventService { return EventStore.eventsLast(minutes) } + fun getLastEventTimestamp(): Instant? = EventStore.getLastEventTimestamp() } \ No newline at end of file diff --git a/shared/database/src/main/kotlin/no/iktdev/mediaprocessing/shared/database/stores/EventStore.kt b/shared/database/src/main/kotlin/no/iktdev/mediaprocessing/shared/database/stores/EventStore.kt index 9798dead..6e86d3ba 100644 --- a/shared/database/src/main/kotlin/no/iktdev/mediaprocessing/shared/database/stores/EventStore.kt +++ b/shared/database/src/main/kotlin/no/iktdev/mediaprocessing/shared/database/stores/EventStore.kt @@ -17,6 +17,7 @@ import no.iktdev.mediaprocessing.shared.database.likeAny import no.iktdev.mediaprocessing.shared.database.queries.pagedQuery import no.iktdev.mediaprocessing.shared.database.tables.EventsTable import no.iktdev.mediaprocessing.shared.database.withTransaction +import org.jetbrains.exposed.sql.SortOrder import org.jetbrains.exposed.sql.insert import java.time.Instant import java.time.temporal.ChronoUnit @@ -152,4 +153,13 @@ object EventStore: EventStore { }.getOrDefault(emptyList()) } + fun getLastEventTimestamp(): Instant? { + return withTransaction { + EventsTable.select(EventsTable.persistedAt) + .orderBy(EventsTable.persistedAt, SortOrder.DESC) + .limit(1) + .firstOrNull() + ?.get(EventsTable.persistedAt) + }.getOrDefault(null) + } } \ No newline at end of file