// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. #pragma once namespace CalculatorApp { constexpr int64_t WINEVENT_KEYWORD_RESPONSE_TIME = 0x1000000000000; // RAII wrapper that automatically sends the Stop event when the class gets destructed. class TraceActivity { public: TraceActivity() : m_channel(nullptr) , m_activity(nullptr) , m_fields(nullptr) { } TraceActivity( winrt::Windows::Foundation::Diagnostics::LoggingChannel channel, std::wstring_view activityName, winrt::Windows::Foundation::Diagnostics::LoggingFields fields) : m_channel(channel) , m_activityName(activityName) , m_fields(fields) , m_activity(nullptr) { // Write the activity's START event. Note that you must not specify keyword // or level for START and STOP events because they always use the activity's // keyword and level. m_activity = m_channel.StartActivity( m_activityName, m_fields, winrt::Windows::Foundation::Diagnostics::LoggingLevel::Verbose, winrt::Windows::Foundation::Diagnostics::LoggingOptions(WINEVENT_KEYWORD_RESPONSE_TIME)); } ~TraceActivity() { if (m_activity != nullptr) { // Write the activity's STOP event. m_activity.StopActivity(m_activityName, m_fields); m_activity = nullptr; } } private: std::wstring m_activityName; winrt::Windows::Foundation::Diagnostics::LoggingChannel m_channel; winrt::Windows::Foundation::Diagnostics::LoggingFields m_fields; winrt::Windows::Foundation::Diagnostics::LoggingActivity m_activity; }; }