browser-devtools-mcp 0.0.2 → 0.0.3
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 +97 -6
- package/dist/browser.js +162 -22
- package/dist/browser.js.map +1 -1
- package/dist/config.js +46 -1
- package/dist/config.js.map +1 -1
- package/dist/context.js +72 -17
- package/dist/context.js.map +1 -1
- package/dist/index.js +77 -42
- package/dist/index.js.map +1 -1
- package/dist/otel/otel-controller.js +319 -0
- package/dist/otel/otel-controller.js.map +1 -0
- package/dist/otel/otel-initializer.bundle.js +2 -0
- package/dist/otel/otel-initializer.bundle.js.map +7 -0
- package/dist/otel/otel-proxy.js +407 -0
- package/dist/otel/otel-proxy.js.map +1 -0
- package/dist/server.js +4 -19
- package/dist/server.js.map +1 -1
- package/dist/tools/monitoring/get-trace-id.js +30 -0
- package/dist/tools/monitoring/get-trace-id.js.map +1 -0
- package/dist/tools/monitoring/index.js +10 -1
- package/dist/tools/monitoring/index.js.map +1 -1
- package/dist/tools/monitoring/new-trace-id.js +32 -0
- package/dist/tools/monitoring/new-trace-id.js.map +1 -0
- package/dist/tools/monitoring/set-trace-id.js +28 -0
- package/dist/tools/monitoring/set-trace-id.js.map +1 -0
- package/dist/tools/tool-executor.js +26 -4
- package/dist/tools/tool-executor.js.map +1 -1
- package/dist/utils.js +38 -0
- package/dist/utils.js.map +1 -1
- package/package.json +7 -2
package/dist/index.js
CHANGED
|
@@ -96,20 +96,42 @@ function _getConfig() {
|
|
|
96
96
|
return {};
|
|
97
97
|
}
|
|
98
98
|
async function _startStdioServer() {
|
|
99
|
-
|
|
99
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
100
|
+
await (0, server_1.createServer)(transport, {
|
|
101
|
+
config: _getConfig(),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function _createSession(ctx, transport, server) {
|
|
105
|
+
// Create MCP session with MCP server
|
|
106
|
+
const session = (0, server_1.createSession)(transport, server);
|
|
107
|
+
// Register hook to close the associated MCP session on socket close
|
|
108
|
+
const socket = ctx.env.incoming.socket;
|
|
109
|
+
if (!socket._mcpRegistered) {
|
|
110
|
+
socket._mcpRegistered = true;
|
|
111
|
+
socket.on('close', async () => {
|
|
112
|
+
logger.debug(`Socket, which is for MCP session with id ${transport.sessionId}, has been closed`);
|
|
113
|
+
if (config.SESSION_CLOSE_ON_SOCKET_CLOSE) {
|
|
114
|
+
await transport.close();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// Register MCP session close hook to gracefully close it
|
|
119
|
+
_registerMCPSessionClose(transport, session.server);
|
|
120
|
+
logger.debug(`Created MCP server session with id ${transport.sessionId}`);
|
|
121
|
+
return session;
|
|
100
122
|
}
|
|
101
|
-
async function
|
|
102
|
-
let session;
|
|
123
|
+
async function _createTransport(ctx) {
|
|
103
124
|
// Get MCP server config
|
|
104
125
|
const serverConfig = _getConfig();
|
|
126
|
+
const holder = {};
|
|
105
127
|
// Create new instances of MCP Server and Transport for each incoming request
|
|
106
128
|
const transport = new mcp_1.StreamableHTTPTransport({
|
|
107
129
|
// Change to `false` if you want to enable SSE in responses.
|
|
108
130
|
enableJsonResponse: true,
|
|
109
131
|
sessionIdGenerator: () => crypto_1.default.randomUUID(),
|
|
110
132
|
onsessioninitialized: async (sessionId) => {
|
|
133
|
+
const session = _createSession(ctx, transport, holder.server);
|
|
111
134
|
sessions.set(sessionId, session);
|
|
112
|
-
session.initialized = true;
|
|
113
135
|
logger.debug(`MCP session initialized with id ${sessionId}`);
|
|
114
136
|
},
|
|
115
137
|
onsessionclosed: async (sessionId) => {
|
|
@@ -118,40 +140,38 @@ async function _createMCPServerSession(ctx) {
|
|
|
118
140
|
logger.debug(`MCP session closed with id ${sessionId}`);
|
|
119
141
|
},
|
|
120
142
|
});
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (!socket._mcpRegistered) {
|
|
126
|
-
socket._mcpRegistered = true;
|
|
127
|
-
socket.on('close', async () => {
|
|
128
|
-
logger.debug(`Socket, which is for MCP session with id ${transport.sessionId}, has been closed`);
|
|
129
|
-
if (config.SESSION_CLOSE_ON_SOCKET_CLOSE) {
|
|
130
|
-
await transport.close();
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
// Register MCP session close hook to gracefully close it
|
|
135
|
-
_registerMCPSessionClose(transport, session.server);
|
|
136
|
-
logger.debug(`Created MCP server session with id ${transport.sessionId}`);
|
|
137
|
-
return session;
|
|
143
|
+
holder.server = await (0, server_1.createServer)(transport, {
|
|
144
|
+
config: serverConfig,
|
|
145
|
+
});
|
|
146
|
+
return transport;
|
|
138
147
|
}
|
|
139
|
-
async function
|
|
140
|
-
|
|
148
|
+
async function _getTransport(ctx) {
|
|
149
|
+
const sessionId = ctx.req.header('mcp-session-id');
|
|
150
|
+
if (sessionId) {
|
|
151
|
+
const session = sessions.get(sessionId);
|
|
152
|
+
if (session) {
|
|
153
|
+
logger.debug(`Reusing MCP session with id ${sessionId}`);
|
|
154
|
+
return session
|
|
155
|
+
.transport;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return undefined;
|
|
141
159
|
}
|
|
142
|
-
async function
|
|
160
|
+
async function _getOrCreateTransport(ctx) {
|
|
143
161
|
const sessionId = ctx.req.header('mcp-session-id');
|
|
144
162
|
if (sessionId) {
|
|
145
163
|
const session = sessions.get(sessionId);
|
|
146
164
|
if (session) {
|
|
147
165
|
logger.debug(`Reusing MCP session with id ${sessionId}`);
|
|
166
|
+
return session
|
|
167
|
+
.transport;
|
|
148
168
|
}
|
|
149
169
|
else {
|
|
150
170
|
logger.debug(`No MCP session could be found with id ${sessionId}`);
|
|
171
|
+
return undefined;
|
|
151
172
|
}
|
|
152
|
-
return session;
|
|
153
173
|
}
|
|
154
|
-
return await
|
|
174
|
+
return await _createTransport(ctx);
|
|
155
175
|
}
|
|
156
176
|
function _registerMCPSessionClose(transport, mcpServer) {
|
|
157
177
|
let closed = false;
|
|
@@ -173,11 +193,14 @@ function _registerMCPSessionClose(transport, mcpServer) {
|
|
|
173
193
|
const session = sessions.get(transport.sessionId);
|
|
174
194
|
if (session) {
|
|
175
195
|
session.closed = true;
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
196
|
+
if (session.context) {
|
|
197
|
+
try {
|
|
198
|
+
await session.context.close();
|
|
199
|
+
logger.debug('Closed MCP session context');
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
logger.error('Error occurred while closing MCP session context', err);
|
|
203
|
+
}
|
|
181
204
|
}
|
|
182
205
|
}
|
|
183
206
|
sessions.delete(transport.sessionId);
|
|
@@ -206,6 +229,19 @@ function _scheduleIdleSessionCheck() {
|
|
|
206
229
|
};
|
|
207
230
|
setInterval(sessionCheck, config.SESSION_IDLE_CHECK_SECONDS * 1000);
|
|
208
231
|
}
|
|
232
|
+
async function _logRequest(ctx) {
|
|
233
|
+
const reqClone = ctx.req.raw.clone();
|
|
234
|
+
logger.debug(`Got request: ${await reqClone.json()}`);
|
|
235
|
+
}
|
|
236
|
+
function _markSessionAsActive(ctx) {
|
|
237
|
+
const sessionId = ctx.req.header('mcp-session-id');
|
|
238
|
+
if (sessionId) {
|
|
239
|
+
const session = sessions.get(sessionId);
|
|
240
|
+
if (session) {
|
|
241
|
+
session.lastActiveAt = Date.now();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
209
245
|
const app = new hono_1.Hono();
|
|
210
246
|
async function _startStreamableHTTPServer(port) {
|
|
211
247
|
// Global CORS
|
|
@@ -231,12 +267,15 @@ async function _startStreamableHTTPServer(port) {
|
|
|
231
267
|
// MCP Post message
|
|
232
268
|
app.post('/mcp', async (ctx) => {
|
|
233
269
|
try {
|
|
234
|
-
|
|
235
|
-
|
|
270
|
+
if (logger.isDebugEnabled()) {
|
|
271
|
+
await _logRequest(ctx);
|
|
272
|
+
}
|
|
273
|
+
const transport = await _getOrCreateTransport(ctx);
|
|
274
|
+
if (!transport) {
|
|
236
275
|
return ctx.json(MCP_ERRORS.sessionNotFound, 400);
|
|
237
276
|
}
|
|
238
|
-
|
|
239
|
-
return await
|
|
277
|
+
_markSessionAsActive(ctx);
|
|
278
|
+
return await transport.handleRequest(ctx);
|
|
240
279
|
}
|
|
241
280
|
catch (err) {
|
|
242
281
|
logger.error('Error occurred while handling MCP request', err);
|
|
@@ -246,15 +285,11 @@ async function _startStreamableHTTPServer(port) {
|
|
|
246
285
|
// MCP Delete session
|
|
247
286
|
app.delete('/mcp', async (ctx) => {
|
|
248
287
|
try {
|
|
249
|
-
const
|
|
250
|
-
if (!
|
|
288
|
+
const transport = await _getTransport(ctx);
|
|
289
|
+
if (!transport) {
|
|
251
290
|
return ctx.json(MCP_ERRORS.sessionNotFound, 400);
|
|
252
291
|
}
|
|
253
|
-
|
|
254
|
-
if (!mcpSession) {
|
|
255
|
-
return ctx.json(MCP_ERRORS.sessionNotFound, 400);
|
|
256
|
-
}
|
|
257
|
-
await mcpSession.transport.close();
|
|
292
|
+
await transport.close();
|
|
258
293
|
return ctx.json({ ok: true }, 200);
|
|
259
294
|
}
|
|
260
295
|
catch (err) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,iDAAmC;AACnC,iDAAmC;AACnC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,319 @@
|
|
|
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 () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.OTELController = void 0;
|
|
40
|
+
const fs_1 = __importDefault(require("fs"));
|
|
41
|
+
const path_1 = __importDefault(require("path"));
|
|
42
|
+
const logger = __importStar(require("../logger"));
|
|
43
|
+
const otel_proxy_1 = require("./otel-proxy");
|
|
44
|
+
const config_1 = require("../config");
|
|
45
|
+
const OTEL_PROXY_LOCAL_PATH = '/__mcp_otel/';
|
|
46
|
+
const OTEL_BUNDLE_FILE_NAME = 'otel-initializer.bundle.js';
|
|
47
|
+
function _getOTELExporterConfig() {
|
|
48
|
+
if (config_1.OTEL_EXPORTER_TYPE === 'otlp/http' || config_1.OTEL_EXPORTER_HTTP_URL) {
|
|
49
|
+
if (!config_1.OTEL_EXPORTER_HTTP_URL) {
|
|
50
|
+
throw new Error(`OTEL exporter HTTP url must be set when OTEL exporter type is "otlp/http"`);
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
type: 'otlp/http',
|
|
54
|
+
// IMPORTANT: OTEL_EXPORTER_HTTP_URL is a *base* URL, e.g. "http://localhost:4318"
|
|
55
|
+
// Browser exporter points to same-origin proxy. We choose a default suffix for traces.
|
|
56
|
+
// If you want to support metrics/logs too, you can configure initializer to use
|
|
57
|
+
// "/__mcp_otel/v1/metrics" and "/__mcp_otel/v1/logs" similarly.
|
|
58
|
+
url: OTEL_PROXY_LOCAL_PATH,
|
|
59
|
+
upstreamURL: config_1.OTEL_EXPORTER_HTTP_URL,
|
|
60
|
+
headers: config_1.OTEL_EXPORTER_HTTP_HEADERS,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
else if (config_1.OTEL_EXPORTER_TYPE === 'console') {
|
|
64
|
+
return {
|
|
65
|
+
type: 'console',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
else if (config_1.OTEL_EXPORTER_TYPE === 'none') {
|
|
69
|
+
return {
|
|
70
|
+
type: 'none',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
throw new Error(`Invalid OTEL exporter type ${config_1.OTEL_EXPORTER_TYPE}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function _getOTELInstrumentationConfig() {
|
|
78
|
+
return {
|
|
79
|
+
userInteractionEvents: config_1.OTEL_INSTRUMENTATION_USER_INTERACTION_EVENTS,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function _getOTELConfig() {
|
|
83
|
+
return {
|
|
84
|
+
serviceName: config_1.OTEL_SERVICE_NAME,
|
|
85
|
+
serviceVersion: config_1.OTEL_SERVICE_VERSION,
|
|
86
|
+
exporter: _getOTELExporterConfig(),
|
|
87
|
+
instrumentation: _getOTELInstrumentationConfig(),
|
|
88
|
+
debug: false,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function _readBundleContent(assetDir, bundleFileName) {
|
|
92
|
+
const assetDirAbs = path_1.default.isAbsolute(assetDir)
|
|
93
|
+
? assetDir
|
|
94
|
+
: path_1.default.join(process.cwd(), assetDir);
|
|
95
|
+
const filePath = path_1.default.join(assetDirAbs, bundleFileName);
|
|
96
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
97
|
+
throw new Error(`OTEL bundle not found at: ${filePath}`);
|
|
98
|
+
}
|
|
99
|
+
return fs_1.default.readFileSync(filePath, 'utf-8');
|
|
100
|
+
}
|
|
101
|
+
async function _applyConfigToPage(page, cfg) {
|
|
102
|
+
await page
|
|
103
|
+
.evaluate((nextCfg) => {
|
|
104
|
+
const g = globalThis;
|
|
105
|
+
if (!g.__MCP_DEVTOOLS__) {
|
|
106
|
+
g.__MCP_DEVTOOLS__ = {};
|
|
107
|
+
}
|
|
108
|
+
// Keep a stable fallback trace id for debugging & for pages
|
|
109
|
+
// where controller isn't available yet.
|
|
110
|
+
g.__MCP_TRACE_ID__ = nextCfg.traceId;
|
|
111
|
+
if (g.__mcpOtel && typeof g.__mcpOtel.init === 'function') {
|
|
112
|
+
g.__mcpOtel.init(nextCfg);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
g.__MCP_DEVTOOLS__.otelInitialized = false;
|
|
116
|
+
g.__MCP_DEVTOOLS__.otelInitError =
|
|
117
|
+
'__mcpOtel.init is not available while applying config';
|
|
118
|
+
}
|
|
119
|
+
}, cfg)
|
|
120
|
+
.catch((e) => {
|
|
121
|
+
// NOTE:
|
|
122
|
+
// We intentionally do not throw here because apply is best-effort and
|
|
123
|
+
// should not break user sessions; however, swallowing errors makes debugging hard.
|
|
124
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
125
|
+
logger.debug(`[otel-controller] applyConfigToPage failed (ignored): ${msg}`);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Installs navigation sync so that after each main-frame navigation we re-apply
|
|
130
|
+
* the latest config. This is important because:
|
|
131
|
+
* - addInitScript config is a snapshot at install time
|
|
132
|
+
* - traceId can change mid-session
|
|
133
|
+
*
|
|
134
|
+
* IMPORTANT:
|
|
135
|
+
* We keep references to handlers so we can remove them on close().
|
|
136
|
+
*/
|
|
137
|
+
function _installAutoSync(browserContext, getCfg) {
|
|
138
|
+
const perPageHandlers = new WeakMap();
|
|
139
|
+
const attachToPage = (page) => {
|
|
140
|
+
// Avoid double-attaching to the same Page instance.
|
|
141
|
+
if (perPageHandlers.has(page)) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const onFrameNavigated = async (frame) => {
|
|
145
|
+
if (frame !== page.mainFrame()) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
await _applyConfigToPage(page, getCfg());
|
|
149
|
+
};
|
|
150
|
+
perPageHandlers.set(page, onFrameNavigated);
|
|
151
|
+
page.on('framenavigated', onFrameNavigated);
|
|
152
|
+
};
|
|
153
|
+
// Attach to existing pages
|
|
154
|
+
for (const p of browserContext.pages()) {
|
|
155
|
+
attachToPage(p);
|
|
156
|
+
}
|
|
157
|
+
// Attach to future pages
|
|
158
|
+
const onNewPage = (p) => {
|
|
159
|
+
attachToPage(p);
|
|
160
|
+
};
|
|
161
|
+
browserContext.on('page', onNewPage);
|
|
162
|
+
const detach = () => {
|
|
163
|
+
// Remove context-level listener
|
|
164
|
+
try {
|
|
165
|
+
browserContext.off('page', onNewPage);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Some older Playwright builds may differ; ignore.
|
|
169
|
+
}
|
|
170
|
+
// Remove per-page listeners (best-effort)
|
|
171
|
+
for (const p of browserContext.pages()) {
|
|
172
|
+
const h = perPageHandlers.get(p);
|
|
173
|
+
if (h) {
|
|
174
|
+
try {
|
|
175
|
+
p.off('framenavigated', h);
|
|
176
|
+
}
|
|
177
|
+
catch { }
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Note: We intentionally do not iterate WeakMap keys.
|
|
181
|
+
// We best-effort remove from currently known pages.
|
|
182
|
+
};
|
|
183
|
+
logger.debug('[otel-controller] auto-sync installed (page+framenavigated)');
|
|
184
|
+
return { detach };
|
|
185
|
+
}
|
|
186
|
+
class OTELController {
|
|
187
|
+
browserContext;
|
|
188
|
+
config;
|
|
189
|
+
proxy;
|
|
190
|
+
/**
|
|
191
|
+
* We prevent multiple installs per OTELController instance.
|
|
192
|
+
*/
|
|
193
|
+
initialized = false;
|
|
194
|
+
/**
|
|
195
|
+
* Handler cleanup for auto-sync.
|
|
196
|
+
*/
|
|
197
|
+
autoSyncDetach;
|
|
198
|
+
constructor(browserContext) {
|
|
199
|
+
this.browserContext = browserContext;
|
|
200
|
+
this.config = _getOTELConfig();
|
|
201
|
+
}
|
|
202
|
+
async init(options) {
|
|
203
|
+
if (this.initialized) {
|
|
204
|
+
logger.debug('[otel-controller] init skipped: BrowserContext already initialized');
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
// Enforce traceId presence; while OTELConfig allows optional traceId,
|
|
208
|
+
// runtime behavior expects it.
|
|
209
|
+
if (!options.traceId || !options.traceId.trim()) {
|
|
210
|
+
throw new Error('[otel-controller] init requires a non-empty traceId');
|
|
211
|
+
}
|
|
212
|
+
this.config.traceId = options.traceId;
|
|
213
|
+
const assetDir = config_1.OTEL_ASSETS_DIR || __dirname;
|
|
214
|
+
if (this.config.exporter.type === 'otlp/http') {
|
|
215
|
+
this.proxy = new otel_proxy_1.OTELProxy({
|
|
216
|
+
localPath: OTEL_PROXY_LOCAL_PATH,
|
|
217
|
+
upstreamUrl: this.config.exporter.upstreamURL,
|
|
218
|
+
upstreamHeaders: { ...(this.config.exporter.headers ?? {}) },
|
|
219
|
+
});
|
|
220
|
+
await this.proxy.install(this.browserContext);
|
|
221
|
+
}
|
|
222
|
+
// Add extra debug breadcrumbs to quickly verify routing is working.
|
|
223
|
+
// If you see 404s for /__mcp_otel/*, this tells you whether routing is installed.
|
|
224
|
+
logger.debug(`[otel-controller] exporter=${this.config.exporter.type} localBase=${OTEL_PROXY_LOCAL_PATH}` +
|
|
225
|
+
(this.config.exporter.type === 'otlp/http'
|
|
226
|
+
? ` upstreamBase=${this.config.exporter.upstreamURL}`
|
|
227
|
+
: ''));
|
|
228
|
+
const bundleContent = _readBundleContent(assetDir, OTEL_BUNDLE_FILE_NAME);
|
|
229
|
+
// Install auto-sync (we pass a getter so it always uses latest config)
|
|
230
|
+
const sync = _installAutoSync(this.browserContext, () => this.config);
|
|
231
|
+
this.autoSyncDetach = sync.detach;
|
|
232
|
+
// 1) Install the initializer bundle as an init script (no network, no <script> tag)
|
|
233
|
+
await this.browserContext.addInitScript({
|
|
234
|
+
content: bundleContent,
|
|
235
|
+
});
|
|
236
|
+
// 2) Install a config init script that runs on every new document (snapshot config at install time)
|
|
237
|
+
// Auto-sync will re-apply the latest config after navigations.
|
|
238
|
+
await this.browserContext.addInitScript((cfg) => {
|
|
239
|
+
const g = globalThis;
|
|
240
|
+
if (!g.__MCP_DEVTOOLS__) {
|
|
241
|
+
g.__MCP_DEVTOOLS__ = {};
|
|
242
|
+
}
|
|
243
|
+
g.__MCP_TRACE_ID__ = cfg.traceId;
|
|
244
|
+
if (g.__mcpOtel && typeof g.__mcpOtel.init === 'function') {
|
|
245
|
+
g.__mcpOtel.init(cfg);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
g.__MCP_DEVTOOLS__.otelInitialized = false;
|
|
249
|
+
g.__MCP_DEVTOOLS__.otelInitError =
|
|
250
|
+
'__mcpOtel.init is not available (initializer bundle did not install)';
|
|
251
|
+
}
|
|
252
|
+
}, this.config);
|
|
253
|
+
this.initialized = true;
|
|
254
|
+
logger.debug('[otel-controller] init installed: bundle + config init scripts + auto-sync');
|
|
255
|
+
}
|
|
256
|
+
async isInitialized(page) {
|
|
257
|
+
return await page.evaluate(() => {
|
|
258
|
+
const g = globalThis;
|
|
259
|
+
return g.__MCP_DEVTOOLS__?.otelInitialized === true;
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
async getInitError(page) {
|
|
263
|
+
return await page.evaluate(() => {
|
|
264
|
+
const g = globalThis;
|
|
265
|
+
const v = g.__MCP_DEVTOOLS__?.otelInitError;
|
|
266
|
+
if (typeof v === 'string' && v.trim()) {
|
|
267
|
+
return v;
|
|
268
|
+
}
|
|
269
|
+
return undefined;
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
async getTraceId(page) {
|
|
273
|
+
return await page.evaluate(() => {
|
|
274
|
+
const g = globalThis;
|
|
275
|
+
if (g.__mcpOtel && typeof g.__mcpOtel.getTraceId === 'function') {
|
|
276
|
+
const tid = g.__mcpOtel.getTraceId();
|
|
277
|
+
if (typeof tid === 'string' && tid.trim()) {
|
|
278
|
+
return tid;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const fallback = g.__MCP_TRACE_ID__;
|
|
282
|
+
if (typeof fallback === 'string' && fallback.trim()) {
|
|
283
|
+
return fallback;
|
|
284
|
+
}
|
|
285
|
+
return undefined;
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
async setTraceId(page, traceId) {
|
|
289
|
+
// Persist in controller config so future navigations pick it up.
|
|
290
|
+
this.config.traceId = traceId;
|
|
291
|
+
await page.evaluate((tid) => {
|
|
292
|
+
const g = globalThis;
|
|
293
|
+
if (g.__mcpOtel && typeof g.__mcpOtel.setTraceId === 'function') {
|
|
294
|
+
g.__mcpOtel.setTraceId(tid);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
g.__MCP_TRACE_ID__ = tid;
|
|
298
|
+
}
|
|
299
|
+
}, traceId);
|
|
300
|
+
}
|
|
301
|
+
async close() {
|
|
302
|
+
// Cleanup auto-sync listeners to avoid:
|
|
303
|
+
// - leaking listeners across long sessions
|
|
304
|
+
// - duplicate apply calls if controller is re-created/re-inited
|
|
305
|
+
if (this.autoSyncDetach) {
|
|
306
|
+
try {
|
|
307
|
+
this.autoSyncDetach();
|
|
308
|
+
}
|
|
309
|
+
catch { }
|
|
310
|
+
this.autoSyncDetach = undefined;
|
|
311
|
+
}
|
|
312
|
+
if (this.proxy) {
|
|
313
|
+
await this.proxy.uninstall(this.browserContext);
|
|
314
|
+
this.proxy = undefined;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
exports.OTELController = OTELController;
|
|
319
|
+
//# sourceMappingURL=otel-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-controller.js","sourceRoot":"","sources":["../../src/otel/otel-controller.ts"],"names":[],"mappings":"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"}
|