@owlpane/node 0.1.3 → 0.1.5

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Owlpane
3
+ Copyright (c) 2026 The Owlpane Authors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -15,9 +15,16 @@ owlpane.start({
15
15
  });
16
16
  ```
17
17
 
18
- Everything can also come from environment variables: `OTEL_EXPORTER_OTLP_ENDPOINT`, `OWLPANE_INGEST_KEY`,
18
+ Everything can also come from environment variables: `OTEL_EXPORTER_OTLP_ENDPOINT` or `OWLPANE_INGEST_URL`, `OWLPANE_INGEST_KEY`,
19
19
  `OTEL_SERVICE_NAME`, `OWLPANE_RELEASE`, `OWLPANE_ENVIRONMENT`. Set `OTEL_SDK_DISABLED=true` to switch it off.
20
20
 
21
+ No code change:
22
+
23
+ ```bash
24
+ node --import @owlpane/node/register dist/main.js
25
+ ```
26
+
27
+ - **Runtime boards** — exports Node event-loop, V8, and process metrics to `/v1/metrics` for **Observability → Runtimes → Node.js**. See [Runtime telemetry](../../docs/runtime-telemetry.md).
21
28
  - **Never blocks your app.** Export is batched and fails quietly; the SDK does nothing when no endpoint is set.
22
29
  - **Your key is a write-only credential.** It can send data for one project and cannot read anything.
23
30
  - **Privacy.** Query strings, cookies and authorization headers are removed at the gateway as well as here.
@@ -25,6 +32,11 @@ Everything can also come from environment variables: `OTEL_EXPORTER_OTLP_ENDPOIN
25
32
  Track a background job: `await owlpane.job("nightly-report", "cron", {}, async () => { ... })`.
26
33
  Tag the signed-in user (opaque id only): `owlpane.setUser(user.id)`. Email and name are **not** recorded unless you opt in with `traceUserProfile: true` or `OWLPANE_TRACE_USER_PROFILE=1` (discouraged for production).
27
34
 
35
+ ## CPU profiling (opt-in)
36
+
37
+ `owlpane.start({ profiling: true })` or `OWLPANE_PROFILING=1` takes a 10-second V8 sampling profile (10 ms interval) every minute and sends the functions that used the most CPU as `profile.cpu` spans, which the Profiler page shows as a flame view. They use their own tracer, so `sampleRatio` never drops them. It profiles CPU only (no heap or allocation profile), and the overhead has not been measured: try it on one instance first. `shutdown()` ends the current window early and sends what it has.
38
+
39
+
28
40
  These helpers set the attributes the console pages filter on. They do nothing useful until `start()` has an endpoint, except `mobileResource`, which only returns attributes for you to pass in:
29
41
 
30
42
  | Helper | Attribute | Console page |
@@ -37,6 +49,12 @@ These helpers set the attributes the console pages filter on. They do nothing us
37
49
  | `owlpane.mobileResource("ios" \| "android" \| "ipados", { reactNative: true })` | `os.name`, and `telemetry.sdk.language=react-native` when asked | Mobile, React Native |
38
50
  | `start({ owner, repository })` | `service.owner`, `vcs.repository.url.full` | Service catalog |
39
51
 
52
+ ## Carbon / SCI
53
+
54
+ Install the SDK (or `import '@owlpane/node/register'`) and the unsampled `http.server.request.count` counter is on by default whenever HTTP is instrumented — no extra config for the SCI denominator.
55
+
56
+ **Serverless:** set OpenTelemetry FaaS resource attributes on Lambda, Cloud Functions and similar runtimes so endpoint attribution can rank functions: `faas.name`, `cloud.provider`, `cloud.region`, and `faas.coldstart` on the span when a cold start occurred.
57
+
40
58
  `os.type` follows the OpenTelemetry enum (`darwin` for iOS and iPadOS, `linux` for Android). The Mobile page matches `os.name` (`iOS`, `Android`, `iPadOS`), not a desktop Node process.
41
59
 
42
60
  **LLM usage in Owlpane:** when your app calls the official [`openai`](https://www.npmjs.com/package/openai) client (including Groq via `baseURL: "https://api.groq.com/openai/v1"`), `@opentelemetry/instrumentation-openai` is registered automatically and emits `gen_ai.*` span attributes for the LLM usage page. Disable with `disableInstrumentations: ["@opentelemetry/instrumentation-openai"]`. Raw `fetch` to an LLM API is not instrumented.
package/dist/index.d.ts CHANGED
@@ -39,6 +39,8 @@ export type InitOptions = {
39
39
  disableInstrumentations?: string[];
40
40
  /** When true, setUser may record enduser.email / enduser.name (off by default). */
41
41
  traceUserProfile?: boolean;
42
+ /** CPU profiling: a short V8 sampling profile every minute, sent as `profile.cpu` spans. Off by default; also OWLPANE_PROFILING=1. */
43
+ profiling?: boolean;
42
44
  };
43
45
  /** Whether setUser may attach email/name (requires start({ traceUserProfile: true }) or OWLPANE_TRACE_USER_PROFILE=1). */
44
46
  export declare function traceUserProfileEnabled(): boolean;
package/dist/index.js CHANGED
@@ -30,6 +30,7 @@ const exporter_trace_otlp_http_1 = require("@opentelemetry/exporter-trace-otlp-h
30
30
  const api_logs_1 = require("@opentelemetry/api-logs");
31
31
  const sdk_logs_1 = require("@opentelemetry/sdk-logs");
32
32
  const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
33
+ const profiler_1 = require("./profiler");
33
34
  const signals_1 = require("./signals");
34
35
  Object.defineProperty(exports, "mobileResource", { enumerable: true, get: function () { return signals_1.mobileResource; } });
35
36
  Object.defineProperty(exports, "setExperiment", { enumerable: true, get: function () { return signals_1.setExperiment; } });
@@ -43,12 +44,16 @@ const { resourceFromAttributes } = sdk_node_1.resources;
43
44
  let sdk;
44
45
  let logProvider;
45
46
  let traceUserProfile = false;
47
+ let profiler;
46
48
  /** Whether setUser may attach email/name (requires start({ traceUserProfile: true }) or OWLPANE_TRACE_USER_PROFILE=1). */
47
49
  function traceUserProfileEnabled() {
48
50
  return traceUserProfile;
49
51
  }
50
52
  function endpointOf(o) {
51
- return (o.endpoint?.trim() || process.env.OTEL_EXPORTER_OTLP_ENDPOINT?.trim() || undefined);
53
+ return (o.endpoint?.trim() ||
54
+ process.env.OTEL_EXPORTER_OTLP_ENDPOINT?.trim() ||
55
+ process.env.OWLPANE_INGEST_URL?.trim() ||
56
+ undefined);
52
57
  }
53
58
  /** True once `start()` has turned tracing on (an endpoint was configured and it isn't disabled). */
54
59
  function isEnabled() {
@@ -128,6 +133,25 @@ function start(options = {}) {
128
133
  }),
129
134
  instrumentations: [
130
135
  (0, auto_instrumentations_node_1.getNodeAutoInstrumentations)({
136
+ "@opentelemetry/instrumentation-http": {
137
+ ...off("@opentelemetry/instrumentation-http"),
138
+ applyCustomAttributesOnSpan: (span, request, response) => {
139
+ if (!isIncomingMessage(request))
140
+ return;
141
+ const attrs = span.attributes ?? {};
142
+ const status = Number(response.statusCode ?? 0);
143
+ const route = typeof attrs["http.route"] === "string"
144
+ ? attrs["http.route"]
145
+ : typeof attrs["url.path"] === "string"
146
+ ? attrs["url.path"]
147
+ : request.url ?? "";
148
+ httpRequests().add(1, {
149
+ "http.request.method": String(attrs["http.request.method"] ?? request.method ?? ""),
150
+ "http.route": route,
151
+ "http.response.status_code": Number.isFinite(status) ? status : 0,
152
+ });
153
+ },
154
+ },
131
155
  "@opentelemetry/instrumentation-fs": off("@opentelemetry/instrumentation-fs"),
132
156
  "@opentelemetry/instrumentation-dns": off("@opentelemetry/instrumentation-dns"),
133
157
  // A tcp.connect span per socket and a span per router layer are low-value noise.
@@ -149,10 +173,38 @@ function start(options = {}) {
149
173
  });
150
174
  sdk.start();
151
175
  registerProcessMetrics(serviceName);
176
+ if (options.profiling === true || ["1", "true", "yes"].includes((process.env.OWLPANE_PROFILING ?? "").trim().toLowerCase())) {
177
+ profiler = (0, profiler_1.startProfiler)({ endpoint: baseUrl, headers, resource });
178
+ }
152
179
  }
153
180
  /** Flushes and stops the pipeline. Call on shutdown so the last batch of spans isn't dropped. */
154
181
  function shutdown() {
155
- return Promise.all([sdk?.shutdown(), logProvider?.shutdown()]).then(() => undefined);
182
+ const s = sdk;
183
+ const logs = logProvider;
184
+ const prof = profiler;
185
+ sdk = undefined;
186
+ logProvider = undefined;
187
+ profiler = undefined;
188
+ return Promise.all([s?.shutdown(), logs?.shutdown(), prof?.stop()]).then(() => undefined);
189
+ }
190
+ // ---------- HTTP request counter (unsampled) ----------
191
+ /**
192
+ * Exact request totals for per-request carbon figures (SCI needs a functional unit). Trace sampling
193
+ * must not shrink the denominator, so this counter lives in the metrics pipeline, not in spans: the
194
+ * HTTP instrumentation's response hook runs for sampled and unsampled requests alike. Route and method
195
+ * are read from the finished server span's attributes, so cardinality stays bounded by the app's routes.
196
+ */
197
+ let requestCounter;
198
+ function httpRequests() {
199
+ requestCounter ??= sdk_node_1.api.metrics.getMeter("owlpane-http").createCounter("http.server.request.count", {
200
+ unit: "{request}",
201
+ description: "HTTP requests received, unsampled, by route (feeds per-request carbon figures)",
202
+ });
203
+ return requestCounter;
204
+ }
205
+ /** Outgoing ClientRequest carries `path`; server IncomingMessage carries `url`. */
206
+ function isIncomingMessage(request) {
207
+ return typeof request.httpVersion === "string";
156
208
  }
157
209
  let jobHistogram;
158
210
  function histogram() {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { resources } from "@opentelemetry/sdk-node";
2
+ export type CallFrame = {
3
+ functionName: string;
4
+ url: string;
5
+ lineNumber: number;
6
+ };
7
+ export type CpuProfile = {
8
+ nodes: Array<{
9
+ id: number;
10
+ callFrame: CallFrame;
11
+ }>;
12
+ samples?: number[];
13
+ timeDeltas?: number[];
14
+ };
15
+ export type HotFunction = {
16
+ function: string;
17
+ file: string;
18
+ line: number;
19
+ samples: number;
20
+ selfMs: number;
21
+ };
22
+ /**
23
+ * The functions that used the most CPU in a profile, by self time. A sample's duration is the gap to the next sample (what
24
+ * Chrome DevTools uses); the last sample gets `samplingIntervalUs`. Ties break on name so the result is stable.
25
+ */
26
+ export declare function hotFunctions(profile: CpuProfile, samplingIntervalUs: number, top?: number): HotFunction[];
27
+ export type ProfilerOptions = {
28
+ endpoint: string;
29
+ headers?: Record<string, string>;
30
+ resource: ReturnType<typeof resources.resourceFromAttributes>;
31
+ /** How long each profile runs. Default 10 s. */
32
+ windowMs?: number;
33
+ /** Time between the starts of two windows. Default 60 s. */
34
+ everyMs?: number;
35
+ /** V8 sampling interval in microseconds. Default 10000 (10 ms). */
36
+ samplingIntervalUs?: number;
37
+ };
38
+ export type ProfilerHandle = {
39
+ stop(): Promise<void>;
40
+ };
41
+ export declare function startProfiler(o: ProfilerOptions): ProfilerHandle;
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hotFunctions = hotFunctions;
4
+ exports.startProfiler = startProfiler;
5
+ /**
6
+ * Opt-in CPU profiler. A V8 sampling profile runs for a short window every interval; the functions that used the most CPU in
7
+ * the window are sent as `profile.cpu` spans (`profiling.type=cpu`, `code.function`, `profiling.samples`), which the Owlpane
8
+ * Profiler page turns into a flame view. It uses its own always-on tracer so trace sampling never drops a profile.
9
+ *
10
+ * Turn on with `owlpane.start({ profiling: true })` or OWLPANE_PROFILING=1. CPU only; no heap or allocation profile.
11
+ */
12
+ const node_inspector_1 = require("node:inspector");
13
+ const sdk_node_1 = require("@opentelemetry/sdk-node");
14
+ const exporter_trace_otlp_http_1 = require("@opentelemetry/exporter-trace-otlp-http");
15
+ /** V8 bookkeeping nodes that say nothing about the application. */
16
+ const SKIP = new Set(["(root)", "(program)", "(idle)"]);
17
+ /**
18
+ * The functions that used the most CPU in a profile, by self time. A sample's duration is the gap to the next sample (what
19
+ * Chrome DevTools uses); the last sample gets `samplingIntervalUs`. Ties break on name so the result is stable.
20
+ */
21
+ function hotFunctions(profile, samplingIntervalUs, top = 20) {
22
+ const byId = new Map(profile.nodes.map((n) => [n.id, n.callFrame]));
23
+ const samples = profile.samples ?? [];
24
+ const deltas = profile.timeDeltas ?? [];
25
+ const acc = new Map();
26
+ for (let i = 0; i < samples.length; i++) {
27
+ const frame = byId.get(samples[i]);
28
+ if (!frame || SKIP.has(frame.functionName))
29
+ continue;
30
+ const name = frame.functionName || "(anonymous)";
31
+ const key = `${name}|${frame.url}|${frame.lineNumber}`;
32
+ const us = deltas[i + 1] ?? samplingIntervalUs;
33
+ const cur = acc.get(key) ?? { function: name, file: frame.url, line: frame.lineNumber + 1, samples: 0, selfMs: 0, us: 0 };
34
+ cur.samples += 1;
35
+ cur.us += us;
36
+ acc.set(key, cur);
37
+ }
38
+ return [...acc.values()]
39
+ .map(({ us, ...f }) => ({ ...f, selfMs: Math.round(us) / 1000 }))
40
+ .sort((a, b) => b.samples - a.samples || b.selfMs - a.selfMs || a.function.localeCompare(b.function))
41
+ .slice(0, top);
42
+ }
43
+ function post(session, method, params) {
44
+ return new Promise((resolve, reject) => session.post(method, params, (err, result) => (err ? reject(err) : resolve(result))));
45
+ }
46
+ function startProfiler(o) {
47
+ const windowMs = Math.max(1000, o.windowMs ?? 10_000);
48
+ const everyMs = Math.max(windowMs, o.everyMs ?? 60_000);
49
+ const intervalUs = Math.max(100, o.samplingIntervalUs ?? 10_000);
50
+ const provider = new sdk_node_1.tracing.BasicTracerProvider({
51
+ resource: o.resource,
52
+ spanProcessors: [new sdk_node_1.tracing.BatchSpanProcessor(new exporter_trace_otlp_http_1.OTLPTraceExporter({ url: `${o.endpoint.replace(/\/+$/, "")}/v1/traces`, headers: o.headers }))],
53
+ });
54
+ const tracer = provider.getTracer("owlpane-profiler");
55
+ const session = new node_inspector_1.Session();
56
+ session.connect();
57
+ let timer;
58
+ let stopped = false;
59
+ let endWindowNow;
60
+ let current = Promise.resolve();
61
+ const runWindow = async () => {
62
+ try {
63
+ await post(session, "Profiler.enable");
64
+ await post(session, "Profiler.setSamplingInterval", { interval: intervalUs });
65
+ await post(session, "Profiler.start");
66
+ // stop() ends the window early, so the profile taken so far is still sent.
67
+ await new Promise((resolve) => {
68
+ const t = setTimeout(resolve, windowMs);
69
+ endWindowNow = () => (clearTimeout(t), resolve());
70
+ });
71
+ endWindowNow = undefined;
72
+ const { profile } = await post(session, "Profiler.stop");
73
+ const end = Date.now();
74
+ for (const f of hotFunctions(profile, intervalUs)) {
75
+ const span = tracer.startSpan("profile.cpu", {
76
+ root: true,
77
+ kind: sdk_node_1.api.SpanKind.INTERNAL,
78
+ startTime: end - windowMs,
79
+ attributes: {
80
+ "profiling.type": "cpu",
81
+ "profiling.function": f.function,
82
+ "code.function": f.function,
83
+ "code.filepath": f.file,
84
+ "code.lineno": f.line,
85
+ "profiling.samples": f.samples,
86
+ "profiling.self_ms": f.selfMs,
87
+ "profiling.window_ms": windowMs,
88
+ },
89
+ });
90
+ span.end(end);
91
+ }
92
+ }
93
+ catch {
94
+ // Profiling is best-effort and must never affect the application.
95
+ }
96
+ };
97
+ const schedule = () => {
98
+ if (stopped)
99
+ return;
100
+ timer = setTimeout(() => {
101
+ current = runWindow().then(schedule);
102
+ }, everyMs - windowMs);
103
+ timer.unref();
104
+ };
105
+ current = runWindow().then(schedule);
106
+ return {
107
+ async stop() {
108
+ stopped = true;
109
+ if (timer)
110
+ clearTimeout(timer);
111
+ endWindowNow?.();
112
+ await current;
113
+ session.disconnect();
114
+ await provider.shutdown();
115
+ },
116
+ };
117
+ }
118
+ //# sourceMappingURL=profiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiler.js","sourceRoot":"","sources":["../src/profiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Zero-config entry for `node --import @owlpane/node/register`.
5
+ * Reads OWLPANE_INGEST_KEY, OWLPANE_INGEST_URL or OTEL_EXPORTER_OTLP_ENDPOINT,
6
+ * OTEL_SERVICE_NAME, and OWLPANE_ENVIRONMENT. Does nothing when no endpoint is set.
7
+ */
8
+ const index_1 = require("./index");
9
+ (0, index_1.start)();
10
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":";;AAAA;;;;GAIG;AACH,mCAAgC;AAEhC,IAAA,aAAK,GAAE,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@owlpane/node",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Owlpane telemetry SDK for Node.js: one-line OpenTelemetry setup, job tracing, and user tagging. Optional NestJS helpers at @owlpane/node/nest.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "https://github.com/balaji-singh/owlpane-sdk.git",
8
+ "url": "https://github.com/OwlPane/owlpane-sdk.git",
9
9
  "directory": "packages/node"
10
10
  },
11
11
  "publishConfig": {
@@ -22,6 +22,10 @@
22
22
  "./nest": {
23
23
  "types": "./dist/nest.d.ts",
24
24
  "default": "./dist/nest.js"
25
+ },
26
+ "./register": {
27
+ "types": "./dist/register.d.ts",
28
+ "default": "./dist/register.js"
25
29
  }
26
30
  },
27
31
  "files": [