diff --git a/.buildkite/hooks/pre-command b/.buildkite/hooks/pre-command index acb73845547..2b6f463b662 100755 --- a/.buildkite/hooks/pre-command +++ b/.buildkite/hooks/pre-command @@ -70,7 +70,7 @@ if command -v docker &>/dev/null; then DOCKER_USERNAME_SECRET=$(retry 5 vault kv get -field username "${DOCKER_REGISTRY_SECRET_PATH}") DOCKER_PASSWORD_SECRET=$(retry 5 vault kv get -field password "${DOCKER_REGISTRY_SECRET_PATH}") DOCKER_REGISTRY_SECRET=$(retry 5 vault kv get -field registry "${DOCKER_REGISTRY_SECRET_PATH}") - docker login -u "${DOCKER_USERNAME_SECRET}" -p "${DOCKER_PASSWORD_SECRET}" "${DOCKER_REGISTRY_SECRET}" + retry 4 docker login -u "${DOCKER_USERNAME_SECRET}" -p "${DOCKER_PASSWORD_SECRET}" "${DOCKER_REGISTRY_SECRET}" unset DOCKER_USERNAME_SECRET DOCKER_PASSWORD_SECRET export DOCKER_REGISTRY_SECRET retry 4 docker pull --quiet docker.elastic.co/infra/release-manager:latest @@ -80,7 +80,7 @@ if command -v docker &>/dev/null; then DOCKER_USERNAME_SECRET=$(retry 5 vault kv get -field username "${DOCKER_REGISTRY_SECRET_PATH}") DOCKER_PASSWORD_SECRET=$(retry 5 vault kv get -field password "${DOCKER_REGISTRY_SECRET_PATH}") DOCKERHUB_REGISTRY_SECRET=$(retry 5 vault kv get -field registry "${DOCKER_REGISTRY_SECRET_PATH}") - docker login -u "${DOCKER_USERNAME_SECRET}" -p "${DOCKER_PASSWORD_SECRET}" "${DOCKERHUB_REGISTRY_SECRET}" + retry 4 docker login -u "${DOCKER_USERNAME_SECRET}" -p "${DOCKER_PASSWORD_SECRET}" "${DOCKERHUB_REGISTRY_SECRET}" unset DOCKER_USERNAME_SECRET DOCKER_PASSWORD_SECRET fi diff --git a/.ci/update-beats.yml b/.ci/update-beats.yml index fb0fadf2c26..85c5882bfef 100644 --- a/.ci/update-beats.yml +++ b/.ci/update-beats.yml @@ -44,15 +44,14 @@ sources: captureindex: 1 conditions: - is: + is-already-updated: name: Is version 'github.com/elastic/beats@{{ source "beats" }}' not updated in 'go.mod'? - kind: file + kind: shell disablesourceinput: true scmid: default spec: - file: go.mod - matchpattern: 'github\.com/elastic/beats.*-{{ source "beats" }}' - failwhen: true + command: grep {{ source "beats" }} go.mod && exit 1 || exit 0 + failwhen: false targets: beats: @@ -64,5 +63,4 @@ targets: command: .ci/scripts/update-beats.sh environments: - name: PATH - - name: GOPATH - name: HOME diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index 1ffc720dffe..e86090601d9 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -134,7 +134,7 @@ jobs: $PNG_REPORT_FILE - name: Upload PNG - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: kibana-png-report path: ${{ env.WORKING_DIRECTORY }}/${{ env.PNG_REPORT_FILE }} @@ -150,7 +150,7 @@ jobs: echo "png_report_url=https://elastic-apm-server-benchmark-reports.s3.amazonaws.com/${DEST_NAME}" >> "$GITHUB_OUTPUT" - name: Upload benchmark result - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: always() with: name: benchmark-result diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6952bde8d0c..6702ff56074 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,7 +71,7 @@ jobs: go run -modfile=tools/go.mod gotest.tools/gotestsum \ --no-color -f standard-quiet --jsonfile "$OUTPUT_JSON_FILE" --junitfile "$OUTPUT_JUNIT_FILE" \ --raw-command -- make system-test - - uses: actions/upload-artifact@v3 # upload test results + - uses: actions/upload-artifact@v4 # upload test results if: ${{ always() }} # run this step even if previous step failed with: name: test-results diff --git a/.github/workflows/opentelemetry.yml b/.github/workflows/opentelemetry.yml index d7f8ffca444..2274ed913eb 100644 --- a/.github/workflows/opentelemetry.yml +++ b/.github/workflows/opentelemetry.yml @@ -3,13 +3,17 @@ name: OpenTelemetry Export Trace on: workflow_run: workflows: + - benchmarks - bump-elastic-stack-snapshot - bump-golang - ci - microbenchmark - - system-test-reporter + - run-minor-release + - run-patch-release + - smoke-tests - smoke-tests-os - smoke-tests-ess + - system-test-reporter - Terraform Format - update-beats types: [completed] diff --git a/.github/workflows/run-minor-release.yml b/.github/workflows/run-minor-release.yml new file mode 100644 index 00000000000..c00184ae8e6 --- /dev/null +++ b/.github/workflows/run-minor-release.yml @@ -0,0 +1,22 @@ +--- +name: run-minor-release + +on: + workflow_dispatch: + inputs: + version: + description: 'The version (semver format: major.minor.patch)' + required: true + type: string + +permissions: + contents: read + +env: + SLACK_CHANNEL: "#apm-server-test-release" + +jobs: + run-minor: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 diff --git a/.github/workflows/run-patch-release.yml b/.github/workflows/run-patch-release.yml new file mode 100644 index 00000000000..3f0cb3aa3d7 --- /dev/null +++ b/.github/workflows/run-patch-release.yml @@ -0,0 +1,22 @@ +--- +name: run-patch-release + +on: + workflow_dispatch: + inputs: + version: + description: 'The version (semver format: major.minor.patch)' + required: true + type: string + +permissions: + contents: read + +env: + SLACK_CHANNEL: "#apm-server-test-release" + +jobs: + run-patch: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 diff --git a/.go-version b/.go-version index 20a1265cf39..ce2dd53570b 100644 --- a/.go-version +++ b/.go-version @@ -1 +1 @@ -1.21.4 +1.21.5 diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index ea8a6729f14..7b32b7b3575 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -1,4 +1,22 @@ +// tag::list[] +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +// end::list[] + +// tag::includes[] include::./changelogs/head.asciidoc[] +include::./changelogs/8.12.asciidoc[] include::./changelogs/8.11.asciidoc[] include::./changelogs/8.10.asciidoc[] include::./changelogs/8.9.asciidoc[] @@ -11,3 +29,4 @@ include::./changelogs/8.3.asciidoc[] include::./changelogs/8.2.asciidoc[] include::./changelogs/8.1.asciidoc[] include::./changelogs/8.0.asciidoc[] +// end::includes[] diff --git a/NOTICE.txt b/NOTICE.txt index e2d20764e6b..8047f9493a0 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -362,11 +362,11 @@ these terms. -------------------------------------------------------------------------------- Dependency : github.com/elastic/apm-data -Version: v0.1.1-0.20231019120308-82201b991ae5 +Version: v0.1.1-0.20231212041654-b2a4dabeb6e3 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/apm-data@v0.1.1-0.20231019120308-82201b991ae5/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/elastic/apm-data@v0.1.1-0.20231212041654-b2a4dabeb6e3/LICENSE: Apache License Version 2.0, January 2004 @@ -573,11 +573,11 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/apm-data@v0.1.1 -------------------------------------------------------------------------------- Dependency : github.com/elastic/beats/v7 -Version: v7.0.0-alpha2.0.20231204124921-be42a3369f94 +Version: v7.0.0-alpha2.0.20231227085400-8c4a40fdbfda Licence type (autodetected): Elastic -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/beats/v7@v7.0.0-alpha2.0.20231204124921-be42a3369f94/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/elastic/beats/v7@v7.0.0-alpha2.0.20231227085400-8c4a40fdbfda/LICENSE.txt: Source code in this repository is variously licensed under the Apache License Version 2.0, an Apache compatible license, or the Elastic License. Outside of @@ -596,11 +596,11 @@ License Version 2.0. -------------------------------------------------------------------------------- Dependency : github.com/elastic/elastic-agent-client/v7 -Version: v7.5.0 +Version: v7.6.0 Licence type (autodetected): Elastic -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-client/v7@v7.5.0/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-client/v7@v7.6.0/LICENSE.txt: ELASTIC LICENSE AGREEMENT @@ -1040,11 +1040,11 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-l -------------------------------------------------------------------------------- Dependency : github.com/elastic/elastic-agent-system-metrics -Version: v0.9.0 +Version: v0.9.1 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-system-metrics@v0.9.0/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-system-metrics@v0.9.1/LICENSE.txt: Apache License Version 2.0, January 2004 @@ -1884,11 +1884,11 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/go-elasticsearc -------------------------------------------------------------------------------- Dependency : github.com/elastic/go-sysinfo -Version: v1.11.1 +Version: v1.11.2 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/go-sysinfo@v1.11.1/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/elastic/go-sysinfo@v1.11.2/LICENSE.txt: Apache License @@ -6640,11 +6640,11 @@ THE SOFTWARE. -------------------------------------------------------------------------------- Dependency : golang.org/x/net -Version: v0.17.0 +Version: v0.19.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/net@v0.17.0/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/net@v0.19.0/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. @@ -6714,11 +6714,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : golang.org/x/term -Version: v0.13.0 +Version: v0.15.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/term@v0.13.0/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/term@v0.15.0/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. @@ -18332,11 +18332,11 @@ THE SOFTWARE. -------------------------------------------------------------------------------- Dependency : golang.org/x/crypto -Version: v0.14.0 +Version: v0.16.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/crypto@v0.14.0/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/crypto@v0.16.0/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. @@ -18369,11 +18369,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : golang.org/x/exp -Version: v0.0.0-20230713183714-613f0c0eb8a1 +Version: v0.0.0-20231127185646-65229373498e Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/exp@v0.0.0-20230713183714-613f0c0eb8a1/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/exp@v0.0.0-20231127185646-65229373498e/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. @@ -18406,11 +18406,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : golang.org/x/sys -Version: v0.14.0 +Version: v0.15.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/sys@v0.14.0/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/sys@v0.15.0/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. @@ -18443,11 +18443,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- Dependency : golang.org/x/text -Version: v0.13.0 +Version: v0.14.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/golang.org/x/text@v0.13.0/LICENSE: +Contents of probable licence file $GOMODCACHE/golang.org/x/text@v0.14.0/LICENSE: Copyright (c) 2009 The Go Authors. All rights reserved. diff --git a/changelogs/8.11.asciidoc b/changelogs/8.11.asciidoc index 3fe1ab463d7..92e7df1cea9 100644 --- a/changelogs/8.11.asciidoc +++ b/changelogs/8.11.asciidoc @@ -3,10 +3,19 @@ https://github.com/elastic/apm-server/compare/8.10\...8.11[View commits] +* <> * <> * <> * <> +[float] +[[release-notes-8.11.3]] +=== APM version 8.11.3 + +https://github.com/elastic/apm-server/compare/v8.11.2\...v8.11.3[View commits] + +No significant changes. + [float] [[release-notes-8.11.2]] === APM version 8.11.2 diff --git a/changelogs/8.12.asciidoc b/changelogs/8.12.asciidoc new file mode 100644 index 00000000000..94abff210f4 --- /dev/null +++ b/changelogs/8.12.asciidoc @@ -0,0 +1,30 @@ +[[release-notes-8.12]] +== APM version 8.12 + +https://github.com/elastic/apm-server/compare/8.11\...8.12[View commits] + +* <> + +[float] +[[release-notes-8.12.0]] +=== APM version 8.12.0 + +[float] +==== Breaking Changes +- The unsupported apm_data_stream_migration ingest pipeline has been removed {pull}12102[12102]. +- "publish_ready" is always false in the "GET /" response until events are received by apm-server {pull}12150[12150] + +[float] +==== Bug fixes +- Switch built-in ILM rollover policies from max_size to max_primary_shard_size {pull}11729[11729]. +- Handle empty request bodies gracefully {pull}12242[12242]. +- Wrap processor errors to provide more details {pull}12242[12242]. +- Require only one of exception.{type,message} for log exceptions {pull}12242[12242]. + +[float] +==== Added +- Update container base image to Ubuntu 22.04 {pull}11778[11778] +- Add support for returning partial success response in OTLP input {pull}11883[11883] +- Setting event timestamp from OTel observed timestamp when needed {pull}11935[11935] +- Field mappings have been added for various formerly unindexed fields {pull}12102[12102] +- We now assert that index templates are installed by attempting to create data streams {pull}12150[12150] diff --git a/changelogs/all-breaking-changes.asciidoc b/changelogs/all-breaking-changes.asciidoc new file mode 100644 index 00000000000..58335f86b1b --- /dev/null +++ b/changelogs/all-breaking-changes.asciidoc @@ -0,0 +1,289 @@ +:issue: https://github.com/elastic/apm-server/issues/ +:pull: https://github.com/elastic/apm-server/pull/ + +[[apm-breaking]] +=== Breaking Changes + +This section describes the breaking changes and deprecations introduced in this release +and previous minor versions. + +// tag::811-bc[] +[float] +[[breaking-changes-8.11]] +=== 8.11 + +The following breaking changes are introduced in APM version 8.11.0: + +- The `ecs.version` field has been removed from APM data streams. +This change should not impact most users as this field is not used by the APM UI. +For more details, see https://github.com/elastic/apm-server/pull/11632[PR #11632] +// end::811-bc[] + +// tag::810-bc[] +[float] +[[breaking-changes-8.10]] +=== 8.10 + +The following breaking changes are introduced in APM version 8.10.0: + +- Aggregated metrics now consider global labels to be part of a service's identity, and high cardinality global labels may cause services to be obscured. +For more details, see https://github.com/elastic/apm-server/pull/11386[PR #11386]. + +- Event protobuf encoding for tail-based sampling changed to a more efficient encoding for event timestamp and duration +For more details, see https://github.com/elastic/apm-server/pull/11386[PR #11386]. +// end::810-bc[] + +// tag::87-bc[] +[float] +[[breaking-changes-8.7]] +=== 8.7 + +The following breaking changes and deprecations are introduced in APM version 8.7.0: + +- `transaction.failure_count` has been removed. `transaction.success_count` type has changed to `aggregated_metric_double`. +For more details, see https://github.com/elastic/apm-server/pull/9791[PR #9791]. + +- `transaction.success_count` has been moved to `event.success_count`. +For more details, see https://github.com/elastic/apm-server/pull/9819[PR #9819]. + +- Stopped indexing transaction metrics to `metrics-apm.internal`. +For more details, see https://github.com/elastic/apm-server/pull/9846[PR #9846]. + +- Stopped indexing span destination metrics to `metrics-apm.internal`. +For more details, see https://github.com/elastic/apm-server/pull/9926[PR #9926]. + +- `apmserver.aggregation.txmetrics.overflowed` metric has been renamed to `apmserver.aggregation.txmetrics.overflowed.total`. +For more details, see https://github.com/elastic/apm-server/pull/10330[PR #10330]. + +- Elasticsearch source mapping credentials now require access to the `.apm-source-map` index. +For more details, see https://github.com/elastic/apm-server/pull/9722[PR #9722]. + +- Changed APM Server default host to `127.0.0.1`. +For more details, see https://github.com/elastic/apm-server/pull/9877[PR #9877]. +// end::87-bc[] + +// tag::86-bc[] +[float] +[[breaking-changes-8.6]] +=== 8.6 + +The following breaking changes and deprecations are introduced in APM version 8.6.0: + +[float] +==== `apm-server.decoder.*` no longer recorded +The stack monitoring metrics, `apm-server.decoder.*`, are no longer recorded. +These metrics were not used by stack monitoring, so there should be no noticeable change. + +For more details, see https://github.com/elastic/apm-server/pull/9210[PR #9210]. + +[float] +==== `context.http.response.*_size` fields now enforce integer values +New field mappings enforce integer values for `context.http.response.*_size`. +The fields are mapped with `index: false` to minimize storage overhead. + +For more details, see https://github.com/elastic/apm-server/pull/9429[PR #9429]. + +[float] +==== `observer.id` and `observer.ephemeral_id` removed + +`observer.id` and `observer.ephemeral_id` are no longer added to APM documents. +The APM UI does not currently rely on these field, so there should be no noticeable change. + +For more details, see https://github.com/elastic/apm-server/pull/9412[PR #9412]. + +[float] +==== `timeseries.instance` removed +`timeseries.instance` has been removed from transaction metrics docs. +The APM UI did not use this field, so there should be no noticeable change. + +For more details, see https://github.com/elastic/apm-server/pull/9565[PR #9565]. + +// end::86-bc[] + +[float] +[[breaking-changes-8.2]] +=== 8.2 + +// tag::82-bc[] +The following breaking changes are introduced in APM version 8.2.0: + +[float] +==== APM Server now emits events with `event.duration` + +APM Server no longer emits events with a `transaction.duration.us` or `span.duration.us`. +Instead, events are emitted with an `event.duration`. +An ingest pipeline sets the legacy `.duration.us` field and removes the `event.duration`. + +This change will impact users who are not using APM Server's {es} output or the packaged ingest pipeline. +For details, see https://github.com/elastic/apm-server/pull/7261[PR #7261]. + +[float] +==== Removed `observer.version_major` + +The field `observer.version_major` is non-standard and existed only for the APM UI to filter out legacy docs (versions <7.0). +This check is no longer performed, so the field has been removed. + +For details, see https://github.com/elastic/apm-server/pull/7399[PR #7399]. + +[float] +==== APM Server no longer ships with System V init scripts or the go-daemon wrapper + +As of version 8.1.0, all Linux distributions supported by APM Server support systemd. +As a result, APM Server no longer ships with System V init scripts or the go-daemon wrapper; use systemd instead. + +For details, see https://github.com/elastic/apm-server/pull/7576[PR #7576]. + +[float] +==== Deprecated 32-bit architectures + +APM Server support for 32-bit architectures has been deprecated and will be removed in a future release. +// end::82-bc[] + +[float] +[[breaking-changes-8.1]] +=== 8.1 + +// tag::81-bc[] +There are no breaking changes in APM. +// end::81-bc[] + +[float] +[[breaking-changes-8.0]] +=== 8.0 + +// tag::80-bc[] +The following breaking changes are introduced in APM version 8.0. + +[float] +==== Indices are now manged by {fleet} + +All index management has been removed from APM Server; +{fleet} is now entirely responsible for setting up index templates, index lifecycle polices, +and index pipelines. + +As a part of this change, the following settings have been removed: + +* `apm-server.ilm.*` +* `apm-server.register.ingest.pipeline.*` +* `setup.*` + +[float] +==== Data streams by default + +APM Server now only writes to well-defined data streams; +writing to classic indices is no longer supported. + +As a part of this change, the following settings have been removed: + +* `apm-server.data_streams.enabled` +* `output.elasticsearch.index` +* `output.elasticsearch.indices` +* `output.elasticsearch.pipeline` +* `output.elasticsearch.pipelines` + +[float] +==== New {es} output + +APM Server has a new {es} output implementation; it is no longer necessary to manually +tune the output of APM Server. + +As a part of this change, the following settings have been removed: + +* `output.elasticsearch.bulk_max_size` +* `output.elasticsearch.worker` +* `queue.*` + +[float] +==== New source map upload endpoint + +The source map upload endpoint has been removed from APM Server. +Source maps should now be uploaded directly to {kib} instead. + +[float] +==== Legacy Jaeger endpoints have been removed + +The legacy Jaeger gRPC and HTTP endpoints have been removed from APM Server. + +As a part of this change, the following settings have been removed: + +* `apm-server.jaeger` + +[float] +==== Homebrew no longer supported + +APM Server no longer supports installation via Homebrew. + +[float] +==== All removed and changed settings + +Below is a list of all **removed settings** (in alphabetical order) for +users upgrading a standalone APM Server to {stack} version 8.0. + +[source,yml] +---- +apm-server.data_streams.enabled +apm-server.ilm.* +apm-server.jaeger +apm-server.register.ingest.pipeline.* +apm-server.sampling.keep_unsampled +output.elasticsearch.bulk_max_size +output.elasticsearch.index +output.elasticsearch.indices +output.elasticsearch.pipeline +output.elasticsearch.pipelines +output.elasticsearch.worker +queue.* +setup.* +---- + +Below is a list of **renamed settings** (in alphabetical order) for +users upgrading a standalone APM Server to {stack} version 8.0. + +[source,yml] +---- +previous setting --> new setting + +apm-server.api_key --> apm-server.auth.api_key +apm-server.instrumentation --> instrumentation +apm-server.rum.allowed_service --> apm-server.auth.anonymous.allow_service +apm-server.rum.event_rate --> apm-server.auth.anonymous.rate_limit +apm-server.secret_token --> apm-server.auth.secret_token +---- + +[float] +==== Supported {ecloud} settings + +Below is a list of all **supported settings** (in alphabetical order) for +users upgrading an {ecloud} standalone cluster to {stack} version 8.0. +Any previously supported settings not listed below will be removed when upgrading. + +[source,yml] +---- +apm-server.agent.config.cache.expiration +apm-server.aggregation.transactions.* +apm-server.auth.anonymous.allow_agent +apm-server.auth.anonymous.allow_service +apm-server.auth.anonymous.rate_limit.event_limit +apm-server.auth.anonymous.rate_limit.ip_limit +apm-server.auth.api_key.enabled +apm-server.auth.api_key.limit +apm-server.capture_personal_data +apm-server.default_service_environment +apm-server.max_event_size +apm-server.rum.allow_headers +apm-server.rum.allow_origins +apm-server.rum.enabled +apm-server.rum.exclude_from_grouping +apm-server.rum.library_pattern +apm-server.rum.source_mapping.enabled +apm-server.rum.source_mapping.cache.expiration +logging.level +logging.selectors +logging.metrics.enabled +logging.metrics.period +max_procs +output.elasticsearch.flush_bytes +output.elasticsearch.flush_interval +---- + +// end::80-bc[] diff --git a/changelogs/head.asciidoc b/changelogs/head.asciidoc index 37ff7d0ef18..4d12089d629 100644 --- a/changelogs/head.asciidoc +++ b/changelogs/head.asciidoc @@ -1,17 +1,14 @@ [[release-notes-head]] == APM version HEAD -https://github.com/elastic/apm-server/compare/8.11\...main[View commits] +https://github.com/elastic/apm-server/compare/8.12\...main[View commits] [float] ==== Breaking Changes -- The unsupported apm_data_stream_migration ingest pipeline has been removed {pull}12102[12102]. -- "publish_ready" is always false in the "GET /" response until events are received by apm-server {pull}12150[12150] - Reverts a breaking change that ignored the beat name. This is visible in Stack Monitoring {pull}12176[12176] [float] ==== Bug fixes -- Switch built-in ILM rollover policies from max_size to max_primary_shard_size {pull}11729[11729]. [float] ==== Deprecations @@ -21,8 +18,4 @@ https://github.com/elastic/apm-server/compare/8.11\...main[View commits] [float] ==== Added -- Update container base image to Ubuntu 22.04 {pull}11778[11778] -- Add support for returning partial success response in OTLP input {pull}11883[11883] -- Setting event timestamp from OTel observed timestamp when needed {pull}11935[11935] -- Field mappings have been added for various formerly unindexed fields {pull}12102[12102] -- We now assert that index templates are installed by attempting to create data streams {pull}12150[12150] +- map OTel's `span.Status: Unset` to `event.outcome: success` instead of `event.outcome: unknown` diff --git a/docker-compose.yml b/docker-compose.yml index db60d601737..81a4cfb00b2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ x-logging: &default-logging max-size: "1g" services: elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0-33e8d7e1-SNAPSHOT + image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0-4aavtlfc-SNAPSHOT ports: - 9200:9200 healthcheck: @@ -41,7 +41,7 @@ services: logging: *default-logging kibana: - image: docker.elastic.co/kibana/kibana:8.12.0-33e8d7e1-SNAPSHOT + image: docker.elastic.co/kibana/kibana:8.13.0-4aavtlfc-SNAPSHOT ports: - 5601:5601 healthcheck: @@ -60,7 +60,7 @@ services: logging: *default-logging metricbeat: - image: docker.elastic.co/beats/metricbeat:8.12.0-33e8d7e1-SNAPSHOT + image: docker.elastic.co/beats/metricbeat:8.13.0-4aavtlfc-SNAPSHOT environment: ELASTICSEARCH_HOSTS: '["http://elasticsearch:9200"]' ELASTICSEARCH_USERNAME: "${KIBANA_ES_USER:-admin}" diff --git a/docs/apm-mutating-webhook.asciidoc b/docs/apm-k8s-attacher.asciidoc similarity index 89% rename from docs/apm-mutating-webhook.asciidoc rename to docs/apm-k8s-attacher.asciidoc index 53759ba1012..e9235375092 100644 --- a/docs/apm-mutating-webhook.asciidoc +++ b/docs/apm-k8s-attacher.asciidoc @@ -1,5 +1,5 @@ -[[apm-mutating-admission-webhook]] -= APM Attacher +[[apm-k8s-attacher]] += APM K8S Attacher preview::[] diff --git a/docs/features.asciidoc b/docs/features.asciidoc index 4c58f4c7d3c..fdec4acd425 100644 --- a/docs/features.asciidoc +++ b/docs/features.asciidoc @@ -13,7 +13,7 @@ * <> * <> * <> -* <> +* <> include::./apm-data-security.asciidoc[] @@ -31,4 +31,4 @@ include::./span-compression.asciidoc[] include::./aws-lambda-extension.asciidoc[leveloffset=+2] -include::./apm-mutating-webhook.asciidoc[leveloffset=+2] +include::./apm-k8s-attacher.asciidoc[leveloffset=+2] diff --git a/docs/otel-direct.asciidoc b/docs/otel-direct.asciidoc index 734178e0066..bfc77cf1a1e 100644 --- a/docs/otel-direct.asciidoc +++ b/docs/otel-direct.asciidoc @@ -54,7 +54,7 @@ service: exporters: [logging, otlp/elastic] ---- <1> The receivers, like the -https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otlpreceiver[OTLP receiver], that forward data emitted by APM agents, or the https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/hostmetricsreceiver[host metrics receiver]. +https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otlpreceiver[OTLP receiver], that forward data emitted by APM agents, or the https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/hostmetricsreceiver[host metrics receiver]. <2> We recommend using the https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/batchprocessor/README.md[Batch processor] and the https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/memorylimiterprocessor/README.md[memory limiter processor]. For more information, see https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/README.md#recommended-processors[recommended processors]. <3> The https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/loggingexporter[logging exporter] is helpful for troubleshooting and supports various logging levels, like `debug`, `info`, `warn`, and `error`. <4> Elastic {observability} endpoint configuration. diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc index 6a3e847716e..13f71a32064 100644 --- a/docs/redirects.asciidoc +++ b/docs/redirects.asciidoc @@ -420,3 +420,9 @@ Please see <>. This page has been deleted. Please see <>. + +[role="exclude",id="apm-mutating-admission-webhook"] +==== APM Attacher + +This page has moved. +Please see <>. diff --git a/docs/release-notes.asciidoc b/docs/release-notes.asciidoc index 95a488319fe..62fe33a3474 100644 --- a/docs/release-notes.asciidoc +++ b/docs/release-notes.asciidoc @@ -9,6 +9,7 @@ This section summarizes the changes in each release. **APM integration and APM Server** +* <> * <> * <> * <> diff --git a/docs/version.asciidoc b/docs/version.asciidoc index 5f7517f251e..4a0cf36c40c 100644 --- a/docs/version.asciidoc +++ b/docs/version.asciidoc @@ -1,6 +1,6 @@ // doc-branch can be: master, 8.0, 8.1, etc. :doc-branch: master -:go-version: 1.21.4 +:go-version: 1.21.5 :python: 3.7 :docker: 1.12 :docker-compose: 1.11 diff --git a/go.mod b/go.mod index 10146be6e82..d1c2f19ad9c 100644 --- a/go.mod +++ b/go.mod @@ -9,15 +9,15 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.3-0.20201012072640-f5a7e0a1c83b github.com/dustin/go-humanize v1.0.1 github.com/elastic/apm-aggregation v0.0.0-20230815024520-e75a37d9ddd6 - github.com/elastic/apm-data v0.1.1-0.20231019120308-82201b991ae5 - github.com/elastic/beats/v7 v7.0.0-alpha2.0.20231204124921-be42a3369f94 - github.com/elastic/elastic-agent-client/v7 v7.5.0 + github.com/elastic/apm-data v0.1.1-0.20231212041654-b2a4dabeb6e3 + github.com/elastic/beats/v7 v7.0.0-alpha2.0.20231227085400-8c4a40fdbfda + github.com/elastic/elastic-agent-client/v7 v7.6.0 github.com/elastic/elastic-agent-libs v0.7.2 - github.com/elastic/elastic-agent-system-metrics v0.9.0 + github.com/elastic/elastic-agent-system-metrics v0.9.1 github.com/elastic/gmux v0.3.1 github.com/elastic/go-docappender v0.2.1-0.20231207080152-44217001fa53 github.com/elastic/go-elasticsearch/v8 v8.11.1 - github.com/elastic/go-sysinfo v1.11.1 + github.com/elastic/go-sysinfo v1.11.2 github.com/elastic/go-ucfg v0.8.6 github.com/go-sourcemap/sourcemap v2.1.3+incompatible github.com/gofrs/flock v0.8.1 @@ -51,9 +51,9 @@ require ( go.opentelemetry.io/otel/sdk/metric v1.21.0 go.uber.org/automaxprocs v1.5.2 go.uber.org/zap v1.26.0 - golang.org/x/net v0.17.0 + golang.org/x/net v0.19.0 golang.org/x/sync v0.5.0 - golang.org/x/term v0.13.0 + golang.org/x/term v0.15.0 golang.org/x/time v0.3.0 google.golang.org/grpc v1.58.3 google.golang.org/protobuf v1.31.0 @@ -76,7 +76,7 @@ require ( github.com/cockroachdb/redact v1.0.8 // indirect github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6 // indirect - github.com/containerd/containerd v1.7.1 // indirect + github.com/containerd/containerd v1.7.11 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect @@ -140,6 +140,7 @@ require ( github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/shirou/gopsutil/v3 v3.23.5 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect @@ -157,12 +158,12 @@ require ( go.opentelemetry.io/otel/trace v1.21.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect - golang.org/x/mod v0.13.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.14.0 // indirect + golang.org/x/crypto v0.16.0 // indirect + golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.16.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect gopkg.in/jcmturner/aescts.v1 v1.0.1 // indirect gopkg.in/jcmturner/dnsutils.v1 v1.0.1 // indirect diff --git a/go.sum b/go.sum index a60e7a158f9..37203303f91 100644 --- a/go.sum +++ b/go.sum @@ -83,8 +83,8 @@ github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6 h1:DJK8W/iB+s/qkTtmXSrHA49lp5O3OsR7E6z4byOLy34= github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/containerd/containerd v1.7.1 h1:k8DbDkSOwt5rgxQ3uCI4WMKIJxIndSCBUaGm5oRn+Go= -github.com/containerd/containerd v1.7.1/go.mod h1:gA+nJUADRBm98QS5j5RPROnt0POQSMK+r7P7EGMC/Qc= +github.com/containerd/containerd v1.7.11 h1:lfGKw3eU35sjV0aG2eYZTiwFEY1pCzxdzicHP3SZILw= +github.com/containerd/containerd v1.7.11/go.mod h1:5UluHxHTX2rdvYuZ5OJTC5m/KJNs0Zs9wVoJm9zf5ZE= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -132,20 +132,20 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elastic/apm-aggregation v0.0.0-20230815024520-e75a37d9ddd6 h1:Js+C3HEE0a5BDFmhEmJV/Uo4uzj/paHjd7yl6+KYguw= github.com/elastic/apm-aggregation v0.0.0-20230815024520-e75a37d9ddd6/go.mod h1:ba3gaJCuhxXN/O5AuiI56xxd6DukQdVOK0NfpzBntNo= -github.com/elastic/apm-data v0.1.1-0.20231019120308-82201b991ae5 h1:URlDi0TZetSAo8KAIbaMZQhM5EG8+SDgs0jTen7WvMg= -github.com/elastic/apm-data v0.1.1-0.20231019120308-82201b991ae5/go.mod h1:z4iJVl8vyQa5v5o7UapWGHTsycBKsKfJfILuf2TZpYo= -github.com/elastic/beats/v7 v7.0.0-alpha2.0.20231204124921-be42a3369f94 h1:HGuZZvCTJHfw67Kv/3Dko1HRx2oWNc3ktz9xL7xRyu8= -github.com/elastic/beats/v7 v7.0.0-alpha2.0.20231204124921-be42a3369f94/go.mod h1:C3d6os2PiO+aRDft33aQq94OwX0w83tut1R19QSWGB4= -github.com/elastic/elastic-agent-autodiscover v0.6.4 h1:K+xC7OGgcy4fLXVuGgOGLs+eXCqRnRg2SQQinxP+KsA= -github.com/elastic/elastic-agent-autodiscover v0.6.4/go.mod h1:5+7NIBAILc0GkgxYW3ckXncu5wRZfltZhTY4aZAYP4M= -github.com/elastic/elastic-agent-client/v7 v7.5.0 h1:niI3WQ+01Lnp2r5LxK8SyNhrPJe13vBiOkqrDRK2oTA= -github.com/elastic/elastic-agent-client/v7 v7.5.0/go.mod h1:DYoX95xjC4BW/p2avyu724Qr2+hoUIz9eCU9CVS1d+0= +github.com/elastic/apm-data v0.1.1-0.20231212041654-b2a4dabeb6e3 h1:pavWRIAjsPregjeLBOFlm6UBDbsVYXGuQh+ancXJNiw= +github.com/elastic/apm-data v0.1.1-0.20231212041654-b2a4dabeb6e3/go.mod h1:z4iJVl8vyQa5v5o7UapWGHTsycBKsKfJfILuf2TZpYo= +github.com/elastic/beats/v7 v7.0.0-alpha2.0.20231227085400-8c4a40fdbfda h1:JGfPRuxBRxVONx42TogqxZuJGCEjXOLDyQrIqiB6ALo= +github.com/elastic/beats/v7 v7.0.0-alpha2.0.20231227085400-8c4a40fdbfda/go.mod h1:9tCrNLNmwxLSsacBw7hOc4tpQ4MD9+0+abJuQDwoZjw= +github.com/elastic/elastic-agent-autodiscover v0.6.6 h1:P1y0dDpbhJc7Uw/xe85irPEad4Vljygc+y4iSxtqW7A= +github.com/elastic/elastic-agent-autodiscover v0.6.6/go.mod h1:chulyCAyZb/njMHgzkhC/yWnt8v/Y6eCRUhmFVnsA5o= +github.com/elastic/elastic-agent-client/v7 v7.6.0 h1:FEn6FjzynW4TIQo5G096Tr7xYK/P5LY9cSS6wRbXZTc= +github.com/elastic/elastic-agent-client/v7 v7.6.0/go.mod h1:GlUKrbVd/O1CRAZonpBeN3J0RlVqP6VGcrBjFWca+aM= github.com/elastic/elastic-agent-libs v0.7.2 h1:yT0hF0UAxJCdQqhHh6SFpgYrcpB10oFzPj8IaytPS2o= github.com/elastic/elastic-agent-libs v0.7.2/go.mod h1:pVBEElQJUO9mr4WStWNXuQGsJn54lcjAoYAHmsvBLBc= github.com/elastic/elastic-agent-shipper-client v0.5.1-0.20230228231646-f04347b666f3 h1:sb+25XJn/JcC9/VL8HX4r4QXSUq4uTNzGS2kxOE7u1U= github.com/elastic/elastic-agent-shipper-client v0.5.1-0.20230228231646-f04347b666f3/go.mod h1:rWarFM7qYxJKsi9WcV6ONcFjH/NA3niDNpTxO+8/GVI= -github.com/elastic/elastic-agent-system-metrics v0.9.0 h1:sA3pSk+awH4g45M8tjcwd9U6uVQvNzUpKS8ajS3DuUk= -github.com/elastic/elastic-agent-system-metrics v0.9.0/go.mod h1:9C1UEfj0P687HAzZepHszN6zXA+2tN2Lx3Osvq1zby8= +github.com/elastic/elastic-agent-system-metrics v0.9.1 h1:r0ofKHgPpl+W09ie7tzGcCDC0d4NZbQUv37rSgHf4FM= +github.com/elastic/elastic-agent-system-metrics v0.9.1/go.mod h1:9C1UEfj0P687HAzZepHszN6zXA+2tN2Lx3Osvq1zby8= github.com/elastic/elastic-transport-go/v8 v8.3.0 h1:DJGxovyQLXGr62e9nDMPSxRyWION0Bh6d9eCFBriiHo= github.com/elastic/elastic-transport-go/v8 v8.3.0/go.mod h1:87Tcz8IVNe6rVSLdBux1o/PEItLtyabHU3naC7IoqKI= github.com/elastic/gmux v0.3.1 h1:ghT+5Y9jW5udQTBrhDeMOtQVdRBwk9Y2h1o+4Rb7mhE= @@ -158,8 +158,8 @@ github.com/elastic/go-lumber v0.1.2-0.20220819171948-335fde24ea0f h1:TsPpU5EAwlt github.com/elastic/go-lumber v0.1.2-0.20220819171948-335fde24ea0f/go.mod h1:HHaWnZamYKWsR9/eZNHqRHob8iQDKnchHmmskT/SKko= github.com/elastic/go-structform v0.0.10 h1:oy08o/Ih2hHTkNcRY/1HhaYvIp5z6t8si8gnCJPDo1w= github.com/elastic/go-structform v0.0.10/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= -github.com/elastic/go-sysinfo v1.11.1 h1:g9mwl05njS4r69TisC+vwHWTSKywZFYYUu3so3T/Lao= -github.com/elastic/go-sysinfo v1.11.1/go.mod h1:6KQb31j0QeWBDF88jIdWSxE8cwoOB9tO4Y4osN7Q70E= +github.com/elastic/go-sysinfo v1.11.2 h1:mcm4OSYVMyws6+n2HIVMGkln5HOpo5Ie1ZmbbNn0jg4= +github.com/elastic/go-sysinfo v1.11.2/go.mod h1:GKqR8bbMK/1ITnez9NIsIfXQr25aLhRJa7AfT8HpBFQ= github.com/elastic/go-ucfg v0.8.6 h1:stUeyh2goTgGX+/wb9gzKvTv0YB0231LTpKUgCKj4U0= github.com/elastic/go-ucfg v0.8.6/go.mod h1:4E8mPOLSUV9hQ7sgLEJ4bvt0KhMuDJa8joDT2QGAEKA= github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= @@ -457,8 +457,8 @@ github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -586,11 +586,11 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= +golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -598,8 +598,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -620,8 +620,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= @@ -658,24 +658,25 @@ 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-20210510120138-977fb7262007/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -691,8 +692,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/beater/api/intake/handler_test.go b/internal/beater/api/intake/handler_test.go index cf15c2e7928..8cfa0c5a79d 100644 --- a/internal/beater/api/intake/handler_test.go +++ b/internal/beater/api/intake/handler_test.go @@ -64,14 +64,14 @@ func TestIntakeHandler(t *testing.T) { }(), code: http.StatusBadRequest, id: request.IDResponseErrorsValidate, }, - "BodyReader": { + "EmptyBody": { path: "errors.ndjson", r: func() *http.Request { req := httptest.NewRequest(http.MethodPost, "/", nil) req.Header.Set(headers.ContentType, "application/x-ndjson") return req }(), - code: http.StatusBadRequest, id: request.IDResponseErrorsValidate, + code: http.StatusAccepted, id: request.IDResponseValidAccepted, }, "CompressedBodyReaderDeflateInvalid": { path: "errors.ndjson", diff --git a/internal/beater/api/intake/test_approved/BodyReader.approved.json b/internal/beater/api/intake/test_approved/BodyReader.approved.json deleted file mode 100644 index fc636bfdcb3..00000000000 --- a/internal/beater/api/intake/test_approved/BodyReader.approved.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "accepted": 0, - "errors": [ - { - "message": "EOF while reading metadata" - } - ] -} diff --git a/internal/beater/api/intake/test_approved/EmptyBody.approved.json b/internal/beater/api/intake/test_approved/EmptyBody.approved.json new file mode 100644 index 00000000000..6b51efae3bf --- /dev/null +++ b/internal/beater/api/intake/test_approved/EmptyBody.approved.json @@ -0,0 +1,3 @@ +{ + "accepted": 0 +} diff --git a/internal/beater/api/intake/test_approved/FullQueue.approved.json b/internal/beater/api/intake/test_approved/FullQueue.approved.json index ce2dd7e6357..c163b675ec7 100644 --- a/internal/beater/api/intake/test_approved/FullQueue.approved.json +++ b/internal/beater/api/intake/test_approved/FullQueue.approved.json @@ -2,7 +2,7 @@ "accepted": 0, "errors": [ { - "message": "queue is full" + "message": "cannot handle stream: cannot process batch: queue is full" } ] } diff --git a/internal/beater/api/intake/test_approved/FullQueueLegacy.approved.json b/internal/beater/api/intake/test_approved/FullQueueLegacy.approved.json index ce2dd7e6357..c163b675ec7 100644 --- a/internal/beater/api/intake/test_approved/FullQueueLegacy.approved.json +++ b/internal/beater/api/intake/test_approved/FullQueueLegacy.approved.json @@ -2,7 +2,7 @@ "accepted": 0, "errors": [ { - "message": "queue is full" + "message": "cannot handle stream: cannot process batch: queue is full" } ] } diff --git a/internal/beater/api/intake/test_approved/integration/rum/TestRUMHandler_KillSwitchMiddleware/On.approved.json b/internal/beater/api/intake/test_approved/integration/rum/TestRUMHandler_KillSwitchMiddleware/On.approved.json deleted file mode 100644 index fc636bfdcb3..00000000000 --- a/internal/beater/api/intake/test_approved/integration/rum/TestRUMHandler_KillSwitchMiddleware/On.approved.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "accepted": 0, - "errors": [ - { - "message": "EOF while reading metadata" - } - ] -} diff --git a/internal/beater/api/intake/test_approved/integration/rum/TestRUMHandler_NoAuthorizationRequired.approved.json b/internal/beater/api/intake/test_approved/integration/rum/TestRUMHandler_NoAuthorizationRequired.approved.json deleted file mode 100644 index fc636bfdcb3..00000000000 --- a/internal/beater/api/intake/test_approved/integration/rum/TestRUMHandler_NoAuthorizationRequired.approved.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "accepted": 0, - "errors": [ - { - "message": "EOF while reading metadata" - } - ] -} diff --git a/internal/beater/api/mux_intake_rum_test.go b/internal/beater/api/mux_intake_rum_test.go index 946a6dfc373..f50f82d915a 100644 --- a/internal/beater/api/mux_intake_rum_test.go +++ b/internal/beater/api/mux_intake_rum_test.go @@ -75,11 +75,7 @@ func TestRUMHandler_NoAuthorizationRequired(t *testing.T) { cfg.AgentAuth.SecretToken = "1234" rec, err := requestToMuxerWithPattern(cfg, IntakeRUMPath) require.NoError(t, err) - assert.NotEqual(t, http.StatusUnauthorized, rec.Code) - - expected, err := os.ReadFile(approvalPathIntakeRUM(t.Name()) + ".approved.json") - require.NoError(t, err) - assert.JSONEq(t, string(expected), rec.Body.String()) + assert.Equal(t, http.StatusAccepted, rec.Code) } func TestRUMHandler_KillSwitchMiddleware(t *testing.T) { @@ -96,11 +92,7 @@ func TestRUMHandler_KillSwitchMiddleware(t *testing.T) { t.Run("On", func(t *testing.T) { rec, err := requestToMuxerWithPattern(cfgEnabledRUM(), IntakeRUMPath) require.NoError(t, err) - assert.NotEqual(t, http.StatusForbidden, rec.Code) - - expected, err := os.ReadFile(approvalPathIntakeRUM(t.Name()) + ".approved.json") - require.NoError(t, err) - assert.JSONEq(t, string(expected), rec.Body.String()) + assert.Equal(t, http.StatusAccepted, rec.Code) }) } diff --git a/internal/beater/beater.go b/internal/beater/beater.go index 330753510dd..aee736e3fa1 100644 --- a/internal/beater/beater.go +++ b/internal/beater/beater.go @@ -25,7 +25,6 @@ import ( "net/http" "os" "runtime" - "sync" "time" "github.com/dustin/go-humanize" @@ -43,9 +42,11 @@ import ( _ "google.golang.org/grpc/encoding/gzip" "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/esleg/eslegclient" "github.com/elastic/beats/v7/libbeat/instrumentation" "github.com/elastic/beats/v7/libbeat/licenser" "github.com/elastic/beats/v7/libbeat/outputs" + esoutput "github.com/elastic/beats/v7/libbeat/outputs/elasticsearch" "github.com/elastic/beats/v7/libbeat/publisher/pipeline" "github.com/elastic/beats/v7/libbeat/publisher/pipetool" agentconfig "github.com/elastic/elastic-agent-libs/config" @@ -346,13 +347,7 @@ func (s *Runner) Run(ctx context.Context) error { // any events to Elasticsearch before the integration is ready. publishReady := make(chan struct{}) drain := make(chan struct{}) - startWaitReady := make(chan struct{}) - var waitReadyOnce sync.Once g.Go(func() error { - select { - case <-ctx.Done(): - case <-startWaitReady: - } if err := s.waitReady(ctx, kibanaClient, tracer); err != nil { // One or more preconditions failed; drop events. close(drain) @@ -363,25 +358,24 @@ func (s *Runner) Run(ctx context.Context) error { close(publishReady) return nil }) - prePublish := func(ctx context.Context) error { - waitReadyOnce.Do(func() { - close(startWaitReady) - }) + callbackUUID, err := esoutput.RegisterConnectCallback(func(*eslegclient.Connection) error { select { - case <-ctx.Done(): - return ctx.Err() - case <-drain: - return errServerShuttingDown case <-publishReady: + return nil + default: } - return nil + return errors.New("not ready for publishing events") + }) + if err != nil { + return err } + defer esoutput.DeregisterConnectCallback(callbackUUID) newElasticsearchClient := func(cfg *elasticsearch.Config) (*elasticsearch.Client, error) { httpTransport, err := elasticsearch.NewHTTPTransport(cfg) if err != nil { return nil, err } - transport := &waitReadyRoundTripper{Transport: httpTransport, onBulk: prePublish} + transport := &waitReadyRoundTripper{Transport: httpTransport, ready: publishReady, drain: drain} return elasticsearch.NewClientParams(elasticsearch.ClientParams{ Config: cfg, Transport: transport, @@ -438,7 +432,7 @@ func (s *Runner) Run(ctx context.Context) error { // Create the BatchProcessor chain that is used to process all events, // including the metrics aggregated by APM Server. finalBatchProcessor, closeFinalBatchProcessor, err := s.newFinalBatchProcessor( - tracer, newElasticsearchClient, memLimitGB, prePublish, + tracer, newElasticsearchClient, memLimitGB, ) if err != nil { return err @@ -653,9 +647,7 @@ func (s *Runner) waitReady( return errors.New("cannot wait for integration without either Kibana or Elasticsearch config") } preconditions = append(preconditions, func(ctx context.Context) error { - return checkIndexTemplatesInstalled( - ctx, kibanaClient, esOutputClient, s.config.DataStreams.Namespace, s.logger, - ) + return checkIntegrationInstalled(ctx, kibanaClient, esOutputClient, s.logger) }) } @@ -680,13 +672,12 @@ func (s *Runner) newFinalBatchProcessor( tracer *apm.Tracer, newElasticsearchClient func(cfg *elasticsearch.Config) (*elasticsearch.Client, error), memLimit float64, - prePublish func(context.Context) error, ) (modelpb.BatchProcessor, func(context.Context) error, error) { monitoring.Default.Remove("libbeat") libbeatMonitoringRegistry := monitoring.Default.NewRegistry("libbeat") if s.elasticsearchOutputConfig == nil { - return s.newLibbeatFinalBatchProcessor(tracer, prePublish, libbeatMonitoringRegistry) + return s.newLibbeatFinalBatchProcessor(tracer, libbeatMonitoringRegistry) } stateRegistry := monitoring.GetNamespace("state").GetRegistry() @@ -838,7 +829,6 @@ func docappenderConfig( func (s *Runner) newLibbeatFinalBatchProcessor( tracer *apm.Tracer, - prePublish func(context.Context) error, libbeatMonitoringRegistry *monitoring.Registry, ) (modelpb.BatchProcessor, func(context.Context) error, error) { // When the publisher stops cleanly it will close its pipeline client, @@ -899,13 +889,7 @@ func (s *Runner) newLibbeatFinalBatchProcessor( } return acker.Wait(ctx) } - processor := modelprocessor.Chained{ - modelpb.ProcessBatchFunc(func(ctx context.Context, batch *modelpb.Batch) error { - return prePublish(ctx) - }), - publisher, - } - return processor, stop, nil + return publisher, stop, nil } const sourcemapIndex = ".apm-source-map" diff --git a/internal/beater/beatertest/server.go b/internal/beater/beatertest/server.go index 63109ac25ae..9812e3cb6e7 100644 --- a/internal/beater/beatertest/server.go +++ b/internal/beater/beatertest/server.go @@ -108,8 +108,7 @@ func NewUnstartedServer(t testing.TB, opts ...option) *Server { require.NoError(t, err) if !outputConfig.Output.IsSet() { err = cfg.Merge(map[string]any{ - "output.null": map[string]any{}, - "queue.mem.flush": map[string]any{"min_events": 1, "timeout": "1ns"}, + "output.null": map[string]any{}, }) require.NoError(t, err) } diff --git a/internal/beater/checkintegration.go b/internal/beater/checkintegration.go index 1db8bf3e84c..f0fe62ebc59 100644 --- a/internal/beater/checkintegration.go +++ b/internal/beater/checkintegration.go @@ -24,26 +24,23 @@ import ( "fmt" "io" "net/http" - "strings" "github.com/pkg/errors" + "golang.org/x/sync/errgroup" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/apm-server/internal/elasticsearch" "github.com/elastic/apm-server/internal/kibana" - "github.com/elastic/go-elasticsearch/v8/typedapi/indices/createdatastream" - "github.com/elastic/go-elasticsearch/v8/typedapi/types" + "github.com/elastic/go-elasticsearch/v8/esapi" ) -// checkIndexTemplatesInstalled checks if the APM index templates are installed by querying the -// APM integration status via Kibana, or by attempting to create a data stream via Elasticsearch, -// returning nil if and only if it is installed. -func checkIndexTemplatesInstalled( +// checkIntegrationInstalled checks if the APM integration is installed by querying Kibana +// and/or Elasticsearch, returning nil if and only if it is installed. +func checkIntegrationInstalled( ctx context.Context, kibanaClient *kibana.Client, esClient *elasticsearch.Client, - namespace string, logger *logp.Logger, ) (err error) { defer func() { @@ -56,36 +53,37 @@ func checkIndexTemplatesInstalled( } } }() - if esClient != nil { - installed, err := checkCreateDataStream(ctx, esClient, namespace) - if err != nil { - return fmt.Errorf("error checking Elasticsearch index template setup: %w", err) - } - if !installed { - return errors.New("index templates not installed") - } - return nil - } if kibanaClient != nil { - installed, err := checkIntegrationInstalled(ctx, kibanaClient, logger) + installed, err := checkIntegrationInstalledKibana(ctx, kibanaClient, logger) if err != nil { // We only return the Kibana error if we have no Elasticsearch client, // as we may not have sufficient privileges to query the Fleet API. if esClient == nil { return fmt.Errorf("error querying Kibana for integration package status: %w", err) } - } - if !installed { + } else if !installed { // We were able to query Kibana, but the package is not yet installed. + // We should continue querying the package status via Kibana, as it is + // more authoritative than checking for index template installation. return errors.New("integration package not yet installed") } + // Fall through and query Elasticsearch (if we have a client). Kibana may prematurely + // report packages as installed: https://github.com/elastic/kibana/issues/108649 + } + if esClient != nil { + installed, err := checkIntegrationInstalledElasticsearch(ctx, esClient, logger) + if err != nil { + return fmt.Errorf("error querying Elasticsearch for integration index templates: %w", err) + } else if !installed { + return errors.New("integration index templates not installed") + } } return nil } // checkIntegrationInstalledKibana checks if the APM integration package // is installed by querying Kibana. -func checkIntegrationInstalled(ctx context.Context, kibanaClient *kibana.Client, logger *logp.Logger) (bool, error) { +func checkIntegrationInstalledKibana(ctx context.Context, kibanaClient *kibana.Client, logger *logp.Logger) (bool, error) { resp, err := kibanaClient.Send(ctx, "GET", "/api/fleet/epm/packages/apm", nil, nil, nil) if err != nil { return false, err @@ -108,22 +106,41 @@ func checkIntegrationInstalled(ctx context.Context, kibanaClient *kibana.Client, return result.Response.Status == "installed", nil } -// checkCreateDataStream attempts to create a traces-apm- data stream, -// returning an error if it could not be created. This will fail if there is no -// index template matching the pattern. -func checkCreateDataStream(ctx context.Context, esClient *elasticsearch.Client, namespace string) (bool, error) { - if _, err := createdatastream.NewCreateDataStreamFunc(esClient)("traces-apm-" + namespace).Do(ctx); err != nil { - var esError *types.ElasticsearchError - if errors.As(err, &esError) { - cause := esError.ErrorCause - if cause.Type == "resource_already_exists_exception" { - return true, nil +func checkIntegrationInstalledElasticsearch(ctx context.Context, esClient *elasticsearch.Client, _ *logp.Logger) (bool, error) { + // TODO(axw) generate the list of expected index templates. + templates := []string{ + "traces-apm", + "traces-apm.sampled", + "metrics-apm.app", + "metrics-apm.internal", + "logs-apm.error", + } + for _, intervals := range []string{"1m", "10m", "60m"} { + for _, ds := range []string{"metrics-apm.transaction", "metrics-apm.service_transaction", "metrics-apm.service_destination", "metrics-apm.service_summary"} { + templates = append(templates, fmt.Sprintf("%s.%s", ds, intervals)) + } + } + // IndicesGetIndexTemplateRequest accepts a slice of template names, + // but the REST API expects just one index template name. Query them + // in parallel. + g, ctx := errgroup.WithContext(ctx) + for _, template := range templates { + template := template // copy for closure + g.Go(func() error { + req := esapi.IndicesGetIndexTemplateRequest{Name: template} + resp, err := req.Do(ctx, esClient) + if err != nil { + return err } - if cause.Reason != nil && strings.HasPrefix(*cause.Reason, "no matching index template") { - return false, nil + defer resp.Body.Close() + + if resp.IsError() { + body, _ := io.ReadAll(resp.Body) + return fmt.Errorf("unexpected HTTP status: %s (%s)", resp.Status(), bytes.TrimSpace(body)) } - } - return false, err + return nil + }) } - return true, nil + err := g.Wait() + return err == nil, err } diff --git a/internal/beater/server_test.go b/internal/beater/server_test.go index 98429cd9247..1249a41c4af 100644 --- a/internal/beater/server_test.go +++ b/internal/beater/server_test.go @@ -332,7 +332,7 @@ func TestServerOTLPGRPC(t *testing.T) { func TestServerWaitForIntegrationKibana(t *testing.T) { var requests int64 - requestCh := make(chan struct{}, 3) + requestCh := make(chan struct{}) mux := http.NewServeMux() mux.HandleFunc("/api/status", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`{"version":{"number":"1.2.3"}}`)) @@ -363,14 +363,6 @@ func TestServerWaitForIntegrationKibana(t *testing.T) { }, }))) - // Send some events to the server. They should be accepted and enqueued. - req := makeTransactionRequest(t, srv.URL) - req.Header.Add("Content-Type", "application/x-ndjson") - resp, err := srv.Client.Do(req) - assert.NoError(t, err) - assert.Equal(t, http.StatusAccepted, resp.StatusCode) - resp.Body.Close() - timeout := time.After(10 * time.Second) for i := 0; i < 3; i++ { select { @@ -395,8 +387,8 @@ func TestServerWaitForIntegrationKibana(t *testing.T) { func TestServerWaitForIntegrationElasticsearch(t *testing.T) { var mu sync.Mutex - var createDataStreamRequests int - createDataStreamRequestsCh := make(chan int) + var tracesRequests int + tracesRequestsCh := make(chan int) bulkCh := make(chan struct{}, 1) mux := http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { @@ -405,24 +397,17 @@ func TestServerWaitForIntegrationElasticsearch(t *testing.T) { // elasticsearch client to send bulk requests. fmt.Fprintln(w, `{"version":{"number":"1.2.3"}}`) }) - mux.HandleFunc("/_data_stream/", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/_index_template/", func(w http.ResponseWriter, r *http.Request) { mu.Lock() defer mu.Unlock() - name := path.Base(r.URL.Path) - if name != "traces-apm-testing" { - panic("unexpected data stream name: " + name) - } - createDataStreamRequests++ - switch createDataStreamRequests { - case 1: - w.WriteHeader(500) - case 2: - w.WriteHeader(400) - w.Write([]byte(`{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"no matching index template found for data stream [traces-apm-testing]"}],"type":"illegal_argument_exception","reason":"no matching index template found for data stream [traces-apm-testing]"},"status":400}`)) - case 3: - w.Write([]byte(`{"acknowledged":true}`)) + template := path.Base(r.URL.Path) + if template == "traces-apm" { + tracesRequests++ + if tracesRequests == 1 { + w.WriteHeader(404) + } + tracesRequestsCh <- tracesRequests } - createDataStreamRequestsCh <- createDataStreamRequests }) mux.HandleFunc("/_bulk", func(w http.ResponseWriter, r *http.Request) { select { @@ -437,7 +422,6 @@ func TestServerWaitForIntegrationElasticsearch(t *testing.T) { "apm-server": map[string]interface{}{ "wait_ready_interval": "100ms", "data_streams.wait_for_integration": true, - "data_streams.namespace": "testing", }, "output.elasticsearch": map[string]interface{}{ "hosts": []string{elasticsearchServer.URL}, @@ -472,8 +456,8 @@ func TestServerWaitForIntegrationElasticsearch(t *testing.T) { var done bool for !done { select { - case n := <-createDataStreamRequestsCh: - done = n == 3 + case n := <-tracesRequestsCh: + done = n == 2 case <-timeout: t.Fatal("timed out waiting for request") } @@ -487,7 +471,7 @@ func TestServerWaitForIntegrationElasticsearch(t *testing.T) { } logs := srv.Logs.FilterMessageSnippet("please install the apm integration") - assert.Len(t, logs.All(), 2, "couldn't find remediation message logs") + assert.Len(t, logs.All(), 1, "couldn't find remediation message logs") // Healthcheck should now report that the server is publish-ready. resp, err = srv.Client.Get(srv.URL + api.RootPath) @@ -506,7 +490,7 @@ func TestServerFailedPreconditionDoesNotIndex(t *testing.T) { // elasticsearch client to send bulk requests. fmt.Fprintln(w, `{"version":{"number":"1.2.3"}}`) }) - mux.HandleFunc("/_data_stream/traces-apm-default", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/_index_template/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(404) }) mux.HandleFunc("/_bulk", func(w http.ResponseWriter, r *http.Request) { diff --git a/internal/beater/waitready.go b/internal/beater/waitready.go index 50811a4d688..7bfaa6b04fd 100644 --- a/internal/beater/waitready.go +++ b/internal/beater/waitready.go @@ -21,7 +21,6 @@ import ( "context" "errors" "net/http" - "path" "time" "go.elastic.co/apm/v2" @@ -72,21 +71,27 @@ func waitReady( } // waitReadyRoundTripper wraps a *net/http.Transport, ensuring the server's -// indexing preconditions have been satisfied prior to allowing any indexing -// requests through. This is used to ensure we don't index any documents prior -// to the data stream index templates being ready. +// indexing preconditions have been satisfied by waiting for "ready" channel +// to be signalled, prior to allowing any requests through. +// +// This is used to prevent elasticsearch clients from proceeding with requests +// until the APM integration is installed to ensure we don't index any documents +// prior to the data stream index templates being ready. type waitReadyRoundTripper struct { *http.Transport - onBulk func(context.Context) error + ready <-chan struct{} + drain <-chan struct{} } var errServerShuttingDown = errors.New("server shutting down") func (c *waitReadyRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) { - if path.Base(r.URL.Path) == "_bulk" { - if err := c.onBulk(r.Context()); err != nil { - return nil, err - } + select { + case <-c.drain: + return nil, errServerShuttingDown + case <-c.ready: + case <-r.Context().Done(): + return nil, r.Context().Err() } return c.Transport.RoundTrip(r) } diff --git a/internal/sourcemap/processor.go b/internal/sourcemap/processor.go index 6b2174da390..003ce3f30d1 100644 --- a/internal/sourcemap/processor.go +++ b/internal/sourcemap/processor.go @@ -57,10 +57,10 @@ func (p BatchProcessor) ProcessBatch(ctx context.Context, batch *modelpb.Batch) if event.GetService().GetName() == "" || event.GetService().GetVersion() == "" { continue } - switch { - case event.Span != nil: + if event.Span != nil { p.processStacktraceFrames(ctx, event.Service, event.Span.Stacktrace...) - case event.Error != nil: + } + if event.Error != nil { if event.Error.Log != nil { p.processStacktraceFrames(ctx, event.Service, event.Error.Log.Stacktrace...) } diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile index b9f9a09c165..53beb1661ca 100644 --- a/packaging/docker/Dockerfile +++ b/packaging/docker/Dockerfile @@ -2,7 +2,7 @@ ARG BASE_IMAGE=ubuntu:22.04 # Build the apm-server binary. The golang image version is kept # up to date with go.mod by Makefile. -FROM golang:1.21.4 as builder +FROM golang:1.21.5 as builder WORKDIR /src COPY go.mod go.sum /src/ COPY internal/glog/go.mod /src/internal/glog/go.mod diff --git a/packaging/ironbank/Dockerfile b/packaging/ironbank/Dockerfile index ad597e69fe0..155ac876638 100644 --- a/packaging/ironbank/Dockerfile +++ b/packaging/ironbank/Dockerfile @@ -44,6 +44,9 @@ COPY LICENSE /licenses/elastic-${ELASTIC_PRODUCT} # Add a dumb init process COPY tinit /tinit RUN chmod +x /tinit +# Help with supporting the override in the ECK entrypoint +# TODO: eventually /tinit will be replaced by /usr/bin/tini +RUN ln -s /tinit /usr/bin/tini # Bring in product from the initial stage. COPY --from=prep_files --chown=1000:0 /usr/share/${ELASTIC_PRODUCT} /usr/share/${ELASTIC_PRODUCT} @@ -68,6 +71,7 @@ RUN groupadd --gid 1000 ${ELASTIC_PRODUCT} && useradd --uid 1000 --gid 1000 --ho USER ${ELASTIC_PRODUCT} EXPOSE 8200 +# TODO: eventually /tinit will be replaced by /usr/bin/tini ENTRYPOINT ["/tinit", "--", "/usr/share/apm-server/apm-server"] CMD ["-environment", "container"] diff --git a/packaging/ironbank/hardening_manifest.yaml b/packaging/ironbank/hardening_manifest.yaml index d456b73c335..c30bc656bd4 100644 --- a/packaging/ironbank/hardening_manifest.yaml +++ b/packaging/ironbank/hardening_manifest.yaml @@ -53,9 +53,6 @@ resources: # List of project maintainers maintainers: - - email: "nassim.kammah@elastic.co" - name: "Nassim Kammah" - username: "nassim.kammah" - email: "ivan.fernandez@elastic.co" name: "Ivan Fernandez Calvo" username: "ivan.fernandez" diff --git a/systemtest/approvals/TestIntake/Errors.approved.json b/systemtest/approvals/TestIntake/Errors.approved.json index 95efbeba3f6..466be37c138 100644 --- a/systemtest/approvals/TestIntake/Errors.approved.json +++ b/systemtest/approvals/TestIntake/Errors.approved.json @@ -27,12 +27,6 @@ "client.geo.location": [ "dynamic" ], - "client.geo.region_iso_code": [ - "dynamic" - ], - "client.geo.region_name": [ - "dynamic" - ], "client.ip": [ "12.53.12.1" ], diff --git a/systemtest/approvals/TestIntake/Events.approved.json b/systemtest/approvals/TestIntake/Events.approved.json index 01730dcfb7b..e03a5c1f8ea 100644 --- a/systemtest/approvals/TestIntake/Events.approved.json +++ b/systemtest/approvals/TestIntake/Events.approved.json @@ -791,12 +791,6 @@ "client.geo.location": [ "dynamic" ], - "client.geo.region_iso_code": [ - "dynamic" - ], - "client.geo.region_name": [ - "dynamic" - ], "client.ip": [ "12.53.12.1" ], diff --git a/systemtest/approvals/TestIntake/Transactions.approved.json b/systemtest/approvals/TestIntake/Transactions.approved.json index 83281a6eb7b..a3df939ae5d 100644 --- a/systemtest/approvals/TestIntake/Transactions.approved.json +++ b/systemtest/approvals/TestIntake/Transactions.approved.json @@ -445,12 +445,6 @@ "client.geo.location": [ "dynamic" ], - "client.geo.region_iso_code": [ - "dynamic" - ], - "client.geo.region_name": [ - "dynamic" - ], "client.ip": [ "12.53.12.1" ], diff --git a/systemtest/approvals/TestIntake/TransactionsHugeTraces.approved.json b/systemtest/approvals/TestIntake/TransactionsHugeTraces.approved.json index 6507c06df7b..c3b48460971 100644 --- a/systemtest/approvals/TestIntake/TransactionsHugeTraces.approved.json +++ b/systemtest/approvals/TestIntake/TransactionsHugeTraces.approved.json @@ -24,12 +24,6 @@ "client.geo.location": [ "dynamic" ], - "client.geo.region_iso_code": [ - "dynamic" - ], - "client.geo.region_name": [ - "dynamic" - ], "client.ip": [ "12.53.12.1" ], diff --git a/systemtest/approvals/TestJaeger/batch_0.approved.json b/systemtest/approvals/TestJaeger/batch_0.approved.json index 6d2e8adb656..3484db6e060 100644 --- a/systemtest/approvals/TestJaeger/batch_0.approved.json +++ b/systemtest/approvals/TestJaeger/batch_0.approved.json @@ -502,7 +502,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" @@ -573,6 +576,9 @@ "transaction.name.text": [ "Driver::findNearest" ], + "transaction.result": [ + "Success" + ], "transaction.sampled": [ true ], diff --git a/systemtest/approvals/TestJaeger/batch_1.approved.json b/systemtest/approvals/TestJaeger/batch_1.approved.json index d765ad08e9d..71f7aef4764 100644 --- a/systemtest/approvals/TestJaeger/batch_1.approved.json +++ b/systemtest/approvals/TestJaeger/batch_1.approved.json @@ -413,7 +413,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" @@ -496,7 +499,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" @@ -579,7 +585,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" @@ -748,7 +757,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" @@ -917,7 +929,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" @@ -1000,7 +1015,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" @@ -1083,7 +1101,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" @@ -1166,7 +1187,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" @@ -1249,7 +1273,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" @@ -1332,7 +1359,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" @@ -1415,7 +1445,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "host.hostname": [ "host01" diff --git a/systemtest/approvals/TestOTLPGRPCTraces.approved.json b/systemtest/approvals/TestOTLPGRPCTraces.approved.json index dee4990f459..dbcfe453a16 100644 --- a/systemtest/approvals/TestOTLPGRPCTraces.approved.json +++ b/systemtest/approvals/TestOTLPGRPCTraces.approved.json @@ -203,7 +203,10 @@ "traces" ], "event.outcome": [ - "unknown" + "success" + ], + "event.success_count": [ + 1 ], "labels.resource_attribute_array": [ "a", @@ -276,6 +279,9 @@ "transaction.representative_count": [ 1 ], + "transaction.result": [ + "Success" + ], "transaction.sampled": [ true ], diff --git a/systemtest/otlp_test.go b/systemtest/otlp_test.go index 71033c7c802..069614d2095 100644 --- a/systemtest/otlp_test.go +++ b/systemtest/otlp_test.go @@ -194,7 +194,14 @@ func TestOTLPGRPCMetrics(t *testing.T) { int64Histogram.Record(context.Background(), 123) int64Histogram.Record(context.Background(), 1024) int64Histogram.Record(context.Background(), 20000) - }) + }, sdkmetric.NewView( + sdkmetric.Instrument{Name: "*histogram"}, + sdkmetric.Stream{ + Aggregation: sdkmetric.AggregationExplicitBucketHistogram{ + Boundaries: []float64{0, 1, 100, 1000, 10000}, + }, + }, + )) require.NoError(t, err) // opentelemetry-go does not support sending Summary metrics, @@ -225,6 +232,39 @@ func TestOTLPGRPCMetrics(t *testing.T) { assert.True(t, gjson.GetBytes(doc.RawSource, "beats_stats.metrics.apm-server.otlp.grpc.metrics.consumer").Exists()) } +func TestOTLPGRPCMetrics_partialSuccess(t *testing.T) { + systemtest.CleanupElasticsearch(t) + srv := apmservertest.NewUnstartedServerTB(t) + srv.Config.Monitoring = newFastMonitoringConfig() + err := srv.Start() + require.NoError(t, err) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + err = sendOTLPMetrics(t, ctx, srv, func(meter metric.Meter) { + float64Counter, err := meter.Float64Counter("counter") + require.NoError(t, err) + float64Counter.Add(context.Background(), 1) + + int64Histogram, err := meter.Int64Histogram("histogram") + require.NoError(t, err) + int64Histogram.Record(context.Background(), 1) + int64Histogram.Record(context.Background(), 123) + int64Histogram.Record(context.Background(), 1024) + int64Histogram.Record(context.Background(), 20000) + }, sdkmetric.NewView( + sdkmetric.Instrument{Name: "*histogram"}, + sdkmetric.Stream{ + Aggregation: sdkmetric.AggregationBase2ExponentialHistogram{ + MaxSize: 5, + MaxScale: -10, + }, + }, + )) + + require.ErrorContains(t, err, "OTLP partial success:") +} + func TestOTLPGRPCLogs(t *testing.T) { systemtest.CleanupElasticsearch(t) srv := apmservertest.NewServerTB(t) @@ -594,22 +634,14 @@ func sendOTLPMetrics( ctx context.Context, srv *apmservertest.Server, recordMetrics func(metric.Meter), + mv sdkmetric.View, ) error { exporter := newOTLPMetricExporter(t, srv) meterProvider := sdkmetric.NewMeterProvider( sdkmetric.WithReader( sdkmetric.NewPeriodicReader(exporter, sdkmetric.WithInterval(time.Minute)), ), - sdkmetric.WithView( - sdkmetric.NewView( - sdkmetric.Instrument{Name: "*histogram"}, - sdkmetric.Stream{ - Aggregation: sdkmetric.AggregationExplicitBucketHistogram{ - Boundaries: []float64{0, 1, 100, 1000, 10000}, - }, - }, - ), - ), + sdkmetric.WithView(mv), ) meter := meterProvider.Meter("test-meter") diff --git a/systemtest/rum_test.go b/systemtest/rum_test.go index d082d0b12b2..d48659dc205 100644 --- a/systemtest/rum_test.go +++ b/systemtest/rum_test.go @@ -110,7 +110,7 @@ func TestRUMAllowServiceNames(t *testing.T) { respBody, _ := io.ReadAll(resp.Body) assert.Equal(t, http.StatusForbidden, resp.StatusCode, string(respBody)) - assert.Equal(t, `{"accepted":0,"errors":[{"message":"unauthorized: anonymous access not permitted for service \"disallowed\""}]}`+"\n", string(respBody)) + assert.Equal(t, `{"accepted":0,"errors":[{"message":"cannot handle stream: cannot process batch: unauthorized: anonymous access not permitted for service \"disallowed\""}]}`+"\n", string(respBody)) } func TestRUMRateLimit(t *testing.T) { diff --git a/testing/infra/k8s/base/stack/apm-server.yaml b/testing/infra/k8s/base/stack/apm-server.yaml index 7815c07e525..d2e46a4ecd5 100644 --- a/testing/infra/k8s/base/stack/apm-server.yaml +++ b/testing/infra/k8s/base/stack/apm-server.yaml @@ -3,7 +3,7 @@ kind: ApmServer metadata: name: apm-server spec: - version: 8.12.0-33e8d7e1-SNAPSHOT + version: 8.13.0-4aavtlfc-SNAPSHOT count: 1 http: tls: diff --git a/testing/infra/k8s/base/stack/elasticsearch.yaml b/testing/infra/k8s/base/stack/elasticsearch.yaml index 88ae897326f..c73e8864c2f 100644 --- a/testing/infra/k8s/base/stack/elasticsearch.yaml +++ b/testing/infra/k8s/base/stack/elasticsearch.yaml @@ -3,7 +3,7 @@ kind: Elasticsearch metadata: name: elasticsearch spec: - version: 8.12.0-33e8d7e1-SNAPSHOT + version: 8.13.0-4aavtlfc-SNAPSHOT auth: fileRealm: - secretName: elasticsearch-admin diff --git a/testing/infra/k8s/base/stack/kibana.yaml b/testing/infra/k8s/base/stack/kibana.yaml index 233a7cd492a..c1b21ba829e 100644 --- a/testing/infra/k8s/base/stack/kibana.yaml +++ b/testing/infra/k8s/base/stack/kibana.yaml @@ -3,7 +3,7 @@ kind: Kibana metadata: name: kibana spec: - version: 8.12.0-33e8d7e1-SNAPSHOT + version: 8.13.0-4aavtlfc-SNAPSHOT count: 1 elasticsearchRef: name: elasticsearch diff --git a/testing/smoke/lib.sh b/testing/smoke/lib.sh index 0fe19a2d731..e1c896d4f9e 100644 --- a/testing/smoke/lib.sh +++ b/testing/smoke/lib.sh @@ -17,7 +17,8 @@ get_versions() { local RC=0 RES=$(curl_fail -H "Authorization: ApiKey ${EC_API_KEY}" ${EC_VERSION_ENDPOINT}) || RC=$? if [ $RC -ne 0 ]; then echo "${RES}"; fi - VERSIONS=$(echo "${RES}" | jq -r -c '[.stacks[].version | select(. | contains("-") | not)] | sort') + # NOTE: jq with semver requires some numeric transformation with sort_by + VERSIONS=$(echo "${RES}" | jq -r -c '[.stacks[].version | select(. | contains("-") | not)] | sort_by(.| split(".") | map(tonumber))') } get_latest_patch() { @@ -38,7 +39,9 @@ get_latest_snapshot() { local RC=0 RES=$(curl_fail -H "Authorization: ApiKey ${EC_API_KEY}" ${EC_VERSION_ENDPOINT}) || RC=$? if [ $RC -ne 0 ]; then echo "${RES}"; fi - VERSIONS=$(echo "${RES}" | jq -r -c '[.stacks[].version | select(. | contains("-"))] | sort') + # NOTE: semver with SNAPSHOT is not working when using the sort_by function in jq, + # that's the reason for transforming the SNAPSHOT in a semver 4 digits. + VERSIONS=$(echo "${RES}" | jq -r -c '[.stacks[].version | select(. | contains("-SNAPSHOT"))] | sort' | sed 's#-SNAPSHOT#.0#g' | jq -r -c ' sort_by(.| split(".") | map(tonumber))' | sed 's#.0"#-SNAPSHOT"#g' | jq -r -c .) } terraform_init() { diff --git a/tools/go.mod b/tools/go.mod index 4420589b94f..01156878337 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -49,7 +49,6 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect github.com/ProtonMail/gopenpgp/v2 v2.7.3 // indirect - github.com/acomagu/bufpipe v1.0.4 // indirect github.com/agext/levenshtein v1.2.3 // indirect github.com/akavel/rsrc v0.10.2 // indirect github.com/andybalholm/brotli v1.0.4 // indirect @@ -89,7 +88,7 @@ require ( github.com/go-errors/errors v1.4.2 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-git/go-git/v5 v5.9.0 // indirect + github.com/go-git/go-git/v5 v5.11.0 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/errors v0.20.3 // indirect @@ -106,7 +105,7 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-github/v32 v32.1.0 // indirect github.com/google/go-github/v39 v39.2.0 // indirect github.com/google/go-github/v45 v45.2.0 // indirect @@ -196,7 +195,7 @@ require ( github.com/shirou/gopsutil/v3 v3.23.8 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/skeema/knownhosts v1.2.0 // indirect + github.com/skeema/knownhosts v1.2.1 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/cobra v1.7.0 // indirect @@ -227,15 +226,15 @@ require ( go.opencensus.io v0.24.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect golang.org/x/build v0.0.0-20220908145327-656fd833c864 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.17.0 // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.13.0 // indirect golang.org/x/tools/go/vcs v0.1.0-deprecated // indirect diff --git a/tools/go.sum b/tools/go.sum index 263ea84e67b..618a486abf4 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -99,8 +99,6 @@ github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ek github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw= github.com/ProtonMail/gopenpgp/v2 v2.7.3 h1:AJu1OI/1UWVYZl6QcCLKGu9OTngS2r52618uGlje84I= github.com/ProtonMail/gopenpgp/v2 v2.7.3/go.mod h1:IhkNEDaxec6NyzSI0PlxapinnwPVIESk8/76da3Ct3g= -github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= -github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= @@ -246,10 +244,10 @@ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66D github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo= -github.com/go-git/go-git/v5 v5.9.0 h1:cD9SFA7sHVRdJ7AYck1ZaAa/yeuBvGPxwXDL8cxrObY= -github.com/go-git/go-git/v5 v5.9.0/go.mod h1:RKIqga24sWdMGZF+1Ekv9kylsDz6LzdTSI2s/OsZWE0= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= +github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 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= @@ -342,8 +340,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II= github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= github.com/google/go-github/v39 v39.2.0 h1:rNNM311XtPOz5rDdsJXAp2o8F67X9FnROXTvto3aSnQ= @@ -542,7 +541,6 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/markbates/pkger v0.17.0/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/markbates/pkger v0.17.1 h1:/MKEtWqtc0mZvu9OinB9UzVN9iYCwLWuyUv4Bw+PCno= github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= -github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -700,8 +698,8 @@ 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.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM= -github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= +github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= +github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= @@ -853,8 +851,8 @@ golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -945,8 +943,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1048,8 +1046,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1058,8 +1056,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1074,8 +1072,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=