@logtape/otel 0.4.0-dev.8 → 0.12.0-dev.189

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/README.md CHANGED
@@ -12,8 +12,8 @@ send your LogTape logs to OpenTelemetry-compatible backends.
12
12
  [JSR badge]: https://jsr.io/badges/@logtape/otel
13
13
  [npm]: https://www.npmjs.com/package/@logtape/otel
14
14
  [npm badge]: https://img.shields.io/npm/v/@logtape/otel?logo=npm
15
- [GitHub Actions]: https://github.com/dahlia/logtape-otel/actions/workflows/main.yaml
16
- [GitHub Actions badge]: https://github.com/dahlia/logtape-otel/actions/workflows/main.yaml/badge.svg
15
+ [GitHub Actions]: https://github.com/dahlia/logtape/actions/workflows/main.yaml
16
+ [GitHub Actions badge]: https://github.com/dahlia/logtape/actions/workflows/main.yaml/badge.svg
17
17
  [OpenTelemetry]: https://opentelemetry.io/
18
18
  [LogTape]: https://github.com/dahlia/logtape
19
19
 
@@ -24,11 +24,11 @@ Installation
24
24
  The package is available on [JSR] and [npm].
25
25
 
26
26
  ~~~~ bash
27
- deno add @logtape/otel # for Deno
28
- npm add @logtape/otel # for npm
29
- pnpm add @logtape/otel # for pnpm
30
- yarn add @logtape/otel # for Yarn
31
- bun add @logtape/otel # for Bun
27
+ deno add jsr:@logtape/otel # for Deno
28
+ npm add @logtape/otel # for npm
29
+ pnpm add @logtape/otel # for pnpm
30
+ yarn add @logtape/otel # for Yarn
31
+ bun add @logtape/otel # for Bun
32
32
  ~~~~
33
33
 
34
34
 
@@ -46,9 +46,8 @@ await configure({
46
46
  sinks: {
47
47
  otel: getOpenTelemetrySink(),
48
48
  },
49
- filters: {},
50
49
  loggers: [
51
- { category: [], sinks: ["otel"], level: "debug" },
50
+ { category: [], sinks: ["otel"], lowestLevel: "debug" },
52
51
  ],
53
52
  });
54
53
  ~~~~
@@ -74,9 +73,8 @@ await configure({
74
73
  },
75
74
  }),
76
75
  },
77
- filters: {},
78
76
  loggers: [
79
- { category: [], sinks: ["otel"], level: "debug" },
77
+ { category: [], sinks: ["otel"], lowestLevel: "debug" },
80
78
  ],
81
79
  });
82
80
  ~~~~
@@ -103,7 +101,6 @@ await configure({
103
101
  sinks: {
104
102
  otel: getOpenTelemetrySink({ loggerProvider }),
105
103
  },
106
- filters: {},
107
104
  loggers: [
108
105
  { category: [], sinks: ["otel"], level: "debug" },
109
106
  ],
@@ -146,44 +143,3 @@ This will log messages with the `["logtape", "meta", "otel"]` category.
146
143
  These messages are useful for debugging the configuration of the OpenTelemetry
147
144
  sink, but they can be verbose, so it's recommended to enable them only when
148
145
  needed.
149
-
150
-
151
- Changelog
152
- ---------
153
-
154
- ### Version 0.4.0
155
-
156
- To be released.
157
-
158
- - The minimum supported version of LogTape is now 0.12.0, which introduces
159
- `"trace"` log level support.
160
-
161
-
162
- ### Version 0.3.0
163
-
164
- Released on February 26, 2025.
165
-
166
- - Now you can customize the body formatter. [[#1] by Hyeseong Kim]
167
-
168
- - Added `BodyFormatter` type.
169
- - Changed the type of `OpenTelemetrySinkOptions.messageType` to
170
- `"string" | "array" | BodyFormatter | undefined` (was
171
- `"string" | "array" | undefined`).
172
-
173
- [#1]: https://github.com/dahlia/logtape-otel/pull/1
174
-
175
-
176
- ### Version 0.2.0
177
-
178
- Released on August 26, 2024.
179
-
180
- - The `OpenTelemetrySinkOptions` type is now an interface.
181
- - Added `OpenTelemetrySinkOptions.messageType` option.
182
- - Added `OpenTelemetrySinkOptions.objectRenderer` option. Now non-scalar
183
- values are rendered using `util.inspect()` in Node.js/Bun and
184
- `Deno.inspect()` in Deno by default.
185
-
186
-
187
- ### Version 0.1.0
188
-
189
- Released on August 24, 2024. Initial release.
package/deno.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@logtape/otel",
3
+ "version": "0.12.0-dev.189+3e96e3ea",
4
+ "license": "MIT",
5
+ "exports": {
6
+ ".": "./mod.ts"
7
+ },
8
+ "imports": {
9
+ "@opentelemetry/api": "npm:@opentelemetry/api@^1.9.0",
10
+ "@opentelemetry/api-logs": "npm:@opentelemetry/api-logs@^0.202.0",
11
+ "@opentelemetry/exporter-logs-otlp-http": "npm:@opentelemetry/exporter-logs-otlp-http@^0.202.0",
12
+ "@opentelemetry/otlp-exporter-base": "npm:@opentelemetry/otlp-exporter-base@^0.202.0",
13
+ "@opentelemetry/resources": "npm:@opentelemetry/resources@^2.0.1",
14
+ "@opentelemetry/sdk-logs": "npm:@opentelemetry/sdk-logs@^0.202.0",
15
+ "@opentelemetry/semantic-conventions": "npm:@opentelemetry/semantic-conventions@^1.34.0",
16
+ "@std/dotenv": "jsr:@std/dotenv@^0.225.5"
17
+ }
18
+ }
@@ -0,0 +1,30 @@
1
+ //#region rolldown:runtime
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+
23
+ //#endregion
24
+
25
+ Object.defineProperty(exports, '__toESM', {
26
+ enumerable: true,
27
+ get: function () {
28
+ return __toESM;
29
+ }
30
+ });
package/dist/deno.cjs ADDED
@@ -0,0 +1,31 @@
1
+
2
+ //#region deno.json
3
+ var name = "@logtape/otel";
4
+ var version = "0.12.0-dev.189+3e96e3ea";
5
+ var license = "MIT";
6
+ var exports$1 = { ".": "./mod.ts" };
7
+ var imports = {
8
+ "@opentelemetry/api": "npm:@opentelemetry/api@^1.9.0",
9
+ "@opentelemetry/api-logs": "npm:@opentelemetry/api-logs@^0.202.0",
10
+ "@opentelemetry/exporter-logs-otlp-http": "npm:@opentelemetry/exporter-logs-otlp-http@^0.202.0",
11
+ "@opentelemetry/otlp-exporter-base": "npm:@opentelemetry/otlp-exporter-base@^0.202.0",
12
+ "@opentelemetry/resources": "npm:@opentelemetry/resources@^2.0.1",
13
+ "@opentelemetry/sdk-logs": "npm:@opentelemetry/sdk-logs@^0.202.0",
14
+ "@opentelemetry/semantic-conventions": "npm:@opentelemetry/semantic-conventions@^1.34.0",
15
+ "@std/dotenv": "jsr:@std/dotenv@^0.225.5"
16
+ };
17
+ var deno_default = {
18
+ name,
19
+ version,
20
+ license,
21
+ exports: exports$1,
22
+ imports
23
+ };
24
+
25
+ //#endregion
26
+ Object.defineProperty(exports, 'default', {
27
+ enumerable: true,
28
+ get: function () {
29
+ return deno_default;
30
+ }
31
+ });
package/dist/deno.js ADDED
@@ -0,0 +1,26 @@
1
+ //#region deno.json
2
+ var name = "@logtape/otel";
3
+ var version = "0.12.0-dev.189+3e96e3ea";
4
+ var license = "MIT";
5
+ var exports = { ".": "./mod.ts" };
6
+ var imports = {
7
+ "@opentelemetry/api": "npm:@opentelemetry/api@^1.9.0",
8
+ "@opentelemetry/api-logs": "npm:@opentelemetry/api-logs@^0.202.0",
9
+ "@opentelemetry/exporter-logs-otlp-http": "npm:@opentelemetry/exporter-logs-otlp-http@^0.202.0",
10
+ "@opentelemetry/otlp-exporter-base": "npm:@opentelemetry/otlp-exporter-base@^0.202.0",
11
+ "@opentelemetry/resources": "npm:@opentelemetry/resources@^2.0.1",
12
+ "@opentelemetry/sdk-logs": "npm:@opentelemetry/sdk-logs@^0.202.0",
13
+ "@opentelemetry/semantic-conventions": "npm:@opentelemetry/semantic-conventions@^1.34.0",
14
+ "@std/dotenv": "jsr:@std/dotenv@^0.225.5"
15
+ };
16
+ var deno_default = {
17
+ name,
18
+ version,
19
+ license,
20
+ exports,
21
+ imports
22
+ };
23
+
24
+ //#endregion
25
+ export { deno_default as default };
26
+ //# sourceMappingURL=deno.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deno.js","names":[],"sources":["../deno.json"],"sourcesContent":["{\n \"name\": \"@logtape/otel\",\n \"version\": \"0.12.0-dev.189+3e96e3ea\",\n \"license\": \"MIT\",\n \"exports\": {\n \".\": \"./mod.ts\"\n },\n \"imports\": {\n \"@opentelemetry/api\": \"npm:@opentelemetry/api@^1.9.0\",\n \"@opentelemetry/api-logs\": \"npm:@opentelemetry/api-logs@^0.202.0\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"npm:@opentelemetry/exporter-logs-otlp-http@^0.202.0\",\n \"@opentelemetry/otlp-exporter-base\": \"npm:@opentelemetry/otlp-exporter-base@^0.202.0\",\n \"@opentelemetry/resources\": \"npm:@opentelemetry/resources@^2.0.1\",\n \"@opentelemetry/sdk-logs\": \"npm:@opentelemetry/sdk-logs@^0.202.0\",\n \"@opentelemetry/semantic-conventions\": \"npm:@opentelemetry/semantic-conventions@^1.34.0\",\n \"@std/dotenv\": \"jsr:@std/dotenv@^0.225.5\"\n }\n}\n"],"mappings":";WACU;cACG;cACA;cACA,EACT,KAAK,WACN;cACU;CACT,sBAAsB;CACtB,2BAA2B;CAC3B,0CAA0C;CAC1C,qCAAqC;CACrC,4BAA4B;CAC5B,2BAA2B;CAC3B,uCAAuC;CACvC,eAAe;AAChB;mBAhBH;;;;;;AAiBC"}
package/dist/mod.cjs ADDED
@@ -0,0 +1,157 @@
1
+ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ const require_deno = require('./deno.cjs');
3
+ const __logtape_logtape = require_rolldown_runtime.__toESM(require("@logtape/logtape"));
4
+ const __opentelemetry_api = require_rolldown_runtime.__toESM(require("@opentelemetry/api"));
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
+ const __opentelemetry_resources = require_rolldown_runtime.__toESM(require("@opentelemetry/resources"));
8
+ const __opentelemetry_sdk_logs = require_rolldown_runtime.__toESM(require("@opentelemetry/sdk-logs"));
9
+ const __opentelemetry_semantic_conventions = require_rolldown_runtime.__toESM(require("@opentelemetry/semantic-conventions"));
10
+ const node_process = require_rolldown_runtime.__toESM(require("node:process"));
11
+
12
+ //#region mod.ts
13
+ /**
14
+ * Creates a sink that forwards log records to OpenTelemetry.
15
+ * @param options Options for creating the sink.
16
+ * @returns The sink.
17
+ */
18
+ function getOpenTelemetrySink(options = {}) {
19
+ if (options.diagnostics) __opentelemetry_api.diag.setLogger(new DiagLoggerAdaptor(), __opentelemetry_api.DiagLogLevel.DEBUG);
20
+ let loggerProvider;
21
+ if (options.loggerProvider == null) {
22
+ const resource = (0, __opentelemetry_resources.defaultResource)().merge((0, __opentelemetry_resources.resourceFromAttributes)({ [__opentelemetry_semantic_conventions.ATTR_SERVICE_NAME]: options.serviceName ?? node_process.default.env.OTEL_SERVICE_NAME }));
23
+ loggerProvider = new __opentelemetry_sdk_logs.LoggerProvider({ resource });
24
+ const otlpExporter = new __opentelemetry_exporter_logs_otlp_http.OTLPLogExporter(options.otlpExporterConfig);
25
+ loggerProvider.addLogRecordProcessor(new __opentelemetry_sdk_logs.SimpleLogRecordProcessor(otlpExporter));
26
+ } else loggerProvider = options.loggerProvider;
27
+ const objectRenderer = options.objectRenderer ?? "inspect";
28
+ const logger = loggerProvider.getLogger(require_deno.default.name, require_deno.default.version);
29
+ const sink = (record) => {
30
+ const { category, level, message, timestamp, properties } = record;
31
+ if (category[0] === "logtape" && category[1] === "meta" && category[2] === "otel") return;
32
+ const severityNumber = mapLevelToSeverityNumber(level);
33
+ const attributes = convertToAttributes(properties, objectRenderer);
34
+ attributes["category"] = [...category];
35
+ logger.emit({
36
+ severityNumber,
37
+ severityText: level,
38
+ body: typeof options.messageType === "function" ? convertMessageToCustomBodyFormat(message, objectRenderer, options.messageType) : options.messageType === "array" ? convertMessageToArray(message, objectRenderer) : convertMessageToString(message, objectRenderer),
39
+ attributes,
40
+ timestamp: new Date(timestamp)
41
+ });
42
+ };
43
+ if (loggerProvider.shutdown != null) {
44
+ const shutdown = loggerProvider.shutdown.bind(loggerProvider);
45
+ sink[Symbol.asyncDispose] = shutdown;
46
+ }
47
+ return sink;
48
+ }
49
+ function mapLevelToSeverityNumber(level) {
50
+ switch (level) {
51
+ case "trace": return __opentelemetry_api_logs.SeverityNumber.TRACE;
52
+ case "debug": return __opentelemetry_api_logs.SeverityNumber.DEBUG;
53
+ case "info": return __opentelemetry_api_logs.SeverityNumber.INFO;
54
+ case "warning": return __opentelemetry_api_logs.SeverityNumber.WARN;
55
+ case "error": return __opentelemetry_api_logs.SeverityNumber.ERROR;
56
+ case "fatal": return __opentelemetry_api_logs.SeverityNumber.FATAL;
57
+ default: return __opentelemetry_api_logs.SeverityNumber.UNSPECIFIED;
58
+ }
59
+ }
60
+ function convertToAttributes(properties, objectRenderer) {
61
+ const attributes = {};
62
+ for (const [name, value] of Object.entries(properties)) {
63
+ const key = `attributes.${name}`;
64
+ if (value == null) continue;
65
+ if (Array.isArray(value)) {
66
+ let t = null;
67
+ for (const v of value) {
68
+ if (v == null) continue;
69
+ if (t != null && typeof v !== t) {
70
+ attributes[key] = value.map((v$1) => convertToString(v$1, objectRenderer));
71
+ break;
72
+ }
73
+ t = typeof v;
74
+ }
75
+ attributes[key] = value;
76
+ } else {
77
+ const encoded = convertToString(value, objectRenderer);
78
+ if (encoded == null) continue;
79
+ attributes[key] = encoded;
80
+ }
81
+ }
82
+ return attributes;
83
+ }
84
+ function convertToString(value, objectRenderer) {
85
+ if (value === null || value === void 0 || typeof value === "string") return value;
86
+ if (objectRenderer === "inspect") return inspect(value);
87
+ if (typeof value === "number" || typeof value === "boolean") return value.toString();
88
+ else if (value instanceof Date) return value.toISOString();
89
+ else return JSON.stringify(value);
90
+ }
91
+ function convertMessageToArray(message, objectRenderer) {
92
+ const body = [];
93
+ for (let i = 0; i < message.length; i += 2) {
94
+ const msg = message[i];
95
+ body.push(msg);
96
+ if (message.length <= i + 1) break;
97
+ const val = message[i + 1];
98
+ body.push(convertToString(val, objectRenderer));
99
+ }
100
+ return body;
101
+ }
102
+ function convertMessageToString(message, objectRenderer) {
103
+ let body = "";
104
+ for (let i = 0; i < message.length; i += 2) {
105
+ const msg = message[i];
106
+ body += msg;
107
+ if (message.length <= i + 1) break;
108
+ const val = message[i + 1];
109
+ const extra = convertToString(val, objectRenderer);
110
+ body += extra ?? JSON.stringify(extra);
111
+ }
112
+ return body;
113
+ }
114
+ function convertMessageToCustomBodyFormat(message, objectRenderer, bodyFormatter) {
115
+ const body = message.map((msg) => convertToString(msg, objectRenderer));
116
+ return bodyFormatter(body);
117
+ }
118
+ /**
119
+ * A platform-specific inspect function. In Deno, this is {@link Deno.inspect},
120
+ * and in Node.js/Bun it is {@link util.inspect}. If neither is available, it
121
+ * falls back to {@link JSON.stringify}.
122
+ *
123
+ * @param value The value to inspect.
124
+ * @returns The string representation of the value.
125
+ */
126
+ const inspect = "Deno" in globalThis && "inspect" in globalThis.Deno && typeof globalThis.Deno.inspect === "function" ? globalThis.Deno.inspect : "util" in globalThis && "inspect" in globalThis.util && globalThis.util.inspect === "function" ? globalThis.util.inspect : JSON.stringify;
127
+ var DiagLoggerAdaptor = class {
128
+ logger;
129
+ constructor() {
130
+ this.logger = (0, __logtape_logtape.getLogger)([
131
+ "logtape",
132
+ "meta",
133
+ "otel"
134
+ ]);
135
+ }
136
+ #escape(msg) {
137
+ return msg.replaceAll("{", "{{").replaceAll("}", "}}");
138
+ }
139
+ error(msg, ...values) {
140
+ this.logger.error(`${this.#escape(msg)}: {values}`, { values });
141
+ }
142
+ warn(msg, ...values) {
143
+ this.logger.warn(`${this.#escape(msg)}: {values}`, { values });
144
+ }
145
+ info(msg, ...values) {
146
+ this.logger.info(`${this.#escape(msg)}: {values}`, { values });
147
+ }
148
+ debug(msg, ...values) {
149
+ this.logger.debug(`${this.#escape(msg)}: {values}`, { values });
150
+ }
151
+ verbose(msg, ...values) {
152
+ this.logger.debug(`${this.#escape(msg)}: {values}`, { values });
153
+ }
154
+ };
155
+
156
+ //#endregion
157
+ exports.getOpenTelemetrySink = getOpenTelemetrySink;
package/dist/mod.d.cts ADDED
@@ -0,0 +1,89 @@
1
+ import { Sink } from "@logtape/logtape";
2
+ import { AnyValue, LoggerProvider } from "@opentelemetry/api-logs";
3
+ import { OTLPExporterNodeConfigBase } from "@opentelemetry/otlp-exporter-base";
4
+ import { LogRecordProcessor } from "@opentelemetry/sdk-logs";
5
+
6
+ //#region mod.d.ts
7
+
8
+ /**
9
+ * The OpenTelemetry logger provider.
10
+ */
11
+ 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
+ /**
18
+ * Flush all buffered data and shut down the LoggerProvider and all registered
19
+ * LogRecordProcessor.
20
+ *
21
+ * Returns a promise which is resolved when all flushes are complete.
22
+ */
23
+ shutdown?: () => Promise<void>;
24
+ };
25
+ /**
26
+ * The way to render the object in the log record. If `"json"`,
27
+ * the object is rendered as a JSON string. If `"inspect"`,
28
+ * the object is rendered using `util.inspect` in Node.js/Bun, or
29
+ * `Deno.inspect` in Deno.
30
+ */
31
+ type ObjectRenderer = "json" | "inspect";
32
+ type Message = (string | null | undefined)[];
33
+ /**
34
+ * Custom `body` attribute formatter.
35
+ * @since 0.3.0
36
+ */
37
+ type BodyFormatter = (message: Message) => AnyValue;
38
+ /**
39
+ * Options for creating an OpenTelemetry sink.
40
+ */
41
+ interface OpenTelemetrySinkOptions {
42
+ /**
43
+ * The OpenTelemetry logger provider to use.
44
+ */
45
+ loggerProvider?: ILoggerProvider;
46
+ /**
47
+ * The way to render the message in the log record. If `"string"`,
48
+ * the message is rendered as a single string with the values are
49
+ * interpolated into the message. If `"array"`, the message is
50
+ * rendered as an array of strings. `"string"` by default.
51
+ *
52
+ * Or even fully customizable with a {@link BodyFormatter} function.
53
+ * @since 0.2.0
54
+ */
55
+ messageType?: "string" | "array" | BodyFormatter;
56
+ /**
57
+ * The way to render the object in the log record. If `"json"`,
58
+ * the object is rendered as a JSON string. If `"inspect"`,
59
+ * the object is rendered using `util.inspect` in Node.js/Bun, or
60
+ * `Deno.inspect` in Deno. `"inspect"` by default.
61
+ */
62
+ objectRenderer?: ObjectRenderer;
63
+ /**
64
+ * Whether to log diagnostics. Diagnostic logs are logged to
65
+ * the `["logtape", "meta", "otel"]` category.
66
+ * Turned off by default.
67
+ */
68
+ diagnostics?: boolean;
69
+ /**
70
+ * The OpenTelemetry OTLP exporter configuration to use.
71
+ * Ignored if `loggerProvider` is provided.
72
+ */
73
+ otlpExporterConfig?: OTLPExporterNodeConfigBase;
74
+ /**
75
+ * The service name to use. If not provided, the service name is
76
+ * taken from the `OTEL_SERVICE_NAME` environment variable.
77
+ * Ignored if `loggerProvider` is provided.
78
+ */
79
+ serviceName?: string;
80
+ }
81
+ /**
82
+ * Creates a sink that forwards log records to OpenTelemetry.
83
+ * @param options Options for creating the sink.
84
+ * @returns The sink.
85
+ */
86
+ declare function getOpenTelemetrySink(options?: OpenTelemetrySinkOptions): Sink;
87
+ //#endregion
88
+ export { BodyFormatter, ObjectRenderer, OpenTelemetrySinkOptions, getOpenTelemetrySink };
89
+ //# sourceMappingURL=mod.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.cts","names":[],"sources":["../mod.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAuBiC;KAQ5B,eAAA,GAAkB,cAAH,GAAA;EAAA;;;AAaM;EASd,qBAAc,CAAA,SAAA,EAjBS,kBAiBT,CAAA,EAAA,IAAA;EAErB;AAML;;;;AAA0D;EAKzC,QAAA,CAAA,EAAA,GAAA,GAtBE,OAsBF,CAAA,IAAwB,CAAA;CAAA;;;;;AAoCQ;AAejD;AAAoC,KAhExB,cAAA,GAgEwB,MAAA,GAAA,SAAA;KA9D/B,OAAA,GA+DM,CAAA,MAAA,GAAA,IAAA,GAAA,SAAA,CAAA,EAAA;;AACJ;;;KA1DK,aAAA,aAA0B,YAAY;;;;UAKjC,wBAAA;;;;mBAIE;;;;;;;;;;qCAWkB;;;;;;;mBAQlB;;;;;;;;;;;uBAaI;;;;;;;;;;;;;iBAeP,oBAAA,WACL,2BACR"}
package/dist/mod.d.ts ADDED
@@ -0,0 +1,89 @@
1
+ import { Sink } from "@logtape/logtape";
2
+ import { AnyValue, LoggerProvider } from "@opentelemetry/api-logs";
3
+ import { LogRecordProcessor } from "@opentelemetry/sdk-logs";
4
+ import { OTLPExporterNodeConfigBase } from "@opentelemetry/otlp-exporter-base";
5
+
6
+ //#region mod.d.ts
7
+
8
+ /**
9
+ * The OpenTelemetry logger provider.
10
+ */
11
+ 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
+ /**
18
+ * Flush all buffered data and shut down the LoggerProvider and all registered
19
+ * LogRecordProcessor.
20
+ *
21
+ * Returns a promise which is resolved when all flushes are complete.
22
+ */
23
+ shutdown?: () => Promise<void>;
24
+ };
25
+ /**
26
+ * The way to render the object in the log record. If `"json"`,
27
+ * the object is rendered as a JSON string. If `"inspect"`,
28
+ * the object is rendered using `util.inspect` in Node.js/Bun, or
29
+ * `Deno.inspect` in Deno.
30
+ */
31
+ type ObjectRenderer = "json" | "inspect";
32
+ type Message = (string | null | undefined)[];
33
+ /**
34
+ * Custom `body` attribute formatter.
35
+ * @since 0.3.0
36
+ */
37
+ type BodyFormatter = (message: Message) => AnyValue;
38
+ /**
39
+ * Options for creating an OpenTelemetry sink.
40
+ */
41
+ interface OpenTelemetrySinkOptions {
42
+ /**
43
+ * The OpenTelemetry logger provider to use.
44
+ */
45
+ loggerProvider?: ILoggerProvider;
46
+ /**
47
+ * The way to render the message in the log record. If `"string"`,
48
+ * the message is rendered as a single string with the values are
49
+ * interpolated into the message. If `"array"`, the message is
50
+ * rendered as an array of strings. `"string"` by default.
51
+ *
52
+ * Or even fully customizable with a {@link BodyFormatter} function.
53
+ * @since 0.2.0
54
+ */
55
+ messageType?: "string" | "array" | BodyFormatter;
56
+ /**
57
+ * The way to render the object in the log record. If `"json"`,
58
+ * the object is rendered as a JSON string. If `"inspect"`,
59
+ * the object is rendered using `util.inspect` in Node.js/Bun, or
60
+ * `Deno.inspect` in Deno. `"inspect"` by default.
61
+ */
62
+ objectRenderer?: ObjectRenderer;
63
+ /**
64
+ * Whether to log diagnostics. Diagnostic logs are logged to
65
+ * the `["logtape", "meta", "otel"]` category.
66
+ * Turned off by default.
67
+ */
68
+ diagnostics?: boolean;
69
+ /**
70
+ * The OpenTelemetry OTLP exporter configuration to use.
71
+ * Ignored if `loggerProvider` is provided.
72
+ */
73
+ otlpExporterConfig?: OTLPExporterNodeConfigBase;
74
+ /**
75
+ * The service name to use. If not provided, the service name is
76
+ * taken from the `OTEL_SERVICE_NAME` environment variable.
77
+ * Ignored if `loggerProvider` is provided.
78
+ */
79
+ serviceName?: string;
80
+ }
81
+ /**
82
+ * Creates a sink that forwards log records to OpenTelemetry.
83
+ * @param options Options for creating the sink.
84
+ * @returns The sink.
85
+ */
86
+ declare function getOpenTelemetrySink(options?: OpenTelemetrySinkOptions): Sink;
87
+ //#endregion
88
+ export { BodyFormatter, ObjectRenderer, OpenTelemetrySinkOptions, getOpenTelemetrySink };
89
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","names":[],"sources":["../mod.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAuBiC;KAQ5B,eAAA,GAAkB,cAAH,GAAA;EAAA;;;AAaM;EASd,qBAAc,CAAA,SAAA,EAjBS,kBAiBT,CAAA,EAAA,IAAA;EAErB;AAML;;;;AAA0D;EAKzC,QAAA,CAAA,EAAA,GAAA,GAtBE,OAsBF,CAAA,IAAwB,CAAA;CAAA;;;;;AAoCQ;AAejD;AAAoC,KAhExB,cAAA,GAgEwB,MAAA,GAAA,SAAA;KA9D/B,OAAA,GA+DM,CAAA,MAAA,GAAA,IAAA,GAAA,SAAA,CAAA,EAAA;;AACJ;;;KA1DK,aAAA,aAA0B,YAAY;;;;UAKjC,wBAAA;;;;mBAIE;;;;;;;;;;qCAWkB;;;;;;;mBAQlB;;;;;;;;;;;uBAaI;;;;;;;;;;;;;iBAeP,oBAAA,WACL,2BACR"}