Skip to content

Commit a5415f5

Browse files
authored
Change telemetry provider (#19)
1 parent 54e0f7d commit a5415f5

31 files changed

+299
-601
lines changed

CHANGELOG.md

+13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,17 @@
11
# Changelog
2+
## 5.0.4
3+
Task 6.0.4
4+
- Update @qetza/replacetokens to 1.4.0.
5+
- Change telemetry provider.
6+
7+
Task 5.3.2
8+
- Change telemetry provider.
9+
10+
Task 4.4.2
11+
- Change telemetry provider.
12+
13+
Task 3.12.2
14+
- Change telemetry provider.
215

316
## 5.0.3
417
Task 6.0.3

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ The task was completely rewritten to use the npm package [@qetza/replacetokens](
7979
addBOM: ''
8080

8181
# A YAML formatted string containing additional variable values (keys are case-insensitive).
82-
# YAML can be:
82+
# Value can be:
8383
# - an object: properties will be parsed as key/value pairs
8484
# - a string starting with '@': value is parsed as multiple glob patterns separated
8585
# by a semi-colon ';' using fast-glob syntax to JSON or YAML files

package.json

+5-5
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@
2727
"build:v4": "tsc --project tasks/ReplaceTokensV4/tsconfig.json",
2828
"build:v5": "tsc --project tasks/ReplaceTokensV5/tsconfig.json",
2929
"build:v6": "tsc --project tasks/ReplaceTokensV6/tsconfig.json",
30-
"test": "mocha tasks/**/tests/L0.js",
31-
"test:v3": "mocha tasks/ReplaceTokensV3/dist/tests/L0.js",
32-
"test:v4": "mocha tasks/ReplaceTokensV4/dist/tests/L0.js",
33-
"test:v5": "mocha tasks/ReplaceTokensV5/dist/tests/L0.js",
34-
"test:v6": "mocha tasks/ReplaceTokensV6/dist/tests/L0.js",
30+
"test": "npm run build && mocha tasks/**/tests/L0.js",
31+
"test:v3": "npm run build:v3 && mocha tasks/ReplaceTokensV3/dist/tests/L0.js",
32+
"test:v4": "npm run build:v4 && mocha tasks/ReplaceTokensV4/dist/tests/L0.js",
33+
"test:v5": "npm run build:v5 && mocha tasks/ReplaceTokensV5/dist/tests/L0.js",
34+
"test:v6": "npm run build:v6 && mocha tasks/ReplaceTokensV6/dist/tests/L0.js",
3535
"package": "node scripts/package.js",
3636
"package:public": "node scripts/package.js --public",
3737
"format": "npm run format:v3 && npm run format:v4 && npm run format:v5 && npm run format:v6",

tasks/ReplaceTokensV3/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# Changelog
2+
## 3.12.2
3+
- Change telemetry provider.
24

35
## 3.12.1
46
- Add agent OS in telemetry ([#5](https://github.com/qetza/replacetokens-task/issues/5)).

tasks/ReplaceTokensV3/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ The following **anonymous** data is send:
271271
- the **number of** _targetFiles_ entries having an output pattern
272272
- the **number of** _variableFiles_ entries
273273
- the **number of** _inlineVariables_ entries
274-
- the task result (`succeed` or `failed`)
274+
- the task result (`success` or `failed`)
275275
- the task execution duration
276276
- the **number of** tokens replaced with the default value
277277
- the **number of** files parsed

tasks/ReplaceTokensV3/index.ts

+7-11
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import iconv = require('iconv-lite');
44
import jschardet = require('jschardet');
55
import path = require('path');
66
import os = require('os');
7-
import crypto = require('crypto');
87
import trackEvent, { TelemetryEvent } from './telemetry';
98
import yaml = require('js-yaml');
109
import stripJsonComments from './strip-json-comments';
@@ -498,8 +497,11 @@ var normalize = function (p: string): string {
498497

499498
async function run() {
500499
// initialize telemetry (outside of try as needed in catch and finally)
501-
let telemetryEnabled: boolean = false;
502-
let telemetryEvent: TelemetryEvent = {} as TelemetryEvent;
500+
let telemetryEnabled = false;
501+
let telemetryEvent = new TelemetryEvent(
502+
tl.getVariable('ystem.collectionid'),
503+
`${tl.getVariable('system.teamprojectid')}${tl.getVariable('system.definitionid')}`
504+
);
503505

504506
let proxyUrl: string | undefined = undefined;
505507
const config = tl.getHttpProxyConfiguration();
@@ -513,13 +515,7 @@ async function run() {
513515
tl.getBoolInput('enableTelemetry', false) &&
514516
['true', '1'].indexOf(process.env['REPLACETOKENS_TELEMETRY_OPTOUT'] || process.env['REPLACETOKENS_DISABLE_TELEMETRY']) === -1;
515517

516-
telemetryEvent.account = crypto.createHash('sha256').update(tl.getVariable('system.collectionid')).digest('hex');
517-
telemetryEvent.pipeline = crypto
518-
.createHash('sha256')
519-
.update(tl.getVariable('system.teamprojectid') + tl.getVariable('system.definitionid'))
520-
.digest('hex');
521-
telemetryEvent.pipelineType = tl.getVariable('release.releaseid') ? 'release' : 'build';
522-
telemetryEvent.serverType = !serverType || serverType.toLowerCase() !== 'hosted' ? 'server' : 'cloud';
518+
telemetryEvent.host = !serverType || serverType.toLowerCase() !== 'hosted' ? 'server' : 'cloud';
523519
telemetryEvent.os = (() => {
524520
const os = tl.getVariable('Agent.OS');
525521
switch (os) {
@@ -693,7 +689,7 @@ async function run() {
693689
telemetryEvent.escapeType = options.escapeType;
694690
telemetryEvent.keepToken = options.keepToken;
695691
telemetryEvent.pattern = regex.source;
696-
telemetryEvent.result = 'succeed';
692+
telemetryEvent.result = 'success';
697693
telemetryEvent.rules = rules.length;
698694
telemetryEvent.rulesWithInputWildcard = ruleUsingInputWildcardCount;
699695
telemetryEvent.rulesWithNegativePattern = ruleUsingNegativeInputPattern;

tasks/ReplaceTokensV3/task.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"version": {
1414
"Major": 3,
1515
"Minor": 12,
16-
"Patch": 1
16+
"Patch": 2
1717
},
1818
"instanceNameFormat": "Replace tokens in $(targetFiles)",
1919
"minimumAgentVersion": "2.105.0",

tasks/ReplaceTokensV3/telemetry.ts

+41-90
Original file line numberDiff line numberDiff line change
@@ -3,85 +3,26 @@ import url = require('url');
33
import http = require('http');
44
import https = require('https');
55

6-
const instrumentationKey = 'e18a8793-c093-46f9-8c3b-433c9553eb7f';
7-
const preview = false;
8-
const version = '3.5.0';
9-
const sdkVersion = 'replacetokens:1.0.0';
106
const application = 'replacetokens-task';
11-
const eventName = 'tokens.replaced';
12-
const telemetryUrl = 'https://westeurope-5.in.applicationinsights.azure.com/v2/track';
7+
const version = '3.0.0';
8+
const endpoint = 'https://insights-collector.eu01.nr-data.net/v1/accounts/4392697/events';
9+
const key = 'eu01xxc28887c2d47d9719ed24a74df5FFFFNRAL';
1310
const timeout = 3000;
1411

15-
export default function trackEvent(event: TelemetryEvent, proxyUrl?: string): string {
12+
export default function trackEvent(event: TelemetryEvent, proxy?: string): string | undefined {
1613
try {
1714
// create event payload
18-
let operationId: string = crypto.randomBytes(16).toString('hex');
19-
let body = {
20-
name: 'Microsoft.ApplicationInsights.Dev.' + instrumentationKey + '.Event',
21-
time: new Date().toISOString(),
22-
iKey: instrumentationKey,
23-
tags: {
24-
'ai.application.ver': version,
25-
'ai.cloud.role': event.serverType,
26-
'ai.internal.sdkVersion': sdkVersion,
27-
'ai.operation.id': operationId,
28-
'ai.operation.name': application,
29-
'ai.operation.parentId': '|' + operationId,
30-
'ai.user.accountId': event.account,
31-
'ai.user.authUserId': event.pipeline
32-
},
33-
data: {
34-
baseType: 'EventData',
35-
baseData: {
36-
ver: '2',
37-
name: eventName,
38-
properties: {
39-
preview: preview,
40-
pipelineType: event.pipelineType,
41-
result: event.result,
42-
tokenPrefix: event.tokenPrefix,
43-
tokenSuffix: event.tokenSuffix,
44-
pattern: event.pattern,
45-
encoding: event.encoding,
46-
keepToken: event.keepToken,
47-
actionOnMissing: event.actionOnMissing,
48-
writeBOM: event.writeBOM,
49-
emptyValue: event.emptyValue,
50-
escapeType: event.escapeType,
51-
escapeChar: event.escapeChar,
52-
charsToEscape: event.charsToEscape,
53-
verbosity: event.verbosity,
54-
variableFiles: event.variableFiles,
55-
variableSeparator: event.variableSeparator,
56-
rules: event.rules,
57-
rulesWithInputWildcard: event.rulesWithInputWildcard,
58-
rulesWithOutputPattern: event.rulesWithOutputPattern,
59-
rulesWithNegativePattern: event.rulesWithNegativePattern,
60-
duration: event.duration,
61-
tokenReplaced: event.tokenReplaced,
62-
tokenFound: event.tokenFound,
63-
fileProcessed: event.fileProcessed,
64-
useLegacyPattern: event.useLegacyPattern,
65-
enableTransforms: event.enableTransforms,
66-
transformPrefix: event.transformPrefix,
67-
transformSuffix: event.transformSuffix,
68-
transformPattern: event.transformPattern,
69-
transformExecuted: event.transformExecuted,
70-
defaultValue: event.defaultValue,
71-
defaultValueReplaced: event.defaultValueReplaced,
72-
actionOnNoFiles: event.actionOnNoFiles,
73-
inlineVariables: event.inlineVariables,
74-
enableRecursion: event.enableRecursion,
75-
useLegacyEmptyFeature: event.useLegacyEmptyFeature,
76-
useDefaultValue: event.useDefaultValue,
77-
os: event.os
78-
}
79-
}
15+
let body = [
16+
{
17+
...event,
18+
eventType: 'TokensReplaced',
19+
application: application,
20+
version: version
8021
}
81-
};
22+
];
8223

8324
// send event
84-
let telemetryUrlParsed = url.parse(telemetryUrl);
25+
let telemetryUrlParsed = url.parse(endpoint);
8526
let options = {
8627
method: 'POST',
8728
host: telemetryUrlParsed.hostname,
@@ -90,29 +31,30 @@ export default function trackEvent(event: TelemetryEvent, proxyUrl?: string): st
9031
withCredentials: false,
9132
timeout: timeout,
9233
headers: <{ [key: string]: string }>{
34+
'Api-Key': key,
9335
'Content-Type': 'application/json'
9436
}
9537
};
9638

97-
proxyUrl = proxyUrl || process.env['https_proxy'] || undefined;
98-
if (proxyUrl) {
99-
if (proxyUrl.indexOf('//') === 0) proxyUrl = 'http:' + proxyUrl;
39+
proxy = proxy || process.env['https_proxy'] || undefined;
40+
if (proxy) {
41+
if (proxy.indexOf('//') === 0) proxy = 'http:' + proxy;
10042

101-
let proxyUrlParsed = url.parse(proxyUrl);
43+
let proxyUrlParsed = url.parse(proxy);
10244
if (proxyUrlParsed.protocol === 'https:') {
103-
proxyUrl = undefined;
45+
proxy = undefined;
10446
} else {
10547
options = {
10648
...options,
10749
host: proxyUrlParsed.hostname,
10850
port: proxyUrlParsed.port || '80',
109-
path: telemetryUrl,
51+
path: endpoint,
11052
headers: { ...options.headers, Host: telemetryUrlParsed.hostname }
11153
};
11254
}
11355
}
11456

115-
let request = proxyUrl ? http.request(options) : https.request(options);
57+
let request = proxy ? http.request(options) : https.request(options);
11658

11759
request.setTimeout(timeout, () => {
11860
request.abort();
@@ -122,20 +64,31 @@ export default function trackEvent(event: TelemetryEvent, proxyUrl?: string): st
12264
request.write(JSON.stringify(body));
12365
request.end();
12466

125-
// return payload
126-
body.name = 'Microsoft.ApplicationInsights.Dev.*****.Event';
127-
body.iKey = '*****';
128-
12967
return JSON.stringify(body);
130-
} catch {}
68+
} catch {
69+
// silently continue
70+
}
13171
}
13272

133-
export interface TelemetryEvent {
134-
account: string;
135-
pipeline: string;
136-
pipelineType: string;
137-
serverType: string;
73+
export class TelemetryEvent {
74+
private readonly account: string;
75+
private readonly pipeline: string;
76+
77+
constructor(account: string, pipeline: string) {
78+
this.account = crypto
79+
.createHash('sha256')
80+
.update(account || '')
81+
.digest('hex');
82+
this.pipeline = crypto
83+
.createHash('sha256')
84+
.update(pipeline || '')
85+
.digest('hex');
86+
}
87+
88+
host: string;
89+
os: string;
13890
result: string;
91+
duration: number;
13992
tokenPrefix: string;
14093
tokenSuffix: string;
14194
pattern: string;
@@ -154,7 +107,6 @@ export interface TelemetryEvent {
154107
rulesWithInputWildcard: number;
155108
rulesWithOutputPattern: number;
156109
rulesWithNegativePattern: number;
157-
duration: number;
158110
tokenReplaced: number;
159111
tokenFound: number;
160112
fileProcessed: number;
@@ -171,5 +123,4 @@ export interface TelemetryEvent {
171123
enableRecursion: boolean;
172124
useLegacyEmptyFeature: boolean;
173125
useDefaultValue: boolean;
174-
os: string;
175126
}

tasks/ReplaceTokensV3/tests/L0.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ describe('ReplaceTokens v3 L0 suite', function () {
167167

168168
tr.stdout.should.include('telemetry sent');
169169
tr.stdout.should.match(
170-
/\{"name":"Microsoft\.ApplicationInsights\.Dev\.\*+\.Event","time":"[^"]+","iKey":"\*+","tags":\{"ai\.application\.ver":"3\.\d+\.\d+","ai\.cloud\.role":"server","ai\.internal\.sdkVersion":"replacetokens:1\.0\.0","ai\.operation\.id":"([^"]+)","ai\.operation\.name":"replacetokens-task","ai\.operation\.parentId":"\|\1","ai\.user\.accountId":"494d0aad9d06c4ddb51d5300620122ce55366a9382b3cc2835ed5f0e2e67b4d0","ai\.user\.authUserId":"b98ed03d3eec376dcc015365c1a944e3ebbcc33d30e3261af3f4e4abb107aa82"},"data":\{"baseType":"EventData","baseData":\{"ver":"2","name":"tokens\.replaced","properties":\{"preview":false,"pipelineType":"build","result":"failed","os":"Windows"}}}}/
170+
/\[\{"account":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","pipeline":"b98ed03d3eec376dcc015365c1a944e3ebbcc33d30e3261af3f4e4abb107aa82","host":"server","os":"Windows","result":"failed","eventType":"TokensReplaced","application":"replacetokens-task","version":"3.0.0"}]/
171171
);
172172
},
173173
tr,
@@ -192,7 +192,7 @@ describe('ReplaceTokens v3 L0 suite', function () {
192192

193193
tr.stdout.should.include('telemetry sent');
194194
tr.stdout.should.match(
195-
/\{"name":"Microsoft\.ApplicationInsights\.Dev\.\*+\.Event","time":"[^"]+","iKey":"\*+","tags":\{"ai\.application\.ver":"3\.\d+\.\d+","ai\.cloud\.role":"server","ai\.internal\.sdkVersion":"replacetokens:1\.0\.0","ai\.operation\.id":"([^"]+)","ai\.operation\.name":"replacetokens-task","ai\.operation\.parentId":"\|\1","ai\.user\.accountId":"494d0aad9d06c4ddb51d5300620122ce55366a9382b3cc2835ed5f0e2e67b4d0","ai\.user\.authUserId":"b98ed03d3eec376dcc015365c1a944e3ebbcc33d30e3261af3f4e4abb107aa82"},"data":\{"baseType":"EventData","baseData":\{"ver":"2","name":"tokens\.replaced","properties":\{"preview":false,"pipelineType":"build","result":"succeed","tokenPrefix":"#{","tokenSuffix":"}#","pattern":"#\\\\{\\\\s\*\(\(\?:\(\?!#\\\\{\)\(\?!\\\\s\*\\\\}#\)\.\)\*\)\\\\s\*\\\\}#","encoding":"auto","keepToken":false,"actionOnMissing":"warn","writeBOM":true,"verbosity":"normal","variableFiles":0,"rules":1,"rulesWithInputWildcard":0,"rulesWithOutputPattern":0,"rulesWithNegativePattern":0,"duration":\d+(?:\.\d+)?,"tokenReplaced":1,"tokenFound":1,"fileProcessed":1,"useLegacyPattern":false,"enableTransforms":false,"transformPrefix":"\(","transformSuffix":"\)","transformPattern":"\\\\s\*\(\.\*\)\\\\\(\\\\s\*\(\(\?:\(\?!\\\\\(\)\(\?!\\\\s\*\\\\\)\)\.\)\*\)\\\\s\*\\\\\)\\\\s\*","transformExecuted":0,"defaultValue":"","defaultValueReplaced":0,"actionOnNoFiles":"continue","inlineVariables":0,"enableRecursion":false,"useLegacyEmptyFeature":false,"useDefaultValue":false,"os":"Windows"}}}}/
195+
/\[\{"account":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","pipeline":"b98ed03d3eec376dcc015365c1a944e3ebbcc33d30e3261af3f4e4abb107aa82","host":"server","os":"Windows","actionOnMissing":"warn","encoding":"auto","keepToken":false,"pattern":"#\\\\{\\\\s\*\(\(\?:\(\?!#\\\\{\)\(\?!\\\\s\*\\\\}#\)\.\)\*\)\\\\s\*\\\\}#","result":"success","rules":1,"rulesWithInputWildcard":0,"rulesWithNegativePattern":0,"rulesWithOutputPattern":0,"tokenPrefix":"#{","tokenSuffix":"}#","variableFiles":0,"verbosity":"normal","writeBOM":true,"useLegacyPattern":false,"enableTransforms":false,"transformPrefix":"\(","transformSuffix":"\)","transformPattern":"\\\\s\*\(\.\*\)\\\\\(\\\\s\*\(\(\?:\(\?!\\\\\(\)\(\?!\\\\s\*\\\\\)\)\.\)\*\)\\\\s\*\\\\\)\\\\s\*","defaultValue":"","actionOnNoFiles":"continue","inlineVariables":0,"enableRecursion":false,"useLegacyEmptyFeature":false,"useDefaultValue":false,"duration":\d+(?:\.\d+)?,"tokenReplaced":1,"tokenFound":1,"defaultValueReplaced":0,"fileProcessed":1,"transformExecuted":0,"eventType":"TokensReplaced","application":"replacetokens-task","version":"3.0.0"}]/
196196
);
197197
},
198198
tr,

tasks/ReplaceTokensV4/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# Changelog
2+
## 4.4.2
3+
- Change telemetry provider.
24

35
## 4.4.1
46
- Add agent OS in telemetry ([#5](https://github.com/qetza/replacetokens-task/issues/5)).

tasks/ReplaceTokensV4/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ The following **anonymous** data is send:
310310
- the **number of** _targetFiles_ entries having an output pattern
311311
- the **number of** _variableFiles_ entries
312312
- the **number of** _inlineVariables_ entries
313-
- the task result (`succeed` or `failed`)
313+
- the task result (`success` or `failed`)
314314
- the task execution duration
315315
- the outputs (_defaultValueCount_, _fileProcessedCount_, _tokenReplacedCount_, _tokenFoundCount_ and _transformExecutedCount_)
316316

tasks/ReplaceTokensV4/index.ts

+7-11
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import iconv = require('iconv-lite');
44
import jschardet = require('jschardet');
55
import path = require('path');
66
import os = require('os');
7-
import crypto = require('crypto');
87
import trackEvent, { TelemetryEvent } from './telemetry';
98
import yaml = require('js-yaml');
109
import stripJsonComments from './strip-json-comments';
@@ -498,8 +497,11 @@ var normalize = function (p: string): string {
498497

499498
async function run() {
500499
// initialize telemetry (outside of try as needed in catch and finally)
501-
let telemetryEnabled: boolean = false;
502-
let telemetryEvent: TelemetryEvent = {} as TelemetryEvent;
500+
let telemetryEnabled = false;
501+
let telemetryEvent = new TelemetryEvent(
502+
tl.getVariable('ystem.collectionid'),
503+
`${tl.getVariable('system.teamprojectid')}${tl.getVariable('system.definitionid')}`
504+
);
503505

504506
let proxyUrl: string | undefined = undefined;
505507
const config = tl.getHttpProxyConfiguration();
@@ -513,13 +515,7 @@ async function run() {
513515
tl.getBoolInput('enableTelemetry', false) &&
514516
['true', '1'].indexOf(process.env['REPLACETOKENS_TELEMETRY_OPTOUT'] || process.env['REPLACETOKENS_DISABLE_TELEMETRY']) === -1;
515517

516-
telemetryEvent.account = crypto.createHash('sha256').update(tl.getVariable('system.collectionid')).digest('hex');
517-
telemetryEvent.pipeline = crypto
518-
.createHash('sha256')
519-
.update(tl.getVariable('system.teamprojectid') + tl.getVariable('system.definitionid'))
520-
.digest('hex');
521-
telemetryEvent.pipelineType = tl.getVariable('release.releaseid') ? 'release' : 'build';
522-
telemetryEvent.serverType = !serverType || serverType.toLowerCase() !== 'hosted' ? 'server' : 'cloud';
518+
telemetryEvent.host = !serverType || serverType.toLowerCase() !== 'hosted' ? 'server' : 'cloud';
523519
telemetryEvent.os = (() => {
524520
const os = tl.getVariable('Agent.OS');
525521
switch (os) {
@@ -721,7 +717,7 @@ async function run() {
721717
telemetryEvent.escapeType = options.escapeType;
722718
telemetryEvent.keepToken = options.keepToken;
723719
telemetryEvent.pattern = regex.source;
724-
telemetryEvent.result = 'succeed';
720+
telemetryEvent.result = 'success';
725721
telemetryEvent.rules = rules.length;
726722
telemetryEvent.rulesWithInputWildcard = ruleUsingInputWildcardCount;
727723
telemetryEvent.rulesWithNegativePattern = ruleUsingNegativeInputPattern;

tasks/ReplaceTokensV4/task.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"version": {
1414
"Major": 4,
1515
"Minor": 4,
16-
"Patch": 1
16+
"Patch": 2
1717
},
1818
"releaseNotes": "Added output variables (breaking change).<br/>Added token pattern dropdown (breaking change).",
1919
"instanceNameFormat": "Replace tokens in $(targetFiles)",

0 commit comments

Comments
 (0)