diff --git a/hack/update-generated-stable-metrics.sh b/hack/update-generated-stable-metrics.sh new file mode 100755 index 00000000000..b71bad69bfc --- /dev/null +++ b/hack/update-generated-stable-metrics.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +# Copyright 2021 The Kubernetes Authors. +# +# 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. + +# This file is not intended to be run automatically. It is meant to be run +# immediately before exporting docs. We do not want to check these documents in +# by default. + +set -o errexit +set -o nounset +set -o pipefail + +KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. +source "${KUBE_ROOT}/test/instrumentation/stability-utils.sh" + +kube::update::stablemetrics + diff --git a/hack/verify-generated-stable-metrics.sh b/hack/verify-generated-stable-metrics.sh new file mode 100755 index 00000000000..f10fd76f134 --- /dev/null +++ b/hack/verify-generated-stable-metrics.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +# Copyright 2021 The Kubernetes Authors. +# +# 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. + +# This script runs to ensure that we do not violate metric stability +# policies. +# Usage: `hack/verify-generated-stable-metrics.sh`. + +set -o errexit +set -o nounset +set -o pipefail + +KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. +source "${KUBE_ROOT}/test/instrumentation/stability-utils.sh" + +kube::validate::stablemetrics + diff --git a/test/instrumentation/BUILD b/test/instrumentation/BUILD index 75a6b7831c2..c2226c69807 100644 --- a/test/instrumentation/BUILD +++ b/test/instrumentation/BUILD @@ -37,26 +37,6 @@ filegroup( visibility = ["//visibility:public"], ) -genrule( - name = "list_stable_metrics", - srcs = [ - "//:all-srcs", - ], - outs = ["stable-metrics-list.yaml"], - cmd = "for loc in $(locations //:all-srcs); do echo $$loc; done | ./$(locations :instrumentation) - > $@", - message = "Listing all stable metrics.", - tools = [":instrumentation"], -) - -sh_test( - name = "verify_stable_metric", - srcs = ["verify-stable-metrics.sh"], - data = [ - "testdata/stable-metrics-list.yaml", - ":list_stable_metrics", - ], -) - go_test( name = "go_default_test", srcs = ["main_test.go"], diff --git a/test/instrumentation/main.go b/test/instrumentation/main.go index 0e5739a8426..961cbac95df 100644 --- a/test/instrumentation/main.go +++ b/test/instrumentation/main.go @@ -74,12 +74,16 @@ func main() { if len(errors) != 0 { os.Exit(1) } + if len(stableMetrics) == 0 { + os.Exit(0) + } sort.Sort(byFQName(stableMetrics)) data, err := yaml.Marshal(stableMetrics) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } + fmt.Print(string(data)) } diff --git a/test/instrumentation/stability-utils.sh b/test/instrumentation/stability-utils.sh new file mode 100644 index 00000000000..4a80f629b11 --- /dev/null +++ b/test/instrumentation/stability-utils.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash + +# Copyright 2021 The Kubernetes Authors. +# +# 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. + +set -o errexit +set -o nounset +set -o pipefail + +KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/../.. +source "${KUBE_ROOT}/hack/lib/init.sh" +source "${KUBE_ROOT}/hack/lib/util.sh" + +stability_check_setup() { + kube::golang::verify_go_version + kube::util::ensure-temp-dir + cd "${KUBE_ROOT}" + export KUBE_EXTRA_GOPATH=$KUBE_TEMP + kube::golang::setup_env + pushd "${KUBE_EXTRA_GOPATH}" >/dev/null + GO111MODULE=on go get "gopkg.in/yaml.v2" + popd >/dev/null +} + +find_files_to_check() { + find . -not \( \ + \( \ + -wholename './output' \ + -o -wholename './_output' \ + -o -wholename './_gopath' \ + -o -wholename './release' \ + -o -wholename './target' \ + -o -wholename '*/third_party/*' \ + -o -wholename '*/vendor/*' \ + -o -wholename '*/hack/*' \ + -o -wholename '*_test.go' \ + \) -prune \ + \) \ + \( -wholename '**/*.go' \ + \) +} + +red=$(tput setaf 1) +green=$(tput setaf 2) +reset=$(tput sgr0) + +kube::validate::stablemetrics() { + stability_check_setup + temp_file=$(mktemp) + doValidate=$(find_files_to_check | grep -E ".*.go" | grep -v ".*_test.go" | sort | xargs -L 200 go run "test/instrumentation/main.go" "test/instrumentation/decode_metric.go" "test/instrumentation/find_stable_metric.go" "test/instrumentation/error.go" "test/instrumentation/metric.go" -- 1>"${temp_file}") + + if $doValidate; then + echo -e "${green}Diffing test/instrumentation/testdata/stable-metrics-list.yaml\n${reset}" + if diff -u "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" "$temp_file"; then + echo -e "${green}\nPASS metrics stability verification ${reset}" + return 0 + fi + fi + + echo "${red}!!! Metrics Stability static analysis has failed!${reset}" >&2 + echo "${red}!!! Please run ./hack/update-generated-stable-metrics.sh to update the golden list.${reset}" >&2 + exit 1 +} + +kube::update::stablemetrics() { + stability_check_setup + temp_file=$(mktemp) + doCheckStability=$(find_files_to_check | grep -E ".*.go" | grep -v ".*_test.go" | sort | xargs -L 200 go run "test/instrumentation/main.go" "test/instrumentation/decode_metric.go" "test/instrumentation/find_stable_metric.go" "test/instrumentation/error.go" "test/instrumentation/metric.go" -- 1>"${temp_file}") + + if ! $doCheckStability; then + echo "${red}!!! updating golden list of metrics has failed! ${reset}" >&2 + exit 1 + fi + mv -f "$temp_file" "${KUBE_ROOT}/test/instrumentation/testdata/stable-metrics-list.yaml" + echo "${green}Updated golden list of stable metrics.${reset}" +} + diff --git a/test/instrumentation/testdata/stable-metrics-list.yaml b/test/instrumentation/testdata/stable-metrics-list.yaml index fe51488c706..e69de29bb2d 100644 --- a/test/instrumentation/testdata/stable-metrics-list.yaml +++ b/test/instrumentation/testdata/stable-metrics-list.yaml @@ -1 +0,0 @@ -[] diff --git a/test/instrumentation/update-stable-metrics.sh b/test/instrumentation/update-stable-metrics.sh deleted file mode 100755 index 4cd2c7e2226..00000000000 --- a/test/instrumentation/update-stable-metrics.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2019 The Kubernetes Authors. -# -# 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. - - -set -o errexit -set -o nounset -set -o pipefail - -KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/../.. -BAZEL_OUT_DIR="$KUBE_ROOT/bazel-bin" -BAZEL_GEN_DIR="$KUBE_ROOT/bazel-genfiles" -METRICS_LIST_PATH="test/instrumentation/stable-metrics-list.yaml" - -bazel build //test/instrumentation:list_stable_metrics -if [ -d "$BAZEL_OUT_DIR" ]; then - cp "$BAZEL_OUT_DIR/$METRICS_LIST_PATH" "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" -else - # Handle bazel < 0.25 - # https://github.com/bazelbuild/bazel/issues/6761 - echo "$BAZEL_OUT_DIR not found trying $BAZEL_GEN_DIR" - cp "$BAZEL_GEN_DIR/$METRICS_LIST_PATH" "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" -fi diff --git a/test/instrumentation/verify-stable-metrics.sh b/test/instrumentation/verify-stable-metrics.sh deleted file mode 100755 index d0e4cbc26d8..00000000000 --- a/test/instrumentation/verify-stable-metrics.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2019 The Kubernetes Authors. -# -# 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. - - -set -o errexit -set -o pipefail - -KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/../.. -BAZEL_OUT_DIR="$KUBE_ROOT/bazel-bin" -BAZEL_GEN_DIR="$KUBE_ROOT/bazel-genfiles" -METRICS_LIST_PATH="test/instrumentation/stable-metrics-list.yaml" - -# detect if run from bazel -if [ -z "${TEST_BINARY}" ]; then - bazel build //test/instrumentation:list_stable_metrics - - if [ -d "$BAZEL_OUT_DIR" ]; then - OUTPUT_FILE="$BAZEL_OUT_DIR/$METRICS_LIST_PATH" - else - # Handle bazel < 0.25 - # https://github.com/bazelbuild/bazel/issues/6761 - OUTPUT_FILE="$BAZEL_GEN_DIR/$METRICS_LIST_PATH" - fi -else - OUTPUT_FILE="$KUBE_ROOT/$METRICS_LIST_PATH" -fi - -if diff -u "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" "$OUTPUT_FILE"; then - echo PASS - exit 0 -fi -echo 'Diffs in stable metrics detected, please run "test/instrumentation/update-stable-metrics.sh"' -exit 1