355 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			355 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// 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 it’s 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 it’s 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;
 | 
						||
};
 |