Porównaj commity

...

3 Commity

Autor SHA1 Wiadomość Data
Michał Rudowicz cf790e88ff Fix: Actually running the memory profile storage every 24hrs 2024-04-08 19:27:35 +02:00
Michał Rudowicz 8b33722b1c xz -> zstd 2024-04-06 12:13:12 +02:00
Michał Rudowicz eca8fb90ba Option to store a memory profile once a day
References https://todo.sr.ht/~michalr/hswro-alarm-bot/10
2024-04-06 12:08:41 +02:00
4 zmienionych plików z 51 dodań i 3 usunięć

Wyświetl plik

@ -3,7 +3,7 @@ packages:
- go
- python3-dev
- tar
- xz
- zstd
tasks:
- go-get: |
cd hswro-alarm-bot
@ -23,6 +23,6 @@ tasks:
env GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o alarm_bot.x86-64
- compress: |
cd hswro-alarm-bot
tar cJvf alarm_bot.tar.xz alarm_bot.x86-64
tar --zstd -cvf alarm_bot.tar.zstd alarm_bot.x86-64
artifacts:
- hswro-alarm-bot/alarm_bot.tar.xz
- hswro-alarm-bot/alarm_bot.tar.zstd

Wyświetl plik

@ -34,6 +34,7 @@ type AppConfig struct {
ArmCallbackUrls []string `yaml:"arm-callback-urls"`
DisarmCallbackUrls []string `yaml:"disarm-callback-urls"`
AlarmCallbackUrls []string `yaml:"alarm-callback-urls"`
WriteMemoryProfile bool `yaml:"write-memory-profile"`
}
func (m *SatelChangeType) UnmarshalYAML(unmarshal func(interface{}) error) error {
@ -93,6 +94,7 @@ func getCmdLineParams(config *AppConfig, logger *log.Logger) {
allowedTypesRaw := flag.String("allowed-types", "", "Satel change types that are allowed. All other types will be discarded. By default all are allowed. Use \",\" to specify multiple types.")
allowedIndexesRaw := flag.String("allowed-indexes", "", "Satel indexes (zones?) that are allowed. All other indexes will be discarded. By default all are allowed. Use \",\" to specify multiple indexes.")
satelPoolInterval := flag.Duration("pool-interval", 5*time.Second, "How often should the SATEL device be pooled for changes? Default: 5 seconds.")
writeMemoryProfile := flag.Bool("write-memory-profile", false, "Whether application should dump its memory profile every 24 hours. Default: false")
flag.Parse()
if len(*satelApiAddr) == 0 || len(*satelApiPort) == 0 || len(*chatIdRaw) == 0 {
@ -131,6 +133,9 @@ func getCmdLineParams(config *AppConfig, logger *log.Logger) {
}
allowedIndexes = append(allowedIndexes, int(allowedIndex))
}
if writeMemoryProfile != nil {
config.WriteMemoryProfile = *writeMemoryProfile
}
satelAddr := fmt.Sprintf("%s:%s", *satelApiAddr, *satelApiPort)
@ -146,6 +151,7 @@ func MakeConfig(logger *log.Logger) AppConfig {
config.ArmCallbackUrls = []string{}
config.DisarmCallbackUrls = []string{}
config.AlarmCallbackUrls = []string{}
config.WriteMemoryProfile = false
if len(os.Getenv("NOTIFY_URL_ARM")) != 0 {
config.ArmCallbackUrls = append(config.ArmCallbackUrls, os.Getenv("NOTIFY_URL_ARM"))

36
debug_utils.go 100644
Wyświetl plik

@ -0,0 +1,36 @@
package main
import (
"fmt"
"log"
"os"
"runtime/pprof"
"sync"
"time"
)
func dumpMemoryProfile(log *log.Logger) {
path := fmt.Sprintf("%s/hswro_alarm_bot_%s.mprof", os.Getenv("RUNTIME_DIRECTORY"), time.Now().Format(time.RFC3339))
f, err := os.Create(path)
if err != nil {
log.Print("Error dumping memory profile to file: ", err)
}
pprof.WriteHeapProfile(f)
f.Close()
log.Print("Dumped memory profile to: ", path)
}
func WriteMemoryProfilePeriodically(wg *sync.WaitGroup, log *log.Logger, close <-chan interface{}) {
go func() {
wg.Add(1)
defer wg.Done()
memoryProfileTicker := time.NewTicker(24 * time.Hour)
defer memoryProfileTicker.Stop()
select {
case <-memoryProfileTicker.C:
dumpMemoryProfile(log)
case <-close:
return
}
}()
}

Wyświetl plik

@ -81,6 +81,11 @@ func main() {
go CloseSatelOnCtrlC(s, &cleanShutdown)
closeDebugTools := make(chan interface{})
if config.WriteMemoryProfile {
WriteMemoryProfilePeriodically(&wg, log.New(os.Stderr, "DebugTools", log.Lmicroseconds), closeDebugTools)
}
for e := range FilterByTypeOrIndex(
FilterByLastSeen(s.Events, &wg, &dataStore, log.New(os.Stderr, "FilterByLastSeen", log.Lmicroseconds)),
&wg, config.AllowedTypes, config.AllowedIndexes) {
@ -89,6 +94,7 @@ func main() {
}
logger.Print("Closing...")
close(closeDebugTools)
close(tgEvents)
wg.Wait()
if cleanShutdown.Load() {