From bf0a547321a17319a632520610182a0d55ed80da Mon Sep 17 00:00:00 2001 From: Moshe Immermam Date: Fri, 23 Aug 2024 01:02:44 +0300 Subject: [PATCH 1/6] chore: bump deps --- go.mod | 1 - 1 file changed, 1 deletion(-) diff --git a/go.mod b/go.mod index 7f6f1619..7f09a7e8 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,6 @@ require ( github.com/samber/lo v1.47.0 github.com/samber/oops v1.13.1 github.com/sethvargo/go-retry v0.3.0 - github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/timberio/go-datemath v0.1.0 github.com/xeipuuv/gojsonschema v1.2.0 From 55f9a06e08e448e074834e40fb89f228c532fa9f Mon Sep 17 00:00:00 2001 From: Moshe Immermam Date: Mon, 26 Aug 2024 18:03:19 +0300 Subject: [PATCH 2/6] chore: fix playbook context --- context/context.go | 18 ++++++++++++++++-- models/playbooks.go | 15 +++------------ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/context/context.go b/context/context.go index 61aed3de..30a63317 100644 --- a/context/context.go +++ b/context/context.go @@ -132,6 +132,10 @@ func (k Context) WithAnyValue(key, val any) Context { return k.WithValue(key, val) } +func (k Context) WithAppendObject(object any) Context { + return k.WithObject(append(k.Objects(), object)...) +} + // Order the objects from parent -> child func (k Context) WithObject(object ...any) Context { var logNames []string @@ -339,6 +343,9 @@ func (k *Context) KubernetesDynamicClient() *dutyKubernetes.DynamicClient { } func (k *Context) WithKubeconfig(input types.EnvVar) (*Context, error) { + if k.GetNamespace() == "" { + return nil, k.Oops().Errorf("namespace is required") + } val, err := k.GetEnvValueFromCache(input, k.GetNamespace()) if err != nil { return k, k.Oops().Wrap(err) @@ -416,6 +423,13 @@ func (k Context) GetLoggingContext() map[string]any { args[k] = v } } + + case ContextAccessor2: + for k, v := range v.GetContext() { + if lo.IsNotEmpty(v) { + args[k] = v + } + } } } @@ -462,8 +476,8 @@ func (k Context) GetNamespace() string { if ns := k.GetObjectMeta().Namespace; ns != "" { return ns } - if k.Value("namespace") != nil { - return k.Value("namespace").(string) + if v, ok := k.Value("namespace").(string); ok && v != "" { + return v } return "" } diff --git a/models/playbooks.go b/models/playbooks.go index f80f7312..39546acb 100644 --- a/models/playbooks.go +++ b/models/playbooks.go @@ -84,10 +84,7 @@ func (p *Playbook) LoggerName() string { return "playbook." + p.Name } -func (p *Playbook) Context() map[string]any { - if p == nil { - return nil - } +func (p Playbook) Context() map[string]any { return map[string]any{ "playbook_id": p.ID.String(), "namespace": p.Namespace, @@ -314,10 +311,7 @@ func (p PlaybookRun) GetAction(db *gorm.DB, name string) (action *PlaybookRunAct lo.Map(actions, func(i PlaybookRunAction, _ int) string { return i.Name }), ", ")) } -func (p *PlaybookRun) Context() map[string]any { - if p == nil { - return nil - } +func (p PlaybookRun) Context() map[string]any { return map[string]any{ "run_id": p.ID.String(), "playbook_id": p.PlaybookID, @@ -387,10 +381,7 @@ func (p *Playbook) NamespaceScope() string { return p.Namespace } -func (p *PlaybookRunAction) Context() map[string]any { - if p == nil { - return nil - } +func (p PlaybookRunAction) Context() map[string]any { return map[string]any{ "action_id": p.ID.String(), "action_name": p.Name, From 8c1a3fd97f5adc067492ca1288e8c31b9889e3ae Mon Sep 17 00:00:00 2001 From: Moshe Immermam Date: Wed, 28 Aug 2024 01:16:54 +0300 Subject: [PATCH 3/6] chore: fix debug handlers --- context/accessors.go | 4 ++++ context/properties.go | 6 +++--- echo/debug.go | 20 +++++++++++++------- go.sum | 4 ++-- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/context/accessors.go b/context/accessors.go index b9a0ea2f..07a640c0 100644 --- a/context/accessors.go +++ b/context/accessors.go @@ -49,6 +49,10 @@ func unstructuredMeta(v unstructured.Unstructured) metav1.ObjectMeta { } } +type PKAccessor interface { + PK() string +} + type NameAccessor interface { GetName() string } diff --git a/context/properties.go b/context/properties.go index fb64e263..f28cc86b 100644 --- a/context/properties.go +++ b/context/properties.go @@ -47,15 +47,15 @@ func nilSafe(values ...interface{}) string { func newProp(prop PropertyType) { if loaded := supportedProperties.SetIfAbsent(prop.Key, prop); loaded { - if prop.Value != nil && prop.Default != prop.Value { + if prop.Value != nil && fmt.Sprintf("%v", prop.Default) != fmt.Sprintf("%v", prop.Value) { logger.Debugf("Property overridden %s=%v (default=%v)", prop.Key, console.Greenf(nilSafe(prop.Value)), nilSafe(prop.Default)) } } } func (p Properties) SupportedProperties() map[string]PropertyType { m := make(map[string]PropertyType) - for t := range supportedProperties.IterBuffered() { - m[t.Key] = t.Val + for k, v := range supportedProperties.Items() { + m[k] = v } return m } diff --git a/echo/debug.go b/echo/debug.go index 3df771f3..d7515c59 100644 --- a/echo/debug.go +++ b/echo/debug.go @@ -52,7 +52,7 @@ func RestrictToLocalhost(next echo.HandlerFunc) echo.HandlerFunc { } } -func AddDebugHandlers(e *echo.Echo, rbac echo.MiddlewareFunc) { +func AddDebugHandlers(ctx context.Context, e *echo.Echo, rbac echo.MiddlewareFunc) { // Add pprof routes with localhost restriction pprofGroup := e.Group("/debug/pprof") @@ -103,9 +103,13 @@ func AddDebugHandlers(e *echo.Echo, rbac echo.MiddlewareFunc) { }) debug.GET("/properties", func(c echo.Context) error { - ctx := c.Request().Context().(context.Context) props := ctx.Properties().SupportedProperties() - return c.JSON(200, props) + data, _ := json.MarshalIndent(props, "", " ") + return c.Blob(200, "application/json", data) + }) + + debug.GET("/system/properties", func(c echo.Context) error { + return c.JSON(200, properties.Global.GetAll()) }) debug.POST("/property", func(c echo.Context) error { @@ -126,7 +130,7 @@ func AddDebugHandlers(e *echo.Echo, rbac echo.MiddlewareFunc) { for _, e := range entry.Val.Entries() { entry := toEntry(&e) names = append(names, entry.GetName()) - if entry.GetName() == name { + if entry.GetName() == name || fmt.Sprintf("%s/%s", entry.GetName(), entry.Context["id"]) == name { logger.Infof("Running %s now", name) e.Job.Run() return c.NoContent(http.StatusCreated) @@ -142,9 +146,8 @@ func AddDebugHandlers(e *echo.Echo, rbac echo.MiddlewareFunc) { type JobCronEntry struct { Context map[string]any `json:"context"` - ID int `json:"id"` + ID string `json:"id"` LastRan time.Time `json:"last_ran,omitempty"` - Schedule string `json:"schedule"` NextRun time.Time `json:"next_run"` NextRunIn string `json:"next_run_in"` } @@ -159,7 +162,6 @@ func (j JobCronEntry) GetName() string { func toEntry(e *cron.Entry) JobCronEntry { entry := JobCronEntry{ - Schedule: fmt.Sprintf("%v", e.Schedule), LastRan: e.Prev, NextRun: e.Next, NextRunIn: time.Until(e.Next).String(), @@ -173,6 +175,10 @@ func toEntry(e *cron.Entry) JobCronEntry { default: entry.Context = map[string]any{"name": fmt.Sprintf("%v", e.Job)} } + + if pk, ok := e.Job.(context.PKAccessor); ok { + entry.ID = pk.PK() + } return entry } diff --git a/go.sum b/go.sum index d7656d8f..f7510977 100644 --- a/go.sum +++ b/go.sum @@ -810,8 +810,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fergusstrange/embedded-postgres v1.25.0 h1:sa+k2Ycrtz40eCRPOzI7Ry7TtkWXXJ+YRsxpKMDhxK0= github.com/fergusstrange/embedded-postgres v1.25.0/go.mod h1:t/MLs0h9ukYM6FSt99R7InCHs1nW0ordoVCcnzmpTYw= -github.com/flanksource/commons v1.28.0 h1:7wyTIU0Q1/wgckecRmIGmCS+zcFeAkId5qNzffR9Sho= -github.com/flanksource/commons v1.28.0/go.mod h1:Q/9SkqJW5QwsVlynOYMVuVQzQtHSBGt1TJkkeX3GRjU= +github.com/flanksource/commons v1.29.0 h1:OqxGvCZD10R/WjNfoU7NNGXF6AtmhD1cwdezWg86fD8= +github.com/flanksource/commons v1.29.0/go.mod h1:Q/9SkqJW5QwsVlynOYMVuVQzQtHSBGt1TJkkeX3GRjU= github.com/flanksource/gomplate/v3 v3.20.4/go.mod h1:27BNWhzzSjDed1z8YShO6W+z6G9oZXuxfNFGd/iGSdc= github.com/flanksource/gomplate/v3 v3.24.24 h1:u/30b75VNcoC7X+Q0M9Sk1PtvYUcnLe1nJjNpATHhdY= github.com/flanksource/gomplate/v3 v3.24.24/go.mod h1:Ezcg/bzLwOHYtycHljeOf46RX2YlvLj+xxVxt/nCo30= From b1375d584809b29b4e05431e75b0a3c0c9cce204 Mon Sep 17 00:00:00 2001 From: Moshe Immermam Date: Wed, 28 Aug 2024 01:19:31 +0300 Subject: [PATCH 4/6] feat: add memory.stats --- echo/debug.go | 12 ++++++++++++ go.mod | 11 ++++++++++- go.sum | 24 ++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/echo/debug.go b/echo/debug.go index d7515c59..23333870 100644 --- a/echo/debug.go +++ b/echo/debug.go @@ -1,6 +1,7 @@ package echo import ( + "encoding/json" "fmt" "net" "net/http" @@ -12,6 +13,7 @@ import ( "github.com/flanksource/commons/logger" "github.com/flanksource/commons/properties" + "github.com/flanksource/commons/timer" "github.com/flanksource/duty/context" "github.com/google/gops/agent" "github.com/labstack/echo/v4" @@ -142,6 +144,16 @@ func AddDebugHandlers(ctx context.Context, e *echo.Echo, rbac echo.MiddlewareFun }) debug.GET("/cron", CronDetailsHandler()) + + if period := properties.Duration(0, "memory.stats"); period > 0 { + timer := timer.NewMemoryTimer() + go func() { + for { + logger.GetLogger("memory").Infof(timer.End()) + time.Sleep(period) + } + }() + } } type JobCronEntry struct { diff --git a/go.mod b/go.mod index 7f09a7e8..3c3ea006 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/eko/gocache/store/go_cache/v4 v4.2.2 github.com/exaring/otelpgx v0.6.2 github.com/fergusstrange/embedded-postgres v1.25.0 - github.com/flanksource/commons v1.28.0 + github.com/flanksource/commons v1.29.1 github.com/flanksource/gomplate/v3 v3.24.24 github.com/flanksource/kommons v0.31.4 github.com/google/cel-go v0.21.0 @@ -111,6 +111,7 @@ require ( github.com/go-errors/errors v1.5.1 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/inflect v0.19.0 // indirect github.com/go-openapi/jsonpointer v0.20.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -156,6 +157,7 @@ require ( github.com/labstack/gommon v0.4.2 // indirect github.com/lmittmann/tint v1.0.5 // indirect github.com/lrita/cmap v0.0.0-20231108122212-cb084a67f554 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -173,18 +175,24 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/robertkrimen/otto v0.2.1 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect + github.com/shirou/gopsutil/v3 v3.24.5 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spf13/cobra v1.7.0 // indirect github.com/stoewer/go-strcase v1.3.0 // indirect github.com/tidwall/gjson v1.14.4 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.0.4 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/ulikunitz/xz v0.5.12 // indirect github.com/vadimi/go-http-ntlm v1.0.3 // indirect @@ -198,6 +206,7 @@ require ( github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/xlab/treeprint v1.2.0 // indirect github.com/yuin/gopher-lua v1.1.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect diff --git a/go.sum b/go.sum index f7510977..06f2d9cb 100644 --- a/go.sum +++ b/go.sum @@ -810,8 +810,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fergusstrange/embedded-postgres v1.25.0 h1:sa+k2Ycrtz40eCRPOzI7Ry7TtkWXXJ+YRsxpKMDhxK0= github.com/fergusstrange/embedded-postgres v1.25.0/go.mod h1:t/MLs0h9ukYM6FSt99R7InCHs1nW0ordoVCcnzmpTYw= -github.com/flanksource/commons v1.29.0 h1:OqxGvCZD10R/WjNfoU7NNGXF6AtmhD1cwdezWg86fD8= -github.com/flanksource/commons v1.29.0/go.mod h1:Q/9SkqJW5QwsVlynOYMVuVQzQtHSBGt1TJkkeX3GRjU= +github.com/flanksource/commons v1.29.1 h1:82vkqo0JFFcOwRXkXrKtMPfUlywOb3YQ+mPSSW9gkpo= +github.com/flanksource/commons v1.29.1/go.mod h1:Kcw3+JI04cVw2zYlv/XTMM1dkNkAwqLYqTxVb19Y/JA= github.com/flanksource/gomplate/v3 v3.20.4/go.mod h1:27BNWhzzSjDed1z8YShO6W+z6G9oZXuxfNFGd/iGSdc= github.com/flanksource/gomplate/v3 v3.24.24 h1:u/30b75VNcoC7X+Q0M9Sk1PtvYUcnLe1nJjNpATHhdY= github.com/flanksource/gomplate/v3 v3.24.24/go.mod h1:Ezcg/bzLwOHYtycHljeOf46RX2YlvLj+xxVxt/nCo30= @@ -867,6 +867,8 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -1204,6 +1206,8 @@ github.com/lmittmann/tint v1.0.5 h1:NQclAutOfYsqs2F1Lenue6OoWCajs5wJcP3DfWVpePw= github.com/lmittmann/tint v1.0.5/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= github.com/lrita/cmap v0.0.0-20231108122212-cb084a67f554 h1:a0+bIffIh/HdvvgtPQLRhOef1VDSxZ+8bQiyjQlJzqc= github.com/lrita/cmap v0.0.0-20231108122212-cb084a67f554/go.mod h1:Cn9TaoncDT8Tt/aJ7CIZy+t48MaZWDEwhu1bBXwrzLI= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -1328,6 +1332,8 @@ github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qR github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -1405,6 +1411,12 @@ github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE= github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -1468,6 +1480,10 @@ github.com/tidwall/sjson v1.0.4 h1:UcdIRXff12Lpnu3OLtZvnc03g4vH2suXDXhBwBqmzYg= github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y= github.com/timberio/go-datemath v0.1.0 h1:1OUCvSIX1qXLJ57h12OWfgt6MNpJnsdNvrp8dLIUFtg= github.com/timberio/go-datemath v0.1.0/go.mod h1:m7kjsbCuO4QKP3KLfnxiUZWiOiFXmxj30HeexjL3lc0= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= @@ -1511,6 +1527,8 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= @@ -1808,6 +1826,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1837,6 +1856,7 @@ golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From 53f158ac30af739952ff80ff90bc14bf5fd2e471 Mon Sep 17 00:00:00 2001 From: Moshe Immermam Date: Wed, 28 Aug 2024 01:19:48 +0300 Subject: [PATCH 5/6] chore: job logging improvements --- job/job.go | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/job/job.go b/job/job.go index f2c169a6..7b255177 100644 --- a/job/job.go +++ b/job/job.go @@ -6,9 +6,12 @@ import ( "fmt" "math/rand" "strconv" + "strings" "sync" "time" + "github.com/flanksource/commons/logger" + "github.com/flanksource/commons/text" "github.com/flanksource/duty/context" "github.com/flanksource/duty/echo" "github.com/flanksource/duty/models" @@ -18,6 +21,7 @@ import ( "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" "golang.org/x/sync/semaphore" + "gorm.io/gorm" ) const ( @@ -41,6 +45,7 @@ var evictedJobs chan uuid.UUID // jobs send rows to be deleted by maintaining a circular buffer by status type func deleteEvictedJobs(ctx context.Context) { period := ctx.Properties().Duration("job.eviction.period", time.Minute) + ctx = ctx.WithoutTracing().WithName("jobs").WithDBLogger("jobs", logger.Trace1) ctx.Infof("Cleaning up jobs every %v", period) for { items, _, _, _ := lo.BufferWithTimeout(evictedJobs, 32, 5*time.Second) @@ -48,7 +53,7 @@ func deleteEvictedJobs(ctx context.Context) { time.Sleep(period) continue } - if tx := ctx.FastDB("jobs").Exec("DELETE FROM job_history WHERE id in ?", items); tx.Error != nil { + if tx := ctx.DB().Exec("DELETE FROM job_history WHERE id in ?", items); tx.Error != nil { ctx.Errorf("Failed to delete job entries: %v", tx.Error) time.Sleep(1 * time.Minute) } else { @@ -117,6 +122,10 @@ func (j *Job) GetContext() map[string]any { } } +func (j *Job) PK() string { + return strings.TrimSuffix(strings.TrimSpace(fmt.Sprintf("%s/%s", j.Name, lo.CoalesceOrEmpty(j.ID, j.ResourceID))), "/") +} + type StatusRing struct { lock sync.Mutex rings map[string]*ring.Ring @@ -129,7 +138,7 @@ type StatusRing struct { // populateFromDB syncs the status ring with the existing job histories in db func (t *StatusRing) populateFromDB(ctx context.Context, name, resourceID string) error { var existingHistories []models.JobHistory - if err := ctx.FastDB("jobs").Where("name = ?", name).Where("resource_id = ?", resourceID).Order("time_start").Find(&existingHistories).Error; err != nil { + if err := ctx.WithoutTracing().WithDBLogger("jobs", logger.Trace1).DB().Where("name = ?", name).Where("resource_id = ?", resourceID).Order("time_start").Find(&existingHistories).Error; err != nil { return err } @@ -237,16 +246,20 @@ func (j *JobRuntime) start() { j.History.ResourceType = j.Job.ResourceType } if j.Job.JobHistory && j.Job.Retention.Success > 0 && !j.Job.IgnoreSuccessHistory { - if err := j.History.Persist(j.FastDB("jobs")); err != nil { + if err := j.History.Persist(j.VerboseDB()); err != nil { j.Warnf("failed to persist history: %v", err) } } } +func (j *JobRuntime) VerboseDB() *gorm.DB { + return j.WithoutTracing().WithDBLogger("jobs", logger.Trace1).DB() +} + func (j *JobRuntime) end() { j.History.End() if j.Job.JobHistory && (j.Job.Retention.Success > 0 || len(j.History.Errors) > 0) && !j.Job.IgnoreSuccessHistory { - if err := j.History.Persist(j.FastDB("jobs")); err != nil { + if err := j.History.Persist(j.VerboseDB()); err != nil { j.Warnf("failed to persist history: %v", err) } } @@ -285,9 +298,9 @@ func (j *Job) FindHistory(statuses ...string) ([]models.JobHistory, error) { var items []models.JobHistory var err error if len(statuses) == 0 { - err = j.FastDB("jobs").Where("name = ?", j.Name).Order("time_start DESC").Find(&items).Error + err = j.WithoutTracing().WithDBLogger("jobs", logger.Trace1).DB().Where("name = ?", j.Name).Order("time_start DESC").Find(&items).Error } else { - err = j.FastDB("jobs").Where("name = ? and status in ?", j.Name, statuses).Order("time_start DESC").Find(&items).Error + err = j.WithoutTracing().WithDBLogger("jobs", logger.Trace1).DB().Where("name = ? and status in ?", j.Name, statuses).Order("time_start DESC").Find(&items).Error } return items, err } @@ -309,6 +322,7 @@ func (j *Job) SetID(id string) *Job { func (j *Job) Run() { ctx, span := j.Context.StartSpan(j.Name) + ctx = ctx.WithName("job." + j.PK()) defer span.End() r := JobRuntime{ @@ -338,7 +352,7 @@ func (j *Job) Run() { if !j.lock.TryLock() { r.History.Status = models.StatusSkipped ctx.Tracef("failed to acquire lock") - r.Failf("%s job already running, skipping", r.ID()) + r.Failf("job already running, skipping") return } defer j.lock.Unlock() @@ -358,7 +372,7 @@ func (j *Job) Run() { delayPercent := rand.Intn(iterationJitterPercent) jitterDuration := time.Duration((int64(interval) * int64(delayPercent)) / 100) - j.Context.Logger.V(4).Infof("jitter (%d%%): %s", delayPercent, jitterDuration) + j.Context.Logger.V(4).Infof("jitter %v", jitterDuration) time.Sleep(jitterDuration) } @@ -385,10 +399,10 @@ func (j *Job) Run() { } if err := j.Fn(r); err != nil { - ctx.Tracef("finished duration=%s, error=%s", time.Since(r.History.TimeStart), err) + ctx.Tracef("finished duration=%s, error=%s", text.HumanizeDuration(time.Since(r.History.TimeStart)), err) r.History.AddErrorWithSkipReportLevel(err.Error(), 1) } else { - ctx.Tracef("finished duration=%s", time.Since(r.History.TimeStart)) + ctx.Tracef("finished duration=%s", text.HumanizeDuration(time.Since(r.History.TimeStart))) } } @@ -492,11 +506,11 @@ func (j *Job) init() error { } if j.ID != "" { - j.Context = j.Context.WithName(fmt.Sprintf("%s.%s", j.Name, j.ID)) + j.Context = j.Context.WithName(fmt.Sprintf("%s.%s", strings.ToLower(j.Name), j.ID)) } else if j.ResourceID != "" { - j.Context = j.Context.WithName(fmt.Sprintf("%s.%s", j.Name, j.ResourceID)) + j.Context = j.Context.WithName(fmt.Sprintf("%s.%s", strings.ToLower(j.Name), j.ResourceID)) } else { - j.Context = j.Context.WithName(j.Name) + j.Context = j.Context.WithName(strings.ToLower(j.Name)) } j.Context.Tracef("initalized %v", j.String()) From b64aa20e04945c9548b1f1ddf4a8f612ca6e9ba9 Mon Sep 17 00:00:00 2001 From: Moshe Immermam Date: Wed, 28 Aug 2024 01:30:24 +0300 Subject: [PATCH 6/6] chore: fix tests --- tests/setup/common.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/setup/common.go b/tests/setup/common.go index c7acdde8..04ea4fa6 100644 --- a/tests/setup/common.go +++ b/tests/setup/common.go @@ -17,6 +17,7 @@ import ( "github.com/flanksource/duty/api" "github.com/flanksource/duty/context" "github.com/flanksource/duty/telemetry" + "github.com/spf13/pflag" "github.com/flanksource/duty/job" "github.com/flanksource/duty/models" @@ -40,8 +41,10 @@ var postgresDBUrl string var dbName = "test" func init() { - logger.BindGoFlags() - duty.BindGoFlags() + logger.UseSlog() + logger.BindFlags(pflag.CommandLine) + duty.BindPFlags(pflag.CommandLine) + properties.BindFlags(pflag.CommandLine) } func execPostgres(connection, query string) error {