|
1 | | -import { assertEquals } from 'https://deno.land/[email protected]/assert/mod.ts'; |
| 1 | +import { assertEquals, assertNotEquals } from 'https://deno.land/[email protected]/assert/mod.ts'; |
2 | 2 | import { context, propagation, trace } from 'npm:@opentelemetry/api@1'; |
3 | 3 | import type { DenoClient } from '../build/esm/index.js'; |
4 | 4 | import { getCurrentScope, getGlobalScope, getIsolationScope, init, startSpan } from '../build/esm/index.js'; |
@@ -143,3 +143,83 @@ Deno.test('opentelemetry spans should interop with Sentry spans', async () => { |
143 | 143 | assertEquals(otelSpan?.data?.['sentry.deno_tracer'], true); |
144 | 144 | assertEquals(otelSpan?.data?.['sentry.origin'], 'manual'); |
145 | 145 | }); |
| 146 | + |
| 147 | +Deno.test('should be compatible with native Deno OpenTelemetry', async () => { |
| 148 | + resetSdk(); |
| 149 | + |
| 150 | + const providerBefore = trace.getTracerProvider(); |
| 151 | + |
| 152 | + const client = init({ |
| 153 | + dsn: 'https://username@domain/123', |
| 154 | + tracesSampleRate: 1, |
| 155 | + beforeSendTransaction: () => null, |
| 156 | + }) as DenoClient; |
| 157 | + |
| 158 | + const providerAfter = trace.getTracerProvider(); |
| 159 | + assertEquals(providerBefore, providerAfter); |
| 160 | + |
| 161 | + const tracer = trace.getTracer('compat-test'); |
| 162 | + const span = tracer.startSpan('test-span'); |
| 163 | + span.setAttributes({ 'test.compatibility': true }); |
| 164 | + span.end(); |
| 165 | + |
| 166 | + tracer.startActiveSpan('active-span', (activeSpan) => { |
| 167 | + activeSpan.end(); |
| 168 | + }); |
| 169 | + |
| 170 | + const otelSpan = tracer.startSpan('post-init-span'); |
| 171 | + otelSpan.end(); |
| 172 | + |
| 173 | + startSpan({ name: 'sentry-span' }, () => { |
| 174 | + const nestedOtelSpan = tracer.startSpan('nested-otel-span'); |
| 175 | + nestedOtelSpan.end(); |
| 176 | + }); |
| 177 | + |
| 178 | + await client.flush(); |
| 179 | +}); |
| 180 | + |
| 181 | +Deno.test('should verify native Deno OpenTelemetry works when enabled', async () => { |
| 182 | + resetSdk(); |
| 183 | + |
| 184 | + // Set environment variable to enable native OTel |
| 185 | + const originalValue = Deno.env.get('OTEL_DENO'); |
| 186 | + Deno.env.set('OTEL_DENO', 'true'); |
| 187 | + |
| 188 | + try { |
| 189 | + const client = init({ |
| 190 | + dsn: 'https://username@domain/123', |
| 191 | + tracesSampleRate: 1, |
| 192 | + beforeSendTransaction: () => null, |
| 193 | + }) as DenoClient; |
| 194 | + |
| 195 | + const provider = trace.getTracerProvider(); |
| 196 | + const tracer = trace.getTracer('native-verification'); |
| 197 | + const span = tracer.startSpan('verification-span'); |
| 198 | + |
| 199 | + if (provider.constructor.name === 'Function') { |
| 200 | + // Native OTel is active |
| 201 | + assertNotEquals(span.constructor.name, 'NonRecordingSpan'); |
| 202 | + |
| 203 | + let contextWorks = false; |
| 204 | + tracer.startActiveSpan('parent-span', (parentSpan) => { |
| 205 | + if (trace.getActiveSpan() === parentSpan) { |
| 206 | + contextWorks = true; |
| 207 | + } |
| 208 | + parentSpan.end(); |
| 209 | + }); |
| 210 | + assertEquals(contextWorks, true); |
| 211 | + } |
| 212 | + |
| 213 | + span.setAttributes({ 'test.native_otel': true }); |
| 214 | + span.end(); |
| 215 | + |
| 216 | + await client.flush(); |
| 217 | + } finally { |
| 218 | + // Restore original environment |
| 219 | + if (originalValue === undefined) { |
| 220 | + Deno.env.delete('OTEL_DENO'); |
| 221 | + } else { |
| 222 | + Deno.env.set('OTEL_DENO', originalValue); |
| 223 | + } |
| 224 | + } |
| 225 | +}); |
0 commit comments