@0xchain/telemetry 1.1.0-beta.18 → 1.1.0-beta.19
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 +21 -0
- package/dist/ignore-BvHZTNsF.js +151 -0
- package/dist/index.js +556 -348
- package/dist/instrumentation.js +5 -5
- package/dist/middleware.js +36 -22
- package/dist/next.js +36 -22
- package/package.json +27 -10
- package/dist/ignore-CMi2r3b2.js +0 -114
package/dist/instrumentation.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { startTelemetry
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
await
|
|
1
|
+
import { startTelemetry } from "./index.js";
|
|
2
|
+
const registerTelemetry = async (configOrProvider) => {
|
|
3
|
+
const resolvedConfig = typeof configOrProvider === "function" ? await configOrProvider() : configOrProvider;
|
|
4
|
+
await startTelemetry(resolvedConfig ?? {});
|
|
5
5
|
};
|
|
6
6
|
export {
|
|
7
|
-
|
|
7
|
+
registerTelemetry
|
|
8
8
|
};
|
package/dist/middleware.js
CHANGED
|
@@ -1,29 +1,43 @@
|
|
|
1
|
-
import { NextRequest
|
|
2
|
-
import { c as
|
|
3
|
-
const
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
import { c as createIgnoreMatcher } from "./ignore-BvHZTNsF.js";
|
|
3
|
+
const defaultTelemetryMiddlewareConfig = {
|
|
4
4
|
matcher: [
|
|
5
5
|
"/((?!_next/static|_next/image|favicon.ico|robots.txt|sitemap.xml|.*\\.(?:css|js|mjs|cjs|png|jpg|jpeg|gif|svg|ico|webp|avif|woff|woff2|ttf|eot|map|txt|xml)).*)"
|
|
6
6
|
]
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
};
|
|
8
|
+
const withTelemetryMiddleware = (middleware, options = {}) => {
|
|
9
|
+
const shouldIgnore = createIgnoreMatcher(options.ignore);
|
|
10
|
+
const requestStartHeader = (options.requestStartHeader ?? "x-telemetry-start").toLowerCase();
|
|
11
|
+
const userTypeHeader = (options.userTypeHeader ?? "x-telemetry-user-type").toLowerCase();
|
|
12
|
+
const resolveUserType = options.resolveUserType;
|
|
13
|
+
return async (request, event) => {
|
|
14
|
+
const pathname = request.nextUrl.pathname;
|
|
15
|
+
if (shouldIgnore(pathname, request.method)) {
|
|
16
|
+
return middleware(request, event);
|
|
17
|
+
}
|
|
18
|
+
const headers = new Headers(request.headers);
|
|
19
|
+
const userType = resolveUserType?.(request) || headers.get(userTypeHeader);
|
|
20
|
+
if (userType) headers.set(userTypeHeader, userType);
|
|
21
|
+
headers.set(requestStartHeader, String(Date.now()));
|
|
22
|
+
const wrappedRequest = new NextRequest(request, {
|
|
23
|
+
headers
|
|
22
24
|
});
|
|
25
|
+
const response = await middleware(wrappedRequest, event);
|
|
26
|
+
if (!response) {
|
|
27
|
+
return NextResponse.next({
|
|
28
|
+
request: {
|
|
29
|
+
headers
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return response;
|
|
23
34
|
};
|
|
24
|
-
}
|
|
35
|
+
};
|
|
36
|
+
const createTelemetryMiddleware = (options = {}) => {
|
|
37
|
+
return withTelemetryMiddleware(() => NextResponse.next(), options);
|
|
38
|
+
};
|
|
25
39
|
export {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
40
|
+
createTelemetryMiddleware,
|
|
41
|
+
defaultTelemetryMiddlewareConfig,
|
|
42
|
+
withTelemetryMiddleware
|
|
29
43
|
};
|
package/dist/next.js
CHANGED
|
@@ -1,29 +1,43 @@
|
|
|
1
|
-
import { NextRequest
|
|
2
|
-
import { c as
|
|
3
|
-
const
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
import { c as createIgnoreMatcher } from "./ignore-BvHZTNsF.js";
|
|
3
|
+
const defaultTelemetryMiddlewareConfig = {
|
|
4
4
|
matcher: [
|
|
5
5
|
"/((?!_next/static|_next/image|favicon.ico|robots.txt|sitemap.xml|.*\\.(?:css|js|mjs|cjs|png|jpg|jpeg|gif|svg|ico|webp|avif|woff|woff2|ttf|eot|map|txt|xml)).*)"
|
|
6
6
|
]
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
};
|
|
8
|
+
const withTelemetryMiddleware = (middleware, options = {}) => {
|
|
9
|
+
const shouldIgnore = createIgnoreMatcher(options.ignore);
|
|
10
|
+
const requestStartHeader = (options.requestStartHeader ?? "x-telemetry-start").toLowerCase();
|
|
11
|
+
const userTypeHeader = (options.userTypeHeader ?? "x-telemetry-user-type").toLowerCase();
|
|
12
|
+
const resolveUserType = options.resolveUserType;
|
|
13
|
+
return async (request, event) => {
|
|
14
|
+
const pathname = request.nextUrl.pathname;
|
|
15
|
+
if (shouldIgnore(pathname, request.method)) {
|
|
16
|
+
return middleware(request, event);
|
|
17
|
+
}
|
|
18
|
+
const headers = new Headers(request.headers);
|
|
19
|
+
const userType = resolveUserType?.(request) || headers.get(userTypeHeader);
|
|
20
|
+
if (userType) headers.set(userTypeHeader, userType);
|
|
21
|
+
headers.set(requestStartHeader, String(Date.now()));
|
|
22
|
+
const wrappedRequest = new NextRequest(request, {
|
|
23
|
+
headers
|
|
22
24
|
});
|
|
25
|
+
const response = await middleware(wrappedRequest, event);
|
|
26
|
+
if (!response) {
|
|
27
|
+
return NextResponse.next({
|
|
28
|
+
request: {
|
|
29
|
+
headers
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return response;
|
|
23
34
|
};
|
|
24
|
-
}
|
|
35
|
+
};
|
|
36
|
+
const createTelemetryMiddleware = (options = {}) => {
|
|
37
|
+
return withTelemetryMiddleware(() => NextResponse.next(), options);
|
|
38
|
+
};
|
|
25
39
|
export {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
40
|
+
createTelemetryMiddleware,
|
|
41
|
+
defaultTelemetryMiddlewareConfig,
|
|
42
|
+
withTelemetryMiddleware
|
|
29
43
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@0xchain/telemetry",
|
|
3
|
-
"version": "1.1.0-beta.
|
|
3
|
+
"version": "1.1.0-beta.19",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -35,18 +35,35 @@
|
|
|
35
35
|
"dist",
|
|
36
36
|
"!**/*.tsbuildinfo"
|
|
37
37
|
],
|
|
38
|
-
"
|
|
38
|
+
"peerDependencies": {
|
|
39
39
|
"@opentelemetry/api": "1.9.0",
|
|
40
|
-
"@opentelemetry/
|
|
41
|
-
"@opentelemetry/
|
|
42
|
-
"@opentelemetry/instrumentation-undici": "0.
|
|
43
|
-
"@opentelemetry/otlp-exporter-base": "0.
|
|
44
|
-
"@opentelemetry/resources": "2.5.
|
|
45
|
-
"@opentelemetry/sdk-node": "0.
|
|
46
|
-
"@opentelemetry/sdk-trace-base": "2.5.
|
|
47
|
-
"@opentelemetry/semantic-conventions": "1.
|
|
40
|
+
"@opentelemetry/exporter-trace-otlp-http": "0.212.0",
|
|
41
|
+
"@opentelemetry/instrumentation-http": "0.212.0",
|
|
42
|
+
"@opentelemetry/instrumentation-undici": "0.22.0",
|
|
43
|
+
"@opentelemetry/otlp-exporter-base": "0.212.0",
|
|
44
|
+
"@opentelemetry/resources": "2.5.1",
|
|
45
|
+
"@opentelemetry/sdk-node": "0.212.0",
|
|
46
|
+
"@opentelemetry/sdk-trace-base": "2.5.1",
|
|
47
|
+
"@opentelemetry/semantic-conventions": "1.40.0",
|
|
48
48
|
"next": "16.1.6"
|
|
49
49
|
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@opentelemetry/api": "1.9.0",
|
|
52
|
+
"@opentelemetry/exporter-trace-otlp-http": "0.212.0",
|
|
53
|
+
"@opentelemetry/instrumentation-http": "0.212.0",
|
|
54
|
+
"@opentelemetry/instrumentation-undici": "0.22.0",
|
|
55
|
+
"@opentelemetry/otlp-exporter-base": "0.212.0",
|
|
56
|
+
"@opentelemetry/resources": "2.5.1",
|
|
57
|
+
"@opentelemetry/sdk-node": "0.212.0",
|
|
58
|
+
"@opentelemetry/sdk-trace-base": "2.5.1",
|
|
59
|
+
"@opentelemetry/semantic-conventions": "1.40.0",
|
|
60
|
+
"next": "16.1.6"
|
|
61
|
+
},
|
|
62
|
+
"nx": {
|
|
63
|
+
"tags": [
|
|
64
|
+
"type:util"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
50
67
|
"publishConfig": {
|
|
51
68
|
"access": "public"
|
|
52
69
|
}
|
package/dist/ignore-CMi2r3b2.js
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
const x = [
|
|
2
|
-
// 健康检查 & 监控
|
|
3
|
-
"/health",
|
|
4
|
-
"/api/health",
|
|
5
|
-
"/metrics",
|
|
6
|
-
"/api/metrics",
|
|
7
|
-
"/readyz",
|
|
8
|
-
"/livez",
|
|
9
|
-
"/monitoring",
|
|
10
|
-
// Next.js 内部路由
|
|
11
|
-
"/_next",
|
|
12
|
-
"/__nextjs_",
|
|
13
|
-
// Next.js App Router 元数据路由
|
|
14
|
-
"/opengraph-image",
|
|
15
|
-
"/twitter-image",
|
|
16
|
-
"/icon",
|
|
17
|
-
"/apple-icon",
|
|
18
|
-
// Vercel 内部路由
|
|
19
|
-
"/_vercel",
|
|
20
|
-
// 静态资源 & SEO
|
|
21
|
-
"/favicon.ico",
|
|
22
|
-
"/robots.txt",
|
|
23
|
-
"/sitemap.xml",
|
|
24
|
-
"/manifest.json",
|
|
25
|
-
"/manifest.webmanifest",
|
|
26
|
-
"/.well-known",
|
|
27
|
-
// 认证回调(NextAuth.js)
|
|
28
|
-
"/api/auth"
|
|
29
|
-
], w = [
|
|
30
|
-
// Next.js 内部服务端操作(非 HTTP 请求,由 Next.js OTel 自动产生)
|
|
31
|
-
/^NextNodeServer\./,
|
|
32
|
-
/^NextServer\./,
|
|
33
|
-
/^BaseServer\./,
|
|
34
|
-
/^AppRender\./,
|
|
35
|
-
/^AppRouteRouteHandlers\./,
|
|
36
|
-
// Next.js 中间件执行 span(如 "middleware GET /path")
|
|
37
|
-
/^middleware /i,
|
|
38
|
-
// Next.js 元数据解析
|
|
39
|
-
/^resolveMetadata$/,
|
|
40
|
-
/^generateMetadata$/
|
|
41
|
-
], f = [
|
|
42
|
-
".css",
|
|
43
|
-
".js",
|
|
44
|
-
".mjs",
|
|
45
|
-
".cjs",
|
|
46
|
-
".png",
|
|
47
|
-
".jpg",
|
|
48
|
-
".jpeg",
|
|
49
|
-
".gif",
|
|
50
|
-
".svg",
|
|
51
|
-
".ico",
|
|
52
|
-
".webp",
|
|
53
|
-
".avif",
|
|
54
|
-
".woff",
|
|
55
|
-
".woff2",
|
|
56
|
-
".ttf",
|
|
57
|
-
".eot",
|
|
58
|
-
".map",
|
|
59
|
-
".txt",
|
|
60
|
-
".xml"
|
|
61
|
-
], h = {
|
|
62
|
-
paths: x,
|
|
63
|
-
extensions: f,
|
|
64
|
-
methods: ["HEAD", "OPTIONS"],
|
|
65
|
-
spanNames: w
|
|
66
|
-
}, C = (e) => e.map((s) => {
|
|
67
|
-
const t = s.trim().toLowerCase();
|
|
68
|
-
return t && (t.startsWith(".") ? t : `.${t}`);
|
|
69
|
-
}), E = (e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), m = (e, s) => {
|
|
70
|
-
if (e instanceof RegExp)
|
|
71
|
-
return e.test(s);
|
|
72
|
-
const t = e.trim();
|
|
73
|
-
if (!t) return !1;
|
|
74
|
-
if (t.includes("*")) {
|
|
75
|
-
const o = `^${E(t).replace(/\\\*\\\*/g, ".*").replace(/\\\*/g, "[^/]*")}$`;
|
|
76
|
-
return new RegExp(o).test(s);
|
|
77
|
-
}
|
|
78
|
-
return s === t ? !0 : t.endsWith("/") ? s.startsWith(t) : s.startsWith(`${t}/`) || s.startsWith(t);
|
|
79
|
-
}, $ = (e, s) => {
|
|
80
|
-
const t = s.toLowerCase();
|
|
81
|
-
return e.some((n) => n && t.endsWith(n));
|
|
82
|
-
}, j = (e) => {
|
|
83
|
-
var o;
|
|
84
|
-
if (!e) return "default";
|
|
85
|
-
if ((o = e.paths) == null ? void 0 : o.some((a) => a instanceof RegExp)) return null;
|
|
86
|
-
const t = (e.paths ?? []).map(String).sort().join(","), n = (e.extensions ?? []).map((a) => a.toLowerCase()).sort().join(","), p = (e.methods ?? []).map((a) => a.toUpperCase()).sort().join(",");
|
|
87
|
-
return `p:${t}|e:${n}|m:${p}`;
|
|
88
|
-
}, i = /* @__PURE__ */ new Map(), v = 16, N = (e) => {
|
|
89
|
-
var t;
|
|
90
|
-
const s = (t = e == null ? void 0 : e.spanNames) != null && t.length ? e.spanNames : h.spanNames;
|
|
91
|
-
return (n) => !n || !s.length ? !1 : s.some((p) => m(p, n));
|
|
92
|
-
}, R = (e) => {
|
|
93
|
-
var a, l, c;
|
|
94
|
-
const s = j(e);
|
|
95
|
-
if (s) {
|
|
96
|
-
const r = i.get(s);
|
|
97
|
-
if (r) return r;
|
|
98
|
-
}
|
|
99
|
-
const t = (a = e == null ? void 0 : e.paths) != null && a.length ? e.paths : h.paths, n = (l = e == null ? void 0 : e.extensions) != null && l.length ? C(e.extensions) : h.extensions, p = (c = e == null ? void 0 : e.methods) != null && c.length ? e.methods.map((r) => r.toUpperCase()) : h.methods, o = (r, u) => u && p.includes(u.toUpperCase()) ? !0 : r ? $(n, r) ? !0 : t.some((d) => m(d, r)) : !1;
|
|
100
|
-
if (s) {
|
|
101
|
-
if (i.size >= v) {
|
|
102
|
-
const r = i.keys().next().value;
|
|
103
|
-
r && i.delete(r);
|
|
104
|
-
}
|
|
105
|
-
i.set(s, o);
|
|
106
|
-
}
|
|
107
|
-
return o;
|
|
108
|
-
};
|
|
109
|
-
export {
|
|
110
|
-
N as a,
|
|
111
|
-
R as c,
|
|
112
|
-
h as d,
|
|
113
|
-
m
|
|
114
|
-
};
|