aboutsummaryrefslogtreecommitdiff
path: root/config/config.go
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-08-27 13:06:20 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-08-27 13:06:20 +0200
commit6ec883a7fd40a14f2882076bd1a377bbbd0438ad (patch)
tree2d199226b29ada6dbe74b2ce278b000c296a1b3a /config/config.go
parent522512197de372aa9b9c5584711619a76a5546d8 (diff)
Add local Pyroscope server and Go continuous profiling
Add a docker-compose service running the Grafana Pyroscope backend on port 4040 with a persistent data volume, and instrument the Go app via github.com/grafana/pyroscope-go. The app pushes CPU, memory, and goroutine profiles every 10s when pyroscope.enabled is set in config.yaml. Config is extended with application_name and server_address (defaults to http://localhost:4040). Document usage in the README.
Diffstat (limited to 'config/config.go')
-rw-r--r--config/config.go17
1 files changed, 17 insertions, 0 deletions
diff --git a/config/config.go b/config/config.go
index 6fe9048..f95d3f8 100644
--- a/config/config.go
+++ b/config/config.go
@@ -16,6 +16,7 @@ type Config struct {
Storage StorageConfig `yaml:"storage"`
Strava StravaConfig `yaml:"strava"`
OfficialClimb OfficialClimbConfig `yaml:"official_climb"`
+ Pyroscope PyroscopeConfig `yaml:"pyroscope"`
}
type DatabaseConfig struct {
@@ -43,6 +44,12 @@ type OfficialClimbConfig struct {
MatchRadiusM float64 `yaml:"match_radius_m"`
}
+type PyroscopeConfig struct {
+ Enabled bool `yaml:"enabled"`
+ ApplicationName string `yaml:"application_name"`
+ ServerAddress string `yaml:"server_address"`
+}
+
func Default() Config {
return Config{
Database: DatabaseConfig{Path: "biking_home.db"},
@@ -52,6 +59,10 @@ func Default() Config {
},
Storage: StorageConfig{GPXDir: "data/rides"},
OfficialClimb: OfficialClimbConfig{MatchRadiusM: official_climb.DefaultMatchRadiusM},
+ Pyroscope: PyroscopeConfig{
+ ApplicationName: "biking_home",
+ ServerAddress: "http://localhost:4040",
+ },
}
}
@@ -73,6 +84,12 @@ func Load(filename string) (Config, error) {
if config.Storage.GPXDir == "" {
return Config{}, fmt.Errorf("config %q: storage.gpx_dir is required", filename)
}
+ if config.Pyroscope.Enabled && config.Pyroscope.ApplicationName == "" {
+ return Config{}, fmt.Errorf("config %q: pyroscope.application_name is required when pyroscope is enabled", filename)
+ }
+ if config.Pyroscope.Enabled && config.Pyroscope.ServerAddress == "" {
+ return Config{}, fmt.Errorf("config %q: pyroscope.server_address is required when pyroscope is enabled", filename)
+ }
if math.IsNaN(config.OfficialClimb.MatchRadiusM) || math.IsInf(config.OfficialClimb.MatchRadiusM, 0) || config.OfficialClimb.MatchRadiusM <= 0 {
return Config{}, fmt.Errorf("config %q: official_climb.match_radius_m must be greater than zero", filename)
}