@@ -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