zworld-em/Plugins/sentry-unreal/Source/Sentry/Private/Android/SentrySpanAndroid.cpp
2025-05-11 22:07:21 +08:00

82 lines
2.6 KiB
C++

// Copyright (c) 2023 Sentry. All Rights Reserved.
#include "SentrySpanAndroid.h"
#include "SentryDefines.h"
#include "Infrastructure/SentryConvertorsAndroid.h"
#include "Infrastructure/SentryJavaClasses.h"
SentrySpanAndroid::SentrySpanAndroid(jobject span)
: FSentryJavaObjectWrapper(SentryJavaClasses::Span, span)
{
SetupClassMethods();
}
void SentrySpanAndroid::SetupClassMethods()
{
StartChildMethod = GetMethod("startChild", "(Ljava/lang/String;Ljava/lang/String;)Lio/sentry/ISpan;");
FinishMethod = GetMethod("finish", "()V");
IsFinishedMethod = GetMethod("isFinished", "()Z");
SetTagMethod = GetMethod("setTag", "(Ljava/lang/String;Ljava/lang/String;)V");
SetDataMethod = GetMethod("setData", "(Ljava/lang/String;Ljava/lang/Object;)V");
ToSentryTraceMethod = GetMethod("toSentryTrace", "()Lio/sentry/SentryTraceHeader;");
}
TSharedPtr<ISentrySpan> SentrySpanAndroid::StartChild(const FString& operation, const FString& desctiption)
{
auto span = CallObjectMethod<jobject>(StartChildMethod, *GetJString(operation), *GetJString(desctiption));
return MakeShareable(new SentrySpanAndroid(*span));
}
TSharedPtr<ISentrySpan> SentrySpanAndroid::StartChildWithTimestamp(const FString& operation, const FString& desctiption, int64 timestamp)
{
UE_LOG(LogSentrySdk, Log, TEXT("Starting child span with explicit timestamp not supported on Android."));
return StartChild(operation, desctiption);
}
void SentrySpanAndroid::Finish()
{
CallMethod<void>(FinishMethod);
}
void SentrySpanAndroid::FinishWithTimestamp(int64 timestamp)
{
UE_LOG(LogSentrySdk, Log, TEXT("Finishing span with explicit timestamp not supported on Android."));
Finish();
}
bool SentrySpanAndroid::IsFinished() const
{
return CallMethod<bool>(IsFinishedMethod);;
}
void SentrySpanAndroid::SetTag(const FString& key, const FString& value)
{
CallMethod<void>(SetTagMethod, *GetJString(key), *GetJString(value));
}
void SentrySpanAndroid::RemoveTag(const FString& key)
{
SetTag(key, TEXT(""));
}
void SentrySpanAndroid::SetData(const FString& key, const TMap<FString, FString>& values)
{
CallMethod<void>(SetDataMethod, *GetJString(key), SentryConvertorsAndroid::StringMapToNative(values)->GetJObject());
}
void SentrySpanAndroid::RemoveData(const FString& key)
{
SetData(key, TMap<FString, FString>());
}
void SentrySpanAndroid::GetTrace(FString& name, FString& value)
{
FSentryJavaObjectWrapper NativeTraceHeader(SentryJavaClasses::SentryTraceHeader, *CallObjectMethod<jobject>(ToSentryTraceMethod));
FSentryJavaMethod GetValueMethod = NativeTraceHeader.GetMethod("getValue", "()Ljava/lang/String;");
name = TEXT("sentry-trace");
value = NativeTraceHeader.CallMethod<FString>(GetValueMethod);
}