diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index cff611a03c70e7f86c9ef49bd87dcc0063ab5b82..b6599b1b1b57d3fe1089b679cf0f921caccc0767 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -6,7 +6,8 @@
   <component name="ChangeListManager">
     <list default="true" id="9979eb22-471e-4f2f-b624-fd3edb5e8c6e" name="Changes" comment="">
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/worker.go" beforeDir="false" afterPath="$PROJECT_DIR$/worker.go" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/manager.go" beforeDir="false" afterPath="$PROJECT_DIR$/manager.go" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/queue.go" beforeDir="false" afterPath="$PROJECT_DIR$/queue.go" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -256,6 +257,7 @@
       <workItem from="1734001335693" duration="5602000" />
       <workItem from="1734012566872" duration="4517000" />
       <workItem from="1734022155342" duration="424000" />
+      <workItem from="1734024671338" duration="491000" />
     </task>
     <servers />
   </component>
diff --git a/manager.go b/manager.go
index ee6f1c68fd84ebca60b7d01ec9ce564ac9385722..351726b9bd85908cefd91adbd08d694cc723efa4 100644
--- a/manager.go
+++ b/manager.go
@@ -57,6 +57,12 @@ func NewManager() *Manager {
 
 }
 
+func (m *Manager) GetQueueStats() QueueStats {
+	m.mu.Lock()
+	defer m.mu.Unlock()
+	return m.queue.Stats()
+}
+
 // GetEventBus returns the event bus
 func (m *Manager) GetEventBus() *EventBus {
 	m.mu.Lock()
diff --git a/queue.go b/queue.go
index 7bf6a353fb2641952bc938934106dee3b495f046..76cd7d05d1b8114b852ce7ee18cf195bec6f6594 100644
--- a/queue.go
+++ b/queue.go
@@ -191,3 +191,57 @@ func removeJobID(deps []JobID, id JobID) []JobID {
 	}
 	return deps
 }
+
+type QueueStats struct {
+	ReadyQueueLength         int           `json:"ReadyQueueLength"`
+	JobMapLength             int           `json:"JobMapLength"`
+	PendingDeps              int           `json:"PendingDeps"`
+	ProcessedJobsCount       int           `json:"ProcessedJobsCount"`
+	MaxAgeReachedCount       int           `json:"MaxAgeReachedCount"`
+	PendingDependenciesCount int           `json:"PendingDependenciesCount"`
+	OldestProcessedJobAge    time.Duration `json:"OldestProcessedJobAge"`
+}
+
+// Stats computes and returns the statistics of the job queue
+func (q *Queue) Stats() QueueStats {
+	q.mu.Lock()
+	defer q.mu.Unlock()
+
+	// Calculate the oldest processed job age
+	var oldestProcessedJobAge time.Duration
+	if len(q.processedJobs) > 0 {
+		oldestAge := time.Now().Sub(q.processedJobs[0].ProcessedTime)
+		for _, job := range q.processedJobs {
+			jobAge := time.Now().Sub(job.ProcessedTime)
+			if jobAge > oldestAge {
+				oldestAge = jobAge
+			}
+		}
+		oldestProcessedJobAge = oldestAge
+	}
+
+	// Count how many jobs have reached MaxAge
+	maxAgeReachedCount := 0
+	currentTime := time.Now()
+	for _, jobInfo := range q.processedJobs {
+		if currentTime.Sub(jobInfo.ProcessedTime) > MaxAge {
+			maxAgeReachedCount++
+		}
+	}
+
+	// Count all pending dependencies
+	var totalPendingDeps = 0
+	for _, deps := range q.pendingDependencies {
+		totalPendingDeps += len(deps)
+	}
+
+	return QueueStats{
+		ReadyQueueLength:         len(q.readyQueue),
+		JobMapLength:             len(q.jobMap),
+		PendingDeps:              len(q.pendingDependencies),
+		ProcessedJobsCount:       len(q.processedJobs),
+		MaxAgeReachedCount:       maxAgeReachedCount,
+		PendingDependenciesCount: totalPendingDeps,
+		OldestProcessedJobAge:    oldestProcessedJobAge,
+	}
+}