Skip to content

Commit 56bf847

Browse files
committed
feat(unreal): Preserve values from the incoming event object over properties pulled from the Unreal context
1 parent f74dfb0 commit 56bf847

File tree

1 file changed

+104
-18
lines changed

1 file changed

+104
-18
lines changed

relay-server/src/utils/unreal.rs

Lines changed: 104 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -206,18 +206,17 @@ fn merge_unreal_context(event: &mut Event, context: Unreal4Context) {
206206
};
207207

208208
if let Some(msg) = runtime_props.error_message.take() {
209-
event
210-
.logentry
211-
.get_or_insert_with(LogEntry::default)
212-
.formatted = Annotated::new(Message::from(msg));
209+
let logentry = event.logentry.get_or_insert_with(LogEntry::default);
210+
if logentry.formatted.is_empty() {
211+
logentry.formatted = Annotated::new(Message::from(msg));
212+
}
213213
}
214214

215215
if let Some(username) = runtime_props.username.take() {
216-
event
217-
.user
218-
.get_or_insert_with(User::default)
219-
.username
220-
.set_value(Some(username.into()));
216+
let user = event.user.get_or_insert_with(User::default);
217+
if user.username.is_empty() {
218+
user.username.set_value(Some(username.into()));
219+
}
221220
}
222221

223222
if let Some(login_id) = &runtime_props.login_id {
@@ -232,47 +231,65 @@ fn merge_unreal_context(event: &mut Event, context: Unreal4Context) {
232231

233232
if let Some(memory_physical) = runtime_props.memory_stats_total_physical.take() {
234233
let device_context = contexts.get_or_default::<DeviceContext>();
235-
device_context.memory_size = Annotated::new(memory_physical);
234+
if device_context.memory_size.is_empty() {
235+
device_context.memory_size = Annotated::new(memory_physical);
236+
}
236237
}
237238

238239
// OS information is likely overwritten by Minidump processing later.
239240
if let Some(os_major) = runtime_props.misc_os_version_major.take() {
240241
let os_context = contexts.get_or_default::<OsContext>();
241-
os_context.raw_description = Annotated::new(os_major);
242+
if os_context.raw_description.is_empty() {
243+
os_context.raw_description = Annotated::new(os_major);
244+
}
242245
}
243246

244247
// See https://github.com/EpicGames/UnrealEngine/blob/5.3.2-release/Engine/Source/Runtime/RHI/Private/DynamicRHI.cpp#L368-L376
245248
if let Some(adapter_name) = context.engine_data.get("RHI.AdapterName") {
246249
let gpu_context = contexts.get_or_default::<GpuContext>();
247-
gpu_context.name = Annotated::new(adapter_name.into());
250+
if gpu_context.name.is_empty() {
251+
gpu_context.name = Annotated::new(adapter_name.into());
252+
}
248253
} else if let Some(gpu_brand) = runtime_props.misc_primary_gpu_brand.take() {
249254
let gpu_context = contexts.get_or_default::<GpuContext>();
250-
gpu_context.name = Annotated::new(gpu_brand);
255+
if gpu_context.name.is_empty() {
256+
gpu_context.name = Annotated::new(gpu_brand);
257+
}
251258
}
252259

253260
if let Some(device_id) = context.engine_data.get("RHI.DeviceId") {
254261
let gpu_context = contexts.get_or_default::<GpuContext>();
255-
gpu_context.id = Annotated::new(Value::String(device_id.into()));
262+
if gpu_context.id.is_empty() {
263+
gpu_context.id = Annotated::new(Value::String(device_id.into()));
264+
}
256265
}
257266

258267
if let Some(feature_level) = context.engine_data.get("RHI.FeatureLevel") {
259268
let gpu_context = contexts.get_or_default::<GpuContext>();
260-
gpu_context.graphics_shader_level = Annotated::new(feature_level.into());
269+
if gpu_context.graphics_shader_level.is_empty() {
270+
gpu_context.graphics_shader_level = Annotated::new(feature_level.into());
271+
}
261272
}
262273

263274
if let Some(vendor_name) = context.engine_data.get("RHI.GPUVendor") {
264275
let gpu_context = contexts.get_or_default::<GpuContext>();
265-
gpu_context.vendor_name = Annotated::new(vendor_name.into());
276+
if gpu_context.vendor_name.is_empty() {
277+
gpu_context.vendor_name = Annotated::new(vendor_name.into());
278+
}
266279
}
267280

268281
if let Some(driver_version) = context.engine_data.get("RHI.UserDriverVersion") {
269282
let gpu_context = contexts.get_or_default::<GpuContext>();
270-
gpu_context.version = Annotated::new(driver_version.into());
283+
if gpu_context.version.is_empty() {
284+
gpu_context.version = Annotated::new(driver_version.into());
285+
}
271286
}
272287

273288
if let Some(rhi_name) = context.engine_data.get("RHI.RHIName") {
274289
let gpu_context = contexts.get_or_default::<GpuContext>();
275-
gpu_context.api_type = Annotated::new(rhi_name.into());
290+
if gpu_context.api_type.is_empty() {
291+
gpu_context.api_type = Annotated::new(rhi_name.into());
292+
}
276293
}
277294

278295
if event.level.is_empty() {
@@ -572,4 +589,73 @@ mod tests {
572589
LenientString("ebff51ef3c4878627823eebd9ff40eb4".to_owned())
573590
);
574591
}
592+
593+
#[test]
594+
fn test_merge_unreal_context_is_input_preserved() {
595+
let context = get_context();
596+
597+
let mut event = Event::default();
598+
599+
let logentry = event.logentry.get_or_insert_with(LogEntry::default);
600+
logentry.formatted = Annotated::new(String::from("error_message").into());
601+
602+
let user = event.user.get_or_insert_with(User::default);
603+
user.username = Annotated::new(String::from("user_name").into());
604+
605+
let contexts = event.contexts.get_or_insert_with(Contexts::default);
606+
607+
let device_context = contexts.get_or_default::<DeviceContext>();
608+
device_context.memory_size = Annotated::new(123456789);
609+
610+
let os_context = contexts.get_or_default::<OsContext>();
611+
os_context.name = Annotated::new(String::from("os_name"));
612+
613+
let gpu_context = contexts.get_or_default::<GpuContext>();
614+
gpu_context.name = Annotated::new(String::from("adapter_name"));
615+
gpu_context.id = Annotated::new(Value::String(String::from("device_id")));
616+
gpu_context.graphics_shader_level = Annotated::new(String::from("feature_level"));
617+
gpu_context.vendor_name = Annotated::new(String::from("vendor_name"));
618+
gpu_context.version = Annotated::new(String::from("driver_version"));
619+
gpu_context.api_type = Annotated::new(String::from("rhi_name"));
620+
621+
merge_unreal_context(&mut event, context);
622+
623+
let logentry = event.logentry.value().unwrap();
624+
let formatted = logentry.formatted.value().unwrap();
625+
assert_eq!(formatted.as_ref(), "error_message");
626+
627+
let user = event.user.value().unwrap();
628+
let username = user.username.value().unwrap();
629+
assert_eq!(username.as_ref(), "user_name");
630+
631+
let contexts = event.contexts.value().unwrap();
632+
633+
let device_context = contexts.get::<DeviceContext>().unwrap();
634+
let memory_size = device_context.memory_size.value().unwrap();
635+
assert_eq!(*memory_size, 123456789);
636+
637+
let os_context = contexts.get::<OsContext>().unwrap();
638+
let os_name = os_context.name.value().unwrap();
639+
assert_eq!(os_name, "os_name");
640+
641+
let gpu_context = contexts.get::<GpuContext>().unwrap();
642+
let adapter_name = gpu_context.name.value().unwrap();
643+
assert_eq!(adapter_name, "adapter_name");
644+
645+
let device_id = gpu_context.id.value().unwrap();
646+
let device_id = device_id.as_str().unwrap();
647+
assert_eq!(device_id, "device_id");
648+
649+
let feature_level = gpu_context.graphics_shader_level.value().unwrap();
650+
assert_eq!(feature_level, "feature_level");
651+
652+
let vendor_name = gpu_context.vendor_name.value().unwrap();
653+
assert_eq!(vendor_name, "vendor_name");
654+
655+
let driver_version = gpu_context.version.value().unwrap();
656+
assert_eq!(driver_version, "driver_version");
657+
658+
let rhi_name = gpu_context.api_type.value().unwrap();
659+
assert_eq!(rhi_name, "rhi_name");
660+
}
575661
}

0 commit comments

Comments
 (0)