Description
Enhancement Description
-
One-line enhancement description (can be used as a release note): Contextual logging enables the caller of a function to control all aspects of logging (output formatting, verbosity, additional values and names).
-
Kubernetes Enhancement Proposal: https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/3077-contextual-logging
-
Discussion Link: WG Structured Logging
-
Primary contact (assignee): @pohly
-
Responsible SIGs: SIG Instrumentation, WG Structured Logging
-
Enhancement target (which target equals to which milestone):
- Alpha release target (x.y): 1.24
- Beta release target (x.y): 1.28
- Stable release target (x.y): 1.30
-
Alpha
- KEP (
k/enhancements
) update PR(s): - Code (
k/k
) update PR(s): - Docs (
k/website
) update PR(s):
- KEP (
-
Beta
- KEP (
k/enhancements
) update PR(s): - Code (
k/k
) update PR(s):- optional, can be added later: slog support kubernetes#120696
- feature promotion: promote contextual logging to beta, enabled by default kubernetes#122589
- Docs (
k/website
) update(s): contextual logging: beta in Kubernetes 1.30 website#45288
- KEP (
Current configuration
https://github.com/kubernetes/kubernetes/blob/master/hack/logcheck.conf
Status
The following table counts log calls that need to be converted. The numbers for contextual logging include those for structured logging.
At this point, controllers could get converted to contextual logging or one of the components that was already converted to structured logging. If you want to pick one, ping @pohly on the #wg-structured-logging Slack channel. See structured and contextual logging migration instructions for guidance.
Besides migrating log calls, we also might have to migrate from APIs which don't support contextual logging to APIs which do:
- k8s.io/client-go/tools/[events|record]: add WithContext
- HandlePanic/HandleError -> HandlePanicWithContext, HandleErrorWithContext
From 2022-10-27 ~= Kubernetes 1.26
The focus was on converting kube-controller-manager. Of 1944 unstructured and/or non-contexual logging calls in pkg/controller
and cmd/kube-controller-manager
, 82% were converted to structured, contextual logging in Kubernetes 1.27.
Component | Non-Structured Logging | Non-Contextual Logging | Owner |
---|---|---|---|
pkg/controller/bootstrap | 15 | 28 | @mengjiao-liu, kubernetes/kubernetes#113464 |
pkg/controller/certificates | 22 | 31 | @mengjiao-liu, kubernetes/kubernetes#113994 |
pkg/controller/clusterroleaggregation | 2 | 2 | @mengjiao-liu, kubernetes/kubernetes#113910 |
pkg/controller/cronjob | 1 | 44 | @mengjiao-liu, kubernetes/kubernetes#113428 |
pkg/controller/daemon | 45 | 85 | @249043822, kubernetes/kubernetes#113622 |
pkg/controller/deployment | 23 | 79 | @249043822, kubernetes/kubernetes#113525 |
pkg/controller/disruption | 29 | 56 | @Namanl2001, kubernetes/kubernetes#116021 |
pkg/controller/endpoint | 12 | 24 | lunhuijie (Slack) |
pkg/controller/endpointslice | 22 | 36 | @Namanl2001, kubernetes/kubernetes#115295 |
pkg/controller/endpointslicemirroring | 18 | 28 | @Namanl2001, kubernetes/kubernetes#114982 |
pkg/controller/garbagecollector | 55 | 105 | @ncdc, kubernetes/kubernetes#113471 |
pkg/controller/job | 12 | 36 | was: @sanwishe, kubernetes/kubernetes#113576, now: @mengjiao-liu |
pkg/controller/namespace | 30 | 55 | @yangjunmyfm192085, kubernetes/kubernetes#113443 |
pkg/controller/nodeipam | 135 | 210 | @yangjunmyfm192085, kubernetes/kubernetes#112670 |
pkg/controller/nodelifecycle | 60 | 106 | @yangjunmyfm192085, kubernetes/kubernetes#112670 |
pkg/controller/podautoscaler | 9 | 13 | @freddie400, kubernetes/kubernetes#114687 |
pkg/controller/podgc | 10 | 24 | @pravarag, kubernetes/kubernetes#114689 |
pkg/controller/replicaset | 20 | 49 | @Namanl2001, kubernetes/kubernetes#114871 |
pkg/controller/resourcequota | 24 | 37 | @ncdc, kubernetes/kubernetes#113315 |
pkg/controller/serviceaccount | 22 | 31 | @Namanl2001, kubernetes/kubernetes#114918 |
pkg/controller/statefulset | 19 | 59 | @249043822, kubernetes/kubernetes#113840 |
pkg/controller/storageversiongc | 4 | 6 | @songxiao-wang87, kubernetes/kubernetes#113986 |
pkg/controller/testutil | 9 | 9 | @Octopusjust, kubernetes/kubernetes#114061 |
pkg/controller/ttl | 4 | 8 | wxs (Slack) = @songxiao-wang87, kubernetes/kubernetes#113916 |
pkg/controller/ttlafterfinished | 9 | 15 | @obaranov1, kubernetes/kubernetes#115332 |
pkg/controller/util | 0 | 19 | @fatsheep9146, kubernetes/kubernetes#115049 |
pkg/controller/volume | 351 | 673 | @yangjunmyfm192085, kubernetes/kubernetes#113584 |
pkg/kubelet | 1 | 1805 | @fmuyassarov |
pkg/scheduler | 0 | 348 | @knelasevero, kubernetes/kubernetes#111155 |
staging/src/k8s.io/apiextensions-apiserver | 57 | 81 | |
staging/src/k8s.io/apimachinery | 73 | 114 | @yanjing1104 |
staging/src/k8s.io/apiserver | 262 | 543 | |
staging/src/k8s.io/client-go | 161 | 267 | |
staging/src/k8s.io/cloud-provider | 108 | 146 | |
staging/src/k8s.io/cluster-bootstrap | 2 | 4 | |
staging/src/k8s.io/code-generator | 108 | 168 | |
staging/src/k8s.io/component-base | 32 | 63 | |
staging/src/k8s.io/component-helpers | 7 | 8 | |
staging/src/k8s.io/controller-manager | 10 | 10 | |
staging/src/k8s.io/csi-translation-lib | 3 | 4 | |
staging/src/k8s.io/kube-aggregator | 52 | 76 | |
staging/src/k8s.io/kube-controller-manager | 0 | 0 | |
staging/src/k8s.io/kubectl | 89 | 147 | @yanjing1104 |
staging/src/k8s.io/legacy-cloud-providers | 1445 | 2238 | |
staging/src/k8s.io/mount-utils | 54 | 92 | |
staging/src/k8s.io/pod-security-admission | 1 | 34 | @Namanl2001, kubernetes/kubernetes#114471 |
staging/src/k8s.io/sample-controller | 16 | 22 | @pchan, kubernetes/kubernetes#113879 |
From 2023-03-17 = Kubernetes v1.27.0-beta.0
All of kube-controller-manager got converted.
Tables created with:
go install sigs.k8s.io/logtools/logcheck@latest
echo "Component | Non-Structured Logging | Non-Contextual Logging | Owner " && \
echo "------ | ------- | ------" && \
for i in $(find pkg/controller/* pkg/scheduler pkg/kubelet pkg/apis pkg/api cmd/kube-* cmd/kubelet -maxdepth 0 -type d | sort); do \
echo "$i | $(cd $i; ${GOPATH}/bin/logcheck -check-structured -check-deprecations=false 2>&1 ./... | wc -l ) | $(cd $i; ${GOPATH}/bin/logcheck -check-structured -check-deprecations=false -check-contextual ./... 2>&1 | wc -l ) |" | grep -v '| 0 | 0 |'; \
done
From 2023-09-18 =~ Kubernetes v1.28
Component | Non-Structured Logging | Non-Contextual Logging | Owner |
---|---|---|---|
cmd/kube-apiserver | 6 | 7 | on hold |
cmd/kubelet | 0 | 52 | @fmuyassarov (?), kubernetes/kubernetes#114352 |
cmd/kube-proxy | 0 | 41 | on hold |
pkg/kubelet | 2 | 1942 | @fmuyassarov (?) |
pkg/scheduler | 1 | 137 | @mengjiao-liu, https://github.com/kubernetes/kubernetes/pulls/mengjiao-liu |
staging/src/k8s.io/apiserver | ? | ? | @tallclair, kubernetes/kubernetes#114198 |
staging/src/k8s.io/client-go/discovery | 11 | 21 | on hold |
staging/src/k8s.io/client-go/examples | 14 | 14 | on hold |
staging/src/k8s.io/client-go/metadata | 2 | 4 | on hold |
staging/src/k8s.io/client-go/plugin | 5 | 8 | on hold |
staging/src/k8s.io/client-go/rest | 16 | 37 | on hold |
staging/src/k8s.io/client-go/restmapper | 3 | 6 | on hold |
staging/src/k8s.io/client-go/tools | 104 | 171 | @pohly, kubernetes/kubernetes#120729 |
staging/src/k8s.io/client-go/transport | 17 | 31 | on hold |
staging/src/k8s.io/client-go/util | 12 | 19 | on hold |
Table created manually and with:
go install sigs.k8s.io/logtools/logcheck@latest
echo "Component | Non-Structured Logging | Non-Contextual Logging | Owner " && \
echo "------ | ------- | ------- | ------" && \
for i in $(find pkg/scheduler pkg/kubelet pkg/apis pkg/api cmd/kube-* cmd/kubelet staging/src/k8s.io/client-go/* -maxdepth 0 -type d | sort); do \
echo "$i | $(cd $i; ${GOPATH}/bin/logcheck -check-structured -check-deprecations=false 2>&1 ./... | wc -l ) | $(cd $i; ${GOPATH}/bin/logcheck -check-structured -check-deprecations=false -check-contextual ./... 2>&1 | wc -l ) |" | grep -v '| 0 | 0 |'; \
done
From 2023-11-20 =~ Kubernetes v1.29
Component | Non-Structured Logging | Non-Contextual Logging | Owner |
---|---|---|---|
cmd/kube-apiserver | 6 | 7 | @tallclair |
cmd/kubelet | 0 | 52 | @fmuyassarov (?), kubernetes/kubernetes#114352 |
pkg/kubelet | 2 | 1983 | @fmuyassarov |
cmd/kube-proxy | 0 | 42 | @ fatsheep9146, kubernetes/kubernetes#122197 |
pkg/proxy | 0 | 360 | @ fatsheep9146, see above |
staging/src/k8s.io/apiserver | 285 | 655 | @tallclair, kubernetes/kubernetes#114198 |
staging/src/k8s.io/client-go/discovery | 11 | 21 | |
staging/src/k8s.io/client-go/examples | 14 | 14 | |
staging/src/k8s.io/client-go/metadata | 2 | 4 | |
staging/src/k8s.io/client-go/plugin | 5 | 8 | |
staging/src/k8s.io/client-go/rest | 16 | 37 | |
staging/src/k8s.io/client-go/restmapper | 3 | 6 | |
staging/src/k8s.io/client-go/tools | 83 | 143 | @pohly |
staging/src/k8s.io/client-go/transport | 17 | 31 | |
staging/src/k8s.io/client-go/util | 12 | 19 |
Table created with:
go install sigs.k8s.io/logtools/logcheck@latest
echo "Component | Non-Structured Logging | Non-Contextual Logging | Owner " && echo "------ | ------- | ------- | ------" && for i in $(find pkg/scheduler pkg/kubelet pkg/apis pkg/api cmd/kube-* cmd/kubelet staging/src/k8s.io/client-go/* staging/src/k8s.io/apiserver -maxdepth 0 -type d | sort); do echo "$i | $(cd $i; ${GOPATH}/bin/logcheck -check-structured -check-deprecations=false 2>&1 ./... | wc -l ) | $(cd $i; ${GOPATH}/bin/logcheck -check-structured -check-deprecations=false -check-contextual ./... 2>&1 | wc -l ) |" | grep -v '| 0 | 0 |'; done