From a01abf97d158d2317fc747fbba314839882fa3ad Mon Sep 17 00:00:00 2001 From: Kirk Bater Date: Mon, 4 Aug 2025 10:18:29 -0400 Subject: [PATCH] minimal example of working metrics --- cmd/cmd.go | 55 ++++++++++++++++++++++++++++-------------------------- go.mod | 14 +++++++++----- go.sum | 18 ++++++++++++++++++ main.go | 8 ++++++++ 4 files changed, 64 insertions(+), 31 deletions(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index 5b703d06a..393377fb1 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -17,6 +17,7 @@ import ( "k8s.io/client-go/kubernetes/scheme" "k8s.io/kubectl/pkg/util/slice" + metrics "github.com/iamkirkbater/cobra-otel-metrics" "github.com/openshift/osdctl/cmd/aao" "github.com/openshift/osdctl/cmd/account" "github.com/openshift/osdctl/cmd/alerts" @@ -54,36 +55,38 @@ func init() { } // NewCmdRoot represents the base command when called without any subcommands -func NewCmdRoot(streams genericclioptions.IOStreams) *cobra.Command { +func NewCmdRoot(streams genericclioptions.IOStreams) *metrics.Command { globalOpts := &globalflags.GlobalOptions{} - rootCmd := &cobra.Command{ - Use: "osdctl", - Short: "OSD CLI", - Long: `CLI tool to provide OSD related utilities`, - DisableAutoGenTag: true, - PersistentPreRun: func(cmd *cobra.Command, args []string) { - noAwsProxy, err := cmd.Flags().GetBool(aws.NoProxyFlag) - if err != nil { - fmt.Printf("flag --%v undefined\n", aws.NoProxyFlag) - os.Exit(1) - } - viper.Set(aws.NoProxyFlag, noAwsProxy) - - skipVersionCheck, err := cmd.Flags().GetBool("skip-version-check") - if err != nil { - fmt.Println("flag --skip-version-check/-S undefined") - os.Exit(1) - } - - // Checks the skipVersionCheck flag and the command being run to determine if the version check should run - if shouldRunVersionCheck(skipVersionCheck, cmd.Use) { - versionCheck() - } + rootCmd := &metrics.Command{ + Command: cobra.Command{ + Use: "osdctl", + Short: "OSD CLI", + Long: `CLI tool to provide OSD related utilities`, + DisableAutoGenTag: true, + PersistentPreRun: func(cmd *cobra.Command, args []string) { + noAwsProxy, err := cmd.Flags().GetBool(aws.NoProxyFlag) + if err != nil { + fmt.Printf("flag --%v undefined\n", aws.NoProxyFlag) + os.Exit(1) + } + viper.Set(aws.NoProxyFlag, noAwsProxy) + + skipVersionCheck, err := cmd.Flags().GetBool("skip-version-check") + if err != nil { + fmt.Println("flag --skip-version-check/-S undefined") + os.Exit(1) + } + + // Checks the skipVersionCheck flag and the command being run to determine if the version check should run + if shouldRunVersionCheck(skipVersionCheck, cmd.Use) { + versionCheck() + } + }, }, } - globalflags.AddGlobalFlags(rootCmd, globalOpts) - kubeFlags := globalflags.GetFlags(rootCmd) + globalflags.AddGlobalFlags(&rootCmd.Command, globalOpts) + kubeFlags := globalflags.GetFlags(&rootCmd.Command) kubeClient := k8s.NewClient(kubeFlags) diff --git a/go.mod b/go.mod index d7b3a5f29..60ec14f7f 100644 --- a/go.mod +++ b/go.mod @@ -140,7 +140,7 @@ require ( github.com/gin-contrib/sse v1.0.0 // indirect github.com/gin-gonic/gin v1.10.0 // indirect github.com/go-errors/errors v1.5.1 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -177,6 +177,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-version v1.7.0 // indirect + github.com/iamkirkbater/cobra-otel-metrics v0.0.0-20250804135804-6a51249c96d4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/iris-contrib/schema v0.0.6 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -253,9 +254,12 @@ require ( gitlab.com/c0b/go-ordered-json v0.0.0-20201030195603-febf46534d5a // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect - go.opentelemetry.io/otel v1.34.0 // indirect - go.opentelemetry.io/otel/metric v1.34.0 // indirect - go.opentelemetry.io/otel/trace v1.34.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/arch v0.14.0 // indirect @@ -263,7 +267,7 @@ require ( golang.org/x/exp v0.0.0-20250207012021-f9890c6ad9f3 // indirect golang.org/x/mod v0.24.0 // indirect golang.org/x/net v0.37.0 // indirect - golang.org/x/sys v0.32.0 // indirect + golang.org/x/sys v0.34.0 // indirect golang.org/x/text v0.23.0 // indirect golang.org/x/time v0.10.0 // indirect golang.org/x/tools v0.31.0 // indirect diff --git a/go.sum b/go.sum index fc76cf2ba..e12fcdb48 100644 --- a/go.sum +++ b/go.sum @@ -226,6 +226,8 @@ github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= @@ -364,6 +366,8 @@ github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iamkirkbater/cobra-otel-metrics v0.0.0-20250804135804-6a51249c96d4 h1:RZbHlc8hVd/dGzdODkfS0K0RYDcUbU4cGLXjqIau+BI= +github.com/iamkirkbater/cobra-otel-metrics v0.0.0-20250804135804-6a51249c96d4/go.mod h1:6S/D/5UTmoxqPoa0q8uWVUQejFAGChI7qVS7NKwfhIc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -693,14 +697,26 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSG go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0 h1:6VjV6Et+1Hd2iLZEPtdV7vie80Yyqf7oikJLjQ/myi0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0/go.mod h1:u8hcp8ji5gaM/RfcOo8z9NMnf1pVLfVY7lBY2VOGuUU= go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -805,6 +821,8 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/main.go b/main.go index 57bc1f74f..bdfdc19e4 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,9 @@ import ( "github.com/openshift/osdctl/cmd" "github.com/openshift/osdctl/pkg/osdctlConfig" + "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" + metrics "github.com/iamkirkbater/cobra-otel-metrics" "k8s.io/cli-runtime/pkg/genericclioptions" ) @@ -18,8 +20,14 @@ func main() { return } + stdoutExporter, _ := stdoutmetric.New() + command := cmd.NewCmdRoot(genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr}) + command.SetupMetrics( + metrics.WithExporter(stdoutExporter), + ) + if err := command.Execute(); err != nil { _, err := fmt.Fprintf(os.Stderr, "%v\n", err) if err != nil {