in middleware/utils/pprofConverter.js [36:96]
function parsePprofText(content) {
// Extract header information
const timeMatch = content.match(/Time: (.*)/);
const timeStr = timeMatch ? timeMatch[1] : 'Unknown';
const samplesMatch = content.match(/Showing nodes accounting for (\d+)samples, ([\d.]+)% of (\d+)samples total/);
let shownSamples = 0, shownPercent = 0, totalSamples = 0;
if (samplesMatch) {
shownSamples = parseInt(samplesMatch[1], 10);
shownPercent = parseFloat(samplesMatch[2]);
totalSamples = parseInt(samplesMatch[3], 10);
}
const droppedMatch = content.match(/Dropped (\d+) nodes \(cum <= (\d+)samples\)/);
const droppedNodes = droppedMatch ? parseInt(droppedMatch[1], 10) : 0;
// Parse profiling data
const dataLines = content.split('\n');
let startIdx = 0;
for (let i = 0; i < dataLines.length; i++) {
if (dataLines[i].trim().startsWith('flat flat%')) {
startIdx = i + 1;
break;
}
}
const profileEntries = [];
const lineRegex = /(\d+)samples\s+([\d.]+)%\s+([\d.]+)%\s+(\d+)samples\s+([\d.]+)%\s+(.+)/;
for (let i = startIdx; i < dataLines.length; i++) {
const line = dataLines[i].trim();
if (!line) continue;
const match = line.match(lineRegex);
if (match) {
const entry = {
flat_samples: parseInt(match[1], 10),
flat_percent: parseFloat(match[2]),
sum_percent: parseFloat(match[3]),
cum_samples: parseInt(match[4], 10),
cum_percent: parseFloat(match[5]),
function: match[6].trim()
};
profileEntries.push(entry);
}
}
// Build the result
return {
metadata: {
time: timeStr,
total_samples: totalSamples,
shown_samples: shownSamples,
shown_percent: shownPercent,
dropped_nodes: droppedNodes
},
profile_entries: profileEntries
};
}