@weave-js/core 0.11.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +1 -1
- package/jest.config.js +1 -1
- package/lib/ExtendableError.js +7 -7
- package/lib/broker/context.js +49 -49
- package/lib/broker/defaultOptions.js +9 -9
- package/lib/broker/index.js +161 -165
- package/lib/buildRuntime.js +34 -34
- package/lib/cache/adapters/base.js +119 -0
- package/lib/cache/adapters/inMemory.js +154 -0
- package/lib/cache/adapters/inMemoryLru.js +140 -0
- package/lib/cache/adapters/index.js +10 -0
- package/lib/cache/getCacheKeyByObject.js +31 -0
- package/lib/cache/getPropertyFromDataOrMetadata.js +20 -0
- package/lib/cache/lock.js +30 -24
- package/lib/constants.js +5 -5
- package/lib/errorHandler.js +8 -8
- package/lib/errors.js +35 -35
- package/lib/helper/defineAction.js +2 -2
- package/lib/helper/defineBrokerOptions.js +2 -2
- package/lib/helper/defineService.js +2 -2
- package/lib/index.js +21 -22
- package/lib/logger/base.js +38 -29
- package/lib/logger/format/asHumanReadable.js +15 -15
- package/lib/logger/format/asJson.js +10 -10
- package/lib/logger/format/index.js +3 -3
- package/lib/logger/index.js +24 -24
- package/lib/logger/levels.js +21 -21
- package/lib/logger/tools.js +15 -15
- package/lib/logger/utils/colorize.js +23 -23
- package/lib/logger/utils/format.js +75 -65
- package/lib/metrics/common.js +47 -47
- package/lib/metrics/constants.js +44 -44
- package/lib/metrics/exporter/base.js +8 -8
- package/lib/metrics/exporter/event.js +20 -20
- package/lib/metrics/exporter/index.js +15 -15
- package/lib/metrics/index.js +2 -2
- package/lib/metrics/types/base.js +20 -20
- package/lib/metrics/types/counter.js +6 -6
- package/lib/metrics/types/gauge.js +24 -24
- package/lib/metrics/types/histogram.js +26 -26
- package/lib/metrics/types/index.js +6 -6
- package/lib/metrics/types/info.js +17 -17
- package/lib/middlewares/action-hooks/index.js +38 -38
- package/lib/middlewares/bulkhead/index.js +34 -34
- package/lib/middlewares/cache/index.js +63 -37
- package/lib/middlewares/circuit-breaker/index.js +62 -62
- package/lib/middlewares/context-tracker/index.js +39 -39
- package/lib/middlewares/error-handler/index.js +47 -15
- package/lib/middlewares/index.js +2 -2
- package/lib/middlewares/metrics/getMiddlewareWrapper.js +17 -17
- package/lib/middlewares/metrics/index.js +29 -29
- package/lib/middlewares/retry/index.js +15 -15
- package/lib/middlewares/timeout/index.js +16 -16
- package/lib/middlewares/tracing/index.js +37 -37
- package/lib/middlewares/tracing/tags.js +6 -6
- package/lib/middlewares/validator/index.js +31 -31
- package/lib/registry/actionEndpoint.js +8 -8
- package/lib/registry/collections/actionCollection.js +39 -35
- package/lib/registry/collections/endpointCollection.js +63 -63
- package/lib/registry/collections/eventCollection.js +62 -62
- package/lib/registry/collections/nodeCollection.js +45 -45
- package/lib/registry/collections/serviceCollection.js +61 -55
- package/lib/registry/eventEndpoint.js +14 -14
- package/lib/registry/load-balancer/base.js +3 -3
- package/lib/registry/load-balancer/index.js +7 -7
- package/lib/registry/node.js +27 -27
- package/lib/registry/registry.js +145 -148
- package/lib/registry/service/parseAction.js +16 -16
- package/lib/registry/service/parseEvent.js +18 -18
- package/lib/registry/service/reduceMixins.js +10 -10
- package/lib/registry/service/service.js +72 -72
- package/lib/registry/serviceItem.js +21 -21
- package/lib/runtime/initActionInvoker.js +21 -21
- package/lib/runtime/initCache.js +14 -5
- package/lib/runtime/initContextFactory.js +22 -22
- package/lib/runtime/initEventbus.js +49 -49
- package/lib/runtime/initLogger.js +11 -11
- package/lib/runtime/initMetrics.js +54 -54
- package/lib/runtime/initMiddlewareManager.js +21 -21
- package/lib/runtime/initRegistry.js +6 -6
- package/lib/runtime/initServiceManager.js +85 -68
- package/lib/runtime/initTracing.js +23 -23
- package/lib/runtime/initTransport.js +5 -5
- package/lib/runtime/initUuidFactory.js +4 -4
- package/lib/runtime/initValidator.js +5 -5
- package/lib/tracing/collectors/base.js +22 -22
- package/lib/tracing/collectors/event.js +33 -33
- package/lib/tracing/collectors/index.js +15 -15
- package/lib/tracing/span.js +26 -26
- package/lib/tracing/time.js +8 -8
- package/lib/transport/InboundTransformStream.js +26 -26
- package/lib/transport/adapters/adapteBase.js +30 -30
- package/lib/transport/adapters/adapters.js +4 -4
- package/lib/transport/adapters/dummy/index.js +18 -18
- package/lib/transport/adapters/fromURI.js +13 -13
- package/lib/transport/adapters/getAdapterByName.js +5 -5
- package/lib/transport/adapters/index.js +12 -12
- package/lib/transport/adapters/tcp/discovery/codec.js +4 -4
- package/lib/transport/adapters/tcp/discovery/index.js +62 -62
- package/lib/transport/adapters/tcp/index.js +169 -171
- package/lib/transport/adapters/tcp/tcp-messagetypes.js +7 -7
- package/lib/transport/adapters/tcp/tcpReader.js +39 -39
- package/lib/transport/adapters/tcp/tcpWriteStream.js +26 -26
- package/lib/transport/adapters/tcp/tcpWriter.js +57 -57
- package/lib/transport/adapters/tcp/utils.js +12 -12
- package/lib/transport/createMessage.js +4 -4
- package/lib/transport/createTransport.js +254 -254
- package/lib/transport/errorPayloadFactory.js +14 -17
- package/lib/transport/messageHandlers.js +200 -200
- package/lib/transport/messageTypes.js +19 -19
- package/lib/types.js +49 -25
- package/lib/utils/index.js +2 -2
- package/lib/utils/options.js +44 -44
- package/lib/utils/restoreError.js +4 -4
- package/package.json +4 -4
- package/lib/cache/base.js +0 -147
- package/lib/cache/inMemory.js +0 -140
- package/lib/cache/index.js +0 -48
|
@@ -1,53 +1,51 @@
|
|
|
1
|
-
const { createServiceFromSchema } = require('../registry/service/service.js')
|
|
2
|
-
const { WeaveError } = require('../errors')
|
|
3
|
-
const { debounce } = require('@weave-js/utils')
|
|
4
|
-
const fs = require('fs')
|
|
1
|
+
const { createServiceFromSchema } = require('../registry/service/service.js');
|
|
2
|
+
const { WeaveError } = require('../errors');
|
|
5
3
|
|
|
6
4
|
exports.initServiceManager = (runtime) => {
|
|
7
|
-
const { options, log, eventBus, transport, state, registry, handleError } = runtime
|
|
5
|
+
const { options, log, eventBus, transport, state, registry, handleError } = runtime;
|
|
8
6
|
|
|
9
7
|
// Internal service list
|
|
10
|
-
const serviceList = []
|
|
8
|
+
const serviceList = [];
|
|
11
9
|
|
|
12
10
|
const serviceChanged = (isLocalService = false) => {
|
|
13
11
|
// Send local notification.
|
|
14
|
-
eventBus.broadcastLocal('$services.changed', { isLocalService })
|
|
12
|
+
eventBus.broadcastLocal('$services.changed', { isLocalService });
|
|
15
13
|
|
|
16
14
|
// If the service is a local service - send current node information to other nodes
|
|
17
15
|
if (state.isStarted && isLocalService && transport) {
|
|
18
|
-
transport.sendNodeInfo()
|
|
16
|
+
transport.sendNodeInfo();
|
|
19
17
|
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const destroyService = (service) => Promise.resolve()
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// const destroyService = (service) => Promise.resolve()
|
|
21
|
+
// .then(() => service.stop())
|
|
22
|
+
// .then(() => log.info(`Service "${service.name}" was stopped.`))
|
|
23
|
+
// .then(() => {
|
|
24
|
+
// registry.deregisterService(service.name, service.version)
|
|
25
|
+
// log.info(`Service "${service.name}" was deregistered.`)
|
|
26
|
+
// // Remove service from service store.
|
|
27
|
+
// serviceList.splice(serviceList.indexOf(service), 1)
|
|
28
|
+
// // Fire services changed event
|
|
29
|
+
// serviceChanged(true)
|
|
30
|
+
// return Promise.resolve()
|
|
31
|
+
// })
|
|
32
|
+
// .catch(error => log.error(error, `Unable to stop service "${service.name}"`))
|
|
35
33
|
|
|
36
34
|
// `onServiceFileChanged` only triggered by the file watcher
|
|
37
|
-
const onServiceFileChanged = async (service) => {
|
|
38
|
-
|
|
35
|
+
// const onServiceFileChanged = async (service) => {
|
|
36
|
+
// const filename = service.filename;
|
|
39
37
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
// // Clear the require cache
|
|
39
|
+
// Object.keys(require.cache).forEach(key => {
|
|
40
|
+
// if (key === filename) {
|
|
41
|
+
// delete require.cache[key];
|
|
42
|
+
// }
|
|
43
|
+
// });
|
|
46
44
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
45
|
+
// // Service has changed - 1. destroy the service, then reload it
|
|
46
|
+
// await destroyService(service);
|
|
47
|
+
// await runtime.broker.loadService(filename);
|
|
48
|
+
// };
|
|
51
49
|
|
|
52
50
|
Object.defineProperty(runtime, 'services', {
|
|
53
51
|
value: {
|
|
@@ -55,17 +53,17 @@ exports.initServiceManager = (runtime) => {
|
|
|
55
53
|
serviceChanged,
|
|
56
54
|
createService (schema) {
|
|
57
55
|
try {
|
|
58
|
-
const newService = createServiceFromSchema(runtime, schema)
|
|
56
|
+
const newService = createServiceFromSchema(runtime, schema);
|
|
59
57
|
|
|
60
|
-
// if the broker is already
|
|
58
|
+
// if the broker is already started, we need to start the service.
|
|
61
59
|
if (runtime.state.isStarted) {
|
|
62
|
-
newService.start().catch(error => log.error(`Unable to start service ${newService.name}: ${error}`))
|
|
60
|
+
newService.start().catch(error => log.error(`Unable to start service ${newService.name}: ${error}`));
|
|
63
61
|
}
|
|
64
62
|
|
|
65
|
-
return newService
|
|
63
|
+
return newService;
|
|
66
64
|
} catch (error) {
|
|
67
|
-
log.error(error)
|
|
68
|
-
handleError(error)
|
|
65
|
+
log.error(error);
|
|
66
|
+
handleError(error);
|
|
69
67
|
}
|
|
70
68
|
},
|
|
71
69
|
/**
|
|
@@ -77,52 +75,71 @@ exports.initServiceManager = (runtime) => {
|
|
|
77
75
|
*/
|
|
78
76
|
waitForServices (serviceNames, timeout, interval = 500) {
|
|
79
77
|
if (!Array.isArray(serviceNames)) {
|
|
80
|
-
serviceNames = [serviceNames]
|
|
78
|
+
serviceNames = [serviceNames];
|
|
81
79
|
}
|
|
82
80
|
|
|
83
|
-
const startTimestamp = Date.now()
|
|
81
|
+
const startTimestamp = Date.now();
|
|
84
82
|
return new Promise((resolve, reject) => {
|
|
85
83
|
// todo: add timout for service waiter
|
|
86
|
-
log.warn(`Waiting for services '${serviceNames.join(',')}'`)
|
|
84
|
+
log.warn(`Waiting for services '${serviceNames.join(',')}'`);
|
|
87
85
|
|
|
88
86
|
const serviceCheck = () => {
|
|
89
|
-
const count = serviceNames.filter(serviceName => registry.hasService(serviceName))
|
|
87
|
+
const count = serviceNames.filter(serviceName => registry.hasService(serviceName));
|
|
90
88
|
|
|
91
|
-
log.warn(`${count.length} services of ${serviceNames.length} available. Waiting...`)
|
|
89
|
+
log.warn(`${count.length} services of ${serviceNames.length} available. Waiting...`);
|
|
92
90
|
|
|
93
91
|
if (count.length === serviceNames.length) {
|
|
94
|
-
return resolve()
|
|
92
|
+
return resolve();
|
|
95
93
|
}
|
|
96
94
|
|
|
97
95
|
if (timeout && (Date.now() - startTimestamp) > timeout) {
|
|
98
|
-
return reject(new WeaveError('The waiting of the services is interrupted due to a timeout.', 500, 'WAIT_FOR_SERVICE', { services: serviceNames }))
|
|
96
|
+
return reject(new WeaveError('The waiting of the services is interrupted due to a timeout.', 500, 'WAIT_FOR_SERVICE', { services: serviceNames }));
|
|
99
97
|
}
|
|
100
98
|
|
|
101
|
-
options.waitForServiceInterval = setTimeout(serviceCheck, interval)
|
|
102
|
-
}
|
|
99
|
+
options.waitForServiceInterval = setTimeout(serviceCheck, interval);
|
|
100
|
+
};
|
|
103
101
|
|
|
104
|
-
serviceCheck()
|
|
105
|
-
})
|
|
102
|
+
serviceCheck();
|
|
103
|
+
});
|
|
106
104
|
},
|
|
105
|
+
/**
|
|
106
|
+
* Destroy a service
|
|
107
|
+
* @param {Service} service Service
|
|
108
|
+
* @returns {Promise<any>} result
|
|
109
|
+
*/
|
|
110
|
+
async destroyService (service) {
|
|
111
|
+
try {
|
|
112
|
+
// Stop the service
|
|
113
|
+
await service.stop();
|
|
114
|
+
log.info(`Service "${service.name}" was stopped.`);
|
|
115
|
+
|
|
116
|
+
// Deregister the service and remove it from the service list
|
|
117
|
+
registry.deregisterService(service.name, service.version);
|
|
118
|
+
serviceList.splice(serviceList.indexOf(service), 1);
|
|
119
|
+
log.info(`Service "${service.name}" was deregistered.`);
|
|
120
|
+
serviceChanged(true);
|
|
121
|
+
} catch (error) {
|
|
122
|
+
log.error(error, `Unable to stop service "${service.name}"`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
107
125
|
/**
|
|
108
126
|
* Watch a Service object for changes.
|
|
109
127
|
* @param {Service} service Service object
|
|
110
128
|
* @return {void}
|
|
111
129
|
*/
|
|
112
|
-
watchService: (service) => {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
125
|
-
destroyService
|
|
130
|
+
// watchService: (service) => {
|
|
131
|
+
// if (service.filename && onServiceFileChanged) {
|
|
132
|
+
// // Create debounced service changed reference
|
|
133
|
+
// const debouncedOnServiceChange = debounce(onServiceFileChanged, 500);
|
|
134
|
+
|
|
135
|
+
// // Watch file changes
|
|
136
|
+
// const watcher = fs.watch(service.filename, (eventType, filename) => {
|
|
137
|
+
// log.info(`The Service ${service.name} has been changed. (${eventType}, ${filename})`);
|
|
138
|
+
// watcher.close();
|
|
139
|
+
// debouncedOnServiceChange(service);
|
|
140
|
+
// });
|
|
141
|
+
// }
|
|
142
|
+
// }
|
|
126
143
|
}
|
|
127
|
-
})
|
|
128
|
-
}
|
|
144
|
+
});
|
|
145
|
+
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
const { resolveCollector } = require('../tracing/collectors')
|
|
2
|
-
const { createSpan } = require('../tracing/span')
|
|
1
|
+
const { resolveCollector } = require('../tracing/collectors');
|
|
2
|
+
const { createSpan } = require('../tracing/span');
|
|
3
3
|
|
|
4
4
|
exports.initTracer = (runtime) => {
|
|
5
|
-
const options = runtime.options.tracing
|
|
6
|
-
const log = runtime.createLogger('TRACER')
|
|
7
|
-
let collectors = []
|
|
8
|
-
let samplingCounter = 0
|
|
5
|
+
const options = runtime.options.tracing;
|
|
6
|
+
const log = runtime.createLogger('TRACER');
|
|
7
|
+
let collectors = [];
|
|
8
|
+
let samplingCounter = 0;
|
|
9
9
|
|
|
10
10
|
Object.defineProperty(runtime, 'tracer', {
|
|
11
11
|
value: {
|
|
@@ -14,52 +14,52 @@ exports.initTracer = (runtime) => {
|
|
|
14
14
|
log,
|
|
15
15
|
async stop () {
|
|
16
16
|
if (collectors.length > 0) {
|
|
17
|
-
return await Promise.all(collectors.map(collector => collector.stop()))
|
|
17
|
+
return await Promise.all(collectors.map(collector => collector.stop()));
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
shouldSample (span) {
|
|
21
21
|
// check span priority
|
|
22
22
|
if (options.samplingRate === 0) {
|
|
23
|
-
return false
|
|
23
|
+
return false;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
if (options.samplingRate === 1) {
|
|
27
|
-
return true
|
|
27
|
+
return true;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
if (++samplingCounter * this.options.samplingRate >= 1) {
|
|
31
|
-
samplingCounter = 0
|
|
32
|
-
return true
|
|
31
|
+
samplingCounter = 0;
|
|
32
|
+
return true;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
return false
|
|
35
|
+
return false;
|
|
36
36
|
},
|
|
37
37
|
invokeCollectorMethod (method, args) {
|
|
38
|
-
collectors.map(collector => collector[method].apply(collector, args))
|
|
38
|
+
collectors.map(collector => collector[method].apply(collector, args));
|
|
39
39
|
},
|
|
40
40
|
startSpan (name, options) {
|
|
41
41
|
const span = createSpan(this, name, Object.assign({
|
|
42
42
|
type: 'custom'
|
|
43
|
-
}, options))
|
|
43
|
+
}, options));
|
|
44
44
|
|
|
45
|
-
span.start()
|
|
45
|
+
span.start();
|
|
46
46
|
|
|
47
|
-
return span
|
|
47
|
+
return span;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
})
|
|
50
|
+
});
|
|
51
51
|
|
|
52
52
|
// Init collectors
|
|
53
53
|
if (options.enabled) {
|
|
54
|
-
log.info('Tracer initialized.')
|
|
54
|
+
log.info('Tracer initialized.');
|
|
55
55
|
|
|
56
56
|
if (options.collectors) {
|
|
57
57
|
collectors = options.collectors
|
|
58
58
|
.map(entry => {
|
|
59
|
-
const initCollector = resolveCollector(runtime, entry, this)
|
|
60
|
-
initCollector.init(runtime)
|
|
61
|
-
return initCollector
|
|
62
|
-
})
|
|
59
|
+
const initCollector = resolveCollector(runtime, entry, this);
|
|
60
|
+
initCollector.init(runtime);
|
|
61
|
+
return initCollector;
|
|
62
|
+
});
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
}
|
|
65
|
+
};
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
* @typedef {import('../types').TransportAdapter} TransportAdapter
|
|
3
3
|
**/
|
|
4
4
|
|
|
5
|
-
const { createTransport } = require('../transport/createTransport')
|
|
6
|
-
const TransportAdapters = require('../transport/adapters')
|
|
5
|
+
const { createTransport } = require('../transport/createTransport');
|
|
6
|
+
const TransportAdapters = require('../transport/adapters');
|
|
7
7
|
|
|
8
8
|
exports.initTransport = (runtime) => {
|
|
9
9
|
if (runtime.options.transport.adapter) {
|
|
10
10
|
/** @type {TransportAdapter} */
|
|
11
|
-
const adapter = TransportAdapters.resolve(runtime, runtime.options.transport)
|
|
11
|
+
const adapter = TransportAdapters.resolve(runtime, runtime.options.transport);
|
|
12
12
|
|
|
13
13
|
Object.defineProperty(runtime, 'transport', {
|
|
14
14
|
value: createTransport(runtime, adapter)
|
|
15
|
-
})
|
|
15
|
+
});
|
|
16
16
|
}
|
|
17
|
-
}
|
|
17
|
+
};
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @typedef {import('../types.js').Runtime} Runtime
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
const { isFunction, uuid } = require('@weave-js/utils')
|
|
5
|
+
const { isFunction, uuid } = require('@weave-js/utils');
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Init uuid Generator and attach it to our runtime object.
|
|
@@ -10,7 +10,7 @@ const { isFunction, uuid } = require('@weave-js/utils')
|
|
|
10
10
|
* @returns {void}
|
|
11
11
|
*/
|
|
12
12
|
exports.initUUIDFactory = (runtime) => {
|
|
13
|
-
const { options } = runtime
|
|
13
|
+
const { options } = runtime;
|
|
14
14
|
|
|
15
|
-
runtime.generateUUID = (options.uuidFactory && isFunction(options.uuidFactory)) ? () => options.uuidFactory(runtime) : uuid
|
|
16
|
-
}
|
|
15
|
+
runtime.generateUUID = (options.uuidFactory && isFunction(options.uuidFactory)) ? () => options.uuidFactory(runtime) : uuid;
|
|
16
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Author: Kevin Ries (kevin@
|
|
2
|
+
* Author: Kevin Ries (kevin.ries@fachwerk.io)
|
|
3
3
|
* -----
|
|
4
4
|
* Copyright 2021 Fachwerk
|
|
5
5
|
*/
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* @typedef {import('../types.js').Runtime} Runtime
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
const ObjectValidator = require('@weave-js/validator')
|
|
11
|
+
const ObjectValidator = require('@weave-js/validator');
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Init validator and attach it to our runtime object.
|
|
@@ -16,11 +16,11 @@ const ObjectValidator = require('@weave-js/validator')
|
|
|
16
16
|
* @returns {void}
|
|
17
17
|
*/
|
|
18
18
|
exports.initValidator = (runtime) => {
|
|
19
|
-
const validator = ObjectValidator()
|
|
19
|
+
const validator = ObjectValidator();
|
|
20
20
|
|
|
21
21
|
Object.defineProperty(runtime, 'validator', {
|
|
22
22
|
value: {
|
|
23
23
|
...validator
|
|
24
24
|
}
|
|
25
|
-
})
|
|
26
|
-
}
|
|
25
|
+
});
|
|
26
|
+
};
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
const { isObject, pick } = require('@weave-js/utils')
|
|
1
|
+
const { isObject, pick } = require('@weave-js/utils');
|
|
2
2
|
|
|
3
3
|
exports.createBaseTracingCollector = (runtime) => {
|
|
4
|
-
const baseTracingCollector = Object.create(null)
|
|
4
|
+
const baseTracingCollector = Object.create(null);
|
|
5
5
|
|
|
6
|
-
baseTracingCollector.options = runtime.tracer.options
|
|
6
|
+
baseTracingCollector.options = runtime.tracer.options;
|
|
7
7
|
|
|
8
8
|
baseTracingCollector.init = (runtime) => {
|
|
9
|
-
baseTracingCollector.runtime = runtime
|
|
10
|
-
baseTracingCollector.tracer = runtime.tracer
|
|
11
|
-
}
|
|
9
|
+
baseTracingCollector.runtime = runtime;
|
|
10
|
+
baseTracingCollector.tracer = runtime.tracer;
|
|
11
|
+
};
|
|
12
12
|
|
|
13
13
|
baseTracingCollector.startedSpan = () => {
|
|
14
14
|
// throw new WeaveError('not implemented.')
|
|
15
|
-
}
|
|
15
|
+
};
|
|
16
16
|
|
|
17
17
|
baseTracingCollector.finishedSpan = () => {
|
|
18
18
|
// throw new WeaveError('not implemented.')
|
|
19
|
-
}
|
|
19
|
+
};
|
|
20
20
|
|
|
21
21
|
baseTracingCollector.stop = () => {
|
|
22
22
|
// throw new WeaveError('not implemented.')
|
|
23
|
-
}
|
|
23
|
+
};
|
|
24
24
|
|
|
25
25
|
baseTracingCollector.flattenTags = (obj, convertToString = false, path = '') => {
|
|
26
26
|
if (!obj) {
|
|
27
|
-
return null
|
|
27
|
+
return null;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
return Object.keys(obj).reduce((res, k) => {
|
|
31
|
-
const o = obj[k]
|
|
32
|
-
const pp = (path ? path + '.' : '') + k
|
|
31
|
+
const o = obj[k];
|
|
32
|
+
const pp = (path ? path + '.' : '') + k;
|
|
33
33
|
|
|
34
34
|
if (isObject(o)) {
|
|
35
|
-
Object.assign(res, baseTracingCollector.flattenTags(o, convertToString, pp))
|
|
35
|
+
Object.assign(res, baseTracingCollector.flattenTags(o, convertToString, pp));
|
|
36
36
|
} else if (o !== undefined) {
|
|
37
|
-
res[pp] = convertToString ? String(o) : o
|
|
37
|
+
res[pp] = convertToString ? String(o) : o;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
return res
|
|
41
|
-
}, {})
|
|
42
|
-
}
|
|
40
|
+
return res;
|
|
41
|
+
}, {});
|
|
42
|
+
};
|
|
43
43
|
|
|
44
44
|
baseTracingCollector.getErrorFields = (err, fields) => {
|
|
45
45
|
if (!err) {
|
|
46
|
-
return null
|
|
46
|
+
return null;
|
|
47
47
|
}
|
|
48
|
-
return pick(err, fields)
|
|
49
|
-
}
|
|
48
|
+
return pick(err, fields);
|
|
49
|
+
};
|
|
50
50
|
|
|
51
|
-
return baseTracingCollector
|
|
52
|
-
}
|
|
51
|
+
return baseTracingCollector;
|
|
52
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const { createBaseTracingCollector } = require('./base')
|
|
1
|
+
const { createBaseTracingCollector } = require('./base');
|
|
2
2
|
|
|
3
3
|
const mergeDefaultOptions = (options) => {
|
|
4
4
|
return Object.assign({
|
|
@@ -7,80 +7,80 @@ const mergeDefaultOptions = (options) => {
|
|
|
7
7
|
sendStartSpan: false,
|
|
8
8
|
sendFinishedSpan: true,
|
|
9
9
|
broadcast: false
|
|
10
|
-
}, options)
|
|
11
|
-
}
|
|
10
|
+
}, options);
|
|
11
|
+
};
|
|
12
12
|
|
|
13
13
|
module.exports = (options) => (runtime, tracer) => {
|
|
14
|
-
options = mergeDefaultOptions(options)
|
|
14
|
+
options = mergeDefaultOptions(options);
|
|
15
15
|
|
|
16
|
-
const exporter = createBaseTracingCollector(runtime)
|
|
16
|
+
const exporter = createBaseTracingCollector(runtime);
|
|
17
17
|
|
|
18
|
-
exporter.init(runtime, tracer)
|
|
18
|
+
exporter.init(runtime, tracer);
|
|
19
19
|
|
|
20
|
-
const queue = []
|
|
20
|
+
const queue = [];
|
|
21
21
|
|
|
22
|
-
let timer
|
|
22
|
+
let timer;
|
|
23
23
|
|
|
24
24
|
const generateTracingData = () => {
|
|
25
25
|
return Array
|
|
26
26
|
.from(queue)
|
|
27
27
|
.map(span => {
|
|
28
|
-
const newSpan = Object.assign({}, span)
|
|
28
|
+
const newSpan = Object.assign({}, span);
|
|
29
29
|
|
|
30
30
|
if (newSpan.error) {
|
|
31
|
-
newSpan.error = exporter.getErrorFields(newSpan.error, exporter.options.errors.fields)
|
|
31
|
+
newSpan.error = exporter.getErrorFields(newSpan.error, exporter.options.errors.fields);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
return newSpan
|
|
35
|
-
})
|
|
36
|
-
}
|
|
34
|
+
return newSpan;
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
37
|
|
|
38
38
|
const flushQueue = () => {
|
|
39
|
-
if (queue.length === 0) return
|
|
39
|
+
if (queue.length === 0) return;
|
|
40
40
|
|
|
41
|
-
const data = generateTracingData()
|
|
42
|
-
queue.length = 0
|
|
41
|
+
const data = generateTracingData();
|
|
42
|
+
queue.length = 0;
|
|
43
43
|
|
|
44
44
|
if (options.broadcast) {
|
|
45
|
-
exporter.runtime.eventBus.broadcast(options.eventName, data)
|
|
45
|
+
exporter.runtime.eventBus.broadcast(options.eventName, data);
|
|
46
46
|
} else {
|
|
47
|
-
exporter.runtime.eventBus.emit(options.eventName, data)
|
|
47
|
+
exporter.runtime.eventBus.emit(options.eventName, data);
|
|
48
48
|
}
|
|
49
|
-
}
|
|
49
|
+
};
|
|
50
50
|
|
|
51
51
|
if (options.interval > 0) {
|
|
52
|
-
timer = setInterval(() => flushQueue(), options.interval)
|
|
53
|
-
timer.unref()
|
|
52
|
+
timer = setInterval(() => flushQueue(), options.interval);
|
|
53
|
+
timer.unref();
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
exporter.init = (runtime) => {
|
|
57
57
|
|
|
58
|
-
}
|
|
58
|
+
};
|
|
59
59
|
|
|
60
60
|
exporter.startedSpan = (span) => {
|
|
61
61
|
if (options.sendStartSpan) {
|
|
62
|
-
queue.push(span)
|
|
62
|
+
queue.push(span);
|
|
63
63
|
if (!timer) {
|
|
64
|
-
flushQueue()
|
|
64
|
+
flushQueue();
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
}
|
|
67
|
+
};
|
|
68
68
|
|
|
69
69
|
exporter.finishedSpan = (span) => {
|
|
70
70
|
if (options.sendFinishedSpan) {
|
|
71
|
-
queue.push(span)
|
|
71
|
+
queue.push(span);
|
|
72
72
|
if (!timer) {
|
|
73
|
-
flushQueue()
|
|
73
|
+
flushQueue();
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
|
-
}
|
|
76
|
+
};
|
|
77
77
|
|
|
78
78
|
exporter.stop = async () => {
|
|
79
79
|
if (timer) {
|
|
80
|
-
clearInterval(timer)
|
|
81
|
-
timer = null
|
|
80
|
+
clearInterval(timer);
|
|
81
|
+
timer = null;
|
|
82
82
|
}
|
|
83
|
-
}
|
|
83
|
+
};
|
|
84
84
|
|
|
85
|
-
return exporter
|
|
86
|
-
}
|
|
85
|
+
return exporter;
|
|
86
|
+
};
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
const { isFunction } = require('@weave-js/utils')
|
|
1
|
+
const { isFunction } = require('@weave-js/utils');
|
|
2
2
|
|
|
3
3
|
const collectors = {
|
|
4
4
|
// Console: require('./console'),
|
|
5
5
|
Event: require('./event'),
|
|
6
6
|
BaseCollector: require('./base')
|
|
7
|
-
}
|
|
7
|
+
};
|
|
8
8
|
|
|
9
9
|
const getByName = name => {
|
|
10
|
-
const n = Object.keys(collectors).find(collectorName => collectorName.toLowerCase() === name.toLowerCase())
|
|
11
|
-
return collectors[n]
|
|
12
|
-
}
|
|
10
|
+
const n = Object.keys(collectors).find(collectorName => collectorName.toLowerCase() === name.toLowerCase());
|
|
11
|
+
return collectors[n];
|
|
12
|
+
};
|
|
13
13
|
|
|
14
14
|
exports.resolveCollector = (runtime, collector) => {
|
|
15
|
-
let CollectorClass
|
|
15
|
+
let CollectorClass;
|
|
16
16
|
if (typeof collector === 'string') {
|
|
17
|
-
CollectorClass = getByName(collector)
|
|
17
|
+
CollectorClass = getByName(collector);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
if (isFunction(collector)) {
|
|
21
|
-
return collector(runtime)
|
|
21
|
+
return collector(runtime);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
if (typeof collector === 'object') {
|
|
25
|
-
return collector
|
|
25
|
+
return collector;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
if (!CollectorClass) {
|
|
29
|
-
runtime.handleError(new Error('Tracer not found'))
|
|
29
|
+
runtime.handleError(new Error('Tracer not found'));
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
return new CollectorClass(collector)
|
|
33
|
-
}
|
|
32
|
+
return new CollectorClass(collector);
|
|
33
|
+
};
|
|
34
34
|
|
|
35
|
-
exports.Base = collectors.BaseCollector
|
|
35
|
+
exports.Base = collectors.BaseCollector;
|
|
36
36
|
|
|
37
|
-
exports.Console = collectors.Console
|
|
37
|
+
exports.Console = collectors.Console;
|
|
38
38
|
|
|
39
|
-
exports.Event = collectors.Event
|
|
39
|
+
exports.Event = collectors.Event;
|