# IB Dispatcher Down

LLMS index: [llms.txt](/llms.txt)

---

<div id="pslens-context-panel" class="card border-info mb-4 d-none">
  <div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle">
    <i class="bi bi-info-circle-fill me-2"></i>
    <span>Tailored Operational Context</span>
  </div>
  <div class="card-body p-0">
    <ul class="list-group list-group-flush">
      <li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Target Database:</strong>
        <span id="ctx-db" class="badge bg-secondary font-monospace">&mdash;</span>
      </li>
      <li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Context Type:</strong>
        <span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase">&mdash;</span>
      </li>
      <li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Alert Severity:</strong>
        <span id="ctx-severity" class="badge">&mdash;</span>
      </li>
      <li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Triggered Time:</strong>
        <span id="ctx-time" class="text-muted small">&mdash;</span>
      </li>
      <li id="row-details" class="list-group-item py-2 d-none">
        <strong id="label-details" class="d-block mb-1">Firing Context:</strong>
        <code id="ctx-details" class="d-block p-2 bg-light border rounded small" style="white-space: pre-wrap; word-break: break-all;">&mdash;</code>
      </li>
    </ul>
  </div>
</div>

<script>
  (function() {
    const params = new URLSearchParams(window.location.search);
    const metadata = params.get('metadata');
    if (!metadata) return;

    try {
      
      const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
      const jsonStr = decodeURIComponent(escape(window.atob(base64)));
      const data = JSON.parse(jsonStr);

      if (data) {
        let hasData = false;

        if (data.db) {
          document.getElementById('ctx-db').textContent = data.db;
          document.getElementById('row-db').classList.remove('d-none');
          hasData = true;
        }

        if (data.type) {
          document.getElementById('ctx-type').textContent = data.type;
          document.getElementById('row-type').classList.remove('d-none');
          hasData = true;
        }

        if (data.severity) {
          const severityBadge = document.getElementById('ctx-severity');
          const severity = data.severity.toLowerCase();
          severityBadge.textContent = severity.toUpperCase();
          if (severity === 'critical') {
            severityBadge.className = 'badge bg-danger';
          } else if (severity === 'warning') {
            severityBadge.className = 'badge bg-warning text-dark';
          } else {
            severityBadge.className = 'badge bg-info';
          }
          document.getElementById('row-severity').classList.remove('d-none');
          hasData = true;
        }

        if (data.t) {
          const date = new Date(data.t * 1000);
          document.getElementById('ctx-time').textContent = date.toLocaleString();
          document.getElementById('row-time').classList.remove('d-none');
          hasData = true;
        }

        if (data.details) {
          document.getElementById('ctx-details').textContent = data.details;

          
          const labelDetails = document.getElementById('label-details');
          if (data.type === 'object') {
            labelDetails.textContent = 'Object Metadata Details:';
          } else if (data.type === 'report') {
            labelDetails.textContent = 'Report Description:';
          } else {
            labelDetails.textContent = 'Firing Context:';
          }

          document.getElementById('row-details').classList.remove('d-none');
          hasData = true;
        }

        if (hasData) {
          document.getElementById('pslens-context-panel').classList.remove('d-none');
        }
      }
    } catch (e) {
      console.error('Failed to parse operational context metadata:', e);
    }
  })();
</script>


## IB Dispatcher Down Alert

**Alert ID:** `ib_dispatcher_down`
**Category:** Integration Broker
**Default threshold:** 10 minutes

### What This Alert Detects

This alert monitors Integration Broker dispatcher processes (such as the publication dispatcher, subscription dispatcher, or handler dispatchers) on active domains and triggers when any dispatcher is **inactive** or has stopped reporting health updates.

When a dispatcher process is down, messages assigned to that dispatcher fail to process and queue up indefinitely, leading to a backlog.

### Severity Logic

|                                   Condition                                    | Severity |
| ------------------------------------------------------------------------------ | -------- |
| Dispatcher status is not active, or no health update within `thresholdMinutes` | Warning  |
| Dispatcher has not updated health status for more than `thresholdMinutes × 2`  | Critical |

For example, with the default threshold of 10 minutes:

- No health update for 11 minutes → **Warning**
- No health update for 20+ minutes → **Critical**

### What Gets Checked

The alert queries `PSAPMSGDSPSTAT` for dispatcher process statuses. For each dispatcher associated with an **Active** domain (from `PSAPMSGDOMSTAT`), it verifies:

1. The status string is `"ACT"` (Active).
2. The health timestamp (`DspHealthDttm`) has been updated within the threshold window.

*Note: Dispatchers on inactive domains are ignored by this check (they are covered by the [IB No Active Domain](/docs/alerts/integration-broker/ib-no-active-domain/) check).*

### Alert Details

Each alert item includes:

- Dispatcher process name
- Physical machine/host name
- App server path
- The last updated health timestamp
- Reason for the down status (e.g. status not active, or elapsed minutes since last update)
- A link to the Integration Broker Monitor page

### Configuration

```yaml
alerts:
  checks:
    ib_dispatcher_down:
      enabled: true
      thresholdMinutes: 10
```

|      Setting       | Default |                                                    Description                                                     |
| ------------------ | ------- | ------------------------------------------------------------------------------------------------------------------ |
| `thresholdMinutes` | `10`    | Minutes a dispatcher can go without updating health before raising a Warning. Critical fires at 2× this threshold. |

### How to Respond

1. Go to the Integration Broker Monitor on the psLens dashboard to identify which specific dispatcher on which host is failing.
2. Log into the affected PeopleSoft application server and check the status of the dispatcher processes via PSAdmin.
3. Review the application server and Pub/Sub subdirectories log files (such as `APPSRV.log`, `TUXLOG`, or `stderr` / `stdout` logs) for crashes, Tuxedo errors, or database lockups.
4. Restart the Pub/Sub processes on the application server if the dispatcher has locked up or crashed.
