Skip to content
Open
11 changes: 11 additions & 0 deletions src/AppInstallerCLICore/Workflows/InstallFlow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,17 @@ namespace AppInstaller::CLI::Workflow
}
else
{
if (context.Contains(Execution::Data::PackageVersion))
{
const auto& packageVersion = context.Get<Execution::Data::PackageVersion>();

if (packageVersion && packageVersion->GetSource().IsWellKnownSource(WellKnownSource::MicrosoftStore))
{
const auto& manifest = context.Get<Execution::Data::Manifest>();
Logging::Telemetry().LogStoreInstall(manifest.Id);
}
}

if (isRepair)
{
context.Reporter.Info() << Resource::String::RepairFlowRepairSuccess << std::endl;
Expand Down
27 changes: 26 additions & 1 deletion src/AppInstallerCommonCore/AppInstallerTelemetry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
3 changes: 3 additions & 0 deletions src/AppInstallerCommonCore/Public/AppInstallerTelemetry.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
25 changes: 24 additions & 1 deletion src/AppInstallerCommonCore/Telemetry/TraceLogging.cpp
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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();
Expand All @@ -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);
}
7 changes: 5 additions & 2 deletions src/AppInstallerCommonCore/Telemetry/TraceLogging.h
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -63,4 +63,7 @@
TRACELOGGING_DECLARE_PROVIDER(g_hTraceProvider);
extern bool g_IsTelemetryProviderEnabled;
extern UCHAR g_TelemetryProviderLevel;
extern ULONGLONG g_TelemetryProviderMatchAnyKeyword;
extern ULONGLONG g_TelemetryProviderMatchAnyKeyword;

TRACELOGGING_DECLARE_PROVIDER(g_hWindowsStoreProvider);
extern bool g_IsStoreTelemetryProviderEnabled;
1 change: 1 addition & 0 deletions src/VcpkgCustomTriplets/common.cmake
Original file line number Diff line number Diff line change
@@ -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")
Expand Down
Loading