-
Notifications
You must be signed in to change notification settings - Fork 3.2k
/
healthz.go
57 lines (52 loc) · 1.73 KB
/
healthz.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
package controller
import (
"fmt"
"net/http"
"time"
log "github.com/sirupsen/logrus"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/argoproj/argo-workflows/v3/util/env"
"github.com/argoproj/argo-workflows/v3/workflow/common"
)
var (
age = env.LookupEnvDurationOr("HEALTHZ_AGE", 5*time.Minute)
)
// https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-liveness-http-request
// If we are in a state where there are any workflows that have not been reconciled in the last 2m, we've gone wrong.
func (wfc *WorkflowController) Healthz(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
instanceID := wfc.Config.InstanceID
instanceIDSelector := func() string {
if instanceID != "" {
return common.LabelKeyControllerInstanceID + "=" + instanceID
}
return "!" + common.LabelKeyControllerInstanceID
}()
labelSelector := "!" + common.LabelKeyPhase + "," + instanceIDSelector
err := func() error {
// avoid problems with informers, but directly querying the API
list, err := wfc.wfclientset.ArgoprojV1alpha1().Workflows(wfc.managedNamespace).List(ctx, metav1.ListOptions{LabelSelector: labelSelector})
if err != nil {
return err
}
for _, wf := range list.Items {
if time.Since(wf.GetCreationTimestamp().Time) > age {
return fmt.Errorf("workflow never reconciled: %s", wf.Name)
}
}
return nil
}()
log.WithField("err", err).
WithField("managedNamespace", wfc.managedNamespace).
WithField("instanceID", instanceID).
WithField("labelSelector", labelSelector).
WithField("age", age).
Info("healthz")
if err != nil {
w.WriteHeader(500)
_, _ = w.Write([]byte(err.Error()))
} else {
w.WriteHeader(200)
_, _ = w.Write([]byte("ok"))
}
}