in extensions/applicationinsights-dependencies-js/src/ajaxRecord.ts [56:172]
function _populatePerfData(ajaxData:ajaxRecord, dependency:IDependencyTelemetry) {
/*
* https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API/Using_the_Resource_Timing_API
* | -startTime
* | -redirectStart
* | | -redirectEnd
* | | | -fetchStart
* | | | | -domainLookupStart
* | | | | |- domainLookupEnd
* | | | | | | -connectStart
* | | | | | | | -secureConnectionStart
* | | | | | | | | -connectEnd
* | | | | | | | | | -requestStart
* | | | | | | | | | | | -responseStart
* | | | | | | | | | | | | | -responseEnd
* +------------+-+---+----------------+-+--+--------+-+-----------+-+------------+-+
* |--redirect--| |---|--domainLookup--| |--connect--| |--request--| |--response--| |
* |-------------------networkConnect----------------|
* | |---------sentRequest--------|
* |------------------------------------perfTotal-----------------------------------|
*/
let resourceEntry = ajaxData.perfTiming;
let props = dependency[strProperties] || {};
let propsSet = 0;
let strName = "name";
let strStart = "Start";
let strEnd = "End";
let strDomainLookup = "domainLookup";
let strConnect = "connect";
let strRedirect = "redirect";
let strRequest = "request";
let strResponse = "response";
let strDuration = "duration";
let strStartTime = "startTime";
let strDomainLookupStart = strDomainLookup + strStart;
let strDomainLookupEnd = strDomainLookup + strEnd;
let strConnectStart = strConnect + strStart;
let strConnectEnd = strConnect + strEnd;
let strRequestStart = strRequest + strStart;
let strRequestEnd = strRequest + strEnd;
let strResponseStart = strResponse + strStart;
let strResponseEnd = strResponse + strEnd;
let strRedirectStart = strRedirect + strStart;
let strRedirectEnd = strRedirect = strEnd;
let strTransferSize = "transferSize";
let strEncodedBodySize = "encodedBodySize";
let strDecodedBodySize = "decodedBodySize";
let strServerTiming = "serverTiming";
if (resourceEntry) {
// redirect
propsSet |= _setPerfDuration(props, strRedirect, resourceEntry, strRedirectStart, strRedirectEnd);
// domainLookup
propsSet |= _setPerfDuration(props, strDomainLookup, resourceEntry, strDomainLookupStart, strDomainLookupEnd);
// connect
propsSet |= _setPerfDuration(props, strConnect, resourceEntry, strConnectStart, strConnectEnd);
// request
propsSet |= _setPerfDuration(props, strRequest, resourceEntry, strRequestStart, strRequestEnd);
// response
propsSet |= _setPerfDuration(props, strResponse, resourceEntry, strResponseStart, strResponseEnd);
// Network connection time
propsSet |= _setPerfDuration(props, "networkConnect", resourceEntry, strStartTime, strConnectEnd);
// Sent Request
propsSet |= _setPerfDuration(props, "sentRequest", resourceEntry, strRequestStart, strResponseEnd);
// PerfTotal / Duration
let duration = resourceEntry[strDuration];
if (!duration) {
duration = _calcPerfDuration(resourceEntry, strStartTime, strResponseEnd) || 0;
}
propsSet |= _setPerfValue(props, strDuration, duration);
propsSet |= _setPerfValue(props, "perfTotal", duration);
var serverTiming = resourceEntry[strServerTiming];
if (serverTiming) {
let server = {};
arrForEach(serverTiming, (value, idx) => {
let name = normalizeJsName(value[strName] || "" + idx);
let newValue = server[name] || {};
objForEachKey(value, (key, val) => {
if (key !== strName && isString(val) || isNumber(val)) {
if (newValue[key]) {
val = newValue[key] + ";" + val;
}
if (val || !isString(val)) {
// Only set the value if it has a value and it's not an empty string
newValue[key] = val;
}
}
});
server[name] = newValue;
});
propsSet |= _setPerfValue(props, strServerTiming, server);
}
propsSet |= _setPerfValue(props, strTransferSize, resourceEntry[strTransferSize]);
propsSet |= _setPerfValue(props, strEncodedBodySize, resourceEntry[strEncodedBodySize]);
propsSet |= _setPerfValue(props, strDecodedBodySize, resourceEntry[strDecodedBodySize]);
} else {
if (ajaxData.perfMark) {
propsSet |= _setPerfValue(props, "missing", ajaxData.perfAttempts);
}
}
if (propsSet) {
dependency[strProperties] = props;
}
}