@logtape/otel 0.3.0 → 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 +9 -45
- package/deno.json +18 -0
- package/dist/_virtual/rolldown_runtime.cjs +30 -0
- package/dist/deno.cjs +31 -0
- package/dist/deno.js +26 -0
- package/dist/deno.js.map +1 -0
- package/dist/mod.cjs +157 -0
- package/dist/mod.d.cts +89 -0
- package/dist/mod.d.cts.map +1 -0
- package/dist/mod.d.ts +89 -0
- package/dist/mod.d.ts.map +1 -0
- package/dist/mod.js +157 -0
- package/dist/mod.js.map +1 -0
- package/mod.ts +336 -0
- package/package.json +34 -33
- package/sample.ts +27 -0
- package/tsdown.config.ts +11 -0
- package/esm/_dnt.shims.js +0 -57
- package/esm/deno.js +0 -24
- package/esm/mod.js +0 -208
- package/esm/package.json +0 -3
- package/script/_dnt.shims.js +0 -60
- package/script/deno.js +0 -26
- package/script/mod.js +0 -237
- package/script/package.json +0 -3
- package/types/_dnt.shims.d.ts +0 -2
- package/types/_dnt.shims.d.ts.map +0 -1
- package/types/deno.d.ts +0 -26
- package/types/deno.d.ts.map +0 -1
- package/types/mod.d.ts +0 -85
- package/types/mod.d.ts.map +0 -1
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
|
|
16
|
-
[GitHub Actions badge]: https://github.com/dahlia/logtape
|
|
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
|
|
28
|
-
npm
|
|
29
|
-
pnpm add
|
|
30
|
-
yarn add
|
|
31
|
-
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"],
|
|
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"],
|
|
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,36 +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.3.0
|
|
155
|
-
|
|
156
|
-
Released on February 26, 2025.
|
|
157
|
-
|
|
158
|
-
- Now you can customize the body formatter. [[#1] by Hyeseong Kim]
|
|
159
|
-
|
|
160
|
-
- Added `BodyFormatter` type.
|
|
161
|
-
- Changed the type of `OpenTelemetrySinkOptions.messageType` to
|
|
162
|
-
`"string" | "array" | BodyFormatter | undefined` (was
|
|
163
|
-
`"string" | "array" | undefined`).
|
|
164
|
-
|
|
165
|
-
[#1]: https://github.com/dahlia/logtape-otel/pull/1
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
### Version 0.2.0
|
|
169
|
-
|
|
170
|
-
Released on August 26, 2024.
|
|
171
|
-
|
|
172
|
-
- The `OpenTelemetrySinkOptions` type is now an interface.
|
|
173
|
-
- Added `OpenTelemetrySinkOptions.messageType` option.
|
|
174
|
-
- Added `OpenTelemetrySinkOptions.objectRenderer` option. Now non-scalar
|
|
175
|
-
values are rendered using `util.inspect()` in Node.js/Bun and
|
|
176
|
-
`Deno.inspect()` in Deno by default.
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
### Version 0.1.0
|
|
180
|
-
|
|
181
|
-
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
|
package/dist/deno.js.map
ADDED
|
@@ -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"}
|