fg-tracker-mcp 0.4.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 +15 -0
- package/README.md +83 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +51 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +103 -0
- package/dist/client.js +166 -0
- package/dist/client.js.map +1 -0
- package/dist/database.d.ts +15 -0
- package/dist/database.js +119 -0
- package/dist/database.js.map +1 -0
- package/dist/docs.d.ts +13 -0
- package/dist/docs.js +127 -0
- package/dist/docs.js.map +1 -0
- package/dist/format.d.ts +27 -0
- package/dist/format.js +103 -0
- package/dist/format.js.map +1 -0
- package/dist/guide.d.ts +19 -0
- package/dist/guide.js +490 -0
- package/dist/guide.js.map +1 -0
- package/dist/server.d.ts +14 -0
- package/dist/server.js +418 -0
- package/dist/server.js.map +1 -0
- package/package.json +71 -0
package/dist/guide.js
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guia de instrumentação: passos + código copiável por framework/logger,
|
|
3
|
+
* usando a chave real do projeto quando disponível. Segue o SDK atual
|
|
4
|
+
* (packages/sdk/README.md) e os transports de logs do §11 do contrato.
|
|
5
|
+
*/
|
|
6
|
+
export const FRAMEWORKS = ['express', 'nestjs', 'nextjs', 'fastify', 'pino', 'winston'];
|
|
7
|
+
const PLACEHOLDER_KEY = 'stk_SUA_CHAVE_AQUI';
|
|
8
|
+
function envBlock(input) {
|
|
9
|
+
const key = input.apiKey ?? PLACEHOLDER_KEY;
|
|
10
|
+
return [
|
|
11
|
+
'```bash',
|
|
12
|
+
'# .env (não commitar a chave)',
|
|
13
|
+
`FG_TRACKER_KEY=${key}`,
|
|
14
|
+
`FG_TRACKER_URL=${input.endpoint}`,
|
|
15
|
+
'```',
|
|
16
|
+
].join('\n');
|
|
17
|
+
}
|
|
18
|
+
function install(extra = []) {
|
|
19
|
+
const pkgs = ['fg-tracker-sdk@^0.4.0', ...extra].join(' ');
|
|
20
|
+
return [
|
|
21
|
+
'```bash',
|
|
22
|
+
`pnpm add ${pkgs}`,
|
|
23
|
+
`# npm install ${pkgs} | yarn add ${pkgs}`,
|
|
24
|
+
'```',
|
|
25
|
+
'',
|
|
26
|
+
'> Dentro do monorepo do FG Tracker use `"fg-tracker-sdk": "workspace:*"`. Projetos que já usam `stread-track-sdk` só trocam o nome do pacote nos imports (mesma API; as variáveis `STREAD_TRACK_*` continuam lidas como fallback).',
|
|
27
|
+
].join('\n');
|
|
28
|
+
}
|
|
29
|
+
function header(input, title) {
|
|
30
|
+
const lines = [`# ${title}`, ''];
|
|
31
|
+
if (input.projectName && input.projectId) {
|
|
32
|
+
lines.push(`Projeto: **${input.projectName}** (\`${input.projectId}\`). A chave abaixo é a chave real deste projeto — trate como segredo.`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
lines.push(`Nenhum projeto informado: o código usa o placeholder \`${PLACEHOLDER_KEY}\`. Crie um projeto com \`track_create_project { name }\` (ou use \`track_list_projects\`) e chame este guia de novo com \`projectId\` para receber a chave real.`);
|
|
36
|
+
}
|
|
37
|
+
lines.push('', `API do FG Tracker: \`${input.endpoint}\`.`, '');
|
|
38
|
+
return lines.join('\n');
|
|
39
|
+
}
|
|
40
|
+
function trackerFile(input, path, service) {
|
|
41
|
+
return [
|
|
42
|
+
`\`\`\`ts`,
|
|
43
|
+
`// ${path}`,
|
|
44
|
+
`import { createTracker } from 'fg-tracker-sdk';`,
|
|
45
|
+
``,
|
|
46
|
+
`export const tracker = createTracker({`,
|
|
47
|
+
` apiKey: process.env.FG_TRACKER_KEY!, // ${input.apiKey ?? PLACEHOLDER_KEY}`,
|
|
48
|
+
` endpoint: process.env.FG_TRACKER_URL ?? '${input.endpoint}',`,
|
|
49
|
+
` serviceName: '${service}',`,
|
|
50
|
+
` flushIntervalMs: 2000,`,
|
|
51
|
+
`});`,
|
|
52
|
+
`\`\`\``,
|
|
53
|
+
].join('\n');
|
|
54
|
+
}
|
|
55
|
+
const PG_BLOCK = [
|
|
56
|
+
'```ts',
|
|
57
|
+
"// onde o Pool é criado (antes de passá-lo ao drizzle/kysely/knex)",
|
|
58
|
+
"import { Pool } from 'pg';",
|
|
59
|
+
"import { tracker } from './tracker.js';",
|
|
60
|
+
'',
|
|
61
|
+
'export const pool = tracker.instrumentPg(new Pool({ connectionString: process.env.DATABASE_URL }));',
|
|
62
|
+
'// queries repetidas ≥ loop_threshold vezes no mesmo request viram issue N_PLUS_ONE',
|
|
63
|
+
'```',
|
|
64
|
+
].join('\n');
|
|
65
|
+
const FETCH_BLOCK = [
|
|
66
|
+
'```ts',
|
|
67
|
+
'// chamadas HTTP de saída → spans http.client (alimenta a detecção de LOOP)',
|
|
68
|
+
"import { tracker } from './tracker.js';",
|
|
69
|
+
'',
|
|
70
|
+
'export const fetchTracked = tracker.wrapFetch(); // use no lugar de fetch',
|
|
71
|
+
'// ou, global (afeta todo o processo):',
|
|
72
|
+
'// globalThis.fetch = tracker.wrapFetch(globalThis.fetch);',
|
|
73
|
+
'',
|
|
74
|
+
'// spans manuais para trechos relevantes',
|
|
75
|
+
"await tracker.span('custom', 'send-email', async (span) => { span.setAttribute('to', email); /* ... */ });",
|
|
76
|
+
'```',
|
|
77
|
+
].join('\n');
|
|
78
|
+
function logsSection(input, service, logger) {
|
|
79
|
+
const key = input.apiKey ?? PLACEHOLDER_KEY;
|
|
80
|
+
const shipper = [
|
|
81
|
+
'```ts',
|
|
82
|
+
'// src/logs.ts — um shipper por processo; correlaciona traceId/spanId automaticamente',
|
|
83
|
+
"import { createLogShipper } from 'fg-tracker-sdk';",
|
|
84
|
+
'',
|
|
85
|
+
'export const logShipper = createLogShipper({',
|
|
86
|
+
` apiKey: process.env.FG_TRACKER_KEY!, // ${key}`,
|
|
87
|
+
` endpoint: process.env.FG_TRACKER_URL ?? '${input.endpoint}',`,
|
|
88
|
+
` service: '${service}',`,
|
|
89
|
+
" env: process.env.NODE_ENV ?? 'development',",
|
|
90
|
+
' flushIntervalMs: 2000,',
|
|
91
|
+
' maxBatch: 200, // a API aceita até 500 por lote',
|
|
92
|
+
'});',
|
|
93
|
+
'```',
|
|
94
|
+
].join('\n');
|
|
95
|
+
const pino = [
|
|
96
|
+
'```ts',
|
|
97
|
+
'// pino v7+ (transport roda em worker thread: passa as opções, não o shipper)',
|
|
98
|
+
"import pino from 'pino';",
|
|
99
|
+
'',
|
|
100
|
+
'export const logger = pino({',
|
|
101
|
+
" level: process.env.LOG_LEVEL ?? 'info',",
|
|
102
|
+
' transport: {',
|
|
103
|
+
' targets: [',
|
|
104
|
+
" { target: 'pino-pretty', options: {} }, // opcional, console",
|
|
105
|
+
' {',
|
|
106
|
+
" target: 'fg-tracker-sdk/pino',",
|
|
107
|
+
' options: {',
|
|
108
|
+
` apiKey: process.env.FG_TRACKER_KEY, // ${key}`,
|
|
109
|
+
` endpoint: process.env.FG_TRACKER_URL ?? '${input.endpoint}',`,
|
|
110
|
+
` service: '${service}',`,
|
|
111
|
+
" env: process.env.NODE_ENV ?? 'development',",
|
|
112
|
+
' },',
|
|
113
|
+
' },',
|
|
114
|
+
' ],',
|
|
115
|
+
' },',
|
|
116
|
+
'});',
|
|
117
|
+
'```',
|
|
118
|
+
].join('\n');
|
|
119
|
+
const winston = [
|
|
120
|
+
'```ts',
|
|
121
|
+
"import winston from 'winston';",
|
|
122
|
+
"import { winstonTransport } from 'fg-tracker-sdk/winston';",
|
|
123
|
+
"import { logShipper } from './logs.js';",
|
|
124
|
+
'',
|
|
125
|
+
'export const logger = winston.createLogger({',
|
|
126
|
+
" level: process.env.LOG_LEVEL ?? 'info',",
|
|
127
|
+
' format: winston.format.json(),',
|
|
128
|
+
' transports: [',
|
|
129
|
+
' new winston.transports.Console(),',
|
|
130
|
+
' winstonTransport(logShipper), // envia cada log ao FG Tracker',
|
|
131
|
+
' ],',
|
|
132
|
+
'});',
|
|
133
|
+
'```',
|
|
134
|
+
].join('\n');
|
|
135
|
+
const nest = [
|
|
136
|
+
'```ts',
|
|
137
|
+
'// src/main.ts — LoggerService do Nest que espelha no console e envia',
|
|
138
|
+
"import { nestLogger } from 'fg-tracker-sdk';",
|
|
139
|
+
"import { logShipper } from './logs.js';",
|
|
140
|
+
'',
|
|
141
|
+
'const app = await NestFactory.create(AppModule, { logger: nestLogger(logShipper) });',
|
|
142
|
+
'```',
|
|
143
|
+
].join('\n');
|
|
144
|
+
const raw = [
|
|
145
|
+
'```ts',
|
|
146
|
+
'// qualquer logger: envie direto pelo shipper',
|
|
147
|
+
"logShipper.log({ level: 'info', message: 'pedido criado', context: { orderId } });",
|
|
148
|
+
'```',
|
|
149
|
+
].join('\n');
|
|
150
|
+
const parts = ['## Logs (opcional, recomendado)', '', shipper, ''];
|
|
151
|
+
if (logger === 'pino')
|
|
152
|
+
parts.push(pino);
|
|
153
|
+
else if (logger === 'winston')
|
|
154
|
+
parts.push(winston);
|
|
155
|
+
else if (logger === 'nest')
|
|
156
|
+
parts.push(nest, '', 'Se o app usa pino ou winston, chame `track_instrumentation_guide { framework: "pino" | "winston" }` para o transport correspondente.');
|
|
157
|
+
else
|
|
158
|
+
parts.push(raw, '', 'Com pino ou winston, chame `track_instrumentation_guide { framework: "pino" | "winston" }` para o transport pronto.');
|
|
159
|
+
parts.push('', 'Contrato (§11): o shipper envia lotes para `POST /v1/logs` com o header `x-fg-tracker-key`; níveis `trace|debug|info|warn|error|fatal`; `traceId`/`spanId` são preenchidos automaticamente quando o log acontece dentro de um request instrumentado pelo tracker. Se os exports `fg-tracker-sdk/pino` e `fg-tracker-sdk/winston` ainda não existirem na versão instalada do SDK, envie os logs direto para `POST /v1/logs` (veja o resource `fg-tracker://docs/quickstart`).');
|
|
160
|
+
return parts.join('\n');
|
|
161
|
+
}
|
|
162
|
+
function verifySection(input) {
|
|
163
|
+
const lines = [
|
|
164
|
+
'## Verificar',
|
|
165
|
+
'',
|
|
166
|
+
'1. Suba o app e gere algumas requisições (ex.: `curl http://localhost:PORTA/rota`).',
|
|
167
|
+
'2. Aguarde ~3 s (flush a cada 2 s).',
|
|
168
|
+
];
|
|
169
|
+
if (input.projectId) {
|
|
170
|
+
lines.push(`3. Chame \`track_verify_ingest { projectId: "${input.projectId}" }\` — deve reportar spans (e logs) recentes.`);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
lines.push('3. Chame `track_verify_ingest { projectId }` — deve reportar spans (e logs) recentes.');
|
|
174
|
+
}
|
|
175
|
+
lines.push('4. Se nada chegou: confira `FG_TRACKER_KEY` (4xx no envio = chave inválida, o SDK loga uma vez), se a API responde em `' +
|
|
176
|
+
input.endpoint +
|
|
177
|
+
'/v1/health`, e se `app.use(tracker.express())` é o PRIMEIRO middleware.', '', 'Depois, `track_get_overview`, `track_list_endpoints` e `track_list_issues` mostram o que foi coletado.');
|
|
178
|
+
return lines.join('\n');
|
|
179
|
+
}
|
|
180
|
+
export function buildGuide(input) {
|
|
181
|
+
const service = input.serviceName ?? input.projectName?.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') ?? 'minha-app';
|
|
182
|
+
switch (input.framework) {
|
|
183
|
+
case 'express':
|
|
184
|
+
return [
|
|
185
|
+
header(input, 'Instrumentar Express com FG Tracker'),
|
|
186
|
+
'## 1. Instalar',
|
|
187
|
+
install(),
|
|
188
|
+
'',
|
|
189
|
+
'## 2. Variáveis de ambiente',
|
|
190
|
+
envBlock(input),
|
|
191
|
+
'',
|
|
192
|
+
'## 3. Tracker (um por processo)',
|
|
193
|
+
trackerFile(input, 'src/tracker.ts', service),
|
|
194
|
+
'',
|
|
195
|
+
'## 4. Middleware — PRIMEIRO da cadeia',
|
|
196
|
+
'```ts',
|
|
197
|
+
'// src/app.ts',
|
|
198
|
+
"import express from 'express';",
|
|
199
|
+
"import { tracker } from './tracker.js';",
|
|
200
|
+
'',
|
|
201
|
+
'const app = express();',
|
|
202
|
+
'app.use(tracker.express()); // antes de json(), cors, helmet, rotas...',
|
|
203
|
+
'app.use(express.json());',
|
|
204
|
+
'',
|
|
205
|
+
"app.get('/users/:id', async (req, res) => {",
|
|
206
|
+
" const { rows } = await pool.query('select * from users where id = $1', [req.params.id]);",
|
|
207
|
+
' res.json(rows[0]);',
|
|
208
|
+
'});',
|
|
209
|
+
'',
|
|
210
|
+
'app.listen(3000);',
|
|
211
|
+
'',
|
|
212
|
+
"process.on('SIGTERM', () => tracker.shutdown().finally(() => process.exit(0))); // não perder os últimos spans",
|
|
213
|
+
'```',
|
|
214
|
+
'',
|
|
215
|
+
'O middleware cria um span raiz `http.server` por request, nomeado `GET /users/:id` (rota real do Express, com `baseUrl` de routers montados). Status ≥ 500 vira erro.',
|
|
216
|
+
'',
|
|
217
|
+
'## 5. Banco (pg)',
|
|
218
|
+
PG_BLOCK,
|
|
219
|
+
'',
|
|
220
|
+
'## 6. HTTP de saída e spans manuais',
|
|
221
|
+
FETCH_BLOCK,
|
|
222
|
+
'',
|
|
223
|
+
logsSection(input, service, 'any'),
|
|
224
|
+
'',
|
|
225
|
+
verifySection(input),
|
|
226
|
+
].join('\n');
|
|
227
|
+
case 'nestjs':
|
|
228
|
+
return [
|
|
229
|
+
header(input, 'Instrumentar NestJS (platform-express) com FG Tracker'),
|
|
230
|
+
'## 1. Instalar',
|
|
231
|
+
install(),
|
|
232
|
+
'',
|
|
233
|
+
'O SDK é ESM. Em projetos Nest (CommonJS) funciona com `require()` no Node ≥ 22.12 ou via `await import("fg-tracker-sdk")`.',
|
|
234
|
+
'',
|
|
235
|
+
'## 2. Variáveis de ambiente',
|
|
236
|
+
envBlock(input),
|
|
237
|
+
'',
|
|
238
|
+
'## 3. Tracker + middleware em `main.ts`',
|
|
239
|
+
'```ts',
|
|
240
|
+
'// src/main.ts',
|
|
241
|
+
"import { NestFactory } from '@nestjs/core';",
|
|
242
|
+
"import { createTracker } from 'fg-tracker-sdk';",
|
|
243
|
+
"import { AppModule } from './app.module';",
|
|
244
|
+
'',
|
|
245
|
+
'export const tracker = createTracker({',
|
|
246
|
+
` apiKey: process.env.FG_TRACKER_KEY!, // ${input.apiKey ?? PLACEHOLDER_KEY}`,
|
|
247
|
+
` endpoint: process.env.FG_TRACKER_URL ?? '${input.endpoint}',`,
|
|
248
|
+
` serviceName: '${service}',`,
|
|
249
|
+
'});',
|
|
250
|
+
'',
|
|
251
|
+
'async function bootstrap() {',
|
|
252
|
+
' const app = await NestFactory.create(AppModule);',
|
|
253
|
+
' app.use(tracker.express()); // antes de helmet/cors/pipes/prefixo global',
|
|
254
|
+
' app.enableShutdownHooks();',
|
|
255
|
+
' await app.listen(Number(process.env.PORT ?? 3000));',
|
|
256
|
+
'}',
|
|
257
|
+
'bootstrap();',
|
|
258
|
+
'```',
|
|
259
|
+
'',
|
|
260
|
+
'```ts',
|
|
261
|
+
'// src/app.module.ts (ou qualquer provider) — flush no encerramento',
|
|
262
|
+
"import { Module, OnApplicationShutdown } from '@nestjs/common';",
|
|
263
|
+
"import { tracker } from './main';",
|
|
264
|
+
'',
|
|
265
|
+
'@Module({ /* ... */ })',
|
|
266
|
+
'export class AppModule implements OnApplicationShutdown {',
|
|
267
|
+
' async onApplicationShutdown() { await tracker.shutdown(); }',
|
|
268
|
+
'}',
|
|
269
|
+
'```',
|
|
270
|
+
'',
|
|
271
|
+
'## 4. Banco (pg) — instrumente o Pool no provider que o cria',
|
|
272
|
+
'```ts',
|
|
273
|
+
'// src/database/database.module.ts',
|
|
274
|
+
"import { Module } from '@nestjs/common';",
|
|
275
|
+
"import { Pool } from 'pg';",
|
|
276
|
+
"import { tracker } from '../main';",
|
|
277
|
+
'',
|
|
278
|
+
"export const PG_POOL = 'PG_POOL';",
|
|
279
|
+
'',
|
|
280
|
+
'@Module({',
|
|
281
|
+
' providers: [{',
|
|
282
|
+
' provide: PG_POOL,',
|
|
283
|
+
' useFactory: () => tracker.instrumentPg(new Pool({ connectionString: process.env.DATABASE_URL })),',
|
|
284
|
+
' }],',
|
|
285
|
+
' exports: [PG_POOL],',
|
|
286
|
+
'})',
|
|
287
|
+
'export class DatabaseModule {}',
|
|
288
|
+
'// TypeORM/Prisma: sem hook direto ainda — use tracker.span("db.query", "nome", fn) nos repositórios críticos',
|
|
289
|
+
'```',
|
|
290
|
+
'',
|
|
291
|
+
'## 5. HTTP de saída e spans manuais',
|
|
292
|
+
FETCH_BLOCK,
|
|
293
|
+
'',
|
|
294
|
+
logsSection(input, service, 'nest'),
|
|
295
|
+
'',
|
|
296
|
+
verifySection(input),
|
|
297
|
+
].join('\n');
|
|
298
|
+
case 'nextjs':
|
|
299
|
+
return [
|
|
300
|
+
header(input, 'Instrumentar Next.js (App Router, runtime Node) com FG Tracker'),
|
|
301
|
+
'## 1. Instalar',
|
|
302
|
+
install(),
|
|
303
|
+
'',
|
|
304
|
+
'## 2. Variáveis de ambiente',
|
|
305
|
+
envBlock(input),
|
|
306
|
+
'',
|
|
307
|
+
'Só no servidor (sem `NEXT_PUBLIC_`). Route handlers precisam de `export const runtime = "nodejs"` (default) — não funciona no Edge. Em `output: "export"` não há handlers dinâmicos, nada a instrumentar.',
|
|
308
|
+
'',
|
|
309
|
+
'## 3. Tracker (singleton, sobrevive ao HMR)',
|
|
310
|
+
'```ts',
|
|
311
|
+
'// src/lib/tracker.ts',
|
|
312
|
+
"import { createTracker, type Tracker } from 'fg-tracker-sdk';",
|
|
313
|
+
'',
|
|
314
|
+
'const g = globalThis as unknown as { __fgTracker?: Tracker };',
|
|
315
|
+
'export const tracker: Tracker =',
|
|
316
|
+
' g.__fgTracker ??',
|
|
317
|
+
' (g.__fgTracker = createTracker({',
|
|
318
|
+
` apiKey: process.env.FG_TRACKER_KEY!, // ${input.apiKey ?? PLACEHOLDER_KEY}`,
|
|
319
|
+
` endpoint: process.env.FG_TRACKER_URL ?? '${input.endpoint}',`,
|
|
320
|
+
` serviceName: '${service}',`,
|
|
321
|
+
' }));',
|
|
322
|
+
'```',
|
|
323
|
+
'',
|
|
324
|
+
'## 4. Route handlers',
|
|
325
|
+
'```ts',
|
|
326
|
+
'// app/api/users/[id]/route.ts',
|
|
327
|
+
"import { tracker } from '@/lib/tracker';",
|
|
328
|
+
"import { pool } from '@/lib/db';",
|
|
329
|
+
'',
|
|
330
|
+
'export const GET = tracker.wrapNextRoute(async (_req, ctx: { params: Promise<{ id: string }> }) => {',
|
|
331
|
+
' const { id } = await ctx.params;',
|
|
332
|
+
" const { rows } = await pool.query('select * from users where id = $1', [id]);",
|
|
333
|
+
' return Response.json(rows[0] ?? null, { status: rows[0] ? 200 : 404 });',
|
|
334
|
+
'});',
|
|
335
|
+
'',
|
|
336
|
+
'export const POST = tracker.wrapNextRoute(async (req) => {',
|
|
337
|
+
' const body = await req.json();',
|
|
338
|
+
' // ...',
|
|
339
|
+
' return Response.json({ ok: true }, { status: 201 });',
|
|
340
|
+
'});',
|
|
341
|
+
'```',
|
|
342
|
+
'',
|
|
343
|
+
'O span `http.server` recebe `GET /api/users/:id` (uuids/números normalizados) e o status da `Response`; exceções viram `error`.',
|
|
344
|
+
'',
|
|
345
|
+
'## 5. Server Actions / código fora de route handlers',
|
|
346
|
+
'```ts',
|
|
347
|
+
"'use server';",
|
|
348
|
+
"import { tracker } from '@/lib/tracker';",
|
|
349
|
+
'',
|
|
350
|
+
'export async function createOrder(input: FormData) {',
|
|
351
|
+
" return tracker.span('custom', 'action createOrder', async (span) => {",
|
|
352
|
+
" span.setAttribute('items', input.getAll('item').length);",
|
|
353
|
+
' // ...',
|
|
354
|
+
' });',
|
|
355
|
+
'}',
|
|
356
|
+
'```',
|
|
357
|
+
'',
|
|
358
|
+
'## 6. Banco (pg)',
|
|
359
|
+
'```ts',
|
|
360
|
+
'// src/lib/db.ts',
|
|
361
|
+
"import { Pool } from 'pg';",
|
|
362
|
+
"import { tracker } from '@/lib/tracker';",
|
|
363
|
+
'',
|
|
364
|
+
'const g = globalThis as unknown as { __pgPool?: Pool };',
|
|
365
|
+
'export const pool = g.__pgPool ?? (g.__pgPool = tracker.instrumentPg(new Pool({ connectionString: process.env.DATABASE_URL })));',
|
|
366
|
+
'```',
|
|
367
|
+
'',
|
|
368
|
+
'## 7. HTTP de saída',
|
|
369
|
+
FETCH_BLOCK.replace("./tracker.js", '@/lib/tracker'),
|
|
370
|
+
'',
|
|
371
|
+
logsSection(input, service, 'any'),
|
|
372
|
+
'',
|
|
373
|
+
verifySection(input),
|
|
374
|
+
].join('\n');
|
|
375
|
+
case 'fastify':
|
|
376
|
+
return [
|
|
377
|
+
header(input, 'Instrumentar Fastify com FG Tracker'),
|
|
378
|
+
'O SDK não tem plugin Fastify dedicado; o middleware Express funciona num hook `onRequest` sobre `request.raw`/`reply.raw` (o hook chama `done` dentro do contexto assíncrono do span, então `instrumentPg`, `wrapFetch` e `tracker.span` enxergam o request).',
|
|
379
|
+
'',
|
|
380
|
+
'## 1. Instalar',
|
|
381
|
+
install(),
|
|
382
|
+
'',
|
|
383
|
+
'## 2. Variáveis de ambiente',
|
|
384
|
+
envBlock(input),
|
|
385
|
+
'',
|
|
386
|
+
'## 3. Tracker',
|
|
387
|
+
trackerFile(input, 'src/tracker.ts', service),
|
|
388
|
+
'',
|
|
389
|
+
'## 4. Plugin (hook onRequest)',
|
|
390
|
+
'```ts',
|
|
391
|
+
'// src/plugins/fg-tracker.ts',
|
|
392
|
+
"import fp from 'fastify-plugin';",
|
|
393
|
+
"import type { FastifyPluginCallback } from 'fastify';",
|
|
394
|
+
"import { tracker } from '../tracker.js';",
|
|
395
|
+
'',
|
|
396
|
+
'const middleware = tracker.express();',
|
|
397
|
+
'',
|
|
398
|
+
'const fgTrackerPlugin: FastifyPluginCallback = (fastify, _opts, done) => {',
|
|
399
|
+
" fastify.addHook('onRequest', (request, reply, next) => {",
|
|
400
|
+
' // rota declarada (ex.: /users/:id) para nomear o span como no Express',
|
|
401
|
+
' const raw = request.raw as typeof request.raw & { route?: { path?: string }; originalUrl?: string };',
|
|
402
|
+
' raw.route = { path: request.routeOptions?.url ?? undefined };',
|
|
403
|
+
' raw.originalUrl = request.url;',
|
|
404
|
+
' middleware(raw as never, reply.raw as never, (err?: unknown) => next(err as Error | undefined));',
|
|
405
|
+
' });',
|
|
406
|
+
' done();',
|
|
407
|
+
'};',
|
|
408
|
+
'',
|
|
409
|
+
"export default fp(fgTrackerPlugin, { name: 'fg-tracker' });",
|
|
410
|
+
'```',
|
|
411
|
+
'',
|
|
412
|
+
'```ts',
|
|
413
|
+
'// src/server.ts',
|
|
414
|
+
"import Fastify from 'fastify';",
|
|
415
|
+
"import fgTracker from './plugins/fg-tracker.js';",
|
|
416
|
+
"import { tracker } from './tracker.js';",
|
|
417
|
+
'',
|
|
418
|
+
'const app = Fastify({ logger: true });',
|
|
419
|
+
'await app.register(fgTracker); // antes das rotas',
|
|
420
|
+
'',
|
|
421
|
+
"app.get('/users/:id', async (req) => {",
|
|
422
|
+
" const { id } = req.params as { id: string };",
|
|
423
|
+
" const { rows } = await pool.query('select * from users where id = $1', [id]);",
|
|
424
|
+
' return rows[0];',
|
|
425
|
+
'});',
|
|
426
|
+
'',
|
|
427
|
+
"app.addHook('onClose', async () => { await tracker.shutdown(); });",
|
|
428
|
+
"await app.listen({ port: Number(process.env.PORT ?? 3000), host: '0.0.0.0' });",
|
|
429
|
+
'```',
|
|
430
|
+
'',
|
|
431
|
+
'Se o `fastify-plugin` não estiver no projeto: `pnpm add fastify-plugin` (ou registre o hook direto na instância principal — o hook precisa ficar no escopo raiz para valer para todas as rotas).',
|
|
432
|
+
'',
|
|
433
|
+
'## 5. Banco (pg)',
|
|
434
|
+
PG_BLOCK,
|
|
435
|
+
'',
|
|
436
|
+
'## 6. HTTP de saída e spans manuais',
|
|
437
|
+
FETCH_BLOCK,
|
|
438
|
+
'',
|
|
439
|
+
'## Alternativa: ingestão crua',
|
|
440
|
+
'Se preferir não usar o hook, envie spans direto para `POST /v1/ingest` com o header `x-fg-tracker-key` (formato em `fg-tracker://docs/quickstart`).',
|
|
441
|
+
'',
|
|
442
|
+
logsSection(input, service, 'pino'),
|
|
443
|
+
'',
|
|
444
|
+
'> Fastify já usa pino internamente: passe o transport acima em `Fastify({ logger: { transport: { targets: [...] } } })` para enviar os logs do próprio Fastify.',
|
|
445
|
+
'',
|
|
446
|
+
verifySection(input),
|
|
447
|
+
].join('\n');
|
|
448
|
+
case 'pino':
|
|
449
|
+
return [
|
|
450
|
+
header(input, 'Enviar logs do pino para o FG Tracker'),
|
|
451
|
+
'## 1. Instalar',
|
|
452
|
+
install(),
|
|
453
|
+
'',
|
|
454
|
+
'## 2. Variáveis de ambiente',
|
|
455
|
+
envBlock(input),
|
|
456
|
+
'',
|
|
457
|
+
logsSection(input, service, 'pino').replace('## Logs (opcional, recomendado)', '## 3. Transport'),
|
|
458
|
+
'',
|
|
459
|
+
'## 4. Correlação com traces',
|
|
460
|
+
'Se o processo também usa o tracker (`createTracker` + `tracker.express()`), cada log emitido durante um request ganha `traceId`/`spanId` e aparece com link para o trace no console. Sem tracker, os logs chegam normalmente, só sem correlação.',
|
|
461
|
+
'',
|
|
462
|
+
'## 5. Sintaxe de busca (`track_search_logs` e página /logs)',
|
|
463
|
+
'- texto livre → busca full-text (`websearch_to_tsquery`); `"frase exata"` entre aspas;',
|
|
464
|
+
'- `key=value` → filtra `context->>key`;',
|
|
465
|
+
'- `~trecho` → ILIKE (substring, via trigram).',
|
|
466
|
+
'',
|
|
467
|
+
verifySection(input),
|
|
468
|
+
].join('\n');
|
|
469
|
+
case 'winston':
|
|
470
|
+
return [
|
|
471
|
+
header(input, 'Enviar logs do winston para o FG Tracker'),
|
|
472
|
+
'## 1. Instalar',
|
|
473
|
+
install(),
|
|
474
|
+
'',
|
|
475
|
+
'## 2. Variáveis de ambiente',
|
|
476
|
+
envBlock(input),
|
|
477
|
+
'',
|
|
478
|
+
logsSection(input, service, 'winston').replace('## Logs (opcional, recomendado)', '## 3. Shipper + transport'),
|
|
479
|
+
'',
|
|
480
|
+
'## 4. Correlação com traces',
|
|
481
|
+
'Se o processo também usa o tracker (`createTracker` + `tracker.express()`), cada log emitido durante um request ganha `traceId`/`spanId`. Chame `logShipper.flush()` (ou `tracker.shutdown()` + `logShipper.shutdown()`) no encerramento para não perder o último lote.',
|
|
482
|
+
'',
|
|
483
|
+
'## 5. Sintaxe de busca (`track_search_logs` e página /logs)',
|
|
484
|
+
'- texto livre → full-text; `"frase exata"` entre aspas; `key=value` → `context->>key`; `~trecho` → substring.',
|
|
485
|
+
'',
|
|
486
|
+
verifySection(input),
|
|
487
|
+
].join('\n');
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
//# sourceMappingURL=guide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../src/guide.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Servidor MCP do FG Tracker (docs/CONTRATO.md §12): tools, prompt e resource.
|
|
3
|
+
* O transporte (stdio) é conectado em `cli.ts`.
|
|
4
|
+
*/
|
|
5
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
+
import { TrackClient } from './client.js';
|
|
7
|
+
import { type ToolText } from './format.js';
|
|
8
|
+
export declare const SERVER_NAME = "fg-tracker";
|
|
9
|
+
export declare const SERVER_VERSION = "0.4.0";
|
|
10
|
+
export interface CreateServerOptions {
|
|
11
|
+
client?: TrackClient;
|
|
12
|
+
}
|
|
13
|
+
export declare function createServer(options?: CreateServerOptions): McpServer;
|
|
14
|
+
export type { ToolText };
|