@ -6,7 +6,7 @@
* /
* /
import { describe , it , expect , vi , beforeEach , afterEach } from 'vitest' ;
import { describe , it , expect , vi , beforeEach , afterEach } from 'vitest' ;
import { LogLevel , createEngineLogger , levelsAtLeast , type LogEntry } from '../index.ts' ;
import { LogLevel , createEngineLogger , type LogEntry } from '../index.ts' ;
import { sentryTransport , type SentryLike , type SentryScopeLike } from './sentry.ts' ;
import { sentryTransport , type SentryLike , type SentryScopeLike } from './sentry.ts' ;
import { datadogTransport , type DatadogLoggerLike } from './datadog.ts' ;
import { datadogTransport , type DatadogLoggerLike } from './datadog.ts' ;
import { logtailTransport , type LogtailLike } from './logtail.ts' ;
import { logtailTransport , type LogtailLike } from './logtail.ts' ;
@ -173,7 +173,7 @@ describe('datadogTransport', () => {
it ( 'maps TRACE/DEBUG to debug, FATAL/ERROR to error' , ( ) = > {
it ( 'maps TRACE/DEBUG to debug, FATAL/ERROR to error' , ( ) = > {
const { dd , calls } = mockDatadog ( ) ;
const { dd , calls } = mockDatadog ( ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
log . addTransport ( datadogTransport ( dd , { level s : levelsAtLeast( LogLevel . TRACE) } ) ) ;
log . addTransport ( datadogTransport ( dd , { level : LogLevel.TRACE } ) ) ;
log . trace ( 't' , 'a' ) ;
log . trace ( 't' , 'a' ) ;
log . debug ( 't' , 'b' ) ;
log . debug ( 't' , 'b' ) ;
@ -188,7 +188,7 @@ describe('datadogTransport', () => {
it ( 'preserves original level in messageContext.logLevel' , ( ) = > {
it ( 'preserves original level in messageContext.logLevel' , ( ) = > {
const { dd , calls } = mockDatadog ( ) ;
const { dd , calls } = mockDatadog ( ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
log . addTransport ( datadogTransport ( dd , { level s : levelsAtLeast( LogLevel . TRACE) } ) ) ;
log . addTransport ( datadogTransport ( dd , { level : LogLevel.TRACE } ) ) ;
log . fatal ( 't' , 'boom' ) ;
log . fatal ( 't' , 'boom' ) ;
const ctx = calls [ 0 ] . context as Record < string , unknown > ;
const ctx = calls [ 0 ] . context as Record < string , unknown > ;
expect ( ctx . logLevel ) . toBe ( 'FATAL' ) ;
expect ( ctx . logLevel ) . toBe ( 'FATAL' ) ;
@ -197,7 +197,7 @@ describe('datadogTransport', () => {
it ( 'uses reserved-safe names (logTags, sourceLocation, durationMs)' , ( ) = > {
it ( 'uses reserved-safe names (logTags, sourceLocation, durationMs)' , ( ) = > {
const { dd , calls } = mockDatadog ( ) ;
const { dd , calls } = mockDatadog ( ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
log . addTransport ( datadogTransport ( dd , { level s : levelsAtLeast( LogLevel . TRACE) } ) ) ;
log . addTransport ( datadogTransport ( dd , { level : LogLevel.TRACE } ) ) ;
log . info ( 't' , 'hi' , {
log . info ( 't' , 'hi' , {
tags : [ 'x' ] ,
tags : [ 'x' ] ,
traceId : 'r1' ,
traceId : 'r1' ,
@ -213,7 +213,7 @@ describe('datadogTransport', () => {
it ( 'passes reconstructed Error to dd.error' , ( ) = > {
it ( 'passes reconstructed Error to dd.error' , ( ) = > {
const { dd , calls } = mockDatadog ( ) ;
const { dd , calls } = mockDatadog ( ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
log . addTransport ( datadogTransport ( dd , { level s : levelsAtLeast( LogLevel . TRACE) } ) ) ;
log . addTransport ( datadogTransport ( dd , { level : LogLevel.TRACE } ) ) ;
log . error ( 't' , 'fail' , { error : new Error ( 'boom' ) } ) ;
log . error ( 't' , 'fail' , { error : new Error ( 'boom' ) } ) ;
expect ( calls [ 0 ] . error ) . toBeInstanceOf ( Error ) ;
expect ( calls [ 0 ] . error ) . toBeInstanceOf ( Error ) ;
@ -251,7 +251,7 @@ describe('logtailTransport', () => {
it ( 'maps levels correctly' , ( ) = > {
it ( 'maps levels correctly' , ( ) = > {
const { lt , calls } = mockLogtail ( ) ;
const { lt , calls } = mockLogtail ( ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
log . addTransport ( logtailTransport ( lt , { level s : levelsAtLeast( LogLevel . TRACE) } ) ) ;
log . addTransport ( logtailTransport ( lt , { level : LogLevel.TRACE } ) ) ;
log . trace ( 't' , 'a' ) ;
log . trace ( 't' , 'a' ) ;
log . debug ( 't' , 'b' ) ;
log . debug ( 't' , 'b' ) ;
@ -266,7 +266,7 @@ describe('logtailTransport', () => {
it ( 'includes logLevel, category and error in context' , ( ) = > {
it ( 'includes logLevel, category and error in context' , ( ) = > {
const { lt , calls } = mockLogtail ( ) ;
const { lt , calls } = mockLogtail ( ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
log . addTransport ( logtailTransport ( lt , { level s : levelsAtLeast( LogLevel . TRACE) } ) ) ;
log . addTransport ( logtailTransport ( lt , { level : LogLevel.TRACE } ) ) ;
log . error ( 'auth' , 'fail' , { error : new Error ( 'boom' ) } ) ;
log . error ( 'auth' , 'fail' , { error : new Error ( 'boom' ) } ) ;
const ctx = calls [ 0 ] . context as Record < string , unknown > ;
const ctx = calls [ 0 ] . context as Record < string , unknown > ;
@ -300,7 +300,7 @@ describe('lokiTransport', () => {
lokiTransport ( {
lokiTransport ( {
url : 'https://loki.example.com/loki/api/v1/push' ,
url : 'https://loki.example.com/loki/api/v1/push' ,
labels : { app : 'test' } ,
labels : { app : 'test' } ,
level s : levelsAtLeast( LogLevel . TRACE)
level : LogLevel.TRACE
} )
} )
) ;
) ;
@ -328,7 +328,7 @@ describe('lokiTransport', () => {
url : 'https://loki.example.com/push' ,
url : 'https://loki.example.com/push' ,
basicAuthUser : 'user' ,
basicAuthUser : 'user' ,
basicAuthPassword : 'pass' ,
basicAuthPassword : 'pass' ,
level s : levelsAtLeast( LogLevel . TRACE)
level : LogLevel.TRACE
} )
} )
) ;
) ;
@ -347,7 +347,7 @@ describe('lokiTransport', () => {
lokiTransport ( {
lokiTransport ( {
url : 'https://loki.example.com/push' ,
url : 'https://loki.example.com/push' ,
tenantId : 'tenant-1' ,
tenantId : 'tenant-1' ,
level s : levelsAtLeast( LogLevel . TRACE)
level : LogLevel.TRACE
} )
} )
) ;
) ;
@ -371,7 +371,7 @@ describe('lokiTransport', () => {
}
}
} ) ;
} ) ;
log . addTransport (
log . addTransport (
lokiTransport ( { url : 'https://loki.example.com/push' , level s : levelsAtLeast( LogLevel . TRACE) } )
lokiTransport ( { url : 'https://loki.example.com/push' , level : LogLevel.TRACE } )
) ;
) ;
log . info ( 't' , 'hi' ) ;
log . info ( 't' , 'hi' ) ;
@ -580,7 +580,7 @@ describe('otelTransport', () => {
it ( 'maps levels to OTel severityNumber (1/5/9/13/17/21)' , ( ) = > {
it ( 'maps levels to OTel severityNumber (1/5/9/13/17/21)' , ( ) = > {
const { otelLogger , emitted } = mockOtelLogger ( ) ;
const { otelLogger , emitted } = mockOtelLogger ( ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
log . addTransport ( otelTransport ( otelLogger , { level s : levelsAtLeast( LogLevel . TRACE) } ) ) ;
log . addTransport ( otelTransport ( otelLogger , { level : LogLevel.TRACE } ) ) ;
log . trace ( 't' , 'a' ) ;
log . trace ( 't' , 'a' ) ;
log . debug ( 't' , 'b' ) ;
log . debug ( 't' , 'b' ) ;
@ -595,7 +595,7 @@ describe('otelTransport', () => {
it ( 'sets severityText to the level name' , ( ) = > {
it ( 'sets severityText to the level name' , ( ) = > {
const { otelLogger , emitted } = mockOtelLogger ( ) ;
const { otelLogger , emitted } = mockOtelLogger ( ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
log . addTransport ( otelTransport ( otelLogger , { level s : levelsAtLeast( LogLevel . TRACE) } ) ) ;
log . addTransport ( otelTransport ( otelLogger , { level : LogLevel.TRACE } ) ) ;
log . info ( 't' , 'hi' ) ;
log . info ( 't' , 'hi' ) ;
expect ( emitted [ 0 ] . severityText ) . toBe ( 'INFO' ) ;
expect ( emitted [ 0 ] . severityText ) . toBe ( 'INFO' ) ;
} ) ;
} ) ;
@ -603,7 +603,7 @@ describe('otelTransport', () => {
it ( 'flattens context as log.context.* attributes' , ( ) = > {
it ( 'flattens context as log.context.* attributes' , ( ) = > {
const { otelLogger , emitted } = mockOtelLogger ( ) ;
const { otelLogger , emitted } = mockOtelLogger ( ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
log . addTransport ( otelTransport ( otelLogger , { level s : levelsAtLeast( LogLevel . TRACE) } ) ) ;
log . addTransport ( otelTransport ( otelLogger , { level : LogLevel.TRACE } ) ) ;
log . info ( 'auth' , 'hi' , { context : { userId : 42 , region : 'eu' } } ) ;
log . info ( 'auth' , 'hi' , { context : { userId : 42 , region : 'eu' } } ) ;
const attrs = emitted [ 0 ] . attributes ? ? { } ;
const attrs = emitted [ 0 ] . attributes ? ? { } ;
@ -615,7 +615,7 @@ describe('otelTransport', () => {
it ( 'maps error fields to exception.* attributes' , ( ) = > {
it ( 'maps error fields to exception.* attributes' , ( ) = > {
const { otelLogger , emitted } = mockOtelLogger ( ) ;
const { otelLogger , emitted } = mockOtelLogger ( ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
const log = createEngineLogger ( { level : LogLevel.TRACE , transports : [ ] } ) ;
log . addTransport ( otelTransport ( otelLogger , { level s : levelsAtLeast( LogLevel . TRACE) } ) ) ;
log . addTransport ( otelTransport ( otelLogger , { level : LogLevel.TRACE } ) ) ;
log . error ( 't' , 'fail' , { error : new Error ( 'boom' ) } ) ;
log . error ( 't' , 'fail' , { error : new Error ( 'boom' ) } ) ;
const attrs = emitted [ 0 ] . attributes ? ? { } ;
const attrs = emitted [ 0 ] . attributes ? ? { } ;