From 0364a32cf19f0c92297641f3808c0a18c0762d8a Mon Sep 17 00:00:00 2001 From: Agne Lukoseviciute Date: Thu, 19 Jun 2025 08:47:05 -0700 Subject: [PATCH 1/4] tracelogger def --- .../RuntimeCompatibilityOptions.cpp | 1 + .../RuntimeCompatibilityOptions_TraceLogger.h | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions_TraceLogger.h diff --git a/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp index 65310ff775..cb5ad04c7c 100644 --- a/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp +++ b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp @@ -6,6 +6,7 @@ #include "Microsoft.Windows.ApplicationModel.WindowsAppRuntime.RuntimeCompatibilityOptions.g.cpp" #include "AssemblyInfo.h" #include +#include "RuntimeCompatibilityOptions_TraceLogger.h" namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implementation { diff --git a/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions_TraceLogger.h b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions_TraceLogger.h new file mode 100644 index 0000000000..fd39d609c1 --- /dev/null +++ b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions_TraceLogger.h @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#pragma once + +#include "pch.h" +#include <../WindowsAppRuntime_Insights/WindowsAppRuntimeInsights.h> + +class RuntimeCompatibilityOptions_TraceLogger final : public wil::TraceLoggingProvider +{ + IMPLEMENT_TRACELOGGING_CLASS( + RuntimeCompatibilityOptions_TraceLogger, + "Microsoft.WindowsAppRuntime.RuntimeCompatibilityOptions", + // {1741c54b-ba96-4540-867b-29830307d0cc} + (0x1741c54b, 0xba96, 0x4540, 0x86, 0x7b, 0x29, 0x83, 0x03, 0x07, 0xd0, 0xcc)); + +public: + + // Event for Apply() call, includes usage info + DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM3( + ApplyCalled, + PDT_ProductAndServicePerformance, + PCWSTR, patchLevel1, + PCWSTR, patchLevel2, + PCWSTR, disabledChanges + ); + + // Event for Apply() failure + DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2( + ApplyFailed, + PDT_ProductAndServicePerformance, + HRESULT, hresult, + PCWSTR, message + ); +}; \ No newline at end of file From 931a5442e6b13395a2cbd7f7bfa163156a7da277 Mon Sep 17 00:00:00 2001 From: Agne Lukoseviciute Date: Mon, 7 Jul 2025 14:32:56 -0700 Subject: [PATCH 2/4] per-change event and in-code instrumentation --- .../RuntimeCompatibilityOptions.cpp | 25 ++++++++++++++++++- .../RuntimeCompatibilityOptions_TraceLogger.h | 13 ++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp index cb5ad04c7c..3d4a941b9c 100644 --- a/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp +++ b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp @@ -17,6 +17,14 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implem void RuntimeCompatibilityOptions::Apply() { + std::wstring patchLevel1Str = std::to_wstring(patchLevel1.Major) + L"." + + std::to_wstring(patchLevel1.Minor) + L"." + + std::to_wstring(patchLevel1.Patch); + std::wstring patchLevel2Str = std::to_wstring(patchLevel2.Major) + L"." + + std::to_wstring(patchLevel2.Minor) + L"." + + std::to_wstring(patchLevel2.Patch); + RuntimeCompatibilityOptions_TraceLogger::TraceLogger::ApplyCalled(patchLevel1Str.c_str(), patchLevel2Str.c_str()); + WinAppSdk::Containment::WinAppSDKRuntimeConfiguration config; // If both patch levels are set to the same major.minor version, error out if the patch versions are different. @@ -25,6 +33,10 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implem { if (m_patchLevel1.Patch != m_patchLevel2.Patch) { + RuntimeCompatibilityOptions_TraceLogger::TraceLogger::ApplyFailed( + E_INVALIDARG, + L"Patch levels should target different Major.Minor versions or match Patch version." + ); throw hresult_invalid_argument(L"Patch levels should target different Major.Minor versions or match Patch version."); } } @@ -47,7 +59,9 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implem { // TODO: Telemetry! Log the changeId that was disabled. // UINT32 is used internally for the changeId, so cast from the enum's Int32 to that. - disabledChanges.push_back(static_cast(changeId)); + auto id = static_cast(changeId); + RuntimeCompatibilityOptions_TraceLogger::TraceLogger::ChangeDisabled(id); + disabledChanges.push_back(id); } config.disabledChanges = disabledChanges.data(); config.disabledChangesCount = static_cast(disabledChanges.size()); @@ -57,8 +71,17 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implem { if (hr == E_ILLEGAL_STATE_CHANGE) { + RuntimeCompatibilityOptions_TraceLogger::TraceLogger::ApplyFailed( + hr, + L"Configuration already set or locked." + ); throw winrt::hresult_illegal_state_change(L"Configuration already set or locked."); } + + RuntimeCompatibilityOptions_TraceLogger::TraceLogger::ApplyFailed( + hr, + L"SetConfiguration failed." + ); winrt::throw_hresult(hr); } } diff --git a/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions_TraceLogger.h b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions_TraceLogger.h index fd39d609c1..742389332e 100644 --- a/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions_TraceLogger.h +++ b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions_TraceLogger.h @@ -16,16 +16,19 @@ class RuntimeCompatibilityOptions_TraceLogger final : public wil::TraceLoggingPr public: - // Event for Apply() call, includes usage info - DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM3( + DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1( + ChangeDisabled, + PDT_ProductAndServicePerformance, + UINT32, changeId + ); + + DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2( ApplyCalled, PDT_ProductAndServicePerformance, PCWSTR, patchLevel1, - PCWSTR, patchLevel2, - PCWSTR, disabledChanges + PCWSTR, patchLevel2 ); - // Event for Apply() failure DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2( ApplyFailed, PDT_ProductAndServicePerformance, From 3a9a066daac65f91ec6a61636dd5fe61bf25b4b7 Mon Sep 17 00:00:00 2001 From: Agne Lukoseviciute Date: Mon, 7 Jul 2025 15:18:47 -0700 Subject: [PATCH 3/4] rm TODO comment --- dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp index 3d4a941b9c..2b99b442f1 100644 --- a/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp +++ b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp @@ -57,7 +57,6 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implem std::vector disabledChanges; for (auto changeId : m_disabledChanges) { - // TODO: Telemetry! Log the changeId that was disabled. // UINT32 is used internally for the changeId, so cast from the enum's Int32 to that. auto id = static_cast(changeId); RuntimeCompatibilityOptions_TraceLogger::TraceLogger::ChangeDisabled(id); From 1e9c4a14d21840f0e0d8c89b4f1cf7ff90292fd3 Mon Sep 17 00:00:00 2001 From: Agne Lukoseviciute Date: Tue, 8 Jul 2025 11:22:05 -0700 Subject: [PATCH 4/4] nit --- .../RuntimeCompatibilityOptions.cpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp index 2b99b442f1..4d7c6b794a 100644 --- a/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp +++ b/dev/RuntimeCompatibilityOptions/RuntimeCompatibilityOptions.cpp @@ -17,13 +17,13 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implem void RuntimeCompatibilityOptions::Apply() { - std::wstring patchLevel1Str = std::to_wstring(patchLevel1.Major) + L"." + - std::to_wstring(patchLevel1.Minor) + L"." + - std::to_wstring(patchLevel1.Patch); - std::wstring patchLevel2Str = std::to_wstring(patchLevel2.Major) + L"." + - std::to_wstring(patchLevel2.Minor) + L"." + - std::to_wstring(patchLevel2.Patch); - RuntimeCompatibilityOptions_TraceLogger::TraceLogger::ApplyCalled(patchLevel1Str.c_str(), patchLevel2Str.c_str()); + std::wstring patchLevel1Str = std::to_wstring(m_patchLevel1.Major) + L"." + + std::to_wstring(m_patchLevel1.Minor) + L"." + + std::to_wstring(m_patchLevel1.Patch); + std::wstring patchLevel2Str = std::to_wstring(m_patchLevel2.Major) + L"." + + std::to_wstring(m_patchLevel2.Minor) + L"." + + std::to_wstring(m_patchLevel2.Patch); + RuntimeCompatibilityOptions_TraceLogger::ApplyCalled(patchLevel1Str.c_str(), patchLevel2Str.c_str()); WinAppSdk::Containment::WinAppSDKRuntimeConfiguration config; @@ -33,7 +33,7 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implem { if (m_patchLevel1.Patch != m_patchLevel2.Patch) { - RuntimeCompatibilityOptions_TraceLogger::TraceLogger::ApplyFailed( + RuntimeCompatibilityOptions_TraceLogger::ApplyFailed( E_INVALIDARG, L"Patch levels should target different Major.Minor versions or match Patch version." ); @@ -59,7 +59,7 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implem { // UINT32 is used internally for the changeId, so cast from the enum's Int32 to that. auto id = static_cast(changeId); - RuntimeCompatibilityOptions_TraceLogger::TraceLogger::ChangeDisabled(id); + RuntimeCompatibilityOptions_TraceLogger::ChangeDisabled(id); disabledChanges.push_back(id); } config.disabledChanges = disabledChanges.data(); @@ -70,14 +70,14 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implem { if (hr == E_ILLEGAL_STATE_CHANGE) { - RuntimeCompatibilityOptions_TraceLogger::TraceLogger::ApplyFailed( + RuntimeCompatibilityOptions_TraceLogger::ApplyFailed( hr, L"Configuration already set or locked." ); throw winrt::hresult_illegal_state_change(L"Configuration already set or locked."); } - RuntimeCompatibilityOptions_TraceLogger::TraceLogger::ApplyFailed( + RuntimeCompatibilityOptions_TraceLogger::ApplyFailed( hr, L"SetConfiguration failed." );