PerOperationSampler implements Sampler { public synchronized boolean update(final OperationSamplingParameters strategies) { boolean isUpdated = false; lowerBound = strategies.getDefaultLowerBoundTracesPerSecond(); ProbabilisticSampler defaultSampler = new ProbabilisticSampler(strategies.getDefaultSamplingProbability()); if (!defaultSampler.equals(this.defaultSampler)) { this.defaultSampler = defaultSampler; isUpdated = true; } Map<String, GuaranteedThroughputSampler> newOpsSamplers = new HashMap<String, GuaranteedThroughputSampler>(); for (PerOperationSamplingParameters strategy : strategies.getPerOperationStrategies()) { String operation = strategy.getOperation(); double samplingRate = strategy.getProbabilisticSampling().getSamplingRate(); GuaranteedThroughputSampler sampler = operationNameToSampler.get(operation); if (sampler != null) { isUpdated = sampler.update(samplingRate, lowerBound) || isUpdated; newOpsSamplers.put(operation, sampler); } else { if (newOpsSamplers.size() < maxOperations) { sampler = new GuaranteedThroughputSampler(samplingRate, lowerBound); newOpsSamplers.put(operation, sampler); isUpdated = true; } else { log.info("Exceeded the maximum number of operations({}) for per operations sampling", maxOperations); } } } operationNameToSampler = newOpsSamplers; return isUpdated; } PerOperationSampler(int maxOperations, OperationSamplingParameters strategies); synchronized boolean update(final OperationSamplingParameters strategies); @Override synchronized SamplingStatus sample(String operation, long id); @Override synchronized void close();  }
@Test public void testUpdate() { GuaranteedThroughputSampler guaranteedThroughputSampler = mock(GuaranteedThroughputSampler.class); operationToSamplers.put(OPERATION, guaranteedThroughputSampler); PerOperationSamplingParameters perOperationSamplingParameters = new PerOperationSamplingParameters(OPERATION, new ProbabilisticSamplingStrategy(SAMPLING_RATE)); List<PerOperationSamplingParameters> parametersList = new ArrayList<>(); parametersList.add(perOperationSamplingParameters); OperationSamplingParameters parameters = new OperationSamplingParameters(DEFAULT_SAMPLING_PROBABILITY, DEFAULT_LOWER_BOUND_TRACES_PER_SECOND, parametersList); assertTrue(undertest.update(parameters)); verify(guaranteedThroughputSampler).update(SAMPLING_RATE, DEFAULT_LOWER_BOUND_TRACES_PER_SECOND); verifyNoMoreInteractions(guaranteedThroughputSampler); }
@Test public void testNoopUpdate() { ProbabilisticSampler defaultProbabilisticSampler = new ProbabilisticSampler(DEFAULT_SAMPLING_PROBABILITY); double operationSamplingRate = 0.23; operationToSamplers.put(OPERATION, new GuaranteedThroughputSampler(operationSamplingRate, DEFAULT_LOWER_BOUND_TRACES_PER_SECOND)); undertest = new PerOperationSampler(MAX_OPERATIONS, operationToSamplers, defaultProbabilisticSampler, DEFAULT_LOWER_BOUND_TRACES_PER_SECOND); List<PerOperationSamplingParameters> parametersList = new ArrayList<>(); parametersList.add(new PerOperationSamplingParameters(OPERATION, new ProbabilisticSamplingStrategy(operationSamplingRate))); OperationSamplingParameters parameters = new OperationSamplingParameters(DEFAULT_SAMPLING_PROBABILITY, DEFAULT_LOWER_BOUND_TRACES_PER_SECOND, parametersList); assertFalse(undertest.update(parameters)); assertEquals(operationToSamplers, undertest.getOperationNameToSampler()); assertEquals(DEFAULT_LOWER_BOUND_TRACES_PER_SECOND, undertest.getLowerBound(), DELTA); assertEquals(DEFAULT_SAMPLING_PROBABILITY, undertest.getDefaultSampler().getSamplingRate(), DELTA); }
@Test public void testUpdateIgnoreGreaterThanMax() { GuaranteedThroughputSampler guaranteedThroughputSampler = mock(GuaranteedThroughputSampler.class); operationToSamplers.put(OPERATION, guaranteedThroughputSampler); PerOperationSampler undertest = new PerOperationSampler(1, operationToSamplers, defaultProbabilisticSampler, DEFAULT_LOWER_BOUND_TRACES_PER_SECOND); PerOperationSamplingParameters perOperationSamplingParameters1 = new PerOperationSamplingParameters(OPERATION, new ProbabilisticSamplingStrategy(SAMPLING_RATE)); PerOperationSamplingParameters perOperationSamplingParameters2 = new PerOperationSamplingParameters("second OPERATION", new ProbabilisticSamplingStrategy(SAMPLING_RATE)); List<PerOperationSamplingParameters> parametersList = new ArrayList<>(); parametersList.add(perOperationSamplingParameters1); parametersList.add(perOperationSamplingParameters2); undertest.update(new OperationSamplingParameters(DEFAULT_SAMPLING_PROBABILITY, DEFAULT_LOWER_BOUND_TRACES_PER_SECOND, parametersList)); assertEquals(1, undertest.getOperationNameToSampler().size()); assertNotNull(undertest.getOperationNameToSampler().get(OPERATION)); }
@Test public void testUpdateAddOperation() { PerOperationSamplingParameters perOperationSamplingParameters1 = new PerOperationSamplingParameters(OPERATION, new ProbabilisticSamplingStrategy(SAMPLING_RATE)); List<PerOperationSamplingParameters> parametersList = new ArrayList<>(); parametersList.add(perOperationSamplingParameters1); undertest.update(new OperationSamplingParameters(DEFAULT_SAMPLING_PROBABILITY, DEFAULT_LOWER_BOUND_TRACES_PER_SECOND, parametersList)); assertEquals(1, undertest.getOperationNameToSampler().size()); assertEquals(new GuaranteedThroughputSampler(SAMPLING_RATE, DEFAULT_LOWER_BOUND_TRACES_PER_SECOND), undertest.getOperationNameToSampler().get(OPERATION)); }
@Test public void testAbsentOperationIsRemoved() { String absentOp = "ShouldBeRemoved"; operationToSamplers.put(absentOp, mock(GuaranteedThroughputSampler.class)); PerOperationSamplingParameters perOperationSamplingParameters1 = new PerOperationSamplingParameters(OPERATION, new ProbabilisticSamplingStrategy(SAMPLING_RATE)); List<PerOperationSamplingParameters> parametersList = new ArrayList<>(); parametersList.add(perOperationSamplingParameters1); undertest.update(new OperationSamplingParameters(DEFAULT_SAMPLING_PROBABILITY, DEFAULT_LOWER_BOUND_TRACES_PER_SECOND, parametersList)); assertEquals(1, undertest.getOperationNameToSampler().size()); assertEquals(new GuaranteedThroughputSampler(SAMPLING_RATE, DEFAULT_LOWER_BOUND_TRACES_PER_SECOND), undertest.getOperationNameToSampler().get(OPERATION)); assertFalse(undertest.getOperationNameToSampler().containsKey(absentOp)); }