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
- Identify the applications in the warning (self -> inApplication) and re-collect or backfill the link data so outHost is populated.
- Verify the source application's ServiceType plugin is correctly registered on the server; an unknown/misconfigured type falls through to DEFAULT_HOST.
- If the data is stale, delete/expire the affected rows so the map stops rendering with the placeholder host.
- 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
- Keep agent and plugin versions in sync with the server so outHost is always populated
- Audit stored link rows for missing outHost after schema/version migrations
- Register ServiceType plugins server-side so queue/terminal types resolve to their proper default hosts
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
- Already closed
- BufferMetric initialize fail
- Cannot add an existing column family :
- Cannot create an existing table :
- Cannot modify a non-existent table :
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)