From fe51482d543194a28bd215a6b5599170ad4555ac Mon Sep 17 00:00:00 2001 From: Aphral Griffin Date: Thu, 26 Sep 2024 16:28:52 +0100 Subject: [PATCH 1/3] generate pgo profile & cat logs for load tests --- Makefile | 9 +++++---- default.pgo | Bin 31335 -> 66626 bytes scripts/testing/load/Dockerfile | 7 ++++--- scripts/testing/load/entrypoint.sh | 11 +++++++++++ 4 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 scripts/testing/load/entrypoint.sh diff --git a/Makefile b/Makefile index 091981fda5..e62b15598f 100644 --- a/Makefile +++ b/Makefile @@ -236,7 +236,7 @@ local-rpm-package: ## Create local rpm package @CGO_ENABLED=0 GOARCH=$(OSARCH) GOOS=linux $(GOBUILD) -o $(BUILD_DIR)/$(BINARY_NAME) -pgo=default.pgo -ldflags=$(LDFLAGS) $(PROJECT_DIR)/$(PROJECT_FILE) ARCH=$(OSARCH) VERSION=$(shell echo $(VERSION) | tr -d 'v') $(GORUN) $(NFPM) pkg --config ./scripts/packages/.local-nfpm.yaml --packager rpm --target $(RPM_PACKAGE); -generate-pgo-profile: build-mock-management-plane-grpc +generate-pgo-profile: build-mock-management-plane-grpc load-test-image run-load-test-image mv default.pgo profile.pprof TEST_ENV="Container" CONTAINER_OS_TYPE=$(CONTAINER_OS_TYPE) BUILD_TARGET="install-agent-local" \ PACKAGES_REPO=$(OSS_PACKAGES_REPO) PACKAGE_NAME=$(PACKAGE_NAME) BASE_IMAGE=$(BASE_IMAGE) \ @@ -244,8 +244,8 @@ generate-pgo-profile: build-mock-management-plane-grpc IMAGE_PATH=$(IMAGE_PATH) TAG=${IMAGE_TAG} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} \ $(GOTEST) -v ./test/integration -cpuprofile integration_cpu.pprof @CGO_ENABLED=0 $(GOTEST) -count 10 -timeout 5m -bench=. -benchmem -run=^# ./internal/watcher/instance -cpuprofile perf_watcher_cpu.pprof - @$(GOTOOL) pprof -proto perf_watcher_cpu.pprof integration_cpu.pprof > default.pgo - rm perf_watcher_cpu.pprof integration_cpu.pprof integration.test profile.pprof + @$(GOTOOL) pprof -proto perf_watcher_cpu.pprof integration_cpu.pprof ./build/load_cpu.pprof cpu.out > default.pgo + rm perf_watcher_cpu.pprof integration_cpu.pprof integration.test profile.pprof cpu.out ./build/load_cpu.pprof # run under sudo locally load-test-image: ## Build performance load testing image @@ -255,7 +255,8 @@ load-test-image: ## Build performance load testing image --secret id=nginx-crt,src=$(CERTS_DIR)/nginx-repo.crt \ --secret id=nginx-key,src=$(CERTS_DIR)/nginx-repo.key \ --build-arg OSARCH=$(OSARCH) \ - --build-arg GO_VERSION=$(GO_VERSION) + --build-arg GO_VERSION=$(GO_VERSION) \ + --build-arg ENTRY_POINT=./scripts/testing/load/entrypoint.sh run-load-test-image: ## Run performance load testing image $(CONTAINER_BUILDENV) $(CONTAINER_CLITOOL) run --rm -v $(PWD)/$(BUILD_DIR)/:/agent/$(BUILD_DIR)/ $(IMAGE_TAG)_load_test diff --git a/default.pgo b/default.pgo index 68be73d34c931b20eaca26741d62af5939128f34..d1e868af18f60ccc4b3072de37e785f101f28cf6 100644 GIT binary patch literal 66626 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 z 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 literal 31335 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 diff --git a/scripts/testing/load/Dockerfile b/scripts/testing/load/Dockerfile index af065a08fe..32b5ab39b3 100644 --- a/scripts/testing/load/Dockerfile +++ b/scripts/testing/load/Dockerfile @@ -3,9 +3,11 @@ LABEL maintainer="NGINX Docker Maintainers " # https://askubuntu.com/questions/909277/avoiding-user-interaction-with-tzdata-when-installing-certbot-in-a-docker-contai ARG DEBIAN_FRONTEND=noninteractive +ARG ENTRY_POINT WORKDIR /agent COPY . /agent +COPY $ENTRY_POINT /agent/entrypoint.sh RUN --mount=type=secret,id=nginx-crt,dst=nginx-repo.crt \ --mount=type=secret,id=nginx-key,dst=nginx-repo.key \ @@ -91,9 +93,8 @@ WORKDIR /agent/ RUN make build RUN chmod -R +x ./build +RUN chmod +x /agent/entrypoint.sh WORKDIR /agent/test/load -RUN go test -v -timeout 30s ./... - -CMD ["sh", "-c", "cat benchmarks.json"] +ENTRYPOINT ["/agent/entrypoint.sh"] diff --git a/scripts/testing/load/entrypoint.sh b/scripts/testing/load/entrypoint.sh new file mode 100644 index 0000000000..49995263c4 --- /dev/null +++ b/scripts/testing/load/entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# run load tests +go test -v -timeout 30s -cpuprofile load_cpu.pprof + +# copy profile to build for use in generate-pgo-profile +cp load_cpu.pprof /agent/build/load_cpu.pprof + +# cat logs for debugging +cat /var/log/nginx-agent/agent.log +cat /var/log/nginx-agent/opentelemetry-collector-agent.log From 5afc05da437a14f830e03b9d2f68e5130a321a29 Mon Sep 17 00:00:00 2001 From: Aphral Griffin Date: Thu, 26 Sep 2024 16:45:18 +0100 Subject: [PATCH 2/3] check pipeline --- .github/workflows/ci.yml | 52 +++++++++++++++--------------- scripts/testing/load/entrypoint.sh | 4 ++- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2f1b449cb5..47d15bcfb8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -307,30 +307,30 @@ jobs: - name: Run Load Tests run: | - results=$(docker run --rm nginx-agent-load-test:1.0.0) - echo "$results" > benchmarks.json - echo "$results" + docker run --rm nginx-agent-load-test:1.0.0 + ls + ls build - - name: Upload Load Test Results - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: load-test-results - path: benchmarks.json - if-no-files-found: error - - - name: Store benchmark result - uses: benchmark-action/github-action-benchmark@4de1bed97a47495fc4c5404952da0499e31f5c29 # v1.20.3 - with: - name: Compare Benchmark Results - tool: 'customSmallerIsBetter' - output-file-path: benchmarks.json - benchmark-data-dir-path: "" - # Set auto-push to false since GitHub API token is not given - auto-push: false - alert-threshold: '125%' - gh-pages-branch: "benchmark-results" - fail-on-alert: true - - - name: Push load test result - if: ${{ success() && github.ref_name == 'v3'}} - run: git push 'https://github-actions:${{ secrets.GITHUB_TOKEN }}@github.com/nginx/agent.git' benchmark-results:benchmark-results +# - name: Upload Load Test Results +# uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 +# with: +# name: load-test-results +# path: benchmarks.json +# if-no-files-found: error +# +# - name: Store benchmark result +# uses: benchmark-action/github-action-benchmark@4de1bed97a47495fc4c5404952da0499e31f5c29 # v1.20.3 +# with: +# name: Compare Benchmark Results +# tool: 'customSmallerIsBetter' +# output-file-path: benchmarks.json +# benchmark-data-dir-path: "" +# # Set auto-push to false since GitHub API token is not given +# auto-push: false +# alert-threshold: '125%' +# gh-pages-branch: "benchmark-results" +# fail-on-alert: true +# +# - name: Push load test result +# if: ${{ success() && github.ref_name == 'v3'}} +# run: git push 'https://github-actions:${{ secrets.GITHUB_TOKEN }}@github.com/nginx/agent.git' benchmark-results:benchmark-results diff --git a/scripts/testing/load/entrypoint.sh b/scripts/testing/load/entrypoint.sh index 49995263c4..e85a88893a 100644 --- a/scripts/testing/load/entrypoint.sh +++ b/scripts/testing/load/entrypoint.sh @@ -5,7 +5,9 @@ go test -v -timeout 30s -cpuprofile load_cpu.pprof # copy profile to build for use in generate-pgo-profile cp load_cpu.pprof /agent/build/load_cpu.pprof +cp benchmarks.json /agent/build/benchmarks.json -# cat logs for debugging +# cat logs & results for debugging cat /var/log/nginx-agent/agent.log cat /var/log/nginx-agent/opentelemetry-collector-agent.log +cat /agent/build/benchmarks.json From 6283e9689cfbe2bb9c61a93136ad93fb7dabb77b Mon Sep 17 00:00:00 2001 From: Aphral Griffin Date: Thu, 26 Sep 2024 16:47:36 +0100 Subject: [PATCH 3/3] generate --- .../generated_component_test.go | 12 +-- .../internal/metadata/generated_metrics.go | 54 ++++++++----- .../metadata/generated_metrics_test.go | 18 ++--- .../generated_component_test.go | 12 +-- .../internal/metadata/generated_metrics.go | 54 ++++++++----- .../metadata/generated_metrics_test.go | 76 +++++++++---------- 6 files changed, 129 insertions(+), 97 deletions(-) diff --git a/internal/collector/nginxossreceiver/generated_component_test.go b/internal/collector/nginxossreceiver/generated_component_test.go index 3007dc92b4..60de562050 100644 --- a/internal/collector/nginxossreceiver/generated_component_test.go +++ b/internal/collector/nginxossreceiver/generated_component_test.go @@ -46,21 +46,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), receivertest.NewNopSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), receivertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - firstRcvr, err := test.createFn(context.Background(), receivertest.NewNopSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstRcvr, err := tt.createFn(context.Background(), receivertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() require.NoError(t, err) require.NoError(t, firstRcvr.Start(context.Background(), host)) require.NoError(t, firstRcvr.Shutdown(context.Background())) - secondRcvr, err := test.createFn(context.Background(), receivertest.NewNopSettings(), cfg) + secondRcvr, err := tt.createFn(context.Background(), receivertest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondRcvr.Start(context.Background(), host)) require.NoError(t, secondRcvr.Shutdown(context.Background())) diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go index e74642bc94..c560fe1bc8 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go @@ -313,17 +313,25 @@ type MetricsBuilder struct { metricNginxHTTPResponseStatus metricNginxHTTPResponseStatus } -// metricBuilderOption applies changes to default metrics builder. -type metricBuilderOption func(*MetricsBuilder) +// MetricBuilderOption applies changes to default metrics builder. +type MetricBuilderOption interface { + apply(*MetricsBuilder) +} + +type metricBuilderOptionFunc func(mb *MetricsBuilder) + +func (mbof metricBuilderOptionFunc) apply(mb *MetricsBuilder) { + mbof(mb) +} // WithStartTime sets startTime on the metrics builder. -func WithStartTime(startTime pcommon.Timestamp) metricBuilderOption { - return func(mb *MetricsBuilder) { +func WithStartTime(startTime pcommon.Timestamp) MetricBuilderOption { + return metricBuilderOptionFunc(func(mb *MetricsBuilder) { mb.startTime = startTime - } + }) } -func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, options ...metricBuilderOption) *MetricsBuilder { +func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, options ...MetricBuilderOption) *MetricsBuilder { mb := &MetricsBuilder{ config: mbc, startTime: pcommon.NewTimestampFromTime(time.Now()), @@ -336,7 +344,7 @@ func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, opt } for _, op := range options { - op(mb) + op.apply(mb) } return mb } @@ -349,20 +357,28 @@ func (mb *MetricsBuilder) updateCapacity(rm pmetric.ResourceMetrics) { } // ResourceMetricsOption applies changes to provided resource metrics. -type ResourceMetricsOption func(pmetric.ResourceMetrics) +type ResourceMetricsOption interface { + apply(pmetric.ResourceMetrics) +} + +type resourceMetricsOptionFunc func(pmetric.ResourceMetrics) + +func (rmof resourceMetricsOptionFunc) apply(rm pmetric.ResourceMetrics) { + rmof(rm) +} // WithResource sets the provided resource on the emitted ResourceMetrics. // It's recommended to use ResourceBuilder to create the resource. func WithResource(res pcommon.Resource) ResourceMetricsOption { - return func(rm pmetric.ResourceMetrics) { + return resourceMetricsOptionFunc(func(rm pmetric.ResourceMetrics) { res.CopyTo(rm.Resource()) - } + }) } // WithStartTimeOverride overrides start time for all the resource metrics data points. // This option should be only used if different start time has to be set on metrics coming from different resources. func WithStartTimeOverride(start pcommon.Timestamp) ResourceMetricsOption { - return func(rm pmetric.ResourceMetrics) { + return resourceMetricsOptionFunc(func(rm pmetric.ResourceMetrics) { var dps pmetric.NumberDataPointSlice metrics := rm.ScopeMetrics().At(0).Metrics() for i := 0; i < metrics.Len(); i++ { @@ -376,7 +392,7 @@ func WithStartTimeOverride(start pcommon.Timestamp) ResourceMetricsOption { dps.At(j).SetStartTimestamp(start) } } - } + }) } // EmitForResource saves all the generated metrics under a new resource and updates the internal state to be ready for @@ -384,7 +400,7 @@ func WithStartTimeOverride(start pcommon.Timestamp) ResourceMetricsOption { // needs to emit metrics from several resources. Otherwise calling this function is not required, // just `Emit` function can be called instead. // Resource attributes should be provided as ResourceMetricsOption arguments. -func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { +func (mb *MetricsBuilder) EmitForResource(options ...ResourceMetricsOption) { rm := pmetric.NewResourceMetrics() ils := rm.ScopeMetrics().AppendEmpty() ils.Scope().SetName("otelcol/nginxreceiver") @@ -395,8 +411,8 @@ func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { mb.metricNginxHTTPRequests.emit(ils.Metrics()) mb.metricNginxHTTPResponseStatus.emit(ils.Metrics()) - for _, op := range rmo { - op(rm) + for _, op := range options { + op.apply(rm) } if ils.Metrics().Len() > 0 { @@ -408,8 +424,8 @@ func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { // Emit returns all the metrics accumulated by the metrics builder and updates the internal state to be ready for // recording another set of metrics. This function will be responsible for applying all the transformations required to // produce metric representation defined in metadata and user config, e.g. delta or cumulative. -func (mb *MetricsBuilder) Emit(rmo ...ResourceMetricsOption) pmetric.Metrics { - mb.EmitForResource(rmo...) +func (mb *MetricsBuilder) Emit(options ...ResourceMetricsOption) pmetric.Metrics { + mb.EmitForResource(options...) metrics := mb.metricsBuffer mb.metricsBuffer = pmetric.NewMetrics() return metrics @@ -437,9 +453,9 @@ func (mb *MetricsBuilder) RecordNginxHTTPResponseStatusDataPoint(ts pcommon.Time // Reset resets metrics builder to its initial state. It should be used when external metrics source is restarted, // and metrics builder should update its startTime and reset it's internal state accordingly. -func (mb *MetricsBuilder) Reset(options ...metricBuilderOption) { +func (mb *MetricsBuilder) Reset(options ...MetricBuilderOption) { mb.startTime = pcommon.NewTimestampFromTime(time.Now()) for _, op := range options { - op(mb) + op.apply(mb) } } diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go index 261655b70a..2581a33ef3 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go @@ -43,14 +43,14 @@ func TestMetricsBuilder(t *testing.T) { expectEmpty: true, }, } - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { start := pcommon.Timestamp(1_000_000_000) ts := pcommon.Timestamp(1_000_001_000) observedZapCore, observedLogs := observer.New(zap.WarnLevel) settings := receivertest.NewNopSettings() settings.Logger = zap.New(observedZapCore) - mb := NewMetricsBuilder(loadMetricsBuilderConfig(t, test.name), settings, WithStartTime(start)) + mb := NewMetricsBuilder(loadMetricsBuilderConfig(t, tt.name), settings, WithStartTime(start)) expectedWarnings := 0 @@ -78,7 +78,7 @@ func TestMetricsBuilder(t *testing.T) { res := pcommon.NewResource() metrics := mb.Emit(WithResource(res)) - if test.expectEmpty { + if tt.expectEmpty { assert.Equal(t, 0, metrics.ResourceMetrics().Len()) return } @@ -88,10 +88,10 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, res, rm.Resource()) assert.Equal(t, 1, rm.ScopeMetrics().Len()) ms := rm.ScopeMetrics().At(0).Metrics() - if test.metricsSet == testDataSetDefault { + if tt.metricsSet == testDataSetDefault { assert.Equal(t, defaultMetricsCount, ms.Len()) } - if test.metricsSet == testDataSetAll { + if tt.metricsSet == testDataSetAll { assert.Equal(t, allMetricsCount, ms.Len()) } validatedMetrics := make(map[string]bool) @@ -104,7 +104,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of connections.", ms.At(i).Description()) assert.Equal(t, "connections", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -136,7 +136,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of client requests received from clients.", ms.At(i).Description()) assert.Equal(t, "requests", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -150,7 +150,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The number of responses, grouped by status code range.", ms.At(i).Description()) assert.Equal(t, "responses", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) diff --git a/internal/collector/nginxplusreceiver/generated_component_test.go b/internal/collector/nginxplusreceiver/generated_component_test.go index 170385ba71..9fbb9944ca 100644 --- a/internal/collector/nginxplusreceiver/generated_component_test.go +++ b/internal/collector/nginxplusreceiver/generated_component_test.go @@ -46,21 +46,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), receivertest.NewNopSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), receivertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - firstRcvr, err := test.createFn(context.Background(), receivertest.NewNopSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstRcvr, err := tt.createFn(context.Background(), receivertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() require.NoError(t, err) require.NoError(t, firstRcvr.Start(context.Background(), host)) require.NoError(t, firstRcvr.Shutdown(context.Background())) - secondRcvr, err := test.createFn(context.Background(), receivertest.NewNopSettings(), cfg) + secondRcvr, err := tt.createFn(context.Background(), receivertest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondRcvr.Start(context.Background(), host)) require.NoError(t, secondRcvr.Shutdown(context.Background())) diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go index 866fb5a735..15dbba1752 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go @@ -3620,17 +3620,25 @@ type MetricsBuilder struct { metricNginxStreamUpstreamZombieCount metricNginxStreamUpstreamZombieCount } -// metricBuilderOption applies changes to default metrics builder. -type metricBuilderOption func(*MetricsBuilder) +// MetricBuilderOption applies changes to default metrics builder. +type MetricBuilderOption interface { + apply(*MetricsBuilder) +} + +type metricBuilderOptionFunc func(mb *MetricsBuilder) + +func (mbof metricBuilderOptionFunc) apply(mb *MetricsBuilder) { + mbof(mb) +} // WithStartTime sets startTime on the metrics builder. -func WithStartTime(startTime pcommon.Timestamp) metricBuilderOption { - return func(mb *MetricsBuilder) { +func WithStartTime(startTime pcommon.Timestamp) MetricBuilderOption { + return metricBuilderOptionFunc(func(mb *MetricsBuilder) { mb.startTime = startTime - } + }) } -func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, options ...metricBuilderOption) *MetricsBuilder { +func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, options ...MetricBuilderOption) *MetricsBuilder { mb := &MetricsBuilder{ config: mbc, startTime: pcommon.NewTimestampFromTime(time.Now()), @@ -3697,7 +3705,7 @@ func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, opt } for _, op := range options { - op(mb) + op.apply(mb) } return mb } @@ -3710,20 +3718,28 @@ func (mb *MetricsBuilder) updateCapacity(rm pmetric.ResourceMetrics) { } // ResourceMetricsOption applies changes to provided resource metrics. -type ResourceMetricsOption func(pmetric.ResourceMetrics) +type ResourceMetricsOption interface { + apply(pmetric.ResourceMetrics) +} + +type resourceMetricsOptionFunc func(pmetric.ResourceMetrics) + +func (rmof resourceMetricsOptionFunc) apply(rm pmetric.ResourceMetrics) { + rmof(rm) +} // WithResource sets the provided resource on the emitted ResourceMetrics. // It's recommended to use ResourceBuilder to create the resource. func WithResource(res pcommon.Resource) ResourceMetricsOption { - return func(rm pmetric.ResourceMetrics) { + return resourceMetricsOptionFunc(func(rm pmetric.ResourceMetrics) { res.CopyTo(rm.Resource()) - } + }) } // WithStartTimeOverride overrides start time for all the resource metrics data points. // This option should be only used if different start time has to be set on metrics coming from different resources. func WithStartTimeOverride(start pcommon.Timestamp) ResourceMetricsOption { - return func(rm pmetric.ResourceMetrics) { + return resourceMetricsOptionFunc(func(rm pmetric.ResourceMetrics) { var dps pmetric.NumberDataPointSlice metrics := rm.ScopeMetrics().At(0).Metrics() for i := 0; i < metrics.Len(); i++ { @@ -3737,7 +3753,7 @@ func WithStartTimeOverride(start pcommon.Timestamp) ResourceMetricsOption { dps.At(j).SetStartTimestamp(start) } } - } + }) } // EmitForResource saves all the generated metrics under a new resource and updates the internal state to be ready for @@ -3745,7 +3761,7 @@ func WithStartTimeOverride(start pcommon.Timestamp) ResourceMetricsOption { // needs to emit metrics from several resources. Otherwise calling this function is not required, // just `Emit` function can be called instead. // Resource attributes should be provided as ResourceMetricsOption arguments. -func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { +func (mb *MetricsBuilder) EmitForResource(options ...ResourceMetricsOption) { rm := pmetric.NewResourceMetrics() ils := rm.ScopeMetrics().AppendEmpty() ils.Scope().SetName("otelcol/nginxplusreceiver") @@ -3810,8 +3826,8 @@ func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { mb.metricNginxStreamUpstreamPeerUnavailable.emit(ils.Metrics()) mb.metricNginxStreamUpstreamZombieCount.emit(ils.Metrics()) - for _, op := range rmo { - op(rm) + for _, op := range options { + op.apply(rm) } if ils.Metrics().Len() > 0 { @@ -3823,8 +3839,8 @@ func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { // Emit returns all the metrics accumulated by the metrics builder and updates the internal state to be ready for // recording another set of metrics. This function will be responsible for applying all the transformations required to // produce metric representation defined in metadata and user config, e.g. delta or cumulative. -func (mb *MetricsBuilder) Emit(rmo ...ResourceMetricsOption) pmetric.Metrics { - mb.EmitForResource(rmo...) +func (mb *MetricsBuilder) Emit(options ...ResourceMetricsOption) pmetric.Metrics { + mb.EmitForResource(options...) metrics := mb.metricsBuffer mb.metricsBuffer = pmetric.NewMetrics() return metrics @@ -4122,9 +4138,9 @@ func (mb *MetricsBuilder) RecordNginxStreamUpstreamZombieCountDataPoint(ts pcomm // Reset resets metrics builder to its initial state. It should be used when external metrics source is restarted, // and metrics builder should update its startTime and reset it's internal state accordingly. -func (mb *MetricsBuilder) Reset(options ...metricBuilderOption) { +func (mb *MetricsBuilder) Reset(options ...MetricBuilderOption) { mb.startTime = pcommon.NewTimestampFromTime(time.Now()) for _, op := range options { - op(mb) + op.apply(mb) } } diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go index 8e8f64cbb9..6d048f6442 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go @@ -43,14 +43,14 @@ func TestMetricsBuilder(t *testing.T) { expectEmpty: true, }, } - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { start := pcommon.Timestamp(1_000_000_000) ts := pcommon.Timestamp(1_000_001_000) observedZapCore, observedLogs := observer.New(zap.WarnLevel) settings := receivertest.NewNopSettings() settings.Logger = zap.New(observedZapCore) - mb := NewMetricsBuilder(loadMetricsBuilderConfig(t, test.name), settings, WithStartTime(start)) + mb := NewMetricsBuilder(loadMetricsBuilderConfig(t, tt.name), settings, WithStartTime(start)) expectedWarnings := 0 @@ -294,7 +294,7 @@ func TestMetricsBuilder(t *testing.T) { res := pcommon.NewResource() metrics := mb.Emit(WithResource(res)) - if test.expectEmpty { + if tt.expectEmpty { assert.Equal(t, 0, metrics.ResourceMetrics().Len()) return } @@ -304,10 +304,10 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, res, rm.Resource()) assert.Equal(t, 1, rm.ScopeMetrics().Len()) ms := rm.ScopeMetrics().At(0).Metrics() - if test.metricsSet == testDataSetDefault { + if tt.metricsSet == testDataSetDefault { assert.Equal(t, defaultMetricsCount, ms.Len()) } - if test.metricsSet == testDataSetAll { + if tt.metricsSet == testDataSetAll { assert.Equal(t, allMetricsCount, ms.Len()) } validatedMetrics := make(map[string]bool) @@ -320,7 +320,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of bytes read from the cache or proxied server.", ms.At(i).Description()) assert.Equal(t, "bytes", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -370,7 +370,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of responses read from the cache or proxied server.", ms.At(i).Description()) assert.Equal(t, "responses", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -390,7 +390,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of NGINX config reloads.", ms.At(i).Description()) assert.Equal(t, "reloads", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -404,7 +404,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of connections.", ms.At(i).Description()) assert.Equal(t, "connections", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -436,7 +436,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of connections to an endpoint with a limit_conn directive.", ms.At(i).Description()) assert.Equal(t, "connections", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -456,7 +456,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of requests to an endpoint with a limit_req directive.", ms.At(i).Description()) assert.Equal(t, "requests", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -476,7 +476,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of HTTP byte IO.", ms.At(i).Description()) assert.Equal(t, "bytes", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -499,7 +499,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of requests completed without sending a response.", ms.At(i).Description()) assert.Equal(t, "requests", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -537,7 +537,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of client requests received from clients.", ms.At(i).Description()) assert.Equal(t, "requests", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -569,7 +569,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The number of responses, grouped by status code range.", ms.At(i).Description()) assert.Equal(t, "responses", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -592,7 +592,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of client requests received from clients.", ms.At(i).Description()) assert.Equal(t, "responses", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -630,7 +630,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of byte IO per HTTP upstream peer.", ms.At(i).Description()) assert.Equal(t, "bytes", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -752,7 +752,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of health check requests made to a HTTP upstream peer.", ms.At(i).Description()) assert.Equal(t, "requests", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -781,7 +781,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of client requests forwarded to the HTTP upstream peer.", ms.At(i).Description()) assert.Equal(t, "requests", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -831,7 +831,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of responses obtained from the HTTP upstream peer grouped by status range.", ms.At(i).Description()) assert.Equal(t, "responses", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -887,7 +887,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "Number of times the server became unavailable for client requests (“unavail”).", ms.At(i).Description()) assert.Equal(t, "requests", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -931,7 +931,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of requests rejected due to the queue overflow.", ms.At(i).Description()) assert.Equal(t, "responses", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1036,7 +1036,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, start, dp.StartTimestamp()) assert.Equal(t, ts, dp.Timestamp()) assert.Equal(t, pmetric.NumberDataPointValueTypeDouble, dp.ValueType()) - assert.Equal(t, float64(1), dp.DoubleValue()) + assert.InDelta(t, float64(1), dp.DoubleValue(), 0.01) attrVal, ok := dp.Attributes().Get("nginx.zone.name") assert.True(t, ok) assert.EqualValues(t, "nginx.zone.name-val", attrVal.Str()) @@ -1047,7 +1047,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The number of attempts to allocate memory of specified size.", ms.At(i).Description()) assert.Equal(t, "allocations", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1106,7 +1106,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of SSL certificate verification failures.", ms.At(i).Description()) assert.Equal(t, "certificates", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1123,7 +1123,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of SSL handshakes.", ms.At(i).Description()) assert.Equal(t, "handshakes", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1143,7 +1143,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of Stream byte IO.", ms.At(i).Description()) assert.Equal(t, "bytes", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1163,7 +1163,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of connections accepted from clients.", ms.At(i).Description()) assert.Equal(t, "connections", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1180,7 +1180,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "Total number of connections completed without creating a session.", ms.At(i).Description()) assert.Equal(t, "connections", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1212,7 +1212,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of completed sessions.", ms.At(i).Description()) assert.Equal(t, "sessions", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1232,7 +1232,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of Stream Upstream Peer byte IO.", ms.At(i).Description()) assert.Equal(t, "bytes", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1309,7 +1309,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of client connections forwarded to this stream upstream peer.", ms.At(i).Description()) assert.Equal(t, "connections", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1335,7 +1335,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of stream upstream peers grouped by state.", ms.At(i).Description()) assert.Equal(t, "peers", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1358,7 +1358,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of unsuccessful attempts to communicate with the stream upstream peer.", ms.At(i).Description()) assert.Equal(t, "peers", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1381,7 +1381,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "The total number of health check requests made to the stream upstream peer.", ms.At(i).Description()) assert.Equal(t, "requests", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1434,7 +1434,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "Current state of upstream peers in deployment. If any of the upstream peers in the deployment match the given state then the value will be 1. If no upstream peer is a match then the value will be 0.", ms.At(i).Description()) assert.Equal(t, "deployments", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp()) @@ -1487,7 +1487,7 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "How many times the server became unavailable for client connections (state “unavail”) due to the number of unsuccessful attempts reaching the max_fails threshold.", ms.At(i).Description()) assert.Equal(t, "requests", ms.At(i).Unit()) - assert.Equal(t, true, ms.At(i).Sum().IsMonotonic()) + assert.True(t, ms.At(i).Sum().IsMonotonic()) assert.Equal(t, pmetric.AggregationTemporalityCumulative, ms.At(i).Sum().AggregationTemporality()) dp := ms.At(i).Sum().DataPoints().At(0) assert.Equal(t, start, dp.StartTimestamp())