forked from jsl/video_editing_poc
6.9 KiB
6.9 KiB
Alerts
This document captures the alerting artifact for operational readiness plan item Alerts.
Current metric surface:
- Prometheus scrapes
/actuator/prometheus. - Database-backed queue deployments expose:
video_clipping_queue_pendingvideo_clipping_queue_processingvideo_clipping_queue_dlqvideo_clipping_queue_oldest_pending_age_seconds- Standard Spring Boot and JVM metrics include:
http_server_requests_seconds_countprocess_cpu_usagesystem_cpu_usagejvm_memory_used_bytesup
Alert coverage implemented now:
- Queue age too high.
- DLQ messages present.
- API 5xx rate.
- Process unavailable.
- Sustained process CPU saturation.
Alert rules:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: video-clipping-service
labels:
app.kubernetes.io/name: video-clipping-service
spec:
groups:
- name: video-clipping-service
rules:
- alert: VideoClippingQueueOldestPendingHigh
expr: max(video_clipping_queue_oldest_pending_age_seconds) > 120
for: 10m
labels:
severity: warning
service: video-clipping-service
annotations:
summary: Video clipping queue age is elevated
description: Oldest pending queue message has been older than 120 seconds for 10 minutes.
- alert: VideoClippingQueueOldestPendingCritical
expr: max(video_clipping_queue_oldest_pending_age_seconds) > 300
for: 15m
labels:
severity: critical
service: video-clipping-service
annotations:
summary: Video clipping queue age is critically high
description: Oldest pending queue message has been older than 300 seconds for 15 minutes.
- alert: VideoClippingDlqPresent
expr: sum(video_clipping_queue_dlq) > 0
for: 5m
labels:
severity: critical
service: video-clipping-service
annotations:
summary: Video clipping DLQ contains messages
description: At least one clip job message has remained in the dead-letter queue for 5 minutes.
- alert: VideoClippingApi5xxRateHigh
expr: |
(
sum(rate(http_server_requests_seconds_count{uri!~"/actuator.*",status=~"5.."}[5m]))
/
clamp_min(sum(rate(http_server_requests_seconds_count{uri!~"/actuator.*"}[5m])), 0.001)
) > 0.05
for: 10m
labels:
severity: warning
service: video-clipping-service
annotations:
summary: Video clipping API 5xx ratio is high
description: More than 5 percent of non-Actuator API requests have returned 5xx for 10 minutes.
- alert: VideoClippingDownloadUrl5xxRateHigh
expr: |
(
sum(rate(http_server_requests_seconds_count{uri=~".*/download-url",status=~"5.."}[5m]))
/
clamp_min(sum(rate(http_server_requests_seconds_count{uri=~".*/download-url"}[5m])), 0.001)
) > 0.02
for: 10m
labels:
severity: warning
service: video-clipping-service
annotations:
summary: Video clipping signed download URL failures are elevated
description: More than 2 percent of signed clip download URL requests have returned 5xx for 10 minutes.
- alert: VideoClippingInstanceDown
expr: up{job=~".*video-clipping.*"} == 0
for: 5m
labels:
severity: critical
service: video-clipping-service
annotations:
summary: Video clipping target is down
description: Prometheus has failed to scrape a video-clipping-service target for 5 minutes.
- alert: VideoClippingProcessCpuHigh
expr: max(process_cpu_usage{application="video-clipping-service"}) > 0.85
for: 15m
labels:
severity: warning
service: video-clipping-service
annotations:
summary: Video clipping process CPU is saturated
description: Process CPU usage has remained above 85 percent for 15 minutes.
Threshold rationale:
120squeue age aligns with the red dashboard threshold and represents backlog outside normal steady-state behavior.300squeue age is long enough to page because it risks breaching throughput expectations before the15minute visibility timeout becomes relevant.- Any nonzero DLQ count is actionable because failed clip jobs require investigation or redrive.
- A sustained
5%API 5xx ratio is large enough to avoid paging on isolated errors while still catching broken releases or dependencies. - A stricter
2%threshold is used fordownload-urlbecause that endpoint should usually be lightweight and storage-signing failures directly block clip retrieval. 85%sustained process CPU is a warning signal for worker saturation; it should be correlated with queue backlog before scaling policy changes.
Operational notes:
- If production uses SQS instead of the database queue, replace the queue-depth and queue-age queries with native cloud queue metrics while keeping the same alert semantics.
- The
up{job=~".*video-clipping.*"}matcher should be narrowed to the actual Prometheus scrape job names used in the target environment. - The
process_cpu_usage{application="video-clipping-service"}selector assumes the Micrometerapplicationlabel is present fromspring.application.name. If the label set differs in production, adjust the selector accordingly. - The
download-urlmatcher depends on theurilabel shape exported by Spring Boot HTTP metrics. Verify that the label resolves to the route template used by the deployment.
Current instrumentation gaps:
- Job failure rate above threshold is not directly alertable yet because the service does not currently export a counter for failed clip jobs.
- Worker disk usage high is not directly exposed by this service; alert it from Kubernetes or node metrics such as container filesystem or ephemeral-volume usage.
- FFmpeg exit-code spike is not directly alertable yet because FFmpeg outcome counters by exit class are not exported.
- Object storage errors are only indirectly visible through API/worker failures today; a dedicated storage operation failure counter is still needed.
- Signed URL generation failures are only approximated via the
download-urlendpoint 5xx alert; a dedicated business metric would make this more precise.
Recommended next instrumentation when these alerts need to become first-class:
- Add counters for clip-job outcomes such as
video.clipping.jobs.started,video.clipping.jobs.succeeded, andvideo.clipping.jobs.failed. - Add counters for storage operation failures by operation type.
- Add counters for signed URL generation success and failure.
- Add counters for FFmpeg failure categories or exit-code classes.