Skip to content

Commit 5af9edb

Browse files
committed
feat: add release please and opt-out of span exceptions
Signed-off-by: Lukas Reining <[email protected]>
1 parent a404933 commit 5af9edb

File tree

2 files changed

+33
-12
lines changed

2 files changed

+33
-12
lines changed

libs/hooks/open-telemetry/src/lib/otel-hook.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ export type OpenTelemetryHookOptions = {
3232
*/
3333
excludeAttributes?: TelemetryAttributesNames[];
3434

35+
/**
36+
* If true, unhandled error or promise rejection during flag resolution, or any attached hooks
37+
* will not be recorded on the active span.
38+
* By default, exceptions are recorded on the active span, if there is one.
39+
*/
40+
excludeExceptionsFromTrace?: boolean;
41+
3542
/**
3643
* Takes a telemetry event and returns a telemetry event.
3744
* This can be used to filter out attributes that are not needed or to add additional attributes.
@@ -47,6 +54,7 @@ export abstract class OpenTelemetryHook {
4754
protected abstract name: string;
4855

4956
protected attributesToExclude: TelemetryAttributesNames[];
57+
protected excludeExceptionsFromTrace: boolean;
5058
protected safeAttributeMapper: AttributeMapper;
5159
protected safeEventMutator: EventMutator;
5260

@@ -68,6 +76,7 @@ export abstract class OpenTelemetryHook {
6876
}
6977
};
7078
this.attributesToExclude = options?.excludeAttributes ?? [];
79+
this.excludeExceptionsFromTrace = options?.excludeExceptionsFromTrace ?? false;
7180
}
7281

7382
protected toEvaluationEvent(

libs/hooks/open-telemetry/src/lib/traces/tracing-hook.ts

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,24 @@ import { OpenTelemetryHook } from '../otel-hook';
1212
* OpenTelemetry events.
1313
*/
1414
export class EventHook extends OpenTelemetryHook implements BaseHook {
15-
protected name = LogEventTracingHook.name;
15+
protected name = EventHook.name;
1616
private eventLogger: EventLogger;
1717

1818
constructor(options?: OpenTelemetryHookOptions, logger?: Logger) {
1919
super(options, logger);
20-
this.eventLogger = events.getEventLogger('@openfeature/open-telemetry-hooks', "0.4.0"); // Update version with Release Please
20+
// x-release-please-start-version
21+
this.eventLogger = events.getEventLogger('@openfeature/open-telemetry-hooks', '0.4.0');
22+
// x-release-please-end
2123
}
2224

2325
finally(hookContext: Readonly<HookContext>, evaluationDetails: EvaluationDetails<FlagValue>) {
2426
this.eventLogger.emit(this.toEvaluationEvent(hookContext, evaluationDetails));
2527
}
2628

2729
error(_: HookContext, err: Error) {
28-
trace.getActiveSpan()?.recordException(err);
30+
if (!this.excludeExceptionsFromTrace) {
31+
trace.getActiveSpan()?.recordException(err);
32+
}
2933
}
3034
}
3135

@@ -36,7 +40,7 @@ export class EventHook extends OpenTelemetryHook implements BaseHook {
3640
* Span events are being deprecated in favor of using log events.
3741
*/
3842
export class SpanEventHook extends OpenTelemetryHook implements BaseHook {
39-
protected name = SpanEventTracingHook.name;
43+
protected name = SpanEventHook.name;
4044

4145
constructor(options?: OpenTelemetryHookOptions, logger?: Logger) {
4246
super(options, logger);
@@ -54,13 +58,18 @@ export class SpanEventHook extends OpenTelemetryHook implements BaseHook {
5458
}
5559

5660
error(_: HookContext, err: Error) {
57-
trace.getActiveSpan()?.recordException(err);
61+
if (!this.excludeExceptionsFromTrace) {
62+
trace.getActiveSpan()?.recordException(err);
63+
}
5864
}
5965
}
6066

61-
const tracer = trace.getTracer('span-attributes-tracing-hook');
67+
// x-release-please-start-version
68+
const tracer = trace.getTracer('@openfeature/open-telemetry-hooks', '0.4.0');
69+
// x-release-please-end
70+
6271
const HookContextSpanKey = Symbol('evaluation_span');
63-
type SpanAttributesTracingHookData = { [HookContestSpanKey]: Span };
72+
type SpanAttributesTracingHookData = { [HookContextSpanKey]: Span };
6473

6574
/**
6675
* A hook that creates a new span for each flag evaluation and sets the evaluation
@@ -69,22 +78,22 @@ type SpanAttributesTracingHookData = { [HookContestSpanKey]: Span };
6978
* If there is no active span, a new root span is created.
7079
*/
7180
export class SpanHook extends OpenTelemetryHook implements BaseHook {
72-
protected name = SpanAttributesTracingHook.name;
81+
protected name = SpanHook.name;
7382

7483
constructor(options?: OpenTelemetryHookOptions, logger?: Logger) {
7584
super(options, logger);
7685
}
7786

7887
before(hookContext: HookContext<FlagValue, SpanAttributesTracingHookData>) {
7988
const evaluationSpan = tracer.startSpan('feature_flag.evaluation');
80-
hookContext.hookData.set(HookContestSpanKey, evaluationSpan);
89+
hookContext.hookData.set(HookContextSpanKey, evaluationSpan);
8190
}
8291

8392
finally(
8493
hookContext: Readonly<HookContext<FlagValue, SpanAttributesTracingHookData>>,
8594
evaluationDetails: EvaluationDetails<FlagValue>,
8695
) {
87-
const currentSpan = hookContext.hookData.get(HookContestSpanKey);
96+
const currentSpan = hookContext.hookData.get(HookContextSpanKey);
8897
if (!currentSpan) {
8998
return;
9099
}
@@ -95,7 +104,10 @@ export class SpanHook extends OpenTelemetryHook implements BaseHook {
95104
currentSpan.end();
96105
}
97106

98-
error(_: HookContext, err: Error) {
99-
trace.getActiveSpan()?.recordException(err);
107+
error(hookContext: Readonly<HookContext<FlagValue, SpanAttributesTracingHookData>>, err: Error) {
108+
if (!this.excludeExceptionsFromTrace) {
109+
const currentSpan = hookContext.hookData.get(HookContextSpanKey) ?? trace.getActiveSpan();
110+
currentSpan?.recordException(err);
111+
}
100112
}
101113
}

0 commit comments

Comments
 (0)