monitoring/profiler.go (51 lines of code) (raw):

//go:build continuous_profiler_stackdriver package monitoring import ( "net/url" "os" "cloud.google.com/go/profiler" "gitlab.com/gitlab-org/labkit/log" "google.golang.org/api/option" ) const profilerEnvKey = "GITLAB_CONTINUOUS_PROFILING" // Exposing to tests. var profStart = profiler.Start func initProfiler(opts profilerOpts) { driverParams, exists := os.LookupEnv(profilerEnvKey) if !exists { return } u, err := url.Parse(driverParams) if err != nil { log.WithError(err).Warn("unable to parse env var content") return } query := u.Query() driverName := u.Path if driverName != "stackdriver" { log.WithField("driver", driverName).Warn("unknown driver") return } config := profiler.Config{ Service: query.Get("service"), ServiceVersion: query.Get("service_version"), ProjectID: query.Get("project_id"), DebugLogging: query.Get("debug_logging") == "true", MutexProfiling: true, } // If the service version is given through opts, it takes precedence. if opts.ServiceVersion != "" { config.ServiceVersion = opts.ServiceVersion } var clientOpts []option.ClientOption if opts.CredentialsFile != "" { clientOpts = append(clientOpts, option.WithCredentialsFile(opts.CredentialsFile)) } if err := profStart(config, clientOpts...); err != nil { log.WithError(err).Warnf("unable to initialize %v profiler", driverName) return } log.WithFields(log.Fields{ "driver": driverName, "service": config.Service, "serviceVersion": config.ServiceVersion, "projectId": config.ProjectID, }).Info("profiler enabled") }