github.com/unigraph-dev/dgraph@v1.1.1-0.20200923154953-8b52b426f765/x/profile.go (about) 1 /* 2 * Copyright 2017-2018 Dgraph Labs, Inc. and Contributors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package x 18 19 import ( 20 "fmt" 21 "os" 22 "runtime" 23 24 "github.com/pkg/profile" 25 "github.com/spf13/viper" 26 ) 27 28 // Stopper is an interface tasked with stopping the profiling process. 29 type Stopper interface { 30 Stop() 31 } 32 33 // StartProfile starts a new mode for profiling. 34 func StartProfile(conf *viper.Viper) Stopper { 35 profileMode := conf.GetString("profile_mode") 36 switch profileMode { 37 case "cpu": 38 return profile.Start(profile.CPUProfile) 39 case "mem": 40 return profile.Start(profile.MemProfile) 41 case "mutex": 42 return profile.Start(profile.MutexProfile) 43 case "block": 44 blockRate := conf.GetInt("block_rate") 45 runtime.SetBlockProfileRate(blockRate) 46 return profile.Start(profile.BlockProfile) 47 case "": 48 // do nothing 49 return noOpStopper{} 50 default: 51 fmt.Printf("Invalid profile mode: %q\n", profileMode) 52 os.Exit(1) 53 return noOpStopper{} 54 } 55 } 56 57 type noOpStopper struct{} 58 59 func (noOpStopper) Stop() {}