diff --git a/src/AppInstallerCLICore/Workflows/InstallFlow.cpp b/src/AppInstallerCLICore/Workflows/InstallFlow.cpp index e52234a139..dabe1bc46c 100644 --- a/src/AppInstallerCLICore/Workflows/InstallFlow.cpp +++ b/src/AppInstallerCLICore/Workflows/InstallFlow.cpp @@ -571,6 +571,17 @@ namespace AppInstaller::CLI::Workflow } else { + if (context.Contains(Execution::Data::PackageVersion)) + { + const auto& packageVersion = context.Get(); + + if (packageVersion && packageVersion->GetSource().IsWellKnownSource(WellKnownSource::MicrosoftStore)) + { + const auto& manifest = context.Get(); + Logging::Telemetry().LogStoreInstall(manifest.Id); + } + } + if (isRepair) { context.Reporter.Info() << Resource::String::RepairFlowRepairSuccess << std::endl; diff --git a/src/AppInstallerCommonCore/AppInstallerTelemetry.cpp b/src/AppInstallerCommonCore/AppInstallerTelemetry.cpp index 2fea3ee27f..4487728ca9 100644 --- a/src/AppInstallerCommonCore/AppInstallerTelemetry.cpp +++ b/src/AppInstallerCommonCore/AppInstallerTelemetry.cpp @@ -837,13 +837,38 @@ namespace AppInstaller::Logging m_summary.PackageVersion = version; m_summary.RepairExecutionType = type; m_summary.RepairErrorCode = errorCode; - + } } AICLI_LOG(CLI, Error, << type << " repair failed: " << errorCode); } + void TelemetryTraceLogger::LogStoreInstall(std::string_view packageId) const noexcept + { + // Don't use IsTelemetryEnabled as that also checks the WinGet provider. + if (g_IsStoreTelemetryProviderEnabled && m_isInitialized && m_isSettingEnabled && m_isRuntimeEnabled) + { + TraceLoggingWrite(g_hWindowsStoreProvider, + "StoreExperienceTelemetry-WinGetInstall", + TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), + TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), + AICLI_TraceLoggingStringView(packageId, "pid"), + TraceLoggingString(m_caller.c_str(), "src"), + TraceLoggingWideString(L"msstore", "cn") + ); + + // Respect the WinGet provider for summary editing + if (g_IsTelemetryProviderEnabled && m_useSummary) + { + m_summary.SourceIdentifier = m_caller; + m_summary.PackageIdentifier = packageId; + } + } + + AICLI_LOG(CLI, Info, << "Store install: Source [" << m_caller << "] Package [" << packageId << "]"); + } + TelemetryTraceLogger::~TelemetryTraceLogger() { if (IsTelemetryEnabled()) diff --git a/src/AppInstallerCommonCore/Public/AppInstallerTelemetry.h b/src/AppInstallerCommonCore/Public/AppInstallerTelemetry.h index 3067c1421c..57d29a87f2 100644 --- a/src/AppInstallerCommonCore/Public/AppInstallerTelemetry.h +++ b/src/AppInstallerCommonCore/Public/AppInstallerTelemetry.h @@ -290,6 +290,9 @@ namespace AppInstaller::Logging uint64_t downloadedBytes, bool isManualUpdate) const noexcept; + // Logs when an install succeeded from the msstore source. + void LogStoreInstall(std::string_view packageId) const noexcept; + protected: bool IsTelemetryEnabled() const noexcept; diff --git a/src/AppInstallerCommonCore/Telemetry/TraceLogging.cpp b/src/AppInstallerCommonCore/Telemetry/TraceLogging.cpp index 22826f886b..07aefa0505 100644 --- a/src/AppInstallerCommonCore/Telemetry/TraceLogging.cpp +++ b/src/AppInstallerCommonCore/Telemetry/TraceLogging.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. #include "pch.h" @@ -15,6 +15,15 @@ bool g_IsTelemetryProviderEnabled{}; UCHAR g_TelemetryProviderLevel{}; ULONGLONG g_TelemetryProviderMatchAnyKeyword{}; +// GUID for Microsoft-Windows-Store : {9C2A37F3-E5FD-5CAE-BCD1-43DAFEEE1FF0} +TRACELOGGING_DEFINE_PROVIDER( + g_hWindowsStoreProvider, + "Microsoft-Windows-Store", + (0x9c2a37f3, 0xe5fd, 0x5cae, 0xbc, 0xd1, 0x43, 0xda, 0xfe, 0xee, 0x1f, 0xf0), + TraceLoggingOptionMicrosoftTelemetry()); + +bool g_IsStoreTelemetryProviderEnabled{}; + struct TraceProvider { TraceProvider(); @@ -38,12 +47,26 @@ void WINAPI TelemetryProviderEnabledCallback( g_TelemetryProviderMatchAnyKeyword = matchAnyKeyword; } +void WINAPI StoreTelemetryProviderEnabledCallback( + _In_ LPCGUID /*sourceId*/, + _In_ ULONG isEnabled, + _In_ UCHAR /*level*/, + _In_ ULONGLONG /*matchAnyKeyword*/, + _In_ ULONGLONG /*matchAllKeywords*/, + _In_opt_ PEVENT_FILTER_DESCRIPTOR /*filterData*/, + _In_opt_ PVOID /*callbackContext*/) +{ + g_IsStoreTelemetryProviderEnabled = !!isEnabled; +} + TraceProvider::TraceProvider() { TraceLoggingRegisterEx(g_hTraceProvider, TelemetryProviderEnabledCallback, nullptr); + TraceLoggingRegisterEx(g_hWindowsStoreProvider, StoreTelemetryProviderEnabledCallback, nullptr); } TraceProvider::~TraceProvider() { TraceLoggingUnregister(g_hTraceProvider); + TraceLoggingUnregister(g_hWindowsStoreProvider); } diff --git a/src/AppInstallerCommonCore/Telemetry/TraceLogging.h b/src/AppInstallerCommonCore/Telemetry/TraceLogging.h index c2699f94ec..472df5396d 100644 --- a/src/AppInstallerCommonCore/Telemetry/TraceLogging.h +++ b/src/AppInstallerCommonCore/Telemetry/TraceLogging.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. #pragma once @@ -63,4 +63,7 @@ TRACELOGGING_DECLARE_PROVIDER(g_hTraceProvider); extern bool g_IsTelemetryProviderEnabled; extern UCHAR g_TelemetryProviderLevel; -extern ULONGLONG g_TelemetryProviderMatchAnyKeyword; \ No newline at end of file +extern ULONGLONG g_TelemetryProviderMatchAnyKeyword; + +TRACELOGGING_DECLARE_PROVIDER(g_hWindowsStoreProvider); +extern bool g_IsStoreTelemetryProviderEnabled; diff --git a/src/VcpkgCustomTriplets/common.cmake b/src/VcpkgCustomTriplets/common.cmake index cf0df77a3f..a6bd68b16a 100644 --- a/src/VcpkgCustomTriplets/common.cmake +++ b/src/VcpkgCustomTriplets/common.cmake @@ -1,4 +1,5 @@ set(VCPKG_LIBRARY_LINKAGE static) +set(VCPKG_PLATFORM_TOOLSET v143) set(VCPKG_C_FLAGS "/Qspectre /W3 /guard:cf /D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR") set(VCPKG_CXX_FLAGS "/Qspectre /W3 /guard:cf /D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR") set(VCPKG_INSTALL_OPTIONS, "--debug")