Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 8049cb2

Browse files
authored
Merge pull request #573 from github-for-unity/enhancements/more-metrics
Better user metrics
2 parents 467fe02 + 51b1543 commit 8049cb2

File tree

13 files changed

+249
-59
lines changed

13 files changed

+249
-59
lines changed

src/GitHub.Api/Application/ApplicationManagerBase.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,11 @@ public ITask InitializeRepository()
166166
Environment.InitializeRepository();
167167
RestartRepository();
168168
})
169-
.ThenInUI(InitializeUI);
169+
.ThenInUI(() =>
170+
{
171+
TaskManager.Run(UsageTracker.IncrementNumberOfProjectsInitialized);
172+
InitializeUI();
173+
});
170174
return task;
171175
}
172176

@@ -212,7 +216,7 @@ protected void SetupMetrics(string unityVersion, bool firstRun)
212216

213217
if (firstRun)
214218
{
215-
UsageTracker.IncrementLaunchCount();
219+
TaskManager.Run(UsageTracker.IncrementNumberOfStartups);
216220
}
217221
#endif
218222
}

src/GitHub.Api/Helpers/Constants.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ static class Constants
66
{
77
public const string GuidKey = "Guid";
88
public const string MetricsKey = "MetricsEnabled";
9-
public const string UsageFile = "usage.json";
9+
public const string UsageFile = "metrics.json";
1010
public const string GitInstallPathKey = "GitInstallPath";
1111
public const string TraceLoggingKey = "EnableTraceLogging";
1212
public const string WebTimeoutKey = "WebTimeout";

src/GitHub.Api/Metrics/IUsageTracker.cs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,33 @@
33
public interface IUsageTracker
44
{
55
bool Enabled { get; set; }
6-
void IncrementLaunchCount();
6+
void IncrementNumberOfStartups();
7+
void IncrementNumberOfCommits();
8+
void IncrementNumberOfFetches();
9+
void IncrementNumberOfPushes();
10+
void IncrementNumberOfPulls();
11+
void IncrementNumberOfAuthentications();
12+
void IncrementNumberOfProjectsInitialized();
13+
void IncrementNumberOfLocalBranchCreations();
14+
void IncrementNumberOfLocalBranchDeletions();
15+
void IncrementNumberOfLocalBranchCheckouts();
16+
void IncrementNumberOfRemoteBranchCheckouts();
717
}
818

919
class NullUsageTracker : IUsageTracker
1020
{
1121
public bool Enabled { get; set; }
12-
13-
public void IncrementLaunchCount(){ }
14-
public void SetMetricsService(IMetricsService instance)
15-
{ }
22+
public void IncrementNumberOfStartups() { }
23+
public void IncrementNumberOfCommits() { }
24+
public void IncrementNumberOfFetches() { }
25+
public void IncrementNumberOfPushes() { }
26+
public void IncrementNumberOfPulls() { }
27+
public void IncrementNumberOfAuthentications() { }
28+
public void IncrementNumberOfProjectsInitialized() { }
29+
public void IncrementNumberOfLocalBranchCreations() { }
30+
public void IncrementNumberOfLocalBranchDeletions() { }
31+
public void IncrementNumberOfLocalBranchCheckouts() { }
32+
public void IncrementNumberOfRemoteBranchCheckouts() { }
33+
public void SetMetricsService(IMetricsService instance) { }
1634
}
1735
}

src/GitHub.Api/Metrics/UsageModel.cs

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,34 @@
55
namespace GitHub.Unity
66
{
77
public class Usage
8+
{
9+
public Dimensions Dimensions { get; set; } = new Dimensions();
10+
public Measures Measures { get; set; } = new Measures();
11+
}
12+
13+
public class Dimensions
814
{
915
public string Guid { get; set; }
1016
public DateTime Date { get; set; }
1117
public string AppVersion { get; set; }
1218
public string UnityVersion { get; set; }
1319
public string Lang { get; set; }
20+
public string CurrentLang { get; set; }
21+
}
22+
23+
public class Measures
24+
{
1425
public int NumberOfStartups { get; set; }
26+
public int NumberOfCommits { get; set; }
27+
public int NumberOfFetches { get; set; }
28+
public int NumberOfPushes { get; set; }
29+
public int NumberOfPulls { get; set; }
30+
public int NumberOfProjectsInitialized { get; set; }
31+
public int NumberOfAuthentications { get; set; }
32+
public int NumberOfLocalBranchCreations { get; set; }
33+
public int NumberOfLocalBranchDeletion { get; set; }
34+
public int NumberOfLocalBranchCheckouts { get; set; }
35+
public int NumberOfRemoteBranchCheckouts { get; set; }
1536
}
1637

1738
class UsageModel
@@ -21,23 +42,37 @@ class UsageModel
2142

2243
private Usage currentUsage;
2344

24-
public Usage GetCurrentUsage()
45+
public Usage GetCurrentUsage(string appVersion, string unityVersion)
2546
{
47+
Guard.ArgumentNotNullOrWhiteSpace(appVersion, "appVersion");
48+
Guard.ArgumentNotNullOrWhiteSpace(unityVersion, "unityVersion");
49+
2650
var date = DateTime.UtcNow.Date;
2751
if (currentUsage == null)
2852
{
29-
currentUsage = Reports.FirstOrDefault(usage => usage.Date == date);
53+
currentUsage = Reports
54+
.FirstOrDefault(usage => usage.Dimensions.Date == date
55+
&& usage.Dimensions.AppVersion == appVersion
56+
&& usage.Dimensions.UnityVersion == unityVersion);
3057
}
3158

32-
if (currentUsage?.Date == date)
59+
if (currentUsage?.Dimensions.Date == date)
3360
{
3461
// update any fields that might be missing, if we've changed the format
35-
if (currentUsage.Guid != Guid)
36-
currentUsage.Guid = Guid;
62+
if (currentUsage.Dimensions.Guid != Guid)
63+
currentUsage.Dimensions.Guid = Guid;
3764
}
3865
else
3966
{
40-
currentUsage = new Usage { Date = date, Guid = Guid };
67+
currentUsage = new Usage
68+
{
69+
Dimensions = {
70+
Date = date,
71+
Guid = Guid,
72+
AppVersion = appVersion,
73+
UnityVersion = unityVersion
74+
}
75+
};
4176
Reports.Add(currentUsage);
4277
}
4378

@@ -46,12 +81,12 @@ public Usage GetCurrentUsage()
4681

4782
public List<Usage> SelectReports(DateTime beforeDate)
4883
{
49-
return Reports.Where(usage => usage.Date.Date != beforeDate.Date).ToList();
84+
return Reports.Where(usage => usage.Dimensions.Date.Date != beforeDate.Date).ToList();
5085
}
5186

5287
public void RemoveReports(DateTime beforeDate)
5388
{
54-
Reports.RemoveAll(usage => usage.Date.Date != beforeDate.Date);
89+
Reports.RemoveAll(usage => usage.Dimensions.Date.Date != beforeDate.Date);
5590
}
5691
}
5792

src/GitHub.Api/Metrics/UsageTracker.cs

Lines changed: 116 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,6 @@ private UsageStore LoadUsage()
7373

7474
private void SaveUsage(UsageStore store)
7575
{
76-
if (!Enabled)
77-
{
78-
return;
79-
}
80-
8176
var pathString = storePath.ToString();
8277
Logger.Trace("SaveUsage: \"{0}\"", pathString);
8378

@@ -106,26 +101,25 @@ private void RunTimer(int seconds)
106101
}, null, seconds * 1000, Timeout.Infinite);
107102
}
108103

109-
110104
private async Task SendUsage()
111105
{
112-
var usage = LoadUsage();
106+
var usageStore = LoadUsage();
113107

114108
if (metricsService == null)
115109
{
116110
Logger.Warning("No service, not sending usage");
117111
return;
118112
}
119113

120-
if (usage.LastUpdated.Date != DateTimeOffset.UtcNow.Date)
114+
if (usageStore.LastUpdated.Date != DateTimeOffset.UtcNow.Date)
121115
{
122116
Logger.Trace("Sending Usage");
123117

124118
var currentTimeOffset = DateTimeOffset.UtcNow;
125119
var beforeDate = currentTimeOffset.Date;
126120

127121
var success = false;
128-
var extractReports = usage.Model.SelectReports(beforeDate);
122+
var extractReports = usageStore.Model.SelectReports(beforeDate);
129123
if (!extractReports.Any())
130124
{
131125
Logger.Trace("No items to send");
@@ -151,24 +145,127 @@ private async Task SendUsage()
151145

152146
if (success)
153147
{
154-
usage.Model.RemoveReports(beforeDate);
155-
usage.LastUpdated = currentTimeOffset;
156-
SaveUsage(usage);
148+
usageStore.Model.RemoveReports(beforeDate);
149+
usageStore.LastUpdated = currentTimeOffset;
150+
SaveUsage(usageStore);
157151
}
158152
}
159153
}
160154

161-
public void IncrementLaunchCount()
155+
private Usage GetCurrentUsage(UsageStore usageStore)
156+
{
157+
var usage = usageStore.Model.GetCurrentUsage(ApplicationConfiguration.AssemblyName.Version.ToString(), unityVersion);
158+
usage.Dimensions.Lang = CultureInfo.InstalledUICulture.IetfLanguageTag;
159+
usage.Dimensions.CurrentLang = CultureInfo.CurrentCulture.IetfLanguageTag;
160+
return usage;
161+
}
162+
163+
public void IncrementNumberOfStartups()
164+
{
165+
var usageStore = LoadUsage();
166+
var usage = GetCurrentUsage(usageStore);
167+
168+
usage.Measures.NumberOfStartups++;
169+
170+
SaveUsage(usageStore);
171+
}
172+
173+
public void IncrementNumberOfCommits()
174+
{
175+
var usageStore = LoadUsage();
176+
var usage = GetCurrentUsage(usageStore);
177+
178+
usage.Measures.NumberOfCommits++;
179+
180+
SaveUsage(usageStore);
181+
}
182+
183+
public void IncrementNumberOfFetches()
184+
{
185+
var usageStore = LoadUsage();
186+
var usage = GetCurrentUsage(usageStore);
187+
188+
usage.Measures.NumberOfFetches++;
189+
190+
SaveUsage(usageStore);
191+
}
192+
193+
public void IncrementNumberOfPushes()
194+
{
195+
var usageStore = LoadUsage();
196+
var usage = GetCurrentUsage(usageStore);
197+
198+
usage.Measures.NumberOfPushes++;
199+
200+
SaveUsage(usageStore);
201+
}
202+
203+
public void IncrementNumberOfProjectsInitialized()
204+
{
205+
var usageStore = LoadUsage();
206+
var usage = GetCurrentUsage(usageStore);
207+
208+
usage.Measures.NumberOfProjectsInitialized++;
209+
210+
SaveUsage(usageStore);
211+
}
212+
213+
public void IncrementNumberOfLocalBranchCreations()
214+
{
215+
var usageStore = LoadUsage();
216+
var usage = GetCurrentUsage(usageStore);
217+
218+
usage.Measures.NumberOfLocalBranchCreations++;
219+
220+
SaveUsage(usageStore);
221+
}
222+
223+
public void IncrementNumberOfLocalBranchDeletions()
224+
{
225+
var usageStore = LoadUsage();
226+
var usage = GetCurrentUsage(usageStore);
227+
228+
usage.Measures.NumberOfLocalBranchDeletion++;
229+
230+
SaveUsage(usageStore);
231+
}
232+
233+
public void IncrementNumberOfLocalBranchCheckouts()
162234
{
163235
var usageStore = LoadUsage();
236+
var usage = GetCurrentUsage(usageStore);
237+
238+
usage.Measures.NumberOfLocalBranchCheckouts++;
164239

165-
var usage = usageStore.Model.GetCurrentUsage();
166-
usage.NumberOfStartups++;
167-
usage.UnityVersion = unityVersion;
168-
usage.Lang = CultureInfo.InstalledUICulture.IetfLanguageTag;
169-
usage.AppVersion = ApplicationConfiguration.AssemblyName.Version.ToString();
240+
SaveUsage(usageStore);
241+
}
242+
243+
public void IncrementNumberOfRemoteBranchCheckouts()
244+
{
245+
var usageStore = LoadUsage();
246+
var usage = GetCurrentUsage(usageStore);
247+
248+
usage.Measures.NumberOfRemoteBranchCheckouts++;
249+
250+
SaveUsage(usageStore);
251+
}
252+
253+
public void IncrementNumberOfPulls()
254+
{
255+
var usageStore = LoadUsage();
256+
var usage = GetCurrentUsage(usageStore);
257+
258+
usage.Measures.NumberOfPulls++;
259+
260+
SaveUsage(usageStore);
261+
}
262+
263+
public void IncrementNumberOfAuthentications()
264+
{
265+
var usageStore = LoadUsage();
266+
var usage = GetCurrentUsage(usageStore);
170267

171-
Logger.Trace("IncrementLaunchCount Date:{0} NumberOfStartups:{1}", usage.Date, usage.NumberOfStartups);
268+
usage.Measures.NumberOfAuthentications++;
172269

173270
SaveUsage(usageStore);
174271
}

src/GitHub.Api/Tasks/ITaskManager.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public interface ITaskManager : IDisposable
1313

1414
T Schedule<T>(T task) where T : ITask;
1515
Task Wait();
16+
ITask Run(Action action);
1617
ITask RunInUI(Action action);
1718
}
1819
}

src/GitHub.Api/Tasks/TaskManager.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ public static TaskScheduler GetScheduler(TaskAffinity affinity)
5151
}
5252
}
5353

54+
public ITask Run(Action action)
55+
{
56+
return new ActionTask(Token, action).Start();
57+
}
58+
5459
public ITask RunInUI(Action action)
5560
{
5661
return new ActionTask(Token, action) { Affinity = TaskAffinity.UI }.Start();

src/UnityExtension/Assets/Editor/GitHub.Unity/EntryPoint.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ private static void Initialize()
6666
LogHelper.LogAdapter = new MultipleLogAdapter(new FileLogAdapter(logPath)
6767
//, new UnityLogAdapter()
6868
);
69-
LogHelper.Info("Initializing GitHub for Unity version " + ApplicationInfo.Version);
69+
LogHelper.Info("Initializing GitHubForUnity:'v{0}' Unity:'v{1}'", ApplicationInfo.Version, Environment.UnityVersion);
7070

7171
ApplicationManager.Run(ApplicationCache.Instance.FirstRun);
7272
}

src/UnityExtension/Assets/Editor/GitHub.Unity/UI/AuthenticationView.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Threading;
23
using UnityEngine;
34
using UnityEditor;
45

@@ -211,8 +212,10 @@ private void DoResult(bool success, string msg)
211212

212213
isBusy = false;
213214

214-
if (success == true)
215+
if (success)
215216
{
217+
TaskManager.Run(UsageTracker.IncrementNumberOfAuthentications);
218+
216219
Clear();
217220
Finish(true);
218221
}

0 commit comments

Comments
 (0)