pinpoint-apm/pinpoint · error · RuntimeException

ServiceType name of is duplicated with

Error message

ServiceType name of ${pair} is duplicated with ${prev}

What it means

Startup-time sanity check in TraceMetadataLoader.ServiceTypeChecker: two TraceMetadataProviders registered ServiceTypes with the same name, so the later registration is rejected to prevent ambiguous service-type resolution.

Solutions

  1. Rename the colliding ServiceType in your custom plugin/metadata provider
  2. Remove the duplicate provider from the classpath
  3. Audit registered providers at startup and keep names unique
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at commons-profiler/src/main/java/com/navercorp/pinpoint/common/profiler/trace/TraceMetadataLoader.java:215 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at commons-profiler/src/main/java/com/navercorp/pinpoint/common/profiler/trace/TraceMetadataLoader.java:215

        private final TraceMetadataProvider provider;
        
        public Pair(T value, TraceMetadataProvider provider) {
            this.value = value;
            this.provider = provider;
        }
    }
    
    private class ServiceTypeChecker {
        private final Map<String, Pair<ServiceType>> serviceTypeNameMap = new HashMap<>();
        private final Map<Short, Pair<ServiceType>> serviceTypeCodeMap = new HashMap<>();

        private void check(ServiceType type, TraceMetadataProvider provider) {
            Pair<ServiceType> pair = new Pair<>(type, provider);
            Pair<ServiceType> prev = serviceTypeNameMap.put(type.getName(), pair);
    
            if (prev != null) {
                // TODO change exception type
                throw new RuntimeException("ServiceType name of " + serviceTypePairToString(pair) + " is duplicated with " + serviceTypePairToString(prev));
            }
    
            prev = serviceTypeCodeMap.put(type.getCode(), pair);
    
            if (prev != null) {
                // TODO change exception type
                throw new RuntimeException("ServiceType code of " + serviceTypePairToString(pair) + " is duplicated with " + serviceTypePairToString(prev));
            }

            if(type.isAlias()){
                if(!type.isRpcClient()){
                    throw new RuntimeException("ServiceType code of " + serviceTypePairToString(pair) + " should be between range of RPC");
                }
                if(type.isRecordStatistics()){
                    throw new RuntimeException("ServiceType code of " + serviceTypePairToString(pair) + " can't have ALIAS and RECORD_STATISTICS at the same time");
                }
            }
        }

View on GitHub (pinned to 744c3d3075)