Skip to content

Commit

Permalink
fix(opentelemetry): add error message to span status (#1632)
Browse files Browse the repository at this point in the history
  • Loading branch information
xavierroma authored Feb 27, 2025
1 parent 319a3cf commit b0316da
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 1 deletion.
2 changes: 2 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/interceptors-opentelemetry/src/instrumentation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ async function wrapWithSpan<T>(
return ret;
} catch (err: any) {
if (acceptableErrors === undefined || !acceptableErrors(err)) {
span.setStatus({ code: otel.SpanStatusCode.ERROR });
span.setStatus({ code: otel.SpanStatusCode.ERROR, message: err instanceof Error ? err.message : String(err) });
span.recordException(err);
} else {
span.setStatus({ code: otel.SpanStatusCode.OK });
Expand Down
1 change: 1 addition & 0 deletions packages/test/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
"@opentelemetry/core": "^1.19.0",
"@opentelemetry/exporter-trace-otlp-grpc": "^0.46.0",
"@opentelemetry/sdk-node": "^0.46.0",
"@opentelemetry/sdk-trace-base": "^1.19.0",
"@opentelemetry/semantic-conventions": "^1.19.0",
"@temporalio/activity": "file:../activity",
"@temporalio/client": "file:../client",
Expand Down
35 changes: 35 additions & 0 deletions packages/test/src/test-otel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ import { SpanStatusCode } from '@opentelemetry/api';
import { ExportResultCode } from '@opentelemetry/core';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
import * as opentelemetry from '@opentelemetry/sdk-node';
import { BasicTracerProvider, InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';
import test from 'ava';
import { v4 as uuid4 } from 'uuid';
import { Connection, WorkflowClient } from '@temporalio/client';
import { OpenTelemetryWorkflowClientInterceptor } from '@temporalio/interceptors-opentelemetry/lib/client';
import { instrument } from '@temporalio/interceptors-opentelemetry/lib/instrumentation';
import {
makeWorkflowExporter,
OpenTelemetryActivityInboundInterceptor,
Expand Down Expand Up @@ -413,4 +415,37 @@ if (RUN_INTEGRATION_TESTS) {
// Importing the otel workflow modules above should patch globalThis
t.falsy((globalThis as any).window);
});

test('instrumentation: Error status includes message and records exception', async (t) => {
const memoryExporter = new InMemorySpanExporter();
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
provider.register();
const tracer = provider.getTracer('test-error-tracer');

const errorMessage = 'Test error message';

await t.throwsAsync(
instrument({
tracer,
spanName: 'test-error-span',
fn: async () => {
throw new Error(errorMessage);
},
}),
{ message: errorMessage }
);

const spans = memoryExporter.getFinishedSpans();
t.is(spans.length, 1);

const span = spans[0];

t.is(span.status.code, SpanStatusCode.ERROR);

t.is(span.status.message, errorMessage);

const exceptionEvents = span.events.filter((event) => event.name === 'exception');
t.is(exceptionEvents.length, 1);
});
}

0 comments on commit b0316da

Please sign in to comment.