mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-04-06 00:32:12 +02:00
208 lines
5.2 KiB
TypeScript
208 lines
5.2 KiB
TypeScript
export interface ParsedStackFrame {
|
|
functionName: string;
|
|
fileName: string;
|
|
lineNumber: number;
|
|
}
|
|
|
|
export default class ProfileUtil {
|
|
public static getProfileTypeDisplayName(profileType: string): string {
|
|
const type: string = profileType.toLowerCase().trim();
|
|
|
|
switch (type) {
|
|
case "cpu":
|
|
return "CPU Usage";
|
|
case "wall":
|
|
return "Wall Clock Time";
|
|
case "inuse_objects":
|
|
return "Memory Objects in Use";
|
|
case "inuse_space":
|
|
return "Memory Space in Use";
|
|
case "alloc_objects":
|
|
return "Memory Allocations (Count)";
|
|
case "alloc_space":
|
|
return "Memory Allocations (Size)";
|
|
case "goroutine":
|
|
return "Goroutines";
|
|
case "contention":
|
|
return "Lock Contention";
|
|
case "samples":
|
|
return "CPU Samples";
|
|
case "mutex":
|
|
return "Mutex Contention";
|
|
case "block":
|
|
return "Blocking Operations";
|
|
case "heap":
|
|
return "Heap Memory";
|
|
default:
|
|
return profileType;
|
|
}
|
|
}
|
|
|
|
public static getProfileTypeBadgeColor(profileType: string): string {
|
|
const type: string = profileType.toLowerCase().trim();
|
|
|
|
switch (type) {
|
|
case "cpu":
|
|
case "samples":
|
|
return "bg-orange-100 text-orange-800";
|
|
case "wall":
|
|
return "bg-purple-100 text-purple-800";
|
|
case "inuse_objects":
|
|
case "inuse_space":
|
|
case "alloc_objects":
|
|
case "alloc_space":
|
|
case "heap":
|
|
return "bg-blue-100 text-blue-800";
|
|
case "goroutine":
|
|
return "bg-green-100 text-green-800";
|
|
case "contention":
|
|
case "mutex":
|
|
case "block":
|
|
return "bg-red-100 text-red-800";
|
|
default:
|
|
return "bg-gray-100 text-gray-800";
|
|
}
|
|
}
|
|
|
|
public static getFrameTypeColor(frameType: string): string {
|
|
const type: string = frameType.toLowerCase();
|
|
|
|
switch (type) {
|
|
case "kernel":
|
|
return "bg-red-500";
|
|
case "native":
|
|
return "bg-orange-500";
|
|
case "jvm":
|
|
return "bg-green-500";
|
|
case "cpython":
|
|
return "bg-blue-500";
|
|
case "go":
|
|
return "bg-cyan-500";
|
|
case "v8js":
|
|
return "bg-yellow-500";
|
|
default:
|
|
return "bg-gray-400";
|
|
}
|
|
}
|
|
|
|
public static getFrameTypeTextColor(frameType: string): string {
|
|
const type: string = frameType.toLowerCase();
|
|
|
|
switch (type) {
|
|
case "kernel":
|
|
return "text-red-700";
|
|
case "native":
|
|
return "text-orange-700";
|
|
case "jvm":
|
|
return "text-green-700";
|
|
case "cpython":
|
|
return "text-blue-700";
|
|
case "go":
|
|
return "text-cyan-700";
|
|
case "v8js":
|
|
return "text-yellow-700";
|
|
default:
|
|
return "text-gray-600";
|
|
}
|
|
}
|
|
|
|
public static getFrameTypeBgLight(frameType: string): string {
|
|
const type: string = frameType.toLowerCase();
|
|
|
|
switch (type) {
|
|
case "kernel":
|
|
return "bg-red-400";
|
|
case "native":
|
|
return "bg-orange-400";
|
|
case "jvm":
|
|
return "bg-green-400";
|
|
case "cpython":
|
|
return "bg-blue-400";
|
|
case "go":
|
|
return "bg-cyan-400";
|
|
case "v8js":
|
|
return "bg-yellow-400";
|
|
default:
|
|
return "bg-gray-300";
|
|
}
|
|
}
|
|
|
|
public static parseStackFrame(frame: string): ParsedStackFrame {
|
|
// Format: "function@file:line"
|
|
const atIndex: number = frame.indexOf("@");
|
|
|
|
if (atIndex === -1) {
|
|
return {
|
|
functionName: frame,
|
|
fileName: "",
|
|
lineNumber: 0,
|
|
};
|
|
}
|
|
|
|
const functionName: string = frame.substring(0, atIndex);
|
|
const rest: string = frame.substring(atIndex + 1);
|
|
|
|
const lastColonIndex: number = rest.lastIndexOf(":");
|
|
|
|
if (lastColonIndex === -1) {
|
|
return {
|
|
functionName,
|
|
fileName: rest,
|
|
lineNumber: 0,
|
|
};
|
|
}
|
|
|
|
const fileName: string = rest.substring(0, lastColonIndex);
|
|
const lineStr: string = rest.substring(lastColonIndex + 1);
|
|
const lineNumber: number = parseInt(lineStr, 10);
|
|
|
|
return {
|
|
functionName,
|
|
fileName,
|
|
lineNumber: isNaN(lineNumber) ? 0 : lineNumber,
|
|
};
|
|
}
|
|
|
|
public static formatProfileValue(value: number, unit: string): string {
|
|
const lowerUnit: string = unit.toLowerCase();
|
|
|
|
if (lowerUnit === "nanoseconds" || lowerUnit === "ns") {
|
|
if (value >= 1_000_000_000) {
|
|
return `${(value / 1_000_000_000).toFixed(2)}s`;
|
|
}
|
|
if (value >= 1_000_000) {
|
|
return `${(value / 1_000_000).toFixed(2)}ms`;
|
|
}
|
|
if (value >= 1_000) {
|
|
return `${(value / 1_000).toFixed(2)}us`;
|
|
}
|
|
return `${value}ns`;
|
|
}
|
|
|
|
if (lowerUnit === "bytes" || lowerUnit === "byte") {
|
|
if (value >= 1_073_741_824) {
|
|
return `${(value / 1_073_741_824).toFixed(2)} GB`;
|
|
}
|
|
if (value >= 1_048_576) {
|
|
return `${(value / 1_048_576).toFixed(2)} MB`;
|
|
}
|
|
if (value >= 1_024) {
|
|
return `${(value / 1_024).toFixed(2)} KB`;
|
|
}
|
|
return `${value} B`;
|
|
}
|
|
|
|
if (lowerUnit === "count" || lowerUnit === "samples") {
|
|
if (value >= 1_000_000) {
|
|
return `${(value / 1_000_000).toFixed(2)}M`;
|
|
}
|
|
if (value >= 1_000) {
|
|
return `${(value / 1_000).toFixed(2)}K`;
|
|
}
|
|
return `${value}`;
|
|
}
|
|
|
|
return `${value} ${unit}`;
|
|
}
|
|
}
|