blob: 6bb2d59d02ebcb764f80fa67b3b1cff2d462de44 [file] [log] [blame]
// Package profiler provides fucntionality for collecting the following
// information: USE Metrics for various components of the Linux system
// (CPU, Memory, Disk I/O), kernel trace output, output of arbitray
// shell command provided by the oncall.
package profiler
import (
"time"
)
// USEMetrics contain the USE metrics (utilization, saturation, errors)
// for a particular component of the system.
type USEMetrics struct {
// Timestamp refers to the point in time when the USE metrics for this
// component was collected.
Timestamp time.Time
// Interval refers to the time interval for which the USE metrics for this
// component was collected.
Interval time.Duration
// Utilization is the percent over a time interval for which the resource
// was busy servicing work.
Utilization float64
// Saturation is the degree to which the resource has extra work which it
// can’t service. The value for Saturation has different meanings
// depending on the component being analyzed. But for simplicity sake
// Saturation here is just a bool which tells us whether this specific
// component is saturated or not.
Saturation bool
// Errors is the number of errors seen in the component over a given
// time interval.
Errors int64
}
// USEReport contains the USE Report from a single run of the node profiler.
// The USE Report contains helpful information to help diagnose performance
// issues seen by customers on their k8s clusters.
type USEReport struct {
// Components contains the USE Metrics for each component of the system.
// Such components include CPU, memory, network, storage, etc.
Components []Component
// Analysis provides insights into the USE metrics collected, including
// a guess as to which component may be causing performance issues.
Analysis string
}
// ProfilerReport contains debugging information provided by the profiler
// tool. Currently, it will only provide USEMetrics (Utilization,
// Saturation, Errors), kernel trace outputs, and the outputs of
// arbitrary shell commands provided by the user.
// In future, we can add following different types of dynamic reports:
//
// type PerfReport - Captures perf command output
// type STraceReport - Captures strace output
// type BPFTraceReport - Allows users to add eBPF hooks and capture its
// output
type ProfilerReport struct {
// Static reports
// USEMetrics provides Utilization, Saturation and Errors for different
// components on the system
USEInfo USEReport
// RawCommands captures the output of arbitrary shell commands provided
// by the user. Example usage: count # of systemd units; count # of
// cgroups
RawCommands map[string][]byte
// Dynamic tracing reports
// KernelTraces captures the output of the ftrace command. The key is the
// kernel trace point and the value is the output
KernelTraces map[string][]byte
}
// ProfilerConfig tells the profiler which dynamic reports it should
// generate and capture.
type ProfilerConfig struct {
// KernelTracePoints are the trace points we should insert and capture.
KernelTracePoints []string
// RawCommands are the shell commands that we should run and capture
// output.
RawCommands []string
}
// GenerateProfilerReport generates a report which consists of multiple
// reports of different types. ProfilerConfig is passed as an input
// parameter that tells the Profiler tool which reports to capture
func GenerateProfilerReport(config ProfilerConfig) (*ProfilerReport, error) {
return &ProfilerReport{}, nil
}