Skip to content

Commit c453552

Browse files
committed
Start using klog for logging
Signed-off-by: Ahmet Alp Balkan <[email protected]>
1 parent 2c252ec commit c453552

File tree

5 files changed

+62
-5
lines changed

5 files changed

+62
-5
lines changed

cmd/kubectl-tree/apis.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import (
55
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
66
"k8s.io/apimachinery/pkg/runtime/schema"
77
"k8s.io/client-go/discovery"
8+
"k8s.io/klog"
89
"strings"
10+
"time"
911
)
1012

1113
type apiResource struct {
@@ -39,31 +41,39 @@ func fullAPIName(a apiResource) string {
3941
return strings.Join([]string{sgv.Resource, sgv.Version, sgv.Group}, ".")
4042
}
4143

42-
func buildAPILookup(client discovery.DiscoveryInterface) (*resourceMap, error) {
44+
func findAPIs(client discovery.DiscoveryInterface) (*resourceMap, error) {
45+
start := time.Now()
4346
resList, err := client.ServerPreferredResources()
4447
if err != nil {
4548
return nil, fmt.Errorf("failed to fetch api groups from kubernetes: %w", err)
4649
}
50+
klog.V(2).Infof("queried api discovery in %v", time.Since(start))
51+
klog.V(3).Infof("found %d items (groups) in server-preferred APIResourceList", len(resList))
4752

4853
rm := &resourceMap{
4954
m: make(resourceNameLookup),
5055
}
5156
for _, group := range resList {
57+
klog.V(5).Infof("iterating over group %s/%s (%d apis)", group.GroupVersion, group.APIVersion, len(group.APIResources))
5258
gv, err := schema.ParseGroupVersion(group.GroupVersion)
5359
if err != nil {
5460
return nil, fmt.Errorf("%q cannot be parsed into groupversion: %w", group.GroupVersion, err)
5561
}
5662

5763
for _, apiRes := range group.APIResources {
64+
klog.V(5).Infof(" api=%s namespaced=%v", apiRes.Name, apiRes.Namespaced)
5865
if !contains(apiRes.Verbs, "list") {
66+
klog.V(4).Infof(" api (%s) doesn't have required verb, skipping: %v", apiRes.Name, apiRes.Verbs)
5967
continue
6068
}
6169

6270
v := apiResource{
6371
gv: gv,
6472
r: apiRes,
6573
}
66-
for _, name := range apiNames(apiRes, gv) {
74+
names := apiNames(apiRes, gv)
75+
klog.V(6).Infof("names: %s", strings.Join(names, ", "))
76+
for _, name := range names {
6777
rm.m[name] = append(rm.m[name], v)
6878
}
6979
rm.list = append(rm.list, v)

cmd/kubectl-tree/query.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import (
55
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
66
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
77
"k8s.io/client-go/dynamic"
8+
"k8s.io/klog"
89
"sync"
10+
"time"
911
)
1012

1113
// getAllResources finds all API objects in specified API resources in all namespaces (or non-namespaced).
@@ -14,22 +16,32 @@ func getAllResources(client dynamic.Interface, apis []apiResource) ([]unstructur
1416
var wg sync.WaitGroup
1517
var out []unstructured.Unstructured
1618

19+
start := time.Now()
20+
klog.V(2).Infof("starting to query %d APIs in concurrently", len(apis))
21+
1722
var errResult error
1823
for _, api := range apis {
1924
wg.Add(1)
2025
go func(a apiResource) {
2126
defer wg.Done()
27+
klog.V(4).Infof("[query api] start: %s", a.GroupVersionResource())
2228
v, err := queryAPI(client, a)
2329
if err != nil {
30+
klog.V(4).Infof("[query api] error querying: %s, error=%v", a.GroupVersionResource(), err)
2431
errResult = err
2532
return
2633
}
2734
mu.Lock()
2835
out = append(out, v...)
2936
mu.Unlock()
37+
klog.V(4).Infof("[query api] done: %s, found %d apis", a.GroupVersionResource(), len(v))
3038
}(api)
3139
}
40+
41+
klog.V(2).Infof("fired up all goroutines to query APIs")
3242
wg.Wait()
43+
klog.V(2).Infof("all goroutines have returned in %v", time.Since(start))
44+
klog.V(2).Infof("query result: error=%v, objects=%d", errResult, len(out))
3345
return out, errResult
3446
}
3547

cmd/kubectl-tree/rootcmd.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@ limitations under the License.
1616
package main
1717

1818
import (
19+
"flag"
1920
"fmt"
2021
"github.com/spf13/cobra"
22+
"github.com/spf13/pflag"
2123
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2224
"k8s.io/cli-runtime/pkg/genericclioptions"
2325
"k8s.io/client-go/dynamic"
26+
"k8s.io/klog"
2427
"os"
2528
"strings"
2629

@@ -55,13 +58,17 @@ func run(_ *cobra.Command, args []string) error {
5558
if err != nil {
5659
return err
5760
}
58-
apis, err := buildAPILookup(dc)
61+
62+
apis, err := findAPIs(dc)
5963
if err != nil {
6064
return err
6165
}
66+
klog.V(3).Info("completed querying APIs list")
6267

6368
kind, name := args[0], args[1]
69+
klog.V(3).Infof("parsed kind=%v name=%v", kind, name)
6470
apiRes := apis.lookup(kind)
71+
klog.V(5).Infof("kind matches=%v", apiRes)
6572
if len(apiRes) == 0 {
6673
return fmt.Errorf("could not find api kind %q", kind)
6774
} else if len(apiRes) > 1 {
@@ -82,25 +89,47 @@ func run(_ *cobra.Command, args []string) error {
8289
return fmt.Errorf("failed to get %s/%s: %w", kind, name, err)
8390
}
8491

92+
klog.V(5).Infof("target parent object: %#v", obj)
93+
94+
klog.V(2).Infof("querying all api objects")
8595
apiObjects, err := getAllResources(dyn, apis.resources())
8696
if err != nil {
8797
return fmt.Errorf("error while querying api objects: %w", err)
8898
}
99+
klog.V(2).Infof("found total %d api objects", len(apiObjects))
89100

90101
objs := newObjectDirectory(apiObjects)
91102
if len(objs.ownership[obj.GetUID()]) == 0 {
92103
fmt.Println("No resources are owned by the specified object through ownerReferences.")
93104
return nil
94105
}
95106
treeView(os.Stderr, objs, *obj)
107+
klog.V(2).Infof("done printing tree view")
96108
return nil
97109
}
98110

99-
func main() {
111+
func init() {
112+
klog.InitFlags(nil)
113+
pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
114+
115+
// hide all glog flags except for -v
116+
flag.CommandLine.VisitAll(func(f *flag.Flag) {
117+
if f.Name != "v" {
118+
pflag.Lookup(f.Name).Hidden = true
119+
}
120+
})
121+
100122
cf = genericclioptions.NewConfigFlags(true)
101123
cf.AddFlags(rootCmd.Flags())
102-
if err := rootCmd.Execute(); err != nil {
124+
if err := flag.Set("logtostderr", "true"); err != nil {
125+
fmt.Fprintf(os.Stderr, "failed to set logtostderr flag: %v\n", err)
103126
os.Exit(1)
104127
}
105128
}
106129

130+
func main() {
131+
defer klog.Flush()
132+
if err := rootCmd.Execute(); err != nil {
133+
os.Exit(1)
134+
}
135+
}

cmd/kubectl-tree/status.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package main
22

33
import (
4+
"encoding/json"
45
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
6+
"k8s.io/klog"
57
)
68

79
type ReadyStatus string // True False Unknown or ""
810
type Reason string
911

1012
func extractStatus(obj unstructured.Unstructured) (ReadyStatus, Reason) {
13+
jsonVal, _ := json.Marshal(obj.Object["status"])
14+
klog.V(6).Infof("status for object=%s/%s: %s", obj.GetKind(), obj.GetName(), string(jsonVal))
1115
statusF, ok := obj.Object["status"]
1216
if !ok {
1317
return "", ""

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ require (
1515
github.com/mattn/go-isatty v0.0.11 // indirect
1616
github.com/mattn/go-runewidth v0.0.7 // indirect
1717
github.com/spf13/cobra v0.0.5
18+
github.com/spf13/pflag v1.0.5
1819
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 // indirect
1920
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect
2021
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 // indirect
@@ -25,5 +26,6 @@ require (
2526
k8s.io/apimachinery v0.17.0
2627
k8s.io/cli-runtime v0.17.0
2728
k8s.io/client-go v0.17.0
29+
k8s.io/klog v1.0.0
2830
k8s.io/utils v0.0.0-20191218082557-f07c713de883 // indirect
2931
)

0 commit comments

Comments
 (0)