/
panic_handler.go
76 lines (60 loc) · 2.29 KB
/
panic_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Gardener contributors.
//
// SPDX-License-Identifier: Apache-2.0
package utils
import (
"context"
"runtime"
"runtime/debug"
"strings"
"time"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/gardener/landscaper/controller-utils/pkg/logging/constants"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
"github.com/gardener/landscaper/controller-utils/pkg/logging"
)
func HandlePanics(ctx context.Context, result *reconcile.Result, hostUncachedClient client.Client) {
logger, _ := logging.FromContextOrNew(ctx, nil)
if r := recover(); r != nil {
result.Requeue = true
result.RequeueAfter = time.Minute * 5
debug.PrintStack()
if err, ok := r.(runtime.Error); ok {
logger.Error(err, "observed a panic", "recoverResult", r,
constants.KeyString, string(debug.Stack()))
if err.Error() == "runtime error: invalid memory address or nil pointer dereference" {
logger.Error(err, "Recovered from a nil pointer dereference or invalid memory address error")
if hostUncachedClient != nil {
GetCriticalProblemsHandler().ReportProblem(ctx, hostUncachedClient, err.Error())
}
return
}
if strings.HasPrefix(err.Error(), "runtime error: index out of range") {
logger.Error(err, "Recovered from an index out of range error")
if hostUncachedClient != nil {
GetCriticalProblemsHandler().ReportProblem(ctx, hostUncachedClient, err.Error())
}
return
}
if strings.HasPrefix(err.Error(), "runtime error: integer divide by zero") {
logger.Error(err, "Recovered from a integer divide by zero error")
if hostUncachedClient != nil {
GetCriticalProblemsHandler().ReportProblem(ctx, hostUncachedClient, err.Error())
}
return
}
if strings.HasPrefix(err.Error(), "interface conversion:") {
logger.Error(err, "Recovered from a type assertion error")
if hostUncachedClient != nil {
GetCriticalProblemsHandler().ReportProblem(ctx, hostUncachedClient, err.Error())
}
return
}
} else if err2, ok := r.(error); ok {
logger.Error(err2, "observed a panic", "recoverResult", r, constants.KeyString, string(debug.Stack()))
} else {
logger.Error(nil, "observed a panic", "recoverResult", r, constants.KeyString, string(debug.Stack()))
}
panic(r)
}
}