use of org.apache.kafka.common.metrics.stats.TokenBucket in project kafka by apache.
the class SensorTest method testStrictQuotaEnforcementWithTokenBucket.
@Test
public void testStrictQuotaEnforcementWithTokenBucket() {
final Time time = new MockTime(0, System.currentTimeMillis(), 0);
final Metrics metrics = new Metrics(time);
final Sensor sensor = metrics.sensor("sensor", new MetricConfig().quota(Quota.upperBound(2)).timeWindow(1, TimeUnit.SECONDS).samples(10));
final MetricName metricName = metrics.metricName("credits", "test-group");
assertTrue(sensor.add(metricName, new TokenBucket()));
final KafkaMetric tkMetric = metrics.metric(metricName);
// Recording a first value at T+0 to bring the remaining credits below zero
strictRecord(sensor, 30, time.milliseconds());
assertEquals(-10, tkMetric.measurableValue(time.milliseconds()), 0.1);
// Theoretically, we should wait 5s to bring back the avg rate to the define quota:
// 10 / 2 = 5s
time.sleep(5000);
// Unlike the default rate based on a windowed sum, it works as expected.
assertEquals(0, tkMetric.measurableValue(time.milliseconds()), 0.1);
strictRecord(sensor, 30, time.milliseconds());
assertEquals(-30, tkMetric.measurableValue(time.milliseconds()), 0.1);
metrics.close();
}
use of org.apache.kafka.common.metrics.stats.TokenBucket in project kafka by apache.
the class TokenBucketTest method testUnrecord.
@Test
public void testUnrecord() {
// Rate = 5 unit / sec
// Burst = 2 * 10 = 20 units
MetricConfig config = new MetricConfig().quota(Quota.upperBound(5)).timeWindow(2, TimeUnit.SECONDS).samples(10);
TokenBucket tk = new TokenBucket();
// Expect 100 credits at T
assertEquals(100, tk.measure(config, time.milliseconds()), 0.1);
// Record -60 at T, expect 100 credits
tk.record(config, -60, time.milliseconds());
assertEquals(100, tk.measure(config, time.milliseconds()), 0.1);
// Advance by 2s, record 60, expect 40 credits
time.sleep(2000);
tk.record(config, 60, time.milliseconds());
assertEquals(40, tk.measure(config, time.milliseconds()), 0.1);
// Advance by 2s, record -60, expect 100 credits
time.sleep(2000);
tk.record(config, -60, time.milliseconds());
assertEquals(100, tk.measure(config, time.milliseconds()), 0.1);
}
use of org.apache.kafka.common.metrics.stats.TokenBucket in project kafka by apache.
the class TokenBucketTest method testRecord.
@Test
public void testRecord() {
// Rate = 5 unit / sec
// Burst = 2 * 10 = 20 units
MetricConfig config = new MetricConfig().quota(Quota.upperBound(5)).timeWindow(2, TimeUnit.SECONDS).samples(10);
TokenBucket tk = new TokenBucket();
// Expect 100 credits at T
assertEquals(100, tk.measure(config, time.milliseconds()), 0.1);
// Record 60 at T, expect 13 credits
tk.record(config, 60, time.milliseconds());
assertEquals(40, tk.measure(config, time.milliseconds()), 0.1);
// Advance by 2s, record 5, expect 45 credits
time.sleep(2000);
tk.record(config, 5, time.milliseconds());
assertEquals(45, tk.measure(config, time.milliseconds()), 0.1);
// Advance by 2s, record 60, expect -5 credits
time.sleep(2000);
tk.record(config, 60, time.milliseconds());
assertEquals(-5, tk.measure(config, time.milliseconds()), 0.1);
}
Aggregations