pinpoint-apm/pinpoint · error · IllegalArgumentException

filter resolve fail:

Error message

filter resolve fail:

What it means

This is the IllegalArgumentException thrown immediately after the 'unsupported filter type' warning in LinkFilter.resolveLinkFilter when no filter strategy matches the from/to service descriptors. It propagates to the caller that attempted to construct the LinkFilter.

Solutions

  1. Catch IllegalArgumentException around LinkFilter construction and surface a user-friendly message
  2. Ensure the link being filtered originates from a WAS application
  3. Correct service type registration so the source application classifies as WAS
  4. Add an explicit unsupported-combination check before constructing the filter

Example fix

// before
Filter filter = new LinkFilter(fromDesc, toDesc, registry);
// after
try {
    Filter filter = new LinkFilter(fromDesc, toDesc, registry);
} catch (IllegalArgumentException e) {
    throw new BadRequestException("Filtering is not supported for this link: " + e.getMessage());
}
Defensive patterns

Strategy: try-catch

Validate before calling

boolean wasSource = fromServiceDescList.stream()
    .anyMatch(d -> d.getServiceType().isWas());
if (!wasSource) {
    throw new UnsupportedOperationException("Filter resolve will fail: no WAS in source descriptors");
}

Try / catch

try {
    LinkFilter filter = new LinkFilter(fromDesc, toDesc, registry);
    return filterChain.include(transaction);
} catch (IllegalArgumentException e) {
    logger.warn("link filter unsupported: {}", e.getMessage());
    return false;
}

Prevention

When it happens

Trigger: Same conditions as the warning: fromServiceDescList has no WAS entries, so after the warning the method throws 'filter resolve fail:'.

Common situations: Filtering a backend-to-backend or RPC-to-RPC link from the topology UI; deserialized filter configs referencing service types that no longer resolve to WAS.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


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

Appendix: source

Thrown at web/src/main/java/com/navercorp/pinpoint/web/filter/LinkFilter.java:182

        if (includeUser(fromServiceDescList) && includeWas(toServiceDescList)) {
            return new UserToWasFilter(spanResponseConditionFilter, acceptURLFilter);
        }
        if (includeWas(fromServiceDescList) && includeUnknown(toServiceDescList)) {
            return new WasToUnknownFilter(spanEventResponseConditionFilter, rpcUrlFilter);
        }
        if (includeWas(fromServiceDescList) && includeQueue(toServiceDescList)) {
            return new WasToQueueFilter(spanEventResponseConditionFilter);
        }
        if (includeQueue(fromServiceDescList) && includeWas(toServiceDescList)) {
            return new QueueToWasFilter(spanResponseConditionFilter, acceptURLFilter);
        }
        // TODO toServiceDescList check logic not exist.
//        if (includeWas(fromServiceDescList) && isBackEnd????()) {
        if (includeWas(fromServiceDescList)) {
            return new WasToBackendFilter(spanEventResponseConditionFilter);
        }
        logger.warn("unsupported filter type:{}", this);
        throw new IllegalArgumentException("filter resolve fail:" + this);
    }


    @Override
    public boolean include(List<SpanBo> transaction) {
        SpanContext spanContext = new SpanContext(transaction, serviceTypeRegistryService);

        final String fromServiceName = fromNode.getServiceName();
        final String fromApplicationName = fromNode.getApplicationName();

        final String toServiceName = toNode.getServiceName();
        final String toApplicationName = toNode.getApplicationName();

        LinkContext linkContext = new LinkContext(spanContext,
                fromServiceName, fromApplicationName, fromServiceDescList, fromAgentFilter,
                toServiceName, toApplicationName, toServiceDescList, toAgentFilter);
        return filter.include(linkContext);
    }

View on GitHub (pinned to 744c3d3075)