Skip to content

[Bug]: Bug in OpenAI OTel Instrumentation? #119

@jeremydvoss

Description

@jeremydvoss

Component

distro

Description

Error:
Image

Distro version: 1.0.1 (built from sources)
Exporter version: 1.0.0-beta.39

App:


import { useMicrosoftOpenTelemetry } from '@microsoft/opentelemetry';
// Instrumentation must occur before other imports
useMicrosoftOpenTelemetry({
    azureMonitor: {
        azureMonitorExporterOptions: {
            connectionString: process.env.APPLICATIONINSIGHTS_CONNECTION_STRING,
        },
        enableLiveMetrics: false,
    },
    instrumentationOptions: {
        bunyan: { enabled: true },
        winston: { enabled: true },
    },
});

import { OpenAIInstrumentation } from '@opentelemetry/instrumentation-openai';
import { registerInstrumentations } from '@opentelemetry/instrumentation';
registerInstrumentations({
    instrumentations: [new OpenAIInstrumentation()],
});

import express from 'express';
import { OpenAI } from 'openai';
import winston from 'winston';
import bunyan from 'bunyan';

const winstonLogger = winston.createLogger({
    level: 'info',
    format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
    transports: [new winston.transports.Console()]
});

const bunyanLogger = bunyan.createLogger({ name: 'express-openai-otel-test-app' });

process.on('uncaughtException', (err) => {
    winstonLogger.error('Uncaught exception in test app', { message: err.message, stack: err.stack });
});

process.on('unhandledRejection', (reason) => {
    winstonLogger.error('Unhandled rejection in test app', { reason: reason instanceof Error ? reason.message : reason });
});

const app = express();
const port = Number(process.env.PORT || process.env.NODE_TEST_APP_PORT || 5000);

const client = new OpenAI({
    apiKey: process.env.OPENAI_API_KEY,
    baseURL: 'https://naarkalg-sw.cognitiveservices.azure.com/openai/v1/'
});

app.get('/', (_req, res) => {
    winstonLogger.info('Received request for root endpoint');
    res.status(200).send('Hello from the Express OpenAI OTel instrumentation test app');
});

app.get('/dependencies', async (_req, res, next) => {
    winstonLogger.info('Received request for dependencies endpoint');
    try {
        const completion = await client.chat.completions.create({
            model: 'gpt-4o-mini',
            messages: [
                { role: 'system', content: 'You are a helpful assistant. Respond in one sentence.' },
                { role: 'user', content: 'What is the capital of France?' },
            ],
            max_tokens: 50,
        });
        const answer = completion.choices[0].message.content;
        winstonLogger.info('OpenAI dependency request completed', { answer });
        res.status(200).send(`OpenAI dependency request completed: ${answer}`);
    } catch (err) {
        winstonLogger.error('OpenAI dependency request failed', { message: err.message });
        next(err);
    }
});

app.get('/exceptions', (_req, res) => {
    winstonLogger.info('Received request for exceptions endpoint');
    res.status(500).send('Triggering exception');
    setImmediate(() => {
        throw new Error('Intentional test error from Express OpenAI OTel app');
    });
});

app.get('/logs', (_req, res) => {
    console.log('Console log message from Express OpenAI OTel test app');
    console.warn('Console warn message from Express OpenAI OTel test app');
    console.info('Console info message from Express OpenAI OTel test app');

    winstonLogger.info('Winston info message from Express OpenAI OTel test app');
    winstonLogger.warn('Winston warn message from Express OpenAI OTel test app');
    winstonLogger.error('Winston error message from Express OpenAI OTel test app');

    bunyanLogger.info('Bunyan info message from Express OpenAI OTel test app');
    bunyanLogger.warn('Bunyan warn message from Express OpenAI OTel test app');
    bunyanLogger.error('Bunyan error message from Express OpenAI OTel test app');

    res.status(200).send('Logs generated with console, winston, and bunyan');
});

app.get('/logs/complex', (_req, res) => {
    const complexObject = {
        userId: 'e2e-test-user-42',
        action: 'complex-object-serialization-test',
        metadata: {
            nested: {
                level: 3,
                tags: ['alpha', 'beta', 'gamma'],
                config: { enabled: true, retryCount: 5, timeout: 30000 }
            },
            timestamp: '2026-01-15T12:00:00.000Z',
            scores: [99.5, 87.3, 100.0]
        },
        items: [
            { id: 1, name: 'item-one', active: true },
            { id: 2, name: 'item-two', active: false }
        ],
        nullField: null,
        emptyString: ''
    };

    console.log('ComplexObjectTest-Console', complexObject);
    winstonLogger.info('ComplexObjectTest-Winston', { complexPayload: complexObject });
    bunyanLogger.info({ complexPayload: complexObject }, 'ComplexObjectTest-Bunyan');

    res.status(200).json({ message: 'Complex object logs generated', objectKeys: Object.keys(complexObject) });
});

app.use((err, _req, res, next) => {
    winstonLogger.error('Express error handler caught exception', { message: err.message, stack: err.stack });
    if (res.headersSent) {
        return next(err);
    }
    res.status(500).send('Intentional test error');
});

app.listen(port, () => {
    winstonLogger.info(`Express OpenAI OTel test app listening on port ${port}`);
});

Expected Behavior

Should run without type error

Steps to Reproduce

  1. clone distro
  2. pnpm run build at root
  3. create tarball with pnpm pack
  4. pnpm install
  5. pnpm run build
  6. node dist/app.js

Environment

Windows
Distro version: 1.0.1 (built from sources)
Exporter version: 1.0.0-beta.39

Additional Context

No response

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdistroRelated to the OpenTelemetry distro

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions