From 97e96869902f267f35754ef52076e6ea4583e31b Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Mon, 15 May 2023 12:26:20 +0530 Subject: [PATCH 01/16] Add support for OCI Client metrics --- cloud/metrics/metrics.go | 66 ++++++++++++++ cloud/scope/clients.go | 6 +- cloud/services/compute/ClientWrapper.go | 110 ++++++++++++++++++++++++ go.mod | 13 +-- go.sum | 71 +++------------ 5 files changed, 200 insertions(+), 66 deletions(-) create mode 100644 cloud/metrics/metrics.go create mode 100644 cloud/services/compute/ClientWrapper.go diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go new file mode 100644 index 00000000..d326ec00 --- /dev/null +++ b/cloud/metrics/metrics.go @@ -0,0 +1,66 @@ +/* +Copyright (c) 2023 Oracle and/or its affiliates. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package metrics + +import ( + "net/http" + "strconv" + + "github.com/oracle/oci-go-sdk/v65/common" + "github.com/prometheus/client_golang/prometheus" +) + +var ( + ociRequestCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "oci_requests_total", + Help: "OCI API requests total.", + }, + []string{"resource", "code", "verb"}, + ) +) + +type verb string + +const ( + Get string = "get" + List string = "list" + Create string = "create" + Update string = "update" + Delete string = "delete" +) + +func IncRequestCounter(err error, service string, verb string, response *http.Response) { + statusCode := 999 + if err != nil { + if serviceErr, ok := err.(common.ServiceError); ok { + statusCode = serviceErr.GetHTTPStatusCode() + } + } else { + statusCode = response.StatusCode + } + + ociRequestCounter.With(prometheus.Labels{ + "service": service, + "verb": verb, + "code": strconv.Itoa(statusCode), + }).Inc() +} + +func init() { + prometheus.MustRegister(ociRequestCounter) +} diff --git a/cloud/scope/clients.go b/cloud/scope/clients.go index e957eff5..c83de4f2 100644 --- a/cloud/scope/clients.go +++ b/cloud/scope/clients.go @@ -295,7 +295,7 @@ func (c *ClientProvider) createIdentityClient(region string, ociAuthConfigProvid return &identityClt, nil } -func (c *ClientProvider) createComputeClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.ComputeClient, error) { +func (c *ClientProvider) createComputeClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (compute.ComputeClient, error) { computeClient, err := core.NewComputeClientWithConfigurationProvider(ociAuthConfigProvider) if err != nil { logger.Error(err, "unable to create OCI Compute Client") @@ -320,7 +320,9 @@ func (c *ClientProvider) createComputeClient(region string, ociAuthConfigProvide } computeClient.Interceptor = setVersionHeader() - return &computeClient, nil + wrapper := compute.NewClientWrapper(computeClient) + + return &wrapper, nil } func (c *ClientProvider) createComputeManagementClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.ComputeManagementClient, error) { diff --git a/cloud/services/compute/ClientWrapper.go b/cloud/services/compute/ClientWrapper.go new file mode 100644 index 00000000..411c6cfb --- /dev/null +++ b/cloud/services/compute/ClientWrapper.go @@ -0,0 +1,110 @@ +/* + Copyright (c) 2023 Oracle and/or its affiliates. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package compute + +import ( + "context" + "net/http" + + "github.com/oracle/cluster-api-provider-oci/cloud/metrics" + "github.com/oracle/oci-go-sdk/v65/core" + "github.com/prometheus/client_golang/prometheus" +) + +var ( + ociRequestCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "oci_requests_total", + Help: "OCI API requests total.", + }, + []string{"resource", "code", "verb"}, + ) +) + +type ClientWrapper struct { + client ComputeClient +} + +func NewClientWrapper(computeClient ComputeClient) ClientWrapper { + return ClientWrapper{client: computeClient} +} +func (wrapper ClientWrapper) LaunchInstance(ctx context.Context, request core.LaunchInstanceRequest) (response core.LaunchInstanceResponse, err error) { + resp, err := wrapper.client.LaunchInstance(ctx, request) + defer func() { + var httpResponse *http.Response + if err == nil { + httpResponse = response.RawResponse + } + metrics.IncRequestCounter(err, "compute", "launch", httpResponse) + }() + return resp, err +} +func (wrapper ClientWrapper) TerminateInstance(ctx context.Context, request core.TerminateInstanceRequest) (response core.TerminateInstanceResponse, err error) { + resp, err := wrapper.client.TerminateInstance(ctx, request) + defer func() { + var httpResponse *http.Response + if err == nil { + httpResponse = response.RawResponse + } + metrics.IncRequestCounter(err, "compute", "delete", httpResponse) + }() + return resp, err +} +func (wrapper ClientWrapper) GetInstance(ctx context.Context, request core.GetInstanceRequest) (response core.GetInstanceResponse, err error) { + resp, err := wrapper.client.GetInstance(ctx, request) + defer func() { + var httpResponse *http.Response + if err == nil { + httpResponse = response.RawResponse + } + metrics.IncRequestCounter(err, "compute", "get", httpResponse) + }() + return resp, err +} +func (wrapper ClientWrapper) ListInstances(ctx context.Context, request core.ListInstancesRequest) (response core.ListInstancesResponse, err error) { + resp, err := wrapper.client.ListInstances(ctx, request) + defer func() { + var httpResponse *http.Response + if err == nil { + httpResponse = response.RawResponse + } + metrics.IncRequestCounter(err, "compute", "list", httpResponse) + }() + return resp, err +} +func (wrapper ClientWrapper) AttachVnic(ctx context.Context, request core.AttachVnicRequest) (response core.AttachVnicResponse, err error) { + resp, err := wrapper.client.AttachVnic(ctx, request) + defer func() { + var httpResponse *http.Response + if err == nil { + httpResponse = response.RawResponse + } + metrics.IncRequestCounter(err, "compute", "attachvnic", httpResponse) + }() + return resp, err +} +func (wrapper ClientWrapper) ListVnicAttachments(ctx context.Context, request core.ListVnicAttachmentsRequest) (response core.ListVnicAttachmentsResponse, err error) { + resp, err := wrapper.client.ListVnicAttachments(ctx, request) + defer func() { + var httpResponse *http.Response + if err == nil { + httpResponse = response.RawResponse + } + metrics.IncRequestCounter(err, "compute", "listvnicattachments", httpResponse) + }() + return resp, err +} diff --git a/go.mod b/go.mod index 30262572..e3ed2341 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/onsi/gomega v1.27.5 github.com/oracle/oci-go-sdk/v65 v65.29.0 github.com/pkg/errors v0.9.1 + github.com/prometheus/client_golang v1.15.1 github.com/spf13/pflag v1.0.5 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.26.1 @@ -36,7 +37,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver v3.5.1+incompatible // indirect github.com/blang/semver/v4 v4.0.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coredns/caddy v1.1.0 // indirect github.com/coredns/corefile-migration v1.0.20 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -76,7 +77,7 @@ require ( github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.17 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect @@ -87,10 +88,10 @@ require ( github.com/opencontainers/image-spec v1.0.2 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_golang v1.15.1 // indirect github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/sirupsen/logrus v1.8.1 // indirect github.com/sony/gobreaker v0.5.0 // indirect @@ -116,7 +117,7 @@ require ( gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.30.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 72cd7cc5..fef57e1f 100644 --- a/go.sum +++ b/go.sum @@ -54,10 +54,7 @@ github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXG github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -83,9 +80,8 @@ github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2y github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -148,13 +144,8 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= @@ -305,27 +296,22 @@ github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJS github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -343,8 +329,8 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= -github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -366,7 +352,6 @@ github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= @@ -374,7 +359,6 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= @@ -404,34 +388,21 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -446,8 +417,6 @@ github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5g github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -592,7 +561,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -616,10 +584,7 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= @@ -633,8 +598,6 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -658,7 +621,6 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -668,7 +630,6 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -681,8 +642,6 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -696,11 +655,8 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -893,8 +849,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -913,7 +869,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= From 1d3671b63c926262d24f6cda6e7631c8b853257c Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Mon, 15 May 2023 12:33:37 +0530 Subject: [PATCH 02/16] Add support for OCI Client metrics --- cloud/metrics/metrics.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index d326ec00..d58093e9 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -30,7 +30,7 @@ var ( Name: "oci_requests_total", Help: "OCI API requests total.", }, - []string{"resource", "code", "verb"}, + []string{"service", "code", "verb"}, ) ) From 808de1658c75ee2664364b51e0907f38ae794d7a Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Mon, 15 May 2023 14:14:16 +0530 Subject: [PATCH 03/16] Add support for OCI Client metrics --- cloud/metrics/metrics.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index d58093e9..2a25789b 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -17,6 +17,7 @@ limitations under the License. package metrics import ( + "fmt" "net/http" "strconv" @@ -53,6 +54,7 @@ func IncRequestCounter(err error, service string, verb string, response *http.Re } else { statusCode = response.StatusCode } + fmt.Println(fmt.Sprintf("status code is %d", statusCode)) ociRequestCounter.With(prometheus.Labels{ "service": service, @@ -62,5 +64,6 @@ func IncRequestCounter(err error, service string, verb string, response *http.Re } func init() { + fmt.Println("in must register") prometheus.MustRegister(ociRequestCounter) } From 500dad320fb919d3e93a772c52d63d9accc35e26 Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Mon, 15 May 2023 14:47:02 +0530 Subject: [PATCH 04/16] Add support for OCI Client metrics --- cloud/metrics/metrics.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index 2a25789b..86c12910 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -23,6 +23,7 @@ import ( "github.com/oracle/oci-go-sdk/v65/common" "github.com/prometheus/client_golang/prometheus" + "sigs.k8s.io/controller-runtime/pkg/metrics" ) var ( @@ -65,5 +66,5 @@ func IncRequestCounter(err error, service string, verb string, response *http.Re func init() { fmt.Println("in must register") - prometheus.MustRegister(ociRequestCounter) + metrics.Registry.MustRegister(ociRequestCounter) } From 35a947be8ebb7317c3d9abb5d408fe37e69bf29c Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Mon, 15 May 2023 15:33:22 +0530 Subject: [PATCH 05/16] Add support for OCI Client metrics --- cloud/metrics/metrics.go | 56 +++++++++++++++++-------- cloud/scope/clients.go | 2 +- cloud/services/compute/ClientWrapper.go | 49 ++++++++++++++++++---- 3 files changed, 80 insertions(+), 27 deletions(-) diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index 86c12910..0834993e 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -17,28 +17,26 @@ limitations under the License. package metrics import ( - "fmt" "net/http" "strconv" + "time" "github.com/oracle/oci-go-sdk/v65/common" "github.com/prometheus/client_golang/prometheus" "sigs.k8s.io/controller-runtime/pkg/metrics" ) -var ( - ociRequestCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "oci_requests_total", - Help: "OCI API requests total.", - }, - []string{"service", "code", "verb"}, - ) -) - type verb string const ( + SubSystemOCI = "oci" + OCIRequestsTotal = "oci_requests_total" + Duration = "oci_request_duration" + Service = "service" + StatusCode = "status_code" + Operation = "operation" + + Region = "region" Get string = "get" List string = "list" Create string = "create" @@ -46,7 +44,23 @@ const ( Delete string = "delete" ) -func IncRequestCounter(err error, service string, verb string, response *http.Response) { +var ( + ociRequestCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Subsystem: SubSystemOCI, + Name: OCIRequestsTotal, + Help: "OCI API requests total.", + }, + []string{Service, StatusCode, Operation, Region}, + ) + ociRequestDurationSeconds = prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Subsystem: SubSystemOCI, + Name: Duration, + Help: "Duration/Latency of HTTP requests to OCI", + }, []string{Service, StatusCode, Operation, Region}) +) + +func IncRequestCounter(err error, service string, operation string, region string, response *http.Response) { statusCode := 999 if err != nil { if serviceErr, ok := err.(common.ServiceError); ok { @@ -55,16 +69,22 @@ func IncRequestCounter(err error, service string, verb string, response *http.Re } else { statusCode = response.StatusCode } - fmt.Println(fmt.Sprintf("status code is %d", statusCode)) - ociRequestCounter.With(prometheus.Labels{ - "service": service, - "verb": verb, - "code": strconv.Itoa(statusCode), + Service: service, + Operation: operation, + StatusCode: strconv.Itoa(statusCode), + Region: region, }).Inc() } +func ObserverRequestDuration(service string, operation string, region string, duration time.Duration) { + ociRequestDurationSeconds.With(prometheus.Labels{ + Service: service, + Operation: operation, + Region: region, + }).Observe(duration.Seconds()) +} + func init() { - fmt.Println("in must register") metrics.Registry.MustRegister(ociRequestCounter) } diff --git a/cloud/scope/clients.go b/cloud/scope/clients.go index c83de4f2..31a51793 100644 --- a/cloud/scope/clients.go +++ b/cloud/scope/clients.go @@ -320,7 +320,7 @@ func (c *ClientProvider) createComputeClient(region string, ociAuthConfigProvide } computeClient.Interceptor = setVersionHeader() - wrapper := compute.NewClientWrapper(computeClient) + wrapper := compute.NewClientWrapper(computeClient, region) return &wrapper, nil } diff --git a/cloud/services/compute/ClientWrapper.go b/cloud/services/compute/ClientWrapper.go index 411c6cfb..d6d19119 100644 --- a/cloud/services/compute/ClientWrapper.go +++ b/cloud/services/compute/ClientWrapper.go @@ -19,12 +19,20 @@ package compute import ( "context" "net/http" + "time" "github.com/oracle/cluster-api-provider-oci/cloud/metrics" "github.com/oracle/oci-go-sdk/v65/core" "github.com/prometheus/client_golang/prometheus" ) +const ( + Service = "compute" + Launch = "launch" + AttachVnic = "attachvnic" + ListVnicAttachments = "listvnicattachments" +) + var ( ociRequestCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ @@ -37,74 +45,99 @@ var ( type ClientWrapper struct { client ComputeClient + region string } -func NewClientWrapper(computeClient ComputeClient) ClientWrapper { - return ClientWrapper{client: computeClient} +func NewClientWrapper(computeClient ComputeClient, region string) ClientWrapper { + return ClientWrapper{client: computeClient, region: region} } func (wrapper ClientWrapper) LaunchInstance(ctx context.Context, request core.LaunchInstanceRequest) (response core.LaunchInstanceResponse, err error) { + t := time.Now() resp, err := wrapper.client.LaunchInstance(ctx, request) defer func() { var httpResponse *http.Response if err == nil { httpResponse = response.RawResponse } - metrics.IncRequestCounter(err, "compute", "launch", httpResponse) + metrics.IncRequestCounter(err, Service, Launch, wrapper.region, httpResponse) + }() + defer func() { + metrics.ObserverRequestDuration(Service, Launch, wrapper.region, time.Since(t)) }() return resp, err } func (wrapper ClientWrapper) TerminateInstance(ctx context.Context, request core.TerminateInstanceRequest) (response core.TerminateInstanceResponse, err error) { + t := time.Now() resp, err := wrapper.client.TerminateInstance(ctx, request) defer func() { var httpResponse *http.Response if err == nil { httpResponse = response.RawResponse } - metrics.IncRequestCounter(err, "compute", "delete", httpResponse) + metrics.IncRequestCounter(err, Service, metrics.Delete, wrapper.region, httpResponse) + }() + defer func() { + metrics.ObserverRequestDuration(Service, metrics.Delete, wrapper.region, time.Since(t)) }() return resp, err } func (wrapper ClientWrapper) GetInstance(ctx context.Context, request core.GetInstanceRequest) (response core.GetInstanceResponse, err error) { + t := time.Now() resp, err := wrapper.client.GetInstance(ctx, request) defer func() { var httpResponse *http.Response if err == nil { httpResponse = response.RawResponse } - metrics.IncRequestCounter(err, "compute", "get", httpResponse) + metrics.IncRequestCounter(err, Service, metrics.Get, wrapper.region, httpResponse) + }() + defer func() { + metrics.ObserverRequestDuration(Service, metrics.Get, wrapper.region, time.Since(t)) }() return resp, err } func (wrapper ClientWrapper) ListInstances(ctx context.Context, request core.ListInstancesRequest) (response core.ListInstancesResponse, err error) { + t := time.Now() resp, err := wrapper.client.ListInstances(ctx, request) defer func() { var httpResponse *http.Response if err == nil { httpResponse = response.RawResponse } - metrics.IncRequestCounter(err, "compute", "list", httpResponse) + metrics.IncRequestCounter(err, Service, metrics.List, wrapper.region, httpResponse) + }() + defer func() { + metrics.ObserverRequestDuration(Service, metrics.List, wrapper.region, time.Since(t)) }() return resp, err } func (wrapper ClientWrapper) AttachVnic(ctx context.Context, request core.AttachVnicRequest) (response core.AttachVnicResponse, err error) { + t := time.Now() resp, err := wrapper.client.AttachVnic(ctx, request) defer func() { var httpResponse *http.Response if err == nil { httpResponse = response.RawResponse } - metrics.IncRequestCounter(err, "compute", "attachvnic", httpResponse) + metrics.IncRequestCounter(err, Service, AttachVnic, wrapper.region, httpResponse) + }() + defer func() { + metrics.ObserverRequestDuration(Service, AttachVnic, wrapper.region, time.Since(t)) }() return resp, err } func (wrapper ClientWrapper) ListVnicAttachments(ctx context.Context, request core.ListVnicAttachmentsRequest) (response core.ListVnicAttachmentsResponse, err error) { + t := time.Now() resp, err := wrapper.client.ListVnicAttachments(ctx, request) defer func() { var httpResponse *http.Response if err == nil { httpResponse = response.RawResponse } - metrics.IncRequestCounter(err, "compute", "listvnicattachments", httpResponse) + metrics.IncRequestCounter(err, Service, ListVnicAttachments, wrapper.region, httpResponse) + }() + defer func() { + metrics.ObserverRequestDuration(Service, ListVnicAttachments, wrapper.region, time.Since(t)) }() return resp, err } From c3df7949c9c342d2865231785e564fe8c7bb89ee Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Mon, 15 May 2023 15:37:02 +0530 Subject: [PATCH 06/16] Add support for OCI Client metrics --- cloud/metrics/metrics.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index 0834993e..6beefad1 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -87,4 +87,5 @@ func ObserverRequestDuration(service string, operation string, region string, du func init() { metrics.Registry.MustRegister(ociRequestCounter) + metrics.Registry.MustRegister(ociRequestDurationSeconds) } From 30cc00102af0c43e910389d8ff7eea68bc936174 Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Mon, 15 May 2023 15:43:49 +0530 Subject: [PATCH 07/16] Add support for OCI Client metrics --- cloud/metrics/metrics.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index 6beefad1..562203c2 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -57,7 +57,7 @@ var ( Subsystem: SubSystemOCI, Name: Duration, Help: "Duration/Latency of HTTP requests to OCI", - }, []string{Service, StatusCode, Operation, Region}) + }, []string{Service, Operation, Region}) ) func IncRequestCounter(err error, service string, operation string, region string, response *http.Response) { From 6eef64c6ba400303c2a8decf0fffe36924e9c222 Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Mon, 15 May 2023 16:00:55 +0530 Subject: [PATCH 08/16] Add support for OCI Client metrics --- cloud/metrics/metrics.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index 562203c2..7d8aee51 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -30,8 +30,8 @@ type verb string const ( SubSystemOCI = "oci" - OCIRequestsTotal = "oci_requests_total" - Duration = "oci_request_duration" + OCIRequestsTotal = "requests_total" + Duration = "request_duration" Service = "service" StatusCode = "status_code" Operation = "operation" From c93f3d2cc7f349807b9d1aa386ae5076907c1dab Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Mon, 15 May 2023 16:51:46 +0530 Subject: [PATCH 09/16] Add support for OCI Client metrics --- cloud/metrics/metrics.go | 20 ++++++++++++++++++++ cloud/scope/clients.go | 7 +++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index 7d8aee51..30e55d10 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -19,6 +19,7 @@ package metrics import ( "net/http" "strconv" + "strings" "time" "github.com/oracle/oci-go-sdk/v65/common" @@ -60,6 +61,25 @@ var ( }, []string{Service, Operation, Region}) ) +type DispatcherWrapper struct { + dispatcher common.HTTPRequestDispatcher + region string +} + +func (wrapper DispatcherWrapper) Do(req *http.Request) (*http.Response, error) { + service := strings.Split(req.URL.Path, "/")[1] + resp, err := wrapper.dispatcher.Do(req) + IncRequestCounter(err, service, req.Method, wrapper.region, resp) + return resp, err +} + +func NewDispatcherWrapper(wrapper common.HTTPRequestDispatcher, region string) DispatcherWrapper { + return DispatcherWrapper{ + dispatcher: wrapper, + region: region, + } +} + func IncRequestCounter(err error, service string, operation string, region string, response *http.Response) { statusCode := 999 if err != nil { diff --git a/cloud/scope/clients.go b/cloud/scope/clients.go index 31a51793..2ffb2fd5 100644 --- a/cloud/scope/clients.go +++ b/cloud/scope/clients.go @@ -19,6 +19,7 @@ package scope import ( "crypto/tls" "crypto/x509" + "github.com/oracle/cluster-api-provider-oci/cloud/metrics" "net/http" "sync" @@ -133,7 +134,7 @@ func (c *ClientProvider) GetRegion() (string, error) { } func (c *ClientProvider) createClients(region string) (OCIClients, error) { - vcnClient, err := c.createVncClient(region, c.ociAuthConfigProvider, c.Logger) + vcnClient, err := c.createVcnClient(region, c.ociAuthConfigProvider, c.Logger) if err != nil { return OCIClients{}, err } @@ -182,8 +183,10 @@ func (c *ClientProvider) createClients(region string) (OCIClients, error) { }, err } -func (c *ClientProvider) createVncClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.VirtualNetworkClient, error) { +func (c *ClientProvider) createVcnClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.VirtualNetworkClient, error) { vcnClient, err := core.NewVirtualNetworkClientWithConfigurationProvider(ociAuthConfigProvider) + dispatcher := vcnClient.HTTPClient + vcnClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if err != nil { logger.Error(err, "unable to create OCI VCN Client") return nil, err From 8824fda3c24ec42cbca896537dc70f68a0b427e2 Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Mon, 15 May 2023 17:01:36 +0530 Subject: [PATCH 10/16] Add support for OCI Client metrics --- cloud/metrics/metrics.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index 30e55d10..6d07c728 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -67,7 +67,7 @@ type DispatcherWrapper struct { } func (wrapper DispatcherWrapper) Do(req *http.Request) (*http.Response, error) { - service := strings.Split(req.URL.Path, "/")[1] + service := strings.Split(req.URL.Path, "/")[2] resp, err := wrapper.dispatcher.Do(req) IncRequestCounter(err, service, req.Method, wrapper.region, resp) return resp, err From dafc25fcf263b2a36d88513fc429ddfbbb740f4a Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Mon, 15 May 2023 17:08:39 +0530 Subject: [PATCH 11/16] Add support for OCI Client metrics --- cloud/metrics/metrics.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index 6d07c728..0a325c1b 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -68,8 +68,12 @@ type DispatcherWrapper struct { func (wrapper DispatcherWrapper) Do(req *http.Request) (*http.Response, error) { service := strings.Split(req.URL.Path, "/")[2] + t := time.Now() resp, err := wrapper.dispatcher.Do(req) - IncRequestCounter(err, service, req.Method, wrapper.region, resp) + defer func() { + IncRequestCounter(err, service, req.Method, wrapper.region, resp) + ObserverRequestDuration(service, req.Method, wrapper.region, time.Since(t)) + }() return resp, err } From 71c47f5968239205a1bc8d40bcf7422cc604735f Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Tue, 16 May 2023 09:16:27 +0530 Subject: [PATCH 12/16] Add support for OCI Client metrics --- .../http_request_dispatcher_wrapper.go | 48 ++++++ cloud/metrics/metrics.go | 32 +--- cloud/scope/clients.go | 18 ++- cloud/services/compute/ClientWrapper.go | 143 ------------------ 4 files changed, 63 insertions(+), 178 deletions(-) create mode 100644 cloud/metrics/http_request_dispatcher_wrapper.go delete mode 100644 cloud/services/compute/ClientWrapper.go diff --git a/cloud/metrics/http_request_dispatcher_wrapper.go b/cloud/metrics/http_request_dispatcher_wrapper.go new file mode 100644 index 00000000..ce3c5c4c --- /dev/null +++ b/cloud/metrics/http_request_dispatcher_wrapper.go @@ -0,0 +1,48 @@ +/* +Copyright (c) 2023 Oracle and/or its affiliates. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package metrics + +import ( + "net/http" + "strings" + "time" + + "github.com/oracle/oci-go-sdk/v65/common" +) + +type DispatcherWrapper struct { + dispatcher common.HTTPRequestDispatcher + region string +} + +func (wrapper DispatcherWrapper) Do(req *http.Request) (*http.Response, error) { + service := strings.Split(req.URL.Path, "/")[2] + t := time.Now() + resp, err := wrapper.dispatcher.Do(req) + defer func() { + IncRequestCounter(err, service, req.Method, wrapper.region, resp) + ObserverRequestDuration(service, req.Method, wrapper.region, time.Since(t)) + }() + return resp, err +} + +func NewDispatcherWrapper(wrapper common.HTTPRequestDispatcher, region string) DispatcherWrapper { + return DispatcherWrapper{ + dispatcher: wrapper, + region: region, + } +} diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index 0a325c1b..cbb8b635 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -19,10 +19,8 @@ package metrics import ( "net/http" "strconv" - "strings" "time" - "github.com/oracle/oci-go-sdk/v65/common" "github.com/prometheus/client_golang/prometheus" "sigs.k8s.io/controller-runtime/pkg/metrics" ) @@ -61,36 +59,10 @@ var ( }, []string{Service, Operation, Region}) ) -type DispatcherWrapper struct { - dispatcher common.HTTPRequestDispatcher - region string -} - -func (wrapper DispatcherWrapper) Do(req *http.Request) (*http.Response, error) { - service := strings.Split(req.URL.Path, "/")[2] - t := time.Now() - resp, err := wrapper.dispatcher.Do(req) - defer func() { - IncRequestCounter(err, service, req.Method, wrapper.region, resp) - ObserverRequestDuration(service, req.Method, wrapper.region, time.Since(t)) - }() - return resp, err -} - -func NewDispatcherWrapper(wrapper common.HTTPRequestDispatcher, region string) DispatcherWrapper { - return DispatcherWrapper{ - dispatcher: wrapper, - region: region, - } -} - func IncRequestCounter(err error, service string, operation string, region string, response *http.Response) { + // unknown errors from request dispatcher will have response code of 999 statusCode := 999 - if err != nil { - if serviceErr, ok := err.(common.ServiceError); ok { - statusCode = serviceErr.GetHTTPStatusCode() - } - } else { + if err == nil { statusCode = response.StatusCode } ociRequestCounter.With(prometheus.Labels{ diff --git a/cloud/scope/clients.go b/cloud/scope/clients.go index 2ffb2fd5..c02e2188 100644 --- a/cloud/scope/clients.go +++ b/cloud/scope/clients.go @@ -185,13 +185,13 @@ func (c *ClientProvider) createClients(region string) (OCIClients, error) { func (c *ClientProvider) createVcnClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.VirtualNetworkClient, error) { vcnClient, err := core.NewVirtualNetworkClientWithConfigurationProvider(ociAuthConfigProvider) - dispatcher := vcnClient.HTTPClient - vcnClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if err != nil { logger.Error(err, "unable to create OCI VCN Client") return nil, err } vcnClient.SetRegion(region) + dispatcher := vcnClient.HTTPClient + vcnClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := vcnClient.HTTPClient.(*http.Client); ok { @@ -249,6 +249,8 @@ func (c *ClientProvider) createLBClient(region string, ociAuthConfigProvider com return nil, err } lbClient.SetRegion(region) + dispatcher := lbClient.HTTPClient + lbClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := lbClient.HTTPClient.(*http.Client); ok { @@ -277,6 +279,8 @@ func (c *ClientProvider) createIdentityClient(region string, ociAuthConfigProvid return nil, err } identityClt.SetRegion(region) + dispatcher := identityClt.HTTPClient + identityClt.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := identityClt.HTTPClient.(*http.Client); ok { @@ -305,6 +309,8 @@ func (c *ClientProvider) createComputeClient(region string, ociAuthConfigProvide return nil, err } computeClient.SetRegion(region) + dispatcher := computeClient.HTTPClient + computeClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := computeClient.HTTPClient.(*http.Client); ok { @@ -323,9 +329,7 @@ func (c *ClientProvider) createComputeClient(region string, ociAuthConfigProvide } computeClient.Interceptor = setVersionHeader() - wrapper := compute.NewClientWrapper(computeClient, region) - - return &wrapper, nil + return &computeClient, nil } func (c *ClientProvider) createComputeManagementClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.ComputeManagementClient, error) { @@ -335,6 +339,8 @@ func (c *ClientProvider) createComputeManagementClient(region string, ociAuthCon return nil, err } computeManagementClient.SetRegion(region) + dispatcher := computeManagementClient.HTTPClient + computeManagementClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := computeManagementClient.HTTPClient.(*http.Client); ok { @@ -363,6 +369,8 @@ func (c *ClientProvider) createContainerEngineClient(region string, ociAuthConfi return nil, err } containerEngineClt.SetRegion(region) + dispatcher := containerEngineClt.HTTPClient + containerEngineClt.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := containerEngineClt.HTTPClient.(*http.Client); ok { diff --git a/cloud/services/compute/ClientWrapper.go b/cloud/services/compute/ClientWrapper.go deleted file mode 100644 index d6d19119..00000000 --- a/cloud/services/compute/ClientWrapper.go +++ /dev/null @@ -1,143 +0,0 @@ -/* - Copyright (c) 2023 Oracle and/or its affiliates. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package compute - -import ( - "context" - "net/http" - "time" - - "github.com/oracle/cluster-api-provider-oci/cloud/metrics" - "github.com/oracle/oci-go-sdk/v65/core" - "github.com/prometheus/client_golang/prometheus" -) - -const ( - Service = "compute" - Launch = "launch" - AttachVnic = "attachvnic" - ListVnicAttachments = "listvnicattachments" -) - -var ( - ociRequestCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "oci_requests_total", - Help: "OCI API requests total.", - }, - []string{"resource", "code", "verb"}, - ) -) - -type ClientWrapper struct { - client ComputeClient - region string -} - -func NewClientWrapper(computeClient ComputeClient, region string) ClientWrapper { - return ClientWrapper{client: computeClient, region: region} -} -func (wrapper ClientWrapper) LaunchInstance(ctx context.Context, request core.LaunchInstanceRequest) (response core.LaunchInstanceResponse, err error) { - t := time.Now() - resp, err := wrapper.client.LaunchInstance(ctx, request) - defer func() { - var httpResponse *http.Response - if err == nil { - httpResponse = response.RawResponse - } - metrics.IncRequestCounter(err, Service, Launch, wrapper.region, httpResponse) - }() - defer func() { - metrics.ObserverRequestDuration(Service, Launch, wrapper.region, time.Since(t)) - }() - return resp, err -} -func (wrapper ClientWrapper) TerminateInstance(ctx context.Context, request core.TerminateInstanceRequest) (response core.TerminateInstanceResponse, err error) { - t := time.Now() - resp, err := wrapper.client.TerminateInstance(ctx, request) - defer func() { - var httpResponse *http.Response - if err == nil { - httpResponse = response.RawResponse - } - metrics.IncRequestCounter(err, Service, metrics.Delete, wrapper.region, httpResponse) - }() - defer func() { - metrics.ObserverRequestDuration(Service, metrics.Delete, wrapper.region, time.Since(t)) - }() - return resp, err -} -func (wrapper ClientWrapper) GetInstance(ctx context.Context, request core.GetInstanceRequest) (response core.GetInstanceResponse, err error) { - t := time.Now() - resp, err := wrapper.client.GetInstance(ctx, request) - defer func() { - var httpResponse *http.Response - if err == nil { - httpResponse = response.RawResponse - } - metrics.IncRequestCounter(err, Service, metrics.Get, wrapper.region, httpResponse) - }() - defer func() { - metrics.ObserverRequestDuration(Service, metrics.Get, wrapper.region, time.Since(t)) - }() - return resp, err -} -func (wrapper ClientWrapper) ListInstances(ctx context.Context, request core.ListInstancesRequest) (response core.ListInstancesResponse, err error) { - t := time.Now() - resp, err := wrapper.client.ListInstances(ctx, request) - defer func() { - var httpResponse *http.Response - if err == nil { - httpResponse = response.RawResponse - } - metrics.IncRequestCounter(err, Service, metrics.List, wrapper.region, httpResponse) - }() - defer func() { - metrics.ObserverRequestDuration(Service, metrics.List, wrapper.region, time.Since(t)) - }() - return resp, err -} -func (wrapper ClientWrapper) AttachVnic(ctx context.Context, request core.AttachVnicRequest) (response core.AttachVnicResponse, err error) { - t := time.Now() - resp, err := wrapper.client.AttachVnic(ctx, request) - defer func() { - var httpResponse *http.Response - if err == nil { - httpResponse = response.RawResponse - } - metrics.IncRequestCounter(err, Service, AttachVnic, wrapper.region, httpResponse) - }() - defer func() { - metrics.ObserverRequestDuration(Service, AttachVnic, wrapper.region, time.Since(t)) - }() - return resp, err -} -func (wrapper ClientWrapper) ListVnicAttachments(ctx context.Context, request core.ListVnicAttachmentsRequest) (response core.ListVnicAttachmentsResponse, err error) { - t := time.Now() - resp, err := wrapper.client.ListVnicAttachments(ctx, request) - defer func() { - var httpResponse *http.Response - if err == nil { - httpResponse = response.RawResponse - } - metrics.IncRequestCounter(err, Service, ListVnicAttachments, wrapper.region, httpResponse) - }() - defer func() { - metrics.ObserverRequestDuration(Service, ListVnicAttachments, wrapper.region, time.Since(t)) - }() - return resp, err -} From a76e525691ed06a37531093267fa880482c1f054 Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Tue, 16 May 2023 10:46:34 +0530 Subject: [PATCH 13/16] Add support for OCI Client metrics --- cloud/scope/clients.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/cloud/scope/clients.go b/cloud/scope/clients.go index c02e2188..cde60d23 100644 --- a/cloud/scope/clients.go +++ b/cloud/scope/clients.go @@ -194,7 +194,7 @@ func (c *ClientProvider) createVcnClient(region string, ociAuthConfigProvider co vcnClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { - if client, ok := vcnClient.HTTPClient.(*http.Client); ok { + if client, ok := dispatcher.(*http.Client); ok { err = c.setCerts(client) if err != nil { logger.Error(err, "unable to create OCI VCN Client") @@ -221,9 +221,11 @@ func (c *ClientProvider) createNLbClient(region string, ociAuthConfigProvider co return nil, err } nlbClient.SetRegion(region) + dispatcher := nlbClient.HTTPClient + nlbClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { - if client, ok := nlbClient.HTTPClient.(*http.Client); ok { + if client, ok := dispatcher.(*http.Client); ok { err = c.setCerts(client) if err != nil { logger.Error(err, "unable to create OCI NetworkLoadBalancer Client") @@ -253,7 +255,7 @@ func (c *ClientProvider) createLBClient(region string, ociAuthConfigProvider com lbClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { - if client, ok := lbClient.HTTPClient.(*http.Client); ok { + if client, ok := dispatcher.(*http.Client); ok { err = c.setCerts(client) if err != nil { logger.Error(err, "unable to create OCI Loadbalancer Client") @@ -283,7 +285,7 @@ func (c *ClientProvider) createIdentityClient(region string, ociAuthConfigProvid identityClt.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { - if client, ok := identityClt.HTTPClient.(*http.Client); ok { + if client, ok := dispatcher.(*http.Client); ok { err = c.setCerts(client) if err != nil { logger.Error(err, "unable to create OCI Identity Client") @@ -313,7 +315,7 @@ func (c *ClientProvider) createComputeClient(region string, ociAuthConfigProvide computeClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { - if client, ok := computeClient.HTTPClient.(*http.Client); ok { + if client, ok := dispatcher.(*http.Client); ok { err = c.setCerts(client) if err != nil { logger.Error(err, "unable to create OCI Compute Client") @@ -343,7 +345,7 @@ func (c *ClientProvider) createComputeManagementClient(region string, ociAuthCon computeManagementClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { - if client, ok := computeManagementClient.HTTPClient.(*http.Client); ok { + if client, ok := dispatcher.(*http.Client); ok { err = c.setCerts(client) if err != nil { logger.Error(err, "unable to create OCI Compute Management Client") @@ -373,7 +375,7 @@ func (c *ClientProvider) createContainerEngineClient(region string, ociAuthConfi containerEngineClt.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) if c.certOverride != nil { - if client, ok := containerEngineClt.HTTPClient.(*http.Client); ok { + if client, ok := dispatcher.(*http.Client); ok { err = c.setCerts(client) if err != nil { logger.Error(err, "unable to create OCI Container Engine Client") From f47ff52e9d6340120408514170db91a5eecd2941 Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Tue, 16 May 2023 12:10:38 +0530 Subject: [PATCH 14/16] Add support for OCI Client metrics --- .../http_request_dispatcher_wrapper.go | 24 +++++++++++++------ cloud/metrics/metrics.go | 16 +++++++------ cloud/scope/clients.go | 14 +++++------ 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/cloud/metrics/http_request_dispatcher_wrapper.go b/cloud/metrics/http_request_dispatcher_wrapper.go index ce3c5c4c..04c49e07 100644 --- a/cloud/metrics/http_request_dispatcher_wrapper.go +++ b/cloud/metrics/http_request_dispatcher_wrapper.go @@ -24,24 +24,34 @@ import ( "github.com/oracle/oci-go-sdk/v65/common" ) -type DispatcherWrapper struct { +// DispatcherWrapper is a wrapper around standard common.HTTPRequestDispatcher to handle +// metrics +type HttpRequestDispatcherWrapper struct { dispatcher common.HTTPRequestDispatcher region string } -func (wrapper DispatcherWrapper) Do(req *http.Request) (*http.Response, error) { - service := strings.Split(req.URL.Path, "/")[2] +// Do is wrapper implementation of common.HTTPRequestDispatcher Do method +func (wrapper HttpRequestDispatcherWrapper) Do(req *http.Request) (*http.Response, error) { t := time.Now() resp, err := wrapper.dispatcher.Do(req) defer func() { - IncRequestCounter(err, service, req.Method, wrapper.region, resp) - ObserverRequestDuration(service, req.Method, wrapper.region, time.Since(t)) + // taken from https://docs.oracle.com/en-us/iaas/Content/API/Concepts/usingapi.htm + // a URL consists of a version string and then a resource + urlSplit := strings.Split(req.URL.Path, "/") + if len(urlSplit) < 2 { + return + } + resource := urlSplit[2] + IncRequestCounter(err, resource, req.Method, wrapper.region, resp) + ObserverRequestDuration(resource, req.Method, wrapper.region, time.Since(t)) }() return resp, err } -func NewDispatcherWrapper(wrapper common.HTTPRequestDispatcher, region string) DispatcherWrapper { - return DispatcherWrapper{ +// NewHttpRequestDispatcherWrapper creates a new instance of HttpRequestDispatcherWrapper +func NewHttpRequestDispatcherWrapper(wrapper common.HTTPRequestDispatcher, region string) HttpRequestDispatcherWrapper { + return HttpRequestDispatcherWrapper{ dispatcher: wrapper, region: region, } diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index cbb8b635..a5a191bc 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -31,7 +31,7 @@ const ( SubSystemOCI = "oci" OCIRequestsTotal = "requests_total" Duration = "request_duration" - Service = "service" + Resource = "resource" StatusCode = "status_code" Operation = "operation" @@ -50,32 +50,34 @@ var ( Name: OCIRequestsTotal, Help: "OCI API requests total.", }, - []string{Service, StatusCode, Operation, Region}, + []string{Resource, StatusCode, Operation, Region}, ) ociRequestDurationSeconds = prometheus.NewHistogramVec(prometheus.HistogramOpts{ Subsystem: SubSystemOCI, Name: Duration, Help: "Duration/Latency of HTTP requests to OCI", - }, []string{Service, Operation, Region}) + }, []string{Resource, Operation, Region}) ) -func IncRequestCounter(err error, service string, operation string, region string, response *http.Response) { +// IncRequestCounter increments the request count metric for the given resource +func IncRequestCounter(err error, resource string, operation string, region string, response *http.Response) { // unknown errors from request dispatcher will have response code of 999 statusCode := 999 if err == nil { statusCode = response.StatusCode } ociRequestCounter.With(prometheus.Labels{ - Service: service, + Resource: resource, Operation: operation, StatusCode: strconv.Itoa(statusCode), Region: region, }).Inc() } -func ObserverRequestDuration(service string, operation string, region string, duration time.Duration) { +// ObserverRequestDuration observes the request duration for the partcular OCI request +func ObserverRequestDuration(resource string, operation string, region string, duration time.Duration) { ociRequestDurationSeconds.With(prometheus.Labels{ - Service: service, + Resource: resource, Operation: operation, Region: region, }).Observe(duration.Seconds()) diff --git a/cloud/scope/clients.go b/cloud/scope/clients.go index cde60d23..06787e36 100644 --- a/cloud/scope/clients.go +++ b/cloud/scope/clients.go @@ -191,7 +191,7 @@ func (c *ClientProvider) createVcnClient(region string, ociAuthConfigProvider co } vcnClient.SetRegion(region) dispatcher := vcnClient.HTTPClient - vcnClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) + vcnClient.HTTPClient = metrics.NewHttpRequestDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := dispatcher.(*http.Client); ok { @@ -222,7 +222,7 @@ func (c *ClientProvider) createNLbClient(region string, ociAuthConfigProvider co } nlbClient.SetRegion(region) dispatcher := nlbClient.HTTPClient - nlbClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) + nlbClient.HTTPClient = metrics.NewHttpRequestDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := dispatcher.(*http.Client); ok { @@ -252,7 +252,7 @@ func (c *ClientProvider) createLBClient(region string, ociAuthConfigProvider com } lbClient.SetRegion(region) dispatcher := lbClient.HTTPClient - lbClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) + lbClient.HTTPClient = metrics.NewHttpRequestDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := dispatcher.(*http.Client); ok { @@ -282,7 +282,7 @@ func (c *ClientProvider) createIdentityClient(region string, ociAuthConfigProvid } identityClt.SetRegion(region) dispatcher := identityClt.HTTPClient - identityClt.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) + identityClt.HTTPClient = metrics.NewHttpRequestDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := dispatcher.(*http.Client); ok { @@ -312,7 +312,7 @@ func (c *ClientProvider) createComputeClient(region string, ociAuthConfigProvide } computeClient.SetRegion(region) dispatcher := computeClient.HTTPClient - computeClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) + computeClient.HTTPClient = metrics.NewHttpRequestDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := dispatcher.(*http.Client); ok { @@ -342,7 +342,7 @@ func (c *ClientProvider) createComputeManagementClient(region string, ociAuthCon } computeManagementClient.SetRegion(region) dispatcher := computeManagementClient.HTTPClient - computeManagementClient.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) + computeManagementClient.HTTPClient = metrics.NewHttpRequestDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := dispatcher.(*http.Client); ok { @@ -372,7 +372,7 @@ func (c *ClientProvider) createContainerEngineClient(region string, ociAuthConfi } containerEngineClt.SetRegion(region) dispatcher := containerEngineClt.HTTPClient - containerEngineClt.HTTPClient = metrics.NewDispatcherWrapper(dispatcher, region) + containerEngineClt.HTTPClient = metrics.NewHttpRequestDispatcherWrapper(dispatcher, region) if c.certOverride != nil { if client, ok := dispatcher.(*http.Client); ok { From 5f5b06cb3497a2bc6f5a5f76da53bb1903f7a5ae Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Tue, 16 May 2023 19:55:06 +0530 Subject: [PATCH 15/16] Add support for OCI Client metrics --- cloud/metrics/http_request_dispatcher_wrapper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud/metrics/http_request_dispatcher_wrapper.go b/cloud/metrics/http_request_dispatcher_wrapper.go index 04c49e07..d7506e51 100644 --- a/cloud/metrics/http_request_dispatcher_wrapper.go +++ b/cloud/metrics/http_request_dispatcher_wrapper.go @@ -24,7 +24,7 @@ import ( "github.com/oracle/oci-go-sdk/v65/common" ) -// DispatcherWrapper is a wrapper around standard common.HTTPRequestDispatcher to handle +// HttpRequestDispatcherWrapper is a wrapper around standard common.HTTPRequestDispatcher to handle // metrics type HttpRequestDispatcherWrapper struct { dispatcher common.HTTPRequestDispatcher From 4976f784a076fff9ce70ae48ccd4f3d6586fe613 Mon Sep 17 00:00:00 2001 From: Shyam Radhakrishnan Date: Tue, 16 May 2023 20:51:32 +0530 Subject: [PATCH 16/16] Add support for OCI Client metrics --- cloud/metrics/http_request_dispatcher_wrapper.go | 4 ++-- cloud/metrics/metrics.go | 4 ++-- cloud/scope/clients.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cloud/metrics/http_request_dispatcher_wrapper.go b/cloud/metrics/http_request_dispatcher_wrapper.go index d7506e51..47dba6bc 100644 --- a/cloud/metrics/http_request_dispatcher_wrapper.go +++ b/cloud/metrics/http_request_dispatcher_wrapper.go @@ -50,9 +50,9 @@ func (wrapper HttpRequestDispatcherWrapper) Do(req *http.Request) (*http.Respons } // NewHttpRequestDispatcherWrapper creates a new instance of HttpRequestDispatcherWrapper -func NewHttpRequestDispatcherWrapper(wrapper common.HTTPRequestDispatcher, region string) HttpRequestDispatcherWrapper { +func NewHttpRequestDispatcherWrapper(dispatcher common.HTTPRequestDispatcher, region string) HttpRequestDispatcherWrapper { return HttpRequestDispatcherWrapper{ - dispatcher: wrapper, + dispatcher: dispatcher, region: region, } } diff --git a/cloud/metrics/metrics.go b/cloud/metrics/metrics.go index a5a191bc..7e153581 100644 --- a/cloud/metrics/metrics.go +++ b/cloud/metrics/metrics.go @@ -59,9 +59,9 @@ var ( }, []string{Resource, Operation, Region}) ) -// IncRequestCounter increments the request count metric for the given resource +// IncRequestCounter increments the request count metric for the given resource. +// Unknown errors from request dispatcher will have response code of 999 func IncRequestCounter(err error, resource string, operation string, region string, response *http.Response) { - // unknown errors from request dispatcher will have response code of 999 statusCode := 999 if err == nil { statusCode = response.StatusCode diff --git a/cloud/scope/clients.go b/cloud/scope/clients.go index 06787e36..230dfab0 100644 --- a/cloud/scope/clients.go +++ b/cloud/scope/clients.go @@ -19,12 +19,12 @@ package scope import ( "crypto/tls" "crypto/x509" - "github.com/oracle/cluster-api-provider-oci/cloud/metrics" "net/http" "sync" "github.com/go-logr/logr" "github.com/oracle/cluster-api-provider-oci/api/v1beta2" + "github.com/oracle/cluster-api-provider-oci/cloud/metrics" "github.com/oracle/cluster-api-provider-oci/cloud/services/base" "github.com/oracle/cluster-api-provider-oci/cloud/services/compute" "github.com/oracle/cluster-api-provider-oci/cloud/services/computemanagement"