Skip to content

Commit 1a06ead

Browse files
committed
spring-projectsGH-2198: Observablility Documentation, Polish
Refactor for latest snapshots; add documentation generation. Use NOOP registry and supplier for context. spring-projectsGH-2417: Fix class tangles. Resolves spring-projects#2417 Disable auto doc generation and polish manually.
1 parent 239e350 commit 1a06ead

File tree

13 files changed

+246
-134
lines changed

13 files changed

+246
-134
lines changed

build.gradle

+40-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
buildscript {
22
ext.kotlinVersion = '1.7.0'
3+
ext.isCI = System.getenv('GITHUB_ACTION') || System.getenv('bamboo_buildKey')
34
repositories {
45
mavenCentral()
56
gradlePluginPortal()
@@ -66,8 +67,9 @@ ext {
6667
junitJupiterVersion = '5.9.0'
6768
kafkaVersion = '3.3.1'
6869
log4jVersion = '2.18.0'
69-
micrometerVersion = '1.10.0-M6'
70-
micrometerTracingVersion = '1.0.0-M8'
70+
micrometerDocsVersion = "1.0.0-SNAPSHOT"
71+
micrometerVersion = '1.10.0-SNAPSHOT'
72+
micrometerTracingVersion = '1.0.0-SNAPSHOT'
7173
mockitoVersion = '4.5.1'
7274
reactorVersion = '2022.0.0-M6'
7375
scalaVersion = '2.13'
@@ -241,7 +243,7 @@ subprojects { subproject ->
241243
}
242244

243245
task updateCopyrights {
244-
onlyIf { gitPresent && !System.getenv('GITHUB_ACTION') && !System.getenv('bamboo_buildKey') }
246+
onlyIf { !isCI }
245247
if (gitPresent) {
246248
inputs.files(modifiedFiles.filter { f -> f.path.contains(subproject.name) })
247249
}
@@ -300,13 +302,17 @@ subprojects { subproject ->
300302
tasks.withType(Javadoc) {
301303
options.addBooleanOption('Xdoclint:syntax', true) // only check syntax with doclint
302304
options.addBooleanOption('Werror', true) // fail build on Javadoc warnings
303-
}
305+
}
304306

305307
}
306308

307309
project ('spring-kafka') {
308310
description = 'Spring Kafka Support'
309311

312+
configurations {
313+
adoc
314+
}
315+
310316
dependencies {
311317
api 'org.springframework:spring-context'
312318
api 'org.springframework:spring-messaging'
@@ -346,7 +352,36 @@ project ('spring-kafka') {
346352
testImplementation 'io.micrometer:micrometer-tracing-bridge-brave'
347353
testImplementation 'io.micrometer:micrometer-tracing-test'
348354
testImplementation 'io.micrometer:micrometer-tracing-integration-test'
355+
356+
adoc "io.micrometer:micrometer-docs-generator-spans:$micrometerDocsVersion"
357+
adoc "io.micrometer:micrometer-docs-generator-metrics:$micrometerDocsVersion"
349358
}
359+
360+
def inputDir = file('src/main/java/org/springframework/kafka/support/micrometer').absolutePath
361+
def outputDir = rootProject.file('spring-kafka-docs/src/main/asciidoc').absolutePath
362+
363+
task generateObservabilityMetricsDocs(type: JavaExec) {
364+
onlyIf { !isCI }
365+
mainClass = 'io.micrometer.docs.metrics.DocsFromSources'
366+
inputs.dir(inputDir)
367+
outputs.dir(outputDir)
368+
classpath configurations.adoc
369+
args inputDir, '.*', outputDir
370+
}
371+
372+
task generateObservabilitySpansDocs(type: JavaExec) {
373+
onlyIf { !isCI }
374+
mainClass = 'io.micrometer.docs.spans.DocsFromSources'
375+
inputs.dir(inputDir)
376+
outputs.dir(outputDir)
377+
classpath configurations.adoc
378+
args inputDir, '.*', outputDir
379+
}
380+
381+
// javadoc {
382+
// finalizedBy generateObservabilityMetricsDocs, generateObservabilitySpansDocs
383+
// }
384+
350385
}
351386

352387
project ('spring-kafka-test') {
@@ -564,7 +599,7 @@ task distZip(type: Zip, dependsOn: [docsZip]) { //, schemaZip]) {
564599
into "${baseDir}"
565600
}
566601

567-
from("$project.rootDir") {
602+
from("$project.rootDir") {
568603
include 'LICENSE.txt'
569604
into "${baseDir}"
570605
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[[observability-conventions]]
2+
=== Observability - Conventions
3+
4+
Below you can find a list of all `GlobalObservabilityConventions` and `ObservabilityConventions` declared by this project.
5+
6+
.ObservationConvention implementations
7+
|===
8+
|ObservationConvention Class Name | Applicable ObservationContext Class Name
9+
|`KafkaListenerObservation$DefaultKafkaListenerObservationConvention`|`KafkaRecordReceiverContext`
10+
|`KafkaTemplateObservation$DefaultKafkaTemplateObservationConvention`|`KafkaRecordSenderContext`
11+
|===
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
[[observability-metrics]]
2+
=== Observability - Metrics
3+
4+
Below you can find a list of all samples declared by this project.
5+
6+
[[observability-metrics-listener-observation]]
7+
==== Listener Observation
8+
9+
____
10+
Observation for Apache Kafka listeners.
11+
____
12+
13+
**Metric name** `spring.kafka.listener` (defined by convention class `KafkaListenerObservation$DefaultKafkaListenerObservationConvention`). **Type** `timer` and **base unit** `seconds`.
14+
15+
Name of the enclosing class `KafkaListenerObservation`.
16+
17+
IMPORTANT: All tags must be prefixed with `spring.kafka.listener` prefix!
18+
19+
.Low cardinality Keys
20+
[cols="a,a"]
21+
|===
22+
|Name | Description
23+
|`spring.kafka.listener.id`|Listener id (or listener container bean name).
24+
|===
25+
26+
[[observability-metrics-template-observation]]
27+
==== Template Observation
28+
29+
____
30+
Observation for KafkaTemplates.
31+
____
32+
33+
**Metric name** `spring.kafka.template` (defined by convention class `KafkaTemplateObservation$DefaultKafkaTemplateObservationConvention`). **Type** `timer` and **base unit** `seconds`.
34+
35+
Name of the enclosing class `KafkaTemplateObservation`.
36+
37+
IMPORTANT: All tags must be prefixed with `spring.kafka.template` prefix!
38+
39+
.Low cardinality Keys
40+
[cols="a,a"]
41+
|===
42+
|Name | Description
43+
|`spring.kafka.template.name`|Bean name of the template.
44+
|===
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
[[observability-spans]]
2+
=== Observability - Spans
3+
4+
Below you can find a list of all spans declared by this project.
5+
6+
[[observability-spans-listener-observation]]
7+
==== Listener Observation Span
8+
9+
> Observation for Apache Kafka listeners.
10+
11+
**Span name** `spring.kafka.listener` (defined by convention class `KafkaListenerObservation$DefaultKafkaListenerObservationConvention`).
12+
13+
Name of the enclosing class `KafkaListenerObservation`.
14+
15+
IMPORTANT: All tags and event names must be prefixed with `spring.kafka.listener` prefix!
16+
17+
.Tag Keys
18+
|===
19+
|Name | Description
20+
|`spring.kafka.listener.id`|Listener id (or listener container bean name).
21+
|===
22+
23+
[[observability-spans-template-observation]]
24+
==== Template Observation Span
25+
26+
> Observation for KafkaTemplates.
27+
28+
**Span name** `spring.kafka.template` (defined by convention class `KafkaTemplateObservation$DefaultKafkaTemplateObservationConvention`).
29+
30+
Name of the enclosing class `KafkaTemplateObservation`.
31+
32+
IMPORTANT: All tags and event names must be prefixed with `spring.kafka.template` prefix!
33+
34+
.Tag Keys
35+
|===
36+
|Name | Description
37+
|`spring.kafka.template.name`|Bean name of the template.
38+
|===

spring-kafka-docs/src/main/asciidoc/appendix.adoc

+10
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,16 @@ dependencies {
4949

5050
The test scope dependencies are only needed if you are using the embedded Kafka broker in tests.
5151

52+
[appendix]
53+
[[observation-gen]]
54+
== Micrometer Observation Documentation
55+
56+
include::./_metrics.adoc[]
57+
58+
include::./_spans.adoc[]
59+
60+
include::./_conventions.adoc[]
61+
5262
[appendix]
5363
[[history]]
5464
== Change History

spring-kafka-docs/src/main/asciidoc/kafka.adoc

+2
Original file line numberDiff line numberDiff line change
@@ -3415,6 +3415,8 @@ The default implementations add the `bean.name` tag for template observations an
34153415

34163416
You can either subclass `DefaultKafkaTemplateObservationConvention` or `DefaultKafkaListenerObservationConvention` or provide completely new implementations.
34173417

3418+
See <<observation-gen>> for details of the observations that are recorded.
3419+
34183420
[[transactions]]
34193421
==== Transactions
34203422

spring-kafka/src/main/java/org/springframework/kafka/core/KafkaTemplate.java

+8-12
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.concurrent.CompletableFuture;
2929
import java.util.concurrent.ExecutionException;
3030
import java.util.concurrent.Future;
31+
import java.util.function.Supplier;
3132

3233
import org.apache.commons.logging.LogFactory;
3334
import org.apache.kafka.clients.consumer.Consumer;
@@ -64,9 +65,9 @@
6465
import org.springframework.kafka.support.TopicPartitionOffset;
6566
import org.springframework.kafka.support.converter.MessagingMessageConverter;
6667
import org.springframework.kafka.support.converter.RecordMessageConverter;
67-
import org.springframework.kafka.support.micrometer.DefaultKafkaTemplateObservationConvention;
6868
import org.springframework.kafka.support.micrometer.KafkaRecordSenderContext;
6969
import org.springframework.kafka.support.micrometer.KafkaTemplateObservation;
70+
import org.springframework.kafka.support.micrometer.KafkaTemplateObservation.DefaultKafkaTemplateObservationConvention;
7071
import org.springframework.kafka.support.micrometer.KafkaTemplateObservationConvention;
7172
import org.springframework.kafka.support.micrometer.MicrometerHolder;
7273
import org.springframework.lang.Nullable;
@@ -145,7 +146,7 @@ public class KafkaTemplate<K, V> implements KafkaOperations<K, V>, ApplicationCo
145146

146147
private KafkaTemplateObservationConvention observationConvention;
147148

148-
private ObservationRegistry observationRegistry;
149+
private ObservationRegistry observationRegistry = ObservationRegistry.NOOP;
149150

150151
/**
151152
* Create an instance using the supplied producer factory and autoFlush false.
@@ -418,7 +419,7 @@ public void setObservationConvention(KafkaTemplateObservationConvention observat
418419

419420
@Override
420421
public void afterSingletonsInstantiated() {
421-
if (this.observationEnabled && this.observationRegistry == null && this.applicationContext != null) {
422+
if (this.observationEnabled && this.applicationContext != null) {
422423
ObjectProvider<ObservationRegistry> registry =
423424
this.applicationContext.getBeanProvider(ObservationRegistry.class);
424425
this.observationRegistry = registry.getIfUnique();
@@ -668,15 +669,10 @@ protected void closeProducer(Producer<K, V> producer, boolean inTx) {
668669
}
669670

670671
private CompletableFuture<SendResult<K, V>> observeSend(final ProducerRecord<K, V> producerRecord) {
671-
Observation observation;
672-
if (!this.observationEnabled || this.observationRegistry == null) {
673-
observation = Observation.NOOP;
674-
}
675-
else {
676-
observation = KafkaTemplateObservation.TEMPLATE_OBSERVATION.observation(
677-
this.observationConvention, DefaultKafkaTemplateObservationConvention.INSTANCE,
678-
new KafkaRecordSenderContext(producerRecord, this.beanName), this.observationRegistry);
679-
}
672+
Observation observation = KafkaTemplateObservation.TEMPLATE_OBSERVATION.observation(
673+
this.observationConvention, DefaultKafkaTemplateObservationConvention.INSTANCE,
674+
(Supplier<KafkaRecordSenderContext>) () -> new KafkaRecordSenderContext(producerRecord, this.beanName),
675+
this.observationRegistry);
680676
try {
681677
observation.start();
682678
return doSend(producerRecord, observation);

spring-kafka/src/main/java/org/springframework/kafka/listener/KafkaMessageListenerContainer.java

+11-14
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import java.util.concurrent.TimeUnit;
4444
import java.util.concurrent.atomic.AtomicBoolean;
4545
import java.util.function.BiConsumer;
46+
import java.util.function.Supplier;
4647
import java.util.regex.Pattern;
4748
import java.util.stream.Collectors;
4849

@@ -107,8 +108,8 @@
107108
import org.springframework.kafka.support.LogIfLevelEnabled;
108109
import org.springframework.kafka.support.TopicPartitionOffset;
109110
import org.springframework.kafka.support.TopicPartitionOffset.SeekPosition;
110-
import org.springframework.kafka.support.micrometer.DefaultKafkaListenerObservationConvention;
111111
import org.springframework.kafka.support.micrometer.KafkaListenerObservation;
112+
import org.springframework.kafka.support.micrometer.KafkaListenerObservation.DefaultKafkaListenerObservationConvention;
112113
import org.springframework.kafka.support.micrometer.KafkaRecordReceiverContext;
113114
import org.springframework.kafka.support.micrometer.MicrometerHolder;
114115
import org.springframework.kafka.support.serializer.DeserializationException;
@@ -365,9 +366,9 @@ protected void doStart() {
365366
}
366367
GenericMessageListener<?> listener = (GenericMessageListener<?>) messageListener;
367368
ListenerType listenerType = determineListenerType(listener);
368-
ObservationRegistry observationRegistry = null;
369+
ObservationRegistry observationRegistry = ObservationRegistry.NOOP;
369370
ApplicationContext applicationContext = getApplicationContext();
370-
if (applicationContext != null) {
371+
if (applicationContext != null && containerProperties.isObservationEnabled()) {
371372
ObjectProvider<ObservationRegistry> registry =
372373
applicationContext.getBeanProvider(ObservationRegistry.class);
373374
observationRegistry = registry.getIfUnique();
@@ -827,7 +828,7 @@ private final class ListenerConsumer implements SchedulingAwareRunnable, Consume
827828

828829
@SuppressWarnings(UNCHECKED)
829830
ListenerConsumer(GenericMessageListener<?> listener, ListenerType listenerType,
830-
@Nullable ObservationRegistry observationRegistry) {
831+
ObservationRegistry observationRegistry) {
831832

832833
this.observationRegistry = observationRegistry;
833834
Properties consumerProperties = propertiesFromProperties();
@@ -2706,16 +2707,12 @@ private RuntimeException doInvokeRecordListener(final ConsumerRecord<K, V> recor
27062707
Iterator<ConsumerRecord<K, V>> iterator) {
27072708

27082709
Object sample = startMicrometerSample();
2709-
Observation observation;
2710-
if (!this.containerProperties.isObservationEnabled() || this.observationRegistry == null) {
2711-
observation = Observation.NOOP;
2712-
}
2713-
else {
2714-
observation = KafkaListenerObservation.LISTENER_OBSERVATION.observation(
2715-
this.containerProperties.getObservationConvention(),
2716-
DefaultKafkaListenerObservationConvention.INSTANCE,
2717-
new KafkaRecordReceiverContext(record, getListenerId()), this.observationRegistry);
2718-
}
2710+
Observation observation = KafkaListenerObservation.LISTENER_OBSERVATION.observation(
2711+
this.containerProperties.getObservationConvention(),
2712+
DefaultKafkaListenerObservationConvention.INSTANCE,
2713+
(Supplier<KafkaRecordReceiverContext>) () -> new KafkaRecordReceiverContext(record,
2714+
getListenerId()),
2715+
this.observationRegistry);
27192716
return observation.observe(() -> {
27202717
try {
27212718
invokeOnMessage(record);

spring-kafka/src/main/java/org/springframework/kafka/support/micrometer/DefaultKafkaListenerObservationConvention.java

-47
This file was deleted.

0 commit comments

Comments
 (0)