Skip to content

Commit

Permalink
xpod: add err string to log (#50)
Browse files Browse the repository at this point in the history
  • Loading branch information
ajatprabha authored Jun 20, 2024
1 parent 25a5c40 commit 42ae8c8
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 27 deletions.
6 changes: 3 additions & 3 deletions xpod/go.mod
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
module github.com/gojekfarm/xtools/xpod

go 1.18
go 1.20

require (
github.com/gojekfarm/xtools/generic v0.8.0
github.com/stretchr/testify v1.8.2
github.com/stretchr/testify v1.9.0
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/objx v0.5.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

Expand Down
14 changes: 4 additions & 10 deletions xpod/go.sum
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
28 changes: 17 additions & 11 deletions xpod/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package xpod

import (
"bytes"
"errors"
"fmt"
"net/http"
"strings"
Expand Down Expand Up @@ -135,15 +136,14 @@ func (h *ProbeHandler) serveCheckers(cs []Checker) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var excluded generic.Set[string]
if reqExcludes, ok := r.URL.Query()[excludeQueryParam]; ok && len(reqExcludes) > 0 {
excluded = generic.NewSet(flattenElems(slice.Map(
r.URL.Query()[excludeQueryParam],
excluded = generic.NewSet(flattenElems(slice.Map(r.URL.Query()[excludeQueryParam],
func(s string) []string { return strings.Split(s, ",") },
))...)
}

var output bytes.Buffer
var failedVerboseLogOutput bytes.Buffer
var failedChecks []string
var failedChecks []*checkFailure

for _, c := range cs {
if excluded.Has(c.Name()) {
Expand All @@ -162,7 +162,7 @@ func (h *ProbeHandler) serveCheckers(cs []Checker) http.Handler {
_, _ = fmt.Fprintf(&output, " reason hidden\n")
}

failedChecks = append(failedChecks, c.Name())
failedChecks = append(failedChecks, &checkFailure{name: c.Name(), err: err})
_, _ = fmt.Fprintf(&failedVerboseLogOutput, "[-]%s failed: %v\n", c.Name(), err)

continue
Expand All @@ -176,10 +176,7 @@ func (h *ProbeHandler) serveCheckers(cs []Checker) http.Handler {

if excluded.Len() > 0 {
quotedChecks := strings.Join(
slice.Map(excluded.Values(),
func(in string) string {
return fmt.Sprintf("%q", in)
}), ", ")
slice.Map(excluded.Values(), func(in string) string { return fmt.Sprintf("%q", in) }), ", ")

_, _ = fmt.Fprintf(&output, "warn: some checks cannot be excluded: no matches for %s\n", quotedChecks)
if h.logDelegate != nil {
Expand All @@ -190,10 +187,14 @@ func (h *ProbeHandler) serveCheckers(cs []Checker) http.Handler {
}
}

checkPath := strings.TrimPrefix(r.URL.Path, "/")

if len(failedChecks) > 0 {
if h.logDelegate != nil {
h.logDelegate("check failed", map[string]interface{}{
"failed_checks": strings.Join(failedChecks, ","),
h.logDelegate(fmt.Sprintf("%s check failed", checkPath), map[string]interface{}{
"failed_checks": strings.Join(
slice.Map(failedChecks, func(cf *checkFailure) string { return cf.name }), ", "),
"errs": errors.Join(slice.Map(failedChecks, func(cf *checkFailure) error { return cf.err })...),
})
}

Expand All @@ -210,7 +211,7 @@ func (h *ProbeHandler) serveCheckers(cs []Checker) http.Handler {
}

_, _ = output.WriteTo(w)
_, _ = fmt.Fprintf(w, "%s check passed\n", strings.TrimPrefix(r.URL.Path, "/"))
_, _ = fmt.Fprintf(w, "%s check passed\n", checkPath)
})
}

Expand All @@ -223,6 +224,11 @@ func (h *ProbeHandler) makeHandlers(opts Options) {
}
}

type checkFailure struct {
name string
err error
}

func flattenElems(in [][]string) []string {
var out []string

Expand Down
15 changes: 12 additions & 3 deletions xpod/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ func TestProbeHandler_serveCheckers(t *testing.T) {
})
}

redisErr := errors.New("redis-connect-error")

tests := []struct {
name string
opts Options
Expand Down Expand Up @@ -83,21 +85,28 @@ healthz check passed
opts: Options{
HealthCheckers: []Checker{
CheckerFunc("redis", func(_ *http.Request) error {
return errors.New("redis-connect-error")
return redisErr
}),
},
ReadyCheckers: []Checker{
CheckerFunc("redis", func(_ *http.Request) error {
return errors.New("redis-connect-error")
return redisErr
}),
},
},
logDelegate: func(t *testing.T, m *mock.Mock) {
m.On("Logf", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
argsMap := args.Get(1).(map[string]interface{})

assert.Equal(t, "check failed", args.String(0))
assert.Equal(t, "healthz check failed", args.String(0))
assert.Equal(t, "redis", argsMap["failed_checks"])

errsV := argsMap["errs"]
assert.NotNil(t, errsV)
errs, ok := errsV.(error)
assert.True(t, ok)

assert.ErrorIs(t, errs, redisErr)
})
},
want: func(t *testing.T, got string) {
Expand Down

0 comments on commit 42ae8c8

Please sign in to comment.