{"record":{"id":"177384d06122001b","repo":"pinpoint-apm/pinpoint","slug":"invalid-samplingrate","errorCode":null,"errorMessage":"Invalid samplingRate ","messagePattern":"Invalid samplingRate ","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/sampler/CountingSampler.java","lineNumber":34,"sourceCode":"\npackage com.navercorp.pinpoint.profiler.sampler;\n\nimport com.navercorp.pinpoint.bootstrap.sampler.Sampler;\nimport com.navercorp.pinpoint.common.util.MathUtils;\n\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/**\n * @author emeroad\n */\npublic class CountingSampler implements Sampler {\n\n    private final AtomicInteger counter = new AtomicInteger(0);\n    private final int samplingRate;\n\n    public CountingSampler(int samplingRate) {\n        if (samplingRate <= 0) {\n            throw new IllegalArgumentException(\"Invalid samplingRate \" + samplingRate);\n        }\n        this.samplingRate = samplingRate;\n    }\n\n\n    @Override\n    public boolean isSampling() {\n        int samplingCount = counter.getAndIncrement();\n        int isSampling = MathUtils.floorMod(samplingCount, samplingRate);\n        return isSampling == 0;\n    }\n\n    @Override\n    public String toString() {\n        return \"SamplingRateSampler{\" +\n                    \"counter=\" + counter +\n                    \"samplingRate=\" + samplingRate +\n                '}';","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/sampler/CountingSampler.java#L16-L52","documentation":"CountingSampler samples 1 of every N requests; its constructor requires samplingRate > 0 and throws IllegalArgumentException for zero or negative values. The rate is the denominator of the counting strategy, so 0 is meaningless and negative is invalid.","triggerScenarios":"Constructing new CountingSampler(0) or new CountingSampler(<0), typically from profiler config Profiler.sampling.rate=0 or a parsed/interpolated config value resolving to <= 0.","commonSituations":"User sets profiler.sampling.rate=0 intending \"sample nothing\" (should use a disabling sampler instead), or config parsing yields 0 due to a placeholder not being substituted.","solutions":["Set profiler.sampling.rate (or the constructor argument) to a positive integer >= 1","If the intent is to never sample, configure sampling.type to disable/never-sampling rather than rate 0","Check the config source/placeholder resolution so the value isn't interpolated to 0"],"exampleFix":"// before\nsampling.rate=0\n// after\nsampling.rate=7","handlingStrategy":"validation","validationCode":"int rate = Integer.parseInt(props.getProperty(\"profiler.sampling.rate\"));\nif (rate <= 0) throw new IllegalArgumentException(\"profiler.sampling.rate must be >= 1, got \" + rate);","typeGuard":"boolean isValidSamplingRate(Integer r) { return r != null && r > 0; }","tryCatchPattern":"try { sampler = new CountingSampler(rate); } catch (IllegalArgumentException e) { log.error(\"Bad sampling rate: {}\", e.getMessage()); sampler = Samplers.createSamplingSampler(...); }","preventionTips":["Never set profiler.sampling.rate to 0; use a non-sampling sampler type for that intent","Validate config values at startup with clear messages","Beware unresolved placeholders interpolating to 0"],"tags":["java","sampler","configuration"],"backgroundTag":"argument-out-of-range","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}