package traceviewer

import "internal/trace/traceviewer"

Index

Constants

const (
	// Special P identifiers:
	FakeP    = 1000000 + iota
	TimerP   // depicts timer unblocks
	NetpollP // depicts network unblocks
	SyscallP // depicts returns from syscalls
	GCP      // depicts GC state
	ProfileP // depicts recording of CPU profile samples
)
const CommonStyle = `
/* See https://github.com/golang/pkgsite/blob/master/static/shared/typography/typography.css */
body {
  font-family:	-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
  font-size:	1rem;
  line-height:	normal;
  max-width:	9in;
  margin:	1em;
}
h1 { font-size: 1.5rem; }
h2 { font-size: 1.375rem; }
h1,h2 {
  font-weight: 600;
  line-height: 1.25em;
  word-break: break-word;
}
p  { color: grey85; font-size:85%; }
code,
pre,
textarea.code {
  font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;
  font-size: 0.875rem;
  line-height: 1.5em;
}

pre,
textarea.code {
  background-color: var(--color-background-accented);
  border: var(--border);
  border-radius: var(--border-radius);
  color: var(--color-text);
  overflow-x: auto;
  padding: 0.625rem;
  tab-size: 4;
  white-space: pre;
}
`

Functions

func BuildProfile

func BuildProfile(prof []ProfileRecord) *profile.Profile

func MMUHandlerFunc

func MMUHandlerFunc(ranges []Range, f MutatorUtilFunc) http.HandlerFunc

func MainHandler

func MainHandler(views []View) http.Handler

func SVGProfileHandlerFunc

func SVGProfileHandlerFunc(f ProfileFunc) http.HandlerFunc

SVGProfileHandlerFunc serves pprof-like profile generated by prof as svg.

func StaticHandler

func StaticHandler() http.Handler

func TraceHandler

func TraceHandler() http.Handler

func WalkStackFrames

func WalkStackFrames(allFrames map[string]format.Frame, id int, fn func(id int))

WalkStackFrames calls fn for id and all of its parent frames from allFrames.

Types

type ArrowEvent

type ArrowEvent struct {
	Name         string
	Start        time.Duration
	End          time.Duration
	FromResource uint64
	FromStack    int
	ToResource   uint64
}

type AsyncSliceEvent

type AsyncSliceEvent struct {
	SliceEvent
	Category       string
	Scope          string
	TaskColorIndex uint64 // Take on the same color as the task with this ID.
}

type Emitter

type Emitter struct {
	// contains filtered or unexported fields
}
func NewEmitter
func NewEmitter(c TraceConsumer, rangeStart, rangeEnd time.Duration) *Emitter

NewEmitter returns a new Emitter that writes to c. The rangeStart and rangeEnd args are used for splitting large traces.

func (*Emitter) Arrow
func (e *Emitter) Arrow(a ArrowEvent)
func (*Emitter) AsyncSlice
func (e *Emitter) AsyncSlice(s AsyncSliceEvent)
func (*Emitter) Err
func (e *Emitter) Err() error

Err returns an error if the emitter is in an invalid state.

func (*Emitter) Event
func (e *Emitter) Event(ev *format.Event)
func (*Emitter) Flush
func (e *Emitter) Flush()
func (*Emitter) Focus
func (e *Emitter) Focus(id uint64)
func (*Emitter) Gomaxprocs
func (e *Emitter) Gomaxprocs(v uint64)
func (*Emitter) GoroutineTransition
func (e *Emitter) GoroutineTransition(ts time.Duration, from, to GState)
func (*Emitter) HeapAlloc
func (e *Emitter) HeapAlloc(ts time.Duration, v uint64)
func (*Emitter) HeapGoal
func (e *Emitter) HeapGoal(ts time.Duration, v uint64)
func (*Emitter) IncThreadStateCount
func (e *Emitter) IncThreadStateCount(ts time.Duration, state ThreadState, delta int64)
func (*Emitter) Instant
func (e *Emitter) Instant(i InstantEvent)
func (*Emitter) OptionalEvent
func (e *Emitter) OptionalEvent(ev *format.Event)

OptionalEvent emits ev if it's within the time range of the consumer, i.e. the selected trace split range.

func (*Emitter) Resource
func (e *Emitter) Resource(id uint64, name string)
func (*Emitter) SetResourceFilter
func (e *Emitter) SetResourceFilter(filter func(uint64) bool)
func (*Emitter) SetResourceType
func (e *Emitter) SetResourceType(name string)
func (*Emitter) Slice
func (e *Emitter) Slice(s SliceEvent)
func (*Emitter) Stack
func (e *Emitter) Stack(stk []trace.StackFrame) int

Stack emits the given frames and returns a unique id for the stack. No pointers to the given data are being retained beyond the call to Stack.

func (*Emitter) Task
func (e *Emitter) Task(id uint64, name string, sortIndex int)
func (*Emitter) TaskArrow
func (e *Emitter) TaskArrow(a ArrowEvent)
func (*Emitter) TaskSlice
func (e *Emitter) TaskSlice(s SliceEvent)

type GState

type GState int
const (
	GDead GState = iota
	GRunnable
	GRunning
	GWaiting
	GWaitingGC
)

type InstantEvent

type InstantEvent struct {
	Ts       time.Duration
	Name     string
	Category string
	Resource uint64
	Stack    int
	Arg      any
}

type Mode

type Mode int
const (
	ModeGoroutineOriented Mode = 1 << iota
	ModeTaskOriented
	ModeThreadOriented // Mutually exclusive with ModeGoroutineOriented.
)

type MutatorUtilFunc

type MutatorUtilFunc func(trace.UtilFlags) ([][]trace.MutatorUtil, error)

type ProfileFunc

type ProfileFunc func(r *http.Request) ([]ProfileRecord, error)

type ProfileRecord

type ProfileRecord struct {
	Stack []trace.StackFrame
	Count uint64
	Time  time.Duration
}

type Range

type Range struct {
	Name      string
	Start     int
	End       int
	StartTime int64
	EndTime   int64
}
func (Range) URL
func (r Range) URL(viewType ViewType) string

type SliceEvent

type SliceEvent struct {
	Name     string
	Ts       time.Duration
	Dur      time.Duration
	Resource uint64
	Stack    int
	EndStack int
	Arg      any
}

type ThreadState

type ThreadState int
const (
	ThreadStateInSyscall ThreadState = iota
	ThreadStateInSyscallRuntime
	ThreadStateRunning
)

type TimeHistogram

type TimeHistogram struct {
	Count                int
	Buckets              []int
	MinBucket, MaxBucket int
}

TimeHistogram is an high-dynamic-range histogram for durations.

func (*TimeHistogram) Add
func (h *TimeHistogram) Add(d time.Duration)

Add adds a single sample to the histogram.

func (*TimeHistogram) BucketMin
func (h *TimeHistogram) BucketMin(bucket int) time.Duration

BucketMin returns the minimum duration value for a provided bucket.

func (*TimeHistogram) ToHTML
func (h *TimeHistogram) ToHTML(urlmaker func(min, max time.Duration) string) template.HTML

ToHTML renders the histogram as HTML.

type TraceConsumer

type TraceConsumer struct {
	ConsumeTimeUnit    func(unit string)
	ConsumeViewerEvent func(v *format.Event, required bool)
	ConsumeViewerFrame func(key string, f format.Frame)
	Flush              func()
}
func SplittingTraceConsumer
func SplittingTraceConsumer(max int) (*splitter, TraceConsumer)
func ViewerDataTraceConsumer
func ViewerDataTraceConsumer(w io.Writer, startIdx, endIdx int64) TraceConsumer

ViewerDataTraceConsumer returns a TraceConsumer that writes to w. The startIdx and endIdx are used for splitting large traces. They refer to indexes in the traceEvents output array, not the events in the trace input.

type View

type View struct {
	Type   ViewType
	Ranges []Range
}
func (View) URL
func (v View) URL(rangeIdx int) string

type ViewType

type ViewType string
const (
	ViewProc   ViewType = "proc"
	ViewThread ViewType = "thread"
)

Directories

format Package traceviewer provides definitions of the JSON data structures used by the Chrome trace viewer.