Skip to content

Commit 909469e

Browse files
committed
chore: telemery span filtering
1 parent 5398355 commit 909469e

3 files changed

Lines changed: 18 additions & 3 deletions

File tree

packages/salesforcedx-vscode-services/src/observability/spanTransformProcessor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import * as Effect from 'effect/Effect';
1010
import * as SubscriptionRef from 'effect/SubscriptionRef';
1111
import * as os from 'node:os';
1212
import { env, UIKind, version, workspace } from 'vscode';
13-
import { getDefaultOrgRef } from '../core/defaultOrgRef';
13+
import { getDefaultOrgRef } from '../core/defaultOrgRef';
1414

1515
/** Custom span processor that transforms spans before they're exported */
1616
export class SpanTransformProcessor extends BatchSpanProcessor {

packages/salesforcedx-vscode-services/src/observability/spanUtils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import { ReadableSpan } from '@opentelemetry/sdk-trace-base';
1010
/** Check if a span is a top-level span (has no parent) */
1111
export const isTopLevelSpan = (span: ReadableSpan): boolean => span.parentSpanContext === undefined;
1212

13+
/** Check if a span has a command attribute */
14+
export const isCommandSpan = (span: ReadableSpan): boolean => span.attributes['command'] !== undefined;
15+
1316
/** Convert span attributes to string key-value pairs, filtering out undefined/null values */
1417
export const convertAttributes = (attributes: Attributes): Attributes =>
1518
Object.fromEntries(

packages/salesforcedx-vscode-services/src/observability/spansNode.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,27 @@
77
import type { SdkLayerConfig } from './sdkLayerConfig';
88
import { AzureMonitorTraceExporter } from '@azure/monitor-opentelemetry-exporter';
99
import { NodeSdk } from '@effect/opentelemetry';
10+
import type { ExportResult } from '@opentelemetry/core';
1011
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
11-
import { ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';
12+
import { ConsoleSpanExporter, type ReadableSpan } from '@opentelemetry/sdk-trace-base';
1213
import { Global } from '@salesforce/core/global';
1314
import { join } from 'node:path';
1415
import { DEFAULT_AI_CONNECTION_STRING, isTelemetryExtensionConfigurationEnabled } from './appInsights';
1516
import { FileSpanExporterNode } from './fileSpanExporterNode';
1617
import { getConsoleTracesEnabled, getFileTracesEnabled, getLocalTracesEnabled } from './localTracing';
1718
import { O11ySpanExporter } from './o11ySpanExporter';
1819
import { SpanTransformProcessor } from './spanTransformProcessor';
20+
import { isCommandSpan, isTopLevelSpan } from './spanUtils';
21+
22+
class FilteredAzureMonitorTraceExporter extends AzureMonitorTraceExporter {
23+
public override async export(
24+
spans: ReadableSpan[],
25+
resultCallback: (result: ExportResult) => void
26+
): Promise<void> {
27+
const filteredSpans = spans.filter(span => isTopLevelSpan(span) || isCommandSpan(span));
28+
return super.export(filteredSpans, resultCallback);
29+
}
30+
}
1931

2032
export const NodeSdkLayerFor = ({ extensionName, extensionVersion, o11yEndpoint, productFeatureId }: SdkLayerConfig) =>
2133
NodeSdk.layer(() => ({
@@ -33,7 +45,7 @@ export const NodeSdkLayerFor = ({ extensionName, extensionVersion, o11yEndpoint,
3345
...(isTelemetryExtensionConfigurationEnabled()
3446
? [
3547
new SpanTransformProcessor(
36-
new AzureMonitorTraceExporter({
48+
new FilteredAzureMonitorTraceExporter({
3749
connectionString: DEFAULT_AI_CONNECTION_STRING,
3850
storageDirectory: join(Global.SF_DIR, 'vscode-extensions-telemetry')
3951
}),

0 commit comments

Comments
 (0)