@voltro/plugin-datadog 0.33.0 → 0.35.0
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/CHANGELOG.md +1968 -0
- package/dist/index.js +53 -50
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -2,17 +2,17 @@ import { hostname as e } from "node:os";
|
|
|
2
2
|
import { Effect as t } from "effect";
|
|
3
3
|
import { pluginEnv as n } from "@voltro/env";
|
|
4
4
|
import { addSink as r, createLogger as i, makeBufferedSink as a } from "@voltro/logger";
|
|
5
|
-
import { definePlugin as o } from "@voltro/protocol";
|
|
6
|
-
import { snapshotMetrics as
|
|
5
|
+
import { definePlugin as o, pluginInstanceName as s } from "@voltro/protocol";
|
|
6
|
+
import { snapshotMetrics as c } from "@voltro/runtime";
|
|
7
7
|
//#region src/format.ts
|
|
8
|
-
var
|
|
8
|
+
var l = 3, u = (e) => Object.entries(e).map(([e, t]) => `${e}:${t}`), d = (e, t) => {
|
|
9
9
|
let n = t.prefix ?? "", r = t.globalTags ?? [], i = t.host === void 0 ? void 0 : [{
|
|
10
10
|
type: "host",
|
|
11
11
|
name: t.host
|
|
12
12
|
}], a = [], o = (e, o, s) => {
|
|
13
13
|
a.push({
|
|
14
14
|
metric: `${n}${e}`,
|
|
15
|
-
type:
|
|
15
|
+
type: l,
|
|
16
16
|
points: [{
|
|
17
17
|
timestamp: t.timestamp,
|
|
18
18
|
value: o
|
|
@@ -22,7 +22,7 @@ var c = 3, l = (e) => Object.entries(e).map(([e, t]) => `${e}:${t}`), u = (e, t)
|
|
|
22
22
|
});
|
|
23
23
|
};
|
|
24
24
|
for (let t of e) {
|
|
25
|
-
let e =
|
|
25
|
+
let e = u(t.labels);
|
|
26
26
|
if (t.type === "counter" || t.type === "gauge") o(t.name, t.value ?? 0, e);
|
|
27
27
|
else if (t.type === "histogram") {
|
|
28
28
|
let n = t.count ?? 0, r = t.sum ?? 0;
|
|
@@ -30,14 +30,14 @@ var c = 3, l = (e) => Object.entries(e).map(([e, t]) => `${e}:${t}`), u = (e, t)
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
return { series: a };
|
|
33
|
-
},
|
|
33
|
+
}, f = (e, t = 16) => {
|
|
34
34
|
let n = e.length > t ? e.slice(-t) : e;
|
|
35
35
|
try {
|
|
36
36
|
return BigInt(`0x${n}`).toString(10);
|
|
37
37
|
} catch {
|
|
38
38
|
return "";
|
|
39
39
|
}
|
|
40
|
-
},
|
|
40
|
+
}, p = (e, t = {}) => {
|
|
41
41
|
let n = typeof e.fields.traceId == "string" ? e.fields.traceId : void 0, r = typeof e.fields.spanId == "string" ? e.fields.spanId : void 0, { traceId: i, spanId: a, ...o } = e.fields;
|
|
42
42
|
return {
|
|
43
43
|
message: e.message,
|
|
@@ -50,11 +50,11 @@ var c = 3, l = (e) => Object.entries(e).map(([e, t]) => `${e}:${t}`), u = (e, t)
|
|
|
50
50
|
...o,
|
|
51
51
|
...n ? {
|
|
52
52
|
trace_id: n,
|
|
53
|
-
"dd.trace_id":
|
|
53
|
+
"dd.trace_id": f(n)
|
|
54
54
|
} : {},
|
|
55
|
-
...r ? { "dd.span_id":
|
|
55
|
+
...r ? { "dd.span_id": f(r) } : {}
|
|
56
56
|
};
|
|
57
|
-
},
|
|
57
|
+
}, m = (e, t = {}) => e.map((e) => p(e, t)), h = n([
|
|
58
58
|
{
|
|
59
59
|
name: "DD_API_KEY",
|
|
60
60
|
required: !1,
|
|
@@ -91,17 +91,17 @@ var c = 3, l = (e) => Object.entries(e).map(([e, t]) => `${e}:${t}`), u = (e, t)
|
|
|
91
91
|
secret: !1,
|
|
92
92
|
description: "Datadog Agent OTLP base URL for traces; defaults to http://localhost:4318."
|
|
93
93
|
}
|
|
94
|
-
]),
|
|
95
|
-
let i =
|
|
94
|
+
]), g = i({ scope: "plugin:datadog" }), _ = (n = {}) => {
|
|
95
|
+
let i = h.read("DD_API_KEY", n.apiKey), l = h.read("DD_SITE", n.site) ?? "datadoghq.com", u = n.intervalMs ?? 3e4, f = n.logsIntervalMs ?? 5e3, p = h.read("DD_SERVICE", n.service), _ = h.read("DD_ENV", n.env), v = h.read("DD_VERSION", n.version), y = h.read("DD_TRACE_AGENT_URL", n.agentUrl) ?? "http://localhost:4318", b = n.host ?? e(), x = `https://api.${l}/api/v2/series`, S = `https://http-intake.logs.${l}/api/v2/logs`, C, w, T, E = async () => {
|
|
96
96
|
try {
|
|
97
|
-
let e = await t.runPromise(
|
|
97
|
+
let e = await t.runPromise(c);
|
|
98
98
|
if (e.length === 0) return;
|
|
99
|
-
let r =
|
|
99
|
+
let r = d(e, {
|
|
100
100
|
timestamp: Math.floor(Date.now() / 1e3),
|
|
101
|
-
host:
|
|
101
|
+
host: b,
|
|
102
102
|
...n.prefix === void 0 ? {} : { prefix: n.prefix },
|
|
103
103
|
...n.tags === void 0 ? {} : { globalTags: n.tags }
|
|
104
|
-
}), a = await fetch(
|
|
104
|
+
}), a = await fetch(x, {
|
|
105
105
|
method: "POST",
|
|
106
106
|
headers: {
|
|
107
107
|
"content-type": "application/json",
|
|
@@ -109,18 +109,18 @@ var c = 3, l = (e) => Object.entries(e).map(([e, t]) => `${e}:${t}`), u = (e, t)
|
|
|
109
109
|
},
|
|
110
110
|
body: JSON.stringify(r)
|
|
111
111
|
});
|
|
112
|
-
a.ok ||
|
|
112
|
+
a.ok || g.warn("datadog series POST failed", {
|
|
113
113
|
status: a.status,
|
|
114
114
|
series: r.series.length
|
|
115
115
|
});
|
|
116
116
|
} catch (e) {
|
|
117
|
-
|
|
117
|
+
g.warn("datadog metrics flush errored", { error: String(e) });
|
|
118
118
|
}
|
|
119
|
-
},
|
|
120
|
-
let t =
|
|
121
|
-
...
|
|
119
|
+
}, D = async (e) => {
|
|
120
|
+
let t = m(e, {
|
|
121
|
+
...p ? { service: p } : {},
|
|
122
122
|
...n.tags ? { tags: n.tags } : {}
|
|
123
|
-
}), r = await fetch(
|
|
123
|
+
}), r = await fetch(S, {
|
|
124
124
|
method: "POST",
|
|
125
125
|
headers: {
|
|
126
126
|
"content-type": "application/json",
|
|
@@ -128,43 +128,46 @@ var c = 3, l = (e) => Object.entries(e).map(([e, t]) => `${e}:${t}`), u = (e, t)
|
|
|
128
128
|
},
|
|
129
129
|
body: JSON.stringify(t)
|
|
130
130
|
});
|
|
131
|
-
r.ok ||
|
|
131
|
+
r.ok || g.warn("datadog logs POST failed", {
|
|
132
132
|
status: r.status,
|
|
133
133
|
count: e.length
|
|
134
134
|
});
|
|
135
|
-
},
|
|
136
|
-
...
|
|
137
|
-
...
|
|
138
|
-
...
|
|
139
|
-
}),
|
|
135
|
+
}, O = () => ({
|
|
136
|
+
...p ? { "service.name": p } : {},
|
|
137
|
+
..._ ? { "deployment.environment": _ } : {},
|
|
138
|
+
...v ? { "service.version": v } : {}
|
|
139
|
+
}), k = !!i, A = !!n.logs && !!i, j = (() => {
|
|
140
140
|
try {
|
|
141
|
-
return new URL(
|
|
141
|
+
return new URL(y).host;
|
|
142
142
|
} catch {
|
|
143
143
|
return "localhost";
|
|
144
144
|
}
|
|
145
|
-
})(),
|
|
145
|
+
})(), M = [`network:outbound:${l}`, ...n.traces || n.profiling ? [`network:outbound:${j}`] : []];
|
|
146
146
|
return o({
|
|
147
|
-
name:
|
|
147
|
+
name: s({
|
|
148
|
+
base: "@voltro/plugin-datadog",
|
|
149
|
+
instance: n.name
|
|
150
|
+
}),
|
|
148
151
|
description: "Deep Datadog integration — metrics + logs + traces (OTLP→Agent) + profiling, trace-correlated.",
|
|
149
|
-
permissions:
|
|
150
|
-
declaredEnv:
|
|
152
|
+
permissions: M,
|
|
153
|
+
declaredEnv: h.declared,
|
|
151
154
|
contributeObservability: async (e) => {
|
|
152
155
|
if (n.profiling) try {
|
|
153
156
|
(await import("dd-trace")).default.init({
|
|
154
157
|
profiling: !0,
|
|
155
158
|
tracing: !1,
|
|
156
|
-
...
|
|
157
|
-
...
|
|
158
|
-
...
|
|
159
|
+
...p ? { service: p } : {},
|
|
160
|
+
..._ ? { env: _ } : {},
|
|
161
|
+
...v ? { version: v } : {}
|
|
159
162
|
});
|
|
160
163
|
} catch {
|
|
161
164
|
e.logger.warn("datadog profiling requested but dd-trace is not installed");
|
|
162
165
|
}
|
|
163
|
-
let t =
|
|
166
|
+
let t = O();
|
|
164
167
|
if (!n.traces) return Object.keys(t).length > 0 ? { resourceAttributes: t } : void 0;
|
|
165
168
|
try {
|
|
166
|
-
let { BatchSpanProcessor: n } = await import("@opentelemetry/sdk-trace-base"), { OTLPTraceExporter: r } = await import("@opentelemetry/exporter-trace-otlp-http"), i = new r({ url: `${
|
|
167
|
-
return e.logger.info("datadog traces → agent OTLP", { url: `${
|
|
169
|
+
let { BatchSpanProcessor: n } = await import("@opentelemetry/sdk-trace-base"), { OTLPTraceExporter: r } = await import("@opentelemetry/exporter-trace-otlp-http"), i = new r({ url: `${y.replace(/\/$/, "")}/v1/traces` });
|
|
170
|
+
return e.logger.info("datadog traces → agent OTLP", { url: `${y}/v1/traces` }), {
|
|
168
171
|
spanProcessors: [new n(i)],
|
|
169
172
|
resourceAttributes: t
|
|
170
173
|
};
|
|
@@ -173,28 +176,28 @@ var c = 3, l = (e) => Object.entries(e).map(([e, t]) => `${e}:${t}`), u = (e, t)
|
|
|
173
176
|
}
|
|
174
177
|
},
|
|
175
178
|
onActivate: (e) => t.sync(() => {
|
|
176
|
-
if (
|
|
177
|
-
intervalMs:
|
|
178
|
-
send:
|
|
179
|
+
if (k && (C = setInterval(() => void E(), u), typeof C.unref == "function" && C.unref()), A && (w = a({
|
|
180
|
+
intervalMs: f,
|
|
181
|
+
send: D,
|
|
179
182
|
maxBuffer: 5e3,
|
|
180
|
-
onError: (e) =>
|
|
181
|
-
}),
|
|
183
|
+
onError: (e) => g.warn("datadog logs flush errored", { error: String(e) })
|
|
184
|
+
}), T = r((e) => w?.push(e))), !k && !n.traces && !n.profiling) {
|
|
182
185
|
e.logger.warn("datadog inactive — no DD_API_KEY and no traces/profiling enabled");
|
|
183
186
|
return;
|
|
184
187
|
}
|
|
185
188
|
e.logger.info("datadog active", {
|
|
186
|
-
metrics:
|
|
187
|
-
logs:
|
|
189
|
+
metrics: k,
|
|
190
|
+
logs: A,
|
|
188
191
|
traces: !!n.traces,
|
|
189
192
|
profiling: !!n.profiling,
|
|
190
|
-
service:
|
|
191
|
-
env:
|
|
193
|
+
service: p,
|
|
194
|
+
env: _
|
|
192
195
|
});
|
|
193
196
|
}),
|
|
194
197
|
onDeactivate: () => t.promise(async () => {
|
|
195
|
-
|
|
198
|
+
C && clearInterval(C), C = void 0, T?.(), T = void 0, await w?.dispose(), w = void 0;
|
|
196
199
|
})
|
|
197
200
|
});
|
|
198
201
|
};
|
|
199
202
|
//#endregion
|
|
200
|
-
export {
|
|
203
|
+
export { _ as datadogPlugin, p as toDatadogLog, m as toDatadogLogs, d as toDatadogSeries };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voltro/plugin-datadog",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.0",
|
|
4
4
|
"description": "Deep Datadog integration — agentless metrics push (unified Metrics-API → /api/v2/series) + opt-in log forwarding (dd.trace_id-correlated → /api/v2/logs) + traces (framework OTel spans → Datadog Agent OTLP) + the dd-trace continuous profiler, all correlated by the same trace id. Inert without DD_API_KEY.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"voltro",
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"node": ">=24.0.0"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@voltro/env": "0.
|
|
37
|
-
"@voltro/logger": "0.
|
|
38
|
-
"@voltro/protocol": "0.
|
|
39
|
-
"@voltro/runtime": "0.
|
|
36
|
+
"@voltro/env": "0.35.0",
|
|
37
|
+
"@voltro/logger": "0.35.0",
|
|
38
|
+
"@voltro/protocol": "0.35.0",
|
|
39
|
+
"@voltro/runtime": "0.35.0"
|
|
40
40
|
},
|
|
41
41
|
"optionalDependencies": {
|
|
42
42
|
"@opentelemetry/exporter-trace-otlp-http": "^0.221.0",
|