in middleware/utils/pprofConverter.js [101:139]
function toMarkdown(data) {
let md = [`# CPU Profile Analysis\n\n`];
md.push(`**Time:** ${data.metadata.time}\n\n`);
md.push(`**Samples:** ${data.metadata.shown_samples} of ${data.metadata.total_samples} (${data.metadata.shown_percent}%)\n\n`);
md.push(`**Dropped Nodes:** ${data.metadata.dropped_nodes}\n\n`);
md.push(`## Profile Data\n\n`);
md.push(`| Flat Samples | Flat % | Sum % | Cum Samples | Cum % | Function |\n`);
md.push(`|-------------|--------|-------|-------------|-------|----------|\n`);
for (const entry of data.profile_entries) {
md.push(`| ${entry.flat_samples} | ${entry.flat_percent}% | ${entry.sum_percent}% | ` +
`${entry.cum_samples} | ${entry.cum_percent}% | \`${entry.function}\` |\n`);
}
// Add summary section with insights
md.push(`\n## Performance Insights\n\n`);
// Top functions by flat and cumulative time
const flatTop = [...data.profile_entries]
.sort((a, b) => b.flat_samples - a.flat_samples)
.slice(0, 5);
const cumTop = [...data.profile_entries]
.sort((a, b) => b.cum_samples - a.cum_samples)
.slice(0, 5);
md.push(`### Top Functions by Self Time\n\n`);
flatTop.forEach((entry, i) => {
md.push(`${i+1}. \`${entry.function}\` - ${entry.flat_percent}% of total time\n`);
});
md.push(`\n### Top Functions by Cumulative Time\n\n`);
cumTop.forEach((entry, i) => {
md.push(`${i+1}. \`${entry.function}\` - ${entry.cum_percent}% of total time\n`);
});
return md.join('');
}