function parsePprofText()

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
  };
}