Skip to content

Commit

Permalink
Upgrade OpenTelemetry to 1.2.0
Browse files Browse the repository at this point in the history
Signed-off-by: Antoine Toulme <antoine@lunar-ocean.com>
  • Loading branch information
atoulme committed May 22, 2021
1 parent f4cea44 commit 53dca98
Show file tree
Hide file tree
Showing 11 changed files with 131 additions and 108 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -3,6 +3,7 @@
## 21.1.7

### Additions and Improvements
* Upgrade OpenTelemetry to 1.2.0. [\#2313](https://github.com/hyperledger/besu/pull/2313)

### Bug Fixes

Expand Down
2 changes: 1 addition & 1 deletion besu/src/main/java/org/hyperledger/besu/Runner.java
Expand Up @@ -106,6 +106,7 @@ public class Runner implements AutoCloseable {
public void start() {
try {
LOG.info("Starting Ethereum main loop ... ");
metrics.ifPresent(service -> waitForServiceToStart("metrics", service.start()));
natService.start();
networkRunner.start();
if (networkRunner.getNetwork().isP2pEnabled()) {
Expand All @@ -120,7 +121,6 @@ public void start() {
jsonRpc.ifPresent(service -> waitForServiceToStart("jsonRpc", service.start()));
graphQLHttp.ifPresent(service -> waitForServiceToStart("graphQLHttp", service.start()));
websocketRpc.ifPresent(service -> waitForServiceToStart("websocketRpc", service.start()));
metrics.ifPresent(service -> waitForServiceToStart("metrics", service.start()));
ethStatsService.ifPresent(EthStatsService::start);
LOG.info("Ethereum main loop is up.");
writeBesuPortsToFile();
Expand Down
Expand Up @@ -70,13 +70,14 @@
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapGetter;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.extension.trace.propagation.B3Propagator;
import io.opentelemetry.extension.trace.propagation.JaegerPropagator;
import io.opentelemetry.extension.trace.propagation.TraceMultiPropagator;
import io.vertx.core.CompositeFuture;
import io.vertx.core.Future;
import io.vertx.core.Handler;
Expand Down Expand Up @@ -114,13 +115,13 @@ public class JsonRpcHttpService {
private static final String EMPTY_RESPONSE = "";

private static final TextMapPropagator traceFormats =
TraceMultiPropagator.create(
TextMapPropagator.composite(
JaegerPropagator.getInstance(),
B3Propagator.getInstance(),
B3Propagator.injectingSingleHeader(),
W3CBaggagePropagator.getInstance());

private static final TextMapPropagator.Getter<HttpServerRequest> requestAttributesGetter =
new TextMapPropagator.Getter<>() {
private static final TextMapGetter<HttpServerRequest> requestAttributesGetter =
new TextMapGetter<>() {
@Override
public Iterable<String> keys(final HttpServerRequest carrier) {
return carrier.headers().names();
Expand All @@ -142,7 +143,7 @@ public String get(final @Nullable HttpServerRequest carrier, final String key) {
private final NatService natService;
private final Path dataDir;
private final LabelledMetric<OperationTimer> requestTimer;
private final Tracer tracer;
private Tracer tracer;
private final int maxActiveConnections;
private final AtomicInteger activeConnectionsCount = new AtomicInteger();

Expand Down Expand Up @@ -210,7 +211,6 @@ private JsonRpcHttpService(
this.authenticationService = authenticationService;
this.livenessService = livenessService;
this.readinessService = readinessService;
this.tracer = GlobalOpenTelemetry.getTracer("org.hyperledger.besu.jsonrpc", "1.0.0");
this.maxActiveConnections = config.getMaxActiveConnections();
}

Expand All @@ -226,6 +226,7 @@ private void validateConfig(final JsonRpcConfiguration config) {
public CompletableFuture<?> start() {
LOG.info("Starting JSON-RPC service on {}:{}", config.getHost(), config.getPort());
LOG.debug("max number of active connections {}", maxActiveConnections);
this.tracer = GlobalOpenTelemetry.getTracer("org.hyperledger.besu.jsonrpc", "1.0.0");

final CompletableFuture<?> resultFuture = new CompletableFuture<>();
try {
Expand Down Expand Up @@ -365,7 +366,7 @@ private void createSpan(final RoutingContext routingContext) {
tracer
.spanBuilder(address.host() + ":" + address.port())
.setParent(parent)
.setSpanKind(Span.Kind.SERVER)
.setSpanKind(SpanKind.SERVER)
.startSpan();
routingContext.put(SPAN_CONTEXT, Context.current().with(serverSpan));

Expand Down Expand Up @@ -695,7 +696,7 @@ private JsonRpcResponse process(
Span span =
tracer
.spanBuilder(requestBody.getMethod())
.setSpanKind(Span.Kind.INTERNAL)
.setSpanKind(SpanKind.INTERNAL)
.setParent(ctx.get(SPAN_CONTEXT))
.startSpan();
try {
Expand Down
Expand Up @@ -37,9 +37,6 @@
import java.util.List;

import com.google.common.collect.ImmutableList;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

Expand All @@ -57,9 +54,6 @@ TransactionReceipt create(

private static final Logger LOG = LogManager.getLogger();

private static final Tracer tracer =
OpenTelemetry.getGlobalTracer("org.hyperledger.besu.block", "1.0.0");

static final int MAX_GENERATION = 6;

public static class Result implements BlockProcessor.Result {
Expand Down Expand Up @@ -156,68 +150,62 @@ public AbstractBlockProcessor.Result processBlock(
final List<Transaction> transactions,
final List<BlockHeader> ommers,
final PrivateMetadataUpdater privateMetadataUpdater) {
final Span globalProcessBlock =
tracer.spanBuilder("processBlock").setSpanKind(Span.Kind.INTERNAL).startSpan();
try {
final List<TransactionReceipt> receipts = new ArrayList<>();
long currentGasUsed = 0;
for (final Transaction transaction : transactions) {
if (!hasAvailableBlockBudget(blockHeader, transaction, currentGasUsed)) {
return AbstractBlockProcessor.Result.failed();
}

final WorldUpdater worldStateUpdater = worldState.updater();
final BlockHashLookup blockHashLookup = new BlockHashLookup(blockHeader, blockchain);
final Address miningBeneficiary =
miningBeneficiaryCalculator.calculateBeneficiary(blockHeader);

final TransactionProcessingResult result =
transactionProcessor.processTransaction(
blockchain,
worldStateUpdater,
blockHeader,
transaction,
miningBeneficiary,
OperationTracer.NO_TRACING,
blockHashLookup,
true,
TransactionValidationParams.processingBlock(),
privateMetadataUpdater);
if (result.isInvalid()) {
LOG.info(
"Block processing error: transaction invalid '{}'. Block {} Transaction {}",
result.getValidationResult().getInvalidReason(),
blockHeader.getHash().toHexString(),
transaction.getHash().toHexString());
if (worldState instanceof BonsaiPersistedWorldState) {
((BonsaiWorldStateUpdater) worldStateUpdater).reset();
}
return AbstractBlockProcessor.Result.failed();
}

worldStateUpdater.commit();

currentGasUsed += transaction.getGasLimit() - result.getGasRemaining();

final TransactionReceipt transactionReceipt =
transactionReceiptFactory.create(
transaction.getType(), result, worldState, currentGasUsed);
receipts.add(transactionReceipt);
final List<TransactionReceipt> receipts = new ArrayList<>();
long currentGasUsed = 0;
for (final Transaction transaction : transactions) {
if (!hasAvailableBlockBudget(blockHeader, transaction, currentGasUsed)) {
return AbstractBlockProcessor.Result.failed();
}

if (!rewardCoinbase(worldState, blockHeader, ommers, skipZeroBlockRewards)) {
// no need to log, rewardCoinbase logs the error.
final WorldUpdater worldStateUpdater = worldState.updater();
final BlockHashLookup blockHashLookup = new BlockHashLookup(blockHeader, blockchain);
final Address miningBeneficiary =
miningBeneficiaryCalculator.calculateBeneficiary(blockHeader);

final TransactionProcessingResult result =
transactionProcessor.processTransaction(
blockchain,
worldStateUpdater,
blockHeader,
transaction,
miningBeneficiary,
OperationTracer.NO_TRACING,
blockHashLookup,
true,
TransactionValidationParams.processingBlock(),
privateMetadataUpdater);
if (result.isInvalid()) {
LOG.info(
"Block processing error: transaction invalid '{}'. Block {} Transaction {}",
result.getValidationResult().getInvalidReason(),
blockHeader.getHash().toHexString(),
transaction.getHash().toHexString());
if (worldState instanceof BonsaiPersistedWorldState) {
((BonsaiWorldStateUpdater) worldState.updater()).reset();
((BonsaiWorldStateUpdater) worldStateUpdater).reset();
}
return AbstractBlockProcessor.Result.failed();
}

worldState.persist(blockHeader);
return AbstractBlockProcessor.Result.successful(receipts);
} finally {
globalProcessBlock.end();
worldStateUpdater.commit();

currentGasUsed += transaction.getGasLimit() - result.getGasRemaining();

final TransactionReceipt transactionReceipt =
transactionReceiptFactory.create(
transaction.getType(), result, worldState, currentGasUsed);
receipts.add(transactionReceipt);
}

if (!rewardCoinbase(worldState, blockHeader, ommers, skipZeroBlockRewards)) {
// no need to log, rewardCoinbase logs the error.
if (worldState instanceof BonsaiPersistedWorldState) {
((BonsaiWorldStateUpdater) worldState.updater()).reset();
}
return AbstractBlockProcessor.Result.failed();
}

worldState.persist(blockHeader);
return AbstractBlockProcessor.Result.successful(receipts);
}

protected boolean hasAvailableBlockBudget(
Expand Down
17 changes: 9 additions & 8 deletions gradle/versions.gradle
Expand Up @@ -57,18 +57,19 @@ dependencyManagement {
dependency 'io.netty:netty-tcnative-boringssl-static:2.0.35.Final'
dependency group: 'io.netty', name: 'netty-transport-native-epoll', version:'4.1.56.Final', classifier: 'linux-x86_64'

dependency 'io.opentelemetry:opentelemetry-api:0.13.1'
dependency 'io.opentelemetry:opentelemetry-exporter-otlp-metrics:0.13.1-alpha'
dependency 'io.opentelemetry:opentelemetry-exporter-otlp:0.13.1'
dependency 'io.opentelemetry:opentelemetry-extension-trace-propagators:0.13.1'
dependency 'io.opentelemetry:opentelemetry-proto:0.13.1'
dependency 'io.opentelemetry:opentelemetry-sdk-trace:0.13.1'
dependency 'io.opentelemetry:opentelemetry-sdk:0.13.1'
dependency 'io.opentelemetry:opentelemetry-api:1.2.0'
dependency 'io.opentelemetry:opentelemetry-exporter-otlp-metrics:1.2.0-alpha'
dependency 'io.opentelemetry:opentelemetry-exporter-otlp:1.2.0'
dependency 'io.opentelemetry:opentelemetry-extension-trace-propagators:1.2.0'
dependency 'io.opentelemetry:opentelemetry-proto:1.2.0-alpha'
dependency 'io.opentelemetry:opentelemetry-sdk-trace:1.2.0'
dependency 'io.opentelemetry:opentelemetry-sdk:1.2.0'
dependency 'io.opentelemetry:opentelemetry-semconv:1.2.0-alpha'

dependency 'io.opentracing.contrib:opentracing-okhttp3:3.0.0'
dependency 'io.opentracing:opentracing-api:0.33.0'
dependency 'io.opentracing:opentracing-util:0.33.0'
dependency 'io.jaegertracing:jaeger-client:1.5.0'
dependency 'io.jaegertracing:jaeger-client:1.6.0'

dependency 'io.pkts:pkts-core:3.0.7'

Expand Down
2 changes: 2 additions & 0 deletions metrics/core/build.gradle
Expand Up @@ -45,9 +45,11 @@ dependencies {
implementation 'io.netty:netty-all'
implementation 'io.opentelemetry:opentelemetry-api'
implementation 'io.opentelemetry:opentelemetry-sdk'
implementation 'io.opentelemetry:opentelemetry-semconv'
implementation 'io.opentelemetry:opentelemetry-sdk-trace'
implementation 'io.opentelemetry:opentelemetry-exporter-otlp'
implementation 'io.opentelemetry:opentelemetry-exporter-otlp-metrics'
implementation 'io.opentelemetry:opentelemetry-proto'

implementation 'io.prometheus:simpleclient'
implementation 'io.prometheus:simpleclient_common'
Expand Down
Expand Up @@ -27,6 +27,8 @@
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.metrics.export.IntervalMetricReader;
import io.opentelemetry.sdk.metrics.export.IntervalMetricReaderBuilder;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
import org.apache.logging.log4j.LogManager;
Expand All @@ -52,23 +54,16 @@ public MetricsOtelGrpcPushService(
public CompletableFuture<?> start() {
LOG.info("Starting OpenTelemetry push service");
OtlpGrpcMetricExporter exporter = OtlpGrpcMetricExporter.getDefault();
IntervalMetricReader.Builder builder =
IntervalMetricReaderBuilder builder =
IntervalMetricReader.builder()
.setExportIntervalMillis(configuration.getPushInterval() * 1000L)
.readEnvironmentVariables()
.readSystemProperties()
.setMetricProducers(
Collections.singleton(metricsSystem.getMeterSdkProvider().getMetricProducer()))
.setMetricProducers(Collections.singleton(metricsSystem.getMeterSdkProvider()))
.setMetricExporter(exporter);
this.periodicReader = builder.build();
this.spanProcessor =
BatchSpanProcessor.builder(
OtlpGrpcSpanExporter.builder()
.readSystemProperties()
.readEnvironmentVariables()
.build())
.build();
OpenTelemetrySdk.get().getTracerManagement().addSpanProcessor(spanProcessor);
this.periodicReader = builder.buildAndStart();
this.spanProcessor = BatchSpanProcessor.builder(OtlpGrpcSpanExporter.builder().build()).build();
OpenTelemetrySdk.builder()
.setTracerProvider(SdkTracerProvider.builder().addSpanProcessor(spanProcessor).build())
.buildAndRegisterGlobal();
return CompletableFuture.completedFuture(null);
}

Expand Down
Expand Up @@ -20,8 +20,9 @@
import java.util.ArrayList;
import java.util.List;

import io.opentelemetry.api.common.Labels;
import io.opentelemetry.api.metrics.BoundLongCounter;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.common.Labels;

public class OpenTelemetryCounter implements LabelledMetric<Counter> {

Expand All @@ -41,14 +42,14 @@ public Counter labels(final String... labelValues) {
labelKeysAndValues.add(labelValues[i]);
}
final Labels labels = Labels.of(labelKeysAndValues.toArray(new String[] {}));
LongCounter.BoundLongCounter boundLongCounter = counter.bind(labels);
BoundLongCounter boundLongCounter = counter.bind(labels);
return new OpenTelemetryCounter.UnlabelledCounter(boundLongCounter);
}

private static class UnlabelledCounter implements Counter {
private final LongCounter.BoundLongCounter counter;
private final BoundLongCounter counter;

private UnlabelledCounter(final LongCounter.BoundLongCounter counter) {
private UnlabelledCounter(final BoundLongCounter counter) {
this.counter = counter;
}

Expand Down

0 comments on commit 53dca98

Please sign in to comment.