Skip to content

Instantly share code, notes, and snippets.

@breedx-splk
Created February 3, 2021 01:09
Show Gist options
  • Save breedx-splk/63dc268cf8e774abf2faa309d04d9ef5 to your computer and use it in GitHub Desktop.
Save breedx-splk/63dc268cf8e774abf2faa309d04d9ef5 to your computer and use it in GitHub Desktop.
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.trace;
import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.config.TraceConfig;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Supplier;
// Represents the shared state/config between all Tracers created by the same TracerProvider.
final class TracerSharedState {
private final Clock clock;
private final IdGenerator idGenerator;
private final Resource resource;
private final Supplier<TraceConfig> traceConfigSupplier;
private final Sampler sampler;
private final SpanProcessor activeSpanProcessor;
private final AtomicBoolean isStopped = new AtomicBoolean(false);
private final AtomicReference<CompletableResultCode> shutdownResult = new AtomicReference<>();
TracerSharedState(
Clock clock,
IdGenerator idGenerator,
Resource resource,
Supplier<TraceConfig> traceConfigSupplier,
Sampler sampler,
List<SpanProcessor> spanProcessors) {
this.clock = clock;
this.idGenerator = idGenerator;
this.resource = resource;
this.traceConfigSupplier = traceConfigSupplier;
this.sampler = sampler;
activeSpanProcessor = SpanProcessor.composite(spanProcessors);
}
Clock getClock() {
return clock;
}
IdGenerator getIdGenerator() {
return idGenerator;
}
Resource getResource() {
return resource;
}
/**
* Returns the active {@code TraceConfig}.
*
* @return the active {@code TraceConfig}.
*/
TraceConfig getActiveTraceConfig() {
return traceConfigSupplier.get();
}
/** Returns the configured {@link Sampler}. */
Sampler getSampler() {
return sampler;
}
/**
* Returns the active {@code SpanProcessor}.
*
* @return the active {@code SpanProcessor}.
*/
SpanProcessor getActiveSpanProcessor() {
return activeSpanProcessor;
}
/**
* Returns {@code true} if tracing is stopped.
*
* @return {@code true} if tracing is stopped.
*/
boolean isStopped() {
return isStopped.get();
}
/**
* Stops tracing, including shutting down processors and set to {@code true} {@link #isStopped()}.
*
* @return a {@link CompletableResultCode} that will be completed when the span processor is shut
* down.
*/
CompletableResultCode shutdown() {
boolean firstTime = isStopped.compareAndSet(false, true);
if(firstTime) {
shutdownResult.set(activeSpanProcessor.shutdown());
}
return shutdownResult.get();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment