Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/pwa-kit-react-sdk/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## v3.11.0-dev.0 (May 23, 2025)
- Fix the performance logging so that it'll capture all SSR queries, even those that result in errors [#2486](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/2486)
- Created an opentelemetry server for SSR tracer intialization [#2617](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/2617)
- Created opentelemetry.js file with utility functions to log OTel spans and metrics [#2705] (https://github.com/SalesforceCommerceCloud/pwa-kit/pull/2705)

## v3.10.0 (May 22, 2025)
- Fix the performance logging util to use the correct delimiter for the server-timing header. [#2225](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/2295)
Expand Down
1 change: 1 addition & 0 deletions packages/pwa-kit-react-sdk/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"@loadable/server": "^5.15.3",
"@loadable/webpack-plugin": "^5.15.2",
"@opentelemetry/api": "^1.4.1",
"@opentelemetry/core": "^1.15.1",
"@opentelemetry/propagator-b3": "^1.15.1",
"@opentelemetry/resources": "^1.15.1",
"@opentelemetry/sdk-trace-base": "^1.15.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ import {B3Propagator} from '@opentelemetry/propagator-b3'
import {Resource} from '@opentelemetry/resources'
import {propagation} from '@opentelemetry/api'
import logger from '../../utils/logger-instance'

const DEFAULT_SERVICE_NAME = 'pwa-kit-react-sdk'
import {getServiceName, OTEL_CONFIG} from '../../utils/opentelemetry'

let provider = null

Expand All @@ -26,9 +25,9 @@ let provider = null
*/
export const initializeServerTracing = (options = {}) => {
const {
serviceName = process.env.OTEL_SERVICE_NAME || DEFAULT_SERVICE_NAME,
serviceName = options.serviceName || getServiceName(),
serviceVersion,
enabled = process.env.OTEL_SDK_ENABLED === 'true'
enabled = OTEL_CONFIG.enabled
} = options

// If tracing is disabled, return null without initializing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,16 @@ jest.mock('../../utils/logger-instance', () => ({
debug: jest.fn()
}))

// Mock the opentelemetry utils
jest.mock('../../utils/opentelemetry', () => ({
getServiceName: jest.fn(() => 'pwa-kit-react-sdk'),
OTEL_CONFIG: {
serviceName: 'pwa-kit-react-sdk',
enabled: true,
b3TracingEnabled: true
}
}))

describe('OpenTelemetry Server Tracing', () => {
let mockNodeTracerProvider
let mockSimpleSpanProcessor
Expand All @@ -65,6 +75,7 @@ describe('OpenTelemetry Server Tracing', () => {
const {Resource} = require('@opentelemetry/resources')
const {propagation} = require('@opentelemetry/api')
const logger = require('../../utils/logger-instance')
const {getServiceName, OTEL_CONFIG} = require('../../utils/opentelemetry')
const opentelemetryServer = require('./opentelemetry-server')
/* eslint-enable @typescript-eslint/no-var-requires */

Expand Down Expand Up @@ -278,57 +289,48 @@ describe('OpenTelemetry Server Tracing', () => {
process.env = originalEnv
})

test('should use OTEL_SERVICE_NAME environment variable when provided', () => {
test('should use custom service name when provided', () => {
// Clear previous mock calls
mockResource.mockClear()
mockNodeTracerProvider.mockClear()

process.env.OTEL_SERVICE_NAME = 'env-service-name'

const result = initializeServerTracing({enabled: true})
const result = initializeServerTracing({
enabled: true,
serviceName: 'custom-service-name'
})

expect(mockResource).toHaveBeenCalledWith({
'service.name': 'env-service-name'
'service.name': 'custom-service-name'
})
expect(result).toBeDefined()
})

test('should enable tracing when OTEL_SDK_ENABLED is true', () => {
test('should use getServiceName when no service name provided', () => {
// Clear previous mock calls
mockResource.mockClear()
mockNodeTracerProvider.mockClear()

process.env.OTEL_SDK_ENABLED = 'true'

const result = initializeServerTracing()
const result = initializeServerTracing({enabled: true})

expect(mockNodeTracerProvider).toHaveBeenCalled()
expect(mockResource).toHaveBeenCalledWith({
'service.name': 'pwa-kit-react-sdk'
})
expect(result).toBeDefined()
})

test('should disable tracing when OTEL_SDK_ENABLED is false', () => {
process.env.OTEL_SDK_ENABLED = 'false'

// Re-import to get fresh module with updated env
// eslint-disable-next-line @typescript-eslint/no-var-requires
const opentelemetryServer = require('./opentelemetry-server')
const {initializeServerTracing} = opentelemetryServer
test('should enable tracing when enabled is true', () => {
// Clear previous mock calls
mockResource.mockClear()
mockNodeTracerProvider.mockClear()

const result = initializeServerTracing(defaultOptions)
const result = initializeServerTracing({enabled: true})

expect(mockNodeTracerProvider).not.toHaveBeenCalled()
expect(result).toBeNull()
expect(mockNodeTracerProvider).toHaveBeenCalled()
expect(result).toBeDefined()
})

test('should disable tracing when OTEL_SDK_ENABLED is not set', () => {
delete process.env.OTEL_SDK_ENABLED

// Re-import to get fresh module with updated env
// eslint-disable-next-line @typescript-eslint/no-var-requires
const opentelemetryServer = require('./opentelemetry-server')
const {initializeServerTracing} = opentelemetryServer

const result = initializeServerTracing(defaultOptions)
test('should disable tracing when enabled is false', () => {
const result = initializeServerTracing({enabled: false})

expect(mockNodeTracerProvider).not.toHaveBeenCalled()
expect(result).toBeNull()
Expand Down
Loading
Loading