|
37 | 37 | import java.util.concurrent.atomic.AtomicReference;
|
38 | 38 | import java.util.function.Supplier;
|
39 | 39 |
|
| 40 | +import static java.util.Collections.EMPTY_MAP; |
40 | 41 | import static org.assertj.core.api.Assertions.assertThat;
|
41 | 42 |
|
42 | 43 | class KafkaMetricsTest {
|
@@ -402,4 +403,130 @@ void shouldUseMetricFromSupplierIndirectly() {
|
402 | 403 | .isEqualTo(2.0)
|
403 | 404 | ); // referencing the new value since the map was updated in checkAndBindMetrics
|
404 | 405 | }
|
| 406 | + |
| 407 | + @Issue("#2843") |
| 408 | + @Test |
| 409 | + void shouldRemoveOldMeters() { |
| 410 | + Map<MetricName, Metric> kafkaMetricMap = new HashMap<>(); |
| 411 | + Supplier<Map<MetricName, ? extends Metric>> supplier = () -> kafkaMetricMap; |
| 412 | + kafkaMetrics = new KafkaMetrics(supplier); |
| 413 | + MeterRegistry registry = new SimpleMeterRegistry(); |
| 414 | + registry.config().commonTags("commonTest", "42"); |
| 415 | + kafkaMetrics.bindTo(registry); |
| 416 | + assertThat(registry.getMeters()).hasSize(0); |
| 417 | + |
| 418 | + MetricName aMetric = createMetricName("a"); |
| 419 | + MetricName bMetric = createMetricName("b"); |
| 420 | + |
| 421 | + kafkaMetricMap.put(aMetric, createKafkaMetric(aMetric)); |
| 422 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 423 | + assertThat(registry.getMeters()).hasSize(1); |
| 424 | + |
| 425 | + kafkaMetricMap.clear(); |
| 426 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 427 | + assertThat(registry.getMeters()).hasSize(0); |
| 428 | + |
| 429 | + kafkaMetricMap.put(aMetric, createKafkaMetric(aMetric)); |
| 430 | + kafkaMetricMap.put(bMetric, createKafkaMetric(bMetric)); |
| 431 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 432 | + assertThat(registry.getMeters()).hasSize(2); |
| 433 | + |
| 434 | + kafkaMetricMap.clear(); |
| 435 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 436 | + assertThat(registry.getMeters()).hasSize(0); |
| 437 | + |
| 438 | + kafkaMetricMap.put(aMetric, createKafkaMetric(aMetric)); |
| 439 | + kafkaMetricMap.put(bMetric, createKafkaMetric(bMetric)); |
| 440 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 441 | + assertThat(registry.getMeters()).hasSize(2); |
| 442 | + |
| 443 | + kafkaMetricMap.remove(bMetric); |
| 444 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 445 | + assertThat(registry.getMeters()).hasSize(1); |
| 446 | + assertThat(registry.getMeters().get(0).getId().getName()).isEqualTo("kafka.test.a"); |
| 447 | + |
| 448 | + kafkaMetricMap.clear(); |
| 449 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 450 | + assertThat(registry.getMeters()).hasSize(0); |
| 451 | + } |
| 452 | + |
| 453 | + @Issue("#2843") |
| 454 | + @Test |
| 455 | + void shouldRemoveOldMetersWithTags() { |
| 456 | + Map<MetricName, Metric> kafkaMetricMap = new HashMap<>(); |
| 457 | + Supplier<Map<MetricName, ? extends Metric>> supplier = () -> kafkaMetricMap; |
| 458 | + kafkaMetrics = new KafkaMetrics(supplier); |
| 459 | + MeterRegistry registry = new SimpleMeterRegistry(); |
| 460 | + registry.config().commonTags("commonTest", "42"); |
| 461 | + kafkaMetrics.bindTo(registry); |
| 462 | + assertThat(registry.getMeters()).hasSize(0); |
| 463 | + |
| 464 | + MetricName aMetricV1 = createMetricName("a", "foo", "v1"); |
| 465 | + MetricName aMetricV2 = createMetricName("a", "foo", "v2"); |
| 466 | + MetricName bMetric = createMetricName("b", "foo", "n/a"); |
| 467 | + |
| 468 | + kafkaMetricMap.put(aMetricV1, createKafkaMetric(aMetricV1)); |
| 469 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 470 | + assertThat(registry.getMeters()).hasSize(1); |
| 471 | + |
| 472 | + kafkaMetricMap.clear(); |
| 473 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 474 | + assertThat(registry.getMeters()).hasSize(0); |
| 475 | + |
| 476 | + kafkaMetricMap.put(aMetricV1, createKafkaMetric(aMetricV1)); |
| 477 | + kafkaMetricMap.put(aMetricV2, createKafkaMetric(aMetricV2)); |
| 478 | + kafkaMetricMap.put(bMetric, createKafkaMetric(bMetric)); |
| 479 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 480 | + assertThat(registry.getMeters()).hasSize(3); |
| 481 | + |
| 482 | + kafkaMetricMap.clear(); |
| 483 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 484 | + assertThat(registry.getMeters()).hasSize(0); |
| 485 | + |
| 486 | + kafkaMetricMap.put(aMetricV1, createKafkaMetric(aMetricV1)); |
| 487 | + kafkaMetricMap.put(aMetricV2, createKafkaMetric(aMetricV2)); |
| 488 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 489 | + assertThat(registry.getMeters()).hasSize(2); |
| 490 | + |
| 491 | + kafkaMetricMap.remove(aMetricV1); |
| 492 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 493 | + assertThat(registry.getMeters()).hasSize(1); |
| 494 | + assertThat(registry.getMeters().get(0).getId().getName()).isEqualTo("kafka.test.a"); |
| 495 | + assertThat(registry.getMeters().get(0).getId().getTags()).containsExactlyInAnyOrder( |
| 496 | + Tag.of("commonTest", "42"), |
| 497 | + Tag.of("kafka.version", "unknown"), |
| 498 | + Tag.of("foo", "v2") |
| 499 | + ); |
| 500 | + |
| 501 | + kafkaMetricMap.clear(); |
| 502 | + kafkaMetrics.checkAndBindMetrics(registry); |
| 503 | + assertThat(registry.getMeters()).hasSize(0); |
| 504 | + } |
| 505 | + |
| 506 | + @SuppressWarnings("unchecked") |
| 507 | + private MetricName createMetricName(String name) { |
| 508 | + return createMetricName(name, EMPTY_MAP); |
| 509 | + } |
| 510 | + |
| 511 | + private MetricName createMetricName(String name, String... keyValues) { |
| 512 | + if (keyValues.length % 2 == 1) { |
| 513 | + throw new IllegalArgumentException("size must be even, it is a set of key=value pairs"); |
| 514 | + } |
| 515 | + else { |
| 516 | + Map<String, String> tagsMap = new HashMap<>(); |
| 517 | + for (int i = 0; i < keyValues.length; i += 2) { |
| 518 | + tagsMap.put(keyValues[i], keyValues[i + 1]); |
| 519 | + } |
| 520 | + |
| 521 | + return createMetricName(name, tagsMap); |
| 522 | + } |
| 523 | + } |
| 524 | + |
| 525 | + private MetricName createMetricName(String name, Map<String, String> tags) { |
| 526 | + return new MetricName(name, "test", "for testing", tags); |
| 527 | + } |
| 528 | + |
| 529 | + private KafkaMetric createKafkaMetric(MetricName metricName) { |
| 530 | + return new KafkaMetric(this, metricName, new Value(), new MetricConfig(), Time.SYSTEM); |
| 531 | + } |
405 | 532 | }
|
0 commit comments