88 sendDistributionMetric ,
99 sendDistributionMetricWithDate ,
1010 _metricsQueue ,
11+ emitTelemetryOnErrorOutsideHandler ,
1112} from "./index" ;
1213import {
1314 incrementErrorsMetric ,
@@ -21,6 +22,8 @@ import { DatadogTraceHeaders } from "./trace/context/extractor";
2122import { SpanContextWrapper } from "./trace/span-context-wrapper" ;
2223import { TraceSource } from "./trace/trace-context-service" ;
2324import { inflateSync } from "zlib" ;
25+ import { MetricsListener } from "./metrics/listener" ;
26+ import { SpanOptions , TracerWrapper } from "./trace/tracer-wrapper" ;
2427
2528jest . mock ( "./metrics/enhanced-metrics" ) ;
2629
@@ -536,3 +539,58 @@ describe("sendDistributionMetricWithDate", () => {
536539 expect ( _metricsQueue . length ) . toBe ( 1 ) ;
537540 } ) ;
538541} ) ;
542+
543+ describe ( "emitTelemetryOnErrorOutsideHandler" , ( ) => {
544+ let mockedStartSpan = jest . spyOn ( TracerWrapper . prototype , "startSpan" ) ;
545+ beforeEach ( ( ) => {
546+ jest . spyOn ( MetricsListener . prototype , "onStartInvocation" ) . mockImplementation ( ) ;
547+ jest . spyOn ( TracerWrapper . prototype , "isTracerAvailable" , "get" ) . mockImplementation ( ( ) => true ) ;
548+ } ) ;
549+ afterEach ( ( ) => {
550+ mockedIncrementErrors . mockClear ( ) ;
551+ mockedStartSpan . mockClear ( ) ;
552+ } ) ;
553+ it ( "emits a metric when enhanced metrics are enabled" , async ( ) => {
554+ process . env . DD_ENHANCED_METRICS = "true" ;
555+ await emitTelemetryOnErrorOutsideHandler ( new ReferenceError ( "some error" ) , "myFunction" , Date . now ( ) ) ;
556+ expect ( mockedIncrementErrors ) . toBeCalledTimes ( 1 ) ;
557+ } ) ;
558+
559+ it ( "does not emit a metric when enhanced metrics are disabled" , async ( ) => {
560+ process . env . DD_ENHANCED_METRICS = "false" ;
561+ await emitTelemetryOnErrorOutsideHandler ( new ReferenceError ( "some error" ) , "myFunction" , Date . now ( ) ) ;
562+ expect ( mockedIncrementErrors ) . toBeCalledTimes ( 0 ) ;
563+ } ) ;
564+
565+ it ( "creates a span when tracing is enabled" , async ( ) => {
566+ process . env . DD_TRACE_ENABLED = "true" ;
567+ const functionName = "myFunction" ;
568+ const startTime = Date . now ( ) ;
569+ const fakeError = new ReferenceError ( "some error" ) ;
570+ const spanName = "aws.lambda" ;
571+
572+ await emitTelemetryOnErrorOutsideHandler ( fakeError , functionName , startTime ) ;
573+
574+ const options : SpanOptions = {
575+ tags : {
576+ service : spanName ,
577+ operation_name : spanName ,
578+ resource_names : functionName ,
579+ "resource.name" : functionName ,
580+ "span.type" : "serverless" ,
581+ "error.status" : 500 ,
582+ "error.type" : fakeError . name ,
583+ "error.message" : fakeError . message ,
584+ "error.stack" : fakeError . stack ,
585+ } ,
586+ startTime,
587+ } ;
588+ expect ( mockedStartSpan ) . toBeCalledWith ( spanName , options ) ;
589+ } ) ;
590+
591+ it ( "does not create a span when tracing is disabled" , async ( ) => {
592+ process . env . DD_TRACE_ENABLED = "false" ;
593+ await emitTelemetryOnErrorOutsideHandler ( new ReferenceError ( "some error" ) , "myFunction" , Date . now ( ) ) ;
594+ expect ( mockedStartSpan ) . toBeCalledTimes ( 0 ) ;
595+ } ) ;
596+ } ) ;
0 commit comments