@platformatic/telemetry 2.74.3 → 3.0.0-alpha.2

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.
@@ -1,21 +1,15 @@
1
1
  'use strict'
2
2
 
3
- const {
4
- ExportResultCode,
5
- hrTimeToMicroseconds,
6
- } = require('@opentelemetry/core')
7
- const path = require('node:path')
3
+ const { ExportResultCode, hrTimeToMicroseconds } = require('@opentelemetry/core')
4
+ const { resolve: resolvePath } = require('node:path')
8
5
  const { appendFileSync } = require('node:fs')
6
+ const { workerData } = require('node:worker_threads')
9
7
 
10
8
  // Export spans to a file, mostly for testing purposes.
11
9
  class FileSpanExporter {
12
10
  #path
13
11
  constructor (opts) {
14
- if (!opts.path) {
15
- this.#path = path.resolve('spans.log')
16
- } else {
17
- this.#path = opts.path
18
- }
12
+ this.#path = resolvePath(workerData?.dirname ?? process.cwd(), opts.path ?? 'spans.log')
19
13
  }
20
14
 
21
15
  export (spans, resultCallback) {
@@ -36,7 +30,11 @@ class FileSpanExporter {
36
30
  #exportInfo (span) {
37
31
  return {
38
32
  traceId: span.spanContext().traceId,
39
- parentId: span.parentSpanId,
33
+ // parentId has been removed from otel 2.0, we need to get it from parentSpanContext
34
+ parentSpanContext: {
35
+ traceId: span.parentSpanContext?.traceId,
36
+ spanId: span.parentSpanContext?.spanId
37
+ },
40
38
  traceState: span.spanContext().traceState?.serialize(),
41
39
  name: span.name,
42
40
  id: span.spanContext().spanId,
@@ -48,7 +46,8 @@ class FileSpanExporter {
48
46
  events: span.events,
49
47
  links: span.links,
50
48
  resource: span.resource,
51
- instrumentationLibrary: span.instrumentationLibrary,
49
+ // instrumentationLibrary is deprecated in otel 2.0, we need to use instrumentationScope
50
+ instrumentationScope: span.instrumentationLibrary || span.instrumentationScope
52
51
  }
53
52
  }
54
53
  }
@@ -1,15 +1,15 @@
1
1
  'use strict'
2
2
 
3
3
  const process = require('node:process')
4
+ const { resourceFromAttributes } = require('@opentelemetry/resources')
4
5
  const { AsyncLocalStorage } = require('node:async_hooks')
5
6
  const opentelemetry = require('@opentelemetry/sdk-node')
6
- const { Resource } = require('@opentelemetry/resources')
7
7
  const FileSpanExporter = require('./file-span-exporter')
8
8
  const { ATTR_SERVICE_NAME } = require('@opentelemetry/semantic-conventions')
9
9
  const { workerData } = require('node:worker_threads')
10
10
  const { resolve } = require('node:path')
11
11
  const { tmpdir } = require('node:os')
12
- const logger = require('abstract-logging')
12
+ const { abstractLogger } = require('@platformatic/foundation')
13
13
  const { statSync, readFileSync } = require('node:fs') // We want to have all this synch
14
14
  const util = require('node:util')
15
15
  const { getInstrumentations } = require('./pluggable-instrumentations')
@@ -38,7 +38,7 @@ const setupNodeHTTPTelemetry = async (opts, serviceDir) => {
38
38
 
39
39
  let exporter = opts.exporter
40
40
  if (!exporter) {
41
- logger.warn('No exporter configured, defaulting to console.')
41
+ abstractLogger.warn('No exporter configured, defaulting to console.')
42
42
  exporter = { type: 'console' }
43
43
  }
44
44
  const exporters = Array.isArray(exporter) ? exporter : [exporter]
@@ -64,7 +64,7 @@ const setupNodeHTTPTelemetry = async (opts, serviceDir) => {
64
64
  } else if (exporter.type === 'file') {
65
65
  exporterObj = new FileSpanExporter(exporterOptions)
66
66
  } else {
67
- logger.warn(
67
+ abstractLogger.warn(
68
68
  `Unknown exporter type: ${exporter.type}, defaulting to console.`
69
69
  )
70
70
  exporterObj = new ConsoleSpanExporter(exporterOptions)
@@ -99,7 +99,7 @@ const setupNodeHTTPTelemetry = async (opts, serviceDir) => {
99
99
  new HttpInstrumentation(),
100
100
  ...additionalInstrumentations
101
101
  ],
102
- resource: new Resource({
102
+ resource: resourceFromAttributes({
103
103
  [ATTR_SERVICE_NAME]: serviceName
104
104
  })
105
105
  })
@@ -1,8 +1,10 @@
1
1
  'use strict'
2
2
 
3
- const { Resource } = require('@opentelemetry/resources')
4
- const { AlwaysOnSampler, merge, CompositePropagator, W3CTraceContextPropagator } = require('@opentelemetry/core')
5
- const { Tracer } = require('@opentelemetry/sdk-trace-base')
3
+ const { emptyResource } = require('@opentelemetry/resources')
4
+ const { merge, CompositePropagator, W3CTraceContextPropagator } = require('@opentelemetry/core')
5
+ const { AlwaysOnSampler } = require('@opentelemetry/sdk-trace-base')
6
+ // We need to import the Tracer to write our own TracerProvider that does NOT extend the OpenTelemetry one.
7
+ const { Tracer } = require('@opentelemetry/sdk-trace-base/build/src/Tracer')
6
8
  const { MultiSpanProcessor } = require('./multispan-processor')
7
9
 
8
10
  class PlatformaticTracerProvider {
@@ -20,15 +22,15 @@ class PlatformaticTracerProvider {
20
22
  },
21
23
  config
22
24
  )
23
- this.resource = mergedConfig.resource ?? Resource.empty()
25
+ this.resource = mergedConfig.resource ?? emptyResource
24
26
  this._config = Object.assign({}, mergedConfig, {
25
27
  resource: this.resource,
26
28
  })
27
29
  }
28
30
 
29
31
  // This is the only mandatory API: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#get-a-tracer
30
- getTracer (name, version, options) {
31
- return new Tracer({ name, version }, this._config, this)
32
+ getTracer (name, version) {
33
+ return new Tracer({ name, version }, this._config, this.resource, this.activeSpanProcessor)
32
34
  }
33
35
 
34
36
  addSpanProcessor (spanProcessor) {
@@ -56,7 +58,6 @@ class PlatformaticTracerProvider {
56
58
 
57
59
  forceFlush () {
58
60
  // Let's do a fire-and-forget of forceFlush on all the processor for the time being.
59
- // TODO: manage errors
60
61
  this._registeredSpanProcessors.forEach(spanProcessor => spanProcessor.forceFlush())
61
62
  }
62
63
 
package/lib/schema.js CHANGED
@@ -1,4 +1,4 @@
1
1
  'use strict'
2
2
 
3
- const { schemaComponents } = require('@platformatic/utils')
3
+ const { schemaComponents } = require('@platformatic/foundation')
4
4
  module.exports = schemaComponents.telemetry
@@ -18,7 +18,7 @@ const {
18
18
 
19
19
  const FileSpanExporter = require('./file-span-exporter')
20
20
 
21
- const { Resource } = require('@opentelemetry/resources')
21
+ const { resourceFromAttributes } = require('@opentelemetry/resources')
22
22
  const { PlatformaticTracerProvider } = require('./platformatic-trace-provider')
23
23
 
24
24
  const { name: moduleName, version: moduleVersion } = require('../package.json')
@@ -98,7 +98,7 @@ const initTelemetry = (opts, logger) => {
98
98
  )
99
99
 
100
100
  const provider = new PlatformaticTracerProvider({
101
- resource: new Resource({
101
+ resource: resourceFromAttributes({
102
102
  [ATTR_SERVICE_NAME]: serviceName,
103
103
  [ATTR_SERVICE_VERSION]: version,
104
104
  }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platformatic/telemetry",
3
- "version": "2.74.3",
3
+ "version": "3.0.0-alpha.2",
4
4
  "description": "OpenTelemetry integration for Platformatic",
5
5
  "main": "index.js",
6
6
  "author": "Platformatic Inc. <oss@platformatic.dev> (https://platformatic.dev)",
@@ -11,33 +11,34 @@
11
11
  "license": "Apache-2.0",
12
12
  "devDependencies": {
13
13
  "@databases/pg": "^5.5.0",
14
- "@opentelemetry/instrumentation-express": "^0.51.0",
15
- "@opentelemetry/instrumentation-pg": "^0.54.0",
16
- "borp": "^0.20.0",
17
- "express": "^4.19.2",
18
- "fastify": "^5.0.0",
19
- "neostandard": "^0.12.0",
20
- "protobufjs": "^7.5.0",
21
- "typescript": "^5.5.4"
14
+ "@opentelemetry/instrumentation-express": "^0.52.0",
15
+ "@opentelemetry/instrumentation-pg": "^0.55.0",
16
+ "borp": "^0.20.1",
17
+ "express": "^5.1.0",
18
+ "fastify": "^5.4.0",
19
+ "neostandard": "^0.12.2",
20
+ "protobufjs": "^7.5.3",
21
+ "typescript": "^5.9.2"
22
22
  },
23
23
  "dependencies": {
24
- "@fastify/swagger": "^9.0.0",
25
- "@opentelemetry/api": "^1.8.0",
26
- "@opentelemetry/core": "^1.22.0",
27
- "@opentelemetry/exporter-trace-otlp-proto": "^0.57.0",
28
- "@opentelemetry/exporter-zipkin": "^1.22.0",
29
- "@opentelemetry/instrumentation": "^0.57.0",
30
- "@opentelemetry/instrumentation-http": "^0.56.0",
31
- "@opentelemetry/instrumentation-undici": "^0.13.0",
32
- "@opentelemetry/resources": "^1.22.0",
33
- "@opentelemetry/sdk-node": "^0.57.0",
34
- "@opentelemetry/sdk-trace-base": "^1.22.0",
35
- "@opentelemetry/semantic-conventions": "1.30.0",
36
- "abstract-logging": "^2.0.1",
37
- "fast-uri": "^3.0.0",
38
- "fastify-plugin": "^5.0.0",
39
- "@platformatic/config": "2.74.3",
40
- "@platformatic/utils": "2.74.3"
24
+ "@fastify/swagger": "^9.5.1",
25
+ "@opentelemetry/api": "^1.9.0",
26
+ "@opentelemetry/core": "^2.0.1",
27
+ "@opentelemetry/exporter-trace-otlp-proto": "^0.203.0",
28
+ "@opentelemetry/exporter-zipkin": "^2.0.1",
29
+ "@opentelemetry/instrumentation": "^0.203.0",
30
+ "@opentelemetry/instrumentation-http": "^0.203.0",
31
+ "@opentelemetry/instrumentation-undici": "^0.14.0",
32
+ "@opentelemetry/resources": "^2.0.1",
33
+ "@opentelemetry/sdk-node": "^0.203.0",
34
+ "@opentelemetry/sdk-trace-base": "^2.0.1",
35
+ "@opentelemetry/semantic-conventions": "1.36.0",
36
+ "fast-uri": "^3.0.6",
37
+ "fastify-plugin": "^5.0.1",
38
+ "@platformatic/foundation": "3.0.0-alpha.2"
39
+ },
40
+ "engines": {
41
+ "node": ">=22.18.0"
41
42
  },
42
43
  "scripts": {
43
44
  "test": "npm run lint && borp --timeout=120000 --concurrency=1",