-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
GREEN-40: add debug endpoints behind debug middleware #15
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -6,6 +6,7 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { getActiveNodeCount } from '../NodeList' | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { spawn } from 'child_process' | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import * as process from 'process' | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { isDebugMiddleware } from '../DebugMode' | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type CounterMap = Map<string, CounterNode> | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interface CounterNode { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -38,21 +39,29 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
registerEndpoints(): void { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.server.get('/memory', (req, res) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const toMB = 1 / 1000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const report = process.memoryUsage() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let outputStr = '' | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `System Memory Report. Timestamp: ${Date.now()}\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `rss: ${(report.rss * toMB).toFixed(2)} MB\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `heapTotal: ${(report.heapTotal * toMB).toFixed(2)} MB\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `heapUsed: ${(report.heapUsed * toMB).toFixed(2)} MB\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `external: ${(report.external * toMB).toFixed(2)} MB\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `arrayBuffers: ${(report.arrayBuffers * toMB).toFixed(2)} MB\n\n\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.gatherReport() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr = this.reportToStream(this.report, outputStr) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res.send(outputStr) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.server.get( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'/memory', | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
preHandler: async (_request, reply) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isDebugMiddleware(_request, reply) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(req, res) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const toMB = 1 / 1000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const report = process.memoryUsage() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let outputStr = '' | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `System Memory Report. Timestamp: ${Date.now()}\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `rss: ${(report.rss * toMB).toFixed(2)} MB\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `heapTotal: ${(report.heapTotal * toMB).toFixed(2)} MB\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `heapUsed: ${(report.heapUsed * toMB).toFixed(2)} MB\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `external: ${(report.external * toMB).toFixed(2)} MB\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr += `arrayBuffers: ${(report.arrayBuffers * toMB).toFixed(2)} MB\n\n\n` | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.gatherReport() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
outputStr = this.reportToStream(this.report, outputStr) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res.send(outputStr) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// this.server.get('memory-gc', (req, res) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// res.write(`System Memory Report. Timestamp: ${Date.now()}\n`) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -69,37 +78,53 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// res.end() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// }) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.server.get('/top', (req, res) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const top = spawn('top', ['-n', '10']) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
top.stdout.on('data', (dataBuffer) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res.send(dataBuffer.toString()) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
top.kill() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
top.on('close', (code) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log(`child process exited with code ${code}`) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
top.stderr.on('data', (data) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log('top command error', data) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res.send('top command error') | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
top.kill() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.server.get('/df', (req, res) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const df = spawn('df') | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
df.stdout.on('data', (dataBuffer) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res.send(dataBuffer.toString()) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
df.kill() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
df.on('close', (code) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log(`child process exited with code ${code}`) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
df.stderr.on('data', (data) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log('df command error', data) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res.send('df command error') | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
df.kill() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.server.get( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'/top', | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
preHandler: async (_request, reply) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isDebugMiddleware(_request, reply) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(req, res) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const top = spawn('top', ['-n', '10']) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
top.stdout.on('data', (dataBuffer) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res.send(dataBuffer.toString()) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
top.kill() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
top.on('close', (code) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log(`child process exited with code ${code}`) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
top.stderr.on('data', (data) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log('top command error', data) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res.send('top command error') | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
top.kill() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.server.get( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'/df', | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
preHandler: async (_request, reply) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isDebugMiddleware(_request, reply) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(req, res) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const df = spawn('df') | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
df.stdout.on('data', (dataBuffer) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res.send(dataBuffer.toString()) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
df.kill() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
df.on('close', (code) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log(`child process exited with code ${code}`) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
df.stderr.on('data', (data) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log('df command error', data) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res.send('df command error') | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
df.kill() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+112
to
+126
Check failure Code scanning / CodeQL Missing rate limiting High
This route handler performs
a system command Error loading related location Loading
Copilot Autofix AI 6 months ago The best way to fix the problem is to add rate limiting to the route handler that performs the system command. This can be done by using a rate limiting middleware such as Here are the steps to fix the problem:
Suggested changeset
2
src/profiler/memoryReporting.ts
package.json
Outside changed files
This fix introduces these dependencies
Copilot is powered by AI and may make mistakes. Always verify output.
Refresh and try again.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
updateCpuPercent(): void { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Check failure
Code scanning / CodeQL
Missing rate limiting High
Copilot Autofix AI 6 months ago
The best way to fix the problem is to add rate limiting to the route handlers that perform system commands. This can be done by using a rate limiting middleware such as
fastify-rate-limit
.The
fastify-rate-limit
package provides a rate limiting middleware for Fastify applications. It can be used to limit the rate at which requests are accepted, thus preventing denial-of-service attacks.To fix the problem, you need to install the
fastify-rate-limit
package and use it in your Fastify application. You can do this by adding thefastify-rate-limit
import at the top of your file, initializing the rate limiter, and then applying it to your Fastify server with theregister
method.The rate limiter can be configured with various options such as
max
(the maximum number of requests allowed in the time window),timeWindow
(the duration of the time window), andallowList
(an array of IP addresses that are not subject to rate limiting).In this case, you can set
max
to a reasonable number that allows your application to handle the expected load but prevents excessive requests. ThetimeWindow
can be set to '1 minute' to limit the rate of requests per minute. You can leave theallowList
empty if you want to apply rate limiting to all clients.