mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 00:39:13 +00:00
feat(diagnostics): add pprof profiling (#1627)
* feat(tracing): enable tracing * of course the squash didn't work. * gah. always nice when there's 40 csets. * might as well. * refactor: tracing to diagnostics * feat: add note about the magic methods from pprof --------- Co-authored-by: ze0s <ze0s@riseup.net>
This commit is contained in:
parent
5ae4ed3604
commit
65d25c56c9
4 changed files with 63 additions and 0 deletions
|
@ -14,6 +14,7 @@ import (
|
||||||
"github.com/autobrr/autobrr/internal/auth"
|
"github.com/autobrr/autobrr/internal/auth"
|
||||||
"github.com/autobrr/autobrr/internal/config"
|
"github.com/autobrr/autobrr/internal/config"
|
||||||
"github.com/autobrr/autobrr/internal/database"
|
"github.com/autobrr/autobrr/internal/database"
|
||||||
|
"github.com/autobrr/autobrr/internal/diagnostics"
|
||||||
"github.com/autobrr/autobrr/internal/download_client"
|
"github.com/autobrr/autobrr/internal/download_client"
|
||||||
"github.com/autobrr/autobrr/internal/events"
|
"github.com/autobrr/autobrr/internal/events"
|
||||||
"github.com/autobrr/autobrr/internal/feed"
|
"github.com/autobrr/autobrr/internal/feed"
|
||||||
|
@ -64,6 +65,8 @@ func main() {
|
||||||
// init dynamic config
|
// init dynamic config
|
||||||
cfg.DynamicReload(log)
|
cfg.DynamicReload(log)
|
||||||
|
|
||||||
|
diagnostics.SetupProfiling(cfg.Config.ProfilingEnabled, cfg.Config.ProfilingHost, cfg.Config.ProfilingPort)
|
||||||
|
|
||||||
// setup server-sent-events
|
// setup server-sent-events
|
||||||
serverEvents := sse.New()
|
serverEvents := sse.New()
|
||||||
serverEvents.CreateStreamWithOpts("logs", sse.StreamOpts{MaxEntries: 1000, AutoReplay: true})
|
serverEvents.CreateStreamWithOpts("logs", sse.StreamOpts{MaxEntries: 1000, AutoReplay: true})
|
||||||
|
|
|
@ -85,6 +85,15 @@ checkForUpdates = true
|
||||||
# Session secret
|
# Session secret
|
||||||
#
|
#
|
||||||
sessionSecret = "{{ .sessionSecret }}"
|
sessionSecret = "{{ .sessionSecret }}"
|
||||||
|
|
||||||
|
# Golang pprof profiling and tracing
|
||||||
|
#
|
||||||
|
#profiling = false
|
||||||
|
#
|
||||||
|
#profilingHost = "127.0.0.1"
|
||||||
|
#
|
||||||
|
# Default: 6060
|
||||||
|
#profilingPort = 6060
|
||||||
`
|
`
|
||||||
|
|
||||||
func (c *AppConfig) writeConfig(configPath string, configFile string) error {
|
func (c *AppConfig) writeConfig(configPath string, configFile string) error {
|
||||||
|
@ -210,6 +219,9 @@ func (c *AppConfig) defaults() {
|
||||||
PostgresPass: "",
|
PostgresPass: "",
|
||||||
PostgresSSLMode: "disable",
|
PostgresSSLMode: "disable",
|
||||||
PostgresExtraParams: "",
|
PostgresExtraParams: "",
|
||||||
|
ProfilingEnabled: false,
|
||||||
|
ProfilingHost: "127.0.0.1",
|
||||||
|
ProfilingPort: 6060,
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -302,6 +314,21 @@ func (c *AppConfig) loadFromEnv() {
|
||||||
if v := os.Getenv(prefix + "POSTGRES_EXTRA_PARAMS"); v != "" {
|
if v := os.Getenv(prefix + "POSTGRES_EXTRA_PARAMS"); v != "" {
|
||||||
c.Config.PostgresExtraParams = v
|
c.Config.PostgresExtraParams = v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if v := os.Getenv(prefix + "PROFILING"); v != "" {
|
||||||
|
c.Config.ProfilingEnabled = strings.EqualFold(strings.ToLower(v), "true")
|
||||||
|
}
|
||||||
|
|
||||||
|
if v := os.Getenv(prefix + "PROFILING_HOST"); v != "" {
|
||||||
|
c.Config.ProfilingHost = v
|
||||||
|
}
|
||||||
|
|
||||||
|
if v := os.Getenv(prefix + "PROFILING_PORT"); v != "" {
|
||||||
|
i, _ := strconv.ParseInt(v, 10, 32)
|
||||||
|
if i > 0 {
|
||||||
|
c.Config.ProfilingPort = int(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func validDatabaseType(v string) bool {
|
func validDatabaseType(v string) bool {
|
||||||
|
|
30
internal/diagnostics/profiling.go
Normal file
30
internal/diagnostics/profiling.go
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
// Copyright (c) 2021 - 2024, Ludvig Lundgren and the autobrr contributors.
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
package diagnostics
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
_ "net/http/pprof"
|
||||||
|
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SetupProfiling pprof profiling
|
||||||
|
func SetupProfiling(enabled bool, host string, port int) {
|
||||||
|
if enabled {
|
||||||
|
go func() {
|
||||||
|
// pprof has an init method which adds the following endpoints
|
||||||
|
// http.HandleFunc(prefix+"/debug/pprof/", Index)
|
||||||
|
// http.HandleFunc(prefix+"/debug/pprof/cmdline", Cmdline)
|
||||||
|
// http.HandleFunc(prefix+"/debug/pprof/profile", Profile)
|
||||||
|
// http.HandleFunc(prefix+"/debug/pprof/symbol", Symbol)
|
||||||
|
// http.HandleFunc(prefix+"/debug/pprof/trace", Trace)
|
||||||
|
err := http.ListenAndServe(fmt.Sprintf("%s:%d", host, port), nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error starting profiling server: %v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,6 +24,9 @@ type Config struct {
|
||||||
PostgresPass string `toml:"postgresPass"`
|
PostgresPass string `toml:"postgresPass"`
|
||||||
PostgresSSLMode string `toml:"postgresSSLMode"`
|
PostgresSSLMode string `toml:"postgresSSLMode"`
|
||||||
PostgresExtraParams string `toml:"postgresExtraParams"`
|
PostgresExtraParams string `toml:"postgresExtraParams"`
|
||||||
|
ProfilingEnabled bool `toml:"profiling"`
|
||||||
|
ProfilingHost string `toml:"profilingHost"`
|
||||||
|
ProfilingPort int `toml:"profilingPort"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigUpdate struct {
|
type ConfigUpdate struct {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue