# IB Subscription Contracts Stalled

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 Subscription Contracts Stalled Alert

**Alert ID:** `ib_sub_contract_stalled`
**Category:** Integration Broker
**Default threshold:** 30 minutes

### What This Alert Detects

This alert finds **Integration Broker subscription contracts** that are stuck in **New** or **Working** status and have not progressed beyond that state within the configured threshold.

A stalled subscription contract means PeopleSoft received an inbound message from an external system, but has not yet finished processing it. The message is either waiting to be handled (New) or is in the process of being handled but taking too long (Working).

### When This Matters

For sub contracts, the most common cause specific to this alert is subscription handler PeopleCode that runs unusually long or waits on an external resource. For broader IB-side causes (dispatcher down, backlog), cross-reference [IB Dispatcher Down](/docs/alerts/integration-broker/ib-dispatcher-down/) and [IB Operations Stalled](/docs/alerts/integration-broker/ib-operation-stalled/).

### Severity Logic

|                Condition                 | Severity |
| ---------------------------------------- | -------- |
| Stuck longer than `thresholdMinutes`     | Warning  |
| Stuck longer than `thresholdMinutes × 2` | Critical |

### Alert Details

Each alert item includes:

- Subscription contract ID
- Service operation name
- Current status (New or Working)
- How long it has been stuck (in minutes)
- The originating (publishing) node
- A link to the IB Monitor detail page

### Configuration

```yaml
alerts:
  checks:
    ib_sub_contract_stalled:
      enabled: true
      thresholdMinutes: 30       # Minutes before flagging as Warning
      excludeOperations:         # Operation names to skip
        - BULK_INBOUND_SYNC
```

|       Setting       | Default |                                       Description                                       |
| ------------------- | ------- | --------------------------------------------------------------------------------------- |
| `thresholdMinutes`  | `30`    | Minutes a contract must be stuck to trigger a Warning. Critical fires at 2× this value. |
| `excludeOperations` | `[]`    | List of IB operation names to exclude. Use for known long-running handlers.             |

### How to Respond

1. Click the alert link to go to the IB Monitor entry for the stalled contract
2. Check whether the IB dispatchers are running on the PeopleSoft application server
3. Look for a broader backlog. Many New contracts may mean no dispatcher is running
4. Check application server logs for errors in the subscription handler
5. For Working contracts, check whether the handler PeopleCode is looping or waiting on an external resource

### Relationship to Other IB Alerts

For sub contracts that have **already ended in error**, see [IB Subscription Contract Errors](/docs/alerts/integration-broker/ib-sub-contract-errors/).

For similar stalled alerts on operations and publication contracts:

- [IB Operations Stalled](/docs/alerts/integration-broker/ib-operation-stalled/)
- [IB Publication Contracts Stalled](/docs/alerts/integration-broker/ib-pub-contract-stalled/)
