@logtape/otel 1.3.0-dev.378 → 1.3.0-dev.380
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deno.json +9 -7
- package/dist/deno.cjs +9 -7
- package/dist/deno.js +9 -7
- package/dist/deno.js.map +1 -1
- package/dist/mod.cjs +119 -26
- package/dist/mod.d.cts +81 -16
- package/dist/mod.d.cts.map +1 -1
- package/dist/mod.d.ts +81 -16
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +119 -26
- package/dist/mod.js.map +1 -1
- package/package.json +10 -8
- package/src/mod.test.ts +571 -2
- package/src/mod.ts +303 -66
package/deno.json
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@logtape/otel",
|
|
3
|
-
"version": "1.3.0-dev.
|
|
3
|
+
"version": "1.3.0-dev.380+629db8c8",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./src/mod.ts"
|
|
7
7
|
},
|
|
8
8
|
"imports": {
|
|
9
9
|
"@opentelemetry/api": "npm:@opentelemetry/api@^1.9.0",
|
|
10
|
-
"@opentelemetry/api-logs": "npm:@opentelemetry/api-logs@^0.
|
|
11
|
-
"@opentelemetry/exporter-logs-otlp-
|
|
12
|
-
"@opentelemetry/otlp-
|
|
13
|
-
"@opentelemetry/
|
|
14
|
-
"@opentelemetry/
|
|
15
|
-
"@opentelemetry/
|
|
10
|
+
"@opentelemetry/api-logs": "npm:@opentelemetry/api-logs@^0.208.0",
|
|
11
|
+
"@opentelemetry/exporter-logs-otlp-grpc": "npm:@opentelemetry/exporter-logs-otlp-grpc@^0.208.0",
|
|
12
|
+
"@opentelemetry/exporter-logs-otlp-http": "npm:@opentelemetry/exporter-logs-otlp-http@^0.208.0",
|
|
13
|
+
"@opentelemetry/exporter-logs-otlp-proto": "npm:@opentelemetry/exporter-logs-otlp-proto@^0.208.0",
|
|
14
|
+
"@opentelemetry/otlp-exporter-base": "npm:@opentelemetry/otlp-exporter-base@^0.208.0",
|
|
15
|
+
"@opentelemetry/resources": "npm:@opentelemetry/resources@^2.2.0",
|
|
16
|
+
"@opentelemetry/sdk-logs": "npm:@opentelemetry/sdk-logs@^0.208.0",
|
|
17
|
+
"@opentelemetry/semantic-conventions": "npm:@opentelemetry/semantic-conventions@^1.38.0"
|
|
16
18
|
},
|
|
17
19
|
"tasks": {
|
|
18
20
|
"build": "pnpm build",
|
package/dist/deno.cjs
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
|
|
2
2
|
//#region deno.json
|
|
3
3
|
var name = "@logtape/otel";
|
|
4
|
-
var version = "1.3.0-dev.
|
|
4
|
+
var version = "1.3.0-dev.380+629db8c8";
|
|
5
5
|
var license = "MIT";
|
|
6
6
|
var exports$1 = { ".": "./src/mod.ts" };
|
|
7
7
|
var imports = {
|
|
8
8
|
"@opentelemetry/api": "npm:@opentelemetry/api@^1.9.0",
|
|
9
|
-
"@opentelemetry/api-logs": "npm:@opentelemetry/api-logs@^0.
|
|
10
|
-
"@opentelemetry/exporter-logs-otlp-
|
|
11
|
-
"@opentelemetry/otlp-
|
|
12
|
-
"@opentelemetry/
|
|
13
|
-
"@opentelemetry/
|
|
14
|
-
"@opentelemetry/
|
|
9
|
+
"@opentelemetry/api-logs": "npm:@opentelemetry/api-logs@^0.208.0",
|
|
10
|
+
"@opentelemetry/exporter-logs-otlp-grpc": "npm:@opentelemetry/exporter-logs-otlp-grpc@^0.208.0",
|
|
11
|
+
"@opentelemetry/exporter-logs-otlp-http": "npm:@opentelemetry/exporter-logs-otlp-http@^0.208.0",
|
|
12
|
+
"@opentelemetry/exporter-logs-otlp-proto": "npm:@opentelemetry/exporter-logs-otlp-proto@^0.208.0",
|
|
13
|
+
"@opentelemetry/otlp-exporter-base": "npm:@opentelemetry/otlp-exporter-base@^0.208.0",
|
|
14
|
+
"@opentelemetry/resources": "npm:@opentelemetry/resources@^2.2.0",
|
|
15
|
+
"@opentelemetry/sdk-logs": "npm:@opentelemetry/sdk-logs@^0.208.0",
|
|
16
|
+
"@opentelemetry/semantic-conventions": "npm:@opentelemetry/semantic-conventions@^1.38.0"
|
|
15
17
|
};
|
|
16
18
|
var tasks = {
|
|
17
19
|
"build": "pnpm build",
|
package/dist/deno.js
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
//#region deno.json
|
|
2
2
|
var name = "@logtape/otel";
|
|
3
|
-
var version = "1.3.0-dev.
|
|
3
|
+
var version = "1.3.0-dev.380+629db8c8";
|
|
4
4
|
var license = "MIT";
|
|
5
5
|
var exports = { ".": "./src/mod.ts" };
|
|
6
6
|
var imports = {
|
|
7
7
|
"@opentelemetry/api": "npm:@opentelemetry/api@^1.9.0",
|
|
8
|
-
"@opentelemetry/api-logs": "npm:@opentelemetry/api-logs@^0.
|
|
9
|
-
"@opentelemetry/exporter-logs-otlp-
|
|
10
|
-
"@opentelemetry/otlp-
|
|
11
|
-
"@opentelemetry/
|
|
12
|
-
"@opentelemetry/
|
|
13
|
-
"@opentelemetry/
|
|
8
|
+
"@opentelemetry/api-logs": "npm:@opentelemetry/api-logs@^0.208.0",
|
|
9
|
+
"@opentelemetry/exporter-logs-otlp-grpc": "npm:@opentelemetry/exporter-logs-otlp-grpc@^0.208.0",
|
|
10
|
+
"@opentelemetry/exporter-logs-otlp-http": "npm:@opentelemetry/exporter-logs-otlp-http@^0.208.0",
|
|
11
|
+
"@opentelemetry/exporter-logs-otlp-proto": "npm:@opentelemetry/exporter-logs-otlp-proto@^0.208.0",
|
|
12
|
+
"@opentelemetry/otlp-exporter-base": "npm:@opentelemetry/otlp-exporter-base@^0.208.0",
|
|
13
|
+
"@opentelemetry/resources": "npm:@opentelemetry/resources@^2.2.0",
|
|
14
|
+
"@opentelemetry/sdk-logs": "npm:@opentelemetry/sdk-logs@^0.208.0",
|
|
15
|
+
"@opentelemetry/semantic-conventions": "npm:@opentelemetry/semantic-conventions@^1.38.0"
|
|
14
16
|
};
|
|
15
17
|
var tasks = {
|
|
16
18
|
"build": "pnpm build",
|
package/dist/deno.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deno.js","names":[],"sources":["../deno.json"],"sourcesContent":["{\n \"name\": \"@logtape/otel\",\n \"version\": \"1.3.0-dev.
|
|
1
|
+
{"version":3,"file":"deno.js","names":[],"sources":["../deno.json"],"sourcesContent":["{\n \"name\": \"@logtape/otel\",\n \"version\": \"1.3.0-dev.380+629db8c8\",\n \"license\": \"MIT\",\n \"exports\": {\n \".\": \"./src/mod.ts\"\n },\n \"imports\": {\n \"@opentelemetry/api\": \"npm:@opentelemetry/api@^1.9.0\",\n \"@opentelemetry/api-logs\": \"npm:@opentelemetry/api-logs@^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-grpc\": \"npm:@opentelemetry/exporter-logs-otlp-grpc@^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"npm:@opentelemetry/exporter-logs-otlp-http@^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-proto\": \"npm:@opentelemetry/exporter-logs-otlp-proto@^0.208.0\",\n \"@opentelemetry/otlp-exporter-base\": \"npm:@opentelemetry/otlp-exporter-base@^0.208.0\",\n \"@opentelemetry/resources\": \"npm:@opentelemetry/resources@^2.2.0\",\n \"@opentelemetry/sdk-logs\": \"npm:@opentelemetry/sdk-logs@^0.208.0\",\n \"@opentelemetry/semantic-conventions\": \"npm:@opentelemetry/semantic-conventions@^1.38.0\"\n },\n \"tasks\": {\n \"build\": \"pnpm build\",\n \"test\": \"deno test --allow-net --allow-env\"\n }\n}\n"],"mappings":";WACU;cACG;cACA;cACA,EACT,KAAK,eACN;cACU;CACT,sBAAsB;CACtB,2BAA2B;CAC3B,0CAA0C;CAC1C,0CAA0C;CAC1C,2CAA2C;CAC3C,qCAAqC;CACrC,4BAA4B;CAC5B,2BAA2B;CAC3B,uCAAuC;AACxC;YACQ;CACP,SAAS;CACT,QAAQ;AACT;mBArBH;;;;;;;AAsBC"}
|
package/dist/mod.cjs
CHANGED
|
@@ -3,7 +3,6 @@ const require_deno = require('./deno.cjs');
|
|
|
3
3
|
const __logtape_logtape = require_rolldown_runtime.__toESM(require("@logtape/logtape"));
|
|
4
4
|
const __opentelemetry_api = require_rolldown_runtime.__toESM(require("@opentelemetry/api"));
|
|
5
5
|
const __opentelemetry_api_logs = require_rolldown_runtime.__toESM(require("@opentelemetry/api-logs"));
|
|
6
|
-
const __opentelemetry_exporter_logs_otlp_http = require_rolldown_runtime.__toESM(require("@opentelemetry/exporter-logs-otlp-http"));
|
|
7
6
|
const __opentelemetry_resources = require_rolldown_runtime.__toESM(require("@opentelemetry/resources"));
|
|
8
7
|
const __opentelemetry_sdk_logs = require_rolldown_runtime.__toESM(require("@opentelemetry/sdk-logs"));
|
|
9
8
|
const __opentelemetry_semantic_conventions = require_rolldown_runtime.__toESM(require("@opentelemetry/semantic-conventions"));
|
|
@@ -24,39 +23,133 @@ function getEnvironmentVariable(name) {
|
|
|
24
23
|
return void 0;
|
|
25
24
|
}
|
|
26
25
|
/**
|
|
26
|
+
* Detects the OTLP protocol from environment variables.
|
|
27
|
+
* Priority:
|
|
28
|
+
* 1. `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL`
|
|
29
|
+
* 2. `OTEL_EXPORTER_OTLP_PROTOCOL`
|
|
30
|
+
* 3. Default: `"http/json"` (for backward compatibility)
|
|
31
|
+
*
|
|
32
|
+
* @returns The detected OTLP protocol.
|
|
33
|
+
*/
|
|
34
|
+
function detectOtlpProtocol() {
|
|
35
|
+
const logsProtocol = getEnvironmentVariable("OTEL_EXPORTER_OTLP_LOGS_PROTOCOL");
|
|
36
|
+
if (logsProtocol === "grpc" || logsProtocol === "http/protobuf" || logsProtocol === "http/json") return logsProtocol;
|
|
37
|
+
const protocol = getEnvironmentVariable("OTEL_EXPORTER_OTLP_PROTOCOL");
|
|
38
|
+
if (protocol === "grpc" || protocol === "http/protobuf" || protocol === "http/json") return protocol;
|
|
39
|
+
return "http/json";
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Creates an OTLP log exporter based on the detected protocol.
|
|
43
|
+
* Uses dynamic imports to maintain browser compatibility when gRPC is not used.
|
|
44
|
+
* @param config Optional exporter configuration.
|
|
45
|
+
* @returns A promise that resolves to the appropriate OTLP log exporter.
|
|
46
|
+
*/
|
|
47
|
+
async function createOtlpExporter(config) {
|
|
48
|
+
const protocol = detectOtlpProtocol();
|
|
49
|
+
switch (protocol) {
|
|
50
|
+
case "grpc": {
|
|
51
|
+
const { OTLPLogExporter } = await import("@opentelemetry/exporter-logs-otlp-grpc");
|
|
52
|
+
return new OTLPLogExporter(config);
|
|
53
|
+
}
|
|
54
|
+
case "http/protobuf": {
|
|
55
|
+
const { OTLPLogExporter } = await import("@opentelemetry/exporter-logs-otlp-proto");
|
|
56
|
+
return new OTLPLogExporter(config);
|
|
57
|
+
}
|
|
58
|
+
case "http/json":
|
|
59
|
+
default: {
|
|
60
|
+
const { OTLPLogExporter } = await import("@opentelemetry/exporter-logs-otlp-http");
|
|
61
|
+
return new OTLPLogExporter(config);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Initializes the logger provider asynchronously.
|
|
67
|
+
* This is used when the user doesn't provide a custom logger provider.
|
|
68
|
+
* @param options The exporter options.
|
|
69
|
+
* @returns A promise that resolves to the initialized logger provider.
|
|
70
|
+
*/
|
|
71
|
+
async function initializeLoggerProvider(options) {
|
|
72
|
+
const resource = (0, __opentelemetry_resources.defaultResource)().merge((0, __opentelemetry_resources.resourceFromAttributes)({ [__opentelemetry_semantic_conventions.ATTR_SERVICE_NAME]: options.serviceName ?? getEnvironmentVariable("OTEL_SERVICE_NAME") }));
|
|
73
|
+
const otlpExporter = await createOtlpExporter(options.otlpExporterConfig);
|
|
74
|
+
const loggerProvider = new __opentelemetry_sdk_logs.LoggerProvider({
|
|
75
|
+
resource,
|
|
76
|
+
processors: [new __opentelemetry_sdk_logs.SimpleLogRecordProcessor(otlpExporter)]
|
|
77
|
+
});
|
|
78
|
+
return loggerProvider;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Emits a log record to the OpenTelemetry logger.
|
|
82
|
+
* @param logger The OpenTelemetry logger.
|
|
83
|
+
* @param record The LogTape log record.
|
|
84
|
+
* @param options The sink options.
|
|
85
|
+
*/
|
|
86
|
+
function emitLogRecord(logger, record, options) {
|
|
87
|
+
const objectRenderer = options.objectRenderer ?? "inspect";
|
|
88
|
+
const { category, level, message, timestamp, properties } = record;
|
|
89
|
+
const severityNumber = mapLevelToSeverityNumber(level);
|
|
90
|
+
const attributes = convertToAttributes(properties, objectRenderer);
|
|
91
|
+
attributes["category"] = [...category];
|
|
92
|
+
logger.emit({
|
|
93
|
+
severityNumber,
|
|
94
|
+
severityText: level,
|
|
95
|
+
body: typeof options.messageType === "function" ? convertMessageToCustomBodyFormat(message, objectRenderer, options.messageType) : options.messageType === "array" ? convertMessageToArray(message, objectRenderer) : convertMessageToString(message, objectRenderer),
|
|
96
|
+
attributes,
|
|
97
|
+
timestamp: new Date(timestamp)
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
27
101
|
* Creates a sink that forwards log records to OpenTelemetry.
|
|
102
|
+
*
|
|
103
|
+
* When a custom `loggerProvider` is provided, it is used directly.
|
|
104
|
+
* Otherwise, the sink will lazily initialize a logger provider on the first
|
|
105
|
+
* log record, using the protocol determined by environment variables.
|
|
106
|
+
*
|
|
28
107
|
* @param options Options for creating the sink.
|
|
29
108
|
* @returns The sink.
|
|
30
109
|
*/
|
|
31
110
|
function getOpenTelemetrySink(options = {}) {
|
|
32
111
|
if (options.diagnostics) __opentelemetry_api.diag.setLogger(new DiagLoggerAdaptor(), __opentelemetry_api.DiagLogLevel.DEBUG);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
112
|
+
if (options.loggerProvider != null) {
|
|
113
|
+
const loggerProvider$1 = options.loggerProvider;
|
|
114
|
+
const logger$1 = loggerProvider$1.getLogger(require_deno.default.name, require_deno.default.version);
|
|
115
|
+
const shutdown = loggerProvider$1.shutdown?.bind(loggerProvider$1);
|
|
116
|
+
const sink$1 = Object.assign((record) => {
|
|
117
|
+
const { category } = record;
|
|
118
|
+
if (category[0] === "logtape" && category[1] === "meta" && category[2] === "otel") return;
|
|
119
|
+
emitLogRecord(logger$1, record, options);
|
|
120
|
+
}, { async [Symbol.asyncDispose]() {
|
|
121
|
+
if (shutdown != null) await shutdown();
|
|
122
|
+
} });
|
|
123
|
+
return sink$1;
|
|
124
|
+
}
|
|
125
|
+
let loggerProvider = null;
|
|
126
|
+
let logger = null;
|
|
127
|
+
let initPromise = null;
|
|
128
|
+
let initError = null;
|
|
129
|
+
const sink = Object.assign((record) => {
|
|
130
|
+
const { category } = record;
|
|
44
131
|
if (category[0] === "logtape" && category[1] === "meta" && category[2] === "otel") return;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
132
|
+
if (logger != null) {
|
|
133
|
+
emitLogRecord(logger, record, options);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (initError != null) return;
|
|
137
|
+
if (initPromise == null) initPromise = initializeLoggerProvider(options).then((provider) => {
|
|
138
|
+
loggerProvider = provider;
|
|
139
|
+
logger = provider.getLogger(require_deno.default.name, require_deno.default.version);
|
|
140
|
+
emitLogRecord(logger, record, options);
|
|
141
|
+
}).catch((error) => {
|
|
142
|
+
initError = error;
|
|
143
|
+
console.error("Failed to initialize OpenTelemetry logger:", error);
|
|
54
144
|
});
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
145
|
+
}, { async [Symbol.asyncDispose]() {
|
|
146
|
+
if (initPromise != null) try {
|
|
147
|
+
await initPromise;
|
|
148
|
+
} catch {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (loggerProvider?.shutdown != null) await loggerProvider.shutdown();
|
|
152
|
+
} });
|
|
60
153
|
return sink;
|
|
61
154
|
}
|
|
62
155
|
function mapLevelToSeverityNumber(level) {
|
package/dist/mod.d.cts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Sink } from "@logtape/logtape";
|
|
2
2
|
import { AnyValue, LoggerProvider } from "@opentelemetry/api-logs";
|
|
3
3
|
import { OTLPExporterNodeConfigBase } from "@opentelemetry/otlp-exporter-base";
|
|
4
|
-
import { LogRecordProcessor } from "@opentelemetry/sdk-logs";
|
|
5
4
|
|
|
6
5
|
//#region src/mod.d.ts
|
|
7
6
|
|
|
@@ -9,11 +8,6 @@ import { LogRecordProcessor } from "@opentelemetry/sdk-logs";
|
|
|
9
8
|
* The OpenTelemetry logger provider.
|
|
10
9
|
*/
|
|
11
10
|
type ILoggerProvider = LoggerProvider & {
|
|
12
|
-
/**
|
|
13
|
-
* Adds a new {@link LogRecordProcessor} to this logger.
|
|
14
|
-
* @param processor the new LogRecordProcessor to be added.
|
|
15
|
-
*/
|
|
16
|
-
addLogRecordProcessor(processor: LogRecordProcessor): void;
|
|
17
11
|
/**
|
|
18
12
|
* Flush all buffered data and shut down the LoggerProvider and all registered
|
|
19
13
|
* LogRecordProcessor.
|
|
@@ -36,13 +30,14 @@ type Message = (string | null | undefined)[];
|
|
|
36
30
|
*/
|
|
37
31
|
type BodyFormatter = (message: Message) => AnyValue;
|
|
38
32
|
/**
|
|
39
|
-
*
|
|
33
|
+
* The OTLP protocol to use for exporting logs.
|
|
34
|
+
* @since 0.9.0
|
|
40
35
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
36
|
+
type OtlpProtocol = "grpc" | "http/protobuf" | "http/json";
|
|
37
|
+
/**
|
|
38
|
+
* Base options shared by all OpenTelemetry sink configurations.
|
|
39
|
+
*/
|
|
40
|
+
interface OpenTelemetrySinkOptionsBase {
|
|
46
41
|
/**
|
|
47
42
|
* The way to render the message in the log record. If `"string"`,
|
|
48
43
|
* the message is rendered as a single string with the values are
|
|
@@ -66,24 +61,94 @@ interface OpenTelemetrySinkOptions {
|
|
|
66
61
|
* Turned off by default.
|
|
67
62
|
*/
|
|
68
63
|
diagnostics?: boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Options for creating an OpenTelemetry sink with a custom logger provider.
|
|
67
|
+
* When using this configuration, you are responsible for setting up the
|
|
68
|
+
* logger provider with appropriate exporters and processors.
|
|
69
|
+
*
|
|
70
|
+
* This is the recommended approach for production use as it gives you
|
|
71
|
+
* full control over the OpenTelemetry configuration.
|
|
72
|
+
* @since 0.9.0
|
|
73
|
+
*/
|
|
74
|
+
interface OpenTelemetrySinkProviderOptions extends OpenTelemetrySinkOptionsBase {
|
|
75
|
+
/**
|
|
76
|
+
* The OpenTelemetry logger provider to use.
|
|
77
|
+
*/
|
|
78
|
+
loggerProvider: ILoggerProvider;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Options for creating an OpenTelemetry sink with automatic exporter creation.
|
|
82
|
+
* The protocol is determined by environment variables:
|
|
83
|
+
* - `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` (highest priority)
|
|
84
|
+
* - `OTEL_EXPORTER_OTLP_PROTOCOL` (fallback)
|
|
85
|
+
* - Default: `"http/json"`
|
|
86
|
+
*
|
|
87
|
+
* For production use, consider providing your own {@link ILoggerProvider}
|
|
88
|
+
* via {@link OpenTelemetrySinkProviderOptions} for more control.
|
|
89
|
+
* @since 0.9.0
|
|
90
|
+
*/
|
|
91
|
+
interface OpenTelemetrySinkExporterOptions extends OpenTelemetrySinkOptionsBase {
|
|
92
|
+
/**
|
|
93
|
+
* The OpenTelemetry logger provider to use.
|
|
94
|
+
* Must be undefined or omitted when using exporter options.
|
|
95
|
+
*/
|
|
96
|
+
loggerProvider?: undefined;
|
|
69
97
|
/**
|
|
70
98
|
* The OpenTelemetry OTLP exporter configuration to use.
|
|
71
|
-
* Ignored if `loggerProvider` is provided.
|
|
72
99
|
*/
|
|
73
100
|
otlpExporterConfig?: OTLPExporterNodeConfigBase;
|
|
74
101
|
/**
|
|
75
102
|
* The service name to use. If not provided, the service name is
|
|
76
103
|
* taken from the `OTEL_SERVICE_NAME` environment variable.
|
|
77
|
-
* Ignored if `loggerProvider` is provided.
|
|
78
104
|
*/
|
|
79
105
|
serviceName?: string;
|
|
80
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* Options for creating an OpenTelemetry sink.
|
|
109
|
+
*
|
|
110
|
+
* This is a union type that accepts either:
|
|
111
|
+
* - {@link OpenTelemetrySinkProviderOptions}: Provide your own `loggerProvider`
|
|
112
|
+
* (recommended for production)
|
|
113
|
+
* - {@link OpenTelemetrySinkExporterOptions}: Let the sink create an exporter
|
|
114
|
+
* automatically based on environment variables
|
|
115
|
+
*
|
|
116
|
+
* When no `loggerProvider` is provided, the protocol is determined by:
|
|
117
|
+
* 1. `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` environment variable
|
|
118
|
+
* 2. `OTEL_EXPORTER_OTLP_PROTOCOL` environment variable
|
|
119
|
+
* 3. Default: `"http/json"`
|
|
120
|
+
*
|
|
121
|
+
* @example Using a custom logger provider (recommended)
|
|
122
|
+
* ```typescript
|
|
123
|
+
* import { LoggerProvider, SimpleLogRecordProcessor } from "@opentelemetry/sdk-logs";
|
|
124
|
+
* import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-grpc";
|
|
125
|
+
*
|
|
126
|
+
* const provider = new LoggerProvider();
|
|
127
|
+
* provider.addLogRecordProcessor(new SimpleLogRecordProcessor(new OTLPLogExporter()));
|
|
128
|
+
*
|
|
129
|
+
* const sink = getOpenTelemetrySink({ loggerProvider: provider });
|
|
130
|
+
* ```
|
|
131
|
+
*
|
|
132
|
+
* @example Using automatic exporter creation
|
|
133
|
+
* ```typescript
|
|
134
|
+
* // Protocol determined by OTEL_EXPORTER_OTLP_PROTOCOL env var
|
|
135
|
+
* const sink = getOpenTelemetrySink({
|
|
136
|
+
* serviceName: "my-service",
|
|
137
|
+
* });
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
type OpenTelemetrySinkOptions = OpenTelemetrySinkProviderOptions | OpenTelemetrySinkExporterOptions;
|
|
81
141
|
/**
|
|
82
142
|
* Creates a sink that forwards log records to OpenTelemetry.
|
|
143
|
+
*
|
|
144
|
+
* When a custom `loggerProvider` is provided, it is used directly.
|
|
145
|
+
* Otherwise, the sink will lazily initialize a logger provider on the first
|
|
146
|
+
* log record, using the protocol determined by environment variables.
|
|
147
|
+
*
|
|
83
148
|
* @param options Options for creating the sink.
|
|
84
149
|
* @returns The sink.
|
|
85
150
|
*/
|
|
86
|
-
declare function getOpenTelemetrySink(options?: OpenTelemetrySinkOptions): Sink;
|
|
151
|
+
declare function getOpenTelemetrySink(options?: OpenTelemetrySinkOptions): Sink & AsyncDisposable;
|
|
87
152
|
//#endregion
|
|
88
|
-
export { BodyFormatter, ObjectRenderer, OpenTelemetrySinkOptions, getOpenTelemetrySink };
|
|
153
|
+
export { BodyFormatter, ObjectRenderer, OpenTelemetrySinkExporterOptions, OpenTelemetrySinkOptions, OpenTelemetrySinkProviderOptions, OtlpProtocol, getOpenTelemetrySink };
|
|
89
154
|
//# sourceMappingURL=mod.d.cts.map
|
package/dist/mod.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.cts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mod.d.cts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAcoF;KAqH/E,eAAA,GAAkB,cAAH,GAAA;EAAA;;AAOM;AAS1B;AAAgD;AAQhD;EAAyB,QAAA,CAAA,EAAA,GAAA,GAjBN,OAiBM,CAAA,IAAA,CAAA;CAAA;;AAAiC;AAM1D;AAAkE;;;AAuB/C,KArCP,cAAA,GAqCO,MAAA,GAAA,SAAA;AAAc,KAnC5B,OAAA,GAmC4B,CAAA,MAAA,GAAA,IAAA,GAAA,SAAA,CAAA,EAAA;AAmBjC;;;;AACsC,KAjD1B,aAAA,GAiD0B,CAAA,OAAA,EAjDA,OAiDA,EAAA,GAjDY,QAiDZ;AAkBtC;;;;AACsC,KA9D1B,YAAA,GA8D0B,MAAA,GAAA,eAAA,GAAA,WAAA;AAoDtC;;;UA7GU,4BAAA,CA+GN;EAAgC;AAyEpC;;;;;AAEyB;;;qCAhLY;;;;;;;mBAQlB;;;;;;;;;;;;;;;;;UAmBF,gCAAA,SACP;;;;kBAIQ;;;;;;;;;;;;;UAcD,gCAAA,SACP;;;;;;;;;uBAUa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0CX,wBAAA,GACR,mCACA;;;;;;;;;;;iBAyEY,oBAAA,WACL,2BACR,OAAO"}
|
package/dist/mod.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Sink } from "@logtape/logtape";
|
|
2
2
|
import { AnyValue, LoggerProvider } from "@opentelemetry/api-logs";
|
|
3
|
-
import { LogRecordProcessor } from "@opentelemetry/sdk-logs";
|
|
4
3
|
import { OTLPExporterNodeConfigBase } from "@opentelemetry/otlp-exporter-base";
|
|
5
4
|
|
|
6
5
|
//#region src/mod.d.ts
|
|
@@ -9,11 +8,6 @@ import { OTLPExporterNodeConfigBase } from "@opentelemetry/otlp-exporter-base";
|
|
|
9
8
|
* The OpenTelemetry logger provider.
|
|
10
9
|
*/
|
|
11
10
|
type ILoggerProvider = LoggerProvider & {
|
|
12
|
-
/**
|
|
13
|
-
* Adds a new {@link LogRecordProcessor} to this logger.
|
|
14
|
-
* @param processor the new LogRecordProcessor to be added.
|
|
15
|
-
*/
|
|
16
|
-
addLogRecordProcessor(processor: LogRecordProcessor): void;
|
|
17
11
|
/**
|
|
18
12
|
* Flush all buffered data and shut down the LoggerProvider and all registered
|
|
19
13
|
* LogRecordProcessor.
|
|
@@ -36,13 +30,14 @@ type Message = (string | null | undefined)[];
|
|
|
36
30
|
*/
|
|
37
31
|
type BodyFormatter = (message: Message) => AnyValue;
|
|
38
32
|
/**
|
|
39
|
-
*
|
|
33
|
+
* The OTLP protocol to use for exporting logs.
|
|
34
|
+
* @since 0.9.0
|
|
40
35
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
36
|
+
type OtlpProtocol = "grpc" | "http/protobuf" | "http/json";
|
|
37
|
+
/**
|
|
38
|
+
* Base options shared by all OpenTelemetry sink configurations.
|
|
39
|
+
*/
|
|
40
|
+
interface OpenTelemetrySinkOptionsBase {
|
|
46
41
|
/**
|
|
47
42
|
* The way to render the message in the log record. If `"string"`,
|
|
48
43
|
* the message is rendered as a single string with the values are
|
|
@@ -66,24 +61,94 @@ interface OpenTelemetrySinkOptions {
|
|
|
66
61
|
* Turned off by default.
|
|
67
62
|
*/
|
|
68
63
|
diagnostics?: boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Options for creating an OpenTelemetry sink with a custom logger provider.
|
|
67
|
+
* When using this configuration, you are responsible for setting up the
|
|
68
|
+
* logger provider with appropriate exporters and processors.
|
|
69
|
+
*
|
|
70
|
+
* This is the recommended approach for production use as it gives you
|
|
71
|
+
* full control over the OpenTelemetry configuration.
|
|
72
|
+
* @since 0.9.0
|
|
73
|
+
*/
|
|
74
|
+
interface OpenTelemetrySinkProviderOptions extends OpenTelemetrySinkOptionsBase {
|
|
75
|
+
/**
|
|
76
|
+
* The OpenTelemetry logger provider to use.
|
|
77
|
+
*/
|
|
78
|
+
loggerProvider: ILoggerProvider;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Options for creating an OpenTelemetry sink with automatic exporter creation.
|
|
82
|
+
* The protocol is determined by environment variables:
|
|
83
|
+
* - `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` (highest priority)
|
|
84
|
+
* - `OTEL_EXPORTER_OTLP_PROTOCOL` (fallback)
|
|
85
|
+
* - Default: `"http/json"`
|
|
86
|
+
*
|
|
87
|
+
* For production use, consider providing your own {@link ILoggerProvider}
|
|
88
|
+
* via {@link OpenTelemetrySinkProviderOptions} for more control.
|
|
89
|
+
* @since 0.9.0
|
|
90
|
+
*/
|
|
91
|
+
interface OpenTelemetrySinkExporterOptions extends OpenTelemetrySinkOptionsBase {
|
|
92
|
+
/**
|
|
93
|
+
* The OpenTelemetry logger provider to use.
|
|
94
|
+
* Must be undefined or omitted when using exporter options.
|
|
95
|
+
*/
|
|
96
|
+
loggerProvider?: undefined;
|
|
69
97
|
/**
|
|
70
98
|
* The OpenTelemetry OTLP exporter configuration to use.
|
|
71
|
-
* Ignored if `loggerProvider` is provided.
|
|
72
99
|
*/
|
|
73
100
|
otlpExporterConfig?: OTLPExporterNodeConfigBase;
|
|
74
101
|
/**
|
|
75
102
|
* The service name to use. If not provided, the service name is
|
|
76
103
|
* taken from the `OTEL_SERVICE_NAME` environment variable.
|
|
77
|
-
* Ignored if `loggerProvider` is provided.
|
|
78
104
|
*/
|
|
79
105
|
serviceName?: string;
|
|
80
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* Options for creating an OpenTelemetry sink.
|
|
109
|
+
*
|
|
110
|
+
* This is a union type that accepts either:
|
|
111
|
+
* - {@link OpenTelemetrySinkProviderOptions}: Provide your own `loggerProvider`
|
|
112
|
+
* (recommended for production)
|
|
113
|
+
* - {@link OpenTelemetrySinkExporterOptions}: Let the sink create an exporter
|
|
114
|
+
* automatically based on environment variables
|
|
115
|
+
*
|
|
116
|
+
* When no `loggerProvider` is provided, the protocol is determined by:
|
|
117
|
+
* 1. `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` environment variable
|
|
118
|
+
* 2. `OTEL_EXPORTER_OTLP_PROTOCOL` environment variable
|
|
119
|
+
* 3. Default: `"http/json"`
|
|
120
|
+
*
|
|
121
|
+
* @example Using a custom logger provider (recommended)
|
|
122
|
+
* ```typescript
|
|
123
|
+
* import { LoggerProvider, SimpleLogRecordProcessor } from "@opentelemetry/sdk-logs";
|
|
124
|
+
* import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-grpc";
|
|
125
|
+
*
|
|
126
|
+
* const provider = new LoggerProvider();
|
|
127
|
+
* provider.addLogRecordProcessor(new SimpleLogRecordProcessor(new OTLPLogExporter()));
|
|
128
|
+
*
|
|
129
|
+
* const sink = getOpenTelemetrySink({ loggerProvider: provider });
|
|
130
|
+
* ```
|
|
131
|
+
*
|
|
132
|
+
* @example Using automatic exporter creation
|
|
133
|
+
* ```typescript
|
|
134
|
+
* // Protocol determined by OTEL_EXPORTER_OTLP_PROTOCOL env var
|
|
135
|
+
* const sink = getOpenTelemetrySink({
|
|
136
|
+
* serviceName: "my-service",
|
|
137
|
+
* });
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
type OpenTelemetrySinkOptions = OpenTelemetrySinkProviderOptions | OpenTelemetrySinkExporterOptions;
|
|
81
141
|
/**
|
|
82
142
|
* Creates a sink that forwards log records to OpenTelemetry.
|
|
143
|
+
*
|
|
144
|
+
* When a custom `loggerProvider` is provided, it is used directly.
|
|
145
|
+
* Otherwise, the sink will lazily initialize a logger provider on the first
|
|
146
|
+
* log record, using the protocol determined by environment variables.
|
|
147
|
+
*
|
|
83
148
|
* @param options Options for creating the sink.
|
|
84
149
|
* @returns The sink.
|
|
85
150
|
*/
|
|
86
|
-
declare function getOpenTelemetrySink(options?: OpenTelemetrySinkOptions): Sink;
|
|
151
|
+
declare function getOpenTelemetrySink(options?: OpenTelemetrySinkOptions): Sink & AsyncDisposable;
|
|
87
152
|
//#endregion
|
|
88
|
-
export { BodyFormatter, ObjectRenderer, OpenTelemetrySinkOptions, getOpenTelemetrySink };
|
|
153
|
+
export { BodyFormatter, ObjectRenderer, OpenTelemetrySinkExporterOptions, OpenTelemetrySinkOptions, OpenTelemetrySinkProviderOptions, OtlpProtocol, getOpenTelemetrySink };
|
|
89
154
|
//# sourceMappingURL=mod.d.ts.map
|
package/dist/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mod.d.ts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAcoF;KAqH/E,eAAA,GAAkB,cAAH,GAAA;EAAA;;AAOM;AAS1B;AAAgD;AAQhD;EAAyB,QAAA,CAAA,EAAA,GAAA,GAjBN,OAiBM,CAAA,IAAA,CAAA;CAAA;;AAAiC;AAM1D;AAAkE;;;AAuB/C,KArCP,cAAA,GAqCO,MAAA,GAAA,SAAA;AAAc,KAnC5B,OAAA,GAmC4B,CAAA,MAAA,GAAA,IAAA,GAAA,SAAA,CAAA,EAAA;AAmBjC;;;;AACsC,KAjD1B,aAAA,GAiD0B,CAAA,OAAA,EAjDA,OAiDA,EAAA,GAjDY,QAiDZ;AAkBtC;;;;AACsC,KA9D1B,YAAA,GA8D0B,MAAA,GAAA,eAAA,GAAA,WAAA;AAoDtC;;;UA7GU,4BAAA,CA+GN;EAAgC;AAyEpC;;;;;AAEyB;;;qCAhLY;;;;;;;mBAQlB;;;;;;;;;;;;;;;;;UAmBF,gCAAA,SACP;;;;kBAIQ;;;;;;;;;;;;;UAcD,gCAAA,SACP;;;;;;;;;uBAUa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0CX,wBAAA,GACR,mCACA;;;;;;;;;;;iBAyEY,oBAAA,WACL,2BACR,OAAO"}
|