Service operations

Review service incidents and notification delivery

Inspect a qualified service incident, read personal notices and safely reconcile a signed webhook without duplicating remote work.

Applies to
Requires Controller 2.2.18 or newer. Install a matching published Runtime build before using the notification controls; a component source release alone does not update your installed Runtime.
Guide version
1.0

Worked example

Example: the receiver accepted a recovery but its response was lost

A missing HTTP acknowledgement leaves delivery uncertain. Preserve the notification ID and check the receiver before deciding what happens next.

Service state Healthy or degraded runtime evidence

Inspect current checks; notification delivery does not change service health.

Personal read receipt Mark as read

Applies only to your inbox. It neither resolves an incident nor proves webhook acceptance.

External delivery Signed webhook with stable notification ID

The receiver must verify the signature, durably deduplicate the ID and acknowledge that same ID.

Procedure

Follow the task in order

  1. 1
    Open the existing service diagnosisOpen the bell near your user menu and choose Inspect service or Health & incident history. Services and instance diagnostics also open the shared health dialog. Brief preparation or archive write delays are qualified before warning; an unavailable health check does not prove recovery. Expand Incident history for the recorded observer/controller episode.
  2. 2
    Review personal recipientsAn administrator expands Notification recipients, selects up to ten active people and saves the revision-bound selection. Only future incident openings and recoveries are queued. A selected recipient reads notices through the bell and marks their own notice as read. Unselected users do not receive the notice. A failed check retains last known notices.
  3. 3
    Configure an approved external receiverOn the observer controller configure an exact HTTPS destination and a signing-key reference before restarting it. Keep ENV/Infisical credentials node-local. No arbitrary URL or secret is entered into the health dialog. Open that observer controller to review its targets.
    Node-local configuration fragment; provide the referenced key through the existing secret provider
    {
      "serviceNotifications": {
        "webhooks": [
          {
            "id": "operations",
            "label": "Operations receiver",
            "url": "https://receiver.example.invalid/openhub-events",
            "signingSecret": {
              "provider": "env",
              "key": "OPENHUB_WEBHOOK_SIGNING_KEY"
            }
          }
        ]
      }
    }
  4. 4
    Review and enable the webhookExpand External notifications · Webhook, select the configured destination and choose Review and save webhook. New incident/recovery events enter a durable queue. Existing events are not backfilled. Destination or key changes require a fresh review and invalidate pending delivery from the old selection. Disable the channel to stop pending sends after an already approved in-flight attempt.
  5. 5
    Read the delivery resultExpand Recent deliveries. Acknowledged by receiver requires a matching receiver acknowledgement; a transport timeout or exhausted retry budget is not proof of rejection. The first automatic round is limited to eight attempts. HTTP requests have bounded time/response size, redirects are rejected and retryable failures use backoff. Delivery status is separate from the current incident and personal inbox.
  6. 6
    Review an uncertain or failed deliveryAs an administrator select Review delivery, check this exact ID at the receiver and record one decision: verified acceptance, close without resending, or allow up to eight more attempts with the same ID. Verified acceptance is shown as an administrator decision, not fabricated HTTP acknowledgement. Retrying requires the original target/key review to remain valid. At most two extra rounds are allowed; the total attempt counter is retained and cannot exceed 24.
  7. 7
    Recover after a lost decision responseUse Retry same decision. It reuses the immutable request receipt, even if a worker subsequently completed the delivery. Do not create another request to bypass an unknown outcome. A definitively rejected stale decision reloads current state for a new review. In-flight, already acknowledged or resolved deliveries cannot be changed by a stale decision.

Expected result

What you should have

A recorded incident, personal read receipt, receiver acknowledgement and administrator delivery decision remain distinct and auditable.

Boundaries

Important boundaries

  • Delivery is at least once. Remote exactly-once effects require receiver-side durable deduplication; repeating the same ID must not repeat its business effect.
  • The minimal envelope contains service/controller/incident identifiers and event time, not topic paths, measurement values, credentials or recipient addresses.
  • Incident, notification and decision evidence is retained by default. Recent UI lists are bounded; they are not a complete export. No automatic destructive retention purge is enabled.
  • Use the observer controller for webhook administration. This guide does not claim cross-controller transport failover, email/SMS or direct Slack/Teams compatibility.

FAQ

Common questions

How does the receiver acknowledge and verify a request?

The JSON envelope contains schemaVersion=1, notificationId, incidentId, serviceId, controllerName, eventKind and occurredAt. Verify X-OpenHub-Signature v1=<hex HMAC-SHA256> over timestamp + "." + notificationId + "." + the raw UTF-8 body, using the configured high-entropy key. X-OpenHub-Timestamp is Unix seconds for this attempt. Enforce a reasonable timestamp skew and constant-time signature comparison. Atomically persist the ID and effect, then return 2xx JSON {"notificationId":"<same ID>"}. Return that acknowledgement for accepted duplicates too. Idempotency-Key and X-OpenHub-Notification-Id carry the same stable ID.

Can I use Infisical instead of an environment reference?

Use the existing signingSecret provider reference {"provider":"infisical","path":"/operations","key":"OPENHUB_WEBHOOK_SIGNING_KEY"}. Resolve it before controller startup. Destination/key changes require a new review. Never paste a resolved key into a ticket, screenshot or shared configuration.

What happens if I do nothing after all attempts fail?

Automatic sends stop and the delivery remains visibly unacknowledged. Its evidence is retained. Check the receiver and record a reviewed acceptance, closure or eligible bounded retry; do not infer that the remote operation never happened.

This versioned public guide is maintained with the UNS OpenHub website and linked directly from the controller where the task applies.