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  }