zworld-em/Plugins/sentry-unreal/Source/Sentry/Public/SentrySubsystem.h
2025-05-11 22:07:21 +08:00

355 lines
12 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (c) 2022 Sentry. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/EngineSubsystem.h"
#include "SentryDataTypes.h"
#include "SentryScope.h"
#include "SentrySubsystem.generated.h"
class USentrySettings;
class USentryBreadcrumb;
class USentryEvent;
class USentryId;
class USentryUserFeedback;
class USentryUser;
class USentryBeforeSendHandler;
class USentryTransaction;
class USentryTraceSampler;
class USentryTransactionContext;
class ISentrySubsystem;
class FSentryOutputDevice;
class FSentryOutputDeviceError;
DECLARE_DYNAMIC_DELEGATE_OneParam(FConfigureSettingsDelegate, USentrySettings*, Settings);
/**
* Sentry main API entry point.
*/
UCLASS()
class SENTRY_API USentrySubsystem : public UEngineSubsystem
{
GENERATED_BODY()
public:
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
/** Initializes Sentry SDK with values specified in ProjectSettings > Plugins > SentrySDK. */
UFUNCTION(BlueprintCallable, Category = "Sentry")
void Initialize();
/** Initializes Sentry SDK with values that override certain parameters specified in ProjectSettings > Plugins > SentrySDK.
*
* @param OnConfigureSettings The callback to configure the settings.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void InitializeWithSettings(const FConfigureSettingsDelegate& OnConfigureSettings);
/** Closes the Sentry SDK. */
UFUNCTION(BlueprintCallable, Category = "Sentry")
void Close();
/** Checks whether the Sentry SDK was initialized and event capturing is enabled. */
UFUNCTION(BlueprintPure, Category = "Sentry")
bool IsEnabled();
/** Checks whether the app crashed during the last run. */
UFUNCTION(BlueprintPure, Category = "Sentry")
ESentryCrashedLastRun IsCrashedLastRun();
/**
* Adds a breadcrumb to the current Scope.
*
* @param Breadcrumb The breadcrumb to send to Sentry.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void AddBreadcrumb(USentryBreadcrumb* Breadcrumb);
/**
* Adds a breadcrumb to the current Scope.
*
* @param Message If a message is provided its rendered as text and the whitespace is preserved.
* Very long text might be abbreviated in the UI.
*
* @param Category Categories are dotted strings that indicate what the crumb is or where it comes from.
* Typically its a module name or a descriptive string. For instance ui.click could be used to indicate that a click
* happened in the UI or flask could be used to indicate that the event originated in the Flask framework.
*
* @param Type The type of breadcrumb.
* The default type is default which indicates no specific handling.
* Other types are currently http for HTTP requests and navigation for navigation events.
*
* @param Data Data associated with this breadcrumb.
* Contains a sub-object whose contents depend on the breadcrumb type.
* Additional parameters that are unsupported by the type are rendered as a key/value table.
*
* @param Level Breadcrumb level.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry", meta = (AutoCreateRefTerm = "Data"))
void AddBreadcrumbWithParams(const FString& Message, const FString& Category, const FString& Type, const TMap<FString, FString>& Data,
ESentryLevel Level = ESentryLevel::Info);
/**
* Clear all breadcrumbs of the current Scope.
*
* @note: Not supported for Windows/Linux.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void ClearBreadcrumbs();
/**
* Captures the message.
*
* @param Message The message to send.
* @param Level The message level.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
USentryId* CaptureMessage(const FString& Message, ESentryLevel Level = ESentryLevel::Info);
/**
* Captures the message with a configurable scope.
* This allows modifying a scope without affecting other events.
* Changing message level during scope configuration will override Level parameter value.
*
* @param Message The message to send.
* @param OnConfigureScope The callback to configure the scope.
* @param Level The message level.
*
* @note: Not supported for Windows/Linux.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry", meta = (AutoCreateRefTerm = "OnConfigureScope"))
USentryId* CaptureMessageWithScope(const FString& Message, const FConfigureScopeDelegate& OnConfigureScope, ESentryLevel Level = ESentryLevel::Info);
USentryId* CaptureMessageWithScope(const FString& Message, const FConfigureScopeNativeDelegate& OnConfigureScope, ESentryLevel Level = ESentryLevel::Info);
/**
* Captures a manually created event and sends it to Sentry.
*
* @param Event The event to send to Sentry.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
USentryId* CaptureEvent(USentryEvent* Event);
/**
* Captures a manually created event and sends it to Sentry.
*
* @param Event The event to send to Sentry.
* @param OnConfigureScope The callback to configure the scope.
*
* @note: Not supported for Windows/Linux.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
USentryId* CaptureEventWithScope(USentryEvent* Event, const FConfigureScopeDelegate& OnConfigureScope);
USentryId* CaptureEventWithScope(USentryEvent* Event, const FConfigureScopeNativeDelegate& OnConfigureScope);
/**
* Captures a user feedback.
*
* @param UserFeedback The user feedback to send to Sentry.
*
* @note: Not supported for Windows/Linux.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void CaptureUserFeedback(USentryUserFeedback* UserFeedback);
/**
* Captures a user feedback.
*
* @param EventId The event Id.
* @param Email The user email.
* @param Comments The user comments.
* @param Name The optional username.
*
* @note: Not supported for Windows/Linux.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void CaptureUserFeedbackWithParams(USentryId* EventId, const FString& Email, const FString& Comments, const FString& Name);
/**
* Sets a user for the current scope.
*
* @param User The user.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void SetUser(USentryUser* User);
/** Removes a user for the current scope. */
UFUNCTION(BlueprintCallable, Category = "Sentry")
void RemoveUser();
/**
* Configures the scope through the callback.
* Sentry SDK uses the Scope to attach contextual data to events.
*
* @param OnConfigureScope The callback to configure the scope.
*
* @note: Not supported for Windows/Linux.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry", meta = (AutoCreateRefTerm = "OnCofigureScope"))
void ConfigureScope(const FConfigureScopeDelegate& OnConfigureScope);
void ConfigureScope(const FConfigureScopeNativeDelegate& OnConfigureScope);
/**
* Sets context values which will be used for enriching events.
*
* @param Key Context key.
* @param Values Context values.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void SetContext(const FString& Key, const TMap<FString, FString>& Values);
/**
* Sets global tag - key/value string pair which will be attached to every event.
*
* @param Key Tag key.
* @param Value Tag value.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void SetTag(const FString& Key, const FString& Value);
/**
* Removes global tag.
*
* @param Key Tag key.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void RemoveTag(const FString& Key);
/**
* Sets the level of all events sent.
*
* @param Level Event level.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void SetLevel(ESentryLevel Level);
/**
* Starts a new session.
* If there's a running session, it ends it before starting the new one.
* This method can be used in combination with @EndSession to manually track sessions.
* The SDK uses sessions to inform Sentry about release and project associated project health.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void StartSession();
/**
* Ends current session.
* This method can be used in combination with @StartSession to manually track sessions.
* The SDK uses sessions to inform Sentry about release and project associated project health.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
void EndSession();
/**
* Starts a new transaction.
*
* @param Name Transaction name.
* @param Operation Short code identifying the type of operation the span is measuring.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
USentryTransaction* StartTransaction(const FString& Name, const FString& Operation);
/**
* Starts a new transaction with given context.
*
* @param Context Transaction context.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
USentryTransaction* StartTransactionWithContext(USentryTransactionContext* Context);
/**
* Starts a new transaction with given context and timestamp.
* Currently setting the explicit transaction timings takes effect on Windows and Linux only.
* On other platforms starts transaction like regular `StartTransactionWithContext`.
*
* @param Context Transaction context.
* @param Timestamp Transaction timestamp (microseconds since the Unix epoch).
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
USentryTransaction* StartTransactionWithContextAndTimestamp(USentryTransactionContext* Context, int64 Timestamp);
/**
* Starts a new transaction with given context and options.
*
* @param Context Transaction context.
* @param Options Transaction options.
*/
UFUNCTION(BlueprintCallable, Category = "Sentry")
USentryTransaction* StartTransactionWithContextAndOptions(USentryTransactionContext* Context, const TMap<FString, FString>& Options);
/**
* Creates a transaction context to propagate distributed tracing metadata from upstream
* services and continue a trace based on corresponding HTTP header values.
*
* @param SentryTrace Incoming request 'sentry-trace' header
* @param BaggageHeaders Incoming request 'baggage' headers
*/
UFUNCTION(BlueprintCallable, Category = "Sentry", meta = (AutoCreateRefTerm = "BaggageHeaders"))
USentryTransactionContext* ContinueTrace(const FString& SentryTrace, const TArray<FString>& BaggageHeaders);
/** Checks if Sentry event capturing is supported for current settings. */
UFUNCTION(BlueprintCallable, Category = "Sentry")
bool IsSupportedForCurrentSettings();
private:
/** Adds default context data for all events captured by Sentry SDK. */
void AddDefaultContext();
/** Adds GPU context data for all events captured by Sentry SDK. */
void AddGpuContext();
/** Adds GPU context data for all events captured by Sentry SDK. */
void AddDeviceContext();
/** Promote specified values to tags for all events captured by Sentry SDK. */
void PromoteTags();
/** Subscribe to specified game events in order to add corresponding breadcrumbs automatically. */
void ConfigureBreadcrumbs();
/** Unsubscribe from game events that are used for automatic breadcrumbs. */
void DisableAutomaticBreadcrumbs();
/** Check whether the event capturing should be enabled for the current build configuration */
bool IsCurrentBuildConfigurationEnabled();
/** Check whether the event capturing should be enabled for the current build target */
bool IsCurrentBuildTargetEnabled();
/** Check whether the event capturing should be enabled for the current platform */
bool IsCurrentPlatformEnabled();
/** Check whether the event capturing should be enabled for promoted builds only */
bool IsPromotedBuildsOnlyEnabled();
/** Add custom Sentry output device to intercept logs */
void ConfigureOutputDevice();
/** Add custom Sentry output device to intercept errors */
void ConfigureOutputDeviceError();
private:
TSharedPtr<ISentrySubsystem> SubsystemNativeImpl;
TSharedPtr<FSentryOutputDevice> OutputDevice;
TSharedPtr<FSentryOutputDeviceError> OutputDeviceError;
UPROPERTY()
USentryBeforeSendHandler* BeforeSendHandler;
UPROPERTY()
USentryTraceSampler* TraceSampler;
FDelegateHandle PreLoadMapDelegate;
FDelegateHandle PostLoadMapDelegate;
FDelegateHandle GameStateChangedDelegate;
FDelegateHandle UserActivityChangedDelegate;
FDelegateHandle GameSessionIDChangedDelegate;
FDelegateHandle OnAssertDelegate;
FDelegateHandle OnEnsureDelegate;
};