@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/esm/_dnt.shims.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
const dntGlobals = {};
|
|
2
|
-
export const dntGlobalThis = createMergeProxy(globalThis, dntGlobals);
|
|
3
|
-
function createMergeProxy(baseObj, extObj) {
|
|
4
|
-
return new Proxy(baseObj, {
|
|
5
|
-
get(_target, prop, _receiver) {
|
|
6
|
-
if (prop in extObj) {
|
|
7
|
-
return extObj[prop];
|
|
8
|
-
}
|
|
9
|
-
else {
|
|
10
|
-
return baseObj[prop];
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
set(_target, prop, value) {
|
|
14
|
-
if (prop in extObj) {
|
|
15
|
-
delete extObj[prop];
|
|
16
|
-
}
|
|
17
|
-
baseObj[prop] = value;
|
|
18
|
-
return true;
|
|
19
|
-
},
|
|
20
|
-
deleteProperty(_target, prop) {
|
|
21
|
-
let success = false;
|
|
22
|
-
if (prop in extObj) {
|
|
23
|
-
delete extObj[prop];
|
|
24
|
-
success = true;
|
|
25
|
-
}
|
|
26
|
-
if (prop in baseObj) {
|
|
27
|
-
delete baseObj[prop];
|
|
28
|
-
success = true;
|
|
29
|
-
}
|
|
30
|
-
return success;
|
|
31
|
-
},
|
|
32
|
-
ownKeys(_target) {
|
|
33
|
-
const baseKeys = Reflect.ownKeys(baseObj);
|
|
34
|
-
const extKeys = Reflect.ownKeys(extObj);
|
|
35
|
-
const extKeysSet = new Set(extKeys);
|
|
36
|
-
return [...baseKeys.filter((k) => !extKeysSet.has(k)), ...extKeys];
|
|
37
|
-
},
|
|
38
|
-
defineProperty(_target, prop, desc) {
|
|
39
|
-
if (prop in extObj) {
|
|
40
|
-
delete extObj[prop];
|
|
41
|
-
}
|
|
42
|
-
Reflect.defineProperty(baseObj, prop, desc);
|
|
43
|
-
return true;
|
|
44
|
-
},
|
|
45
|
-
getOwnPropertyDescriptor(_target, prop) {
|
|
46
|
-
if (prop in extObj) {
|
|
47
|
-
return Reflect.getOwnPropertyDescriptor(extObj, prop);
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
return Reflect.getOwnPropertyDescriptor(baseObj, prop);
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
has(_target, prop) {
|
|
54
|
-
return prop in extObj || prop in baseObj;
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
}
|
package/esm/deno.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
"name": "@logtape/otel",
|
|
3
|
-
"version": "0.3.0",
|
|
4
|
-
"license": "MIT",
|
|
5
|
-
"exports": {
|
|
6
|
-
".": "./mod.ts"
|
|
7
|
-
},
|
|
8
|
-
"imports": {
|
|
9
|
-
"@deno/dnt": "jsr:@deno/dnt@^0.41.3",
|
|
10
|
-
"@logtape/logtape": "jsr:@logtape/logtape@^0.4.3",
|
|
11
|
-
"@logtape/otel": "./mod.ts",
|
|
12
|
-
"@opentelemetry/api": "npm:@opentelemetry/api@^1.9.0",
|
|
13
|
-
"@opentelemetry/api-logs": "npm:@opentelemetry/api-logs@^0.52.1",
|
|
14
|
-
"@opentelemetry/exporter-logs-otlp-http": "npm:@opentelemetry/exporter-logs-otlp-http@^0.52.1",
|
|
15
|
-
"@opentelemetry/otlp-exporter-base": "npm:@opentelemetry/otlp-exporter-base@^0.52.1",
|
|
16
|
-
"@opentelemetry/resources": "npm:@opentelemetry/resources@^1.25.1",
|
|
17
|
-
"@opentelemetry/sdk-logs": "npm:@opentelemetry/sdk-logs@^0.52.1",
|
|
18
|
-
"@opentelemetry/semantic-conventions": "npm:@opentelemetry/semantic-conventions@^1.26.0",
|
|
19
|
-
"@std/dotenv": "jsr:@std/dotenv@^0.225.1"
|
|
20
|
-
},
|
|
21
|
-
"tasks": {
|
|
22
|
-
"dnt": "deno run -A dnt.ts"
|
|
23
|
-
}
|
|
24
|
-
};
|
package/esm/mod.js
DELETED
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
-
};
|
|
6
|
-
var _DiagLoggerAdaptor_instances, _DiagLoggerAdaptor_escape;
|
|
7
|
-
import * as dntShim from "./_dnt.shims.js";
|
|
8
|
-
import { getLogger, } from "@logtape/logtape";
|
|
9
|
-
import { diag, DiagLogLevel } from "@opentelemetry/api";
|
|
10
|
-
import { SeverityNumber, } from "@opentelemetry/api-logs";
|
|
11
|
-
import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
|
|
12
|
-
import { Resource } from "@opentelemetry/resources";
|
|
13
|
-
import { LoggerProvider, SimpleLogRecordProcessor, } from "@opentelemetry/sdk-logs";
|
|
14
|
-
import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
|
|
15
|
-
import process from "node:process";
|
|
16
|
-
import metadata from "./deno.js";
|
|
17
|
-
/**
|
|
18
|
-
* Creates a sink that forwards log records to OpenTelemetry.
|
|
19
|
-
* @param options Options for creating the sink.
|
|
20
|
-
* @returns The sink.
|
|
21
|
-
*/
|
|
22
|
-
export function getOpenTelemetrySink(options = {}) {
|
|
23
|
-
if (options.diagnostics) {
|
|
24
|
-
diag.setLogger(new DiagLoggerAdaptor(), DiagLogLevel.DEBUG);
|
|
25
|
-
}
|
|
26
|
-
let loggerProvider;
|
|
27
|
-
if (options.loggerProvider == null) {
|
|
28
|
-
const resource = Resource.default().merge(new Resource({
|
|
29
|
-
[ATTR_SERVICE_NAME]: options.serviceName ??
|
|
30
|
-
process.env.OTEL_SERVICE_NAME,
|
|
31
|
-
}));
|
|
32
|
-
loggerProvider = new LoggerProvider({ resource });
|
|
33
|
-
const otlpExporter = new OTLPLogExporter(options.otlpExporterConfig);
|
|
34
|
-
loggerProvider.addLogRecordProcessor(
|
|
35
|
-
// @ts-ignore: it works anyway...
|
|
36
|
-
new SimpleLogRecordProcessor(otlpExporter));
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
loggerProvider = options.loggerProvider;
|
|
40
|
-
}
|
|
41
|
-
const objectRenderer = options.objectRenderer ?? "inspect";
|
|
42
|
-
const logger = loggerProvider.getLogger(metadata.name, metadata.version);
|
|
43
|
-
const sink = (record) => {
|
|
44
|
-
const { category, level, message, timestamp, properties } = record;
|
|
45
|
-
if (category[0] === "logtape" && category[1] === "meta" &&
|
|
46
|
-
category[2] === "otel") {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const severityNumber = mapLevelToSeverityNumber(level);
|
|
50
|
-
const attributes = convertToAttributes(properties, objectRenderer);
|
|
51
|
-
attributes["category"] = [...category];
|
|
52
|
-
logger.emit({
|
|
53
|
-
severityNumber,
|
|
54
|
-
severityText: level,
|
|
55
|
-
body: typeof options.messageType === "function"
|
|
56
|
-
? convertMessageToCustomBodyFormat(message, objectRenderer, options.messageType)
|
|
57
|
-
: options.messageType === "array"
|
|
58
|
-
? convertMessageToArray(message, objectRenderer)
|
|
59
|
-
: convertMessageToString(message, objectRenderer),
|
|
60
|
-
attributes,
|
|
61
|
-
timestamp: new Date(timestamp),
|
|
62
|
-
});
|
|
63
|
-
};
|
|
64
|
-
if (loggerProvider.shutdown != null) {
|
|
65
|
-
const shutdown = loggerProvider.shutdown.bind(loggerProvider);
|
|
66
|
-
sink[Symbol.asyncDispose] = shutdown;
|
|
67
|
-
}
|
|
68
|
-
return sink;
|
|
69
|
-
}
|
|
70
|
-
function mapLevelToSeverityNumber(level) {
|
|
71
|
-
switch (level) {
|
|
72
|
-
case "debug":
|
|
73
|
-
return SeverityNumber.DEBUG;
|
|
74
|
-
case "info":
|
|
75
|
-
return SeverityNumber.INFO;
|
|
76
|
-
case "warning":
|
|
77
|
-
return SeverityNumber.WARN;
|
|
78
|
-
case "error":
|
|
79
|
-
return SeverityNumber.ERROR;
|
|
80
|
-
case "fatal":
|
|
81
|
-
return SeverityNumber.FATAL;
|
|
82
|
-
default:
|
|
83
|
-
return SeverityNumber.UNSPECIFIED;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
function convertToAttributes(properties, objectRenderer) {
|
|
87
|
-
const attributes = {};
|
|
88
|
-
for (const [name, value] of Object.entries(properties)) {
|
|
89
|
-
const key = `attributes.${name}`;
|
|
90
|
-
if (value == null)
|
|
91
|
-
continue;
|
|
92
|
-
if (Array.isArray(value)) {
|
|
93
|
-
let t = null;
|
|
94
|
-
for (const v of value) {
|
|
95
|
-
if (v == null)
|
|
96
|
-
continue;
|
|
97
|
-
if (t != null && typeof v !== t) {
|
|
98
|
-
attributes[key] = value.map((v) => convertToString(v, objectRenderer));
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
t = typeof v;
|
|
102
|
-
}
|
|
103
|
-
attributes[key] = value;
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
const encoded = convertToString(value, objectRenderer);
|
|
107
|
-
if (encoded == null)
|
|
108
|
-
continue;
|
|
109
|
-
attributes[key] = encoded;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return attributes;
|
|
113
|
-
}
|
|
114
|
-
function convertToString(value, objectRenderer) {
|
|
115
|
-
if (value === null || value === undefined || typeof value === "string") {
|
|
116
|
-
return value;
|
|
117
|
-
}
|
|
118
|
-
if (objectRenderer === "inspect")
|
|
119
|
-
return inspect(value);
|
|
120
|
-
if (typeof value === "number" || typeof value === "boolean") {
|
|
121
|
-
return value.toString();
|
|
122
|
-
}
|
|
123
|
-
else if (value instanceof Date)
|
|
124
|
-
return value.toISOString();
|
|
125
|
-
else
|
|
126
|
-
return JSON.stringify(value);
|
|
127
|
-
}
|
|
128
|
-
function convertMessageToArray(message, objectRenderer) {
|
|
129
|
-
const body = [];
|
|
130
|
-
for (let i = 0; i < message.length; i += 2) {
|
|
131
|
-
const msg = message[i];
|
|
132
|
-
body.push(msg);
|
|
133
|
-
if (message.length <= i + 1)
|
|
134
|
-
break;
|
|
135
|
-
const val = message[i + 1];
|
|
136
|
-
body.push(convertToString(val, objectRenderer));
|
|
137
|
-
}
|
|
138
|
-
return body;
|
|
139
|
-
}
|
|
140
|
-
function convertMessageToString(message, objectRenderer) {
|
|
141
|
-
let body = "";
|
|
142
|
-
for (let i = 0; i < message.length; i += 2) {
|
|
143
|
-
const msg = message[i];
|
|
144
|
-
body += msg;
|
|
145
|
-
if (message.length <= i + 1)
|
|
146
|
-
break;
|
|
147
|
-
const val = message[i + 1];
|
|
148
|
-
const extra = convertToString(val, objectRenderer);
|
|
149
|
-
body += extra ?? JSON.stringify(extra);
|
|
150
|
-
}
|
|
151
|
-
return body;
|
|
152
|
-
}
|
|
153
|
-
function convertMessageToCustomBodyFormat(message, objectRenderer, bodyFormatter) {
|
|
154
|
-
const body = message.map((msg) => convertToString(msg, objectRenderer));
|
|
155
|
-
return bodyFormatter(body);
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* A platform-specific inspect function. In Deno, this is {@link Deno.inspect},
|
|
159
|
-
* and in Node.js/Bun it is {@link util.inspect}. If neither is available, it
|
|
160
|
-
* falls back to {@link JSON.stringify}.
|
|
161
|
-
*
|
|
162
|
-
* @param value The value to inspect.
|
|
163
|
-
* @returns The string representation of the value.
|
|
164
|
-
*/
|
|
165
|
-
const inspect =
|
|
166
|
-
// @ts-ignore: Deno global
|
|
167
|
-
"Deno" in dntShim.dntGlobalThis && "inspect" in globalThis.Deno &&
|
|
168
|
-
// @ts-ignore: Deno global
|
|
169
|
-
typeof globalThis.Deno.inspect === "function"
|
|
170
|
-
// @ts-ignore: Deno global
|
|
171
|
-
? globalThis.Deno.inspect
|
|
172
|
-
// @ts-ignore: Node.js global
|
|
173
|
-
: "util" in dntShim.dntGlobalThis && "inspect" in globalThis.util &&
|
|
174
|
-
// @ts-ignore: Node.js global
|
|
175
|
-
globalThis.util.inspect === "function"
|
|
176
|
-
// @ts-ignore: Node.js global
|
|
177
|
-
? globalThis.util.inspect
|
|
178
|
-
: JSON.stringify;
|
|
179
|
-
class DiagLoggerAdaptor {
|
|
180
|
-
constructor() {
|
|
181
|
-
_DiagLoggerAdaptor_instances.add(this);
|
|
182
|
-
Object.defineProperty(this, "logger", {
|
|
183
|
-
enumerable: true,
|
|
184
|
-
configurable: true,
|
|
185
|
-
writable: true,
|
|
186
|
-
value: void 0
|
|
187
|
-
});
|
|
188
|
-
this.logger = getLogger(["logtape", "meta", "otel"]);
|
|
189
|
-
}
|
|
190
|
-
error(msg, ...values) {
|
|
191
|
-
this.logger.error(`${__classPrivateFieldGet(this, _DiagLoggerAdaptor_instances, "m", _DiagLoggerAdaptor_escape).call(this, msg)}: {values}`, { values });
|
|
192
|
-
}
|
|
193
|
-
warn(msg, ...values) {
|
|
194
|
-
this.logger.warn(`${__classPrivateFieldGet(this, _DiagLoggerAdaptor_instances, "m", _DiagLoggerAdaptor_escape).call(this, msg)}: {values}`, { values });
|
|
195
|
-
}
|
|
196
|
-
info(msg, ...values) {
|
|
197
|
-
this.logger.info(`${__classPrivateFieldGet(this, _DiagLoggerAdaptor_instances, "m", _DiagLoggerAdaptor_escape).call(this, msg)}: {values}`, { values });
|
|
198
|
-
}
|
|
199
|
-
debug(msg, ...values) {
|
|
200
|
-
this.logger.debug(`${__classPrivateFieldGet(this, _DiagLoggerAdaptor_instances, "m", _DiagLoggerAdaptor_escape).call(this, msg)}: {values}`, { values });
|
|
201
|
-
}
|
|
202
|
-
verbose(msg, ...values) {
|
|
203
|
-
this.logger.debug(`${__classPrivateFieldGet(this, _DiagLoggerAdaptor_instances, "m", _DiagLoggerAdaptor_escape).call(this, msg)}: {values}`, { values });
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
_DiagLoggerAdaptor_instances = new WeakSet(), _DiagLoggerAdaptor_escape = function _DiagLoggerAdaptor_escape(msg) {
|
|
207
|
-
return msg.replaceAll("{", "{{").replaceAll("}", "}}");
|
|
208
|
-
};
|
package/esm/package.json
DELETED
package/script/_dnt.shims.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.dntGlobalThis = void 0;
|
|
4
|
-
const dntGlobals = {};
|
|
5
|
-
exports.dntGlobalThis = createMergeProxy(globalThis, dntGlobals);
|
|
6
|
-
function createMergeProxy(baseObj, extObj) {
|
|
7
|
-
return new Proxy(baseObj, {
|
|
8
|
-
get(_target, prop, _receiver) {
|
|
9
|
-
if (prop in extObj) {
|
|
10
|
-
return extObj[prop];
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
return baseObj[prop];
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
set(_target, prop, value) {
|
|
17
|
-
if (prop in extObj) {
|
|
18
|
-
delete extObj[prop];
|
|
19
|
-
}
|
|
20
|
-
baseObj[prop] = value;
|
|
21
|
-
return true;
|
|
22
|
-
},
|
|
23
|
-
deleteProperty(_target, prop) {
|
|
24
|
-
let success = false;
|
|
25
|
-
if (prop in extObj) {
|
|
26
|
-
delete extObj[prop];
|
|
27
|
-
success = true;
|
|
28
|
-
}
|
|
29
|
-
if (prop in baseObj) {
|
|
30
|
-
delete baseObj[prop];
|
|
31
|
-
success = true;
|
|
32
|
-
}
|
|
33
|
-
return success;
|
|
34
|
-
},
|
|
35
|
-
ownKeys(_target) {
|
|
36
|
-
const baseKeys = Reflect.ownKeys(baseObj);
|
|
37
|
-
const extKeys = Reflect.ownKeys(extObj);
|
|
38
|
-
const extKeysSet = new Set(extKeys);
|
|
39
|
-
return [...baseKeys.filter((k) => !extKeysSet.has(k)), ...extKeys];
|
|
40
|
-
},
|
|
41
|
-
defineProperty(_target, prop, desc) {
|
|
42
|
-
if (prop in extObj) {
|
|
43
|
-
delete extObj[prop];
|
|
44
|
-
}
|
|
45
|
-
Reflect.defineProperty(baseObj, prop, desc);
|
|
46
|
-
return true;
|
|
47
|
-
},
|
|
48
|
-
getOwnPropertyDescriptor(_target, prop) {
|
|
49
|
-
if (prop in extObj) {
|
|
50
|
-
return Reflect.getOwnPropertyDescriptor(extObj, prop);
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
return Reflect.getOwnPropertyDescriptor(baseObj, prop);
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
has(_target, prop) {
|
|
57
|
-
return prop in extObj || prop in baseObj;
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
}
|
package/script/deno.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = {
|
|
4
|
-
"name": "@logtape/otel",
|
|
5
|
-
"version": "0.3.0",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"exports": {
|
|
8
|
-
".": "./mod.ts"
|
|
9
|
-
},
|
|
10
|
-
"imports": {
|
|
11
|
-
"@deno/dnt": "jsr:@deno/dnt@^0.41.3",
|
|
12
|
-
"@logtape/logtape": "jsr:@logtape/logtape@^0.4.3",
|
|
13
|
-
"@logtape/otel": "./mod.ts",
|
|
14
|
-
"@opentelemetry/api": "npm:@opentelemetry/api@^1.9.0",
|
|
15
|
-
"@opentelemetry/api-logs": "npm:@opentelemetry/api-logs@^0.52.1",
|
|
16
|
-
"@opentelemetry/exporter-logs-otlp-http": "npm:@opentelemetry/exporter-logs-otlp-http@^0.52.1",
|
|
17
|
-
"@opentelemetry/otlp-exporter-base": "npm:@opentelemetry/otlp-exporter-base@^0.52.1",
|
|
18
|
-
"@opentelemetry/resources": "npm:@opentelemetry/resources@^1.25.1",
|
|
19
|
-
"@opentelemetry/sdk-logs": "npm:@opentelemetry/sdk-logs@^0.52.1",
|
|
20
|
-
"@opentelemetry/semantic-conventions": "npm:@opentelemetry/semantic-conventions@^1.26.0",
|
|
21
|
-
"@std/dotenv": "jsr:@std/dotenv@^0.225.1"
|
|
22
|
-
},
|
|
23
|
-
"tasks": {
|
|
24
|
-
"dnt": "deno run -A dnt.ts"
|
|
25
|
-
}
|
|
26
|
-
};
|
package/script/mod.js
DELETED
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
26
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
27
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
28
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
29
|
-
};
|
|
30
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
|
-
};
|
|
33
|
-
var _DiagLoggerAdaptor_instances, _DiagLoggerAdaptor_escape;
|
|
34
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
-
exports.getOpenTelemetrySink = getOpenTelemetrySink;
|
|
36
|
-
const dntShim = __importStar(require("./_dnt.shims.js"));
|
|
37
|
-
const logtape_1 = require("@logtape/logtape");
|
|
38
|
-
const api_1 = require("@opentelemetry/api");
|
|
39
|
-
const api_logs_1 = require("@opentelemetry/api-logs");
|
|
40
|
-
const exporter_logs_otlp_http_1 = require("@opentelemetry/exporter-logs-otlp-http");
|
|
41
|
-
const resources_1 = require("@opentelemetry/resources");
|
|
42
|
-
const sdk_logs_1 = require("@opentelemetry/sdk-logs");
|
|
43
|
-
const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
44
|
-
const node_process_1 = __importDefault(require("node:process"));
|
|
45
|
-
const deno_js_1 = __importDefault(require("./deno.js"));
|
|
46
|
-
/**
|
|
47
|
-
* Creates a sink that forwards log records to OpenTelemetry.
|
|
48
|
-
* @param options Options for creating the sink.
|
|
49
|
-
* @returns The sink.
|
|
50
|
-
*/
|
|
51
|
-
function getOpenTelemetrySink(options = {}) {
|
|
52
|
-
if (options.diagnostics) {
|
|
53
|
-
api_1.diag.setLogger(new DiagLoggerAdaptor(), api_1.DiagLogLevel.DEBUG);
|
|
54
|
-
}
|
|
55
|
-
let loggerProvider;
|
|
56
|
-
if (options.loggerProvider == null) {
|
|
57
|
-
const resource = resources_1.Resource.default().merge(new resources_1.Resource({
|
|
58
|
-
[semantic_conventions_1.ATTR_SERVICE_NAME]: options.serviceName ??
|
|
59
|
-
node_process_1.default.env.OTEL_SERVICE_NAME,
|
|
60
|
-
}));
|
|
61
|
-
loggerProvider = new sdk_logs_1.LoggerProvider({ resource });
|
|
62
|
-
const otlpExporter = new exporter_logs_otlp_http_1.OTLPLogExporter(options.otlpExporterConfig);
|
|
63
|
-
loggerProvider.addLogRecordProcessor(
|
|
64
|
-
// @ts-ignore: it works anyway...
|
|
65
|
-
new sdk_logs_1.SimpleLogRecordProcessor(otlpExporter));
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
loggerProvider = options.loggerProvider;
|
|
69
|
-
}
|
|
70
|
-
const objectRenderer = options.objectRenderer ?? "inspect";
|
|
71
|
-
const logger = loggerProvider.getLogger(deno_js_1.default.name, deno_js_1.default.version);
|
|
72
|
-
const sink = (record) => {
|
|
73
|
-
const { category, level, message, timestamp, properties } = record;
|
|
74
|
-
if (category[0] === "logtape" && category[1] === "meta" &&
|
|
75
|
-
category[2] === "otel") {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const severityNumber = mapLevelToSeverityNumber(level);
|
|
79
|
-
const attributes = convertToAttributes(properties, objectRenderer);
|
|
80
|
-
attributes["category"] = [...category];
|
|
81
|
-
logger.emit({
|
|
82
|
-
severityNumber,
|
|
83
|
-
severityText: level,
|
|
84
|
-
body: typeof options.messageType === "function"
|
|
85
|
-
? convertMessageToCustomBodyFormat(message, objectRenderer, options.messageType)
|
|
86
|
-
: options.messageType === "array"
|
|
87
|
-
? convertMessageToArray(message, objectRenderer)
|
|
88
|
-
: convertMessageToString(message, objectRenderer),
|
|
89
|
-
attributes,
|
|
90
|
-
timestamp: new Date(timestamp),
|
|
91
|
-
});
|
|
92
|
-
};
|
|
93
|
-
if (loggerProvider.shutdown != null) {
|
|
94
|
-
const shutdown = loggerProvider.shutdown.bind(loggerProvider);
|
|
95
|
-
sink[Symbol.asyncDispose] = shutdown;
|
|
96
|
-
}
|
|
97
|
-
return sink;
|
|
98
|
-
}
|
|
99
|
-
function mapLevelToSeverityNumber(level) {
|
|
100
|
-
switch (level) {
|
|
101
|
-
case "debug":
|
|
102
|
-
return api_logs_1.SeverityNumber.DEBUG;
|
|
103
|
-
case "info":
|
|
104
|
-
return api_logs_1.SeverityNumber.INFO;
|
|
105
|
-
case "warning":
|
|
106
|
-
return api_logs_1.SeverityNumber.WARN;
|
|
107
|
-
case "error":
|
|
108
|
-
return api_logs_1.SeverityNumber.ERROR;
|
|
109
|
-
case "fatal":
|
|
110
|
-
return api_logs_1.SeverityNumber.FATAL;
|
|
111
|
-
default:
|
|
112
|
-
return api_logs_1.SeverityNumber.UNSPECIFIED;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
function convertToAttributes(properties, objectRenderer) {
|
|
116
|
-
const attributes = {};
|
|
117
|
-
for (const [name, value] of Object.entries(properties)) {
|
|
118
|
-
const key = `attributes.${name}`;
|
|
119
|
-
if (value == null)
|
|
120
|
-
continue;
|
|
121
|
-
if (Array.isArray(value)) {
|
|
122
|
-
let t = null;
|
|
123
|
-
for (const v of value) {
|
|
124
|
-
if (v == null)
|
|
125
|
-
continue;
|
|
126
|
-
if (t != null && typeof v !== t) {
|
|
127
|
-
attributes[key] = value.map((v) => convertToString(v, objectRenderer));
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
t = typeof v;
|
|
131
|
-
}
|
|
132
|
-
attributes[key] = value;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
const encoded = convertToString(value, objectRenderer);
|
|
136
|
-
if (encoded == null)
|
|
137
|
-
continue;
|
|
138
|
-
attributes[key] = encoded;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return attributes;
|
|
142
|
-
}
|
|
143
|
-
function convertToString(value, objectRenderer) {
|
|
144
|
-
if (value === null || value === undefined || typeof value === "string") {
|
|
145
|
-
return value;
|
|
146
|
-
}
|
|
147
|
-
if (objectRenderer === "inspect")
|
|
148
|
-
return inspect(value);
|
|
149
|
-
if (typeof value === "number" || typeof value === "boolean") {
|
|
150
|
-
return value.toString();
|
|
151
|
-
}
|
|
152
|
-
else if (value instanceof Date)
|
|
153
|
-
return value.toISOString();
|
|
154
|
-
else
|
|
155
|
-
return JSON.stringify(value);
|
|
156
|
-
}
|
|
157
|
-
function convertMessageToArray(message, objectRenderer) {
|
|
158
|
-
const body = [];
|
|
159
|
-
for (let i = 0; i < message.length; i += 2) {
|
|
160
|
-
const msg = message[i];
|
|
161
|
-
body.push(msg);
|
|
162
|
-
if (message.length <= i + 1)
|
|
163
|
-
break;
|
|
164
|
-
const val = message[i + 1];
|
|
165
|
-
body.push(convertToString(val, objectRenderer));
|
|
166
|
-
}
|
|
167
|
-
return body;
|
|
168
|
-
}
|
|
169
|
-
function convertMessageToString(message, objectRenderer) {
|
|
170
|
-
let body = "";
|
|
171
|
-
for (let i = 0; i < message.length; i += 2) {
|
|
172
|
-
const msg = message[i];
|
|
173
|
-
body += msg;
|
|
174
|
-
if (message.length <= i + 1)
|
|
175
|
-
break;
|
|
176
|
-
const val = message[i + 1];
|
|
177
|
-
const extra = convertToString(val, objectRenderer);
|
|
178
|
-
body += extra ?? JSON.stringify(extra);
|
|
179
|
-
}
|
|
180
|
-
return body;
|
|
181
|
-
}
|
|
182
|
-
function convertMessageToCustomBodyFormat(message, objectRenderer, bodyFormatter) {
|
|
183
|
-
const body = message.map((msg) => convertToString(msg, objectRenderer));
|
|
184
|
-
return bodyFormatter(body);
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* A platform-specific inspect function. In Deno, this is {@link Deno.inspect},
|
|
188
|
-
* and in Node.js/Bun it is {@link util.inspect}. If neither is available, it
|
|
189
|
-
* falls back to {@link JSON.stringify}.
|
|
190
|
-
*
|
|
191
|
-
* @param value The value to inspect.
|
|
192
|
-
* @returns The string representation of the value.
|
|
193
|
-
*/
|
|
194
|
-
const inspect =
|
|
195
|
-
// @ts-ignore: Deno global
|
|
196
|
-
"Deno" in dntShim.dntGlobalThis && "inspect" in globalThis.Deno &&
|
|
197
|
-
// @ts-ignore: Deno global
|
|
198
|
-
typeof globalThis.Deno.inspect === "function"
|
|
199
|
-
// @ts-ignore: Deno global
|
|
200
|
-
? globalThis.Deno.inspect
|
|
201
|
-
// @ts-ignore: Node.js global
|
|
202
|
-
: "util" in dntShim.dntGlobalThis && "inspect" in globalThis.util &&
|
|
203
|
-
// @ts-ignore: Node.js global
|
|
204
|
-
globalThis.util.inspect === "function"
|
|
205
|
-
// @ts-ignore: Node.js global
|
|
206
|
-
? globalThis.util.inspect
|
|
207
|
-
: JSON.stringify;
|
|
208
|
-
class DiagLoggerAdaptor {
|
|
209
|
-
constructor() {
|
|
210
|
-
_DiagLoggerAdaptor_instances.add(this);
|
|
211
|
-
Object.defineProperty(this, "logger", {
|
|
212
|
-
enumerable: true,
|
|
213
|
-
configurable: true,
|
|
214
|
-
writable: true,
|
|
215
|
-
value: void 0
|
|
216
|
-
});
|
|
217
|
-
this.logger = (0, logtape_1.getLogger)(["logtape", "meta", "otel"]);
|
|
218
|
-
}
|
|
219
|
-
error(msg, ...values) {
|
|
220
|
-
this.logger.error(`${__classPrivateFieldGet(this, _DiagLoggerAdaptor_instances, "m", _DiagLoggerAdaptor_escape).call(this, msg)}: {values}`, { values });
|
|
221
|
-
}
|
|
222
|
-
warn(msg, ...values) {
|
|
223
|
-
this.logger.warn(`${__classPrivateFieldGet(this, _DiagLoggerAdaptor_instances, "m", _DiagLoggerAdaptor_escape).call(this, msg)}: {values}`, { values });
|
|
224
|
-
}
|
|
225
|
-
info(msg, ...values) {
|
|
226
|
-
this.logger.info(`${__classPrivateFieldGet(this, _DiagLoggerAdaptor_instances, "m", _DiagLoggerAdaptor_escape).call(this, msg)}: {values}`, { values });
|
|
227
|
-
}
|
|
228
|
-
debug(msg, ...values) {
|
|
229
|
-
this.logger.debug(`${__classPrivateFieldGet(this, _DiagLoggerAdaptor_instances, "m", _DiagLoggerAdaptor_escape).call(this, msg)}: {values}`, { values });
|
|
230
|
-
}
|
|
231
|
-
verbose(msg, ...values) {
|
|
232
|
-
this.logger.debug(`${__classPrivateFieldGet(this, _DiagLoggerAdaptor_instances, "m", _DiagLoggerAdaptor_escape).call(this, msg)}: {values}`, { values });
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
_DiagLoggerAdaptor_instances = new WeakSet(), _DiagLoggerAdaptor_escape = function _DiagLoggerAdaptor_escape(msg) {
|
|
236
|
-
return msg.replaceAll("{", "{{").replaceAll("}", "}}");
|
|
237
|
-
};
|
package/script/package.json
DELETED
package/types/_dnt.shims.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_dnt.shims.d.ts","sourceRoot":"","sources":["../src/_dnt.shims.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,gCAA2C,CAAC"}
|
package/types/deno.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
declare namespace _default {
|
|
2
|
-
let name: string;
|
|
3
|
-
let version: string;
|
|
4
|
-
let license: string;
|
|
5
|
-
let exports: {
|
|
6
|
-
".": string;
|
|
7
|
-
};
|
|
8
|
-
let imports: {
|
|
9
|
-
"@deno/dnt": string;
|
|
10
|
-
"@logtape/logtape": string;
|
|
11
|
-
"@logtape/otel": string;
|
|
12
|
-
"@opentelemetry/api": string;
|
|
13
|
-
"@opentelemetry/api-logs": string;
|
|
14
|
-
"@opentelemetry/exporter-logs-otlp-http": string;
|
|
15
|
-
"@opentelemetry/otlp-exporter-base": string;
|
|
16
|
-
"@opentelemetry/resources": string;
|
|
17
|
-
"@opentelemetry/sdk-logs": string;
|
|
18
|
-
"@opentelemetry/semantic-conventions": string;
|
|
19
|
-
"@std/dotenv": string;
|
|
20
|
-
};
|
|
21
|
-
namespace tasks {
|
|
22
|
-
let dnt: string;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
export default _default;
|
|
26
|
-
//# sourceMappingURL=deno.d.ts.map
|
package/types/deno.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deno.d.ts","sourceRoot":"","sources":["../src/deno.js"],"names":[],"mappings":""}
|