Comparing version 0.14.3 to 0.15.0
@@ -33,3 +33,12 @@ // TypeScript type definitions | ||
class Tracer { | ||
constructor(args: { ctxImpl: Context<TraceId>, recorder: Recorder, sampler?: sampler.Sampler, traceId128Bit?: boolean, localServiceName?: string, localEndpoint?: model.Endpoint }); | ||
constructor(args: { | ||
ctxImpl: Context<TraceId>, | ||
recorder: Recorder, | ||
sampler?: sampler.Sampler, | ||
traceId128Bit?: boolean, | ||
localServiceName?: string, | ||
localEndpoint?: model.Endpoint, | ||
log?: Console | ||
}); | ||
id: TraceId; | ||
@@ -43,3 +52,3 @@ | ||
setId(traceId: TraceId): void; | ||
recordAnnotation(annotation: IAnnotation): void; | ||
recordAnnotation(annotation: IAnnotation, timestamp?: number): void; | ||
recordMessage(message: string): void; | ||
@@ -79,10 +88,7 @@ recordServiceName(serviceName: string): void; | ||
namespace option { | ||
interface IOption<T> { | ||
type: 'Some' | 'None'; | ||
present: boolean; | ||
abstract class Option<T> { | ||
map<V>(fn: (value: T) => V): IOption<V>; | ||
ifPresent<V>(fn: (value: T) => V): IOption<V>; | ||
flatMap<V>(fn: (value: T) => V): IOption<V>; | ||
getOrElse<V>(fnOrValue: (() => V) | V): T; | ||
ifPresent(fn: (value: T) => any): void; | ||
flatMap<V>(fn: (value: T) => IOption<V>): IOption<V>; | ||
getOrElse(fnOrValue: (() => T) | T): T; | ||
equals(other: IOption<T>): boolean; | ||
@@ -92,26 +98,16 @@ toString(): string; | ||
interface INone extends IOption<any> { | ||
type: 'None'; | ||
present: false; | ||
map<V>(fn: (value: any) => V): INone; | ||
flatMap<V>(fn: (value: any) => V): INone; | ||
equals(other: IOption<any>): boolean; | ||
toString(): string; | ||
class Some<T> extends Option<T> { | ||
constructor(value: T); | ||
readonly type: 'Some'; | ||
readonly present: true; | ||
} | ||
const None: INone; | ||
interface INone<T> extends Option<T> { | ||
readonly type: 'None'; | ||
readonly present: false; | ||
} | ||
class Some<T> implements IOption<T> { | ||
constructor(value: T); | ||
type: 'Some' | 'None'; | ||
present: true; | ||
type IOption<T> = Some<T> | INone<T>; | ||
map: <V>(fn: (value: T) => V) => IOption<V>; | ||
ifPresent: <V>(fn: (value: T) => V) => IOption<V>; | ||
flatMap: <V>(fn: (value: T) => V) => IOption<V>; | ||
getOrElse: () => T; | ||
equals: (other: IOption<T>) => boolean; | ||
toString: () => string; | ||
} | ||
const None: INone<never>; | ||
@@ -131,3 +127,3 @@ function isOptional(data: any): boolean; | ||
isEmpty(): void; | ||
isEmpty(): boolean; | ||
} | ||
@@ -318,3 +314,9 @@ | ||
class HttpServer { | ||
constructor(args: { tracer: Tracer, port: number }); | ||
constructor(args: { | ||
tracer: Tracer, | ||
port: number, | ||
serviceName?: string, | ||
host?: string, | ||
serverTags?: {[key: string]: string} | ||
}); | ||
@@ -321,0 +323,0 @@ recordRequest( |
@@ -1,14 +0,26 @@ | ||
'use strict'; | ||
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | ||
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } | ||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | ||
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } | ||
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } | ||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } | ||
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var InetAddress = require('./InetAddress'); | ||
var SimpleAnnotation = function () { | ||
var SimpleAnnotation = | ||
/*#__PURE__*/ | ||
function () { | ||
function SimpleAnnotation() { | ||
@@ -19,5 +31,5 @@ _classCallCheck(this, SimpleAnnotation); | ||
_createClass(SimpleAnnotation, [{ | ||
key: 'toString', | ||
key: "toString", | ||
value: function toString() { | ||
return this.annotationType + '()'; | ||
return "".concat(this.annotationType, "()"); | ||
} | ||
@@ -29,3 +41,5 @@ }]); | ||
var ClientSend = function (_SimpleAnnotation) { | ||
var ClientSend = | ||
/*#__PURE__*/ | ||
function (_SimpleAnnotation) { | ||
_inherits(ClientSend, _SimpleAnnotation); | ||
@@ -36,3 +50,3 @@ | ||
return _possibleConstructorReturn(this, (ClientSend.__proto__ || Object.getPrototypeOf(ClientSend)).apply(this, arguments)); | ||
return _possibleConstructorReturn(this, _getPrototypeOf(ClientSend).apply(this, arguments)); | ||
} | ||
@@ -43,3 +57,5 @@ | ||
var ClientRecv = function (_SimpleAnnotation2) { | ||
var ClientRecv = | ||
/*#__PURE__*/ | ||
function (_SimpleAnnotation2) { | ||
_inherits(ClientRecv, _SimpleAnnotation2); | ||
@@ -50,3 +66,3 @@ | ||
return _possibleConstructorReturn(this, (ClientRecv.__proto__ || Object.getPrototypeOf(ClientRecv)).apply(this, arguments)); | ||
return _possibleConstructorReturn(this, _getPrototypeOf(ClientRecv).apply(this, arguments)); | ||
} | ||
@@ -57,3 +73,5 @@ | ||
var ServerSend = function (_SimpleAnnotation3) { | ||
var ServerSend = | ||
/*#__PURE__*/ | ||
function (_SimpleAnnotation3) { | ||
_inherits(ServerSend, _SimpleAnnotation3); | ||
@@ -64,3 +82,3 @@ | ||
return _possibleConstructorReturn(this, (ServerSend.__proto__ || Object.getPrototypeOf(ServerSend)).apply(this, arguments)); | ||
return _possibleConstructorReturn(this, _getPrototypeOf(ServerSend).apply(this, arguments)); | ||
} | ||
@@ -71,3 +89,5 @@ | ||
var ServerRecv = function (_SimpleAnnotation4) { | ||
var ServerRecv = | ||
/*#__PURE__*/ | ||
function (_SimpleAnnotation4) { | ||
_inherits(ServerRecv, _SimpleAnnotation4); | ||
@@ -78,3 +98,3 @@ | ||
return _possibleConstructorReturn(this, (ServerRecv.__proto__ || Object.getPrototypeOf(ServerRecv)).apply(this, arguments)); | ||
return _possibleConstructorReturn(this, _getPrototypeOf(ServerRecv).apply(this, arguments)); | ||
} | ||
@@ -85,3 +105,5 @@ | ||
var ProducerStart = function (_SimpleAnnotation5) { | ||
var ProducerStart = | ||
/*#__PURE__*/ | ||
function (_SimpleAnnotation5) { | ||
_inherits(ProducerStart, _SimpleAnnotation5); | ||
@@ -92,3 +114,3 @@ | ||
return _possibleConstructorReturn(this, (ProducerStart.__proto__ || Object.getPrototypeOf(ProducerStart)).apply(this, arguments)); | ||
return _possibleConstructorReturn(this, _getPrototypeOf(ProducerStart).apply(this, arguments)); | ||
} | ||
@@ -99,3 +121,5 @@ | ||
var ProducerStop = function (_SimpleAnnotation6) { | ||
var ProducerStop = | ||
/*#__PURE__*/ | ||
function (_SimpleAnnotation6) { | ||
_inherits(ProducerStop, _SimpleAnnotation6); | ||
@@ -106,3 +130,3 @@ | ||
return _possibleConstructorReturn(this, (ProducerStop.__proto__ || Object.getPrototypeOf(ProducerStop)).apply(this, arguments)); | ||
return _possibleConstructorReturn(this, _getPrototypeOf(ProducerStop).apply(this, arguments)); | ||
} | ||
@@ -113,3 +137,5 @@ | ||
var ConsumerStart = function (_SimpleAnnotation7) { | ||
var ConsumerStart = | ||
/*#__PURE__*/ | ||
function (_SimpleAnnotation7) { | ||
_inherits(ConsumerStart, _SimpleAnnotation7); | ||
@@ -120,3 +146,3 @@ | ||
return _possibleConstructorReturn(this, (ConsumerStart.__proto__ || Object.getPrototypeOf(ConsumerStart)).apply(this, arguments)); | ||
return _possibleConstructorReturn(this, _getPrototypeOf(ConsumerStart).apply(this, arguments)); | ||
} | ||
@@ -127,3 +153,5 @@ | ||
var ConsumerStop = function (_SimpleAnnotation8) { | ||
var ConsumerStop = | ||
/*#__PURE__*/ | ||
function (_SimpleAnnotation8) { | ||
_inherits(ConsumerStop, _SimpleAnnotation8); | ||
@@ -134,3 +162,3 @@ | ||
return _possibleConstructorReturn(this, (ConsumerStop.__proto__ || Object.getPrototypeOf(ConsumerStop)).apply(this, arguments)); | ||
return _possibleConstructorReturn(this, _getPrototypeOf(ConsumerStop).apply(this, arguments)); | ||
} | ||
@@ -144,7 +172,10 @@ | ||
} | ||
LocalOperationStart.prototype.toString = function () { | ||
return 'LocalOperationStart("' + this.name + '")'; | ||
return "LocalOperationStart(\"".concat(this.name, "\")"); | ||
}; | ||
var LocalOperationStop = function (_SimpleAnnotation9) { | ||
var LocalOperationStop = | ||
/*#__PURE__*/ | ||
function (_SimpleAnnotation9) { | ||
_inherits(LocalOperationStop, _SimpleAnnotation9); | ||
@@ -155,3 +186,3 @@ | ||
return _possibleConstructorReturn(this, (LocalOperationStop.__proto__ || Object.getPrototypeOf(LocalOperationStop)).apply(this, arguments)); | ||
return _possibleConstructorReturn(this, _getPrototypeOf(LocalOperationStop).apply(this, arguments)); | ||
} | ||
@@ -165,4 +196,5 @@ | ||
} | ||
Message.prototype.toString = function () { | ||
return 'Message("' + this.message + '")'; | ||
return "Message(\"".concat(this.message, "\")"); | ||
}; | ||
@@ -173,4 +205,5 @@ | ||
} | ||
ServiceName.prototype.toString = function () { | ||
return 'ServiceName("' + this.serviceName + '")'; | ||
return "ServiceName(\"".concat(this.serviceName, "\")"); | ||
}; | ||
@@ -181,4 +214,5 @@ | ||
} | ||
Rpc.prototype.toString = function () { | ||
return 'Rpc("' + this.name + '")'; | ||
return "Rpc(\"".concat(this.name, "\")"); | ||
}; | ||
@@ -189,8 +223,8 @@ | ||
port = _ref.port; | ||
this.host = host; | ||
this.port = port; | ||
} | ||
ClientAddr.prototype.toString = function () { | ||
return 'ClientAddr(host="' + this.host + '", port=' + this.port + ')'; | ||
return "ClientAddr(host=\"".concat(this.host, "\", port=").concat(this.port, ")"); | ||
}; | ||
@@ -202,3 +236,2 @@ | ||
port = _ref2.port; | ||
this.serviceName = serviceName; | ||
@@ -208,4 +241,5 @@ this.host = host || undefined; | ||
} | ||
ServerAddr.prototype.toString = function () { | ||
return 'ServerAddr(serviceName="' + this.serviceName + '", host="' + this.host + '", port=' + this.port + ')'; | ||
return "ServerAddr(serviceName=\"".concat(this.serviceName, "\", host=\"").concat(this.host, "\", port=").concat(this.port, ")"); | ||
}; | ||
@@ -216,8 +250,8 @@ | ||
port = _ref3.port; | ||
this.host = host || InetAddress.getLocalAddress(); | ||
this.port = port || 0; | ||
} | ||
LocalAddr.prototype.toString = function () { | ||
return 'LocalAddr(host="' + this.host.toString() + '", port=' + this.port + ')'; | ||
return "LocalAddr(host=\"".concat(this.host.toString(), "\", port=").concat(this.port, ")"); | ||
}; | ||
@@ -229,3 +263,2 @@ | ||
port = _ref4.port; | ||
this.serviceName = serviceName; | ||
@@ -235,4 +268,5 @@ this.host = host; | ||
} | ||
MessageAddr.prototype.toString = function () { | ||
return 'MessageAddr(serviceName="' + this.serviceName + '", host="' + this.host + '", port=' + this.port + ')'; | ||
return "MessageAddr(serviceName=\"".concat(this.serviceName, "\", host=\"").concat(this.host, "\", port=").concat(this.port, ")"); | ||
}; | ||
@@ -244,4 +278,5 @@ | ||
} | ||
BinaryAnnotation.prototype.toString = function () { | ||
return 'BinaryAnnotation(' + this.key + '="' + this.value + '")'; | ||
return "BinaryAnnotation(".concat(this.key, "=\"").concat(this.value, "\")"); | ||
}; | ||
@@ -269,7 +304,5 @@ | ||
}; | ||
Object.keys(annotation).forEach(function (key) { | ||
annotation[key].prototype.annotationType = key; | ||
}); | ||
module.exports = annotation; |
@@ -1,7 +0,9 @@ | ||
'use strict'; | ||
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var _require = require('./time'), | ||
@@ -22,2 +24,3 @@ now = _require.now, | ||
} | ||
PartialSpan.prototype.finish = function finish() { | ||
@@ -27,6 +30,9 @@ if (this.endTimestamp) { | ||
} | ||
this.endTimestamp = now(this.startTimestamp, this.startTick); | ||
}; | ||
var BatchRecorder = function () { | ||
var BatchRecorder = | ||
/*#__PURE__*/ | ||
function () { | ||
function BatchRecorder(_ref) { | ||
@@ -37,3 +43,3 @@ var _this = this; | ||
_ref$timeout = _ref.timeout, | ||
timeout = _ref$timeout === undefined ? 60 * 1000000 : _ref$timeout; | ||
timeout = _ref$timeout === void 0 ? 60 * 1000000 : _ref$timeout; | ||
@@ -44,6 +50,5 @@ _classCallCheck(this, BatchRecorder); | ||
this.timeout = timeout; | ||
this.partialSpans = new Map(); | ||
this.partialSpans = new Map(); // read through the partials spans regularly | ||
// and collect any timed-out ones | ||
// read through the partials spans regularly | ||
// and collect any timed-out ones | ||
var timer = setInterval(function () { | ||
@@ -56,2 +61,3 @@ _this.partialSpans.forEach(function (span, id) { | ||
}, 1000); | ||
if (timer.unref) { | ||
@@ -64,17 +70,16 @@ // unref might not be available in browsers | ||
_createClass(BatchRecorder, [{ | ||
key: '_writeSpan', | ||
key: "_writeSpan", | ||
value: function _writeSpan(id) { | ||
var span = this.partialSpans.get(id); | ||
var span = this.partialSpans.get(id); // TODO(adriancole) refactor so this responsibility isn't in writeSpan | ||
// TODO(adriancole) refactor so this responsibility isn't in writeSpan | ||
if (span === undefined) { | ||
// Span not found. Could have been expired. | ||
return; | ||
} | ||
} // ready for garbage collection | ||
// ready for garbage collection | ||
this.partialSpans.delete(id); | ||
var spanToWrite = span.delegate; | ||
spanToWrite.setLocalEndpoint(span.localEndpoint); | ||
if (span.endTimestamp) { | ||
@@ -84,8 +89,10 @@ spanToWrite.setTimestamp(span.startTimestamp); | ||
} | ||
this.logger.logSpan(spanToWrite); | ||
} | ||
}, { | ||
key: '_updateSpanMap', | ||
key: "_updateSpanMap", | ||
value: function _updateSpanMap(id, updater) { | ||
var span = void 0; | ||
var span; | ||
if (this.partialSpans.has(id)) { | ||
@@ -96,3 +103,5 @@ span = this.partialSpans.get(id); | ||
} | ||
updater(span); | ||
if (span.endTimestamp) { | ||
@@ -105,3 +114,3 @@ this._writeSpan(id); | ||
}, { | ||
key: '_timedOut', | ||
key: "_timedOut", | ||
value: function _timedOut(span) { | ||
@@ -111,3 +120,3 @@ return span.startTimestamp + this.timeout < now(); | ||
}, { | ||
key: 'record', | ||
key: "record", | ||
value: function record(rec) { | ||
@@ -121,2 +130,3 @@ var id = rec.traceId; | ||
break; | ||
case 'ClientRecv': | ||
@@ -126,2 +136,3 @@ span.finish(); | ||
break; | ||
case 'ServerSend': | ||
@@ -131,2 +142,3 @@ span.finish(); | ||
break; | ||
case 'ServerRecv': | ||
@@ -137,5 +149,7 @@ // TODO: only set this to false when we know we in an existing trace | ||
break; | ||
case 'ProducerStart': | ||
span.delegate.setKind('PRODUCER'); | ||
break; | ||
case 'ProducerStop': | ||
@@ -145,5 +159,7 @@ span.finish(); | ||
break; | ||
case 'ConsumerStart': | ||
span.delegate.setKind('CONSUMER'); | ||
break; | ||
case 'ConsumerStop': | ||
@@ -153,2 +169,3 @@ span.finish(); | ||
break; | ||
case 'MessageAddr': | ||
@@ -161,20 +178,27 @@ span.delegate.setRemoteEndpoint(new Endpoint({ | ||
break; | ||
case 'LocalOperationStart': | ||
span.delegate.setName(rec.annotation.name); | ||
break; | ||
case 'LocalOperationStop': | ||
span.finish(); | ||
break; | ||
case 'Message': | ||
span.delegate.addAnnotation(rec.timestamp, rec.annotation.message); | ||
break; | ||
case 'Rpc': | ||
span.delegate.setName(rec.annotation.name); | ||
break; | ||
case 'ServiceName': | ||
span.localEndpoint.setServiceName(rec.annotation.serviceName); | ||
break; | ||
case 'BinaryAnnotation': | ||
span.delegate.putTag(rec.annotation.key, rec.annotation.value); | ||
break; | ||
case 'LocalAddr': | ||
@@ -184,2 +208,3 @@ span.localEndpoint.setIpv4(rec.annotation.host && rec.annotation.host.ipv4()); | ||
break; | ||
case 'ServerAddr': | ||
@@ -193,2 +218,3 @@ span.delegate.setKind('CLIENT'); | ||
break; | ||
default: | ||
@@ -200,3 +226,3 @@ break; | ||
}, { | ||
key: 'toString', | ||
key: "toString", | ||
value: function toString() { | ||
@@ -203,0 +229,0 @@ return 'BatchRecorder()'; |
@@ -1,8 +0,12 @@ | ||
'use strict'; | ||
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var ConsoleRecorder = function () { | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var ConsoleRecorder = | ||
/*#__PURE__*/ | ||
function () { | ||
/* eslint-disable no-console */ | ||
@@ -18,9 +22,9 @@ function ConsoleRecorder() { | ||
_createClass(ConsoleRecorder, [{ | ||
key: 'record', | ||
key: "record", | ||
value: function record(rec) { | ||
var id = rec.traceId; | ||
this.logger('Record at (spanId=' + id.spanId + ', parentId=' + id.parentId + ',' + (' traceId=' + id.traceId + '): ' + rec.annotation.toString())); | ||
this.logger("Record at (spanId=".concat(id.spanId, ", parentId=").concat(id.parentId, ",") + " traceId=".concat(id.traceId, "): ").concat(rec.annotation.toString())); | ||
} | ||
}, { | ||
key: 'toString', | ||
key: "toString", | ||
value: function toString() { | ||
@@ -27,0 +31,0 @@ return 'consoleTracer'; |
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
module.exports = function () { | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
module.exports = | ||
/*#__PURE__*/ | ||
function () { | ||
function ExplicitContext() { | ||
@@ -39,2 +43,3 @@ _classCallCheck(this, ExplicitContext); | ||
_this.setContext(ctx); | ||
return callable(); | ||
@@ -41,0 +46,0 @@ }); |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -3,0 +3,0 @@ module.exports = { |
@@ -1,45 +0,57 @@ | ||
'use strict'; | ||
"use strict"; | ||
var option = require('./option'); | ||
var _option = _interopRequireDefault(require("./option")); | ||
var Annotation = require('./annotation'); | ||
var Tracer = require('./tracer'); | ||
var createNoopTracer = require('./tracer/noop'); | ||
var randomTraceId = require('./tracer/randomTraceId'); | ||
var TraceId = require('./tracer/TraceId'); | ||
var sampler = require('./tracer/sampler'); | ||
var _annotation = _interopRequireDefault(require("./annotation")); | ||
var HttpHeaders = require('./httpHeaders'); | ||
var InetAddress = require('./InetAddress'); | ||
var _tracer = _interopRequireDefault(require("./tracer")); | ||
var BatchRecorder = require('./batch-recorder'); | ||
var ConsoleRecorder = require('./console-recorder'); | ||
var _noop = _interopRequireDefault(require("./tracer/noop")); | ||
var ExplicitContext = require('./explicit-context'); | ||
var _randomTraceId = _interopRequireDefault(require("./tracer/randomTraceId")); | ||
var Request = require('./request'); | ||
var Instrumentation = require('./instrumentation'); | ||
var _sampler = _interopRequireDefault(require("./tracer/sampler")); | ||
var model = require('./model'); | ||
var jsonEncoder = require('./jsonEncoder'); | ||
var parseRequestUrl = require('./parseUrl'); | ||
var _TraceId = _interopRequireDefault(require("./tracer/TraceId")); | ||
var _httpHeaders = _interopRequireDefault(require("./httpHeaders")); | ||
var _InetAddress = _interopRequireDefault(require("./InetAddress")); | ||
var _batchRecorder = _interopRequireDefault(require("./batch-recorder")); | ||
var _consoleRecorder = _interopRequireDefault(require("./console-recorder")); | ||
var _explicitContext = _interopRequireDefault(require("./explicit-context")); | ||
var _instrumentation = _interopRequireDefault(require("./instrumentation")); | ||
var _request = _interopRequireDefault(require("./request")); | ||
var _jsonEncoder = _interopRequireDefault(require("./jsonEncoder")); | ||
var _model = _interopRequireDefault(require("./model")); | ||
var _parseUrl = _interopRequireDefault(require("./parseUrl")); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
module.exports = { | ||
Tracer: Tracer, | ||
createNoopTracer: createNoopTracer, | ||
randomTraceId: randomTraceId, | ||
TraceId: TraceId, | ||
option: option, | ||
Annotation: Annotation, | ||
InetAddress: InetAddress, | ||
HttpHeaders: HttpHeaders, | ||
BatchRecorder: BatchRecorder, | ||
ConsoleRecorder: ConsoleRecorder, | ||
ExplicitContext: ExplicitContext, | ||
sampler: sampler, | ||
Request: Request, | ||
Instrumentation: Instrumentation, | ||
model: model, | ||
jsonEncoder: jsonEncoder, | ||
parseRequestUrl: parseRequestUrl | ||
Tracer: _tracer.default, | ||
createNoopTracer: _noop.default, | ||
randomTraceId: _randomTraceId.default, | ||
TraceId: _TraceId.default, | ||
option: _option.default, | ||
Annotation: _annotation.default, | ||
InetAddress: _InetAddress.default, | ||
HttpHeaders: _httpHeaders.default, | ||
BatchRecorder: _batchRecorder.default, | ||
ConsoleRecorder: _consoleRecorder.default, | ||
ExplicitContext: _explicitContext.default, | ||
sampler: _sampler.default, | ||
Request: _request.default, | ||
Instrumentation: _instrumentation.default, | ||
model: _model.default, | ||
jsonEncoder: _jsonEncoder.default, | ||
parseRequestUrl: _parseUrl.default | ||
}; |
@@ -1,10 +0,14 @@ | ||
'use strict'; | ||
"use strict"; | ||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; | ||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var InetAddress = function () { | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var InetAddress = | ||
/*#__PURE__*/ | ||
function () { | ||
function InetAddress(addr) { | ||
@@ -14,19 +18,19 @@ _classCallCheck(this, InetAddress); | ||
this.addr = addr; | ||
} | ||
} // returns undefined if this isn't an IPv4 string | ||
// returns undefined if this isn't an IPv4 string | ||
_createClass(InetAddress, [{ | ||
key: 'ipv4', | ||
key: "ipv4", | ||
value: function ipv4() { | ||
// coercing to int forces validation here | ||
var ipv4Int = this.toInt(); | ||
if (ipv4Int && ipv4Int !== 0) { | ||
return this.addr; | ||
} | ||
return undefined; | ||
} | ||
}, { | ||
key: 'toInt', | ||
key: "toInt", | ||
value: function toInt() { | ||
@@ -36,13 +40,12 @@ // e.g. 10.57.50.83 | ||
// 171520595 | ||
var parts = this.addr.split('.'); | ||
// The jshint tool always complains about using bitwise operators, | ||
var parts = this.addr.split('.'); // The jshint tool always complains about using bitwise operators, | ||
// but in this case it's actually intentional, so we disable the warning: | ||
// jshint bitwise: false | ||
return parts[0] << 24 | parts[1] << 16 | parts[2] << 8 | parts[3]; | ||
} | ||
}, { | ||
key: 'toString', | ||
key: "toString", | ||
value: function toString() { | ||
return 'InetAddress(' + this.addr + ')'; | ||
return "InetAddress(".concat(this.addr, ")"); | ||
} | ||
@@ -52,15 +55,15 @@ }]); | ||
return InetAddress; | ||
}(); | ||
}(); // In non-node environments we fallback to 127.0.0.1 | ||
// In non-node environments we fallback to 127.0.0.1 | ||
InetAddress.getLocalAddress = function getLocalAddress() { | ||
var isNode = (typeof process === "undefined" ? "undefined" : _typeof(process)) === 'object' && typeof process.on === 'function'; | ||
InetAddress.getLocalAddress = function getLocalAddress() { | ||
var isNode = (typeof process === 'undefined' ? 'undefined' : _typeof(process)) === 'object' && typeof process.on === 'function'; | ||
if (!isNode) { | ||
return new InetAddress('127.0.0.1'); | ||
} | ||
} // eslint-disable-next-line global-require | ||
// eslint-disable-next-line global-require | ||
var networkAddress = require('network-address'); | ||
var networkAddress = require('./network'); | ||
return new InetAddress(networkAddress.ipv4()); | ||
@@ -67,0 +70,0 @@ }; |
@@ -1,21 +0,27 @@ | ||
'use strict'; | ||
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var Annotation = require('../annotation'); | ||
var Request = require('../request'); | ||
var parseRequestUrl = require('../parseUrl'); | ||
function requiredArg(name) { | ||
throw new Error('HttpClientInstrumentation: Missing required argument ' + name + '.'); | ||
throw new Error("HttpClientInstrumentation: Missing required argument ".concat(name, ".")); | ||
} | ||
var HttpClientInstrumentation = function () { | ||
var HttpClientInstrumentation = | ||
/*#__PURE__*/ | ||
function () { | ||
function HttpClientInstrumentation(_ref) { | ||
var _ref$tracer = _ref.tracer, | ||
tracer = _ref$tracer === undefined ? requiredArg('tracer') : _ref$tracer, | ||
tracer = _ref$tracer === void 0 ? requiredArg('tracer') : _ref$tracer, | ||
_ref$serviceName = _ref.serviceName, | ||
serviceName = _ref$serviceName === undefined ? tracer.localEndpoint.serviceName : _ref$serviceName, | ||
serviceName = _ref$serviceName === void 0 ? tracer.localEndpoint.serviceName : _ref$serviceName, | ||
remoteServiceName = _ref.remoteServiceName; | ||
@@ -31,3 +37,3 @@ | ||
_createClass(HttpClientInstrumentation, [{ | ||
key: 'recordRequest', | ||
key: "recordRequest", | ||
value: function recordRequest(request, url, method) { | ||
@@ -44,2 +50,3 @@ this.tracer.setId(this.tracer.createChildId()); | ||
this.tracer.recordAnnotation(new Annotation.ClientSend()); | ||
if (this.remoteServiceName) { | ||
@@ -55,13 +62,15 @@ // TODO: can we get the host and port of the http connection? | ||
}, { | ||
key: 'recordResponse', | ||
key: "recordResponse", | ||
value: function recordResponse(traceId, statusCode) { | ||
this.tracer.setId(traceId); | ||
this.tracer.recordBinary('http.status_code', statusCode.toString()); | ||
if (statusCode < 200 || statusCode > 399) { | ||
this.tracer.recordBinary('error', statusCode.toString()); | ||
} | ||
this.tracer.recordAnnotation(new Annotation.ClientRecv()); | ||
} | ||
}, { | ||
key: 'recordError', | ||
key: "recordError", | ||
value: function recordError(traceId, error) { | ||
@@ -68,0 +77,0 @@ this.tracer.setId(traceId); |
@@ -1,11 +0,17 @@ | ||
'use strict'; | ||
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var Annotation = require('../annotation'); | ||
var Header = require('../httpHeaders'); | ||
var InetAddress = require('../InetAddress'); | ||
var TraceId = require('../tracer/TraceId'); | ||
var parseRequestUrl = require('../parseUrl'); | ||
@@ -34,14 +40,16 @@ | ||
function requiredArg(name) { | ||
throw new Error('HttpServerInstrumentation: Missing required argument ' + name + '.'); | ||
throw new Error("HttpServerInstrumentation: Missing required argument ".concat(name, ".")); | ||
} | ||
var HttpServerInstrumentation = function () { | ||
var HttpServerInstrumentation = | ||
/*#__PURE__*/ | ||
function () { | ||
function HttpServerInstrumentation(_ref) { | ||
var _ref$tracer = _ref.tracer, | ||
tracer = _ref$tracer === undefined ? requiredArg('tracer') : _ref$tracer, | ||
tracer = _ref$tracer === void 0 ? requiredArg('tracer') : _ref$tracer, | ||
_ref$serviceName = _ref.serviceName, | ||
serviceName = _ref$serviceName === undefined ? tracer.localEndpoint.serviceName : _ref$serviceName, | ||
serviceName = _ref$serviceName === void 0 ? tracer.localEndpoint.serviceName : _ref$serviceName, | ||
host = _ref.host, | ||
_ref$port = _ref.port, | ||
port = _ref$port === undefined ? requiredArg('port') : _ref$port; | ||
port = _ref$port === void 0 ? requiredArg('port') : _ref$port; | ||
@@ -57,7 +65,9 @@ _classCallCheck(this, HttpServerInstrumentation); | ||
_createClass(HttpServerInstrumentation, [{ | ||
key: '_createIdFromHeaders', | ||
key: "_createIdFromHeaders", | ||
value: function _createIdFromHeaders(readHeader) { | ||
var _this = this; | ||
if (containsRequiredHeaders(readHeader)) { | ||
var spanId = readHeader(Header.SpanId); | ||
return spanId.map(function (sid) { | ||
var parentId = spanId.map(function (sid) { | ||
var traceId = readHeader(Header.TraceId); | ||
@@ -75,2 +85,7 @@ var parentSpanId = readHeader(Header.ParentSpanId); | ||
}); | ||
return !this.tracer.supportsJoin ? parentId.map(function (id) { | ||
return _this.tracer.letId(id, function () { | ||
return _this.tracer.createChildId(); | ||
}); | ||
}) : parentId; | ||
} else { | ||
@@ -87,9 +102,10 @@ if (readHeader(Header.Flags) !== None || readHeader(Header.Sampled) !== None) { | ||
}, { | ||
key: 'recordRequest', | ||
key: "recordRequest", | ||
value: function recordRequest(method, requestUrl, readHeader) { | ||
var _this = this; | ||
var _this2 = this; | ||
this._createIdFromHeaders(readHeader).ifPresent(function (id) { | ||
return _this.tracer.setId(id); | ||
return _this2.tracer.setId(id); | ||
}); | ||
var id = this.tracer.id; | ||
@@ -104,11 +120,14 @@ | ||
this.tracer.recordAnnotation(new Annotation.ServerRecv()); | ||
this.tracer.recordAnnotation(new Annotation.LocalAddr({ host: this.host, port: this.port })); | ||
this.tracer.recordAnnotation(new Annotation.LocalAddr({ | ||
host: this.host, | ||
port: this.port | ||
})); | ||
return id; | ||
} | ||
}, { | ||
key: 'recordResponse', | ||
key: "recordResponse", | ||
value: function recordResponse(id, statusCode, error) { | ||
this.tracer.setId(id); | ||
this.tracer.recordBinary('http.status_code', statusCode.toString()); | ||
if (error) { | ||
@@ -119,2 +138,3 @@ this.tracer.recordBinary('error', error.toString()); | ||
} | ||
this.tracer.recordAnnotation(new Annotation.ServerSend()); | ||
@@ -121,0 +141,0 @@ } |
@@ -1,4 +0,5 @@ | ||
'use strict'; | ||
"use strict"; | ||
var HttpServer = require('./httpServer'); | ||
var HttpClient = require('./httpClient'); | ||
@@ -5,0 +6,0 @@ |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -7,11 +7,16 @@ function toV1Endpoint(endpoint) { | ||
} | ||
var res = { | ||
serviceName: endpoint.serviceName || '' // undefined is not allowed in v1 | ||
}; | ||
if (endpoint.ipv4) { | ||
res.ipv4 = endpoint.ipv4; | ||
} | ||
if (endpoint.port) { | ||
res.port = endpoint.port; | ||
} | ||
return res; | ||
@@ -32,2 +37,3 @@ } | ||
}; | ||
if (span.parentId) { | ||
@@ -37,6 +43,7 @@ // instead of writing "parentId": NULL | ||
} | ||
res.id = span.id; | ||
res.name = span.name || ''; // undefined is not allowed in v1 | ||
// Log timestamp and duration if this tracer started and completed this span. | ||
// Log timestamp and duration if this tracer started and completed this span. | ||
if (!span.shared) { | ||
@@ -48,6 +55,6 @@ res.timestamp = span.timestamp; | ||
var jsonEndpoint = toV1Endpoint(span.localEndpoint); | ||
var beginAnnotation; | ||
var endAnnotation; | ||
var addressKey; | ||
var beginAnnotation = void 0; | ||
var endAnnotation = void 0; | ||
var addressKey = void 0; | ||
switch (span.kind) { | ||
@@ -59,2 +66,3 @@ case 'CLIENT': | ||
break; | ||
case 'SERVER': | ||
@@ -65,2 +73,3 @@ beginAnnotation = span.timestamp ? 'sr' : undefined; | ||
break; | ||
case 'PRODUCER': | ||
@@ -71,2 +80,3 @@ beginAnnotation = span.timestamp ? 'ms' : undefined; | ||
break; | ||
case 'CONSUMER': | ||
@@ -79,4 +89,6 @@ if (span.timestamp && span.duration) { | ||
} | ||
addressKey = 'ma'; | ||
break; | ||
default: | ||
@@ -98,2 +110,3 @@ } | ||
}); | ||
if (span.duration) { | ||
@@ -109,2 +122,3 @@ res.annotations.push({ | ||
var keys = Object.keys(span.tags); | ||
if (keys.length > 0 || span.remoteEndpoint) { | ||
@@ -134,2 +148,3 @@ // don't write empty array | ||
} | ||
return JSON.stringify(res); | ||
@@ -142,36 +157,49 @@ } | ||
}; | ||
if (span.parentId) { | ||
copy.parentId = span.parentId; | ||
} | ||
copy.id = span.id; | ||
if (span.name) { | ||
copy.name = span.name; | ||
} | ||
if (span.kind) { | ||
copy.kind = span.kind; | ||
} | ||
if (span.timestamp) { | ||
copy.timestamp = span.timestamp; | ||
} | ||
if (span.duration) { | ||
copy.duration = span.duration; | ||
} | ||
if (span.localEndpoint) { | ||
copy.localEndpoint = span.localEndpoint; | ||
} | ||
if (span.remoteEndpoint) { | ||
copy.remoteEndpoint = span.remoteEndpoint; | ||
} | ||
if (span.annotations.length > 0) { | ||
copy.annotations = span.annotations; | ||
} | ||
if (Object.keys(span.tags).length > 0) { | ||
copy.tags = span.tags; | ||
} | ||
if (span.debug) { | ||
copy.debug = true; | ||
} | ||
if (span.shared) { | ||
copy.shared = true; | ||
} | ||
return JSON.stringify(copy); | ||
@@ -178,0 +206,0 @@ } |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -7,3 +7,2 @@ function Endpoint(_ref) { | ||
port = _ref.port; | ||
this.setServiceName(serviceName); | ||
@@ -13,2 +12,3 @@ this.setIpv4(ipv4); | ||
} | ||
Endpoint.prototype.setServiceName = function setServiceName(serviceName) { | ||
@@ -18,8 +18,11 @@ // In zipkin, names are lowercase. This eagerly converts to alert users early. | ||
}; | ||
Endpoint.prototype.setIpv4 = function setIpv4(ipv4) { | ||
this.ipv4 = ipv4; | ||
}; | ||
Endpoint.prototype.setPort = function setPort(port) { | ||
this.port = port || undefined; | ||
}; | ||
Endpoint.prototype.isEmpty = function isEmpty() { | ||
@@ -33,4 +36,5 @@ return this.serviceName === undefined && this.ipv4 === undefined && this.port === undefined; | ||
} | ||
Annotation.prototype.toString = function toString() { | ||
return 'Annotation(value="' + this.value + '")'; | ||
return "Annotation(value=\"".concat(this.value, "\")"); | ||
}; | ||
@@ -42,12 +46,18 @@ | ||
this.traceId = traceId.traceId; | ||
traceId._parentId.ifPresent(function (id) { | ||
_this.parentId = id; | ||
}); | ||
this.id = traceId.spanId; | ||
this.name = undefined; // no default | ||
this.kind = undefined; // no default | ||
this.timestamp = undefined; | ||
this.duration = undefined; | ||
this.localEndpoint = undefined; // no default | ||
this.remoteEndpoint = undefined; // no default | ||
this.annotations = []; | ||
@@ -63,8 +73,11 @@ this.tags = {}; | ||
}; | ||
Span.prototype.setKind = function setKind(kind) { | ||
this.kind = kind; | ||
}; | ||
Span.prototype.setTimestamp = function setTimestamp(timestamp) { | ||
this.timestamp = timestamp; | ||
}; | ||
Span.prototype.setDuration = function setDuration(duration) { | ||
@@ -76,2 +89,3 @@ // Due to rounding errors, a fraction ends up as zero, so check undefined | ||
}; | ||
Span.prototype.setLocalEndpoint = function setLocalEndpoint(ep) { | ||
@@ -84,2 +98,3 @@ if (ep && !ep.isEmpty()) { | ||
}; | ||
Span.prototype.setRemoteEndpoint = function setRemoteEndpoint(ep) { | ||
@@ -92,14 +107,19 @@ if (ep && !ep.isEmpty()) { | ||
}; | ||
Span.prototype.addAnnotation = function addAnnotation(timestamp, value) { | ||
this.annotations.push(new Annotation(timestamp, value)); | ||
}; | ||
Span.prototype.putTag = function putTag(key, value) { | ||
this.tags[key] = value.toString(); | ||
}; | ||
Span.prototype.setDebug = function setDebug(debug) { | ||
this.debug = debug; | ||
}; | ||
Span.prototype.setShared = function setShared(shared) { | ||
this.shared = shared; | ||
}; | ||
Span.prototype.toString = function toString() { | ||
@@ -109,3 +129,3 @@ var annotations = this.annotations.map(function (a) { | ||
}).join(', '); | ||
return 'Span(id=' + this.traceId + ', annotations=[' + annotations + '])'; | ||
return "Span(id=".concat(this.traceId, ", annotations=[").concat(annotations, "])"); | ||
}; | ||
@@ -112,0 +132,0 @@ |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -15,2 +15,3 @@ var os = require('os'); | ||
} | ||
return family === 'IPv4' ? '127.0.0.1' : '::1'; | ||
@@ -22,2 +23,3 @@ } | ||
/*eslint-disable */ | ||
for (var i in interfaces) { | ||
@@ -27,2 +29,3 @@ /*eslint-enable */ | ||
} | ||
return ifaces; | ||
@@ -45,3 +48,2 @@ } | ||
ipv4.ipv6 = ipv6; | ||
module.exports = ipv4; |
@@ -1,7 +0,9 @@ | ||
'use strict'; | ||
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var None = { | ||
@@ -11,29 +13,28 @@ get type() { | ||
}, | ||
get present() { | ||
return false; | ||
}, | ||
map: function map() { | ||
return None; | ||
return this; | ||
}, | ||
ifPresent: function ifPresent() {}, | ||
flatMap: function flatMap() { | ||
return None; | ||
return this; | ||
}, | ||
getOrElse: function getOrElse(f) { | ||
if (f instanceof Function) { | ||
return f(); | ||
} else { | ||
return f; | ||
} | ||
return f instanceof Function ? f() : f; | ||
}, | ||
equals: function equals(other) { | ||
return other.type === 'None'; | ||
return other === this; | ||
}, | ||
toString: function toString() { | ||
return 'None'; | ||
}, | ||
get present() { | ||
return false; | ||
} | ||
}; | ||
var Some = function () { | ||
var Some = | ||
/*#__PURE__*/ | ||
function () { | ||
function Some(value) { | ||
@@ -46,3 +47,3 @@ _classCallCheck(this, Some); | ||
_createClass(Some, [{ | ||
key: 'map', | ||
key: "map", | ||
value: function map(f) { | ||
@@ -52,13 +53,13 @@ return new Some(f(this.value)); | ||
}, { | ||
key: 'ifPresent', | ||
key: "ifPresent", | ||
value: function ifPresent(f) { | ||
return this.map(f); | ||
f(this.value); | ||
} | ||
}, { | ||
key: 'flatMap', | ||
key: "flatMap", | ||
value: function flatMap(f) { | ||
return this.map(f).getOrElse(None); | ||
return f(this.value); | ||
} | ||
}, { | ||
key: 'getOrElse', | ||
key: "getOrElse", | ||
value: function getOrElse() { | ||
@@ -68,3 +69,3 @@ return this.value; | ||
}, { | ||
key: 'equals', | ||
key: "equals", | ||
value: function equals(other) { | ||
@@ -74,15 +75,15 @@ return other instanceof Some && other.value === this.value; | ||
}, { | ||
key: 'toString', | ||
key: "toString", | ||
value: function toString() { | ||
return 'Some(' + this.value.toString() + ')'; | ||
return "Some(".concat(this.value, ")"); | ||
} | ||
}, { | ||
key: 'present', | ||
key: "type", | ||
get: function get() { | ||
return true; | ||
return 'Some'; | ||
} | ||
}, { | ||
key: 'type', | ||
key: "present", | ||
get: function get() { | ||
return 'Some'; | ||
return true; | ||
} | ||
@@ -92,9 +93,7 @@ }]); | ||
return Some; | ||
}(); | ||
}(); // Used to validate input arguments | ||
// Used to validate input arguments | ||
function isOptional(data) { | ||
return data != null && (data instanceof Some || data === None || data.type === 'Some' || data.type === 'None'); | ||
return data instanceof Some || None.equals(data); | ||
} | ||
@@ -106,8 +105,9 @@ | ||
} | ||
if (isOptional(data)) { | ||
if (isOptional(data.value)) { | ||
throw new Error('Error: data (' + data.value.toString() + ') is wrapped in Option twice'); | ||
throw new Error("Error: data (".concat(data.value, ") is wrapped in Option twice")); | ||
} | ||
} else { | ||
throw new Error('Error: data (' + data + ') is not an Option!'); | ||
throw new Error("Error: data (".concat(data, ") is not an Option!")); | ||
} | ||
@@ -117,4 +117,4 @@ } | ||
function verifyIsNotOptional(data) { | ||
if (data != null && isOptional(data)) { | ||
throw new Error('Error: data (' + data + ') is an Option!'); | ||
if (isOptional(data)) { | ||
throw new Error("Error: data (".concat(data, ") is an Option!")); | ||
} | ||
@@ -124,7 +124,3 @@ } | ||
function fromNullable(nullable) { | ||
if (nullable != null) { | ||
return new Some(nullable); | ||
} else { | ||
return None; | ||
} | ||
return nullable == null ? None : new Some(nullable); | ||
} | ||
@@ -131,0 +127,0 @@ |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -7,3 +7,2 @@ var url = require('url'); | ||
var parsed = url.parse(requestUrl); | ||
return { | ||
@@ -10,0 +9,0 @@ host: parsed.hostname, |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -13,2 +13,3 @@ var HttpHeaders = require('./httpHeaders'); | ||
}); | ||
traceId.sampled.ifPresent(function (sampled) { | ||
@@ -18,2 +19,6 @@ headers[HttpHeaders.Sampled] = sampled ? '1' : '0'; | ||
if (traceId.isDebug()) { | ||
headers[HttpHeaders.Flags] = '1'; | ||
} | ||
return headers; | ||
@@ -24,3 +29,5 @@ } | ||
var headers = appendZipkinHeaders(req, traceId); | ||
return Object.assign({}, req, { headers: headers }); | ||
return Object.assign({}, req, { | ||
headers: headers | ||
}); | ||
} | ||
@@ -27,0 +34,0 @@ |
@@ -1,6 +0,5 @@ | ||
'use strict'; | ||
"use strict"; | ||
var hrTimeSupport = typeof process !== 'undefined' && process.hrtime; | ||
var hrTimeSupport = typeof process !== 'undefined' && process.hrtime; // since hrtime isn't available, we can ignore the input parameters | ||
// since hrtime isn't available, we can ignore the input parameters | ||
function nowLegacy() { | ||
@@ -18,7 +17,7 @@ return Date.now() * 1000; | ||
} | ||
} | ||
// Returns the current time in epoch microseconds | ||
} // Returns the current time in epoch microseconds | ||
// if startTimestamp and startTick are present, process.hrtime is used | ||
// See https://nodejs.org/api/process.html#process_process_hrtime_time | ||
module.exports.now = hrTimeSupport ? nowHrTime : nowLegacy; | ||
@@ -25,0 +24,0 @@ module.exports.hrtime = hrTimeSupport ? function () { |
@@ -1,7 +0,9 @@ | ||
'use strict'; | ||
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var _require = require('../option'), | ||
@@ -17,4 +19,7 @@ None = _require.None, | ||
var Annotation = require('../annotation'); | ||
var Record = require('./record'); | ||
var TraceId = require('./TraceId'); | ||
var randomTraceId = require('./randomTraceId'); | ||
@@ -32,23 +37,33 @@ | ||
function requiredArg(name) { | ||
throw new Error('Tracer: Missing required argument ' + name + '.'); | ||
throw new Error("Tracer: Missing required argument ".concat(name, ".")); | ||
} | ||
var Tracer = function () { | ||
var Tracer = | ||
/*#__PURE__*/ | ||
function () { | ||
function Tracer(_ref) { | ||
var _ref$ctxImpl = _ref.ctxImpl, | ||
ctxImpl = _ref$ctxImpl === undefined ? requiredArg('ctxImpl') : _ref$ctxImpl, | ||
ctxImpl = _ref$ctxImpl === void 0 ? requiredArg('ctxImpl') : _ref$ctxImpl, | ||
_ref$recorder = _ref.recorder, | ||
recorder = _ref$recorder === undefined ? requiredArg('recorder') : _ref$recorder, | ||
recorder = _ref$recorder === void 0 ? requiredArg('recorder') : _ref$recorder, | ||
_ref$sampler = _ref.sampler, | ||
sampler = _ref$sampler === undefined ? new Sampler(alwaysSample) : _ref$sampler, | ||
sampler = _ref$sampler === void 0 ? new Sampler(alwaysSample) : _ref$sampler, | ||
_ref$traceId128Bit = _ref.traceId128Bit, | ||
traceId128Bit = _ref$traceId128Bit === undefined ? false : _ref$traceId128Bit, | ||
traceId128Bit = _ref$traceId128Bit === void 0 ? false : _ref$traceId128Bit, | ||
_ref$supportsJoin = _ref.supportsJoin, | ||
supportsJoin = _ref$supportsJoin === void 0 ? true : _ref$supportsJoin, | ||
localServiceName = _ref.localServiceName, | ||
localEndpoint = _ref.localEndpoint; | ||
localEndpoint = _ref.localEndpoint, | ||
_ref$log = _ref.log, | ||
log = _ref$log === void 0 ? console : _ref$log, | ||
defaultTags = _ref.defaultTags; | ||
_classCallCheck(this, Tracer); | ||
this.log = log; | ||
this.recorder = recorder; | ||
this.sampler = sampler; | ||
this.traceId128Bit = traceId128Bit; | ||
this.supportsJoin = supportsJoin; | ||
if (localEndpoint) { | ||
@@ -61,2 +76,3 @@ this._localEndpoint = localEndpoint; | ||
} | ||
this._ctxImpl = ctxImpl; | ||
@@ -66,6 +82,10 @@ this._defaultTraceId = this.createRootId(); | ||
this._startTick = hrtime(); | ||
if (defaultTags) { | ||
this.setTags(defaultTags); | ||
} | ||
} | ||
_createClass(Tracer, [{ | ||
key: 'scoped', | ||
key: "scoped", | ||
value: function scoped(callback) { | ||
@@ -75,3 +95,3 @@ return this._ctxImpl.scoped(callback); | ||
}, { | ||
key: 'letId', | ||
key: "letId", | ||
value: function letId(id, callback) { | ||
@@ -81,7 +101,6 @@ return this._ctxImpl.letContext(id, callback); | ||
}, { | ||
key: 'createRootId', | ||
key: "createRootId", | ||
value: function createRootId() { | ||
var isSampled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : None; | ||
var isDebug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; | ||
var rootSpanId = randomTraceId(); | ||
@@ -104,6 +123,5 @@ var traceId = this.traceId128Bit ? new Some(randomTraceId() + rootSpanId) : None; | ||
}, { | ||
key: 'createChildId', | ||
key: "createChildId", | ||
value: function createChildId() { | ||
var currentId = fromNullable(this._ctxImpl.getContext()); | ||
var childId = new TraceId({ | ||
@@ -124,13 +142,13 @@ traceId: currentId.map(function (id) { | ||
}); | ||
if (childId.sampled.present === false) { | ||
childId._sampled = this.sampler.shouldSample(childId); | ||
} | ||
return childId; | ||
} | ||
// creates a span, timing the given callable, adding any error as a tag | ||
} // creates a span, timing the given callable, adding any error as a tag | ||
// if the callable returns a promise, a span stops after the promise resolves | ||
}, { | ||
key: 'local', | ||
key: "local", | ||
value: function local(operationName, callable) { | ||
@@ -142,9 +160,14 @@ var _this = this; | ||
} | ||
return this.scoped(function () { | ||
var traceId = _this.createChildId(); | ||
_this.setId(traceId); | ||
_this.recordServiceName(_this._localEndpoint.serviceName); | ||
_this.recordAnnotation(new Annotation.LocalOperationStart(operationName)); | ||
var result = void 0; | ||
var result; | ||
try { | ||
@@ -154,9 +177,12 @@ result = callable(); | ||
_this.recordBinary('error', err.message ? err.message : err.toString()); | ||
_this.recordAnnotation(new Annotation.LocalOperationStop()); | ||
throw err; | ||
} | ||
} // Finish the span on a synchronous success | ||
// Finish the span on a synchronous success | ||
if (!isPromise(result)) { | ||
_this.recordAnnotation(new Annotation.LocalOperationStop()); | ||
return result; | ||
@@ -167,5 +193,5 @@ } | ||
return result; // no need to stop as it was never started | ||
} | ||
} // At this point we know we are sampled. Explicitly record against the ID | ||
// At this point we know we are sampled. Explicitly record against the ID | ||
var explicitRecord = function explicitRecord(annotation) { | ||
@@ -177,5 +203,5 @@ return _this.recorder.record(new Record({ | ||
})); | ||
}; | ||
}; // Ensure the span representing the promise completes | ||
// Ensure the span representing the promise completes | ||
return result.then(function (output) { | ||
@@ -193,3 +219,3 @@ explicitRecord(new Annotation.LocalOperationStop()); | ||
}, { | ||
key: 'setId', | ||
key: "setId", | ||
value: function setId(traceId) { | ||
@@ -199,6 +225,7 @@ this._ctxImpl.setContext(traceId); | ||
}, { | ||
key: 'recordAnnotation', | ||
key: "recordAnnotation", | ||
value: function recordAnnotation(annotation) { | ||
var _this2 = this; | ||
var timestamp = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : now(this._startTimestamp, this._startTick); | ||
this.id.sampled.ifPresent(function (sampled) { | ||
@@ -209,3 +236,3 @@ if (!sampled) return; | ||
traceId: _this2.id, | ||
timestamp: now(_this2._startTimestamp, _this2._startTick), | ||
timestamp: timestamp, | ||
annotation: annotation | ||
@@ -216,3 +243,3 @@ })); | ||
}, { | ||
key: 'recordMessage', | ||
key: "recordMessage", | ||
value: function recordMessage(message) { | ||
@@ -222,3 +249,3 @@ this.recordAnnotation(new Annotation.Message(message)); | ||
}, { | ||
key: 'recordServiceName', | ||
key: "recordServiceName", | ||
value: function recordServiceName(serviceName) { | ||
@@ -228,3 +255,3 @@ this.recordAnnotation(new Annotation.ServiceName(serviceName)); | ||
}, { | ||
key: 'recordRpc', | ||
key: "recordRpc", | ||
value: function recordRpc(name) { | ||
@@ -234,3 +261,3 @@ this.recordAnnotation(new Annotation.Rpc(name)); | ||
}, { | ||
key: 'recordClientAddr', | ||
key: "recordClientAddr", | ||
value: function recordClientAddr(ia) { | ||
@@ -240,3 +267,3 @@ this.recordAnnotation(new Annotation.ClientAddr(ia)); | ||
}, { | ||
key: 'recordServerAddr', | ||
key: "recordServerAddr", | ||
value: function recordServerAddr(ia) { | ||
@@ -246,3 +273,3 @@ this.recordAnnotation(new Annotation.ServerAddr(ia)); | ||
}, { | ||
key: 'recordLocalAddr', | ||
key: "recordLocalAddr", | ||
value: function recordLocalAddr(ia) { | ||
@@ -252,3 +279,3 @@ this.recordAnnotation(new Annotation.LocalAddr(ia)); | ||
}, { | ||
key: 'recordBinary', | ||
key: "recordBinary", | ||
value: function recordBinary(key, value) { | ||
@@ -258,9 +285,20 @@ this.recordAnnotation(new Annotation.BinaryAnnotation(key, value)); | ||
}, { | ||
key: 'writeIdToConsole', | ||
key: "writeIdToConsole", | ||
value: function writeIdToConsole(message) { | ||
/* eslint-disable no-console */ | ||
console.log(message + ': ' + this.id.toString()); | ||
this.log.info("".concat(message, ": ").concat(this.id.toString())); | ||
} | ||
}, { | ||
key: 'id', | ||
key: "setTags", | ||
value: function setTags() { | ||
var tags = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
// eslint-disable-next-line no-restricted-syntax | ||
for (var tag in tags) { | ||
if (tags.hasOwnProperty(tag)) { | ||
this.recordBinary(tag, tags[tag]); | ||
} | ||
} | ||
} | ||
}, { | ||
key: "id", | ||
get: function get() { | ||
@@ -270,3 +308,3 @@ return this._ctxImpl.getContext() || this._defaultTraceId; | ||
}, { | ||
key: 'localEndpoint', | ||
key: "localEndpoint", | ||
get: function get() { | ||
@@ -273,0 +311,0 @@ return this._localEndpoint; |
@@ -1,4 +0,5 @@ | ||
'use strict'; | ||
"use strict"; | ||
var Tracer = require('./'); | ||
var ExplicitContext = require('../explicit-context'); | ||
@@ -11,3 +12,6 @@ | ||
var ctxImpl = new ExplicitContext(); | ||
return new Tracer({ recorder: recorder, ctxImpl: ctxImpl }); | ||
return new Tracer({ | ||
recorder: recorder, | ||
ctxImpl: ctxImpl | ||
}); | ||
}; |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
@@ -7,2 +7,3 @@ // === Generate a random 64-bit number in fixed-length hex format | ||
var n = ''; | ||
for (var i = 0; i < 16; i++) { | ||
@@ -12,2 +13,3 @@ var rand = Math.floor(Math.random() * 16); | ||
} | ||
return n; | ||
@@ -14,0 +16,0 @@ } |
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var Record = function () { | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var Record = | ||
/*#__PURE__*/ | ||
function () { | ||
function Record(_ref) { | ||
@@ -23,3 +27,3 @@ var traceId = _ref.traceId, | ||
value: function toString() { | ||
return "Record(traceId=" + this.traceId.toString() + ", annotation=" + this.annotation.toString() + ")"; | ||
return "Record(traceId=".concat(this.traceId.toString(), ", annotation=").concat(this.annotation.toString(), ")"); | ||
} | ||
@@ -26,0 +30,0 @@ }]); |
@@ -1,14 +0,23 @@ | ||
'use strict'; | ||
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | ||
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } | ||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | ||
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } | ||
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } | ||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } | ||
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var _require = require('../option'), | ||
Some = _require.Some; | ||
// Determines whether or not a traceId should be sampled. | ||
Some = _require.Some; // Determines whether or not a traceId should be sampled. | ||
// If no sample decision is already made (by a debug flag, or | ||
@@ -20,3 +29,5 @@ // the "sampled" property is set), it will use evaluator, | ||
var Sampler = function () { | ||
var Sampler = | ||
/*#__PURE__*/ | ||
function () { | ||
function Sampler(evaluator) { | ||
@@ -29,3 +40,3 @@ _classCallCheck(this, Sampler); | ||
_createClass(Sampler, [{ | ||
key: 'shouldSample', | ||
key: "shouldSample", | ||
value: function shouldSample(traceId) { | ||
@@ -40,5 +51,5 @@ var _this = this; | ||
}, { | ||
key: 'toString', | ||
key: "toString", | ||
value: function toString() { | ||
return 'Sampler(' + this.evaluator.toString() + ')'; | ||
return "Sampler(".concat(this.evaluator.toString(), ")"); | ||
} | ||
@@ -54,2 +65,3 @@ }]); | ||
} | ||
neverSample.toString = function () { | ||
@@ -63,2 +75,3 @@ return 'never sample'; | ||
} | ||
alwaysSample.toString = function () { | ||
@@ -76,2 +89,3 @@ return 'always sample'; | ||
var limit = parseInt(1 / sampleRate); | ||
var counting = function counting(traceId) { | ||
@@ -84,5 +98,7 @@ // eslint-disable-line no-unused-vars | ||
}; | ||
counting.toString = function () { | ||
return 'countingSampler: sampleRate=' + sampleRate; | ||
return "countingSampler: sampleRate=".concat(sampleRate); | ||
}; | ||
return counting; | ||
@@ -92,3 +108,5 @@ } | ||
var CountingSampler = function (_Sampler) { | ||
var CountingSampler = | ||
/*#__PURE__*/ | ||
function (_Sampler) { | ||
_inherits(CountingSampler, _Sampler); | ||
@@ -101,3 +119,3 @@ | ||
return _possibleConstructorReturn(this, (CountingSampler.__proto__ || Object.getPrototypeOf(CountingSampler)).call(this, makeCountingEvaluator(sampleRate < 1 ? sampleRate : 1))); | ||
return _possibleConstructorReturn(this, _getPrototypeOf(CountingSampler).call(this, makeCountingEvaluator(sampleRate < 1 ? sampleRate : 1))); | ||
} | ||
@@ -108,2 +126,7 @@ | ||
module.exports = { Sampler: Sampler, CountingSampler: CountingSampler, neverSample: neverSample, alwaysSample: alwaysSample }; | ||
module.exports = { | ||
Sampler: Sampler, | ||
CountingSampler: CountingSampler, | ||
neverSample: neverSample, | ||
alwaysSample: alwaysSample | ||
}; |
@@ -1,7 +0,9 @@ | ||
'use strict'; | ||
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
var _require = require('../option'), | ||
@@ -13,3 +15,5 @@ Some = _require.Some, | ||
var TraceId = function () { | ||
var TraceId = | ||
/*#__PURE__*/ | ||
function () { | ||
function TraceId(params) { | ||
@@ -19,11 +23,10 @@ _classCallCheck(this, TraceId); | ||
var _params$traceId = params.traceId, | ||
traceId = _params$traceId === undefined ? None : _params$traceId, | ||
traceId = _params$traceId === void 0 ? None : _params$traceId, | ||
_params$parentId = params.parentId, | ||
parentId = _params$parentId === undefined ? None : _params$parentId, | ||
parentId = _params$parentId === void 0 ? None : _params$parentId, | ||
spanId = params.spanId, | ||
_params$sampled = params.sampled, | ||
sampled = _params$sampled === undefined ? None : _params$sampled, | ||
sampled = _params$sampled === void 0 ? None : _params$sampled, | ||
_params$flags = params.flags, | ||
flags = _params$flags === undefined ? 0 : _params$flags; | ||
flags = _params$flags === void 0 ? 0 : _params$flags; | ||
verifyIsOptional(traceId); | ||
@@ -41,3 +44,3 @@ verifyIsOptional(parentId); | ||
_createClass(TraceId, [{ | ||
key: 'isDebug', | ||
key: "isDebug", | ||
value: function isDebug() { | ||
@@ -50,8 +53,8 @@ // The jshint tool always complains about using bitwise operators, | ||
}, { | ||
key: 'toString', | ||
key: "toString", | ||
value: function toString() { | ||
return 'TraceId(spanId=' + this.spanId.toString() + (', parentId=' + this.parentId.toString()) + (', traceId=' + this.traceId.toString() + ')'); | ||
return "TraceId(spanId=".concat(this.spanId.toString()) + ", parentId=".concat(this.parentId.toString()) + ", traceId=".concat(this.traceId.toString(), ")"); | ||
} | ||
}, { | ||
key: 'spanId', | ||
key: "spanId", | ||
get: function get() { | ||
@@ -61,3 +64,3 @@ return this._spanId; | ||
}, { | ||
key: 'parentId', | ||
key: "parentId", | ||
get: function get() { | ||
@@ -67,3 +70,3 @@ return this._parentId.getOrElse(this.spanId); | ||
}, { | ||
key: 'traceId', | ||
key: "traceId", | ||
get: function get() { | ||
@@ -73,3 +76,3 @@ return this._traceId.getOrElse(this.parentId); | ||
}, { | ||
key: 'sampled', | ||
key: "sampled", | ||
get: function get() { | ||
@@ -79,3 +82,3 @@ return this.isDebug() ? new Some(true) : this._sampled; | ||
}, { | ||
key: 'flags', | ||
key: "flags", | ||
get: function get() { | ||
@@ -82,0 +85,0 @@ return this._flags; |
{ | ||
"name": "zipkin", | ||
"version": "0.14.3", | ||
"version": "0.15.0", | ||
"description": "The core tracer for zipkin.js", | ||
@@ -8,4 +8,4 @@ "main": "lib/index.js", | ||
"scripts": { | ||
"build": "babel src -d lib", | ||
"test": "tsc index.d.ts && mocha --require ../../test/helper.js", | ||
"build": "babel src -d lib --extensions \".ts\" --extensions \".js\"", | ||
"test": "tsc index.d.ts && mocha --require ../../test/helper.js --require @babel/register", | ||
"prepublish": "npm run build" | ||
@@ -18,11 +18,13 @@ }, | ||
"base64-js": "^1.1.2", | ||
"is-promise": "^2.1.0", | ||
"network-address": "^1.1.0" | ||
"is-promise": "^2.1.0" | ||
}, | ||
"devDependencies": { | ||
"babel-cli": "^6.23.0", | ||
"@babel/cli": "7.1.5", | ||
"@babel/core": "7.1.5", | ||
"@babel/preset-typescript": "7.1.0", | ||
"bluebird": "^3.5.1", | ||
"mocha": "^3.2.0", | ||
"mocha": "^5.2.0", | ||
"typescript": "^2.4.2" | ||
} | ||
}, | ||
"gitHead": "efd22b807a6d6056a319d9468231480e7a58a402" | ||
} |
@@ -41,3 +41,3 @@ class InetAddress { | ||
// eslint-disable-next-line global-require | ||
const networkAddress = require('network-address'); | ||
const networkAddress = require('./network'); | ||
return new InetAddress(networkAddress.ipv4()); | ||
@@ -44,0 +44,0 @@ }; |
@@ -28,2 +28,3 @@ const Annotation = require('../annotation'); | ||
this.tracer.recordBinary('http.path', path); | ||
this.tracer.recordAnnotation(new Annotation.ClientSend()); | ||
@@ -30,0 +31,0 @@ if (this.remoteServiceName) { |
@@ -33,3 +33,3 @@ const Annotation = require('../annotation'); | ||
host, | ||
port = requiredArg('port'), | ||
port = requiredArg('port') | ||
}) { | ||
@@ -45,3 +45,3 @@ this.tracer = tracer; | ||
const spanId = readHeader(Header.SpanId); | ||
return spanId.map(sid => { | ||
const parentId = spanId.map(sid => { | ||
const traceId = readHeader(Header.TraceId); | ||
@@ -59,2 +59,9 @@ const parentSpanId = readHeader(Header.ParentSpanId); | ||
}); | ||
return !this.tracer.supportsJoin | ||
? parentId.map(id => | ||
this.tracer.letId(id, () => | ||
this.tracer.createChildId() | ||
) | ||
) | ||
: parentId; | ||
} else { | ||
@@ -80,2 +87,3 @@ if (readHeader(Header.Flags) !== None || readHeader(Header.Sampled) !== None) { | ||
this.tracer.recordBinary('http.path', path); | ||
this.tracer.recordAnnotation(new Annotation.ServerRecv()); | ||
@@ -82,0 +90,0 @@ this.tracer.recordAnnotation(new Annotation.LocalAddr({host: this.host, port: this.port})); |
@@ -5,28 +5,23 @@ const None = { | ||
}, | ||
get present() { | ||
return false; | ||
}, | ||
map() { | ||
return None; | ||
return this; | ||
}, | ||
ifPresent() {}, | ||
flatMap() { | ||
return None; | ||
return this; | ||
}, | ||
getOrElse(f) { | ||
if (f instanceof Function) { | ||
return f(); | ||
} else { | ||
return f; | ||
} | ||
return f instanceof Function ? f() : f; | ||
}, | ||
equals(other) { | ||
return other.type === 'None'; | ||
return other === this; | ||
}, | ||
toString() { | ||
return 'None'; | ||
}, | ||
get present() { | ||
return false; | ||
} | ||
}; | ||
class Some { | ||
@@ -36,2 +31,8 @@ constructor(value) { | ||
} | ||
get type() { | ||
return 'Some'; | ||
} | ||
get present() { | ||
return true; | ||
} | ||
map(f) { | ||
@@ -41,6 +42,6 @@ return new Some(f(this.value)); | ||
ifPresent(f) { | ||
return this.map(f); | ||
f(this.value); | ||
} | ||
flatMap(f) { | ||
return this.map(f).getOrElse(None); | ||
return f(this.value); | ||
} | ||
@@ -54,10 +55,4 @@ getOrElse() { | ||
toString() { | ||
return `Some(${this.value.toString()})`; | ||
return `Some(${this.value})`; | ||
} | ||
get present() { | ||
return true; | ||
} | ||
get type() { | ||
return 'Some'; | ||
} | ||
} | ||
@@ -67,8 +62,3 @@ | ||
function isOptional(data) { | ||
return data != null && ( | ||
data instanceof Some || | ||
data === None || | ||
data.type === 'Some' || | ||
data.type === 'None' | ||
); | ||
return data instanceof Some || None.equals(data); | ||
} | ||
@@ -82,3 +72,3 @@ | ||
if (isOptional(data.value)) { | ||
throw new Error(`Error: data (${data.value.toString()}) is wrapped in Option twice`); | ||
throw new Error(`Error: data (${data.value}) is wrapped in Option twice`); | ||
} | ||
@@ -91,3 +81,3 @@ } else { | ||
function verifyIsNotOptional(data) { | ||
if (data != null && isOptional(data)) { | ||
if (isOptional(data)) { | ||
throw new Error(`Error: data (${data}) is an Option!`); | ||
@@ -98,7 +88,3 @@ } | ||
function fromNullable(nullable) { | ||
if (nullable != null) { | ||
return new Some(nullable); | ||
} else { | ||
return None; | ||
} | ||
return nullable == null ? None : new Some(nullable); | ||
} | ||
@@ -105,0 +91,0 @@ |
@@ -15,2 +15,6 @@ const HttpHeaders = require('./httpHeaders'); | ||
if (traceId.isDebug()) { | ||
headers[HttpHeaders.Flags] = '1'; | ||
} | ||
return headers; | ||
@@ -17,0 +21,0 @@ } |
@@ -27,8 +27,18 @@ const {None, Some, fromNullable} = require('../option'); | ||
traceId128Bit = false, | ||
// supportsJoin enables using the same span ID for both server spans and client | ||
// spans. By default it is set to true, but if you are sending the tracing data | ||
// to a service that expects to have a unique span ID for each span you must set | ||
// this to false. | ||
supportsJoin = true, | ||
localServiceName, | ||
localEndpoint | ||
localEndpoint, | ||
/* eslint-disable no-console */ | ||
log = console, | ||
defaultTags | ||
}) { | ||
this.log = log; | ||
this.recorder = recorder; | ||
this.sampler = sampler; | ||
this.traceId128Bit = traceId128Bit; | ||
this.supportsJoin = supportsJoin; | ||
if (localEndpoint) { | ||
@@ -45,2 +55,5 @@ this._localEndpoint = localEndpoint; | ||
this._startTick = hrtime(); | ||
if (defaultTags) { | ||
this.setTags(defaultTags); | ||
} | ||
} | ||
@@ -159,3 +172,3 @@ | ||
recordAnnotation(annotation) { | ||
recordAnnotation(annotation, timestamp = now(this._startTimestamp, this._startTick)) { | ||
this.id.sampled.ifPresent(sampled => { | ||
@@ -166,3 +179,3 @@ if (!sampled) return; | ||
traceId: this.id, | ||
timestamp: now(this._startTimestamp, this._startTick), | ||
timestamp, | ||
annotation | ||
@@ -216,7 +229,15 @@ })); | ||
writeIdToConsole(message) { | ||
/* eslint-disable no-console */ | ||
console.log(`${message}: ${this.id.toString()}`); | ||
this.log.info(`${message}: ${this.id.toString()}`); | ||
} | ||
setTags(tags = {}) { | ||
// eslint-disable-next-line no-restricted-syntax | ||
for (const tag in tags) { | ||
if (tags.hasOwnProperty(tag)) { | ||
this.recordBinary(tag, tags[tag]); | ||
} | ||
} | ||
} | ||
} | ||
module.exports = Tracer; |
@@ -0,3 +1,3 @@ | ||
import {expect} from 'chai'; | ||
import { Annotation, InetAddress } from 'zipkin'; | ||
import {expect} from 'chai'; | ||
@@ -4,0 +4,0 @@ describe('Annotation types', () => { |
@@ -0,3 +1,3 @@ | ||
import {expect} from 'chai'; | ||
import { ExplicitContext } from 'zipkin'; | ||
import {expect} from 'chai'; | ||
@@ -4,0 +4,0 @@ describe('ExplicitContext', () => { |
@@ -0,3 +1,3 @@ | ||
import { expect } from 'chai'; | ||
import { InetAddress } from 'zipkin'; | ||
import { expect } from 'chai'; | ||
@@ -4,0 +4,0 @@ describe('InetAddress', () => { |
@@ -1,3 +0,3 @@ | ||
import {Instrumentation, Tracer, ExplicitContext, ConsoleRecorder} from 'zipkin'; | ||
import {expect} from 'chai'; | ||
import {ConsoleRecorder, ExplicitContext, Instrumentation, Tracer} from 'zipkin'; | ||
@@ -10,3 +10,3 @@ describe('Instrumentation', () => { | ||
ctxImpl: new ExplicitContext(), | ||
recorder: new ConsoleRecorder(), | ||
recorder: new ConsoleRecorder() | ||
}), | ||
@@ -26,5 +26,5 @@ serviceName: 'weather-app', | ||
ctxImpl: new ExplicitContext(), | ||
recorder: new ConsoleRecorder(), | ||
recorder: new ConsoleRecorder() | ||
}), | ||
port: 8000, | ||
port: 8000 | ||
} | ||
@@ -31,0 +31,0 @@ ); |
@@ -1,3 +0,3 @@ | ||
import { jsonEncoder, JsonEncoder, model, TraceId, option } from 'zipkin'; | ||
import { expect } from 'chai'; | ||
import { jsonEncoder, JsonEncoder, model, option, TraceId } from 'zipkin'; | ||
@@ -14,2 +14,2 @@ describe('JsonEncoder', () => { | ||
}); | ||
}); | ||
}); |
@@ -0,3 +1,3 @@ | ||
import {expect} from 'chai'; | ||
import {model, option, TraceId} from 'zipkin'; | ||
import {expect} from 'chai'; | ||
@@ -10,3 +10,3 @@ describe('Model', () => { | ||
ipv4: '10.0.0.1', | ||
port: 8000, | ||
port: 8000 | ||
}); | ||
@@ -21,3 +21,3 @@ | ||
traceId: new option.Some('a'), | ||
spanId: 'b', | ||
spanId: 'b' | ||
})); | ||
@@ -24,0 +24,0 @@ |
@@ -0,3 +1,3 @@ | ||
import { expect } from 'chai'; | ||
import { randomTraceId } from 'zipkin'; | ||
import { expect } from 'chai'; | ||
@@ -4,0 +4,0 @@ describe('RandomTraceId', () => { |
@@ -1,3 +0,3 @@ | ||
import { ConsoleRecorder, BatchRecorder, Logger, model } from 'zipkin'; | ||
import {expect} from 'chai'; | ||
import { BatchRecorder, ConsoleRecorder, Logger, model } from 'zipkin'; | ||
@@ -7,8 +7,9 @@ describe('Recorder types', () => { | ||
it('should return correct type', () => { | ||
class Log implements Logger { | ||
logSpan(span: model.Span): void { | ||
} | ||
} | ||
const batchRecorder: BatchRecorder = new BatchRecorder({ | ||
logger: new class implements Logger { | ||
logSpan(span: model.Span): void { | ||
} | ||
}, | ||
timeout: 1000, | ||
logger: new Log(), | ||
timeout: 1000 | ||
}); | ||
@@ -15,0 +16,0 @@ |
import { expect } from 'chai'; | ||
import {Request, TraceId, option, RequestZipkinHeaders} from 'zipkin'; | ||
import {option, Request, RequestZipkinHeaders, TraceId} from 'zipkin'; | ||
import Some = option.Some; | ||
@@ -28,3 +28,3 @@ | ||
const requestWithCookie: RequestZipkinHeaders<{ url : string}, { cookie: string }> = | ||
const requestWithCookie: RequestZipkinHeaders<{ url: string}, { cookie: string }> = | ||
Request.addZipkinHeaders( | ||
@@ -31,0 +31,0 @@ { url: 'google.com', headers: { cookie: 'abc' } }, |
@@ -0,3 +1,3 @@ | ||
import { expect } from 'chai'; | ||
import { sampler } from 'zipkin'; | ||
import { expect } from 'chai'; | ||
@@ -4,0 +4,0 @@ describe('Sampler', () => { |
@@ -1,3 +0,3 @@ | ||
import { Tracer, ExplicitContext } from 'zipkin'; | ||
import { expect } from 'chai'; | ||
import { ExplicitContext, Tracer } from 'zipkin'; | ||
@@ -4,0 +4,0 @@ describe('Tracer', () => { |
@@ -1,3 +0,3 @@ | ||
import { TraceId, option } from 'zipkin'; | ||
import { expect } from 'chai'; | ||
import { option, TraceId } from 'zipkin'; | ||
@@ -4,0 +4,0 @@ describe('TraceId', () => { |
@@ -7,7 +7,19 @@ const sinon = require('sinon'); | ||
const setupTest = () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
return {record, recorder, ctxImpl}; | ||
}; | ||
const setupServerUrl = () => { | ||
const port = 80; | ||
const host = '127.0.0.1'; | ||
const url = `http://${host}:${port}`; | ||
return {port, host, url}; | ||
}; | ||
describe('Http Server Instrumentation', () => { | ||
it('should create traceId', () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
const {record, recorder, ctxImpl} = setupTest(); | ||
const tracer = new Tracer({recorder, ctxImpl}); | ||
@@ -73,10 +85,6 @@ const instrumentation = new HttpServer({tracer, serviceName: 'service-a', port: 80}); | ||
it(`should extract trace from the client and record annotations case ${index}`, () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
const {record, recorder, ctxImpl} = setupTest(); | ||
const tracer = new Tracer({recorder, ctxImpl}); | ||
const port = 80; | ||
const host = '127.0.0.1'; | ||
const url = `http://${host}:${port}`; | ||
const {port, url} = setupServerUrl(); | ||
const instrumentation = new HttpServer({tracer, serviceName: 'service-a', port}); | ||
@@ -123,2 +131,54 @@ | ||
traceContextCases.forEach((headers, index) => { | ||
it(`should should not join spans if join not supported case ${index}`, () => { | ||
const {record, recorder, ctxImpl} = setupTest(); | ||
const tracer = new Tracer({recorder, ctxImpl, supportsJoin: false}); | ||
const {port, url} = setupServerUrl(); | ||
const instrumentation = new HttpServer({ | ||
tracer, | ||
serviceName: 'service-a', | ||
port | ||
}); | ||
const readHeader = function(name) { | ||
return headers[name] ? new Some(headers[name]) : None; | ||
}; | ||
ctxImpl.scoped(() => { | ||
const id = instrumentation.recordRequest('POST', url, readHeader); | ||
tracer.recordBinary('message', 'hello from within app'); | ||
instrumentation.recordResponse(id, 202); | ||
}); | ||
const annotations = record.args.map(args => args[0]); | ||
annotations.forEach(ann => expect(ann.traceId.traceId).to.equal('aaa')); | ||
annotations.forEach(ann => expect(ann.traceId.parentId).to.equal('bbb')); | ||
annotations.forEach(ann => expect(ann.traceId.spanId).to.not.equal('bbb')); | ||
expect(annotations[0].annotation.annotationType).to.equal('ServiceName'); | ||
expect(annotations[0].annotation.serviceName).to.equal('service-a'); | ||
expect(annotations[1].annotation.annotationType).to.equal('Rpc'); | ||
expect(annotations[1].annotation.name).to.equal('POST'); | ||
expect(annotations[2].annotation.annotationType).to.equal('BinaryAnnotation'); | ||
expect(annotations[2].annotation.key).to.equal('http.path'); | ||
expect(annotations[2].annotation.value).to.equal('/'); | ||
expect(annotations[3].annotation.annotationType).to.equal('ServerRecv'); | ||
expect(annotations[4].annotation.annotationType).to.equal('LocalAddr'); | ||
expect(annotations[5].annotation.annotationType).to.equal('BinaryAnnotation'); | ||
expect(annotations[5].annotation.key).to.equal('message'); | ||
expect(annotations[5].annotation.value).to.equal('hello from within app'); | ||
expect(annotations[6].annotation.annotationType).to.equal('BinaryAnnotation'); | ||
expect(annotations[6].annotation.key).to.equal('http.status_code'); | ||
expect(annotations[6].annotation.value).to.equal('202'); | ||
expect(annotations[7].annotation.annotationType).to.equal('ServerSend'); | ||
}); | ||
}); | ||
const samplingFlagCases = [ | ||
@@ -153,9 +213,6 @@ {headers: {'X-B3-Flags': '0'}, hasAnnotations: null}, | ||
it(`should receive sampling flags from the client with ${caseName.join(', ')}`, () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
const {record, recorder, ctxImpl} = setupTest(); | ||
const tracer = new Tracer({recorder, ctxImpl}); | ||
const port = 80; | ||
const url = `http://127.0.0.1:${port}`; | ||
const {port, url} = setupServerUrl(); | ||
const instrumentation = new HttpServer({tracer, serviceName: 'service-a', port}); | ||
@@ -211,5 +268,3 @@ | ||
it('should properly report the path excluding the query string', () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
const {record, recorder, ctxImpl} = setupTest(); | ||
const tracer = new Tracer({recorder, ctxImpl}); | ||
@@ -235,5 +290,3 @@ | ||
it('should accept a 128bit X-B3-TraceId', () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
const {record, recorder, ctxImpl} = setupTest(); | ||
const tracer = new Tracer({recorder, ctxImpl}); | ||
@@ -263,5 +316,3 @@ | ||
it('should tolerate boolean literals for sampled header received from the client', () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
const {recorder, ctxImpl} = setupTest(); | ||
const tracer = new Tracer({recorder, ctxImpl}); | ||
@@ -297,5 +348,3 @@ | ||
it('should allow the host to be overridden', () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
const {record, recorder, ctxImpl} = setupTest(); | ||
const tracer = new Tracer({recorder, ctxImpl}); | ||
@@ -322,5 +371,3 @@ const instrumentation = new HttpServer({ | ||
it('should work if the host option is not defined', () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
const {record, recorder, ctxImpl} = setupTest(); | ||
const tracer = new Tracer({recorder, ctxImpl}); | ||
@@ -327,0 +374,0 @@ const instrumentation = new HttpServer({ |
@@ -31,2 +31,13 @@ const Request = require('../src/request.js'); | ||
}); | ||
it('should add flags headers if debug is on', () => { | ||
const traceId = new TraceId({ | ||
spanId: '48485a3953bb6124', | ||
flags: 1 | ||
}); | ||
const req = Request.addZipkinHeaders({}, traceId); | ||
expect(req.headers[HttpHeaders.Flags]).to.equal('1'); | ||
expect(req.headers[HttpHeaders.SpanId]).to.equal('48485a3953bb6124'); | ||
}); | ||
}); |
@@ -99,2 +99,47 @@ const sinon = require('sinon'); | ||
it('should record binary tags', () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
const localServiceName = 'smoothie-store'; | ||
const trace = new Tracer({ctxImpl, recorder, localServiceName}); | ||
const defaultTags = {instanceId: 'i-1234567890abcdef0', cluster: 'nodeservice-stage'}; | ||
ctxImpl.scoped(() => { | ||
trace.setTags(defaultTags); | ||
const annotations = record.args.map(args => args[0]); | ||
expect(annotations[0].annotation.annotationType).to.equal('BinaryAnnotation'); | ||
expect(annotations[0].annotation.key).to.equal('instanceId'); | ||
expect(annotations[0].annotation.value).to.equal('i-1234567890abcdef0'); | ||
expect(annotations[1].annotation.annotationType).to.equal('BinaryAnnotation'); | ||
expect(annotations[1].annotation.key).to.equal('cluster'); | ||
expect(annotations[1].annotation.value).to.equal('nodeservice-stage'); | ||
}); | ||
}); | ||
it('should record defaultTags', () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
const localServiceName = 'smoothie-store'; | ||
const defaultTags = {instanceId: 'i-1234567890abcdef0', cluster: 'nodeservice-stage'}; | ||
// eslint-disable-next-line no-unused-vars | ||
const trace = new Tracer({ctxImpl, recorder, localServiceName, defaultTags}); | ||
ctxImpl.scoped(() => { | ||
const annotations = record.args.map(args => args[0]); | ||
expect(annotations[0].annotation.annotationType).to.equal('BinaryAnnotation'); | ||
expect(annotations[0].annotation.key).to.equal('instanceId'); | ||
expect(annotations[0].annotation.value).to.equal('i-1234567890abcdef0'); | ||
expect(annotations[1].annotation.annotationType).to.equal('BinaryAnnotation'); | ||
expect(annotations[1].annotation.key).to.equal('cluster'); | ||
expect(annotations[1].annotation.value).to.equal('nodeservice-stage'); | ||
}); | ||
}); | ||
it('should complete a local span on error type', () => { | ||
@@ -334,2 +379,14 @@ const record = sinon.spy(); | ||
it('should log timestamps from second parameter if it present', () => { | ||
const record = sinon.spy(); | ||
const recorder = {record}; | ||
const ctxImpl = new ExplicitContext(); | ||
const trace = new Tracer({ctxImpl, recorder}); | ||
ctxImpl.scoped(() => { | ||
trace.recordAnnotation(new Annotation.ServerSend(), 87654321); | ||
expect(record.getCall(0).args[0].timestamp).to.equal(87654321); | ||
}); | ||
}); | ||
it('should create fixed-length 64-bit trace ID by default', () => { | ||
@@ -336,0 +393,0 @@ const recorder = { |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
2166357
2
94
13392
0
6
- Removednetwork-address@^1.1.0
- Removednetwork-address@1.1.2(transitive)