Operator Events

Operator events let you subscribe to lifecycle events from your Outpost deployment, including delivery failures, destination disabling, retry exhaustion, and subscription changes.

Configuration

Enable operator events by specifying topics and configuring a sink.

Topics

Configure operator event topic subscriptions through Hookdeck Monitoring settings or Config API.

Set OPERATION_EVENTS_TOPICS to a comma-separated list of topics, or * for all topics:

OPERATION_EVENTS_TOPICS=*

Available topics:

TopicTrigger
alert.destination.consecutive_failureConsecutive failure count reaches 50%, 70%, 90%, or 100% of ALERT_CONSECUTIVE_FAILURE_COUNT
alert.destination.disabledDestination auto-disabled at 100% failure threshold
alert.attempt.exhausted_retriesDelivery exhausts all retry attempts (deduplicated per event+destination)
tenant.subscription.updatedDestination created/updated/deleted and tenant topics or destination count changed

Operator event delivery and topic selection are managed through Hookdeck Monitoring settings.

If OPERATION_EVENTS_TOPICS is empty or unset, operator events are disabled. If topics are configured but no sink is set, Outpost fails to start.

Sinks

Configure exactly one sink to receive events.

Configure sinks for operator event forwarding in Hookdeck Monitoring settings.

Four sink types are supported:

HTTP

Sends events as POST requests to a URL. If OPERATION_EVENTS_HTTP_SIGNING_SECRET is set, requests are signed with HMAC-SHA256.

OPERATION_EVENTS_HTTP_URL=https://example.com/outpost-events
OPERATION_EVENTS_HTTP_SIGNING_SECRET=your-secret

The HTTP sink sends signatures in X-Outpost-Signature:

  • Format: v0=<hex>
  • Algorithm: HMAC-SHA256 over the raw JSON body

Verification example:

import hashlib
import hmac

expected = hmac.new(signing_secret.encode(), body, hashlib.sha256).hexdigest()
assert signature_header == f"v0={expected}"

AWS SQS

OPERATION_EVENTS_AWS_SQS_QUEUE_URL=https://sqs.us-east-1.amazonaws.com/123456789/outpost-events
OPERATION_EVENTS_AWS_SQS_ACCESS_KEY_ID=AKIA...
OPERATION_EVENTS_AWS_SQS_SECRET_ACCESS_KEY=...
OPERATION_EVENTS_AWS_SQS_REGION=us-east-1
OPERATION_EVENTS_AWS_SQS_ENDPOINT=          # optional, for local dev

GCP Pub/Sub

OPERATION_EVENTS_GCP_PUBSUB_PROJECT_ID=my-project
OPERATION_EVENTS_GCP_PUBSUB_TOPIC_ID=outpost-events
OPERATION_EVENTS_GCP_PUBSUB_CREDENTIALS={"type":"service_account",...}

RabbitMQ

OPERATION_EVENTS_RABBITMQ_SERVER_URL=amqp://guest:guest@localhost:5672
OPERATION_EVENTS_RABBITMQ_EXCHANGE=outpost-events

Event Envelope

All operator events share this envelope:

{
  "id": "unique-event-id",
  "topic": "alert.destination.consecutive_failure",
  "time": "2025-06-01T12:00:00Z",
  "deployment_id": "my-deployment",
  "tenant_id": "tenant_123",
  "data": {}
}
FieldDescription
idUnique event identifier
topicEvent topic
timeISO 8601 timestamp
deployment_idDeployment ID (if configured)
tenant_idTenant associated with the event (if applicable)
dataTopic-specific payload

Event Payloads

alert.destination.consecutive_failure

Emitted when a destination reaches 50%, 70%, 90%, or 100% of ALERT_CONSECUTIVE_FAILURE_COUNT.

{
  "tenant_id": "tenant_123",
  "event": {},
  "attempt": {},
  "destination": {
    "id": "des_456",
    "tenant_id": "tenant_123",
    "type": "webhook",
    "topics": ["order.created"],
    "disabled_at": null
  },
  "consecutive_failures": {
    "current": 50,
    "max": 100,
    "threshold": 50
  }
}

alert.destination.disabled

Emitted when a destination is auto-disabled after reaching the 100% threshold (only when ALERT_AUTO_DISABLE_DESTINATION=true).

{
  "tenant_id": "tenant_123",
  "destination": {
    "id": "des_456",
    "tenant_id": "tenant_123",
    "type": "webhook",
    "topics": ["order.created"],
    "disabled_at": "2025-06-01T12:00:00Z"
  },
  "disabled_at": "2025-06-01T12:00:00Z",
  "reason": "consecutive_failure",
  "event": {},
  "attempt": {}
}

alert.attempt.exhausted_retries

Emitted when a delivery exhausts all retry attempts. Deduplicated per event+destination within ALERT_EXHAUSTED_RETRIES_WINDOW_SECONDS.

{
  "tenant_id": "tenant_123",
  "event": {},
  "attempt": {},
  "destination": {
    "id": "des_456",
    "tenant_id": "tenant_123",
    "type": "webhook",
    "topics": ["order.created"],
    "disabled_at": null
  }
}

tenant.subscription.updated

Emitted when destination changes affect tenant-level subscribed topics or destination count.

{
  "tenant_id": "tenant_123",
  "topics": ["order.created", "order.updated"],
  "previous_topics": ["order.created"],
  "destinations_count": 3,
  "previous_destinations_count": 2
}

Delivery Guarantees

alert.* topics are delivered with an at-least-once guarantee. For other topics (e.g. tenant.subscription.updated), delivery is on a best-effort basis with up to 3 attempts. Consumers should deduplicate using the event id.

Alert threshold and destination auto-disable behavior are managed through Hookdeck Monitoring settings.

ConfigDescriptionDefault
ALERT_CONSECUTIVE_FAILURE_COUNTNumber of consecutive failures before the 100% threshold100
ALERT_AUTO_DISABLE_DESTINATIONAuto-disable destinations at the 100% thresholdfalse
ALERT_EXHAUSTED_RETRIES_WINDOW_SECONDSDeduplication window for exhausted retry alerts (seconds)3600