github.com/GuanceCloud/cliutils@v1.1.21/pprofparser/service/parsing/sampletype.go (about) 1 package parsing 2 3 import ( 4 "fmt" 5 "github.com/GuanceCloud/cliutils/pprofparser/domain/events" 6 "github.com/GuanceCloud/cliutils/pprofparser/domain/languages" 7 ) 8 9 type SampleFile struct { 10 Filename string 11 SampleType string 12 } 13 14 var typeSampleFileMap = generateDictByEvent(pprofTypeMaps) 15 16 func generateDictByEvent(pprofTypeMaps map[languages.Lang]fileSampleTypesMap) map[languages.Lang]map[events.Type]*SampleFile { 17 result := make(map[languages.Lang]map[events.Type]*SampleFile, len(pprofTypeMaps)) 18 19 for lang, sampleTypes := range pprofTypeMaps { 20 if _, ok := result[lang]; !ok { 21 result[lang] = make(map[events.Type]*SampleFile, len(sampleTypes)) 22 } 23 24 for filename, eventsMap := range sampleTypes { 25 for typeName, typeID := range eventsMap { 26 result[lang][typeID] = &SampleFile{Filename: filename, SampleType: typeName} 27 } 28 } 29 } 30 31 return result 32 } 33 34 var pprofTypeMaps = map[languages.Lang]fileSampleTypesMap{ 35 languages.Python: pyPprofTypeMaps, 36 languages.GoLang: goPprofTypeMaps, 37 languages.NodeJS: nodejsEventMaps, 38 languages.DotNet: dotnetPProfEventMaps, 39 languages.PHP: phpEventMaps, 40 } 41 42 type fileSampleTypesMap map[string]map[string]events.Type 43 44 var pyPprofTypeMaps = fileSampleTypesMap{ 45 "prof|auto|*.pprof": { 46 // "cpu-samples": events.CpuSamples, 47 "cpu-time": events.CpuTime, 48 "wall-time": events.WallTime, 49 "exception-samples": events.ThrownExceptions, 50 "lock-acquire": events.LockAcquires, 51 "lock-acquire-wait": events.LockWaitTime, 52 "lock-release": events.LockReleases, 53 "lock-release-hold": events.LockedTime, 54 "alloc-samples": events.Allocations, 55 "alloc-space": events.AllocatedMemory, 56 "heap-space": events.HeapLiveSize, 57 }, 58 } 59 var dotnetPProfEventMaps = fileSampleTypesMap{ 60 "prof|auto|*.pprof": { 61 "cpu": events.CpuTime, 62 "exception": events.ThrownExceptions, 63 "alloc-samples": events.Allocations, 64 "alloc-size": events.AllocatedMemory, 65 "inuse-objects": events.HeapLiveObjects, 66 "inuse-space": events.HeapLiveSize, 67 "wall": events.WallTime, 68 "lock-count": events.LockAcquires, 69 "lock-time": events.LockWaitTime, 70 }, 71 } 72 73 var phpEventMaps = fileSampleTypesMap{ 74 "prof|auto|*.pprof": { 75 "cpu-time": events.CpuTime, 76 "sample": events.CpuSamples, 77 "wall-time": events.WallTime, 78 "alloc-samples": events.Allocations, 79 "alloc-size": events.AllocatedMemory, 80 }, 81 } 82 83 var nodejsEventMaps = fileSampleTypesMap{ 84 "cpu.pprof": { 85 "": events.CpuSamples, 86 }, 87 88 "inuse_objects.pprof": { 89 "": events.HeapLiveObjects, 90 }, 91 92 "inuse_space.pprof": { 93 "": events.HeapLiveSize, 94 }, 95 } 96 97 var goPprofTypeMaps = fileSampleTypesMap{ 98 "cpu.pprof|*cpu.pprof*": { 99 "cpu": events.CpuTime, 100 }, 101 "delta-heap.pprof|*delta-heap.pprof*": { 102 "alloc_objects": events.Allocations, 103 "alloc_space": events.AllocatedMemory, 104 "inuse_objects": events.HeapLiveObjects, 105 "inuse_space": events.HeapLiveSize, 106 }, 107 "delta-mutex.pprof|*delta-mutex.pprof*": { 108 "delay": events.Mutex, 109 }, 110 "delta-block.pprof|*delta-block.pprof*": { 111 "delay": events.Block, 112 }, 113 "goroutines.pprof|*goroutines.pprof*": { 114 "goroutine": events.Goroutines, 115 }, 116 } 117 118 func getFileSampleTypes(lang languages.Lang) fileSampleTypesMap { 119 if typesMap, ok := pprofTypeMaps[lang]; ok { 120 return typesMap 121 } 122 return nil 123 } 124 125 func GetFileByEvent(lang languages.Lang, typ events.Type) (*SampleFile, error) { 126 typeFileMap, ok := typeSampleFileMap[lang] 127 128 if !ok { 129 return nil, fmt.Errorf("not supported lang: %s", lang) 130 } 131 132 sampleFile, ok := typeFileMap[typ] 133 if !ok { 134 return nil, fmt.Errorf("not supported event type: %s", typ) 135 } 136 137 return sampleFile, nil 138 }