Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion GVFS/FastFetch/FastFetchVerb.cs
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ private int ExecuteWithExitCode()
Console.WriteLine("The ParentActivityId provided (" + this.ParentActivityId + ") is not a valid GUID.");
}

using (JsonTracer tracer = new JsonTracer("Microsoft.Git.FastFetch", parentActivityId, "FastFetch", disableTelemetry: true))
using (JsonTracer tracer = new JsonTracer("Microsoft.Git.FastFetch", parentActivityId, "FastFetch", enlistmentId: null, mountId: null, disableTelemetry: true))
{
if (this.Verbose)
{
Expand Down
2 changes: 1 addition & 1 deletion GVFS/GVFS.Common/GVFSPlatform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public static void Register(GVFSPlatform platform)
public abstract bool TryGetGVFSHooksPathAndVersion(out string hooksPaths, out string hooksVersion, out string error);
public abstract bool TryInstallGitCommandHooks(GVFSContext context, string executingDirectory, string hookName, string commandHookPath, out string errorMessage);

public abstract InProcEventListener CreateTelemetryListenerIfEnabled(string providerName);
public abstract InProcEventListener CreateTelemetryListenerIfEnabled(string providerName, string enlistmentId, string mountId);

public abstract Dictionary<string, string> GetPhysicalDiskInfo(string path);

Expand Down
13 changes: 8 additions & 5 deletions GVFS/GVFS.Common/Tracing/JsonTracer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,17 @@ public class JsonTracer : ITracer

private EventLevel startStopLevel;
private Keywords startStopKeywords;

public JsonTracer(string providerName, string activityName, bool disableTelemetry = false)
: this(providerName, Guid.Empty, activityName, disableTelemetry)
: this(providerName, Guid.Empty, activityName, enlistmentId: null, mountId: null, disableTelemetry: disableTelemetry)
{
}

public JsonTracer(string providerName, Guid providerActivityId, string activityName, bool disableTelemetry = false)
public JsonTracer(string providerName, string activityName, string enlistmentId, string mountId, bool disableTelemetry = false)
: this(providerName, Guid.Empty, activityName, enlistmentId, mountId, disableTelemetry)
{
}

public JsonTracer(string providerName, Guid providerActivityId, string activityName, string enlistmentId, string mountId, bool disableTelemetry = false)
: this(
new List<InProcEventListener>(),
providerActivityId,
Expand All @@ -36,7 +40,7 @@ public JsonTracer(string providerName, Guid providerActivityId, string activityN
{
if (!disableTelemetry)
{
InProcEventListener telemetryListener = GVFSPlatform.Instance.CreateTelemetryListenerIfEnabled(providerName);
InProcEventListener telemetryListener = GVFSPlatform.Instance.CreateTelemetryListenerIfEnabled(providerName, enlistmentId, mountId);
if (telemetryListener != null)
{
this.listeners.Add(telemetryListener);
Expand Down Expand Up @@ -252,7 +256,6 @@ private static string GetCategorizedErrorEventName(Keywords keywords)
private void WriteEvent(string eventName, EventLevel level, Keywords keywords, EventMetadata metadata, EventOpcode opcode)
{
string jsonPayload = metadata != null ? JsonConvert.SerializeObject(metadata) : null;

foreach (InProcEventListener listener in this.listeners)
{
listener.RecordMessage(eventName, this.activityId, this.parentActivityId, level, keywords, opcode, jsonPayload);
Expand Down
19 changes: 18 additions & 1 deletion GVFS/GVFS.Mount/InProcessMountVerb.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using CommandLine;
using GVFS.Common;
using GVFS.Common.Git;
using GVFS.Common.Http;
using GVFS.Common.Tracing;
using System;
Expand Down Expand Up @@ -124,7 +125,23 @@ private void UnhandledGVFSExceptionHandler(ITracer tracer, object sender, Unhand

private JsonTracer CreateTracer(GVFSEnlistment enlistment, EventLevel verbosity, Keywords keywords)
{
JsonTracer tracer = new JsonTracer(GVFSConstants.GVFSEtwProviderName, "GVFSMount");
string enlistmentId = null;
string mountId = null;

GitProcess git = new GitProcess(enlistment);
GitProcess.Result configResult = git.GetFromLocalConfig(GVFSConstants.GitConfig.EnlistmentId);
if (!configResult.HasErrors)
{
enlistmentId = configResult.Output.Trim();
}

configResult = git.GetFromLocalConfig(GVFSConstants.GitConfig.MountId);
if (!configResult.HasErrors)
{
mountId = configResult.Output.Trim();
}

JsonTracer tracer = new JsonTracer(GVFSConstants.GVFSEtwProviderName, "GVFSMount", enlistmentId: enlistmentId, mountId: mountId);
tracer.AddLogFileEventListener(
GVFSEnlistment.GetNewGVFSLogFileName(enlistment.GVFSLogsRoot, GVFSConstants.LogFileTypes.MountProcess),
verbosity,
Expand Down
2 changes: 1 addition & 1 deletion GVFS/GVFS.Platform.Mac/MacPlatform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public override NamedPipeServerStream CreatePipeByName(string pipeName)
return pipe;
}

public override InProcEventListener CreateTelemetryListenerIfEnabled(string providerName)
public override InProcEventListener CreateTelemetryListenerIfEnabled(string providerName, string enlistmentId, string mountId)
{
return null;
}
Expand Down
36 changes: 28 additions & 8 deletions GVFS/GVFS.Platform.Windows/ETWTelemetryEventListener.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,18 @@ public class ETWTelemetryEventListener : InProcEventListener
private const long MeasureKeyword = 0x400000000000;

private EventSource eventSource;
private string enlistmentId;
private string mountId;

private ETWTelemetryEventListener(string providerName, string[] traitsList)
private ETWTelemetryEventListener(string providerName, string[] traitsList, string enlistmentId, string mountId)
: base(EventLevel.Verbose, Keywords.Telemetry)
{
this.eventSource = new EventSource(providerName, EventSourceSettings.EtwSelfDescribingEventFormat, traitsList);
this.enlistmentId = enlistmentId;
this.mountId = mountId;
}

public static ETWTelemetryEventListener CreateTelemetryListenerIfEnabled(string gitBinRoot, string providerName)
public static ETWTelemetryEventListener CreateTelemetryListenerIfEnabled(string gitBinRoot, string providerName, string enlistmentId, string mountId)
{
// This listener is disabled unless the user specifies the proper git config setting.

Expand All @@ -52,7 +56,7 @@ public static ETWTelemetryEventListener CreateTelemetryListenerIfEnabled(string
if (!result.HasErrors && !string.IsNullOrEmpty(result.Output.TrimEnd('\r', '\n')))
{
string[] traitsList = result.Output.TrimEnd('\r', '\n').Split('|');
return new ETWTelemetryEventListener(providerName, traitsList);
return new ETWTelemetryEventListener(providerName, traitsList, enlistmentId, mountId);
}
else
{
Expand Down Expand Up @@ -83,12 +87,12 @@ protected override void RecordMessageInternal(

if (jsonPayload != null)
{
JsonPayload payload = new JsonPayload(jsonPayload);
JsonPayload payload = new JsonPayload(jsonPayload, this.enlistmentId, this.mountId);
this.eventSource.Write(eventName, ref options, ref activityId, ref parentActivityId, ref payload);
}
else
{
EmptyStruct payload = new EmptyStruct();
Payload payload = new Payload(this.enlistmentId, this.mountId);
this.eventSource.Write(eventName, ref options, ref activityId, ref parentActivityId, ref payload);
}
}
Expand All @@ -105,22 +109,38 @@ private EventSourceOptions CreateOptions(EventLevel level, Keywords keywords, Ev
return options;
}

// Needed to pass relatedId without metadata
[EventData]
public struct EmptyStruct
public struct Payload
{
public Payload(string enlistmentId, string mountId)
{
this.EnlistmentId = enlistmentId;
this.MountId = mountId;
}

[EventField]
public string EnlistmentId { get; }
[EventField]
public string MountId { get; }
}

[EventData]
public struct JsonPayload
{
public JsonPayload(string payload)
public JsonPayload(string payload, string enlistmentId, string mountId)
{
this.Json = payload;
this.EnlistmentId = enlistmentId;
this.MountId = mountId;
}

[EventField]
public string Json { get; }

[EventField]
public string EnlistmentId { get; }
[EventField]
public string MountId { get; }
}
}
}
6 changes: 4 additions & 2 deletions GVFS/GVFS.Platform.Windows/WindowsPlatform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,13 @@ public static bool TrySetDWordInRegistry(RegistryHive registryHive, string key,
return true;
}

public override InProcEventListener CreateTelemetryListenerIfEnabled(string providerName)
public override InProcEventListener CreateTelemetryListenerIfEnabled(string providerName, string enlistmentId, string mountId)
{
return ETWTelemetryEventListener.CreateTelemetryListenerIfEnabled(
this.GitInstallation.GetInstalledGitBinPath(),
providerName);
providerName,
enlistmentId,
mountId);
}

public override void InitializeEnlistmentACLs(string enlistmentPath)
Expand Down
2 changes: 1 addition & 1 deletion GVFS/GVFS.UnitTests/Mock/Common/MockPlatform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public override NamedPipeServerStream CreatePipeByName(string pipeName)
throw new NotSupportedException();
}

public override InProcEventListener CreateTelemetryListenerIfEnabled(string providerName)
public override InProcEventListener CreateTelemetryListenerIfEnabled(string providerName, string enlistmentId, string mountId)
{
return new MockListener(EventLevel.Verbose, Keywords.Telemetry);
}
Expand Down