forked from hyperledger/besu
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add tracing support for internals and JSON-RPC (hyperledger#1557)
* Add tracing support for internals and JSON-RPC Signed-off-by: Antoine Toulme <[email protected]> * Remove rocksdb tracing as it slows down execution too much Signed-off-by: Antoine Toulme <[email protected]> * Add B3 headers extraction on JSON-RPC requests Signed-off-by: Antoine Toulme <[email protected]> * Remove traces around trie tree as they slow down syncing significantly Signed-off-by: Antoine Toulme <[email protected]> * Add tracing to fast sync pipeline Signed-off-by: Antoine Toulme <[email protected]> * Add tracing for all pipelines Signed-off-by: Antoine Toulme <[email protected]> * Address code review Signed-off-by: Antoine Toulme <[email protected]> * Add acceptance tests and break out the shaded dependency Signed-off-by: Antoine Toulme <[email protected]> * Fix tracer id Signed-off-by: Antoine Toulme <[email protected]> * Revert changes to trie Signed-off-by: Antoine Toulme <[email protected]> * Upgrade otel to latest, remove old tracing Signed-off-by: Antoine Toulme <[email protected]> * Code review comments Signed-off-by: Antoine Toulme <[email protected]>
- Loading branch information
Showing
33 changed files
with
653 additions
and
256 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
171 changes: 171 additions & 0 deletions
171
...ests/src/test/java/org/hyperledger/besu/tests/acceptance/OpenTelemetryAcceptanceTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,171 @@ | ||
/* | ||
* Copyright ConsenSys AG. | ||
* | ||
* Licensed 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 | ||
* | ||
* http://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. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.hyperledger.besu.tests.acceptance; | ||
|
||
import static java.util.Collections.singletonList; | ||
import static org.assertj.core.api.Assertions.assertThat; | ||
|
||
import org.hyperledger.besu.metrics.MetricsProtocol; | ||
import org.hyperledger.besu.metrics.prometheus.MetricsConfiguration; | ||
import org.hyperledger.besu.tests.acceptance.dsl.AcceptanceTestBase; | ||
import org.hyperledger.besu.tests.acceptance.dsl.WaitUtils; | ||
import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode; | ||
import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.BesuNodeConfigurationBuilder; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
import com.google.common.io.Closer; | ||
import io.grpc.Server; | ||
import io.grpc.Status; | ||
import io.grpc.netty.NettyServerBuilder; | ||
import io.grpc.stub.StreamObserver; | ||
import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest; | ||
import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceResponse; | ||
import io.opentelemetry.proto.collector.metrics.v1.MetricsServiceGrpc; | ||
import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest; | ||
import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse; | ||
import io.opentelemetry.proto.collector.trace.v1.TraceServiceGrpc; | ||
import io.opentelemetry.proto.metrics.v1.ResourceMetrics; | ||
import io.opentelemetry.proto.trace.v1.ResourceSpans; | ||
import org.junit.After; | ||
import org.junit.Before; | ||
import org.junit.Test; | ||
|
||
public class OpenTelemetryAcceptanceTest extends AcceptanceTestBase { | ||
|
||
private static final class FakeCollector extends TraceServiceGrpc.TraceServiceImplBase { | ||
private final List<ResourceSpans> receivedSpans = new ArrayList<>(); | ||
private Status returnedStatus = Status.OK; | ||
|
||
@Override | ||
public void export( | ||
final ExportTraceServiceRequest request, | ||
final StreamObserver<ExportTraceServiceResponse> responseObserver) { | ||
receivedSpans.addAll(request.getResourceSpansList()); | ||
responseObserver.onNext(ExportTraceServiceResponse.newBuilder().build()); | ||
if (!returnedStatus.isOk()) { | ||
if (returnedStatus.getCode() == Status.Code.DEADLINE_EXCEEDED) { | ||
// Do not call onCompleted to simulate a deadline exceeded. | ||
return; | ||
} | ||
responseObserver.onError(returnedStatus.asRuntimeException()); | ||
return; | ||
} | ||
responseObserver.onCompleted(); | ||
} | ||
|
||
List<ResourceSpans> getReceivedSpans() { | ||
return receivedSpans; | ||
} | ||
|
||
void setReturnedStatus(final Status returnedStatus) { | ||
this.returnedStatus = returnedStatus; | ||
} | ||
} | ||
|
||
private static final class FakeMetricsCollector | ||
extends MetricsServiceGrpc.MetricsServiceImplBase { | ||
private final List<ResourceMetrics> receivedMetrics = new ArrayList<>(); | ||
private Status returnedStatus = Status.OK; | ||
|
||
@Override | ||
public void export( | ||
final ExportMetricsServiceRequest request, | ||
final StreamObserver<ExportMetricsServiceResponse> responseObserver) { | ||
|
||
receivedMetrics.addAll(request.getResourceMetricsList()); | ||
responseObserver.onNext(ExportMetricsServiceResponse.newBuilder().build()); | ||
if (!returnedStatus.isOk()) { | ||
if (returnedStatus.getCode() == Status.Code.DEADLINE_EXCEEDED) { | ||
// Do not call onCompleted to simulate a deadline exceeded. | ||
return; | ||
} | ||
responseObserver.onError(returnedStatus.asRuntimeException()); | ||
return; | ||
} | ||
responseObserver.onCompleted(); | ||
} | ||
|
||
List<ResourceMetrics> getReceivedMetrics() { | ||
return receivedMetrics; | ||
} | ||
|
||
void setReturnedStatus(final Status returnedStatus) { | ||
this.returnedStatus = returnedStatus; | ||
} | ||
} | ||
|
||
private final FakeMetricsCollector fakeMetricsCollector = new FakeMetricsCollector(); | ||
private final FakeCollector fakeTracesCollector = new FakeCollector(); | ||
private final Closer closer = Closer.create(); | ||
|
||
private BesuNode metricsNode; | ||
|
||
@Before | ||
public void setUp() throws Exception { | ||
Server server = | ||
NettyServerBuilder.forPort(4317) | ||
.addService(fakeTracesCollector) | ||
.addService(fakeMetricsCollector) | ||
.build() | ||
.start(); | ||
closer.register(server::shutdownNow); | ||
|
||
MetricsConfiguration configuration = | ||
MetricsConfiguration.builder() | ||
.protocol(MetricsProtocol.OPENTELEMETRY) | ||
.enabled(true) | ||
.port(0) | ||
.hostsAllowlist(singletonList("*")) | ||
.build(); | ||
metricsNode = | ||
besu.create( | ||
new BesuNodeConfigurationBuilder() | ||
.name("metrics-node") | ||
.jsonRpcEnabled() | ||
.metricsConfiguration(configuration) | ||
.build()); | ||
cluster.start(metricsNode); | ||
} | ||
|
||
@After | ||
public void tearDown() throws Exception { | ||
closer.close(); | ||
} | ||
|
||
@Test | ||
public void metricsReporting() { | ||
WaitUtils.waitFor( | ||
30, | ||
() -> { | ||
List<ResourceMetrics> resourceMetrics = fakeMetricsCollector.getReceivedMetrics(); | ||
assertThat(resourceMetrics.isEmpty()).isFalse(); | ||
}); | ||
} | ||
|
||
@Test | ||
public void traceReporting() { | ||
|
||
WaitUtils.waitFor( | ||
30, | ||
() -> { | ||
// call the json RPC endpoint to generate a trace. | ||
net.netVersion().verify(metricsNode); | ||
List<ResourceSpans> spans = fakeTracesCollector.getReceivedSpans(); | ||
assertThat(spans.isEmpty()).isFalse(); | ||
}); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.