@platformatic/telemetry
Advanced tools
Comparing version 0.37.1 to 0.37.2
@@ -35,3 +35,7 @@ 'use strict' | ||
addSpanProcessor (spanProcessor) { | ||
this._registeredSpanProcessors.push(spanProcessor) | ||
if (Array.isArray(spanProcessor)) { | ||
this._registeredSpanProcessors.push(...spanProcessor) | ||
} else { | ||
this._registeredSpanProcessors.push(spanProcessor) | ||
} | ||
this.activeSpanProcessor = new MultiSpanProcessor( | ||
@@ -38,0 +42,0 @@ this._registeredSpanProcessors |
'use strict' | ||
const ExporterSchema = { | ||
type: 'object', | ||
properties: { | ||
type: { | ||
type: 'string', | ||
enum: ['console', 'otlp', 'zipkin', 'memory'], | ||
default: 'console' | ||
}, | ||
options: { | ||
type: 'object', | ||
description: 'Options for the exporter. These are passed directly to the exporter.', | ||
properties: { | ||
url: { | ||
type: 'string', | ||
description: 'The URL to send the traces to. Not used for console or memory exporters.' | ||
}, | ||
headers: { | ||
type: 'object', | ||
description: 'Headers to send to the exporter. Not used for console or memory exporters.' | ||
} | ||
} | ||
}, | ||
additionalProperties: false | ||
} | ||
} | ||
const TelemetrySchema = { | ||
@@ -23,25 +49,9 @@ $id: '/OpenTelemetry', | ||
exporter: { | ||
type: 'object', | ||
properties: { | ||
type: { | ||
type: 'string', | ||
enum: ['console', 'otlp', 'zipkin', 'memory'], | ||
default: 'console' | ||
anyOf: [ | ||
{ | ||
type: 'array', | ||
items: ExporterSchema | ||
}, | ||
options: { | ||
type: 'object', | ||
description: 'Options for the exporter. These are passed directly to the exporter.', | ||
properties: { | ||
url: { | ||
type: 'string', | ||
description: 'The URL to send the traces to. Not used for console or memory exporters.' | ||
}, | ||
headers: { | ||
type: 'object', | ||
description: 'Headers to send to the exporter. Not used for console or memory exporters.' | ||
} | ||
} | ||
}, | ||
additionalProperties: false | ||
} | ||
ExporterSchema | ||
] | ||
} | ||
@@ -48,0 +58,0 @@ }, |
@@ -84,3 +84,7 @@ 'use strict' | ||
} | ||
const exporters = Array.isArray(exporter) ? exporter : [exporter] | ||
app.log.info(`Setting up telemetry for service: ${serviceName}${version ? ' version: ' + version : ''} with exporter of type ${exporter.type}`) | ||
const provider = new PlatformaticTracerProvider({ | ||
@@ -93,29 +97,36 @@ resource: new Resource({ | ||
const exporterObjs = [] | ||
const spanProcessors = [] | ||
for (const exporter of exporters) { | ||
// Exporter config: | ||
// https://open-telemetry.github.io/opentelemetry-js/interfaces/_opentelemetry_exporter_zipkin.ExporterConfig.html | ||
const exporterOptions = { ...exporter.options, serviceName } | ||
const exporterOptions = { ...exporter.options, serviceName } | ||
let exporterObj | ||
if (exporter.type === 'console') { | ||
exporterObj = new ConsoleSpanExporter(exporterOptions) | ||
} else if (exporter.type === 'otlp') { | ||
let exporterObj | ||
if (exporter.type === 'console') { | ||
exporterObj = new ConsoleSpanExporter(exporterOptions) | ||
} else if (exporter.type === 'otlp') { | ||
// We require here because this require (and only the require!) creates some issue with c8 on some mjs tests on other modules. Since we need an assignemet here, we don't use a switch. | ||
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-proto') | ||
exporterObj = new OTLPTraceExporter(exporterOptions) | ||
} else if (exporter.type === 'zipkin') { | ||
const { ZipkinExporter } = require('@opentelemetry/exporter-zipkin') | ||
exporterObj = new ZipkinExporter(exporterOptions) | ||
} else if (exporter.type === 'memory') { | ||
exporterObj = new InMemorySpanExporter() | ||
} else { | ||
app.log.warn(`Unknown exporter type: ${exporter.type}, defaulting to console.`) | ||
exporterObj = new ConsoleSpanExporter(exporterOptions) | ||
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-proto') | ||
exporterObj = new OTLPTraceExporter(exporterOptions) | ||
} else if (exporter.type === 'zipkin') { | ||
const { ZipkinExporter } = require('@opentelemetry/exporter-zipkin') | ||
exporterObj = new ZipkinExporter(exporterOptions) | ||
} else if (exporter.type === 'memory') { | ||
exporterObj = new InMemorySpanExporter() | ||
} else { | ||
app.log.warn(`Unknown exporter type: ${exporter.type}, defaulting to console.`) | ||
exporterObj = new ConsoleSpanExporter(exporterOptions) | ||
} | ||
// We use a SimpleSpanProcessor for the console/memory exporters and a BatchSpanProcessor for the others. | ||
const spanProcessor = ['memory', 'console'].includes(exporter.type) ? new SimpleSpanProcessor(exporterObj) : new BatchSpanProcessor(exporterObj) | ||
spanProcessors.push(spanProcessor) | ||
exporterObjs.push(exporterObj) | ||
} | ||
// We use a SimpleSpanProcessor for the console/memory exporters and a BatchSpanProcessor for the others. | ||
const spanProcessor = ['memory', 'console'].includes(exporter.type) ? new SimpleSpanProcessor(exporterObj) : new BatchSpanProcessor(exporterObj) | ||
provider.addSpanProcessor(spanProcessor) | ||
provider.addSpanProcessor(spanProcessors) | ||
const tracer = provider.getTracer(moduleName, moduleVersion) | ||
const propagator = provider.getPropagator() | ||
return { tracer, exporter: exporterObj, propagator, provider } | ||
return { tracer, exporters: exporterObjs, propagator, provider } | ||
} | ||
@@ -122,0 +133,0 @@ |
{ | ||
"name": "@platformatic/telemetry", | ||
"version": "0.37.1", | ||
"version": "0.37.2", | ||
"description": "OpenTelemetry integration for Platformatic", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -17,6 +17,8 @@ 'use strict' | ||
await app.close() | ||
const { exporter } = app.openTelemetry | ||
if (exporter.constructor.name === 'InMemorySpanExporter') { | ||
exporter.reset() | ||
} | ||
const { exporters } = app.openTelemetry | ||
exporters.forEach(exporter => { | ||
if (exporter.constructor.name === 'InMemorySpanExporter') { | ||
exporter.reset() | ||
} | ||
}) | ||
}) | ||
@@ -123,3 +125,4 @@ return app | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
const finishedSpans = exporter.getFinishedSpans() | ||
@@ -178,3 +181,5 @@ equal(finishedSpans.length, 2) | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
const finishedSpans = exporter.getFinishedSpans() | ||
@@ -224,3 +229,4 @@ equal(finishedSpans.length, 2) | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
const finishedSpans = exporter.getFinishedSpans() | ||
@@ -227,0 +233,0 @@ equal(finishedSpans.length, 1) |
@@ -16,6 +16,8 @@ 'use strict' | ||
await app.close() | ||
const { exporter } = app.openTelemetry | ||
if (exporter.constructor.name === 'InMemorySpanExporter') { | ||
exporter.reset() | ||
} | ||
const { exporters } = app.openTelemetry | ||
exporters.forEach(exporter => { | ||
if (exporter.constructor.name === 'InMemorySpanExporter') { | ||
exporter.reset() | ||
} | ||
}) | ||
}) | ||
@@ -47,3 +49,4 @@ return app | ||
await app.inject(injectArgs) | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
const finishedSpans = exporter.getFinishedSpans() | ||
@@ -87,3 +90,4 @@ equal(finishedSpans.length, 1) | ||
await app.inject(injectArgs) | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
const finishedSpans = exporter.getFinishedSpans() | ||
@@ -120,3 +124,4 @@ equal(finishedSpans.length, 1) | ||
await app.inject(injectArgs) | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
const finishedSpans = exporter.getFinishedSpans() | ||
@@ -171,3 +176,4 @@ equal(finishedSpans.length, 1) | ||
await app.inject(injectArgs) | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
const finishedSpans = exporter.getFinishedSpans() | ||
@@ -197,3 +203,4 @@ equal(finishedSpans.length, 1) | ||
await app.inject(injectArgs) | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
same(exporter.constructor.name, 'ConsoleSpanExporter') | ||
@@ -217,3 +224,4 @@ }) | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
same(exporter.constructor.name, 'OTLPTraceExporter') | ||
@@ -238,3 +246,4 @@ same(exporter.url, 'http://localhost:4317') | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
same(exporter.constructor.name, 'ZipkinExporter') | ||
@@ -257,3 +266,4 @@ same(exporter._urlStr, 'http://localhost:9876') | ||
await app.inject(injectArgs) | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
same(exporter.constructor.name, 'ConsoleSpanExporter') | ||
@@ -287,3 +297,4 @@ }) | ||
await app.inject(injectArgs) | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
const finishedSpans = exporter.getFinishedSpans() | ||
@@ -315,3 +326,4 @@ equal(finishedSpans.length, 0) | ||
await app.inject(injectArgs) | ||
const { exporter } = app.openTelemetry | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
const finishedSpans = exporter.getFinishedSpans() | ||
@@ -332,1 +344,51 @@ equal(finishedSpans.length, 1) | ||
}) | ||
test('should configure an exporter as an array', async ({ equal, same, teardown }) => { | ||
const handler = async (request, reply) => { | ||
return {} | ||
} | ||
const app = await setupApp({ | ||
serviceName: 'test-service', | ||
version: '1.0.0', | ||
exporter: [{ | ||
type: 'otlp', | ||
options: { | ||
url: 'http://localhost:4317' | ||
} | ||
}] | ||
}, handler, teardown) | ||
const { exporters } = app.openTelemetry | ||
const exporter = exporters[0] | ||
same(exporter.constructor.name, 'OTLPTraceExporter') | ||
same(exporter.url, 'http://localhost:4317') | ||
}) | ||
test('should use multiple exporters and sent traces to all the exporters', async ({ equal, same, teardown }) => { | ||
const handler = async (request, reply) => { | ||
return {} | ||
} | ||
const app = await setupApp({ | ||
serviceName: 'test-service', | ||
version: '1.0.0', | ||
exporter: [{ | ||
type: 'memory' | ||
}, { | ||
type: 'memory' | ||
}] | ||
}, handler, teardown) | ||
const { exporters } = app.openTelemetry | ||
await app.inject(injectArgs) | ||
const finishedSpans0 = exporters[0].getFinishedSpans() | ||
equal(finishedSpans0.length, 1) | ||
const span0 = finishedSpans0[0] | ||
equal(span0.name, 'GET /test') | ||
equal(span0.status.code, SpanStatusCode.OK) | ||
const finishedSpans1 = exporters[1].getFinishedSpans() | ||
equal(finishedSpans1.length, 1) | ||
const span1 = finishedSpans1[0] | ||
equal(span1.name, 'GET /test') | ||
equal(span1.status.code, SpanStatusCode.OK) | ||
}) |
53531
1150