pinpoint-apm/pinpoint · warning

Empty outHost for IN_LINK

Error message

    Empty outHost for IN_LINK {} -> {}. Set to default host.

What it means

When mapping an IN_LINK row, InLinkV3Mapper.fallbackHost found an empty outHost on a link whose source service type is neither a queue nor a terminal node. The mapper logs this warning and substitutes DEFAULT_HOST so map rendering can continue instead of failing the row. It indicates incomplete or unexpected link data in storage, not a fatal condition.

Solutions

  1. Identify the applications in the warning (self -> inApplication) and re-collect or backfill the link data so outHost is populated.
  2. Verify the source application's ServiceType plugin is correctly registered on the server; an unknown/misconfigured type falls through to DEFAULT_HOST.
  3. If the data is stale, delete/expire the affected rows so the map stops rendering with the placeholder host.
  4. If the service type is genuinely a queue or terminal, confirm its ServiceType flags (isQueue/isTerminal) so the correct QUEUE_DEFAULT_HOST/TERMINAL_DEFAULT_HOST branch is used instead.
Defensive patterns

Strategy: fallback

Validate before calling

// Before consuming mapped link data, verify outHost is present on in-link rows
if (inLink == null || inLink.getOutHost() == null || inLink.getOutHost().isEmpty()) {
    logger.warn("in-link {} -> {} has empty outHost; expect default-host fallback", inLink.getFrom(), inLink.getTo());
}

Type guard

boolean hasHost(String outHost) { return outHost != null && !outHost.isEmpty() && !outHost.equals(DEFAULT_HOST); }

Prevention

When it happens

Trigger: mapRow reads an in-link record from the HBase/link dao whose outHost column/field is empty, and fallbackHost's queue and terminal service-type branches do not apply, so the default-host fallback path is taken.

Common situations: Legacy or partially migrated link data in HBase missing the outHost field; agent/plugin versions that did not populate outHost for certain service types; data written by an older Pinpoint version being read by a newer mapper schema (v3).

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07). Data as JSON: /api/errors/8f80ef8d67ef74c8. Report an issue: GitHub.

Appendix: source

Thrown at web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/v3/InLinkV3Mapper.java:146

            if (logger.isTraceEnabled()) {
                logger.trace("    Fetched IN_LINK inLink:{}", linkDataMap);
            }
        }

        return linkDataMap;
    }


    private String fallbackHost(Application self, Application inApplication) {
        logger.debug("    Empty outHost for IN_LINK {} -> {}", self, inApplication);
        ServiceType inServiceType = inApplication.getServiceType();
        if (inServiceType.isQueue()) {
            return QUEUE_DEFAULT_HOST;
        }
        if (inServiceType.isTerminal()) {
            return TERMINAL_DEFAULT_HOST;
        }
        logger.warn("    Empty outHost for IN_LINK {} -> {}. Set to default host.", self, inApplication);
        return DEFAULT_HOST;
    }

    private String outHost(String outHost) {
        if (MERGE_AGENT.equals(outHost)) {
            return MERGE_AGENT;
        }
        return outHost;
    }

    private SlotCode readSlotCode(Cell cell) {
        byte[] qualifierArray = cell.getQualifierArray();
        byte slotCodeByte = qualifierArray[cell.getQualifierOffset()];
        return SlotCode.valueOf(slotCodeByte);
    }

    private Application readSelfApplication(UidLinkRowKey self, ServiceType inServiceType) {
        int serviceUid = self.getLinkServiceUid();

View on GitHub (pinned to 744c3d3075)