Skip to content

Commit

Permalink
Add instrumenter option (#2349)
Browse files Browse the repository at this point in the history
  • Loading branch information
adinauer committed Nov 14, 2022
1 parent 425ede7 commit 110ae5e
Show file tree
Hide file tree
Showing 14 changed files with 193 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import io.sentry.IHub;
import io.sentry.ISpan;
import io.sentry.ITransaction;
import io.sentry.Instrumenter;
import io.sentry.Integration;
import io.sentry.Scope;
import io.sentry.SentryLevel;
Expand Down Expand Up @@ -197,7 +198,10 @@ private void startTracing(final @NotNull Activity activity) {
// start specific span for app start
appStartSpan =
transaction.startChild(
getAppStartOp(coldStart), getAppStartDesc(coldStart), appStartTime);
getAppStartOp(coldStart),
getAppStartDesc(coldStart),
appStartTime,
Instrumenter.SENTRY);
}

// lets bind to the scope so other integrations can pick it up
Expand Down
21 changes: 16 additions & 5 deletions sentry/api/sentry.api
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,7 @@ public abstract interface class io/sentry/ISpan {
public abstract fun setThrowable (Ljava/lang/Throwable;)V
public abstract fun startChild (Ljava/lang/String;)Lio/sentry/ISpan;
public abstract fun startChild (Ljava/lang/String;Ljava/lang/String;)Lio/sentry/ISpan;
public abstract fun startChild (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;)Lio/sentry/ISpan;
public abstract fun startChild (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Lio/sentry/Instrumenter;)Lio/sentry/ISpan;
public abstract fun toBaggageHeader (Ljava/util/List;)Lio/sentry/BaggageHeader;
public abstract fun toSentryTrace ()Lio/sentry/SentryTraceHeader;
public abstract fun traceContext ()Lio/sentry/TraceContext;
Expand Down Expand Up @@ -531,6 +531,13 @@ public abstract interface class io/sentry/ITransportFactory {
public abstract fun create (Lio/sentry/SentryOptions;Lio/sentry/RequestDetails;)Lio/sentry/transport/ITransport;
}

public final class io/sentry/Instrumenter : java/lang/Enum {
public static final field OTEL Lio/sentry/Instrumenter;
public static final field SENTRY Lio/sentry/Instrumenter;
public static fun valueOf (Ljava/lang/String;)Lio/sentry/Instrumenter;
public static fun values ()[Lio/sentry/Instrumenter;
}

public abstract interface class io/sentry/Integration {
public abstract fun register (Lio/sentry/IHub;Lio/sentry/SentryOptions;)V
}
Expand Down Expand Up @@ -740,7 +747,7 @@ public final class io/sentry/NoOpSpan : io/sentry/ISpan {
public fun setThrowable (Ljava/lang/Throwable;)V
public fun startChild (Ljava/lang/String;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Lio/sentry/Instrumenter;)Lio/sentry/ISpan;
public fun toBaggageHeader (Ljava/util/List;)Lio/sentry/BaggageHeader;
public fun toSentryTrace ()Lio/sentry/SentryTraceHeader;
public fun traceContext ()Lio/sentry/TraceContext;
Expand Down Expand Up @@ -779,7 +786,7 @@ public final class io/sentry/NoOpTransaction : io/sentry/ITransaction {
public fun setThrowable (Ljava/lang/Throwable;)V
public fun startChild (Ljava/lang/String;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Lio/sentry/Instrumenter;)Lio/sentry/ISpan;
public fun toBaggageHeader (Ljava/util/List;)Lio/sentry/BaggageHeader;
public fun toSentryTrace ()Lio/sentry/SentryTraceHeader;
public fun traceContext ()Lio/sentry/TraceContext;
Expand Down Expand Up @@ -1369,6 +1376,7 @@ public class io/sentry/SentryOptions {
public fun getIgnoredExceptionsForType ()Ljava/util/Set;
public fun getInAppExcludes ()Ljava/util/List;
public fun getInAppIncludes ()Ljava/util/List;
public fun getInstrumenter ()Lio/sentry/Instrumenter;
public fun getIntegrations ()Ljava/util/List;
public fun getLogger ()Lio/sentry/ILogger;
public fun getMaxAttachmentSize ()J
Expand Down Expand Up @@ -1449,6 +1457,7 @@ public class io/sentry/SentryOptions {
public fun setFlushTimeoutMillis (J)V
public fun setHostnameVerifier (Ljavax/net/ssl/HostnameVerifier;)V
public fun setIdleTimeout (Ljava/lang/Long;)V
public fun setInstrumenter (Lio/sentry/Instrumenter;)V
public fun setLogger (Lio/sentry/ILogger;)V
public fun setMaxAttachmentSize (J)V
public fun setMaxBreadcrumbs (I)V
Expand Down Expand Up @@ -1578,7 +1587,7 @@ public final class io/sentry/SentryTracer : io/sentry/ITransaction {
public fun setThrowable (Ljava/lang/Throwable;)V
public fun startChild (Ljava/lang/String;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Lio/sentry/Instrumenter;)Lio/sentry/ISpan;
public fun toBaggageHeader (Ljava/util/List;)Lio/sentry/BaggageHeader;
public fun toSentryTrace ()Lio/sentry/SentryTraceHeader;
public fun traceContext ()Lio/sentry/TraceContext;
Expand Down Expand Up @@ -1684,7 +1693,7 @@ public final class io/sentry/Span : io/sentry/ISpan {
public fun setThrowable (Ljava/lang/Throwable;)V
public fun startChild (Ljava/lang/String;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;)Lio/sentry/ISpan;
public fun startChild (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Lio/sentry/Instrumenter;)Lio/sentry/ISpan;
public fun toBaggageHeader (Ljava/util/List;)Lio/sentry/BaggageHeader;
public fun toSentryTrace ()Lio/sentry/SentryTraceHeader;
public fun traceContext ()Lio/sentry/TraceContext;
Expand Down Expand Up @@ -1848,10 +1857,12 @@ public final class io/sentry/TransactionContext : io/sentry/SpanContext {
public static fun fromSentryTrace (Ljava/lang/String;Lio/sentry/protocol/TransactionNameSource;Ljava/lang/String;Lio/sentry/SentryTraceHeader;Lio/sentry/Baggage;)Lio/sentry/TransactionContext;
public static fun fromSentryTrace (Ljava/lang/String;Ljava/lang/String;Lio/sentry/SentryTraceHeader;)Lio/sentry/TransactionContext;
public fun getBaggage ()Lio/sentry/Baggage;
public fun getInstrumenter ()Lio/sentry/Instrumenter;
public fun getName ()Ljava/lang/String;
public fun getParentSampled ()Ljava/lang/Boolean;
public fun getParentSamplingDecision ()Lio/sentry/TracesSamplingDecision;
public fun getTransactionNameSource ()Lio/sentry/protocol/TransactionNameSource;
public fun setInstrumenter (Lio/sentry/Instrumenter;)V
public fun setParentSampled (Ljava/lang/Boolean;)V
public fun setParentSampled (Ljava/lang/Boolean;Ljava/lang/Boolean;)V
}
Expand Down
9 changes: 9 additions & 0 deletions sentry/src/main/java/io/sentry/Hub.java
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,15 @@ public void flush(long timeoutMillis) {
SentryLevel.WARNING,
"Instance is disabled and this 'startTransaction' returns a no-op.");
transaction = NoOpTransaction.getInstance();
} else if (!options.getInstrumenter().equals(transactionContext.getInstrumenter())) {
options
.getLogger()
.log(
SentryLevel.DEBUG,
"Returning no-op for instrumenter %s as the SDK has been configured to use instrumenter %s",
transactionContext.getInstrumenter(),
options.getInstrumenter());
transaction = NoOpTransaction.getInstance();
} else if (!options.isTracingEnabled()) {
options
.getLogger()
Expand Down
5 changes: 4 additions & 1 deletion sentry/src/main/java/io/sentry/ISpan.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ public interface ISpan {
@ApiStatus.Internal
@NotNull
ISpan startChild(
@NotNull String operation, @Nullable String description, @Nullable Date timestamp);
@NotNull String operation,
@Nullable String description,
@Nullable Date timestamp,
@NotNull Instrumenter instrumenter);

/**
* Starts a child Span.
Expand Down
12 changes: 12 additions & 0 deletions sentry/src/main/java/io/sentry/Instrumenter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package io.sentry;

/**
* Which framework is responsible for instrumenting. This includes starting and stopping of
* transactions and spans.
*/
public enum Instrumenter {
SENTRY,

/** OpenTelemetry */
OTEL
}
5 changes: 4 additions & 1 deletion sentry/src/main/java/io/sentry/NoOpSpan.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ public static NoOpSpan getInstance() {

@Override
public @NotNull ISpan startChild(
@NotNull String operation, @Nullable String description, @Nullable Date timestamp) {
@NotNull String operation,
@Nullable String description,
@Nullable Date timestamp,
@NotNull Instrumenter instrumenter) {
return NoOpSpan.getInstance();
}

Expand Down
5 changes: 4 additions & 1 deletion sentry/src/main/java/io/sentry/NoOpTransaction.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@ public void setName(@NotNull String name, @NotNull TransactionNameSource transac

@Override
public @NotNull ISpan startChild(
@NotNull String operation, @Nullable String description, @Nullable Date timestamp) {
@NotNull String operation,
@Nullable String description,
@Nullable Date timestamp,
@NotNull Instrumenter instrumenter) {
return NoOpSpan.getInstance();
}

Expand Down
25 changes: 25 additions & 0 deletions sentry/src/main/java/io/sentry/SentryOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,9 @@ public class SentryOptions {
/** Modules (dependencies, packages) that will be send along with each event. */
private @NotNull IModulesLoader modulesLoader = NoOpModulesLoader.getInstance();

/** Which framework is responsible for instrumenting. */
private @NotNull Instrumenter instrumenter = Instrumenter.SENTRY;

/**
* Adds an event processor
*
Expand Down Expand Up @@ -1741,6 +1744,28 @@ public void setSendClientReports(boolean sendClientReports) {
}
}

/**
* Sets the instrumenter used for performance instrumentation.
*
* <p>If you set this to something other than {{@link Instrumenter#SENTRY}} Sentry will not create
* any transactions automatically nor will it create transactions if you call
* startTransaction(...), nor will it create child spans if you call startChild(...)
*
* @param instrumenter - the instrumenter to use
*/
public void setInstrumenter(final @NotNull Instrumenter instrumenter) {
this.instrumenter = instrumenter;
}

/**
* Returns the instrumenter used for performance instrumentation
*
* @return the configured instrumenter
*/
public @NotNull Instrumenter getInstrumenter() {
return instrumenter;
}

/**
* Returns a ClientReportRecorder or a NoOp if sending of client reports has been disabled.
*
Expand Down
34 changes: 25 additions & 9 deletions sentry/src/main/java/io/sentry/SentryTracer.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ public final class SentryTracer implements ITransaction {
private final @NotNull Baggage baggage;
private @NotNull TransactionNameSource transactionNameSource;
private final @NotNull Map<String, MeasurementValue> measurements;
private final @NotNull Instrumenter instrumenter;

public SentryTracer(final @NotNull TransactionContext context, final @NotNull IHub hub) {
this(context, hub, null);
Expand Down Expand Up @@ -110,6 +111,7 @@ public SentryTracer(
this.measurements = new ConcurrentHashMap<>();
this.root = new Span(context, this, hub, startTimestamp);
this.name = context.getName();
this.instrumenter = context.getInstrumenter();
this.hub = hub;
this.waitForChildren = waitForChildren;
this.idleTimeout = idleTimeout;
Expand Down Expand Up @@ -195,8 +197,9 @@ ISpan startChild(
final @NotNull SpanId parentSpanId,
final @NotNull String operation,
final @Nullable String description,
final @Nullable Date timestamp) {
return createChild(parentSpanId, operation, description, timestamp);
final @Nullable Date timestamp,
final @NotNull Instrumenter instrumenter) {
return createChild(parentSpanId, operation, description, timestamp, instrumenter);
}

/**
Expand All @@ -207,19 +210,24 @@ ISpan startChild(
*/
@NotNull
private ISpan createChild(final @NotNull SpanId parentSpanId, final @NotNull String operation) {
return createChild(parentSpanId, operation, null, null);
return createChild(parentSpanId, operation, null, null, Instrumenter.SENTRY);
}

@NotNull
private ISpan createChild(
final @NotNull SpanId parentSpanId,
final @NotNull String operation,
final @Nullable String description,
@Nullable Date timestamp) {
@Nullable Date timestamp,
final @NotNull Instrumenter instrumenter) {
if (root.isFinished()) {
return NoOpSpan.getInstance();
}

if (!this.instrumenter.equals(instrumenter)) {
return NoOpSpan.getInstance();
}

Objects.requireNonNull(parentSpanId, "parentSpanId is required");
Objects.requireNonNull(operation, "operation is required");
cancelTimer();
Expand Down Expand Up @@ -256,26 +264,34 @@ private ISpan createChild(

@Override
public @NotNull ISpan startChild(
final @NotNull String operation, @Nullable String description, @Nullable Date timestamp) {
return createChild(operation, description, timestamp);
final @NotNull String operation,
@Nullable String description,
@Nullable Date timestamp,
@NotNull Instrumenter instrumenter) {
return createChild(operation, description, timestamp, instrumenter);
}

@Override
public @NotNull ISpan startChild(
final @NotNull String operation, final @Nullable String description) {
return createChild(operation, description, null);
return createChild(operation, description, null, Instrumenter.SENTRY);
}

private @NotNull ISpan createChild(
final @NotNull String operation,
final @Nullable String description,
@Nullable Date timestamp) {
@Nullable Date timestamp,
final @NotNull Instrumenter instrumenter) {
if (root.isFinished()) {
return NoOpSpan.getInstance();
}

if (!this.instrumenter.equals(instrumenter)) {
return NoOpSpan.getInstance();
}

if (children.size() < hub.getOptions().getMaxSpans()) {
return root.startChild(operation, description, timestamp);
return root.startChild(operation, description, timestamp, instrumenter);
} else {
hub.getOptions()
.getLogger()
Expand Down
6 changes: 4 additions & 2 deletions sentry/src/main/java/io/sentry/Span.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,12 +117,14 @@ public Span(
public @NotNull ISpan startChild(
final @NotNull String operation,
final @Nullable String description,
final @Nullable Date timestamp) {
final @Nullable Date timestamp,
final @NotNull Instrumenter instrumenter) {
if (finished.get()) {
return NoOpSpan.getInstance();
}

return transaction.startChild(context.getSpanId(), operation, description, timestamp);
return transaction.startChild(
context.getSpanId(), operation, description, timestamp, instrumenter);
}

@Override
Expand Down
9 changes: 9 additions & 0 deletions sentry/src/main/java/io/sentry/TransactionContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public final class TransactionContext extends SpanContext {
private final @NotNull TransactionNameSource transactionNameSource;
private @Nullable TracesSamplingDecision parentSamplingDecision;
private @Nullable Baggage baggage;
private @NotNull Instrumenter instrumenter = Instrumenter.SENTRY;

/**
* Creates {@link TransactionContext} from sentry-trace header.
Expand Down Expand Up @@ -203,4 +204,12 @@ public void setParentSampled(
public @NotNull TransactionNameSource getTransactionNameSource() {
return transactionNameSource;
}

public @NotNull Instrumenter getInstrumenter() {
return instrumenter;
}

public void setInstrumenter(final @NotNull Instrumenter instrumenter) {
this.instrumenter = instrumenter;
}
}
35 changes: 35 additions & 0 deletions sentry/src/test/java/io/sentry/HubTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -906,6 +906,41 @@ class HubTest {

assertEquals("test", scope?.transactionName)
}

@Test
fun `when startTransaction is called with different instrumenter, no-op is returned`() {
val hub = generateHub()

val transactionContext = TransactionContext("test", "op").also { it.instrumenter = Instrumenter.OTEL }
val transactionOptions = TransactionOptions()
val tx = hub.startTransaction(transactionContext, transactionOptions)

assertTrue(tx is NoOpTransaction)
}

@Test
fun `when startTransaction is called with different instrumenter, no-op is returned 2`() {
val hub = generateHub() {
it.instrumenter = Instrumenter.OTEL
}

val tx = hub.startTransaction("test", "op")

assertTrue(tx is NoOpTransaction)
}

@Test
fun `when startTransaction is called with configured instrumenter, it works`() {
val hub = generateHub() {
it.instrumenter = Instrumenter.OTEL
}

val transactionContext = TransactionContext("test", "op").also { it.instrumenter = Instrumenter.OTEL }
val transactionOptions = TransactionOptions()
val tx = hub.startTransaction(transactionContext, transactionOptions)

assertFalse(tx is NoOpTransaction)
}
//endregion

//region setUser tests
Expand Down
Loading

0 comments on commit 110ae5e

Please sign in to comment.