pinpoint-apm/pinpoint · warning
Unknown CpuLoadMetric : {}
Error message
Unknown CpuLoadMetric : {} What it means
CpuLoadMetricProvider.createCpuLoadMetric logs 'Unknown CpuLoadMetric' when Class.forName succeeds but the loaded class has no public no-arg constructor (NoSuchMethodException). It returns CpuLoadMetric.UNSUPPORTED_CPU_LOAD_METRIC so the agent continues without CPU load metrics. This branch is distinct from the general ReflectiveOperationException branch that logs 'Error creating CpuLoadMetric'.
Source
Thrown at agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/provider/stat/cpu/CpuLoadMetricProvider.java:85
if (jvmType == JvmType.IBM) {
return IBM_CPU_LOAD_METRIC;
}
return null;
}
private CpuLoadMetric createCpuLoadMetric(String classToLoad) {
if (classToLoad == null) {
return CpuLoadMetric.UNSUPPORTED_CPU_LOAD_METRIC;
}
try {
@SuppressWarnings("unchecked")
Class<CpuLoadMetric> cpuLoadMetricClass = (Class<CpuLoadMetric>) Class.forName(classToLoad);
try {
Constructor<CpuLoadMetric> cpuLoadMetricConstructor = cpuLoadMetricClass.getConstructor();
return cpuLoadMetricConstructor.newInstance();
} catch (NoSuchMethodException e) {
logger.warn("Unknown CpuLoadMetric : {}", classToLoad);
return CpuLoadMetric.UNSUPPORTED_CPU_LOAD_METRIC;
}
} catch (ReflectiveOperationException e) {
logger.warn("Error creating CpuLoadMetric [" + classToLoad + "]");
return CpuLoadMetric.UNSUPPORTED_CPU_LOAD_METRIC;
}
}
}
View on GitHub (pinned to 744c3d3075)
Solutions
- Verify the class named in the log has a public no-arg constructor; add one if it is your custom implementation
- Check whether your Pinpoint version's class map matches the target OS/JVM and upgrade the agent if the platform is newer than the mapping
- Confirm the fallback UNSUPPORTED_CPU_LOAD_METRIC is acceptable — if CPU metrics matter, provide a compatible implementation
Example fix
// before
class MyCpuLoadMetric implements CpuLoadMetric {
MyCpuLoadMetric(OperatingSystemMXBean os) { ... }
}
// after
class MyCpuLoadMetric implements CpuLoadMetric {
public MyCpuLoadMetric() { this(getPlatformBean()); }
MyCpuLoadMetric(OperatingSystemMXBean os) { ... }
} Defensive patterns
Strategy: fallback
Validate before calling
try { Class<?> c = Class.forName(metricClassName); c.getConstructor(); } catch (ClassNotFoundException | NoSuchMethodException e) { /* resolve before enabling cpu metrics */ } Try / catch
try { return ctor.newInstance(); } catch (NoSuchMethodException e) { logger.warn("Unknown CpuLoadMetric : {}", classToLoad); return CpuLoadMetric.UNSUPPORTED_CPU_LOAD_METRIC; } Prevention
- Give custom CpuLoadMetric implementations a public no-arg constructor
- Keep the OS/JVM -> metric-class mapping in sync when upgrading the agent
- Test the metric constructor on all target JVM vendors (HotSpot, OpenJ9, etc.)
- Check CPU metric presence in collector UI after JVM upgrades
When it happens
Trigger: A CPU load metric class name (built from OS/JVM type/version mapping) resolves to a class that changed its constructor signature or was replaced with one requiring arguments.
Common situations: JVM/OS mapping table points at a class refactored between Pinpoint versions; custom CpuLoadMetric implementation without a no-arg constructor configured for the platform.
Related errors
- Error creating CpuLoadMetric [{}]
- Unknown FileDescriptorMetric : {}
- constructor not found
- ModuleSupportFactory() initialize fail
- BufferMetric initialize fail: {}
AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07).
Data as JSON: /api/errors/4d9327ae68364611.
Report an issue: GitHub.