Skip to content

Monitoring & Observability

Metrics Module

The namastack-outbox-metrics module provides automatic integration with Spring Boot Actuator and Micrometer:

dependencies {
    implementation("io.namastack:namastack-outbox-starter-jpa:1.0.0")
    implementation("io.namastack:namastack-outbox-metrics:1.0.0")

    // For Prometheus endpoint (optional)
    implementation("io.micrometer:micrometer-registry-prometheus")
}
<dependency>
    <groupId>io.namastack</groupId>
    <artifactId>namastack-outbox-metrics</artifactId>
    <version>1.0.0</version>
</dependency>

Built-in Metrics

Metric Description Tags
outbox.records.count Number of outbox records status=new\|failed\|completed
outbox.partitions.assigned.count Partitions assigned to this instance -
outbox.partitions.pending.records.total Total pending records across partitions -
outbox.partitions.pending.records.max Maximum pending records in any partition -
outbox.cluster.instances.total Total active instances in cluster -

Endpoints:

  • /actuator/metrics/outbox.records.count
  • /actuator/metrics/outbox.partitions.assigned.count
  • /actuator/prometheus (if Prometheus enabled)

Programmatic Monitoring

@Service
class OutboxMonitoringService(
    private val outboxRepository: OutboxRecordRepository,
    private val partitionMetricsProvider: OutboxPartitionMetricsProvider
) {
    fun getPendingRecordCount(): Long =
        outboxRepository.countByStatus(OutboxRecordStatus.NEW)

    fun getFailedRecordCount(): Long =
        outboxRepository.countByStatus(OutboxRecordStatus.FAILED)

    fun getPartitionStats(): PartitionProcessingStats =
        partitionMetricsProvider.getProcessingStats()

    fun getClusterStats(): PartitionStats =
        partitionMetricsProvider.getPartitionStats()
}
@Service
public class OutboxMonitoringService {
    private final OutboxRecordRepository outboxRepository;
    private final OutboxPartitionMetricsProvider partitionMetricsProvider;

    public OutboxMonitoringService(OutboxRecordRepository outboxRepository,
                                   OutboxPartitionMetricsProvider partitionMetricsProvider) {
        this.outboxRepository = outboxRepository;
        this.partitionMetricsProvider = partitionMetricsProvider;
    }

    public long getPendingRecordCount() {
        return outboxRepository.countByStatus(OutboxRecordStatus.NEW);
    }

    public long getFailedRecordCount() {
        return outboxRepository.countByStatus(OutboxRecordStatus.FAILED);
    }

    public PartitionProcessingStats getPartitionStats() {
        return partitionMetricsProvider.getProcessingStats();
    }

    public PartitionStats getClusterStats() {
        return partitionMetricsProvider.getPartitionStats();
    }
}