UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TelemetryRouter.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7#include "Templates/Models.h"
8#include "Memory/MemoryView.h"
9#include "Misc/Guid.h"
10
11#include <type_traits>
12
14{
15 template<typename DATA_TYPE, typename = void>
16 constexpr bool HasTelemetryID = false;
17
18 template<typename DATA_TYPE>
19 constexpr bool HasTelemetryID<
21 std::enable_if_t<std::is_same_v<std::decay_t<decltype(DATA_TYPE::TelemetryID)>, FGuid>>> = true;
22
23 template <typename DATA_TYPE>
25 {
26 if constexpr (HasTelemetryID<DATA_TYPE>)
27 {
28 return DATA_TYPE::TelemetryID;
29 }
30 else
31 {
32 return FGuid{};
33 }
34 }
35
36 template <typename DATA_TYPE>
38 {
39 static_assert(HasTelemetryID<DATA_TYPE>,
40 "Unsupported type for telemetry router, must have a static constexpr FGuid member TelemetryID");
41 // Silence duplicate compiler error that's less helpful than the static assert
42 if constexpr (HasTelemetryID<DATA_TYPE>)
43 {
44 return DATA_TYPE::TelemetryID;
45 }
46 else
47 {
48 return FGuid{};
49 }
50 }
51}
52
70{
71public:
74
76
82 template<typename DATA_TYPE>
83 inline void ProvideTelemetry(const DATA_TYPE& Data)
84 {
85 ProvideTelemetryInternal(UE::Telemetry::Private::GetDataKey<DATA_TYPE>(), MakeMemoryView(&Data, sizeof(DATA_TYPE)));
86 }
87
93 template<typename DATA_TYPE>
95 {
96 check(Sink.IsBound());
97 FDelegateHandle Handle = Sink.GetHandle();
98 RegisterTelemetrySinkInternal(UE::Telemetry::Private::GetDataKey<DATA_TYPE>(), sizeof(DATA_TYPE), Handle,
99 [Sink=MoveTemp(Sink)](FMemoryView Data) -> bool {
100 return Sink.ExecuteIfBound(*reinterpret_cast<const DATA_TYPE*>(Data.GetData()));
101 });
102 return Handle;
103 }
104
110 template<typename DATA_TYPE, typename CALLABLE,
111 typename = std::enable_if_t<std::is_invocable_v<CALLABLE, const DATA_TYPE&>>
112 >
114 {
116 RegisterTelemetrySinkInternal(UE::Telemetry::Private::GetDataKey<DATA_TYPE>(), sizeof(DATA_TYPE), Handle,
117 [Sink=MoveTemp(Sink)](FMemoryView Data) -> bool {
118 Sink(*reinterpret_cast<const DATA_TYPE*>(Data.GetData()));
119 return true;
120 });
121 return Handle;
122 }
123
127 template<typename DATA_TYPE>
129 {
130 UnregisterTelemetrySinkInternal(UE::Telemetry::Private::GetDataKey<DATA_TYPE>(), Handle);
131 }
132
133private:
137 TELEMETRYUTILS_API void RegisterTelemetrySinkInternal(FGuid Key, SIZE_T ExpectedSize, FDelegateHandle InHandle, TFunction<bool(FMemoryView)> Sink);
138 TELEMETRYUTILS_API void UnregisterTelemetrySinkInternal(FGuid Key, FDelegateHandle InHandle);
139 TELEMETRYUTILS_API void ProvideTelemetryInternal(FGuid Key, FMemoryView Data);
140 TELEMETRYUTILS_API void CheckNotReentrant();
141
142 FRWLock SinkLock;
143
144 struct FSinkSet
145 {
148
149 FSinkSet(SIZE_T InDataSize)
151 {
152 }
153 };
154
155 TMap<FGuid, FSinkSet> KeyToSinks;
156};
#define check(expr)
Definition AssertionMacros.h:314
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr TMemoryView< void > MakeMemoryView(void *Data, uint64 Size)
Definition MemoryView.h:257
const bool
Definition NetworkReplayStreaming.h:178
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition IDelegateInstance.h:14
@ GenerateNewHandle
Definition IDelegateInstance.h:18
Definition TelemetryRouter.h:70
static TELEMETRYUTILS_API FTelemetryRouter & Get()
Definition TelemetryRouter.cpp:26
FDelegateHandle OnTelemetry(TDelegate< void(const DATA_TYPE &)> Sink)
Definition TelemetryRouter.h:94
FTelemetryRouter()
Definition TelemetryRouter.cpp:18
FDelegateHandle OnTelemetry(CALLABLE &&Sink)
Definition TelemetryRouter.h:113
~FTelemetryRouter()
Definition TelemetryRouter.cpp:22
void ProvideTelemetry(const DATA_TYPE &Data)
Definition TelemetryRouter.h:83
void UnregisterTelemetrySink(FDelegateHandle Handle)
Definition TelemetryRouter.h:128
Definition DelegateSignatureImpl.inl:310
Definition AndroidPlatformMisc.h:14
Definition UnrealString.h.inl:34
Definition CriticalSection.h:14
Definition TelemetryRouter.h:14
FGuid GetDataKey()
Definition TelemetryRouter.h:37
auto GetDataKeyInternal()
Definition TelemetryRouter.h:24
constexpr bool HasTelemetryID
Definition TelemetryRouter.h:16
Definition Guid.h:109