Skip to content

Commit c556696

Browse files
committed
Spans are always present; removing ?
1 parent 589d252 commit c556696

File tree

1 file changed

+38
-36
lines changed
  • docs/platforms/javascript/common/tracing/span-metrics

1 file changed

+38
-36
lines changed

docs/platforms/javascript/common/tracing/span-metrics/examples.mdx

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -219,17 +219,19 @@ const handleUpload = async () => {
219219
const uploadData = await uploadResponse.json();
220220

221221
// Set success attributes
222-
span?.setAttribute('upload.success', true);
223-
span?.setAttribute('upload.duration_ms', Date.now() - uploadStartTime);
224-
span?.setAttribute('job.id', uploadData.jobId);
222+
span.setAttribute('upload.success', true);
223+
span.setAttribute('upload.duration_ms', Date.now() - uploadStartTime);
224+
span.setAttribute('job.id', uploadData.jobId);
225225

226226
// Update UI to show processing status
227227
updateUploadStatus(uploadData.jobId, 'processing');
228228

229229
} catch (error) {
230-
span?.setAttribute('upload.success', false);
231-
span?.setAttribute('upload.error', error instanceof Error ? error.message : 'Unknown error');
230+
span.setStatus({ code: 2, message: 'error' });
231+
span.setAttribute('upload.success', false);
232+
span.setAttribute('upload.error', error instanceof Error ? error.message : 'Unknown error');
232233
setUploadStatus('error');
234+
Sentry.captureException(error);
233235
}
234236
}
235237
);
@@ -344,9 +346,9 @@ export async function processMedia(job: ProcessingJob): Promise<void> {
344346
const operations: string[] = [];
345347

346348
// Add job-specific attributes
347-
span?.setAttribute('media.size_bytes', job.fileSize);
348-
span?.setAttribute('media.mime_type', job.fileType);
349-
span?.setAttribute('media.size_bucket', getSizeBucket(job.fileSize));
349+
span.setAttribute('media.size_bytes', job.fileSize);
350+
span.setAttribute('media.mime_type', job.fileType);
351+
span.setAttribute('media.size_bucket', getSizeBucket(job.fileSize));
350352

351353
// Simulate image optimization and thumbnail generation
352354
if (job.fileType.startsWith('image/')) {
@@ -363,13 +365,13 @@ export async function processMedia(job: ProcessingJob): Promise<void> {
363365
const thumbnailCreated = Math.random() > 0.05; // 95% success rate
364366

365367
// Rich attributes instead of multiple spans
366-
span?.setAttribute('processing.operations', JSON.stringify(operations));
367-
span?.setAttribute('processing.optimization_level', 'high');
368-
span?.setAttribute('processing.thumbnail_created', thumbnailCreated);
369-
span?.setAttribute('processing.duration_ms', Date.now() - startTime);
370-
span?.setAttribute('result.size_saved_bytes', sizeSaved);
371-
span?.setAttribute('result.size_reduction_percent', 30);
372-
span?.setAttribute('result.status', 'success');
368+
span.setAttribute('processing.operations', JSON.stringify(operations));
369+
span.setAttribute('processing.optimization_level', 'high');
370+
span.setAttribute('processing.thumbnail_created', thumbnailCreated);
371+
span.setAttribute('processing.duration_ms', Date.now() - startTime);
372+
span.setAttribute('result.size_saved_bytes', sizeSaved);
373+
span.setAttribute('result.size_reduction_percent', 30);
374+
span.setAttribute('result.status', 'success');
373375

374376
// Update job status
375377
job.status = 'completed';
@@ -378,8 +380,8 @@ export async function processMedia(job: ProcessingJob): Promise<void> {
378380
parentSpan.setStatus({ code: 1, message: 'ok' });
379381

380382
} catch (error) {
381-
span?.setAttribute('result.status', 'failed');
382-
span?.setAttribute('error.message', error instanceof Error ? error.message : 'Unknown error');
383+
span.setAttribute('result.status', 'failed');
384+
span.setAttribute('error.message', error instanceof Error ? error.message : 'Unknown error');
383385
parentSpan.setStatus({ code: 2, message: 'error' });
384386
Sentry.captureException(error);
385387
}
@@ -446,21 +448,21 @@ const response = await Sentry.startSpan(
446448

447449
const data: SearchResponse = await response.json();
448450

449-
span?.setAttribute('results.count', data.results.length);
450-
span?.setAttribute('results.has_results', data.results.length > 0);
451-
span?.setAttribute('http.response_size', JSON.stringify(data).length);
452-
span?.setStatus({ code: 1, message: 'ok' });
451+
span.setAttribute('results.count', data.results.length);
452+
span.setAttribute('results.has_results', data.results.length > 0);
453+
span.setAttribute('http.response_size', JSON.stringify(data).length);
454+
span.setStatus({ code: 1, message: 'ok' });
453455

454456
return data;
455457
} catch (error) {
456458
if (error instanceof Error && error.name === 'AbortError') {
457-
span?.setAttribute('ui.aborted', true);
458-
span?.setStatus({ code: 2, message: 'cancelled' });
459+
span.setAttribute('ui.aborted', true);
460+
span.setStatus({ code: 2, message: 'cancelled' });
459461
// Don't re-throw AbortError to avoid sending it to Sentry
460462
return { results: [] };
461463
}
462464

463-
span?.setStatus({ code: 2, message: error instanceof Error ? error.message : 'unknown error' });
465+
span.setStatus({ code: 2, message: error instanceof Error ? error.message : 'unknown error' });
464466
throw error;
465467
}
466468
}
@@ -487,14 +489,14 @@ app.get('/api/search', async (req: Request, res: Response) => {
487489
// Check if request was aborted
488490
req.on('close', () => {
489491
if (!res.headersSent) {
490-
span?.setStatus({ code: 2, message: 'cancelled' });
491-
span?.setAttribute('request.aborted', true);
492+
span.setStatus({ code: 2, message: 'cancelled' });
493+
span.setAttribute('request.aborted', true);
492494
}
493495
});
494496

495497
if (!query) {
496-
span?.setAttribute('results.count', 0);
497-
span?.setAttribute('search.engine', 'elasticsearch');
498+
span.setAttribute('results.count', 0);
499+
span.setAttribute('search.engine', 'elasticsearch');
498500
return res.json({ results: [] });
499501
}
500502

@@ -504,21 +506,21 @@ app.get('/api/search', async (req: Request, res: Response) => {
504506
const searchDuration = Date.now() - startSearch;
505507

506508
// Set span attributes
507-
span?.setAttribute('search.engine', 'elasticsearch');
508-
span?.setAttribute('search.mode', queryLength < 3 ? 'prefix' : 'fuzzy');
509-
span?.setAttribute('results.count', results.length);
510-
span?.setAttribute('query.length', queryLength);
509+
span.setAttribute('search.engine', 'elasticsearch');
510+
span.setAttribute('search.mode', queryLength < 3 ? 'prefix' : 'fuzzy');
511+
span.setAttribute('results.count', results.length);
512+
span.setAttribute('query.length', queryLength);
511513

512514
// Track slow searches
513515
if (searchDuration > 500) {
514-
span?.setAttribute('performance.slow', true);
515-
span?.setAttribute('search.duration_ms', searchDuration);
516+
span.setAttribute('performance.slow', true);
517+
span.setAttribute('search.duration_ms', searchDuration);
516518
}
517519

518520
return res.json({ results });
519521
} catch (error: any) {
520-
span?.setStatus({ code: 2, message: error?.message || 'error' });
521-
span?.setAttribute('error.type', (error as any)?.constructor?.name || 'Error');
522+
span.setStatus({ code: 2, message: error?.message || 'error' });
523+
span.setAttribute('error.type', (error as any)?.constructor?.name || 'Error');
522524

523525
Sentry.captureException(error);
524526
if (!res.headersSent) {

0 commit comments

Comments
 (0)