Skip to content

Commit c4729d6

Browse files
authored
Merge 39225ff into b77456b
2 parents b77456b + 39225ff commit c4729d6

File tree

16 files changed

+220
-48
lines changed

16 files changed

+220
-48
lines changed

sentry-async-profiler/src/main/java/io/sentry/asyncprofiler/provider/AsyncProfilerProfileConverterProvider.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import io.sentry.profiling.JavaProfileConverterProvider;
66
import org.jetbrains.annotations.ApiStatus;
77
import org.jetbrains.annotations.NotNull;
8-
import org.jetbrains.annotations.Nullable;
98

109
/**
1110
* AsyncProfiler implementation of {@link JavaProfileConverterProvider}. This provider integrates
@@ -15,7 +14,7 @@
1514
public final class AsyncProfilerProfileConverterProvider implements JavaProfileConverterProvider {
1615

1716
@Override
18-
public @Nullable IProfileConverter getProfileConverter() {
17+
public @NotNull IProfileConverter getProfileConverter() {
1918
return new AsyncProfilerProfileConverter();
2019
}
2120

sentry-spring-boot-jakarta/api/sentry-spring-boot-jakarta.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ public class io/sentry/spring/boot/jakarta/SentryLogbackInitializer : org/spring
2424
public fun supportsEventType (Lorg/springframework/core/ResolvableType;)Z
2525
}
2626

27+
public class io/sentry/spring/boot/jakarta/SentryProfilerAutoConfiguration {
28+
public fun <init> ()V
29+
}
30+
2731
public class io/sentry/spring/boot/jakarta/SentryProperties : io/sentry/SentryOptions {
2832
public fun <init> ()V
2933
public fun getExceptionResolverOrder ()I
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.sentry.spring.boot.jakarta;
2+
3+
import com.jakewharton.nopen.annotation.Open;
4+
import io.sentry.spring.jakarta.SentryProfilerConfiguration;
5+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.context.annotation.Import;
8+
9+
@Configuration(proxyBeanMethods = false)
10+
@ConditionalOnClass(name = {"io.sentry.opentelemetry.agent.AgentMarker"})
11+
@Open
12+
@Import(SentryProfilerConfiguration.class)
13+
public class SentryProfilerAutoConfiguration {}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
io.sentry.spring.boot.jakarta.SentryAutoConfiguration
2+
io.sentry.spring.boot.jakarta.SentryProfilerAutoConfiguration
23
io.sentry.spring.boot.jakarta.SentryLogbackAppenderAutoConfiguration
34
io.sentry.spring.boot.jakarta.SentryWebfluxAutoConfiguration

sentry-spring-jakarta/api/sentry-spring-jakarta.api

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ public class io/sentry/spring/jakarta/SentryInitBeanPostProcessor : org/springfr
4242
public fun setApplicationContext (Lorg/springframework/context/ApplicationContext;)V
4343
}
4444

45+
public class io/sentry/spring/jakarta/SentryProfilerConfiguration {
46+
public fun <init> ()V
47+
public fun sentryOpenTelemetryProfilerConfiguration ()Lio/sentry/IContinuousProfiler;
48+
public fun sentryOpenTelemetryProfilerConverterConfiguration ()Lio/sentry/IProfileConverter;
49+
}
50+
4551
public class io/sentry/spring/jakarta/SentryRequestHttpServletRequestProcessor : io/sentry/EventProcessor {
4652
public fun <init> (Lio/sentry/spring/jakarta/tracing/TransactionNameProvider;Ljakarta/servlet/http/HttpServletRequest;)V
4753
public fun getOrder ()Ljava/lang/Long;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package io.sentry.spring.jakarta;
2+
3+
import com.jakewharton.nopen.annotation.Open;
4+
import io.sentry.IContinuousProfiler;
5+
import io.sentry.IProfileConverter;
6+
import io.sentry.NoOpContinuousProfiler;
7+
import io.sentry.NoOpProfileConverter;
8+
import io.sentry.Sentry;
9+
import io.sentry.SentryOptions;
10+
import io.sentry.util.InitUtil;
11+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
12+
import org.springframework.context.annotation.Bean;
13+
import org.springframework.context.annotation.Configuration;
14+
15+
/**
16+
* Handles late initialization of the profiler if the application is run with the OTEL Agent in
17+
* auto-init mode. In that case the agent cannot initialize the profiler yet and falls back to No-Op
18+
* implementations. This Configuration sets the profiler and converter on the options if that was
19+
* the case.
20+
*/
21+
@Configuration(proxyBeanMethods = false)
22+
@Open
23+
public class SentryProfilerConfiguration {
24+
25+
@Bean
26+
@ConditionalOnMissingBean(name = "sentryOpenTelemetryProfilerConfiguration")
27+
public IContinuousProfiler sentryOpenTelemetryProfilerConfiguration() {
28+
SentryOptions options = Sentry.getGlobalScope().getOptions();
29+
IContinuousProfiler profiler = NoOpContinuousProfiler.getInstance();
30+
31+
if (Sentry.isEnabled()) {
32+
return InitUtil.initializeProfiler(options);
33+
} else {
34+
return profiler;
35+
}
36+
}
37+
38+
@Bean
39+
@ConditionalOnMissingBean(name = "sentryOpenTelemetryProfilerConverterConfiguration")
40+
public IProfileConverter sentryOpenTelemetryProfilerConverterConfiguration() {
41+
SentryOptions options = Sentry.getGlobalScope().getOptions();
42+
IProfileConverter converter = NoOpProfileConverter.getInstance();
43+
44+
if (Sentry.isEnabled()) {
45+
return InitUtil.initializeProfileConverter(options);
46+
} else {
47+
return converter;
48+
}
49+
}
50+
}

sentry/api/sentry.api

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1584,6 +1584,11 @@ public final class io/sentry/NoOpLogger : io/sentry/ILogger {
15841584
public fun log (Lio/sentry/SentryLevel;Ljava/lang/Throwable;Ljava/lang/String;[Ljava/lang/Object;)V
15851585
}
15861586

1587+
public final class io/sentry/NoOpProfileConverter : io/sentry/IProfileConverter {
1588+
public fun convertFromFile (Ljava/lang/String;)Lio/sentry/protocol/profiling/SentryProfile;
1589+
public static fun getInstance ()Lio/sentry/NoOpProfileConverter;
1590+
}
1591+
15871592
public final class io/sentry/NoOpReplayBreadcrumbConverter : io/sentry/ReplayBreadcrumbConverter {
15881593
public fun convert (Lio/sentry/Breadcrumb;)Lio/sentry/rrweb/RRWebEvent;
15891594
public static fun getInstance ()Lio/sentry/NoOpReplayBreadcrumbConverter;
@@ -2902,6 +2907,7 @@ public final class io/sentry/SentryEnvelopeItem {
29022907
public static fun fromEvent (Lio/sentry/ISerializer;Lio/sentry/SentryBaseEvent;)Lio/sentry/SentryEnvelopeItem;
29032908
public static fun fromLogs (Lio/sentry/ISerializer;Lio/sentry/SentryLogEvents;)Lio/sentry/SentryEnvelopeItem;
29042909
public static fun fromProfileChunk (Lio/sentry/ProfileChunk;Lio/sentry/ISerializer;)Lio/sentry/SentryEnvelopeItem;
2910+
public static fun fromProfileChunk (Lio/sentry/ProfileChunk;Lio/sentry/ISerializer;Lio/sentry/IProfileConverter;)Lio/sentry/SentryEnvelopeItem;
29052911
public static fun fromProfilingTrace (Lio/sentry/ProfilingTraceData;JLio/sentry/ISerializer;)Lio/sentry/SentryEnvelopeItem;
29062912
public static fun fromReplay (Lio/sentry/ISerializer;Lio/sentry/ILogger;Lio/sentry/SentryReplayEvent;Lio/sentry/ReplayRecording;Z)Lio/sentry/SentryEnvelopeItem;
29072913
public static fun fromSession (Lio/sentry/ISerializer;Lio/sentry/Session;)Lio/sentry/SentryEnvelopeItem;
@@ -3394,6 +3400,7 @@ public class io/sentry/SentryOptions {
33943400
public fun getPerformanceCollectors ()Ljava/util/List;
33953401
public fun getProfileLifecycle ()Lio/sentry/ProfileLifecycle;
33963402
public fun getProfileSessionSampleRate ()Ljava/lang/Double;
3403+
public fun getProfilerConverter ()Lio/sentry/IProfileConverter;
33973404
public fun getProfilesSampleRate ()Ljava/lang/Double;
33983405
public fun getProfilesSampler ()Lio/sentry/SentryOptions$ProfilesSamplerCallback;
33993406
public fun getProfilingTracesDirPath ()Ljava/lang/String;
@@ -3539,6 +3546,7 @@ public class io/sentry/SentryOptions {
35393546
public fun setPrintUncaughtStackTrace (Z)V
35403547
public fun setProfileLifecycle (Lio/sentry/ProfileLifecycle;)V
35413548
public fun setProfileSessionSampleRate (Ljava/lang/Double;)V
3549+
public fun setProfilerConverter (Lio/sentry/IProfileConverter;)V
35423550
public fun setProfilesSampleRate (Ljava/lang/Double;)V
35433551
public fun setProfilesSampler (Lio/sentry/SentryOptions$ProfilesSamplerCallback;)V
35443552
public fun setProfilingTracesDirPath (Ljava/lang/String;)V
@@ -7055,6 +7063,8 @@ public final class io/sentry/util/HttpUtils {
70557063

70567064
public final class io/sentry/util/InitUtil {
70577065
public fun <init> ()V
7066+
public static fun initializeProfileConverter (Lio/sentry/SentryOptions;)Lio/sentry/IProfileConverter;
7067+
public static fun initializeProfiler (Lio/sentry/SentryOptions;)Lio/sentry/IContinuousProfiler;
70587068
public static fun shouldInit (Lio/sentry/SentryOptions;Lio/sentry/SentryOptions;Z)Z
70597069
}
70607070

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.sentry;
2+
3+
import io.sentry.protocol.profiling.SentryProfile;
4+
import java.io.IOException;
5+
import org.jetbrains.annotations.NotNull;
6+
7+
public final class NoOpProfileConverter implements IProfileConverter {
8+
9+
private static final NoOpProfileConverter instance = new NoOpProfileConverter();
10+
11+
private NoOpProfileConverter() {}
12+
13+
public static NoOpProfileConverter getInstance() {
14+
return instance;
15+
}
16+
17+
@Override
18+
public @NotNull SentryProfile convertFromFile(@NotNull String jfrFilePath) throws IOException {
19+
return new SentryProfile();
20+
}
21+
}

sentry/src/main/java/io/sentry/Sentry.java

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import io.sentry.internal.modules.ResourcesModulesLoader;
1616
import io.sentry.logger.ILoggerApi;
1717
import io.sentry.opentelemetry.OpenTelemetryUtil;
18-
import io.sentry.profiling.ProfilingServiceLoader;
1918
import io.sentry.protocol.Feedback;
2019
import io.sentry.protocol.SentryId;
2120
import io.sentry.protocol.User;
@@ -691,38 +690,8 @@ private static void initConfigurations(final @NotNull SentryOptions options) {
691690
}
692691

693692
private static void initJvmContinuousProfiling(@NotNull SentryOptions options) {
694-
695-
if (options.isContinuousProfilingEnabled()
696-
&& options.getContinuousProfiler() == NoOpContinuousProfiler.getInstance()) {
697-
try {
698-
String profilingTracesDirPath = options.getProfilingTracesDirPath();
699-
if (profilingTracesDirPath == null) {
700-
File tempDir = new File(System.getProperty("java.io.tmpdir"), "sentry_profiling_traces");
701-
boolean createDirectorySuccess = tempDir.mkdirs() || tempDir.exists();
702-
703-
if (!createDirectorySuccess) {
704-
throw new IllegalArgumentException(
705-
"Creating a fallback directory for profiling failed in "
706-
+ tempDir.getAbsolutePath());
707-
}
708-
profilingTracesDirPath = tempDir.getAbsolutePath();
709-
options.setProfilingTracesDirPath(profilingTracesDirPath);
710-
}
711-
712-
final IContinuousProfiler continuousProfiler =
713-
ProfilingServiceLoader.loadContinuousProfiler(
714-
options.getLogger(),
715-
profilingTracesDirPath,
716-
options.getProfilingTracesHz(),
717-
options.getExecutorService());
718-
719-
options.setContinuousProfiler(continuousProfiler);
720-
} catch (Exception e) {
721-
options
722-
.getLogger()
723-
.log(SentryLevel.ERROR, "Failed to create default profiling traces directory", e);
724-
}
725-
}
693+
InitUtil.initializeProfiler(options);
694+
InitUtil.initializeProfileConverter(options);
726695
}
727696

728697
/** Close the SDK */

sentry/src/main/java/io/sentry/SentryClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,8 @@ public void captureSession(final @NotNull Session session, final @Nullable Hint
983983
new SentryEnvelope(
984984
new SentryEnvelopeHeader(sentryId, options.getSdkVersion(), null),
985985
Collections.singletonList(
986-
SentryEnvelopeItem.fromProfileChunk(profileChunk, options.getSerializer())));
986+
SentryEnvelopeItem.fromProfileChunk(
987+
profileChunk, options.getSerializer(), options.getProfilerConverter())));
987988
sentryId = sendEnvelope(envelope, null);
988989
} catch (IOException | SentryEnvelopeException e) {
989990
options

0 commit comments

Comments
 (0)