-
Notifications
You must be signed in to change notification settings - Fork 407
Expand file tree
/
Copy pathlogger_provider.js
More file actions
129 lines (116 loc) · 3.66 KB
/
Copy pathlogger_provider.js
File metadata and controls
129 lines (116 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
'use strict'
const { logs } = require('@opentelemetry/api-logs')
const { context } = require('@opentelemetry/api')
const log = require('../../log')
const ContextManager = require('../context_manager')
const Logger = require('./logger')
/**
* @typedef {import('@opentelemetry/api-logs').Logger} Logger
* @typedef {import('./batch_log_processor')} BatchLogRecordProcessor
*/
/**
* LoggerProvider is the main entry point for creating loggers with a single processor for Datadog Agent export.
*
* This implementation follows the OpenTelemetry JavaScript API LoggerProvider interface:
* https://github.com/open-telemetry/opentelemetry-js/blob/a7a36499f70f25201949aeabb84c5fd4ca80e860/experimental/packages/api-logs/src/types/LoggerProvider.ts
*
* @class LoggerProvider
* @implements {import('@opentelemetry/api-logs').LoggerProvider}
*/
class LoggerProvider {
#loggers
#contextManager
/**
* Creates a new LoggerProvider instance with a single processor for Datadog Agent export.
*
* @param {object} [options] - LoggerProvider options
* @param {BatchLogRecordProcessor} [options.processor] - Single LogRecordProcessor instance for
* exporting logs to Datadog Agent
*/
constructor (options = {}) {
this.processor = options.processor
this.#loggers = new Map()
this.#contextManager = new ContextManager()
this.isShutdown = false
}
/**
* Gets or creates a logger instance.
*
* @param {string | object} nameOrOptions - Logger name or options object
* @param {string} [version] - Logger version (when nameOrOptions is a string)
* @param {object} [options] - Additional options (when nameOrOptions is a string)
* @returns {Logger} Logger instance
*/
getLogger (nameOrOptions, version, options = {}) {
if (this.isShutdown) {
return this.#createNoOpLogger()
}
let name, loggerOptions
if (typeof nameOrOptions === 'string') {
name = nameOrOptions
loggerOptions = { version, ...options }
} else {
name = nameOrOptions.name
loggerOptions = nameOrOptions
}
const loggerVersion = loggerOptions.version || ''
const loggerSchemaUrl = loggerOptions?.schemaUrl || ''
const key = `${name}@${loggerVersion}`
if (!this.#loggers.has(key)) {
this.#loggers.set(key, new Logger(this, { name, version: loggerVersion, schemaUrl: loggerSchemaUrl }))
}
return this.#loggers.get(key)
}
/**
* Registers this logger provider as the global provider.
*/
register () {
if (this.isShutdown) {
log.warn('Cannot register after shutdown')
return
}
// Set context manager, this is required to correlate logs to spans
context.setGlobalContextManager(this.#contextManager)
logs.setGlobalLoggerProvider(this)
}
/**
* Forces a flush of all pending log records.
* @param {Function} [done] Called after all pending log exports complete
*/
forceFlush (done) {
if (this.isShutdown || !this.processor) {
done?.()
return
}
this.processor.forceFlush(done)
}
/**
* Shuts down the logger provider and all associated processors.
* @returns {undefined} Promise that resolves when shutdown is complete
*/
shutdown () {
if (!this.isShutdown) {
this.isShutdown = true
}
}
/**
* Creates a no-op logger for use when the provider is shutdown.
* @returns {Logger} A no-op logger instance
* @private
*/
#createNoOpLogger () {
return {
instrumentationScope: {
name: 'dd-trace-js',
version: '',
},
emit: () => {},
debug: () => {},
info: () => {},
warn: () => {},
error: () => {},
fatal: () => {},
}
}
}
module.exports = LoggerProvider