Source file src/internal/trace/tracev2/spec.go
1 // Copyright 2023 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package tracev2 6 7 // EventType indicates an event's type from which its arguments and semantics can be 8 // derived. Its representation matches the wire format's representation of the event 9 // types that precede all event data. 10 type EventType uint8 11 12 // EventSpec is a specification for a trace event. It contains sufficient information 13 // to perform basic parsing of any trace event for any version of Go. 14 type EventSpec struct { 15 // Name is the human-readable name of the trace event. 16 Name string 17 18 // Args contains the names of each trace event's argument. 19 // Its length determines the number of arguments an event has. 20 // 21 // Argument names follow a certain structure and this structure 22 // is relied on by the testing framework to type-check arguments 23 // and to produce Values for experimental events. 24 // 25 // The structure is: 26 // 27 // (?P<name>[A-Za-z]+)(_(?P<type>[A-Za-z]+))? 28 // 29 // In sum, it's a name followed by an optional type. 30 // If the type is present, it is preceded with an underscore. 31 // Arguments without types will be interpreted as just raw uint64s. 32 // The valid argument types and the Go types they map to are listed 33 // in the ArgTypes variable. 34 Args []string 35 36 // StringIDs indicates which of the arguments are string IDs. 37 StringIDs []int 38 39 // StackIDs indicates which of the arguments are stack IDs. 40 // 41 // The list is not sorted. The first index always refers to 42 // the main stack for the current execution context of the event. 43 StackIDs []int 44 45 // StartEv indicates the event type of the corresponding "start" 46 // event, if this event is an "end," for a pair of events that 47 // represent a time range. 48 StartEv EventType 49 50 // IsTimedEvent indicates whether this is an event that both 51 // appears in the main event stream and is surfaced to the 52 // trace reader. 53 // 54 // Events that are not "timed" are considered "structural" 55 // since they either need significant reinterpretation or 56 // otherwise aren't actually surfaced by the trace reader. 57 IsTimedEvent bool 58 59 // HasData is true if the event has trailer consisting of a 60 // varint length followed by unencoded bytes of some data. 61 // 62 // An event may not be both a timed event and have data. 63 HasData bool 64 65 // IsStack indicates that the event represents a complete 66 // stack trace. Specifically, it means that after the arguments 67 // there's a varint length, followed by 4*length varints. Each 68 // group of 4 represents the PC, file ID, func ID, and line number 69 // in that order. 70 IsStack bool 71 72 // Experiment indicates the ID of an experiment this event is associated 73 // with. If Experiment is not NoExperiment, then the event is experimental 74 // and will be exposed as an EventExperiment. 75 Experiment Experiment 76 } 77 78 // EventArgTypes is a list of valid argument types for use in Args. 79 // 80 // See the documentation of Args for more details. 81 var EventArgTypes = [...]string{ 82 "seq", // sequence number 83 "pstatus", // P status 84 "gstatus", // G status 85 "g", // trace.GoID 86 "m", // trace.ThreadID 87 "p", // trace.ProcID 88 "string", // string ID 89 "stack", // stack ID 90 "value", // uint64 91 "task", // trace.TaskID 92 } 93 94 // EventNames is a helper that produces a mapping of event names to event types. 95 func EventNames(specs []EventSpec) map[string]EventType { 96 nameToType := make(map[string]EventType) 97 for i, spec := range specs { 98 nameToType[spec.Name] = EventType(byte(i)) 99 } 100 return nameToType 101 } 102 103 // Experiment is an experiment ID that events may be associated with. 104 type Experiment uint 105 106 // NoExperiment is the reserved ID 0 indicating no experiment. 107 const NoExperiment Experiment = 0 108