File: Commands\Hidden\InternalReportInstallSuccess\InternalReportInstallSuccessCommand.cs
Web Access
Project: src\src\sdk\src\Cli\dotnet\dotnet.csproj (dotnet)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.CommandLine;
using Microsoft.DotNet.Cli.Telemetry;
using Microsoft.DotNet.Cli.Utils;
using Microsoft.DotNet.Utilities;

namespace Microsoft.DotNet.Cli.Commands.Hidden.InternalReportInstallSuccess;

public class InternalReportInstallSuccessCommand
{
    public static int Run(ParseResult parseResult)
    {
        var telemetry = new ThreadBlockingTelemetry();
        ProcessInputAndSendTelemetry(parseResult, telemetry);
        return 0;
    }

    public static void ProcessInputAndSendTelemetry(string[] args, ITelemetryClient telemetry)
    {
        var result = Parser.Parse(["dotnet", "internal-reportinstallsuccess", .. args]);
        ProcessInputAndSendTelemetry(result, telemetry);
    }

    public static void ProcessInputAndSendTelemetry(ParseResult result, ITelemetryClient telemetry)
    {
        var definition = (InternalReportInstallSuccessCommandDefinition)result.CommandResult.Command;
        var exeName = Path.GetFileName(result.GetValue(definition.Argument));

        var filter = new TelemetryFilter(Sha256Hasher.HashWithNormalizedCasing);
        foreach (var e in filter.Filter(new InstallerSuccessReport(exeName)))
        {
            telemetry.TrackEvent(e.EventName, e.Properties);
        }
    }

    internal class ThreadBlockingTelemetry : ITelemetryClient
    {
        private readonly TelemetryClient _telemetry;

        internal ThreadBlockingTelemetry()
        {
            var sessionId = Environment.GetEnvironmentVariable(EnvironmentVariableNames.DOTNET_CLI_TELEMETRY_SESSIONID);
            _telemetry = new TelemetryClient(sessionId);
        }

        public bool Enabled => _telemetry.Enabled;

        public void TrackEvent(string eventName, IDictionary<string, string?>? properties)
        {
            _telemetry.ThreadBlockingTrackEvent(eventName, properties);
        }
    }
}