# Active Service Operations with No Routings

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>


## Active Service Operations with No Routings

**Report ID:** `ib-svcops-no-routing`
**Category:** Integration Broker

## Purpose

This report identifies active service operations that have no active routing definitions. These operations have at least one active version but cannot process any messages because no routing is configured to direct traffic to or from them. Usually this means a half-finished setup or an operation that should have been deactivated when its routings were.

## What It Detects

An operation is flagged when:

1. It has at least one active version (`ACTIVE_FLAG = 'A'` in PSOPRVERDFN)
2. It has **zero** active routings (`EFF_STATUS = 'A'` in PSIBRTNGDEFN)

The report also shows the count of inactive routings, which helps distinguish between operations that never had routings and those whose routings were intentionally deactivated.

## Tables Queried

### PSOPERATION — Service Operation Definitions

Paginated to discover all operations.

|      Field       |          Description           |
| ---------------- | ------------------------------ |
| IB_OPERATIONNAME | Operation name (primary key)   |
| IB_SERVICENAME   | Parent service name            |
| RTNGTYPE         | Routing type (S=Sync, A=Async) |
| DESCR            | Short description              |

### PSOPRVERDFN — Operation Version Definitions

|    Field    |        Description        |           Filter           |
| ----------- | ------------------------- | -------------------------- |
| VERSIONNAME | Version name (e.g., "v1") |                            |
| ACTIVE_FLAG | Version active status     | At least one must be `'A'` |

### PSIBRTNGDEFN — Integration Broker Routing Definitions

|      Field      |       Description       |            Filter             |
| --------------- | ----------------------- | ----------------------------- |
| ROUTINGDEFNNAME | Routing definition name |                               |
| EFF_STATUS      | Effective status        | Must have **none** with `'A'` |

## Data Flow

```text
1. Paginate through all PSOPERATION records
   (batches of 300)
        |
        v
2. For each operation, fetch full details
   (versions, routings)
        |
        v
3. Filter to operations with at least one
   active version (ACTIVE_FLAG = 'A')
        |
        v
4. Exclude operations that have any active
   routing (EFF_STATUS = 'A')
        |
        v
5. Generate summary table of flagged operations
```

## Report Output

The generated report contains:

- **Summary** with total operations, active operations, and count flagged with no routings
- **Flagged operations table** with operation name (linked to detail page), service, type, active version count, inactive routing count, and description
- **Recommendations** for remediation actions

## Interpreting Results

- **Operations with zero total routings** likely never had routings configured. These may be newly created or inherited operations that were never fully set up
- **Operations with inactive routings only** suggest the routings were intentionally deactivated. Verify whether the operation itself should also be deactivated
- **Async operations** without routings are especially notable since they rely on routings for subscription/publication contracts
- **Sync operations** without routings cannot receive inbound requests

## Recommendations

1. **If the operation is needed:** Create and activate routing definitions to enable message processing
2. **If the operation is not needed:** Inactivate all versions to keep the IB configuration clean
3. **If routings exist but are inactive:** Review whether deactivation was intentional or an oversight
