Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Micrometer Observation instrumentation #4980

Merged
merged 37 commits into from
Aug 17, 2023
Merged
Changes from 1 commit
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
55fa451
WIP
marcingrzejszczak Jun 21, 2023
78d62eb
WIP - context propagation tests failing
marcingrzejszczak Jun 22, 2023
ecbc899
Fixed copyrights
marcingrzejszczak Jun 22, 2023
cd72deb
fix failing tests
jrhee17 Jun 27, 2023
d3c2bc2
minor cleanups
jrhee17 Jun 27, 2023
6562ff5
minor fixes
jrhee17 Jun 27, 2023
214b6fc
remove unused spi
jrhee17 Jun 27, 2023
8018775
Applied changes from the review + added automatic docs generation
marcingrzejszczak Jun 28, 2023
b3fc09d
add documentation
jrhee17 Jun 29, 2023
8bec68e
revive scope decorator test
jrhee17 Jun 29, 2023
23f016d
expose contexts
jrhee17 Jun 29, 2023
abacc55
context is exposed publicly, more documentation
jrhee17 Jun 29, 2023
5495d42
lint
jrhee17 Jun 29, 2023
dc3ee88
add unstable annotations
jrhee17 Jun 29, 2023
ecc9eb2
Removed remote address setting
marcingrzejszczak Jun 30, 2023
c9d2e8d
Update observation/src/main/java/com/linecorp/armeria/client/observat…
jrhee17 Jul 3, 2023
e5d0a17
move observation to the core module
jrhee17 Jul 10, 2023
ff965e8
fix build failure
jrhee17 Jul 11, 2023
399bf53
remove unused test
jrhee17 Jul 11, 2023
0394860
Update core/src/main/java/com/linecorp/armeria/server/observation/Mic…
marcingrzejszczak Jul 14, 2023
340ce15
Update core/src/main/java/com/linecorp/armeria/client/observation/Mic…
marcingrzejszczak Jul 14, 2023
c7691b6
Apply suggestions from code review
marcingrzejszczak Jul 14, 2023
9a2cee0
Applied changes following the review
marcingrzejszczak Jul 14, 2023
103f564
fix failing build
jrhee17 Jul 25, 2023
d8721a6
lint
jrhee17 Jul 25, 2023
ea6930c
lint
jrhee17 Jul 25, 2023
a176311
Update core/src/main/java/com/linecorp/armeria/client/observation/Def…
marcingrzejszczak Jul 30, 2023
ee94f5f
Update core/src/main/java/com/linecorp/armeria/client/observation/Cli…
marcingrzejszczak Jul 30, 2023
c3fb07f
Update core/src/main/java/com/linecorp/armeria/client/observation/Obs…
marcingrzejszczak Jul 30, 2023
792b26e
Update core/src/main/java/com/linecorp/armeria/client/observation/Obs…
marcingrzejszczak Jul 30, 2023
26c3af5
Update core/src/main/java/com/linecorp/armeria/server/observation/Def…
marcingrzejszczak Jul 30, 2023
4e2500f
Update core/src/main/java/com/linecorp/armeria/server/observation/Obs…
marcingrzejszczak Jul 30, 2023
6d75d8b
Update core/src/main/java/com/linecorp/armeria/server/observation/Obs…
marcingrzejszczak Jul 30, 2023
202a97a
Apply suggestions from code review
marcingrzejszczak Aug 14, 2023
9653ad0
Added some javadocs + reformatted the code
marcingrzejszczak Aug 14, 2023
581ef5d
Updated toml entry for micrometer tracing
marcingrzejszczak Aug 14, 2023
868c8ea
fix build
jrhee17 Aug 15, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
move observation to the core module
jrhee17 authored and marcingrzejszczak committed Aug 16, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit e5d0a17d1ac7d7e1afd6803756b503b9edb93f54
12 changes: 12 additions & 0 deletions core/build.gradle
Original file line number Diff line number Diff line change
@@ -156,6 +156,18 @@ dependencies {
optionalImplementation libs.brotli4j.osx
optionalImplementation libs.brotli4j.osx.aarch64
optionalImplementation libs.brotli4j.windows

// for testing the observation API with tracing
testImplementation (libs.micrometer.tracing.integration.test) {
exclude group: "org.mockito"
}
if (project.ext.targetJavaVersion >= 11) {
testImplementation project(':thrift0.18')
} else {
testImplementation project(':thrift0.17')
}
testImplementation libs.brave.context.slf4j
testImplementation libs.brave.instrumentation.http.tests
}

if (!rootProject.hasProperty('noWeb')) {
Original file line number Diff line number Diff line change
@@ -22,14 +22,13 @@
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.logging.RequestLog;

import io.micrometer.observation.Observation;
import io.micrometer.observation.Observation.Context;
import io.micrometer.observation.ObservationConvention;
import io.micrometer.observation.ObservationHandler;
import io.micrometer.observation.transport.RequestReplySenderContext;

/**
* A {@link Observation.Context} which may be used in conjunction with {@link MicrometerObservationClient}
* A {@link Context} which may be used in conjunction with {@link MicrometerObservationClient}
* to implement custom {@link ObservationConvention}s or {@link ObservationHandler}s.
* <pre>{@code
* ObservationConvention<HttpClientContext> convention = ...
Original file line number Diff line number Diff line change
@@ -21,14 +21,13 @@
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.server.ServiceRequestContext;

import io.micrometer.observation.Observation;
import io.micrometer.observation.Observation.Context;
import io.micrometer.observation.ObservationConvention;
import io.micrometer.observation.ObservationHandler;
import io.micrometer.observation.transport.RequestReplyReceiverContext;

/**
* A {@link Observation.Context} which may be used in conjunction with {@link MicrometerObservationService}
* A {@link Context} which may be used in conjunction with {@link MicrometerObservationService}
* to implement custom {@link ObservationConvention}s or {@link ObservationHandler}s.
* <pre>{@code
* ObservationConvention<HttpServerContext> convention = ...
Original file line number Diff line number Diff line change
@@ -35,9 +35,9 @@
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MicrometerObservationRegistryUtils;
import com.linecorp.armeria.common.SessionProtocol;
import com.linecorp.armeria.common.util.SafeCloseable;
import com.linecorp.armeria.internal.common.observation.MicrometerObservationRegistryUtils;
import com.linecorp.armeria.server.ServiceRequestContext;

import brave.propagation.CurrentTraceContext;
Original file line number Diff line number Diff line change
@@ -17,7 +17,7 @@
package com.linecorp.armeria.client.observation;

import static com.linecorp.armeria.client.observation.MicrometerObservationClient.newDecorator;
import static com.linecorp.armeria.common.MicrometerObservationRegistryUtils.observationRegistry;
import static com.linecorp.armeria.internal.common.observation.MicrometerObservationRegistryUtils.observationRegistry;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
@@ -52,10 +52,9 @@
import com.linecorp.armeria.common.RpcResponse;
import com.linecorp.armeria.common.SessionProtocol;
import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.brave.HelloService;
import com.linecorp.armeria.common.brave.SpanCollector;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.util.SafeCloseable;
import com.linecorp.armeria.internal.common.observation.SpanCollector;

import brave.Span.Kind;
import brave.Tracing;
@@ -235,7 +234,7 @@ private static RequestLog testRemoteInvocation(Tracing tracing, @Nullable String
.of(RequestHeaders.of(HttpMethod.POST, "/hello/armeria",
HttpHeaderNames.SCHEME, "http",
HttpHeaderNames.AUTHORITY, "foo.com"));
final RpcRequest rpcReq = RpcRequest.of(HelloService.Iface.class,
final RpcRequest rpcReq = RpcRequest.of(Object.class,
"hello", "Armeria");
final HttpResponse res = HttpResponse.of(HttpStatus.OK);
final RpcResponse rpcRes = RpcResponse.of("Hello, Armeria!");
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* Copyright 2023 LINE Corporation
*
* LINE Corporation licenses this file to you under the Apache License,
* version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at:
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/

package com.linecorp.armeria.internal.common.observation;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import brave.Tracing;
import brave.http.HttpTracing;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler;
import io.micrometer.core.instrument.observation.MeterObservationHandler;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import io.micrometer.observation.ObservationHandler;
import io.micrometer.observation.ObservationRegistry;
import io.micrometer.tracing.brave.bridge.BraveBaggageManager;
import io.micrometer.tracing.brave.bridge.BraveCurrentTraceContext;
import io.micrometer.tracing.brave.bridge.BravePropagator;
import io.micrometer.tracing.brave.bridge.BraveTracer;
import io.micrometer.tracing.handler.DefaultTracingObservationHandler;
import io.micrometer.tracing.handler.PropagatingReceiverTracingObservationHandler;
import io.micrometer.tracing.handler.PropagatingSenderTracingObservationHandler;
import io.micrometer.tracing.handler.TracingObservationHandler;

public final class MicrometerObservationRegistryUtils {

public static ObservationRegistry observationRegistry(HttpTracing httpTracing) {
return observationRegistry(httpTracing.tracing());
}

public static ObservationRegistry observationRegistry(Tracing tracing) {
final BraveCurrentTraceContext braveCurrentTraceContext = new BraveCurrentTraceContext(
tracing.currentTraceContext());
final BravePropagator bravePropagator = new BravePropagator(tracing);
final BraveTracer braveTracer = new BraveTracer(tracing.tracer(), braveCurrentTraceContext,
new BraveBaggageManager());
final List<TracingObservationHandler<?>> tracingHandlers =
Arrays.asList(new PropagatingSenderTracingObservationHandler<>(braveTracer, bravePropagator),
new PropagatingReceiverTracingObservationHandler<>(braveTracer, bravePropagator),
new DefaultTracingObservationHandler(braveTracer));

final MeterRegistry meterRegistry = new SimpleMeterRegistry();
final List<MeterObservationHandler<?>> meterHandlers = Collections.singletonList(
new DefaultMeterObservationHandler(meterRegistry));

final ObservationRegistry observationRegistry = ObservationRegistry.create();
observationRegistry.observationConfig().observationHandler(
new ObservationHandler.CompositeObservationHandler.FirstMatchingCompositeObservationHandler(
tracingHandlers));
observationRegistry.observationConfig().observationHandler(
new ObservationHandler.CompositeObservationHandler.FirstMatchingCompositeObservationHandler(
meterHandlers));
return observationRegistry;
}

private MicrometerObservationRegistryUtils() {}
}
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@
* under the License.
*/

package com.linecorp.armeria.common.brave;
package com.linecorp.armeria.internal.common.observation;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedTransferQueue;
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@
* under the License.
*/

package com.linecorp.armeria.it;
package com.linecorp.armeria.internal.common.observation.it;

import static org.assertj.core.api.Assertions.assertThat;
import static org.awaitility.Awaitility.await;
@@ -34,8 +34,8 @@
import com.linecorp.armeria.client.observation.HttpClientContext;
import com.linecorp.armeria.client.observation.MicrometerObservationClient;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MicrometerObservationRegistryUtils;
import com.linecorp.armeria.common.brave.SpanCollector;
import com.linecorp.armeria.internal.common.observation.MicrometerObservationRegistryUtils;
import com.linecorp.armeria.internal.common.observation.SpanCollector;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.observation.HttpServerContext;
Original file line number Diff line number Diff line change
@@ -39,16 +39,15 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MicrometerObservationRegistryUtils;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
import com.linecorp.armeria.common.brave.HelloService;
import com.linecorp.armeria.common.brave.SpanCollector;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestLogBuilder;
import com.linecorp.armeria.common.util.SafeCloseable;
import com.linecorp.armeria.internal.common.observation.MicrometerObservationRegistryUtils;
import com.linecorp.armeria.internal.common.observation.SpanCollector;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.server.TransientHttpService;
@@ -228,7 +227,7 @@ private static RequestLog testServiceInvocation(SpanHandler spanHandler,
HttpHeaderNames.SCHEME, "http",
HttpHeaderNames.AUTHORITY, "foo.com"));
final ServiceRequestContext ctx = ServiceRequestContext.builder(req).build();
final RpcRequest rpcReq = RpcRequest.of(HelloService.Iface.class, "hello", "trustin");
final RpcRequest rpcReq = RpcRequest.of(Object.class, "hello", "trustin");
final HttpResponse res = HttpResponse.of(HttpStatus.OK);
final RpcResponse rpcRes = RpcResponse.of("Hello, trustin!");
final RequestLogBuilder logBuilder = ctx.logBuilder();
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@
import com.linecorp.armeria.client.logging.LoggingClient;
import com.linecorp.armeria.client.observation.MicrometerObservationClient;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MicrometerObservationRegistryUtils;
import com.linecorp.armeria.internal.common.observation.MicrometerObservationRegistryUtils;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.logging.LoggingService;
import com.linecorp.armeria.testing.junit5.server.ServerExtension;
33 changes: 0 additions & 33 deletions observation/build.gradle

This file was deleted.

5 changes: 0 additions & 5 deletions observation/src/test/thrift/HelloService.thrift

This file was deleted.

1 change: 0 additions & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
@@ -55,7 +55,6 @@ includeWithFlags ':kotlin', 'java', 'publish', 'rel
includeWithFlags ':logback', 'java', 'publish', 'relocate'
includeWithFlags ':logback13', 'java', 'publish', 'relocate', 'no_aggregation'
includeWithFlags ':oauth2', 'java', 'publish', 'relocate'
includeWithFlags ':observation', 'java', 'publish', 'relocate'
includeWithFlags ':protobuf', 'java', 'publish', 'relocate'
includeWithFlags ':reactor3', 'java', 'publish', 'relocate'
includeWithFlags ':resilience4j2', 'java17', 'publish', 'relocate'
7 changes: 7 additions & 0 deletions thrift/thrift0.13/build.gradle
Original file line number Diff line number Diff line change
@@ -15,6 +15,13 @@ dependencies {
testImplementation libs.dropwizard.metrics.core
testImplementation libs.micrometer.prometheus
testImplementation libs.prometheus

// micrometer tracing
testImplementation (libs.micrometer.tracing.integration.test) {
exclude group: "org.mockito"
}
// testImplementation libs.brave.context.slf4j
testImplementation libs.brave.instrumentation.http.tests
}

// Use the old compiler.
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
package com.linecorp.armeria.it.brave;
package com.linecorp.armeria.it.observation;

import static com.google.common.collect.ImmutableList.toImmutableList;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
@@ -61,10 +61,7 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.MicrometerObservationRegistryUtils;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.brave.HelloService;
import com.linecorp.armeria.common.brave.HelloService.AsyncIface;
import com.linecorp.armeria.common.thrift.ThriftFuture;
import com.linecorp.armeria.internal.testing.BlockingUtils;
import com.linecorp.armeria.server.AbstractHttpService;
@@ -73,6 +70,8 @@
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.server.observation.MicrometerObservationService;
import com.linecorp.armeria.server.thrift.THttpService;
import com.linecorp.armeria.service.test.thrift.main.HelloService;
import com.linecorp.armeria.service.test.thrift.main.HelloService.AsyncIface;
import com.linecorp.armeria.testing.junit5.server.ServerExtension;

import brave.ScopedSpan;
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@
* under the License.
*/

package com.linecorp.armeria.common;
package com.linecorp.armeria.it.observation;

import java.util.Arrays;
import java.util.Collections;