171 lines
7.0 KiB
JavaScript
171 lines
7.0 KiB
JavaScript
var __assign = (this && this.__assign) || function () {
|
|
__assign = Object.assign || function(t) {
|
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
s = arguments[i];
|
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
t[p] = s[p];
|
|
}
|
|
return t;
|
|
};
|
|
return __assign.apply(this, arguments);
|
|
};
|
|
/*
|
|
* Copyright The OpenTelemetry Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
import { SpanKind, context, trace, diag, } from '@opentelemetry/api';
|
|
var START_SPAN_FUNCTION = Symbol('opentelemetry.pubsub-propagation.start_span');
|
|
var END_SPAN_FUNCTION = Symbol('opentelemetry.pubsub-propagation.end_span');
|
|
var patchArrayFilter = function (messages, tracer, loopContext) {
|
|
var origFunc = messages.filter;
|
|
var patchedFunc = function () {
|
|
var args = [];
|
|
for (var _i = 0; _i < arguments.length; _i++) {
|
|
args[_i] = arguments[_i];
|
|
}
|
|
var newArray = origFunc.apply(this, args);
|
|
patchArrayForProcessSpans(newArray, tracer, loopContext);
|
|
return newArray;
|
|
};
|
|
Object.defineProperty(messages, 'filter', {
|
|
enumerable: false,
|
|
value: patchedFunc,
|
|
});
|
|
};
|
|
function isPromise(value) {
|
|
var _a;
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
return typeof ((_a = value) === null || _a === void 0 ? void 0 : _a.then) === 'function';
|
|
}
|
|
var patchArrayFunction = function (messages, functionName, tracer, loopContext) {
|
|
var origFunc = messages[functionName];
|
|
var patchedFunc = function () {
|
|
var arrFuncArgs = [];
|
|
for (var _i = 0; _i < arguments.length; _i++) {
|
|
arrFuncArgs[_i] = arguments[_i];
|
|
}
|
|
var callback = arrFuncArgs[0];
|
|
var wrappedCallback = function () {
|
|
var _this = this;
|
|
var _a;
|
|
var callbackArgs = [];
|
|
for (var _i = 0; _i < arguments.length; _i++) {
|
|
callbackArgs[_i] = arguments[_i];
|
|
}
|
|
var message = callbackArgs[0];
|
|
var messageSpan = (_a = message === null || message === void 0 ? void 0 : message[START_SPAN_FUNCTION]) === null || _a === void 0 ? void 0 : _a.call(message);
|
|
if (!messageSpan)
|
|
return callback.apply(this, callbackArgs);
|
|
var res = context.with(trace.setSpan(loopContext, messageSpan), function () {
|
|
var _a;
|
|
var result;
|
|
try {
|
|
result = callback.apply(_this, callbackArgs);
|
|
if (isPromise(result)) {
|
|
var endSpan = function () { var _a; return (_a = message[END_SPAN_FUNCTION]) === null || _a === void 0 ? void 0 : _a.call(message); };
|
|
result.then(endSpan, endSpan);
|
|
}
|
|
return result;
|
|
}
|
|
finally {
|
|
if (!isPromise(result)) {
|
|
(_a = message[END_SPAN_FUNCTION]) === null || _a === void 0 ? void 0 : _a.call(message);
|
|
}
|
|
}
|
|
});
|
|
if (typeof res === 'object') {
|
|
var startSpanFunction = Object.getOwnPropertyDescriptor(message, START_SPAN_FUNCTION);
|
|
startSpanFunction &&
|
|
Object.defineProperty(res, START_SPAN_FUNCTION, startSpanFunction);
|
|
var endSpanFunction = Object.getOwnPropertyDescriptor(message, END_SPAN_FUNCTION);
|
|
endSpanFunction &&
|
|
Object.defineProperty(res, END_SPAN_FUNCTION, endSpanFunction);
|
|
}
|
|
return res;
|
|
};
|
|
arrFuncArgs[0] = wrappedCallback;
|
|
var funcResult = origFunc.apply(this, arrFuncArgs);
|
|
if (Array.isArray(funcResult))
|
|
patchArrayForProcessSpans(funcResult, tracer, loopContext);
|
|
return funcResult;
|
|
};
|
|
Object.defineProperty(messages, functionName, {
|
|
enumerable: false,
|
|
value: patchedFunc,
|
|
});
|
|
};
|
|
var patchArrayForProcessSpans = function (messages, tracer, loopContext) {
|
|
if (loopContext === void 0) { loopContext = context.active(); }
|
|
patchArrayFunction(messages, 'forEach', tracer, loopContext);
|
|
patchArrayFunction(messages, 'map', tracer, loopContext);
|
|
patchArrayFilter(messages, tracer, loopContext);
|
|
};
|
|
var startMessagingProcessSpan = function (message, name, attributes, parentContext, propagatedContext, tracer, processHook) {
|
|
var _a;
|
|
var links = [];
|
|
var spanContext = trace.getSpanContext(propagatedContext);
|
|
if (spanContext) {
|
|
links.push({
|
|
context: spanContext,
|
|
});
|
|
}
|
|
var spanName = name + " process";
|
|
var processSpan = tracer.startSpan(spanName, {
|
|
kind: SpanKind.CONSUMER,
|
|
attributes: __assign(__assign({}, attributes), (_a = {}, _a['messaging.operation'] = 'process', _a)),
|
|
links: links,
|
|
}, parentContext);
|
|
Object.defineProperty(message, START_SPAN_FUNCTION, {
|
|
enumerable: false,
|
|
writable: true,
|
|
value: function () { return processSpan; },
|
|
});
|
|
Object.defineProperty(message, END_SPAN_FUNCTION, {
|
|
enumerable: false,
|
|
writable: true,
|
|
value: function () {
|
|
processSpan.end();
|
|
Object.defineProperty(message, END_SPAN_FUNCTION, {
|
|
enumerable: false,
|
|
writable: true,
|
|
value: function () { },
|
|
});
|
|
},
|
|
});
|
|
try {
|
|
processHook === null || processHook === void 0 ? void 0 : processHook(processSpan, message);
|
|
}
|
|
catch (err) {
|
|
diag.error('opentelemetry-pubsub-propagation: process hook error', err);
|
|
}
|
|
return processSpan;
|
|
};
|
|
var patchMessagesArrayToStartProcessSpans = function (_a) {
|
|
var messages = _a.messages, tracer = _a.tracer, parentContext = _a.parentContext, messageToSpanDetails = _a.messageToSpanDetails, processHook = _a.processHook;
|
|
messages.forEach(function (message) {
|
|
var _a = messageToSpanDetails(message), attributes = _a.attributes, name = _a.name, propagatedContext = _a.parentContext;
|
|
Object.defineProperty(message, START_SPAN_FUNCTION, {
|
|
enumerable: false,
|
|
writable: true,
|
|
value: function () {
|
|
return startMessagingProcessSpan(message, name, attributes, parentContext, propagatedContext, tracer, processHook);
|
|
},
|
|
});
|
|
});
|
|
};
|
|
export default {
|
|
patchMessagesArrayToStartProcessSpans: patchMessagesArrayToStartProcessSpans,
|
|
patchArrayForProcessSpans: patchArrayForProcessSpans,
|
|
};
|
|
//# sourceMappingURL=pubsub-propagation.js.map
|