@microsoft/applicationinsights-core-js
Version:
Microsoft Application Insights Core Javascript SDK
199 lines (196 loc) • 9.35 kB
JavaScript
/*
* Application Insights JavaScript SDK - Core, 3.3.6
* Copyright (c) Microsoft and contributors. All rights reserved.
*/
import dynamicProto from "@microsoft/dynamicproto-js";
import { isArray, isFunction, objDefine, utcNow } from "@nevware21/ts-utils";
import { _DYN_GET_CTX, _DYN_IS_CHILD_EVT, _DYN_LENGTH, _DYN_NAME, _DYN_PUSH, _DYN_SET_CTX } from "../__DynamicConstants";
import { STR_GET_PERF_MGR, STR_PERF_EVENT } from "./InternalConstants";
var strExecutionContextKey = "ctx";
var strParentContextKey = "ParentContextKey";
var strChildrenContextKey = "ChildrenContextKey";
var _defaultPerfManager = null;
var PerfEvent = /** @class */ (function () {
function PerfEvent(name, payloadDetails, isAsync) {
var _self = this;
_self.start = utcNow();
_self[_DYN_NAME /* @min:%2ename */] = name;
_self.isAsync = isAsync;
_self[_DYN_IS_CHILD_EVT /* @min:%2eisChildEvt */] = function () { return false; };
if (isFunction(payloadDetails)) {
// Create an accessor to minimize the potential performance impact of executing the payloadDetails callback
var theDetails_1;
objDefine(_self, "payload", {
g: function () {
// Delay the execution of the payloadDetails until needed
if (!theDetails_1 && isFunction(payloadDetails)) {
theDetails_1 = payloadDetails();
// clear it out now so the referenced objects can be garbage collected
payloadDetails = null;
}
return theDetails_1;
}
});
}
_self[_DYN_GET_CTX /* @min:%2egetCtx */] = function (key) {
if (key) {
// The parent and child links are located directly on the object (for better viewing in the DebugPlugin)
if (key === PerfEvent[strParentContextKey] || key === PerfEvent[strChildrenContextKey]) {
return _self[key];
}
return (_self[strExecutionContextKey] || {})[key];
}
return null;
};
_self[_DYN_SET_CTX /* @min:%2esetCtx */] = function (key, value) {
if (key) {
// Put the parent and child links directly on the object (for better viewing in the DebugPlugin)
if (key === PerfEvent[strParentContextKey]) {
// Simple assumption, if we are setting a parent then we must be a child
if (!_self[key]) {
_self[_DYN_IS_CHILD_EVT /* @min:%2eisChildEvt */] = function () { return true; };
}
_self[key] = value;
}
else if (key === PerfEvent[strChildrenContextKey]) {
_self[key] = value;
}
else {
var ctx = _self[strExecutionContextKey] = _self[strExecutionContextKey] || {};
ctx[key] = value;
}
}
};
_self.complete = function () {
var childTime = 0;
var childEvts = _self[_DYN_GET_CTX /* @min:%2egetCtx */](PerfEvent[strChildrenContextKey]);
if (isArray(childEvts)) {
for (var lp = 0; lp < childEvts[_DYN_LENGTH /* @min:%2elength */]; lp++) {
var childEvt = childEvts[lp];
if (childEvt) {
childTime += childEvt.time;
}
}
}
_self.time = utcNow() - _self.start;
_self.exTime = _self.time - childTime;
_self.complete = function () { };
};
}
PerfEvent.ParentContextKey = "parent";
PerfEvent.ChildrenContextKey = "childEvts";
return PerfEvent;
}());
export { PerfEvent };
var PerfManager = /** @class */ (function () {
function PerfManager(manager) {
/**
* General bucket used for execution context set and retrieved via setCtx() and getCtx.
* Defined as private so it can be visualized via the DebugPlugin
*/
this.ctx = {};
dynamicProto(PerfManager, this, function (_self) {
_self.create = function (src, payloadDetails, isAsync) {
// TODO (@MSNev): at some point we will want to add additional configuration to "select" which events to instrument
// for now this is just a simple do everything.
return new PerfEvent(src, payloadDetails, isAsync);
};
_self.fire = function (perfEvent) {
if (perfEvent) {
perfEvent.complete();
if (manager && isFunction(manager[STR_PERF_EVENT /* @min:%2eperfEvent */])) {
manager[STR_PERF_EVENT /* @min:%2eperfEvent */](perfEvent);
}
}
};
_self[_DYN_SET_CTX /* @min:%2esetCtx */] = function (key, value) {
if (key) {
var ctx = _self[strExecutionContextKey] = _self[strExecutionContextKey] || {};
ctx[key] = value;
}
};
_self[_DYN_GET_CTX /* @min:%2egetCtx */] = function (key) {
return (_self[strExecutionContextKey] || {})[key];
};
});
}
// Removed Stub for PerfManager.prototype.create.
// Removed Stub for PerfManager.prototype.fire.
// Removed Stub for PerfManager.prototype.setCtx.
// Removed Stub for PerfManager.prototype.getCtx.
// This is a workaround for an IE bug when using dynamicProto() with classes that don't have any
// non-dynamic functions or static properties/functions when using uglify-js to minify the resulting code.
PerfManager.__ieDyn=1;
return PerfManager;
}());
export { PerfManager };
var doPerfActiveKey = "CoreUtils.doPerf";
/**
* Helper function to wrap a function with a perf event
* @param mgrSource - The Performance Manager or a Performance provider source (may be null)
* @param getSource - The callback to create the source name for the event (if perf monitoring is enabled)
* @param func - The function to call and measure
* @param details - A function to return the payload details
* @param isAsync - Is the event / function being call asynchronously or synchronously
*/
export function doPerf(mgrSource, getSource, func, details, isAsync) {
if (mgrSource) {
var perfMgr = mgrSource;
if (perfMgr[STR_GET_PERF_MGR]) {
// Looks like a perf manager provider object
perfMgr = perfMgr[STR_GET_PERF_MGR]();
}
if (perfMgr) {
var perfEvt = void 0;
var currentActive = perfMgr[_DYN_GET_CTX /* @min:%2egetCtx */](doPerfActiveKey);
try {
perfEvt = perfMgr.create(getSource(), details, isAsync);
if (perfEvt) {
if (currentActive && perfEvt[_DYN_SET_CTX /* @min:%2esetCtx */]) {
perfEvt[_DYN_SET_CTX /* @min:%2esetCtx */](PerfEvent[strParentContextKey], currentActive);
if (currentActive[_DYN_GET_CTX /* @min:%2egetCtx */] && currentActive[_DYN_SET_CTX /* @min:%2esetCtx */]) {
var children = currentActive[_DYN_GET_CTX /* @min:%2egetCtx */](PerfEvent[strChildrenContextKey]);
if (!children) {
children = [];
currentActive[_DYN_SET_CTX /* @min:%2esetCtx */](PerfEvent[strChildrenContextKey], children);
}
children[_DYN_PUSH /* @min:%2epush */](perfEvt);
}
}
// Set this event as the active event now
perfMgr[_DYN_SET_CTX /* @min:%2esetCtx */](doPerfActiveKey, perfEvt);
return func(perfEvt);
}
}
catch (ex) {
if (perfEvt && perfEvt[_DYN_SET_CTX /* @min:%2esetCtx */]) {
perfEvt[_DYN_SET_CTX /* @min:%2esetCtx */]("exception", ex);
}
}
finally {
// fire the perf event
if (perfEvt) {
perfMgr.fire(perfEvt);
}
// Reset the active event to the previous value
perfMgr[_DYN_SET_CTX /* @min:%2esetCtx */](doPerfActiveKey, currentActive);
}
}
}
return func();
}
/**
* Set the global performance manager to use when there is no core instance or it has not been initialized yet.
* @param perfManager - The IPerfManager instance to use when no performance manager is supplied.
*/
export function setGblPerfMgr(perfManager) {
_defaultPerfManager = perfManager;
}
/**
* Get the current global performance manager that will be used with no performance manager is supplied.
* @returns - The current default manager
*/
export function getGblPerfMgr() {
return _defaultPerfManager;
}
//# sourceMappingURL=PerfManager.js.map