Skip to content

Commit 6c711f4

Browse files
Merge pull request #1069 from DustinCampbell/project-telemetry
Add telemetry for the sorts of projects OmniSharp is started on
2 parents 6b0efb8 + 48352f3 commit 6c711f4

File tree

4 files changed

+95
-14
lines changed

4 files changed

+95
-14
lines changed

src/common.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@ export function isBoolean(obj: any): obj is boolean {
2929
return obj === true || obj === false;
3030
}
3131

32+
export function sum<T>(arr: T[], selector: (item: T) => number): number {
33+
return arr.reduce((prev, curr) => prev + selector(curr), 0);
34+
}
35+
36+
/** Retrieve the length of an array. Returns 0 if the array is `undefined`. */
37+
export function safeLength<T>(arr: T[] | undefined) {
38+
return arr ? arr.length : 0;
39+
}
40+
3241
export function buildPromiseChain<T, TResult>(array: T[], builder: (item: T) => Promise<TResult>): Promise<TResult> {
3342
return array.reduce(
3443
(promise, n) => promise.then(() => builder(n)),

src/omnisharp/extension.ts

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@ import RenameProvider from '../features/renameProvider';
1818
import FormatProvider from '../features/formattingEditProvider';
1919
import CompletionItemProvider from '../features/completionItemProvider';
2020
import WorkspaceSymbolProvider from '../features/workspaceSymbolProvider';
21-
import reportDiagnostics, {Advisor} from '../features/diagnosticsProvider';
21+
import reportDiagnostics, { Advisor } from '../features/diagnosticsProvider';
2222
import SignatureHelpProvider from '../features/signatureHelpProvider';
2323
import registerCommands from '../features/commands';
2424
import forwardChanges from '../features/changeForwarding';
2525
import reportStatus from '../features/status';
26-
import {OmniSharpServer} from './server';
27-
import {Options} from './options';
28-
import {addAssetsIfNecessary, AddAssetResult} from '../assets';
26+
import { OmniSharpServer } from './server';
27+
import { Options } from './options';
28+
import { addAssetsIfNecessary, AddAssetResult } from '../assets';
29+
import { sum, safeLength } from '../common';
30+
import * as utils from './utils';
2931

3032
export function activate(context: vscode.ExtensionContext, reporter: TelemetryReporter) {
3133
const documentSelector: vscode.DocumentSelector = {
@@ -82,6 +84,30 @@ export function activate(context: vscode.ExtensionContext, reporter: TelemetryRe
8284
}));
8385
}
8486

87+
// Send telemetry about the sorts of projects the server was started on.
88+
disposables.push(server.onServerStart(() => {
89+
let measures: { [key: string]: number } = {};
90+
91+
utils.requestWorkspaceInformation(server)
92+
.then(workspaceInfo => {
93+
if (workspaceInfo.DotNet && workspaceInfo.DotNet.Projects.length > 0) {
94+
measures['projectjson.projectcount'] = workspaceInfo.DotNet.Projects.length;
95+
measures['projectjson.filecount'] = sum(workspaceInfo.DotNet.Projects, p => safeLength(p.SourceFiles));
96+
}
97+
98+
if (workspaceInfo.MsBuild && workspaceInfo.MsBuild.Projects.length > 0) {
99+
measures['msbuild.projectcount'] = workspaceInfo.MsBuild.Projects.length;
100+
measures['msbuild.filecount'] = sum(workspaceInfo.MsBuild.Projects, p => safeLength(p.SourceFiles));
101+
measures['msbuild.unityprojectcount'] = sum(workspaceInfo.MsBuild.Projects, p => p.IsUnityProject ? 1 : 0);
102+
measures['msbuild.netcoreprojectcount'] = sum(workspaceInfo.MsBuild.Projects, p => utils.isNetCoreProject(p) ? 1 : 0);
103+
}
104+
105+
// TODO: Add measurements for script.
106+
107+
reporter.sendTelemetryEvent('OmniSharp.Start', null, measures);
108+
});
109+
}));
110+
85111
// read and store last solution or folder path
86112
disposables.push(server.onBeforeServerStart(path => context.workspaceState.update('lastSolutionPathOrFolder', path)));
87113

src/omnisharp/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,8 @@ export function getTestStartInfo(server: OmniSharpServer, request: protocol.V2.G
8383

8484
export function runDotNetTest(server: OmniSharpServer, request: protocol.V2.RunDotNetTestRequest) {
8585
return server.makeRequest<protocol.V2.RunDotNetTestResponse>(protocol.V2.Requests.RunDotNetTest, request);
86+
}
87+
88+
export function isNetCoreProject(project: protocol.MSBuildProject) {
89+
return project.TargetFrameworks.find(tf => tf.ShortName.startsWith('netcoreapp') || tf.ShortName.startsWith('netstandard')) !== undefined;
8690
}

test/common.test.ts

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,64 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { should } from 'chai';
7-
import { buildPromiseChain } from '../src/common';
7+
import { buildPromiseChain, safeLength, sum } from '../src/common';
88

99
suite("Common", () => {
1010
suiteSetup(() => should());
1111

12-
test("buildPromiseChain produces a sequence of promises", () => {
13-
let array: number[] = [];
14-
let items = [1, 2, 3, 4, 5];
12+
suite("buildPromiseChain", () => {
13+
test("produce a sequence of promises", () => {
14+
let array: number[] = [];
15+
let items = [1, 2, 3, 4, 5];
1516

16-
let promise = buildPromiseChain(items, n => new Promise((resolve, reject) => {
17-
array.push(n);
18-
resolve();
19-
}));
17+
let promise = buildPromiseChain(items, n => new Promise((resolve, reject) => {
18+
array.push(n);
19+
resolve();
20+
}));
2021

21-
return promise.then(() => {
22-
array.should.deep.equal([1, 2, 3, 4, 5]);
22+
return promise.then(() => {
23+
array.should.deep.equal([1, 2, 3, 4, 5]);
24+
});
25+
});
26+
});
27+
28+
suite("safeLength", () => {
29+
test("return 0 for empty array", () => {
30+
let array = [];
31+
let result = safeLength(array);
32+
result.should.equal(0);
33+
});
34+
35+
test("returns 5 for array of 5 elements", () => {
36+
let array = [1, 2, 3, 4, 5];
37+
let result = safeLength(array);
38+
result.should.equal(5);
39+
});
40+
41+
test("returns 0 for undefined", () => {
42+
let array = undefined;
43+
let result = safeLength(array);
44+
result.should.equal(0);
45+
});
46+
});
47+
48+
suite("sum", () => {
49+
test("produce total from numbers", () => {
50+
let array = [1, 2, 3, 4, 5];
51+
let result = sum(array, i => i);
52+
result.should.equal(15);
53+
});
54+
55+
test("produce total from lengths of arrays", () => {
56+
let array = [[1, 2], [3], [], [4, 5, 6]];
57+
let result = sum(array, i => i.length);
58+
result.should.equal(6);
59+
});
60+
61+
test("produce total of true values from array of booleans", () => {
62+
let array = [true, false, false, true, true, true, false, true];
63+
let result = sum(array, b => b ? 1 : 0);
64+
result.should.equal(5);
2365
});
2466
});
2567
});

0 commit comments

Comments
 (0)