@interfere/node 0.1.0-canary.9 → 0.1.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/dist/init.cjs +2 -2
- package/dist/init.mjs +2 -2
- package/dist/otel-config.cjs +1 -0
- package/dist/otel-config.d.cts +58 -0
- package/dist/otel-config.d.mts +58 -0
- package/dist/otel-config.mjs +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.mjs +1 -1
- package/package.json +17 -6
package/dist/init.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_internal_global_handlers=require("./internal/global-handlers.cjs"),require_internal_version=require("./internal/version.cjs"),require_otel_config=require("./otel-config.cjs");let _opentelemetry_context_async_hooks=require("@opentelemetry/context-async-hooks"),_opentelemetry_sdk_trace_node=require("@opentelemetry/sdk-trace-node"),provider=null;function init(options={}){if(provider)return;let debug=options.debug??process.env.INTERFERE_DEBUG===`1`,serviceName=options.serviceName??process.env.OTEL_SERVICE_NAME??`node-app`,config=require_otel_config.resolveOtelConfig({serviceName,serviceNamespace:options.serviceNamespace,environment:options.environment,sdkName:`@interfere/node`,producerVersion:require_internal_version.PRODUCER_VERSION,debug});if(!config){console.warn(`[interfere] INTERFERE_PUBLIC_KEY not set; SDK disabled`);return}config.releaseSlug||console.warn(`[interfere] No release slug resolved — the collector will reject spans. Add a postbuild script to your package.json:
|
|
2
2
|
"postbuild": "interfere sourcemaps upload ./dist"
|
|
3
|
-
and set INTERFERE_API_KEY in your CI environment. See https://interfere.com/docs/nest#releases`)
|
|
3
|
+
and set INTERFERE_API_KEY in your CI environment. See https://interfere.com/docs/nest#releases`),provider=new _opentelemetry_sdk_trace_node.NodeTracerProvider({resource:config.resource,spanProcessors:config.spanProcessors}),provider.register({contextManager:new _opentelemetry_context_async_hooks.AsyncLocalStorageContextManager().enable()}),require_internal_global_handlers.installGlobalHandlers({captureUncaughtException:options.captureUncaughtException??!0,captureUnhandledRejection:options.captureUnhandledRejection??!0,flush}),debug&&(console.log(`[interfere] init: service=${serviceName}, env=${config.environment}, endpoint=${config.endpoint}`),config.releaseSlug&&console.log(`[interfere] release.slug=${config.releaseSlug}`))}async function close(){provider&&=(require_internal_global_handlers.uninstallGlobalHandlers(),await provider.shutdown(),null)}async function flush(){provider&&await provider.forceFlush()}exports.close=close,exports.flush=flush,exports.init=init;
|
package/dist/init.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{installGlobalHandlers,uninstallGlobalHandlers}from"./internal/global-handlers.mjs";import{PRODUCER_VERSION}from"./internal/version.mjs";import{resolveOtelConfig}from"./otel-config.mjs";import{AsyncLocalStorageContextManager}from"@opentelemetry/context-async-hooks";import{NodeTracerProvider}from"@opentelemetry/sdk-trace-node";let provider=null;function init(options={}){if(provider)return;let debug=options.debug??process.env.INTERFERE_DEBUG===`1`,serviceName=options.serviceName??process.env.OTEL_SERVICE_NAME??`node-app`,config=resolveOtelConfig({serviceName,serviceNamespace:options.serviceNamespace,environment:options.environment,sdkName:`@interfere/node`,producerVersion:PRODUCER_VERSION,debug});if(!config){console.warn(`[interfere] INTERFERE_PUBLIC_KEY not set; SDK disabled`);return}config.releaseSlug||console.warn(`[interfere] No release slug resolved — the collector will reject spans. Add a postbuild script to your package.json:
|
|
2
2
|
"postbuild": "interfere sourcemaps upload ./dist"
|
|
3
|
-
and set INTERFERE_API_KEY in your CI environment. See https://interfere.com/docs/nest#releases`)
|
|
3
|
+
and set INTERFERE_API_KEY in your CI environment. See https://interfere.com/docs/nest#releases`),provider=new NodeTracerProvider({resource:config.resource,spanProcessors:config.spanProcessors}),provider.register({contextManager:new AsyncLocalStorageContextManager().enable()}),installGlobalHandlers({captureUncaughtException:options.captureUncaughtException??!0,captureUnhandledRejection:options.captureUnhandledRejection??!0,flush}),debug&&(console.log(`[interfere] init: service=${serviceName}, env=${config.environment}, endpoint=${config.endpoint}`),config.releaseSlug&&console.log(`[interfere] release.slug=${config.releaseSlug}`))}async function close(){provider&&=(uninstallGlobalHandlers(),await provider.shutdown(),null)}async function flush(){provider&&await provider.forceFlush()}export{close,flush,init};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_internal_env=require("./internal/env.cjs"),require_internal_global_handlers=require("./internal/global-handlers.cjs"),require_internal_release_slug=require("./internal/release-slug.cjs"),require_internal_url=require("./internal/url.cjs");let _interfere_constants_api=require("@interfere/constants/api"),_interfere_types_releases_slug=require("@interfere/types/releases/slug"),_interfere_types_sdk_runtime=require("@interfere/types/sdk/runtime"),_opentelemetry_exporter_trace_otlp_http=require("@opentelemetry/exporter-trace-otlp-http"),_opentelemetry_resources=require("@opentelemetry/resources"),_opentelemetry_sdk_trace_base=require("@opentelemetry/sdk-trace-base");function resolveOtelConfig(options){let env=require_internal_env.readInterfereEnv();if(!env.publicKey)return null;let environment=(0,_interfere_types_sdk_runtime.resolveEnvironment)({explicit:options.environment,env:process.env}),releaseSlug=env.forceEnable?_interfere_types_releases_slug.LOCAL_DEV_RELEASE_SLUG:require_internal_release_slug.resolveReleaseSlug().slug,endpoint=require_internal_url.withPublicKey(`${env.apiUrl}${_interfere_constants_api.API_PATHS.SINK}`,env.publicKey),exporter=new _opentelemetry_exporter_trace_otlp_http.OTLPTraceExporter({url:endpoint,headers:{"user-agent":options.producerVersion,"x-interfere-producer-version":options.producerVersion,...env.forceEnable?{"x-interfere-force-enable":`1`}:{}}});return options.debug&&instrumentExporterLogging(exporter),{endpoint,environment,releaseSlug,resource:(0,_opentelemetry_resources.resourceFromAttributes)({"service.name":options.serviceName,...options.serviceNamespace?{"service.namespace":options.serviceNamespace}:{},"deployment.environment.name":environment,"telemetry.sdk.language":`nodejs`,"interfere.sdk.name":options.sdkName,"interfere.sdk.version":options.producerVersion,...releaseSlug?{"release.slug":releaseSlug}:{}}),spanProcessors:[new _opentelemetry_sdk_trace_base.BatchSpanProcessor(exporter)]}}function instrumentExporterLogging(exporter){let orig=exporter.export.bind(exporter);exporter.export=(spans,cb)=>{let t=Date.now();orig(spans,result=>{let ms=Date.now()-t;if(result.code===0)console.log(`[interfere] export: ${spans.length} spans (${ms}ms)`);else{let err=result.error,status=err?.code?` ${err.code}`:``,body=err?.data??err?.message??`unknown error`;console.warn(`[interfere] export failed:${status} ${body} (${ms}ms, ${spans.length} spans dropped)`)}cb(result)})}}exports.installGlobalHandlers=require_internal_global_handlers.installGlobalHandlers,exports.resolveOtelConfig=resolveOtelConfig,exports.uninstallGlobalHandlers=require_internal_global_handlers.uninstallGlobalHandlers;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { installGlobalHandlers, uninstallGlobalHandlers } from "./internal/global-handlers.cjs";
|
|
2
|
+
import { Resource } from "@opentelemetry/resources";
|
|
3
|
+
import { SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
4
|
+
|
|
5
|
+
//#region src/otel-config.d.ts
|
|
6
|
+
interface OtelConfigOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Log exporter results to `stdout`. Also activatable via
|
|
9
|
+
* `INTERFERE_DEBUG=1` upstream.
|
|
10
|
+
*/
|
|
11
|
+
readonly debug?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Deployment environment label. Falls back through `INTERFERE_ENVIRONMENT`,
|
|
14
|
+
* `VERCEL_ENV`, `NODE_ENV`, then `development` when unset.
|
|
15
|
+
*/
|
|
16
|
+
readonly environment?: string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* The producer version string (`name@version`) sent as the
|
|
19
|
+
* `x-interfere-producer-version` header and recorded as
|
|
20
|
+
* `interfere.sdk.version`.
|
|
21
|
+
*/
|
|
22
|
+
readonly producerVersion: string;
|
|
23
|
+
/**
|
|
24
|
+
* The `interfere.sdk.name` resource attribute — the npm name of the SDK
|
|
25
|
+
* building this config (e.g. `@interfere/node`).
|
|
26
|
+
*/
|
|
27
|
+
readonly sdkName: string;
|
|
28
|
+
/**
|
|
29
|
+
* OTel `service.name` resource attribute — the identity spans are grouped
|
|
30
|
+
* by in the dashboard.
|
|
31
|
+
*/
|
|
32
|
+
readonly serviceName: string;
|
|
33
|
+
/**
|
|
34
|
+
* Optional OTel `service.namespace` resource attribute for grouping
|
|
35
|
+
* several services under one logical product surface.
|
|
36
|
+
*/
|
|
37
|
+
readonly serviceNamespace?: string | undefined;
|
|
38
|
+
}
|
|
39
|
+
interface ResolvedOtelConfig {
|
|
40
|
+
readonly endpoint: string;
|
|
41
|
+
readonly environment: string;
|
|
42
|
+
readonly releaseSlug: string | null;
|
|
43
|
+
readonly resource: Resource;
|
|
44
|
+
readonly spanProcessors: SpanProcessor[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Builds the OpenTelemetry exporter, resource, and span processors that ship
|
|
48
|
+
* traces to the Interfere collector. Returns `null` when
|
|
49
|
+
* `INTERFERE_PUBLIC_KEY` is unset so callers can disable themselves cleanly.
|
|
50
|
+
*
|
|
51
|
+
* Centralizes the collector contract — OTLP/HTTP JSON transport, the public
|
|
52
|
+
* key query param, the producer-version header, and the required
|
|
53
|
+
* `service.name` / `release.slug` / `deployment.environment.name` resource
|
|
54
|
+
* attributes — so every server SDK reports identically.
|
|
55
|
+
*/
|
|
56
|
+
declare function resolveOtelConfig(options: OtelConfigOptions): ResolvedOtelConfig | null;
|
|
57
|
+
//#endregion
|
|
58
|
+
export { OtelConfigOptions, ResolvedOtelConfig, installGlobalHandlers, resolveOtelConfig, uninstallGlobalHandlers };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { installGlobalHandlers, uninstallGlobalHandlers } from "./internal/global-handlers.mjs";
|
|
2
|
+
import { Resource } from "@opentelemetry/resources";
|
|
3
|
+
import { SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
4
|
+
|
|
5
|
+
//#region src/otel-config.d.ts
|
|
6
|
+
interface OtelConfigOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Log exporter results to `stdout`. Also activatable via
|
|
9
|
+
* `INTERFERE_DEBUG=1` upstream.
|
|
10
|
+
*/
|
|
11
|
+
readonly debug?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Deployment environment label. Falls back through `INTERFERE_ENVIRONMENT`,
|
|
14
|
+
* `VERCEL_ENV`, `NODE_ENV`, then `development` when unset.
|
|
15
|
+
*/
|
|
16
|
+
readonly environment?: string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* The producer version string (`name@version`) sent as the
|
|
19
|
+
* `x-interfere-producer-version` header and recorded as
|
|
20
|
+
* `interfere.sdk.version`.
|
|
21
|
+
*/
|
|
22
|
+
readonly producerVersion: string;
|
|
23
|
+
/**
|
|
24
|
+
* The `interfere.sdk.name` resource attribute — the npm name of the SDK
|
|
25
|
+
* building this config (e.g. `@interfere/node`).
|
|
26
|
+
*/
|
|
27
|
+
readonly sdkName: string;
|
|
28
|
+
/**
|
|
29
|
+
* OTel `service.name` resource attribute — the identity spans are grouped
|
|
30
|
+
* by in the dashboard.
|
|
31
|
+
*/
|
|
32
|
+
readonly serviceName: string;
|
|
33
|
+
/**
|
|
34
|
+
* Optional OTel `service.namespace` resource attribute for grouping
|
|
35
|
+
* several services under one logical product surface.
|
|
36
|
+
*/
|
|
37
|
+
readonly serviceNamespace?: string | undefined;
|
|
38
|
+
}
|
|
39
|
+
interface ResolvedOtelConfig {
|
|
40
|
+
readonly endpoint: string;
|
|
41
|
+
readonly environment: string;
|
|
42
|
+
readonly releaseSlug: string | null;
|
|
43
|
+
readonly resource: Resource;
|
|
44
|
+
readonly spanProcessors: SpanProcessor[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Builds the OpenTelemetry exporter, resource, and span processors that ship
|
|
48
|
+
* traces to the Interfere collector. Returns `null` when
|
|
49
|
+
* `INTERFERE_PUBLIC_KEY` is unset so callers can disable themselves cleanly.
|
|
50
|
+
*
|
|
51
|
+
* Centralizes the collector contract — OTLP/HTTP JSON transport, the public
|
|
52
|
+
* key query param, the producer-version header, and the required
|
|
53
|
+
* `service.name` / `release.slug` / `deployment.environment.name` resource
|
|
54
|
+
* attributes — so every server SDK reports identically.
|
|
55
|
+
*/
|
|
56
|
+
declare function resolveOtelConfig(options: OtelConfigOptions): ResolvedOtelConfig | null;
|
|
57
|
+
//#endregion
|
|
58
|
+
export { OtelConfigOptions, ResolvedOtelConfig, installGlobalHandlers, resolveOtelConfig, uninstallGlobalHandlers };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readInterfereEnv}from"./internal/env.mjs";import{installGlobalHandlers,uninstallGlobalHandlers}from"./internal/global-handlers.mjs";import{resolveReleaseSlug}from"./internal/release-slug.mjs";import{withPublicKey}from"./internal/url.mjs";import{API_PATHS}from"@interfere/constants/api";import{LOCAL_DEV_RELEASE_SLUG}from"@interfere/types/releases/slug";import{resolveEnvironment}from"@interfere/types/sdk/runtime";import{OTLPTraceExporter}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes}from"@opentelemetry/resources";import{BatchSpanProcessor}from"@opentelemetry/sdk-trace-base";function resolveOtelConfig(options){let env=readInterfereEnv();if(!env.publicKey)return null;let environment=resolveEnvironment({explicit:options.environment,env:process.env}),releaseSlug=env.forceEnable?LOCAL_DEV_RELEASE_SLUG:resolveReleaseSlug().slug,endpoint=withPublicKey(`${env.apiUrl}${API_PATHS.SINK}`,env.publicKey),exporter=new OTLPTraceExporter({url:endpoint,headers:{"user-agent":options.producerVersion,"x-interfere-producer-version":options.producerVersion,...env.forceEnable?{"x-interfere-force-enable":`1`}:{}}});return options.debug&&instrumentExporterLogging(exporter),{endpoint,environment,releaseSlug,resource:resourceFromAttributes({"service.name":options.serviceName,...options.serviceNamespace?{"service.namespace":options.serviceNamespace}:{},"deployment.environment.name":environment,"telemetry.sdk.language":`nodejs`,"interfere.sdk.name":options.sdkName,"interfere.sdk.version":options.producerVersion,...releaseSlug?{"release.slug":releaseSlug}:{}}),spanProcessors:[new BatchSpanProcessor(exporter)]}}function instrumentExporterLogging(exporter){let orig=exporter.export.bind(exporter);exporter.export=(spans,cb)=>{let t=Date.now();orig(spans,result=>{let ms=Date.now()-t;if(result.code===0)console.log(`[interfere] export: ${spans.length} spans (${ms}ms)`);else{let err=result.error,status=err?.code?` ${err.code}`:``,body=err?.data??err?.message??`unknown error`;console.warn(`[interfere] export failed:${status} ${body} (${ms}ms, ${spans.length} spans dropped)`)}cb(result)})}}export{installGlobalHandlers,resolveOtelConfig,uninstallGlobalHandlers};
|
package/dist/package.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,"name",{enumerable:!0,get:function(){return`@interfere/node`}}),Object.defineProperty(exports,"version",{enumerable:!0,get:function(){return`0.1.0
|
|
1
|
+
Object.defineProperty(exports,"name",{enumerable:!0,get:function(){return`@interfere/node`}}),Object.defineProperty(exports,"version",{enumerable:!0,get:function(){return`0.1.0`}});
|
package/dist/package.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var name=`@interfere/node`,version=`0.1.0
|
|
1
|
+
var name=`@interfere/node`,version=`0.1.0`;export{name,version};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interfere/node",
|
|
3
|
-
"version": "0.1.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Node.js SDK for Interfere. Error tracking and OTel instrumentation for any Node server.",
|
|
6
6
|
"keywords": [
|
|
@@ -64,6 +64,17 @@
|
|
|
64
64
|
"types": "./dist/capture.d.cts",
|
|
65
65
|
"default": "./dist/capture.cjs"
|
|
66
66
|
}
|
|
67
|
+
},
|
|
68
|
+
"./otel-config": {
|
|
69
|
+
"monorepo": "./src/otel-config.ts",
|
|
70
|
+
"import": {
|
|
71
|
+
"types": "./dist/otel-config.d.mts",
|
|
72
|
+
"default": "./dist/otel-config.mjs"
|
|
73
|
+
},
|
|
74
|
+
"require": {
|
|
75
|
+
"types": "./dist/otel-config.d.cts",
|
|
76
|
+
"default": "./dist/otel-config.cjs"
|
|
77
|
+
}
|
|
67
78
|
}
|
|
68
79
|
},
|
|
69
80
|
"sideEffects": false,
|
|
@@ -76,8 +87,8 @@
|
|
|
76
87
|
"typecheck": "tsc --noEmit"
|
|
77
88
|
},
|
|
78
89
|
"dependencies": {
|
|
79
|
-
"@interfere/constants": "^9.0.2-canary.
|
|
80
|
-
"@interfere/types": "^10.0.0-canary.
|
|
90
|
+
"@interfere/constants": "^9.0.2-canary.3",
|
|
91
|
+
"@interfere/types": "^10.0.0-canary.6",
|
|
81
92
|
"@opentelemetry/api": "^1.9.1",
|
|
82
93
|
"@opentelemetry/context-async-hooks": "^2.7.1",
|
|
83
94
|
"@opentelemetry/exporter-trace-otlp-http": "^0.219.0",
|
|
@@ -86,9 +97,9 @@
|
|
|
86
97
|
"@opentelemetry/sdk-trace-node": "^2.7.1"
|
|
87
98
|
},
|
|
88
99
|
"devDependencies": {
|
|
89
|
-
"@interfere/test-utils": "^9.0.1-canary.
|
|
90
|
-
"@interfere/typescript-config": "^9.0.1-canary.
|
|
91
|
-
"@types/node": "^26.
|
|
100
|
+
"@interfere/test-utils": "^9.0.1-canary.2",
|
|
101
|
+
"@interfere/typescript-config": "^9.0.1-canary.1",
|
|
102
|
+
"@types/node": "^26.1.0",
|
|
92
103
|
"@vitest/coverage-v8": "4.1.9",
|
|
93
104
|
"tsdown": "^0.22.2",
|
|
94
105
|
"typescript": "^6.0.3",
|