Skip to content

Commit 2ded61d

Browse files
committed
improve trace flag handling and better internal host checking
1 parent 747721c commit 2ded61d

File tree

3 files changed

+47
-34
lines changed

3 files changed

+47
-34
lines changed

packages/core/src/v3/otel/tracingSDK.ts

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import { DiagConsoleLogger, DiagLogLevel, TracerProvider, diag } from "@opentelemetry/api";
1+
import {
2+
DiagConsoleLogger,
3+
DiagLogLevel,
4+
TraceFlags,
5+
TracerProvider,
6+
diag,
7+
} from "@opentelemetry/api";
28
import { logs } from "@opentelemetry/api-logs";
39
import { TraceState } from "@opentelemetry/core";
410
import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
@@ -293,13 +299,10 @@ class ExternalSpanExporterWrapper {
293299
private underlyingExporter: SpanExporter,
294300
private externalTraceId: string,
295301
private externalTraceContext:
296-
| { traceId: string; spanId: string; tracestate?: string; traceFlags?: string }
302+
| { traceId: string; spanId: string; traceFlags: number; tracestate?: string }
297303
| undefined
298304
) {
299-
this._isExternallySampled =
300-
typeof externalTraceContext?.traceFlags === "string"
301-
? externalTraceContext.traceFlags === "01"
302-
: true;
305+
this._isExternallySampled = isTraceFlagSampled(externalTraceContext?.traceFlags);
303306
}
304307

305308
private transformSpan(span: ReadableSpan): ReadableSpan | undefined {
@@ -383,13 +386,10 @@ class ExternalLogRecordExporterWrapper {
383386
private underlyingExporter: LogRecordExporter,
384387
private externalTraceId: string,
385388
private externalTraceContext:
386-
| { traceId: string; spanId: string; tracestate?: string; traceFlags?: string }
389+
| { traceId: string; spanId: string; tracestate?: string; traceFlags: number }
387390
| undefined
388391
) {
389-
this._isExternallySampled =
390-
typeof externalTraceContext?.traceFlags === "string"
391-
? externalTraceContext.traceFlags === "01"
392-
: true;
392+
this._isExternallySampled = isTraceFlagSampled(externalTraceContext?.traceFlags);
393393
}
394394

395395
export(logs: any[], resultCallback: (result: any) => void): void {
@@ -455,25 +455,42 @@ function isSpanInternalOnly(span: ReadableSpan): boolean {
455455

456456
const httpUrl = span.attributes[SEMATTRS_HTTP_URL] ?? span.attributes["url.full"];
457457

458-
if (typeof httpUrl === "string" && httpUrl.includes("https://api.trigger.dev")) {
459-
return true;
460-
}
458+
const url = safeParseUrl(httpUrl);
461459

462-
if (typeof httpUrl === "string" && httpUrl.includes("https://billing.trigger.dev")) {
463-
return true;
460+
if (!url) {
461+
return false;
464462
}
465463

466-
if (typeof httpUrl === "string" && httpUrl.includes("https://cloud.trigger.dev")) {
467-
return true;
464+
const internalHosts = [
465+
"api.trigger.dev",
466+
"billing.trigger.dev",
467+
"cloud.trigger.dev",
468+
"engine.trigger.dev",
469+
"platform.trigger.dev",
470+
];
471+
472+
return (
473+
internalHosts.some((host) => url.hostname.includes(host)) ||
474+
url.pathname.includes("/api/v1/usage/ingest")
475+
);
476+
}
477+
478+
function safeParseUrl(url: unknown): URL | undefined {
479+
if (typeof url !== "string") {
480+
return undefined;
468481
}
469482

470-
if (typeof httpUrl === "string" && httpUrl.includes("https://engine.trigger.dev")) {
471-
return true;
483+
try {
484+
return new URL(url);
485+
} catch (e) {
486+
return undefined;
472487
}
488+
}
473489

474-
if (typeof httpUrl === "string" && httpUrl.includes("/api/v1/usage/ingest")) {
490+
function isTraceFlagSampled(traceFlags?: number): boolean {
491+
if (typeof traceFlags !== "number") {
475492
return true;
476493
}
477494

478-
return false;
495+
return (traceFlags & TraceFlags.SAMPLED) === TraceFlags.SAMPLED;
479496
}

packages/core/src/v3/traceContext/manager.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Context, context, propagation, trace, TraceFlags } from "@opentelemetry/api";
22
import { TraceContextManager } from "./types.js";
3+
import { parseTraceParent } from "@opentelemetry/core";
34

45
export class StandardTraceContextManager implements TraceContextManager {
56
public traceContext: Record<string, unknown> = {};
@@ -39,12 +40,7 @@ export class StandardTraceContextManager implements TraceContextManager {
3940
const spanContext = {
4041
traceId: externalTraceContext.traceId,
4142
spanId: currentSpanContext.spanId,
42-
traceFlags:
43-
typeof externalTraceContext.traceFlags === "string"
44-
? externalTraceContext.traceFlags === "01"
45-
? TraceFlags.SAMPLED
46-
: TraceFlags.NONE
47-
: TraceFlags.SAMPLED,
43+
traceFlags: externalTraceContext.traceFlags,
4844
isRemote: true,
4945
};
5046

@@ -65,16 +61,16 @@ function extractExternalTraceContext(traceContext: unknown) {
6561
: undefined;
6662

6763
if ("traceparent" in traceContext && typeof traceContext.traceparent === "string") {
68-
const [version, traceId, spanId, traceFlags] = traceContext.traceparent.split("-");
64+
const externalSpanContext = parseTraceParent(traceContext.traceparent);
6965

70-
if (!traceId || !spanId) {
66+
if (!externalSpanContext) {
7167
return undefined;
7268
}
7369

7470
return {
75-
traceId,
76-
spanId,
77-
traceFlags,
71+
traceId: externalSpanContext.traceId,
72+
spanId: externalSpanContext.spanId,
73+
traceFlags: externalSpanContext.traceFlags,
7874
tracestate: tracestate,
7975
};
8076
}

packages/core/src/v3/traceContext/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export interface TraceContextManager {
88
| {
99
traceId: string;
1010
spanId: string;
11-
traceFlags?: string;
11+
traceFlags: number;
1212
tracestate?: string;
1313
}
1414
| undefined;

0 commit comments

Comments
 (0)