From 9bb7357e176492e9c5b98324e3ba6c514ed0f4dd Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Fri, 11 Oct 2024 06:44:32 -0700 Subject: [PATCH 01/76] Add public analytics dashboard to readme (#5381) Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Severin Neumann --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 9a2c86de3d00..dee55cf0ff9e 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ This is the source repository for the [OpenTelemetry][] website, project documentation, and blog. The site is [built][contributing.md] using [Hugo][] and is hosted on [Netlify][]. +Public analytics for the website is [available here][]. + ## Get involved To learn how to contribute fixes and new content to this project, read the @@ -101,3 +103,5 @@ contributed][contributors]! [slack]: https://slack.cncf.io/ [hugo]: https://gohugo.io [netlify]: https://netlify.com +[available here]: + https://lookerstudio.google.com/reporting/34c2a65a-39e8-44aa-afa0-094975fee55d/page/4VDGB From 9b7da35fd7abd77d867177902b36d95e5f322182 Mon Sep 17 00:00:00 2001 From: "John L. Peterson (Jack)" Date: Fri, 11 Oct 2024 10:21:33 -0400 Subject: [PATCH 02/76] Update custom-collector.md (#5363) --- content/en/docs/collector/custom-collector.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/en/docs/collector/custom-collector.md b/content/en/docs/collector/custom-collector.md index d476c8e3b307..5f2c874fc784 100644 --- a/content/en/docs/collector/custom-collector.md +++ b/content/en/docs/collector/custom-collector.md @@ -166,11 +166,11 @@ receivers: go.opentelemetry.io/collector/receiver/otlpreceiver {{% version-from-registry collector-receiver-otlp %}} providers: - - gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v1.16.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v1.16.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v0.110.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.110.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.110.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v1.17.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v1.17.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v1.17.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.17.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.17.0 ``` {{% alert color="primary" title="Tip" %}} From 2d14f16ad58a106628b4ebd563343ca60fbae9e7 Mon Sep 17 00:00:00 2001 From: Miguel Luna <39376769+mlunadia@users.noreply.github.com> Date: Sat, 12 Oct 2024 16:52:53 +0100 Subject: [PATCH 03/76] Update es-palabras.txt (#5392) --- .cspell/es-palabras.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.cspell/es-palabras.txt b/.cspell/es-palabras.txt index 73807ec34e1b..8d062d7535b9 100644 --- a/.cspell/es-palabras.txt +++ b/.cspell/es-palabras.txt @@ -7,3 +7,9 @@ microservicios extensibilidad correlacionarse deserializa +proprietarias +aspiracional +deserializar +Muestreadores +muestreadores +monitoreo From aa82c4c4e8366ff87dbbcaf4096809913c7465ec Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Sun, 13 Oct 2024 04:18:38 -0500 Subject: [PATCH 04/76] Auto-update registry versions (b4ae4aa3551063ab7e1e0571f00414cb9bd9ae30) (#5394) --- data/registry/exporter-dotnet-azure.yml | 2 +- data/registry/instrumentation-go-xsam-database-sql.yml | 2 +- data/registry/instrumentation-js-remix.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/registry/exporter-dotnet-azure.yml b/data/registry/exporter-dotnet-azure.yml index b5e646a86e0a..ae205e61a51a 100644 --- a/data/registry/exporter-dotnet-azure.yml +++ b/data/registry/exporter-dotnet-azure.yml @@ -13,7 +13,7 @@ authors: package: name: Azure.Monitor.OpenTelemetry.Exporter registry: nuget - version: 1.4.0-beta.1 + version: 1.4.0-beta.2 urls: repo: https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter createdAt: 2021-11-01 diff --git a/data/registry/instrumentation-go-xsam-database-sql.yml b/data/registry/instrumentation-go-xsam-database-sql.yml index 61a3c46e1d62..0a22dce3358b 100644 --- a/data/registry/instrumentation-go-xsam-database-sql.yml +++ b/data/registry/instrumentation-go-xsam-database-sql.yml @@ -16,7 +16,7 @@ isFirstParty: false package: name: github.com/XSAM/otelsql registry: go - version: v0.34.0 + version: v0.35.0 urls: repo: https://github.com/XSAM/otelsql createdAt: 2021-10-12 diff --git a/data/registry/instrumentation-js-remix.yml b/data/registry/instrumentation-js-remix.yml index 06d3463808a0..54ccaa42ca29 100644 --- a/data/registry/instrumentation-js-remix.yml +++ b/data/registry/instrumentation-js-remix.yml @@ -17,5 +17,5 @@ createdAt: 2022-02-10 package: registry: npm name: opentelemetry-instrumentation-remix - version: 0.7.1 + version: 0.8.0 isFirstParty: false From 9662135e87a4138af893890f46ba69a65eb80adb Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Sun, 13 Oct 2024 04:19:02 -0500 Subject: [PATCH 05/76] Update opentelemetry-java version to v1.43.0 (#5388) --- content/en/docs/languages/java/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/languages/java/_index.md b/content/en/docs/languages/java/_index.md index 8349448c580f..e69686567dad 100644 --- a/content/en/docs/languages/java/_index.md +++ b/content/en/docs/languages/java/_index.md @@ -7,7 +7,7 @@ aliases: [/java, /java/metrics, /java/tracing] cascade: vers: instrumentation: 2.8.0 - otel: 1.42.1 + otel: 1.43.0 contrib: 1.38.0 semconv: 1.27.0 weight: 18 From 840172755075253b2181df43648dff16293ae099 Mon Sep 17 00:00:00 2001 From: Vengal Rao Guttha <119367623+sfc-gh-vguttha@users.noreply.github.com> Date: Mon, 14 Oct 2024 02:38:43 -0700 Subject: [PATCH 06/76] Fix Prometheus config example (#5397) --- content/en/docs/collector/internal-telemetry.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/en/docs/collector/internal-telemetry.md b/content/en/docs/collector/internal-telemetry.md index 16e6082446fe..2af0b71a4e0b 100644 --- a/content/en/docs/collector/internal-telemetry.md +++ b/content/en/docs/collector/internal-telemetry.md @@ -36,11 +36,11 @@ service: telemetry: metrics: readers: - pull: - exporter: - prometheus: - host: '0.0.0.0' - port: 8888 + - pull: + exporter: + prometheus: + host: '0.0.0.0' + port: 8888 ``` You can adjust the verbosity of the Collector metrics output by setting the From d3196929b4660a98358567c7f9e2ac715c289add Mon Sep 17 00:00:00 2001 From: Isabelle Guitton <48676092+iguitton@users.noreply.github.com> Date: Mon, 14 Oct 2024 16:19:59 +0200 Subject: [PATCH 07/76] Issue 5384: Created the home page for French localization (#5386) Co-authored-by: Bertrand Martin <32521698+bertysentry@users.noreply.github.com> Co-authored-by: Severin Neumann Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Damien Mathieu <42@dmathieu.com> --- .cspell.yml | 4 ++ .cspell/fr-mots.txt | 49 +++++++++++++++++++++ content/fr/_index.md | 100 +++++++++++++++++++++++++++++++++++++++++++ hugo.yaml | 17 ++++++++ package.json | 1 + 5 files changed, 171 insertions(+) create mode 100644 .cspell/fr-mots.txt create mode 100644 content/fr/_index.md diff --git a/.cspell.yml b/.cspell.yml index 093e65ff96e3..8e7b3da37da6 100644 --- a/.cspell.yml +++ b/.cspell.yml @@ -5,6 +5,7 @@ version: '0.2' language: en-US import: - '@cspell/dict-es-es/cspell-ext.json' + - '@cspell/dict-fr-fr/cspell-ext.json' - '@cspell/dict-pt-br/cspell-ext.json' caseSensitive: true ignorePaths: @@ -31,6 +32,8 @@ dictionaryDefinitions: path: .cspell/en-words.txt - name: es-palabras path: .cspell/es-palabras.txt + - name: fr-mots + path: .cspell/fr-mots.txt - name: pt-palavras path: .cspell/pt-palavras.txt dictionaries: @@ -40,6 +43,7 @@ dictionaries: # Local word lists - en-words - es-palabras + - fr-mots - pt-palavras # Programming languages and software terms - cpp diff --git a/.cspell/fr-mots.txt b/.cspell/fr-mots.txt new file mode 100644 index 000000000000..24bf98df272d --- /dev/null +++ b/.cspell/fr-mots.txt @@ -0,0 +1,49 @@ +analyse +analyser +avec +collecter +collectez +comportement +contenant +créez +dans +découvrez +définie +démo +dessous +données +d'utiliser +efficace +entièrement +être +générer +gratuit +indépendant +instrumenter +intégrations +langages +librairies +logiciels +métriques +nombreux +nombreuses +observabilité +outils +permet +permettant +projet +projets +peut +qualité +savoir +s'intègre +supporte +supporté +tant +télémétrie +transmettez +universelle +utilisé +visuel +votre +vous \ No newline at end of file diff --git a/content/fr/_index.md b/content/fr/_index.md new file mode 100644 index 000000000000..35510acdf412 --- /dev/null +++ b/content/fr/_index.md @@ -0,0 +1,100 @@ +--- +title: OpenTelemetry +description: >- + Une télémétrie de qualité, universelle et portable pour une observabilité + efficace +outputs: + - HTML + - REDIRECTS # Include this `content/fr` ONLY +developer_note: + La macro "blocks/cover" définie ci-dessous permet d'utiliser comme image de + fond tout visuel contenant "background" dans son nom. +show_banner: true +default_lang_commit: 90dcedd7f692a505eb86145734b1e323ec988820 +--- + +
+ +{{< blocks/cover image_anchor="top" height="max" color="primary" >}} + + +![OpenTelemetry](/img/logos/opentelemetry-horizontal-color.svg) +{.otel-logo} + + +{{% param description %}} +{.display-6} + +
+ +- [En savoir plus](docs/what-is-opentelemetry/) +- [Tester la démo](docs/demo/) + +
+ +
+Découvrez OpenTelemetry en tant que: +
+
+ +- [Dev](docs/getting-started/dev/) +- [Ops](docs/getting-started/ops/) + +
+{{< /blocks/cover >}} + +{{% blocks/lead color="white" %}} + +OpenTelemetry met à votre disposition un ensemble d'APIs, de SDKs et d'outils +vous permettant d'instrumenter, de générer, de collecter et d'exporter des +métriques, des logs et des traces (les "données de télémétrie") pour analyser la +performance et le comportement de vos logiciels. + +> OpenTelemetry [supporte](/status/) de nombreux [langages](docs/languages/) et +> peut être utilisé en production. + +{{% /blocks/lead %}} + +{{% blocks/section color="dark" type="row" %}} + +{{% blocks/feature icon="fas fa-chart-line" title="Traces, Métriques, Logs" url="docs/concepts/observability-primer/" %}} + +Créez et collectez des données de télémétrie pour vos services et vos logiciels, +transmettez-les à une multitude d'outils d'analyse. + +{{% /blocks/feature %}} + +{{% blocks/feature icon="fas fa-magic" title="Instrumentation & Intégrations clé en main" %}} + +OpenTelemetry [s'intègre] avec de nombreuses librairies et frameworks et propose +une [instrumentation] _code et no-code_. + +[instrumentation]: /docs/concepts/instrumentation/ +[s'intègre]: /ecosystem/integrations/ + +{{% /blocks/feature %}} + +{{% blocks/feature icon="fab fa-github" title="Open Source, Indépendant" %}} + +Entièrement gratuit et open source, OpenTelemetry est [utilisé] et supporté par +des [leaders] du marché de l'observabilité. + +[utilisé]: /ecosystem/adopters/ +[leaders]: /ecosystem/vendors/ + +{{% /blocks/feature %}} + +{{% /blocks/section %}} + +{{% blocks/section color="secondary" type="cncf" %}} + +**OpenTelemetry est un projet [CNCF][] en phase d'[incubation]**.
Né de la +fusion des projets OpenTracing et OpenCensus. + +[![CNCF logo][]][cncf] + +[cncf]: https://cncf.io +[cncf logo]: /img/logos/cncf-white.svg +[incubation]: https://www.cncf.io/projects/ + +{{% /blocks/section %}} diff --git a/hugo.yaml b/hugo.yaml index c102ecf54a22..9c044f2e19e3 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -20,6 +20,10 @@ languages: languageName: Español params: description: Sitio del proyecto OpenTelemetry + fr: + languageName: Français + params: + description: Site du projet OpenTelemetry ja: languageName: 日本語 (Japanese) params: @@ -259,6 +263,19 @@ module: target: content/docs lang: es + ## fr + - source: content/fr + target: content + lang: fr + # fallback pages + - source: content/en/announcements + target: content/announcements + lang: fr + - excludeFiles: specs/* + source: content/en/docs + target: content/docs + lang: fr + ## ja - source: content/ja target: content diff --git a/package.json b/package.json index 983391a16dac..ed05f392b032 100644 --- a/package.json +++ b/package.json @@ -112,6 +112,7 @@ }, "devDependencies": { "@cspell/dict-es-es": "^3.0.0", + "@cspell/dict-fr-fr": "^2.2.2", "@cspell/dict-pt-br": "^2.3.0", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", From 671e49e4c1c1650171ec5dd555e04b7a13a4f1e3 Mon Sep 17 00:00:00 2001 From: Severin Neumann Date: Mon, 14 Oct 2024 20:13:06 +0200 Subject: [PATCH 08/76] Add fr to component label and owners (#5402) Signed-off-by: svrnm --- .github/component-label-map.yml | 4 ++++ .github/component-owners.yml | 3 +++ 2 files changed, 7 insertions(+) diff --git a/.github/component-label-map.yml b/.github/component-label-map.yml index 5d46cf7e0ced..9caa5a08906b 100644 --- a/.github/component-label-map.yml +++ b/.github/component-label-map.yml @@ -22,6 +22,10 @@ lang:es: - changed-files: - any-glob-to-any-file: - content/es/** +lang:fr: + - changed-files: + - any-glob-to-any-file: + - content/fr/** sig:cpp: - changed-files: - any-glob-to-any-file: diff --git a/.github/component-owners.yml b/.github/component-owners.yml index 65d9e881b1b0..2cba8f7d7a1b 100644 --- a/.github/component-owners.yml +++ b/.github/component-owners.yml @@ -80,3 +80,6 @@ components: content/es: - open-telemetry/docs-maintainers - open-telemetry/docs-es-approvers + content/fr: + - open-telemetry/docs-maintainers + - open-telemetry/docs-fr-approvers From 7ab2f7fd82cf6d2c59cb8640a00b96a2750d8c61 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Mon, 14 Oct 2024 23:18:35 -0700 Subject: [PATCH 09/76] Update JS Counters header to be consistent (#5389) --- content/en/docs/languages/js/instrumentation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/languages/js/instrumentation.md b/content/en/docs/languages/js/instrumentation.md index 6e21ab2c95c6..33613f51ea14 100644 --- a/content/en/docs/languages/js/instrumentation.md +++ b/content/en/docs/languages/js/instrumentation.md @@ -1508,7 +1508,7 @@ Now that you have [meters](/docs/concepts/signals/metrics/#meter) initialized. you can create [metric instruments](/docs/concepts/signals/metrics/#metric-instruments). -### Create counters +### Using counters Counters can be used to measure a non-negative, increasing value. From 71833a5f8b84110dadf1e98604b87a900724ac33 Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Tue, 15 Oct 2024 09:23:39 +0200 Subject: [PATCH 10/76] Document some quirks with Python otel operator based auto-instrumentation (#5338) Co-authored-by: Fabrizio Ferri-Benedetti Co-authored-by: Tiffany Hrabusa <30397949+tiffany76@users.noreply.github.com> --- .../en/docs/kubernetes/operator/automatic.md | 9 ++++++++- content/en/docs/zero-code/python/operator.md | 17 ++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/content/en/docs/kubernetes/operator/automatic.md b/content/en/docs/kubernetes/operator/automatic.md index cd3be74751db..2435e060b81a 100644 --- a/content/en/docs/kubernetes/operator/automatic.md +++ b/content/en/docs/kubernetes/operator/automatic.md @@ -428,9 +428,16 @@ spec: instrumentation> ``` +See the +[Python agent configuration docs](/docs/zero-code/python/configuration/#disabling-specific-instrumentations) +for more details. + #### Learn more {#python-learn-more} -[See the Python agent Configuration docs for more details.](/docs/zero-code/python/configuration/#disabling-specific-instrumentations) +For Python-specific quirks, see +[Python OpenTelemetry Operator docs](/docs/zero-code/python/operator/#python-specific-topics) +and the +[Python agent configuration docs](/docs/zero-code/python/configuration/). ### Go diff --git a/content/en/docs/zero-code/python/operator.md b/content/en/docs/zero-code/python/operator.md index a08fd5e0219d..7675786a8563 100644 --- a/content/en/docs/zero-code/python/operator.md +++ b/content/en/docs/zero-code/python/operator.md @@ -3,7 +3,7 @@ title: Using the OpenTelemetry Operator to Inject Auto-Instrumentation linkTitle: Operator aliases: [/docs/languages/python/automatic/operator] weight: 30 -cSpell:ignore: distro mkdir uninstrumented virtualenv +cSpell:ignore: distro grpcio mkdir psutil uninstrumented virtualenv --- If you run your Python service in Kubernetes, you can take advantage of the @@ -11,3 +11,18 @@ If you run your Python service in Kubernetes, you can take advantage of the to inject auto-instrumentation without having to modify each of your services directly. [See the OpenTelemetry Operator Auto-instrumentation docs for more details.](/docs/kubernetes/operator/automatic/) + +### Python-specific topics + +#### Libraries with binary wheels + +Some Python packages we instrument or need in our instrumentation libraries, +might ship with some binary code. This is the case, for example, of `grpcio` and +`psutil` (used in `opentelemetry-instrumentation-system-metrics`). + +The binary code is tied to a specific C library version (glibc or musl) and to a +specific Python version. The +[OpenTelemetry Operator](https://github.com/open-telemetry/opentelemetry-operator) +provides images for a single Python version based on the glibc C library. If you +want to use it you might need to build your own image operator Docker image for +Python auto-instrumentation. From 0f8bba1fd1d1817a72a7280b1fe9292fff94c0c1 Mon Sep 17 00:00:00 2001 From: Daniel Gomez Blanco Date: Tue, 15 Oct 2024 18:34:16 +0100 Subject: [PATCH 11/76] New blogpost for GC 2024 candidates (#5410) --- content/en/blog/2024/gc-candidates.md | 36 +++++++++++++++++++++++++++ static/refcache.json | 4 +++ 2 files changed, 40 insertions(+) create mode 100644 content/en/blog/2024/gc-candidates.md diff --git a/content/en/blog/2024/gc-candidates.md b/content/en/blog/2024/gc-candidates.md new file mode 100644 index 000000000000..0a2a9fc5c02b --- /dev/null +++ b/content/en/blog/2024/gc-candidates.md @@ -0,0 +1,36 @@ +--- +title: + Announcing the 2024 OpenTelemetry Governance Committee Election Candidates +linkTitle: 2024 GC Candidates +date: 2024-10-15 +author: OpenTelemetry Governance Committee +cSpell:ignore: Baeyens Danielson Marylia +--- + +The OpenTelemetry election committee is excited to announce the final list of +candidates for the upcoming 2024 OpenTelemetry Governance Committee Election! + +If you are an +[eligible voter](https://github.com/open-telemetry/community/blob/main/elections/2024/governance-committee-election.md#voter-eligibility), +you’ll have the opportunity to continue shaping the future of OpenTelemetry by +casting your vote between 21 October 2024 00:00 UTC and 23 October 2024 23:59 +UTC. You'll be selecting your preferred candidates to fill the four available +seats in this year's election. + +You can find the candidates' pictures, profile link, and descriptions on the +[candidates page](https://github.com/open-telemetry/community/blob/main/elections/2024/governance-committee-candidates.md). +Here are their names: + +- Adriana Villela +- Alolita Sharma +- Daniel Dyla +- Jamie Danielson +- Marylia Gutierrez +- Morgan McLean +- Pablo Baeyens Fernández +- Trask Stalnaker + +You can check your eligibility by reviewing +[this GitHub issue](https://github.com/open-telemetry/community/issues/2329). If +you are not listed there but believe you have the right to vote, kindly +[fill out this registration form](https://forms.gle/LBvyRpNwZvqcJxUbA). diff --git a/static/refcache.json b/static/refcache.json index adad2b4c45fd..799529e377a0 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -5899,6 +5899,10 @@ "StatusCode": 200, "LastSeen": "2024-08-23T20:33:47.852068252Z" }, + "https://github.com/open-telemetry/community/issues/2329": { + "StatusCode": 200, + "LastSeen": "2024-10-15T15:52:36.027937+01:00" + }, "https://github.com/open-telemetry/community/issues/828": { "StatusCode": 200, "LastSeen": "2024-01-18T19:37:16.771654-05:00" From 9f8c26f956df8042d80a8ab332edca679b1adb70 Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Wed, 16 Oct 2024 00:50:46 -0500 Subject: [PATCH 12/76] Auto-update registry versions (ce522a2c4f6df417c82c34fc4e77ce34cf5bbd03) (#5416) --- data/registry/instrumentation-js-prisma.yml | 2 +- data/registry/instrumentation-php-laravel.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/registry/instrumentation-js-prisma.yml b/data/registry/instrumentation-js-prisma.yml index 6e822eb2f803..fb463f9b2e15 100644 --- a/data/registry/instrumentation-js-prisma.yml +++ b/data/registry/instrumentation-js-prisma.yml @@ -17,5 +17,5 @@ createdAt: 2022-08-25 package: registry: npm name: '@prisma/instrumentation' - version: 5.20.0 + version: 5.21.0 isFirstParty: true diff --git a/data/registry/instrumentation-php-laravel.yml b/data/registry/instrumentation-php-laravel.yml index 1aaf1e2f4ace..bee5f2b34eec 100644 --- a/data/registry/instrumentation-php-laravel.yml +++ b/data/registry/instrumentation-php-laravel.yml @@ -15,5 +15,5 @@ createdAt: 2023-05-22 package: registry: packagist name: open-telemetry/opentelemetry-auto-laravel - version: 0.0.28 + version: 1.0.0 isFirstParty: false From 8a0737297dde435446ce1ec0b165eb7c93bb4e1b Mon Sep 17 00:00:00 2001 From: Vitor Vasconcellos Date: Wed, 16 Oct 2024 02:56:26 -0300 Subject: [PATCH 13/76] [pt] Initialize translations for /pt/docs/languages/go (#5346) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marylia Gutierrez Co-authored-by: Marylia Gutierrez Co-authored-by: Emídio Neto <9735060+emdneto@users.noreply.github.com> --- content/pt/docs/languages/go/_index.md | 15 + content/pt/docs/languages/go/api.md | 9 + content/pt/docs/languages/go/examples.md | 8 + .../pt/docs/languages/go/getting-started.md | 1177 +++++++++++++++++ layouts/partials/pt/docs/latest-release.md | 7 + .../pt/docs/languages/index-intro.md | 28 + 6 files changed, 1244 insertions(+) create mode 100644 content/pt/docs/languages/go/_index.md create mode 100644 content/pt/docs/languages/go/api.md create mode 100644 content/pt/docs/languages/go/examples.md create mode 100644 content/pt/docs/languages/go/getting-started.md create mode 100644 layouts/partials/pt/docs/latest-release.md create mode 100644 layouts/shortcodes/pt/docs/languages/index-intro.md diff --git a/content/pt/docs/languages/go/_index.md b/content/pt/docs/languages/go/_index.md new file mode 100644 index 000000000000..390662a5e28d --- /dev/null +++ b/content/pt/docs/languages/go/_index.md @@ -0,0 +1,15 @@ +--- +title: Go +description: >- + Go A language-specific implementation of OpenTelemetry in Go. +aliases: [/golang, /golang/metrics, /golang/tracing] +weight: 16 +default_lang_commit: 06837fe15457a584f6a9e09579be0f0400593d57 +--- + +{{% pt/docs/languages/index-intro go /%}} + +## Mais + +- [Repositório Contrib](https://github.com/open-telemetry/opentelemetry-go-contrib) diff --git a/content/pt/docs/languages/go/api.md b/content/pt/docs/languages/go/api.md new file mode 100644 index 000000000000..f241e1951cf5 --- /dev/null +++ b/content/pt/docs/languages/go/api.md @@ -0,0 +1,9 @@ +--- +title: Referências da API +linkTitle: API +redirect: https://pkg.go.dev/go.opentelemetry.io/otel +manualLinkTarget: _blank +_build: { render: link } +weight: 210 +default_lang_commit: 06837fe15457a584f6a9e09579be0f0400593d57 +--- diff --git a/content/pt/docs/languages/go/examples.md b/content/pt/docs/languages/go/examples.md new file mode 100644 index 000000000000..2865a43ff16f --- /dev/null +++ b/content/pt/docs/languages/go/examples.md @@ -0,0 +1,8 @@ +--- +title: Exemplos +redirect: https://github.com/open-telemetry/opentelemetry-go/tree/main/example +manualLinkTarget: _blank +_build: { render: link } +weight: 220 +default_lang_commit: 06837fe15457a584f6a9e09579be0f0400593d57 +--- diff --git a/content/pt/docs/languages/go/getting-started.md b/content/pt/docs/languages/go/getting-started.md new file mode 100644 index 000000000000..a794d812d46b --- /dev/null +++ b/content/pt/docs/languages/go/getting-started.md @@ -0,0 +1,1177 @@ +--- +title: Primeiros Passos +weight: 10 +default_lang_commit: 7fd0d2a6b87d6bbf2d5a35340c7afbd2bb33ca1c +# prettier-ignore +cSpell:ignore: chan fatalln funcs intn itoa khtml otelhttp rolldice stdouttrace strconv +--- + + + + +Esta página mostrará como começar a utilizar o OpenTelemetry em Go. + +Você aprenderá como instrumentar manualmente uma aplicação simples, de modo que +os [rastros][traces], [métricas][metrics] e [logs][logs] sejam emitidos no +console. + +{{% alert title="Note" %}} + +Os sinais de logs ainda são experimentais. Alterações que quebrem a +compatibilidade podem ser introduzidas em versões futuras. + +{{% /alert %}} + +## Pré-requisitos {#prerequisites} + +Certifique-se de que você tenha a seguinte instalação localmente: + +- [Go](https://go.dev/) versão 1.22 ou superior + +## Aplicação de exemplo {#example-application} + +O seguinte exemplo usa uma aplicação [`net/http`](https://pkg.go.dev/net/http) +básica. Caso você não esteja usando `net/http`, não há problema — você pode +utilizar OpenTelemetry Go com outros frameworks da web, como Gin e Echo. Para +uma lista completa de bibliotecas para frameworks suportados, consulte o +[registro](/ecosystem/registry/?component=instrumentation&language=go). + +Para exemplos mais elaborados, consulte +[exemplos](/docs/languages/go/examples/). + +### Configuração {#setup} + +Para começar, configure um `go.mod` em um novo diretório: + +```shell +go mod init dice +``` + +### Criar e iniciar um servidor HTTP {#create-and-launch-an-http-server} + +Na mesma pasta, crie um arquivo chamado `main.go` e adicione o seguinte código +ao arquivo: + +```go +package main + +import ( + "log" + "net/http" +) + +func main() { + http.HandleFunc("/rolldice", rolldice) + + log.Fatal(http.ListenAndServe(":8080", nil)) +} +``` + +Crie outro arquivo chamado `rolldice.go` e adicione o seguinte código ao +arquivo: + +```go +package main + +import ( + "io" + "log" + "math/rand" + "net/http" + "strconv" +) + +func rolldice(w http.ResponseWriter, r *http.Request) { + roll := 1 + rand.Intn(6) + + resp := strconv.Itoa(roll) + "\n" + if _, err := io.WriteString(w, resp); err != nil { + log.Printf("Write failed: %v\n", err) + } +} +``` + +Compile e execute a aplicação utilizando o seguinte comando: + +```shell +go run . +``` + +Abra no seu navegador para garantir que está +funcionando. + +## Adicionar instrumentação do OpenTelemetry {#add-open-telemetry-instrumentation} + +Agora, vamos mostrar como adicionar instrumentação do OpenTelemetry à aplicação +de exemplo. Se você estiver usando sua própria aplicação, também pode acompanhar +os passos a seguir. Apenas note que seu código pode ser um pouco diferente do +exemplo. + +### Adicionar Dependências {#add-dependencies} + +Instale os seguintes pacotes: + +```shell +go get "go.opentelemetry.io/otel" \ + "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" \ + "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" \ + "go.opentelemetry.io/otel/exporters/stdout/stdoutlog" \ + "go.opentelemetry.io/otel/sdk/log" \ + "go.opentelemetry.io/otel/log/global" \ + "go.opentelemetry.io/otel/propagation" \ + "go.opentelemetry.io/otel/sdk/metric" \ + "go.opentelemetry.io/otel/sdk/resource" \ + "go.opentelemetry.io/otel/sdk/trace" \ + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"\ + "go.opentelemetry.io/contrib/bridges/otelslog" +``` + +Este comando instala os componentes do SDK OpenTelemetry e a instrumentação do +`net/http`. + +Se você estiver instrumentando uma biblioteca diferente para solicitações de +rede, precisará instalar a biblioteca de instrumentação apropriada. Consulte a +seção [bibliotecas](/docs/languages/go/libraries/) para mais informações. + +### Inicializar o SDK OpenTelemetry {#initialize-the-opentelemetry-sdk} + +Primeiro, vamos inicializar o SDK OpenTelemetry. Isso é _obrigatório_ para +qualquer aplicação que exporte telemetria. + +Crie um arquivo `otel.go` com o código de inicialização do SDK OpenTelemetry: + + + +```go +package main + +import ( + "context" + "errors" + "time" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/stdout/stdoutlog" + "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" + "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" + "go.opentelemetry.io/otel/log/global" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/log" + "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/trace" +) + +// setupOTelSDK inicializa o pipeline do OpenTelemetry. +// Caso não retorne um erro, certifique-se de executar o método shutdown para realizar a finalização adequada. +func setupOTelSDK(ctx context.Context) (shutdown func(context.Context) error, err error) { + var shutdownFuncs []func(context.Context) error + + // shutdown chama as funções de finalização registradas via shutdownFuncs. + // Os erros das chamadas são concatenados. + // Cada função de finalização registrada será invocada uma única vez. + shutdown = func(ctx context.Context) error { + var err error + for _, fn := range shutdownFuncs { + err = errors.Join(err, fn(ctx)) + } + shutdownFuncs = nil + return err + } + + // handleErr chama a função shutdown para finalizar corretamente e garante que todos os erros serão retornados. + handleErr := func(inErr error) { + err = errors.Join(inErr, shutdown(ctx)) + } + + // Inicializa o Propagator. + prop := newPropagator() + otel.SetTextMapPropagator(prop) + + // Inicializa o Trace Provider. + tracerProvider, err := newTraceProvider() + if err != nil { + handleErr(err) + return + } + shutdownFuncs = append(shutdownFuncs, tracerProvider.Shutdown) + otel.SetTracerProvider(tracerProvider) + + // Inicializa o Meter Provider. + meterProvider, err := newMeterProvider() + if err != nil { + handleErr(err) + return + } + shutdownFuncs = append(shutdownFuncs, meterProvider.Shutdown) + otel.SetMeterProvider(meterProvider) + + // Inicializa o Logger Provider. + loggerProvider, err := newLoggerProvider() + if err != nil { + handleErr(err) + return + } + shutdownFuncs = append(shutdownFuncs, loggerProvider.Shutdown) + global.SetLoggerProvider(loggerProvider) + + return +} + +func newPropagator() propagation.TextMapPropagator { + return propagation.NewCompositeTextMapPropagator( + propagation.TraceContext{}, + propagation.Baggage{}, + ) +} + +func newTraceProvider() (*trace.TracerProvider, error) { + traceExporter, err := stdouttrace.New( + stdouttrace.WithPrettyPrint()) + if err != nil { + return nil, err + } + + traceProvider := trace.NewTracerProvider( + trace.WithBatcher(traceExporter, + // O valor padrão é 5s. Definimos em 1s para propósito de demonstração. + trace.WithBatchTimeout(time.Second)), + ) + return traceProvider, nil +} + +func newMeterProvider() (*metric.MeterProvider, error) { + metricExporter, err := stdoutmetric.New() + if err != nil { + return nil, err + } + + meterProvider := metric.NewMeterProvider( + metric.WithReader(metric.NewPeriodicReader(metricExporter, + // O valor padrão é 1m. Definimos em 3s para propósito de demonstração. + metric.WithInterval(3*time.Second))), + ) + return meterProvider, nil +} + +func newLoggerProvider() (*log.LoggerProvider, error) { + logExporter, err := stdoutlog.New() + if err != nil { + return nil, err + } + + loggerProvider := log.NewLoggerProvider( + log.WithProcessor(log.NewBatchProcessor(logExporter)), + ) + return loggerProvider, nil +} +``` + + +Caso você esteja utilizando apenas rastros ou métricas, você pode omitir o +código de inicialização do TracerProvider ou MeterProvider correspondente. + +### Instrumentação do servidor HTTP {#instrument-the-http-server} + +Agora que temos o SDK do OpenTelemetry inicializado, podemos instrumentar o +servidor HTTP. + +Modifique o arquivo `main.go` para incluir o código que configura o SDK do +OpenTelemetry e instrumenta o servidor HTTP utilizando a biblioteca de +instrumentação `otelhttp`: + + + +```go +package main + +import ( + "context" + "errors" + "log" + "net" + "net/http" + "os" + "os/signal" + "time" + + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" +) + +func main() { + if err := run(); err != nil { + log.Fatalln(err) + } +} + +func run() (err error) { + // Lidamos com o SIGINT (CTRL+C) de maneira segura. + ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) + defer stop() + + // Configura o OpenTelemetry. + otelShutdown, err := setupOTelSDK(ctx) + if err != nil { + return + } + // Lidamos com a finalização corretamente, evitando leaks. + defer func() { + err = errors.Join(err, otelShutdown(context.Background())) + }() + + // Inicializamos o servidor HTTP. + srv := &http.Server{ + Addr: ":8080", + BaseContext: func(_ net.Listener) context.Context { return ctx }, + ReadTimeout: time.Second, + WriteTimeout: 10 * time.Second, + Handler: newHTTPHandler(), + } + srvErr := make(chan error, 1) + go func() { + srvErr <- srv.ListenAndServe() + }() + + // Aguardamos por uma interrupção. + select { + case err = <-srvErr: + // Erro ao inicializar o servidor HTTP. + return + case <-ctx.Done(): + // Aguardamos o primeiro CTRL+C. + // Para de receber sinais o mais rápido possível. + stop() + } + + // Quando o método Shutdown é chamado, ListenAndServe retornará imediatamente ErrServerClosed. + err = srv.Shutdown(context.Background()) + return +} + +func newHTTPHandler() http.Handler { + mux := http.NewServeMux() + + // handleFunc é uma substituição para mux.HandleFunc + // enriquecendo ainda mais a instrumentação HTTP utilizando padrões como http.route. + handleFunc := func(pattern string, handlerFunc func(http.ResponseWriter, *http.Request)) { + // Configura o "http.route" para a instrumentação HTTP. + handler := otelhttp.WithRouteTag(pattern, http.HandlerFunc(handlerFunc)) + mux.Handle(pattern, handler) + } + + // Registra os handlers. + handleFunc("/rolldice/", rolldice) + handleFunc("/rolldice/{player}", rolldice) + + // Adiciona a instrumentação HTTP para todo o servidor. + handler := otelhttp.NewHandler(mux, "/") + return handler +} +``` + + +### Adicionar instrumentação personalizada {#add-custom-instrumentation} + +As bibliotecas de instrumentação capturam telemetria nas bordas de seus +sistemas, como por exemplo requisições HTTP de entrada e saída, porém não +capturam o que está acontecendo dentro da sua aplicação. Para isso, você +precisará implementar uma [instrumentação manual](../instrumentation/) +personalizada. + +Modifique o arquivo `rolldice.go` para incluir instrumentação personalizada +usando a API do OpenTelemetry: + + + +```go +package main + +import ( + "fmt" + "io" + "log" + "math/rand" + "net/http" + "strconv" + + "go.opentelemetry.io/contrib/bridges/otelslog" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" +) + +const name = "go.opentelemetry.io/otel/example/dice" + +var ( + tracer = otel.Tracer(name) + meter = otel.Meter(name) + logger = otelslog.NewLogger(name) + rollCnt metric.Int64Counter +) + +func init() { + var err error + rollCnt, err = meter.Int64Counter("dice.rolls", + metric.WithDescription("O número de lançamentos por valor obtido"), + metric.WithUnit("{roll}")) + if err != nil { + panic(err) + } +} + +func rolldice(w http.ResponseWriter, r *http.Request) { + ctx, span := tracer.Start(r.Context(), "roll") + defer span.End() + + roll := 1 + rand.Intn(6) + + var msg string + if player := r.PathValue("player"); player != "" { + msg = fmt.Sprintf("%s está lançando o dado", player) + } else { + msg = "Jogador anônimo está lançando o dado" + } + logger.InfoContext(ctx, msg, "result", roll) + + rollValueAttr := attribute.Int("roll.value", roll) + span.SetAttributes(rollValueAttr) + rollCnt.Add(ctx, 1, metric.WithAttributes(rollValueAttr)) + + resp := strconv.Itoa(roll) + "\n" + if _, err := io.WriteString(w, resp); err != nil { + log.Printf("Falha na escrita: %v\n", err) + } +} +``` + + +Observe que caso você esteja utilizando apenas rastros ou métricas, poderá +omitir o código de instrumentação correspondente ao componente que não está +sendo utilizado. + +### Executando a Aplicação {#run-the-application} + +Compile e execute a aplicação utilizando o seguinte comando: + +```sh +go mod tidy +export OTEL_RESOURCE_ATTRIBUTES="service.name=dice,service.version=0.1.0" +go run . +``` + +Abra no seu navegador. Ao enviar uma +solicitação para o servidor, você verá dois trechos no rastro emitido no +console. O trecho gerado pela biblioteca de instrumentação rastreia a duração da +solicitação para a rota `/rolldice/{player}`. O trecho chamado `roll` é criado +manualmente e é um filho do trecho mencionado anteriormente. + +
+Visualizar exemplo de saída + +```json +{ + "Name": "roll", + "SpanContext": { + "TraceID": "829fb7ceb787403c96eac3caf285c965", + "SpanID": "8b6b408b6c1a35e5", + "TraceFlags": "01", + "TraceState": "", + "Remote": false + }, + "Parent": { + "TraceID": "829fb7ceb787403c96eac3caf285c965", + "SpanID": "612be4bbdf450de6", + "TraceFlags": "01", + "TraceState": "", + "Remote": false + }, + "SpanKind": 1, + "StartTime": "2023-09-25T12:42:06.177119576+02:00", + "EndTime": "2023-09-25T12:42:06.177136776+02:00", + "Attributes": [ + { + "Key": "roll.value", + "Value": { + "Type": "INT64", + "Value": 6 + } + } + ], + "Events": null, + "Links": null, + "Status": { + "Code": "Unset", + "Description": "" + }, + "DroppedAttributes": 0, + "DroppedEvents": 0, + "DroppedLinks": 0, + "ChildSpanCount": 0, + "Resource": [ + { + "Key": "service.name", + "Value": { + "Type": "STRING", + "Value": "dice" + } + }, + { + "Key": "service.version", + "Value": { + "Type": "STRING", + "Value": "0.1.0" + } + }, + { + "Key": "telemetry.sdk.language", + "Value": { + "Type": "STRING", + "Value": "go" + } + }, + { + "Key": "telemetry.sdk.name", + "Value": { + "Type": "STRING", + "Value": "opentelemetry" + } + }, + { + "Key": "telemetry.sdk.version", + "Value": { + "Type": "STRING", + "Value": "1.19.0-rc.1" + } + } + ], + "InstrumentationLibrary": { + "Name": "rolldice", + "Version": "", + "SchemaURL": "" + } +} +{ + "Name": "/", + "SpanContext": { + "TraceID": "829fb7ceb787403c96eac3caf285c965", + "SpanID": "612be4bbdf450de6", + "TraceFlags": "01", + "TraceState": "", + "Remote": false + }, + "Parent": { + "TraceID": "00000000000000000000000000000000", + "SpanID": "0000000000000000", + "TraceFlags": "00", + "TraceState": "", + "Remote": false + }, + "SpanKind": 2, + "StartTime": "2023-09-25T12:42:06.177071077+02:00", + "EndTime": "2023-09-25T12:42:06.177158076+02:00", + "Attributes": [ + { + "Key": "http.method", + "Value": { + "Type": "STRING", + "Value": "GET" + } + }, + { + "Key": "http.scheme", + "Value": { + "Type": "STRING", + "Value": "http" + } + }, + { + "Key": "http.flavor", + "Value": { + "Type": "STRING", + "Value": "1.1" + } + }, + { + "Key": "net.host.name", + "Value": { + "Type": "STRING", + "Value": "localhost" + } + }, + { + "Key": "net.host.port", + "Value": { + "Type": "INT64", + "Value": 8080 + } + }, + { + "Key": "net.sock.peer.addr", + "Value": { + "Type": "STRING", + "Value": "::1" + } + }, + { + "Key": "net.sock.peer.port", + "Value": { + "Type": "INT64", + "Value": 49046 + } + }, + { + "Key": "http.user_agent", + "Value": { + "Type": "STRING", + "Value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" + } + }, + { + "Key": "http.route", + "Value": { + "Type": "STRING", + "Value": "/rolldice/Alice" + } + }, + { + "Key": "http.wrote_bytes", + "Value": { + "Type": "INT64", + "Value": 2 + } + }, + { + "Key": "http.status_code", + "Value": { + "Type": "INT64", + "Value": 200 + } + } + ], + "Events": null, + "Links": null, + "Status": { + "Code": "Unset", + "Description": "" + }, + "DroppedAttributes": 0, + "DroppedEvents": 0, + "DroppedLinks": 0, + "ChildSpanCount": 1, + "Resource": [ + { + "Key": "service.name", + "Value": { + "Type": "STRING", + "Value": "dice" + } + }, + { + "Key": "service.version", + "Value": { + "Type": "STRING", + "Value": "0.1.0" + } + }, + { + "Key": "telemetry.sdk.language", + "Value": { + "Type": "STRING", + "Value": "go" + } + }, + { + "Key": "telemetry.sdk.name", + "Value": { + "Type": "STRING", + "Value": "opentelemetry" + } + }, + { + "Key": "telemetry.sdk.version", + "Value": { + "Type": "STRING", + "Value": "1.19.0-rc.1" + } + } + ], + "InstrumentationLibrary": { + "Name": "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp", + "Version": "0.44.0", + "SchemaURL": "" + } +} +``` + +
+ +Junto com o rastro, mensagens de log são emitidas no console. + +
+Visualizar exemplo de saída + +```json +{ + "Timestamp": "2023-09-25T12:42:05.177136776+02:00", + "ObservedTimestamp": "2023-09-25T12:42:06.809396011+02:00", + "Severity": 9, + "SeverityText": "", + "Body": { + "Type": "String", + "Value": "Alice está lançando o dado" + }, + "Attributes": [ + { + "Key": "result", + "Value": { + "Type": "Int64", + "Value": 6 + } + } + ], + "TraceID": "829fb7ceb787403c96eac3caf285c965", + "SpanID": "8b6b408b6c1a35e5", + "TraceFlags": "01", + "Resource": [ + { + "Key": "service.name", + "Value": { + "Type": "STRING", + "Value": "dice" + } + }, + { + "Key": "service.version", + "Value": { + "Type": "STRING", + "Value": "0.1.0" + } + }, + { + "Key": "telemetry.sdk.language", + "Value": { + "Type": "STRING", + "Value": "go" + } + }, + { + "Key": "telemetry.sdk.name", + "Value": { + "Type": "STRING", + "Value": "opentelemetry" + } + }, + { + "Key": "telemetry.sdk.version", + "Value": { + "Type": "STRING", + "Value": "1.19.0-rc.1" + } + } + ], + "Scope": { + "Name": "rolldice", + "Version": "", + "SchemaURL": "" + }, + "DroppedAttributes": 0 +} +``` + +
+ +Atualize a página algumas vezes, e então +você pode esperar um pouco ou encerrar a execução da aplicação e verá as +métricas como na saída do console. Você verá a métrica `dice.rolls` emitida no +console, com contagens distintas para cada valor obtido, bem como as métricas +HTTP geradas pela biblioteca de instrumentação. + +
+Visualizar exemplo de saída + +```json +{ + "Resource": [ + { + "Key": "service.name", + "Value": { + "Type": "STRING", + "Value": "dice" + } + }, + { + "Key": "service.version", + "Value": { + "Type": "STRING", + "Value": "0.1.0" + } + }, + { + "Key": "telemetry.sdk.language", + "Value": { + "Type": "STRING", + "Value": "go" + } + }, + { + "Key": "telemetry.sdk.name", + "Value": { + "Type": "STRING", + "Value": "opentelemetry" + } + }, + { + "Key": "telemetry.sdk.version", + "Value": { + "Type": "STRING", + "Value": "1.19.0-rc.1" + } + } + ], + "ScopeMetrics": [ + { + "Scope": { + "Name": "rolldice", + "Version": "", + "SchemaURL": "" + }, + "Metrics": [ + { + "Name": "dice.rolls", + "Description": "Número de lançamentos por valor obtido", + "Unit": "{roll}", + "Data": { + "DataPoints": [ + { + "Attributes": [ + { + "Key": "roll.value", + "Value": { + "Type": "INT64", + "Value": 1 + } + } + ], + "StartTime": "2023-09-25T12:42:04.279204638+02:00", + "Time": "2023-09-25T12:42:15.482694258+02:00", + "Value": 4 + }, + { + "Attributes": [ + { + "Key": "roll.value", + "Value": { + "Type": "INT64", + "Value": 5 + } + } + ], + "StartTime": "2023-09-25T12:42:04.279204638+02:00", + "Time": "2023-09-25T12:42:15.482694258+02:00", + "Value": 3 + }, + { + "Attributes": [ + { + "Key": "roll.value", + "Value": { + "Type": "INT64", + "Value": 3 + } + } + ], + "StartTime": "2023-09-25T12:42:04.279204638+02:00", + "Time": "2023-09-25T12:42:15.482694258+02:00", + "Value": 4 + }, + { + "Attributes": [ + { + "Key": "roll.value", + "Value": { + "Type": "INT64", + "Value": 2 + } + } + ], + "StartTime": "2023-09-25T12:42:04.279204638+02:00", + "Time": "2023-09-25T12:42:15.482694258+02:00", + "Value": 2 + }, + { + "Attributes": [ + { + "Key": "roll.value", + "Value": { + "Type": "INT64", + "Value": 6 + } + } + ], + "StartTime": "2023-09-25T12:42:04.279204638+02:00", + "Time": "2023-09-25T12:42:15.482694258+02:00", + "Value": 5 + }, + { + "Attributes": [ + { + "Key": "roll.value", + "Value": { + "Type": "INT64", + "Value": 4 + } + } + ], + "StartTime": "2023-09-25T12:42:04.279204638+02:00", + "Time": "2023-09-25T12:42:15.482694258+02:00", + "Value": 9 + } + ], + "Temporality": "CumulativeTemporality", + "IsMonotonic": true + } + } + ] + }, + { + "Scope": { + "Name": "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp", + "Version": "0.44.0", + "SchemaURL": "" + }, + "Metrics": [ + { + "Name": "http.server.request_content_length", + "Description": "", + "Unit": "", + "Data": { + "DataPoints": [ + { + "Attributes": [ + { + "Key": "http.flavor", + "Value": { + "Type": "STRING", + "Value": "1.1" + } + }, + { + "Key": "http.method", + "Value": { + "Type": "STRING", + "Value": "GET" + } + }, + { + "Key": "http.route", + "Value": { + "Type": "STRING", + "Value": "/rolldice/Alice" + } + }, + { + "Key": "http.scheme", + "Value": { + "Type": "STRING", + "Value": "http" + } + }, + { + "Key": "http.status_code", + "Value": { + "Type": "INT64", + "Value": 200 + } + }, + { + "Key": "net.host.name", + "Value": { + "Type": "STRING", + "Value": "localhost" + } + }, + { + "Key": "net.host.port", + "Value": { + "Type": "INT64", + "Value": 8080 + } + } + ], + "StartTime": "2023-09-25T12:42:04.279212238+02:00", + "Time": "2023-09-25T12:42:15.482695758+02:00", + "Value": 0 + } + ], + "Temporality": "CumulativeTemporality", + "IsMonotonic": true + } + }, + { + "Name": "http.server.response_content_length", + "Description": "", + "Unit": "", + "Data": { + "DataPoints": [ + { + "Attributes": [ + { + "Key": "http.flavor", + "Value": { + "Type": "STRING", + "Value": "1.1" + } + }, + { + "Key": "http.method", + "Value": { + "Type": "STRING", + "Value": "GET" + } + }, + { + "Key": "http.route", + "Value": { + "Type": "STRING", + "Value": "/rolldice/Alice" + } + }, + { + "Key": "http.scheme", + "Value": { + "Type": "STRING", + "Value": "http" + } + }, + { + "Key": "http.status_code", + "Value": { + "Type": "INT64", + "Value": 200 + } + }, + { + "Key": "net.host.name", + "Value": { + "Type": "STRING", + "Value": "localhost" + } + }, + { + "Key": "net.host.port", + "Value": { + "Type": "INT64", + "Value": 8080 + } + } + ], + "StartTime": "2023-09-25T12:42:04.279214438+02:00", + "Time": "2023-09-25T12:42:15.482696158+02:00", + "Value": 54 + } + ], + "Temporality": "CumulativeTemporality", + "IsMonotonic": true + } + }, + { + "Name": "http.server.duration", + "Description": "", + "Unit": "", + "Data": { + "DataPoints": [ + { + "Attributes": [ + { + "Key": "http.flavor", + "Value": { + "Type": "STRING", + "Value": "1.1" + } + }, + { + "Key": "http.method", + "Value": { + "Type": "STRING", + "Value": "GET" + } + }, + { + "Key": "http.route", + "Value": { + "Type": "STRING", + "Value": "/rolldice/Alice" + } + }, + { + "Key": "http.scheme", + "Value": { + "Type": "STRING", + "Value": "http" + } + }, + { + "Key": "http.status_code", + "Value": { + "Type": "INT64", + "Value": 200 + } + }, + { + "Key": "net.host.name", + "Value": { + "Type": "STRING", + "Value": "localhost" + } + }, + { + "Key": "net.host.port", + "Value": { + "Type": "INT64", + "Value": 8080 + } + } + ], + "StartTime": "2023-09-25T12:42:04.279219438+02:00", + "Time": "2023-09-25T12:42:15.482697158+02:00", + "Count": 27, + "Bounds": [ + 0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, + 7500, 10000 + ], + "BucketCounts": [ + 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ], + "Min": {}, + "Max": {}, + "Sum": 2.1752759999999993 + } + ], + "Temporality": "CumulativeTemporality" + } + } + ] + } + ] +} +``` + +
+ +## Próximos passos {#next-steps} + +Para mais informações sobre como instrumentar seu código, consulte a +documentação de [instrumentação manual](/docs/languages/go/instrumentation/). + +Você também vai querer configurar um Exporter apropriado para +[exportar os seus dados de telemetria](/docs/languages/go/exporters/) para um ou +mais backends de telemetria. + +Caso queira explorar um exemplo mais complexo, dê uma olhada na +[demonstração do OpenTelemetry](/docs/demo/), que inclui o +[Serviço de Checkout](/docs/demo/services/checkout/), o +[Serviço de Catálogo de Produtos](/docs/demo/services/product-catalog/), e o +[Serviço de Contabilidade](/docs/demo/services/accounting/), baseados em Go + +[traces]: /docs/concepts/signals/traces/ +[metrics]: /docs/concepts/signals/metrics/ +[logs]: /docs/concepts/signals/logs/ diff --git a/layouts/partials/pt/docs/latest-release.md b/layouts/partials/pt/docs/latest-release.md new file mode 100644 index 000000000000..26df2998e6e3 --- /dev/null +++ b/layouts/partials/pt/docs/latest-release.md @@ -0,0 +1,7 @@ +{{ $relUrl := printf "https://github.com/open-telemetry/opentelemetry-%s/releases" .lang -}} + +Para lançamentos, incluindo a [última versão][latest release], consulte a página de [Lançamentos][Releases]. +{{- .Inner }} + +[latest release]: {{ $relUrl }}/latest +[Releases]: {{ $relUrl }} diff --git a/layouts/shortcodes/pt/docs/languages/index-intro.md b/layouts/shortcodes/pt/docs/languages/index-intro.md new file mode 100644 index 000000000000..0492c4e57401 --- /dev/null +++ b/layouts/shortcodes/pt/docs/languages/index-intro.md @@ -0,0 +1,28 @@ +{{/* +default_lang_commit: 2e21274a01a24a62c67595591d8f4255bef640fc +*/ -}} +{{ $prettier_ignore := ` + + +` -}} +{{ $lang := .Get 0 -}} +{{ $data := index $.Site.Data.instrumentation $lang }} +{{ $name := $data.name -}} + +{{ $tracesStatus := partial "docs/get-signal-status.html" (dict "lang" $lang "signal" "traces") -}} +{{ $metricsStatus := partial "docs/get-signal-status.html" (dict "lang" $lang "signal" "metrics") -}} +{{ $logsStatus := partial "docs/get-signal-status.html" (dict "lang" $lang "signal" "logs") -}} + +Esta é a documentação do OpenTelemetry para a linguagem {{ $name }}. O OpenTelemetry é um +framework de observabilidade -- API, SDKs, e ferramentas que são desenvolvidas para auxiliar na +geração e coleta de dados de telemetria de aplicações, como métricas, logs e rastros. Esta documentação foi criada para te auxiliar a entender como começar a utilizar o OpenTelemetry em {{ $name }}. + +## Estado e Lançamentos + +O estado atual dos principais componentes funcionais do OpenTelemetry para {{ $name }} é o seguinte: + +| Rastros | Métricas | Logs | +| ------------------- | -------------------- | ----------------- | +| {{ $tracesStatus }} | {{ $metricsStatus }} | {{ $logsStatus }} | + +{{ partial "pt/docs/latest-release.md" (dict "lang" $lang "Inner" .Inner) -}} From f6fc33361e80f51342ada4358d41780b685367a2 Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Wed, 16 Oct 2024 01:11:35 -0500 Subject: [PATCH 14/76] Update semantic-conventions-java version to v1.28.0 (#5411) --- content/en/docs/languages/java/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/languages/java/_index.md b/content/en/docs/languages/java/_index.md index e69686567dad..36a40f27de57 100644 --- a/content/en/docs/languages/java/_index.md +++ b/content/en/docs/languages/java/_index.md @@ -9,7 +9,7 @@ cascade: instrumentation: 2.8.0 otel: 1.43.0 contrib: 1.38.0 - semconv: 1.27.0 + semconv: 1.28.0 weight: 18 --- From b2d1ff550b77c37e15df502b8ef4e34204169ad1 Mon Sep 17 00:00:00 2001 From: Severin Neumann Date: Wed, 16 Oct 2024 09:13:09 +0200 Subject: [PATCH 15/76] Add guidelines for starting new localizations (#5385) Signed-off-by: svrnm Signed-off-by: svrnm Co-authored-by: Fabrizio Ferri-Benedetti --- content/en/docs/contributing/localization.md | 50 +++++++++++++++----- static/refcache.json | 8 ++++ 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/content/en/docs/contributing/localization.md b/content/en/docs/contributing/localization.md index 4a88cc7f00ec..f1a25fd11505 100644 --- a/content/en/docs/contributing/localization.md +++ b/content/en/docs/contributing/localization.md @@ -204,22 +204,50 @@ For more details about the script, run `npm run check:i18n -- -h`. ## New localizations -(Section To Be Completed soon with information about how to propose a new -localization.) +To start a new localization for the OpenTelemetry website, +[raise an issue](https://github.com/open-telemetry/opentelemetry.io/issues/) to +share your interest to contribute. Tag all other individuals that are willing to +write and review translations in the language you want to add. You need at least +two potential contributors, three would be ideal. Include the following task +list in your issue as well: - +You don't have to be an existing contributor to the OpenTelemetry project, to +start a new localization. However you will not be added as a member of the +[OpenTelemetry GitHub organization](https://github.com/open-telemetry/) or as a +member of the approvers group for your localization. You will need to satisfy +the requirements for becoming an established member and approver as outlined in +the +[membership guidelines](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md). + +When starting the localization project, maintainers will treat your reviews as +if you are an approver already. + +{{% /alert %}} [main]: https://github.com/open-telemetry/opentelemetry.io/commits/main/ [multilingual framework]: https://gohugo.io/content-management/multilingual/ diff --git a/static/refcache.json b/static/refcache.json index 799529e377a0..012934c7f4f2 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -3435,6 +3435,10 @@ "StatusCode": 200, "LastSeen": "2024-01-18T19:02:13.980094-05:00" }, + "https://en.wikipedia.org/wiki/ISO_639-1": { + "StatusCode": 200, + "LastSeen": "2024-10-11T11:10:12.725968+02:00" + }, "https://en.wikipedia.org/wiki/In-band_signaling": { "StatusCode": 200, "LastSeen": "2024-01-18T19:01:54.201621-05:00" @@ -7179,6 +7183,10 @@ "StatusCode": 200, "LastSeen": "2024-06-13T15:48:00.42543+02:00" }, + "https://github.com/open-telemetry/opentelemetry.io/issues/": { + "StatusCode": 200, + "LastSeen": "2024-10-11T11:10:11.918895+02:00" + }, "https://github.com/open-telemetry/opentelemetry.io/issues/4427": { "StatusCode": 200, "LastSeen": "2024-05-06T15:32:24.49099-04:00" From 737ff895cf3e0d2b66d7a9f9ebdf23714e38387e Mon Sep 17 00:00:00 2001 From: Hans Kristian Flaatten Date: Wed, 16 Oct 2024 09:18:04 +0200 Subject: [PATCH 16/76] Add NAV - Norwegian Government to adopters.yaml (#5414) Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Severin Neumann --- data/ecosystem/adopters.yaml | 6 ++++++ static/refcache.json | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/data/ecosystem/adopters.yaml b/data/ecosystem/adopters.yaml index a7adc8bdcf23..f8d243799426 100644 --- a/data/ecosystem/adopters.yaml +++ b/data/ecosystem/adopters.yaml @@ -69,6 +69,12 @@ reference: 'https://medium.com/mercadolibre-tech/building-a-large-scale-observability-ecosystem-1edf654b249e' referenceTitle: blog post contact: 'https://github.com/mercadolibre' +- name: NAV - Norwegian Government + url: https://nav.no + components: [Collector, Go, Java, JavaScript, Python] + reference: 'https://nais.io/blog/posts/otel-from-0-to-100/' + referenceTitle: blog post + contact: 'https://github.com/Starefossen' - name: OrderMyGear url: https://www.ordermygear.com/ components: [] diff --git a/static/refcache.json b/static/refcache.json index 012934c7f4f2..9fc02794914b 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -9207,6 +9207,10 @@ "StatusCode": 200, "LastSeen": "2024-01-18T19:02:19.249572-05:00" }, + "https://nais.io/blog/posts/otel-from-0-to-100/": { + "StatusCode": 206, + "LastSeen": "2024-10-16T06:19:11.246616643Z" + }, "https://netlify.com": { "StatusCode": 206, "LastSeen": "2024-06-12T11:21:36.089536+02:00" From f9382f7aa7db68bb67dbe6bf289e5782cea3dc33 Mon Sep 17 00:00:00 2001 From: Damien Mathieu <42@dmathieu.com> Date: Wed, 16 Oct 2024 10:21:05 +0200 Subject: [PATCH 17/76] Add what is opentelemetry page in french (#5408) Co-authored-by: Pierre HILBERT --- .cspell/fr-mots.txt | 166 ++++++++++++++++++++++- content/fr/docs/what-is-opentelemetry.md | 133 ++++++++++++++++++ 2 files changed, 298 insertions(+), 1 deletion(-) create mode 100644 content/fr/docs/what-is-opentelemetry.md diff --git a/.cspell/fr-mots.txt b/.cspell/fr-mots.txt index 24bf98df272d..7970e82b0e43 100644 --- a/.cspell/fr-mots.txt +++ b/.cspell/fr-mots.txt @@ -46,4 +46,168 @@ universelle utilisé visuel votre -vous \ No newline at end of file +vous +l'état +système +incluent +rendre +signifie +émettre +metriques +produites +doivent +transmises +Pourquoi +l'essor +commerciales +besoin +répond +suivant +principes +clés +propriétaire +générez +dépendance +fournisseur +n'avez +d'apprendre +seul +combinés +offrent +équipes +organisations +flexibilité +dont +informatique +Extensibilité +conçu +extensible +Quelques +façon +étendu +Ajouter +receveur +Collecteur +afin +prendre +venant +personnalisée +bibliothèques +personnalisées +Créer +collecteur +adaptée +utilisation +spécifique +nouvel +exportateur +personnalisé +prend +propagateur +contexte +plupart +utilisateurs +n'aient +d'étendre +presque +tous +niveaux +Histoire +trouve +antérieurs +créés +résoudre +même +problème +norme +décrivant +manière +transmettre +Aucun +n'étant +indépendante +fusionné +leurs +offrant +utilisez +actuellement +pouvez +découvrir +migrer +ensuite +commencer +Lancez +directement +composants +standardisé +définissant +sémantiques +décrire +langage +implémentent +spécifications +écosystème +instrumentent +automatique +génèrent +requérir +reçoit +modifie +autre +Opérateur +ressources +Faas +variété +intègrent +fournir +défaut +pris +fournisseurs +fournissent +contribuent +n’aient +d’étendre +conçus +créer +gérer +telles +outil +compris +ainsi +commerciaux +d'autres +génération +collecte +gestion +objectifs +principaux +pouvoir +aisément +systèmes +quelque +soit +leur +environnement +d'exécution +stockage +visualisation +sont +intentionnellement +laissés +d'autres +comprendre +sortantes +logiciel +d’aujourd’hui +souhaitez +jetez +oeil +valeurs +principaux +suivants +spécification +communautaires +brève +êtes +standardisée +autres diff --git a/content/fr/docs/what-is-opentelemetry.md b/content/fr/docs/what-is-opentelemetry.md new file mode 100644 index 000000000000..e6e7ea1bcfe3 --- /dev/null +++ b/content/fr/docs/what-is-opentelemetry.md @@ -0,0 +1,133 @@ +--- +title: Qu'est-ce qu'OpenTelemetry ? +description: + Une brève explication de ce qu'est OpenTelemetry, et de ce qu'il n'est pas. +weight: 150 +default_lang_commit: 71833a5f8b84110dadf1e98604b87a900724ac33 +--- + +OpenTelemetry, c'est : + +- Un framework + d'[observabilité](/docs/concepts/observability-primer/#what-is-observability) + et des outils conçus pour créer et gérer des données de télémétrie telles que + des [traces](/docs/concepts/signals/traces/), des + [metriques](/docs/concepts/signals/metrics/), et des + [logs](/docs/concepts/signals/logs/) +- Indépendant d'un fournisseur et d'un outil, ce qui signifie qu'il peut être + utilisé avec une grande variété de backends d'observabilité, y compris des + outils open source tels que [Jaeger](https://www.jaegertracing.io/) et + [Prometheus](https://prometheus.io/), ainsi que des outils commerciaux +- Pas un backend d'observabilité tel que Jaeger, Prometheus ou d'autres outils + commerciaux +- Axé sur la génération, la collecte, la gestion et l'export de données de + télémétrie. L'un des objectifs principaux d'OpenTelemetry est de pouvoir + aisément instrumenter vos applications ou systèmes, quelque soit leur langage, + infrastructure, ou environnement d'exécution. Le stockage et la visualisation + des données sont intentionnellement laissés à d'autres outils + +## Qu'est-ce que l'observabilité ? + +L'[observabilité](/docs/concepts/observability-primer/#what-is-observability) +est la capacité de comprendre l'état interne d'un système en examinant ses +données sortantes. Dans un contexte logiciel, cela signifie être capable de +comprendre l'état interne d'un système en examinant ses données de télémétrie, +qui incluent les traces, métriques et logs. + +Pour rendre un système observable, il doit être +[instrumenté](/docs/concepts/instrumentation). Cela signifie que le code doit +émettre des [traces](/docs/concepts/signals/traces/), des +[métriques](/docs/concepts/signals/metrics/), et/ou des +[logs](/docs/concepts/signals/logs/). Les données produites doivent être +transmises à un backend d'observabilité. + +## Pourquoi OpenTelemetry ? + +Avec l'essor du cloud computing, des architectures en microservices, et des +exigences commerciales de plus en plus complexes, le besoin +d'[observabilité](/docs/concepts/observability-primer/#what-is-observability) +des logiciels et de l'infrastructure est plus grand que jamais. + +OpenTelemetry répond au besoin d'observabilité tout en suivant deux principes +clés : + +1. Vous êtes propriétaire des données que vous générez. Il n'y a pas de + dépendance vis-à-vis d'un fournisseur +2. Vous n'avez besoin d'apprendre qu'un seul ensemble d'APIs et de conventions + +Ces deux principes combinés offrent aux équipes et aux organisations la +flexibilité dont elles ont besoin dans le monde informatique moderne +d’aujourd’hui. + +Si vous souhaitez en savoir plus, jetez un oeil à la +[mission, la vision et les valeurs](/community/mission/) d'OpenTelemetry. + +## Composants principaux d'OpenTelemetry + +OpenTelemetry se compose des principaux composants suivants : + +- Une [spécification](/docs/specs/otel) pour tous les composants +- Un [protocole](/docs/specs/otlp/) standardisé définissant le format des + données de télémétrie +- Des [conventions sémantiques](/docs/specs/semconv/) définissant une + nomenclature standardisée pour décrire les données de télémétrie +- Des APIs décrivant comment générer des données de télémétrie +- Des [SDKs par langage](/docs/languages) qui implémentent les spécifications, + les APIs et l'export des données de télémétrie +- Un [écosystème de bibliothèques](/ecosystem/registry) qui instrumentent des + bibliothèques et frameworks +- Des composants d'instrumentation automatique qui génèrent des données de + télémétrie sans requérir de modifications de code +- Le [Collector OpenTelemetry](/docs/collector), un proxy qui reçoit, modifie et + exporte les données de télémétrie +- Divers autres outils, tels que + l'[Opérateur Kubernetes pour OpenTelemetry](/docs/kubernetes/operator/), les + [Helm Charts pour OpenTelemetry](/docs/kubernetes/helm/) et des + [ressources communautaires pour les FaaS](/docs/faas/) + +OpenTelemetry est utilisé par une grande variété de +[bibliothèques, services et applications](/ecosystem/integrations/) qui +intègrent OpenTelemetry afin de fournir de l'observabilité par défaut. + +OpenTelemetry est pris en charge par de nombreux +[fournisseurs](/ecosystem/vendors/), dont beaucoup fournissent un support +commercial à OpenTelemetry et contribuent au projet directement. + +## Extensibilité + +OpenTelemetry est conçu pour être extensible. Quelques exemples de la façon dont +il peut être étendu incluent : + +- Ajouter un receveur au Collecteur OpenTelemetry afin de prendre en charge les + données de télémétrie venant d'une source de données personnalisée +- Charger des bibliothèques d'instrumentation personnalisées dans un SDK +- Créer une [distribution](/docs/concepts/distributions/) d'un SDK, ou du + collecteur adapté à une utilisation spécifique +- Créer un nouvel exportateur pour un backend personnalisé qui ne prend pas + encore en charge le protocole OpenTelemetry (OTLP) +- Créer un propagateur personnalisé pour un format de propagation de contexte + non standard + +Bien que la plupart des utilisateurs n’aient pas besoin d’étendre OpenTelemetry, +le projet est conçu pour rendre cela possible presque à tous les niveaux. + +## Histoire + +OpenTelemetry est un projet de la +[Cloud Native Computing Foundation (CNCF)](https://www.cncf.io) qui trouve son +origine dans la fusion de deux projets antérieurs, +[OpenTracing](https://opentracing.io) et [OpenCensus](https://opencensus.io). +Ces deux projets ont été créés pour résoudre le même problème : l'absence d'une +norme décrivant la manière d'instrumenter du code et de transmettre des données +de télémétrie à un backend d'observabilité. Aucun des projets n'étant en mesure +de résoudre ce problème de manière indépendante, ils ont fusionné pour former +OpenTelemetry et combiner leurs forces tout en offrant une solution unique. + +Si vous utilisez actuellement OpenTracing ou OpenCensus, vous pouvez découvrir +comment migrer vers OpenTelemetry dans le +[guide de migration](/docs/migration/). + +## Et ensuite ? + +- [Pour commencer](/docs/getting-started/) — Lancez-vous directement ! +- Découvrez les [concepts d'OpenTelemetry](/docs/concepts/) From e6eef276715e2121e73bb6e8e888bdbb3b52fe9a Mon Sep 17 00:00:00 2001 From: Damien Mathieu <42@dmathieu.com> Date: Wed, 16 Oct 2024 14:17:05 +0200 Subject: [PATCH 18/76] Remove otelmacaron from registry (#5418) --- data/registry/instrumentation-go-otelmacaron.yml | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 data/registry/instrumentation-go-otelmacaron.yml diff --git a/data/registry/instrumentation-go-otelmacaron.yml b/data/registry/instrumentation-go-otelmacaron.yml deleted file mode 100644 index 731c52ae1dbd..000000000000 --- a/data/registry/instrumentation-go-otelmacaron.yml +++ /dev/null @@ -1,16 +0,0 @@ -# cSpell:ignore otelmacaron macaron gopkg -title: Macaron Instrumentation -registryType: instrumentation -language: go -tags: - - macaron - - instrumentation - - go -license: Apache 2.0 -description: Package otelmacaron instruments gopkg.in/macaron.v1. -authors: - - name: OpenTelemetry Authors -urls: - repo: https://go.opentelemetry.io/contrib/instrumentation/gopkg.in/macaron.v1/otelmacaron -createdAt: 2023-12-05 -isFirstParty: false From 2394fa1f1c693e547093e46e83a6819d3c26e9d5 Mon Sep 17 00:00:00 2001 From: jack-berg <34418638+jack-berg@users.noreply.github.com> Date: Thu, 17 Oct 2024 10:05:49 -0500 Subject: [PATCH 19/76] Refactor java instrumentation (#5276) Co-authored-by: Patrice Chalin --- .gitmodules | 2 +- .htmltest.yml | 2 + content-modules/opentelemetry-java-examples | 2 +- content/en/blog/2023/spring-native/index.md | 10 +- content/en/docs/collector/deployment/agent.md | 2 +- .../concepts/instrumentation/libraries.md | 6 +- .../en/docs/languages/java/api-components.md | 1688 +++++++++++++++++ content/en/docs/languages/java/api.md | 4 +- .../en/docs/languages/java/configuration.md | 4 +- .../en/docs/languages/java/instrumentation.md | 1368 ++----------- content/en/docs/languages/java/libraries.md | 187 -- content/en/docs/languages/java/sdk.md | 24 +- layouts/partials/docs/native-libraries.md | 31 + .../docs/languages/libraries-intro.md | 22 +- .../docs/languages/native-libraries.md | 1 + static/refcache.json | 136 ++ 16 files changed, 2090 insertions(+), 1399 deletions(-) create mode 100644 content/en/docs/languages/java/api-components.md delete mode 100644 content/en/docs/languages/java/libraries.md create mode 100644 layouts/partials/docs/native-libraries.md create mode 100644 layouts/shortcodes/docs/languages/native-libraries.md diff --git a/.gitmodules b/.gitmodules index b3e0735ae018..ec8382827470 100644 --- a/.gitmodules +++ b/.gitmodules @@ -31,4 +31,4 @@ [submodule "content-modules/opentelemetry-java-examples"] path = content-modules/opentelemetry-java-examples url = https://github.com/open-telemetry/opentelemetry-java-examples.git - javaexamples-pin = 8fe9a11 + javaexamples-pin = 0f736ec diff --git a/.htmltest.yml b/.htmltest.yml index 9ad637f30f5d..58774c8382e5 100644 --- a/.htmltest.yml +++ b/.htmltest.yml @@ -10,6 +10,8 @@ IgnoreDirs: - ^blog/(\d+/)?page/\d+ # TODO drop after https://github.com/open-telemetry/opentelemetry.io/issues/5267 is fixed: - zh/docs/contributing/pr-checks + # TODO drop after https://github.com/open-telemetry/opentelemetry.io/issues/5423 is fixed: + - (ja|pt)/docs/concepts/instrumentation/libraries/ IgnoreInternalURLs: # list of paths IgnoreURLs: # list of regexs of paths or URLs to be ignored - ^/api$ diff --git a/content-modules/opentelemetry-java-examples b/content-modules/opentelemetry-java-examples index 8fe9a11a33af..0f736eca6a4b 160000 --- a/content-modules/opentelemetry-java-examples +++ b/content-modules/opentelemetry-java-examples @@ -1 +1 @@ -Subproject commit 8fe9a11a33affcc4942f2df6668cd6ce787cde3f +Subproject commit 0f736eca6a4b6865fb62b00033a53369e69440f7 diff --git a/content/en/blog/2023/spring-native/index.md b/content/en/blog/2023/spring-native/index.md index acb1127a0601..5c4aaab586fe 100644 --- a/content/en/blog/2023/spring-native/index.md +++ b/content/en/blog/2023/spring-native/index.md @@ -37,11 +37,11 @@ Boot 3) out of the box: ``` To get even more visibility, the Starter can be combined with -[instrumentation libraries](/docs/languages/java/libraries/). For this purpose, -the OpenTelemetry Java contributors have improved the JDBC (database) libraries -and logging instrumentation libraries. For example, for the Logback logging -library, they have added GraalVM configuration to make the library work in -native mode[^1]. +[instrumentation libraries](/docs/languages/java/instrumentation/). For this +purpose, the OpenTelemetry Java contributors have improved the JDBC (database) +libraries and logging instrumentation libraries. For example, for the Logback +logging library, they have added GraalVM configuration to make the library work +in native mode[^1]. Furthermore, they have worked to reduce the configuration to set up the logging and database instrumentation with the Starter. For example, if your application diff --git a/content/en/docs/collector/deployment/agent.md b/content/en/docs/collector/deployment/agent.md index 2a17343c3b7b..eff8d8df82ef 100644 --- a/content/en/docs/collector/deployment/agent.md +++ b/content/en/docs/collector/deployment/agent.md @@ -129,7 +129,7 @@ Cons: [instrumentation]: /docs/languages/ [otlp]: /docs/specs/otel/protocol/ [collector]: /docs/collector/ -[instrument-java-metrics]: /docs/languages/java/instrumentation/#metrics +[instrument-java-metrics]: /docs/languages/java/api-components/#meterprovider [otlp-exporter]: /docs/specs/otel/protocol/exporter/ [java-otlp-example]: https://github.com/open-telemetry/opentelemetry-java-docs/tree/main/otlp diff --git a/content/en/docs/concepts/instrumentation/libraries.md b/content/en/docs/concepts/instrumentation/libraries.md index 9d240f97b2ad..3501730b343c 100644 --- a/content/en/docs/concepts/instrumentation/libraries.md +++ b/content/en/docs/concepts/instrumentation/libraries.md @@ -265,7 +265,7 @@ After you create a span, pass new trace context to the application code (callback or handler), by making the span active; if possible, do this explicitly. The following Java example shows how to add trace context and activate a span. See the -[Context extraction in Java](/docs/languages/java/instrumentation/#context-propagation), +[Context extraction in Java](/docs/languages/java/api-components/#contextpropagators), for more examples. ```java @@ -289,9 +289,7 @@ try (Scope unused = span.makeCurrent()) { ``` In the case of a messaging system, you might receive more than one message at -once. Received messages become -[links](/docs/languages/java/instrumentation/#create-spans-with-links) on the -span you create. Refer to +once. Received messages become links on the span you create. Refer to [messaging conventions](/docs/specs/semconv/messaging/messaging-spans/) for details. diff --git a/content/en/docs/languages/java/api-components.md b/content/en/docs/languages/java/api-components.md new file mode 100644 index 000000000000..c5df547cdf7a --- /dev/null +++ b/content/en/docs/languages/java/api-components.md @@ -0,0 +1,1688 @@ +--- +title: Record Telemetry with API +weight: 11 +logBridgeWarning: > + While the `LoggerProvider` / `Logger` APIs are structurally similar to the + equivalent trace and metric APIs, they serve a different use case. As of now, + `LoggerProvider` / `Logger` and associated classes represent the [Log Bridge + API](/docs/specs/otel/logs/bridge-api/), which exists to write log appenders + to bridge logs recorded through other log APIs / frameworks into + OpenTelemetry. They are not intended for end user use as a replacement for + Log4j / SLF4J / Logback / etc. +cSpell:ignore: Dotel kotlint Logback updowncounter +--- + + + + +The API is a set of classes and interfaces for recording telemetry across key +observability signals. The [SDK](../sdk/) is the built-in reference +implementation of the API, [configured](../configuration/) to process and export +telemetry. This page is a conceptual overview of the API, including +descriptions, links to relevant Javadocs, artifact coordinates, and sample API +usage. + +The API consists of the following top-level components: + +- [Context](#context-api): A standalone API for propagating context throughout + an application and across application boundaries, including trace context and + baggage. +- [TracerProvider](#tracerprovider): The API entry point for traces. +- [MeterProvider](#meterprovider): The API entry point for metrics. +- [LoggerProvider](#loggerprovider): The API entry point for logs. +- [OpenTelemetry](#opentelemetry): A holder for top-level API components (i.e. + `TracerProvider`, `MeterProvider`, `LoggerProvider`, `ContextPropagators`) + which is convenient to pass to instrumentation. + +The API is designed to support multiple implementations. Two implementations are +provided by OpenTelemetry: + +- [SDK](../sdk/) reference implementation. This is the right choice for most + users. +- [Noop](#noop-implementation) implementation. A minimalist, zero-dependency + implementation for instrumentations to use by default when the user doesn't + install an instance. + +The API is designed to be taken as a direct dependency by libraries, frameworks, +and application owners. It comes with +[strong backwards compatibility guarantees](https://github.com/open-telemetry/opentelemetry-java/blob/main/VERSIONING.md#compatibility-requirements), +zero transitive dependencies, and +[supports Java 8+](https://github.com/open-telemetry/opentelemetry-java/blob/main/VERSIONING.md#language-version-compatibility). +Libraries and frameworks should depend only on the API and only call methods +from the API, and instruct applications / end users to add a dependency on the +SDK and install a configured instance. + +## API Components + +The following sections describe the OpenTelemetry API. Each component section +includes: + +- A brief description, including a link to the Javadoc type reference. +- Links to relevant resources to understand the API methods and arguments. +- A simple exploration of API usage. + +## Context API + +The `io.opentelemetry:opentelemetry-api-context:{{% param vers.otel %}}` +artifact contains standalone APIs (i.e. packaged separately from +[OpenTelemetry API](#opentelemetry-api)) for propagating context throughout an +application and across application boundaries. + +It consists of: + +- [Context](#context): An immutable bundle of key value pairs which is + implicitly or explicitly propagated through an application. +- [ContextStorage](#contextstorage): A mechanism for storing and retrieving the + current context, defaulting to thread local. +- [ContextPropagators](#context): A container of registered propagators for + propagating `Context` across application boundaries. + +The `io.opentelemetry:opentelemetry-extension-kotlint:{{% param vers.otel %}}` +is an extension with tools for propagating context into coroutines. + +### Context + +[Context](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-context/latest/io/opentelemetry/context/Context.html) +is an immutable bundle of key value pairs, with utilities for implicitly +propagating through an application and across threads. Implicit propagation +means that the context can be accessed without explicitly passing it as an +argument. Context is a recurring concept in the OpenTelemetry API: + +- The current active [Span](#span) is stored in context, and by default a span's + parent is assigned to whatever span is currently in context. +- The measurements recorded to [metric instruments](#meter) accept a context + argument, used to link measurements to spans via + [exemplars](/docs/specs/otel/metrics/data-model/#exemplars) and defaulting to + whatever span is currently in context. +- [LogRecords](#logrecordbuilder) accept a context argument, used to link log + record spans and defaulting to whatever span is currently in context. + +The following code snippet explores `Context` API usage: + + + +```java +package otel; + +import io.opentelemetry.context.Context; +import io.opentelemetry.context.ContextKey; +import io.opentelemetry.context.Scope; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class ContextUsage { + public static void contextUsage() throws Exception { + // Define an example context key + ContextKey exampleContextKey = ContextKey.named("example-context-key"); + + // Context doesn't contain the key until we add it + // Context.current() accesses the current context + // output => current context value: null + System.out.println("current context value: " + Context.current().get(exampleContextKey)); + + // Add entry to context + Context context = Context.current().with(exampleContextKey, "value"); + + // The local context var contains the added value + // output => context value: value + System.out.println("context value: " + context.get(exampleContextKey)); + // The current context still doesn't contain the value + // output => current context value: null + System.out.println("current context value: " + Context.current().get(exampleContextKey)); + + // Calling context.makeCurrent() sets Context.current() to the context until the scope is + // closed, upon which Context.current() is restored to the state prior to when + // context.makeCurrent() was called. The resulting Scope implements AutoCloseable and is + // normally used in a try-with-resources block. Failure to call Scope.close() is an error and + // may cause memory leaks or other issues. + try (Scope scope = context.makeCurrent()) { + // The current context now contains the added value + // output => context value: value + System.out.println("context value: " + context.get(exampleContextKey)); + } + + // The local context var still contains the added value + // output => context value: value + System.out.println("context value: " + context.get(exampleContextKey)); + // The current context no longer contains the value + // output => current context value: null + System.out.println("current context value: " + Context.current().get(exampleContextKey)); + + ExecutorService executorService = Executors.newSingleThreadExecutor(); + ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); + + // Context instances can be explicitly passed around application code, but it's more convenient + // to use implicit context, calling Context.makeCurrent() and accessing via Context.current(). + // Context provides a number of utilities for implicit context propagation. These utilities wrap + // utility classes like Scheduler, ExecutorService, ScheduledExecutorService, Runnable, + // Callable, Consumer, Supplier, Function, etc and modify their behavior to call + // Context.makeCurrent() before running. + context.wrap(ContextUsage::callable).call(); + context.wrap(ContextUsage::runnable).run(); + context.wrap(executorService).submit(ContextUsage::runnable); + context.wrap(scheduledExecutorService).schedule(ContextUsage::runnable, 1, TimeUnit.SECONDS); + context.wrapConsumer(ContextUsage::consumer).accept(new Object()); + context.wrapConsumer(ContextUsage::biConsumer).accept(new Object(), new Object()); + context.wrapFunction(ContextUsage::function).apply(new Object()); + context.wrapSupplier(ContextUsage::supplier).get(); + } + + /** Example {@link java.util.concurrent.Callable}. */ + private static Object callable() { + return new Object(); + } + + /** Example {@link Runnable}. */ + private static void runnable() {} + + /** Example {@link java.util.function.Consumer}. */ + private static void consumer(Object object) {} + + /** Example {@link java.util.function.BiConsumer}. */ + private static void biConsumer(Object object1, Object object2) {} + + /** Example {@link java.util.function.Function}. */ + private static Object function(Object object) { + return object; + } + + /** Example {@link java.util.function.Supplier}. */ + private static Object supplier() { + return new Object(); + } +} +``` + + +### ContextStorage + +[ContextStorage](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-context/latest/io/opentelemetry/context/ContextStorage.html) +is a mechanism for storing and retrieving the current `Context`. + +The default `ContextStorage` implementation stores `Context` in thread local. + +### ContextPropagators + +[ContextPropagators](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-context/latest/io/opentelemetry/context/propagation/ContextPropagators.html) +is a container of registered propagators for propagating `Context` across +application boundaries. Context is injected into a carrier when leaving an +application (i.e. an outbound HTTP request), and extracted from a carrier when +entering an application (i.e. serving an HTTP request). + +See [SDK TextMapPropagators](../sdk/#textmappropagator) for propagator +implementations. + +The following code snippet explores `ContextPropagators` API for injection: + + + +```java +package otel; + +import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; +import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.context.propagation.TextMapSetter; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +public class InjectContextUsage { + private static final TextMapSetter TEXT_MAP_SETTER = new HttpRequestSetter(); + + public static void injectContextUsage() throws Exception { + // Create a ContextPropagators instance which propagates w3c trace context and w3c baggage + ContextPropagators propagators = + ContextPropagators.create( + TextMapPropagator.composite( + W3CTraceContextPropagator.getInstance(), W3CBaggagePropagator.getInstance())); + + // Create an HttpRequest builder + HttpClient httpClient = HttpClient.newBuilder().build(); + HttpRequest.Builder requestBuilder = + HttpRequest.newBuilder().uri(new URI("http://127.0.0.1:8080/resource")).GET(); + + // Given a ContextPropagators instance, inject the current context into the HTTP request carrier + propagators.getTextMapPropagator().inject(Context.current(), requestBuilder, TEXT_MAP_SETTER); + + // Send the request with the injected context + httpClient.send(requestBuilder.build(), HttpResponse.BodyHandlers.discarding()); + } + + /** {@link TextMapSetter} with a {@link HttpRequest.Builder} carrier. */ + private static class HttpRequestSetter implements TextMapSetter { + @Override + public void set(HttpRequest.Builder carrier, String key, String value) { + if (carrier == null) { + return; + } + carrier.setHeader(key, value); + } + } +} +``` + + +The following code snippet explores `ContextPropagators` API for extraction: + + + +```java +package otel; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; +import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; +import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.context.propagation.TextMapGetter; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.context.propagation.TextMapSetter; +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.util.List; + +public class ExtractContextUsage { + private static final TextMapGetter TEXT_MAP_GETTER = new HttpRequestGetter(); + + public static void extractContextUsage() throws Exception { + // Create a ContextPropagators instance which propagates w3c trace context and w3c baggage + ContextPropagators propagators = + ContextPropagators.create( + TextMapPropagator.composite( + W3CTraceContextPropagator.getInstance(), W3CBaggagePropagator.getInstance())); + + // Create a server, which uses the propagators to extract context from requests + HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); + server.createContext("/path", new Handler(propagators)); + server.setExecutor(null); + server.start(); + } + + private static class Handler implements HttpHandler { + private final ContextPropagators contextPropagators; + + private Handler(ContextPropagators contextPropagators) { + this.contextPropagators = contextPropagators; + } + + @Override + public void handle(HttpExchange exchange) throws IOException { + // Extract the context from the request and make the context current + Context extractedContext = + contextPropagators + .getTextMapPropagator() + .extract(Context.current(), exchange, TEXT_MAP_GETTER); + try (Scope scope = extractedContext.makeCurrent()) { + // Do work with the extracted context + } finally { + String response = "success"; + exchange.sendResponseHeaders(200, response.length()); + OutputStream os = exchange.getResponseBody(); + os.write(response.getBytes(StandardCharsets.UTF_8)); + os.close(); + } + } + } + + /** {@link TextMapSetter} with a {@link HttpExchange} carrier. */ + private static class HttpRequestGetter implements TextMapGetter { + @Override + public Iterable keys(HttpExchange carrier) { + return carrier.getRequestHeaders().keySet(); + } + + @Override + public String get(HttpExchange carrier, String key) { + if (carrier == null) { + return null; + } + List headers = carrier.getRequestHeaders().get(key); + if (headers == null || headers.isEmpty()) { + return null; + } + return headers.get(0); + } + } +} +``` + + +## OpenTelemetry API + +The `io.opentelemetry:opentelemetry-api:{{% param vers.otel %}}` artifact +contains the OpenTelemetry API, including traces, metrics, logs, noop +implementation, baggage, key `TextMapPropagator` implementations, and a +dependency on the [context API](#context-api). + +### Providers and Scopes + +Providers and scopes are recurring concepts in the OpenTelemetry API. A scope is +a logical unit within the application which telemetry is associated with. A +provider provides components for recording telemetry relative to a particular +scope: + +- [TracerProvider](#tracerprovider) provides scoped [Tracers](#tracer) for + recording spans. +- [MeterProvider](#meterprovider) provides scoped [Meters](#meter) for recording + metrics. +- [LoggerProvider](#loggerprovider) provides scoped [Loggers](#logger) for + recording logs. + +{{% alert %}} {{% param logBridgeWarning %}} {{% /alert %}} + +A scope is identified by the triplet (name, version, schemaUrl). Care must be +taken to ensure the scope identity is unique. A typical approach is to set the +scope name to the package name or fully qualified class name, and to set the +scope version to the library version. If emitting telemetry for multiple signals +(i.e. metrics and traces), the same scope should be used. See +[instrumentation scope](/docs/concepts/instrumentation-scope/) for details. + +The following code snippet explores provider and scope API usage: + + + +```java +package otel; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.api.logs.LoggerProvider; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.metrics.MeterProvider; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.api.trace.TracerProvider; + +public class ProvidersAndScopes { + + private static final String SCOPE_NAME = "fully.qualified.name"; + private static final String SCOPE_VERSION = "1.0.0"; + private static final String SCOPE_SCHEMA_URL = "https://example"; + + public static void providersUsage(OpenTelemetry openTelemetry) { + // Access providers from an OpenTelemetry instance + TracerProvider tracerProvider = openTelemetry.getTracerProvider(); + MeterProvider meterProvider = openTelemetry.getMeterProvider(); + // NOTE: LoggerProvider is a special case and should only be used to bridge logs from other + // logging APIs / frameworks into OpenTelemetry. + LoggerProvider loggerProvider = openTelemetry.getLogsBridge(); + + // Access tracer, meter, logger from providers to record telemetry for a particular scope + Tracer tracer = + tracerProvider + .tracerBuilder(SCOPE_NAME) + .setInstrumentationVersion(SCOPE_VERSION) + .setSchemaUrl(SCOPE_SCHEMA_URL) + .build(); + Meter meter = + meterProvider + .meterBuilder(SCOPE_NAME) + .setInstrumentationVersion(SCOPE_VERSION) + .setSchemaUrl(SCOPE_SCHEMA_URL) + .build(); + Logger logger = + loggerProvider + .loggerBuilder(SCOPE_NAME) + .setInstrumentationVersion(SCOPE_VERSION) + .setSchemaUrl(SCOPE_SCHEMA_URL) + .build(); + + // ...optionally, shorthand versions are available if scope version and schemaUrl aren't + // available + tracer = tracerProvider.get(SCOPE_NAME); + meter = meterProvider.get(SCOPE_NAME); + logger = loggerProvider.get(SCOPE_NAME); + } +} +``` + + +### Attributes + +[Attributes](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/common/Attributes.html) +is a bundle of key value pairs representing the +[standard attribute definition](/docs/specs/otel/common/#standard-attribute). +`Attributes` are a recurring concept in the OpenTelemetry API: + +- [Spans](#span), span events, and span links have attributes. +- The measurements recorded to [metric instruments](#meter) have attributes. +- [LogRecords](#logrecordbuilder) have attributes. + +See [semantic attributes](#semantic-attributes) for attribute constants +generated from the semantic conventions. + +See [attribute naming](/docs/specs/semconv/general/attribute-naming/) for +guidance on attribute naming. + +The following code snippet explores `Attributes` API usage: + + + +```java +package otel; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.AttributesBuilder; +import java.util.Map; + +public class AttributesUsage { + // Establish static constant for attribute keys and reuse to avoid allocations + private static final AttributeKey SHOP_ID = AttributeKey.stringKey("com.acme.shop.id"); + private static final AttributeKey SHOP_NAME = + AttributeKey.stringKey("com.acme.shop.name"); + private static final AttributeKey CUSTOMER_ID = + AttributeKey.longKey("com.acme.customer.id"); + private static final AttributeKey CUSTOMER_NAME = + AttributeKey.stringKey("com.acme.customer.name"); + + public static void attributesUsage() { + // Use a varargs initializer and pre-allocated attribute keys. This is the most efficient way to + // create attributes. + Attributes attributes = + Attributes.of( + SHOP_ID, + "abc123", + SHOP_NAME, + "opentelemetry-demo", + CUSTOMER_ID, + 123L, + CUSTOMER_NAME, + "Jack"); + + // ...or use a builder. + attributes = + Attributes.builder() + .put(SHOP_ID, "abc123") + .put(SHOP_NAME, "opentelemetry-demo") + .put(CUSTOMER_ID, 123) + .put(CUSTOMER_NAME, "Jack") + // Optionally initialize attribute keys on the fly + .put(AttributeKey.stringKey("com.acme.string-key"), "value") + .put(AttributeKey.booleanKey("com.acme.bool-key"), true) + .put(AttributeKey.longKey("com.acme.long-key"), 1L) + .put(AttributeKey.doubleKey("com.acme.double-key"), 1.1) + .put(AttributeKey.stringArrayKey("com.acme.string-array-key"), "value1", "value2") + .put(AttributeKey.booleanArrayKey("come.acme.bool-array-key"), true, false) + .put(AttributeKey.longArrayKey("come.acme.long-array-key"), 1L, 2L) + .put(AttributeKey.doubleArrayKey("come.acme.double-array-key"), 1.1, 2.2) + // Optionally omit initializing AttributeKey + .put("com.acme.string-key", "value") + .put("com.acme.bool-key", true) + .put("come.acme.long-key", 1L) + .put("come.acme.double-key", 1.1) + .put("come.acme.string-array-key", "value1", "value2") + .put("come.acme.bool-array-key", true, false) + .put("come.acme.long-array-key", 1L, 2L) + .put("come.acme.double-array-key", 1.1, 2.2) + .build(); + + // Attributes has a variety of methods for manipulating and reading data. + // Read an attribute key: + String shopIdValue = attributes.get(SHOP_ID); + // Inspect size: + int size = attributes.size(); + boolean isEmpty = attributes.isEmpty(); + // Convert to a map representation: + Map, Object> map = attributes.asMap(); + // Iterate through entries, printing each to the template: (): \n + attributes.forEach( + (attributeKey, value) -> + System.out.printf( + "%s (%s): %s%n", attributeKey.getKey(), attributeKey.getType(), value)); + // Convert to a builder, remove the com.acme.customer.id and any entry whose key starts with + // com.acme.shop, and build a new instance: + AttributesBuilder builder = attributes.toBuilder(); + builder.remove(CUSTOMER_ID); + builder.removeIf(attributeKey -> attributeKey.getKey().startsWith("com.acme.shop")); + Attributes trimmedAttributes = builder.build(); + } +} +``` + + +### OpenTelemetry + +[OpenTelemetry](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/OpenTelemetry.html) +is a holder for top-level API components which is convenient to pass to +instrumentation. + +`OpenTelemetry` consists of: + +- [TracerProvider](#tracerprovider): The API entry point for traces. +- [MeterProvider](#meterprovider): The API entry point for metrics. +- [LoggerProvider](#loggerprovider): The API entry point for logs. +- [ContextPropagators](#contextpropagators): The API entry point for context + propagation. + +The following code snippet explores `OpenTelemetry` API usage: + + + +```java +package otel; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.logs.LoggerProvider; +import io.opentelemetry.api.metrics.MeterProvider; +import io.opentelemetry.api.trace.TracerProvider; +import io.opentelemetry.context.propagation.ContextPropagators; + +public class OpenTelemetryUsage { + private static final Attributes WIDGET_RED_CIRCLE = Util.WIDGET_RED_CIRCLE; + + public static void openTelemetryUsage(OpenTelemetry openTelemetry) { + // Access TracerProvider, MeterProvider, LoggerProvider, ContextPropagators + TracerProvider tracerProvider = openTelemetry.getTracerProvider(); + MeterProvider meterProvider = openTelemetry.getMeterProvider(); + LoggerProvider loggerProvider = openTelemetry.getLogsBridge(); + ContextPropagators propagators = openTelemetry.getPropagators(); + } +} +``` + + +### GlobalOpenTelemetry + +[GlobalOpenTelemetry](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/GlobalOpenTelemetry.html) +holds a global singleton [OpenTelemetry](#opentelemetry) instance. + +Instrumentation should avoid using `GlobalOpenTelemetry`. Instead, accept +`OpenTelemetry` as an initialization argument and default to the +[Noop implementation](#noop-implementation) if not set. There is an exception to +this rule: the `OpenTelemetry` instance installed by the +[Java agent](/docs/zero-code/java/agent/) is available via +`GlobalOpenTelemetry`. Users with additional manual instrumentation are +encouraged to access it via `GlobalOpenTelemetry.get()`. + +`GlobalOpenTelemetry.get()` is guaranteed to always return the same result. If +`GlobalOpenTelemetry.get()` is called before `GlobalOpenTelemetry.set(..)`, +`GlobalOpenTelemetry` is set to the noop implementation and future calls to +`GlobalOpenTelemetry.set(..)` throw an exception. Therefore, it's critical to +call `GlobalOpenTelemetry.set(..)` as early in the application lifecycle as +possible, and before `GlobalOpenTelemetry.get()` is called by any +instrumentation. This guarantee surfaces initialization ordering issues: calling +`GlobalOpenTelemetry.set()` too late (i.e. after instrumentation has called +`GlobalOpenTelemetry.get()`) triggers an exception rather than silently failing. + +If [autoconfigure](../configuration/#zero-code-sdk-autoconfigure) is present, +`GlobalOpenTelemetry` can be automatically initialized by setting +`-Dotel.java.global-autoconfigure.enabled=true` (or via env var +`export OTEL_JAVA_GLOBAL_AUTOCONFIGURE_ENABLED=true`). When enabled, the first +call to `GlobalOpenTelemetry.get()` triggers autoconfiguration and calls +`GlobalOpenTelemetry.set(..)` with the resulting `OpenTelemetry` instance. + +The following code snippet explores `GlobalOpenTelemetry` API context +propagation: + + + +```java +package otel; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; + +public class GlobalOpenTelemetryUsage { + + public static void openTelemetryUsage(OpenTelemetry openTelemetry) { + // Set the GlobalOpenTelemetry instance as early in the application lifecycle as possible + // Set must only be called once. Calling multiple times raises an exception. + GlobalOpenTelemetry.set(openTelemetry); + + // Get the GlobalOpenTelemetry instance. + openTelemetry = GlobalOpenTelemetry.get(); + } +} +``` + + +### TracerProvider + +[TracerProvider](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/trace/TracerProvider.html) +is the API entry point for traces and provides [Tracers](#tracer). See +[providers and scopes](#providers-and-scopes) for information on providers and +scopes. + +#### Tracer + +[Tracer](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/trace/Tracer.html) +is used to [record spans](#span) for an instrumentation scope. See +[providers and scopes](#providers-and-scopes) for information on providers and +scopes. + +#### Span + +[SpanBuilder](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/trace/SpanBuilder.html) +and +[Span](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/trace/Span.html) +are used to construct and record data to spans. + +`SpanBuilder` is used to add data to a span before starting it by calling +`Span startSpan()`. Data can be added / updated after starting by calling +various `Span` update methods. The data provided to `SpanBuilder` before +starting is provided as an input to [Samplers](../sdk/#sampler). + +The following code snippet explores `SpanBuilder` / `Span` API usage: + + + +```java +package otel; + +import static io.opentelemetry.context.Context.current; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.api.trace.Tracer; +import java.util.Arrays; + +public class SpanUsage { + private static final Attributes WIDGET_RED_CIRCLE = Util.WIDGET_RED_CIRCLE; + + public static void spanUsage(Tracer tracer) { + // Get a span builder by providing the span name + Span span = + tracer + .spanBuilder("span name") + // Set span kind + .setSpanKind(SpanKind.INTERNAL) + // Set attributes + .setAttribute(AttributeKey.stringKey("com.acme.string-key"), "value") + .setAttribute(AttributeKey.booleanKey("com.acme.bool-key"), true) + .setAttribute(AttributeKey.longKey("com.acme.long-key"), 1L) + .setAttribute(AttributeKey.doubleKey("com.acme.double-key"), 1.1) + .setAttribute( + AttributeKey.stringArrayKey("com.acme.string-array-key"), + Arrays.asList("value1", "value2")) + .setAttribute( + AttributeKey.booleanArrayKey("come.acme.bool-array-key"), + Arrays.asList(true, false)) + .setAttribute( + AttributeKey.longArrayKey("come.acme.long-array-key"), Arrays.asList(1L, 2L)) + .setAttribute( + AttributeKey.doubleArrayKey("come.acme.double-array-key"), Arrays.asList(1.1, 2.2)) + // Optionally omit initializing AttributeKey + .setAttribute("com.acme.string-key", "value") + .setAttribute("com.acme.bool-key", true) + .setAttribute("come.acme.long-key", 1L) + .setAttribute("come.acme.double-key", 1.1) + .setAllAttributes(WIDGET_RED_CIRCLE) + // Uncomment to optionally explicitly set the parent span context. If omitted, the + // span's parent will be set using Context.current(). + // .setParent(parentContext) + // Uncomment to optionally add links. + // .addLink(linkContext, linkAttributes) + // Start the span + .startSpan(); + + // Check if span is recording before computing additional data + if (span.isRecording()) { + // Update the span name with information not available when starting + span.updateName("new span name"); + + // Add additional attributes not available when starting + span.setAttribute("com.acme.string-key2", "value"); + + // Add additional span links not available when starting + span.addLink(exampleLinkContext()); + // optionally include attributes on the link + span.addLink(exampleLinkContext(), WIDGET_RED_CIRCLE); + + // Add span events + span.addEvent("my-event"); + // optionally include attributes on the event + span.addEvent("my-event", WIDGET_RED_CIRCLE); + + // Record exception, syntactic sugar for a span event with a specific shape + span.recordException(new RuntimeException("error")); + + // Set the span status + span.setStatus(StatusCode.OK, "status description"); + } + + // Finally, end the span + span.end(); + } + + /** Return a dummy link context. */ + private static SpanContext exampleLinkContext() { + return Span.fromContext(current()).getSpanContext(); + } +} +``` + + +Span parenting is an important aspect of tracing. Each span has an optional +parent. By collecting all the spans in a trace and following each span's parent, +we can construct a hierarchy. The span APIs are built on top of +[context](#context), which allows span context to be implicitly passed around an +application and across threads. When a span is created, its parent is set to the +whatever span is present in `Context.current()` unless there is no span or the +context is explicitly overridden. + +Most of the context API usage guidance applies to spans. Span context is +propagated across application boundaries with the +[W3CTraceContextPropagator](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/trace/propagation/W3CTraceContextPropagator.html) +and other [TextMapPropagators](../sdk/#textmappropagator). + +The following code snippet explores `Span` API context propagation: + + + +```java +package otel; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; + +public class SpanAndContextUsage { + private final Tracer tracer; + + SpanAndContextUsage(Tracer tracer) { + this.tracer = tracer; + } + + public void nestedSpanUsage() { + // Start a span. Since we don't call makeCurrent(), we must explicitly call setParent on + // children. Wrap code in try / finally to ensure we end the span. + Span span = tracer.spanBuilder("span").startSpan(); + try { + // Start a child span, explicitly setting the parent. + Span childSpan = + tracer + .spanBuilder("span child") + // Explicitly set parent. + .setParent(span.storeInContext(Context.current())) + .startSpan(); + // Call makeCurrent(), adding childSpan to Context.current(). Spans created inside the scope + // will have their parent set to childSpan. + try (Scope childSpanScope = childSpan.makeCurrent()) { + // Call another method which creates a span. The span's parent will be childSpan since it is + // started in the childSpan scope. + doWork(); + } finally { + childSpan.end(); + } + } finally { + span.end(); + } + } + + private int doWork() { + Span doWorkSpan = tracer.spanBuilder("doWork").startSpan(); + try (Scope scope = doWorkSpan.makeCurrent()) { + int result = 0; + for (int i = 0; i < 10; i++) { + result += i; + } + return result; + } finally { + doWorkSpan.end(); + } + } +} +``` + + +### MeterProvider + +[MeterProvider](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/MeterProvider.html) +is the API entry point for metrics and provides [Meters](#meter). See +[providers and scopes](#providers-and-scopes) for information on providers and +scopes. + +#### Meter + +[Meter](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/Meter.html) +is used to obtain instruments for a particular +[instrumentation scope](#providers-and-scopes). See +[providers and scopes](#providers-and-scopes) for information on providers and +scopes. There are a variety of instruments, each with different semantics and +default behavior in the SDK. It's important to choose the right instrument for +each particular use case: + +| Instrument | Sync or Async | Description | Example | Default SDK Aggregation | +| ------------------------------------------- | ------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| [Counter](#counter) | sync | Record monotonic (positive) values. | Record user logins | [sum (monotonic=true)](/docs/specs/otel/metrics/sdk/#sum-aggregation) | +| [Async Counter](#async-counter) | async | Observe monotonic sums. | Observe number of classes loaded in the JVM | [sum (monotonic=true)](/docs/specs/otel/metrics/sdk/#sum-aggregation) | +| [UpDownCounter](#updowncounter) | sync | Record non-monotonic (positive and negative) values. | Record when items are added to and removed from a queue | [sum (monotonic=false)](/docs/specs/otel/metrics/sdk/#sum-aggregation) | +| [Async UpDownCounter](#async-updowncounter) | async | Observe non-monotonic (positive and negative) sums. | Observe JVM memory pool usage | [sum (monotonic=false)](/docs/specs/otel/metrics/sdk/#sum-aggregation) | +| [Histogram](#histogram) | sync | Record monotonic (positive) values where the distribution is important. | Record duration of HTTP requests processed by server | [ExplicitBucketHistogram](/docs/specs/otel/metrics/sdk/#explicit-bucket-histogram-aggregation) | +| [Gauge](#gauge) | sync | Record the latest value where spatial re-aggregation does not make sense **[1]**. | Record temperature | [LastValue](/docs/specs/otel/metrics/sdk/#last-value-aggregation) | +| [Async Gauge](#async-gauge) | async | Observe the latest value where spatial re-aggregation does not make sense **[1]**. | Observe CPU utilization | [LastValue](/docs/specs/otel/metrics/sdk/#last-value-aggregation) | + +**[1]**: Spatial re-aggregation is the process of merging attribute streams by +dropping attributes which are not needed. For example, given series with +attributes `{"color": "red", "shape": "square"}`, +`{"color": "blue", "shape": "square"}`, you can perform spatial re-aggregation +by dropping the `color` attribute, and merging the series where the attributes +are equal after dropping `color`. Most aggregations have a useful spatial +aggregation merge function (i.e. sums are summed together), but gauges +aggregated by the `LastValue` aggregation are the exception. For example, +suppose the series mentioned previously are tracking the temperature of widgets. +How do you merge the series when you drop the `color` attribute? There is no +good answer besides flipping a coin and selecting a random value. + +The instrument APIs have share a variety of features: + +- Created using the builder pattern. +- Required instrument name. +- Optional unit and description. +- Record values which are `long` or `double`, which is configured via the + builder. + +See +[metric guidelines](http://localhost:1313/docs/specs/semconv/general/metrics/#general-guidelines) +for details on metric naming and units. + +See +[guidelines for instrumentation library authors](/docs/specs/otel/metrics/supplementary-guidelines/#guidelines-for-instrumentation-library-authors) +for additional guidance on instrument selection. + +#### Counter + +[LongCounter](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/LongCounter.html) +and +[DoubleCounter](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/DoubleCounter.html) +are used to record monotonic (positive) values. + +The following code snippet explores counter API usage: + + + +```java +package otel; + +import static otel.Util.WIDGET_COLOR; +import static otel.Util.WIDGET_SHAPE; +import static otel.Util.computeWidgetColor; +import static otel.Util.computeWidgetShape; +import static otel.Util.customContext; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.LongCounter; +import io.opentelemetry.api.metrics.Meter; + +public class CounterUsage { + private static final Attributes WIDGET_RED_CIRCLE = Util.WIDGET_RED_CIRCLE; + + public static void counterUsage(Meter meter) { + // Construct a counter to record measurements that are always positive (monotonically + // increasing). + LongCounter counter = + meter + .counterBuilder("fully.qualified.counter") + .setDescription("A count of produced widgets") + .setUnit("{widget}") + // optionally change the type to double + // .ofDoubles() + .build(); + + // Record a measurement with no attributes or context. + // Attributes defaults to Attributes.empty(), context to Context.current(). + counter.add(1L); + + // Record a measurement with attributes, using pre-allocated attributes whenever possible. + counter.add(1L, WIDGET_RED_CIRCLE); + // Sometimes, attributes must be computed using application context. + counter.add( + 1L, Attributes.of(WIDGET_SHAPE, computeWidgetShape(), WIDGET_COLOR, computeWidgetColor())); + + // Record a measurement with attributes, and context. + // Most users will opt to omit the context argument, preferring the default Context.current(). + counter.add(1L, WIDGET_RED_CIRCLE, customContext()); + } +} +``` + + +#### Async Counter + +[ObservableLongCounter](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableLongCounter.htmll) +and +[ObservableDoubleCounter](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableDoubleCounter.html) +are used to observe monotonic (positive) sums. + +The following code snippet explores async counter API usage: + + + +```java +package otel; + +import static otel.Util.WIDGET_COLOR; +import static otel.Util.WIDGET_SHAPE; +import static otel.Util.computeWidgetColor; +import static otel.Util.computeWidgetShape; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.metrics.ObservableLongCounter; +import java.util.concurrent.atomic.AtomicLong; + +public class AsyncCounterUsage { + // Pre-allocate attributes whenever possible + private static final Attributes WIDGET_RED_CIRCLE = Util.WIDGET_RED_CIRCLE; + + public static void asyncCounterUsage(Meter meter) { + AtomicLong widgetCount = new AtomicLong(); + + // Construct an async counter to observe an existing counter in a callback + ObservableLongCounter asyncCounter = + meter + .counterBuilder("fully.qualified.counter") + .setDescription("A count of produced widgets") + .setUnit("{widget}") + // Uncomment to optionally change the type to double + // .ofDoubles() + .buildWithCallback( + // the callback is invoked when a MetricReader reads metrics + observableMeasurement -> { + long currentWidgetCount = widgetCount.get(); + + // Record a measurement with no attributes. + // Attributes defaults to Attributes.empty(). + observableMeasurement.record(currentWidgetCount); + + // Record a measurement with attributes, using pre-allocated attributes whenever + // possible. + observableMeasurement.record(currentWidgetCount, WIDGET_RED_CIRCLE); + // Sometimes, attributes must be computed using application context. + observableMeasurement.record( + currentWidgetCount, + Attributes.of( + WIDGET_SHAPE, computeWidgetShape(), WIDGET_COLOR, computeWidgetColor())); + }); + + // Optionally close the counter to unregister the callback when required + asyncCounter.close(); + } +} +``` + + +#### UpDownCounter + +[LongUpDownCounter](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/LongUpDownCounter.html) +and +[DoubleUpDownCounter](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/DoubleUpDownCounter.html) +are used to record non-monotonic (positive and negative) values. + +The following code snippet explores updowncounter API usage: + + + +```java +package otel; + +import static otel.Util.WIDGET_COLOR; +import static otel.Util.WIDGET_SHAPE; +import static otel.Util.computeWidgetColor; +import static otel.Util.computeWidgetShape; +import static otel.Util.customContext; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.LongUpDownCounter; +import io.opentelemetry.api.metrics.Meter; + +public class UpDownCounterUsage { + + private static final Attributes WIDGET_RED_CIRCLE = Util.WIDGET_RED_CIRCLE; + + public static void usage(Meter meter) { + // Construct an updowncounter to record measurements that go up and down. + LongUpDownCounter upDownCounter = + meter + .upDownCounterBuilder("fully.qualified.updowncounter") + .setDescription("Current length of widget processing queue") + .setUnit("{widget}") + // Uncomment to optionally change the type to double + // .ofDoubles() + .build(); + + // Record a measurement with no attributes or context. + // Attributes defaults to Attributes.empty(), context to Context.current(). + upDownCounter.add(1L); + + // Record a measurement with attributes, using pre-allocated attributes whenever possible. + upDownCounter.add(-1L, WIDGET_RED_CIRCLE); + // Sometimes, attributes must be computed using application context. + upDownCounter.add( + -1L, Attributes.of(WIDGET_SHAPE, computeWidgetShape(), WIDGET_COLOR, computeWidgetColor())); + + // Record a measurement with attributes, and context. + // Most users will opt to omit the context argument, preferring the default Context.current(). + upDownCounter.add(1L, WIDGET_RED_CIRCLE, customContext()); + } +} +``` + + +#### Async UpDownCounter + +[ObservableLongUpDownCounter](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableLongUpDownCounter.html) +and +[ObservableDoubleUpDownCounter](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableDoubleUpDownCounter.html) +are used to observe non-monotonic (positive and negative) sums. + +The following code snippet explores async updowncounter API usage: + + + +```java +package otel; + +import static otel.Util.WIDGET_COLOR; +import static otel.Util.WIDGET_SHAPE; +import static otel.Util.computeWidgetColor; +import static otel.Util.computeWidgetShape; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.metrics.ObservableLongUpDownCounter; +import java.util.concurrent.atomic.AtomicLong; + +public class AsyncUpDownCounterUsage { + private static final Attributes WIDGET_RED_CIRCLE = Util.WIDGET_RED_CIRCLE; + + public static void asyncUpDownCounterUsage(Meter meter) { + AtomicLong queueLength = new AtomicLong(); + + // Construct an async updowncounter to observe an existing up down counter in a callback + ObservableLongUpDownCounter asyncUpDownCounter = + meter + .upDownCounterBuilder("fully.qualified.updowncounter") + .setDescription("Current length of widget processing queue") + .setUnit("{widget}") + // Uncomment to optionally change the type to double + // .ofDoubles() + .buildWithCallback( + // the callback is invoked when a MetricReader reads metrics + observableMeasurement -> { + long currentWidgetCount = queueLength.get(); + + // Record a measurement with no attributes. + // Attributes defaults to Attributes.empty(). + observableMeasurement.record(currentWidgetCount); + + // Record a measurement with attributes, using pre-allocated attributes whenever + // possible. + observableMeasurement.record(currentWidgetCount, WIDGET_RED_CIRCLE); + // Sometimes, attributes must be computed using application context. + observableMeasurement.record( + currentWidgetCount, + Attributes.of( + WIDGET_SHAPE, computeWidgetShape(), WIDGET_COLOR, computeWidgetColor())); + }); + + // Optionally close the counter to unregister the callback when required + asyncUpDownCounter.close(); + } +} +``` + + +#### Histogram + +[DoubleHistogram](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/DoubleHistogram.html) +and +[LongHistogram](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/LongHistogram.html) +are used to record monotonic (positive) values where the distribution is +important. + +The following code snippet explores histogram API usage: + + + +```java +package otel; + +import static otel.Util.WIDGET_COLOR; +import static otel.Util.WIDGET_SHAPE; +import static otel.Util.computeWidgetColor; +import static otel.Util.computeWidgetShape; +import static otel.Util.customContext; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.DoubleHistogram; +import io.opentelemetry.api.metrics.Meter; + +public class HistogramUsage { + private static final Attributes WIDGET_RED_CIRCLE = Util.WIDGET_RED_CIRCLE; + + public static void histogramUsage(Meter meter) { + // Construct a histogram to record measurements where the distribution is important. + DoubleHistogram histogram = + meter + .histogramBuilder("fully.qualified.histogram") + .setDescription("Length of time to process a widget") + .setUnit("s") + // Uncomment to optionally provide advice on useful default explicit bucket boundaries + // .setExplicitBucketBoundariesAdvice(Arrays.asList(1.0, 2.0, 3.0)) + // Uncomment to optionally change the type to long + // .ofLongs() + .build(); + + // Record a measurement with no attributes or context. + // Attributes defaults to Attributes.empty(), context to Context.current(). + histogram.record(1.1); + + // Record a measurement with attributes, using pre-allocated attributes whenever possible. + histogram.record(2.2, WIDGET_RED_CIRCLE); + // Sometimes, attributes must be computed using application context. + histogram.record( + 3.2, Attributes.of(WIDGET_SHAPE, computeWidgetShape(), WIDGET_COLOR, computeWidgetColor())); + + // Record a measurement with attributes, and context. + // Most users will opt to omit the context argument, preferring the default Context.current(). + histogram.record(4.4, WIDGET_RED_CIRCLE, customContext()); + } +} +``` + + +#### Gauge + +[DoubleGauge](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/DoubleGauge.html) +and +[LongGauge](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/LongGauge.html) +are used to record the latest value where spatial re-aggregation does not make +sense. + +The following code snippet explores gauge API usage: + + + +```java +package otel; + +import static otel.Util.WIDGET_COLOR; +import static otel.Util.WIDGET_SHAPE; +import static otel.Util.computeWidgetColor; +import static otel.Util.computeWidgetShape; +import static otel.Util.customContext; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.DoubleGauge; +import io.opentelemetry.api.metrics.Meter; + +public class GaugeUsage { + private static final Attributes WIDGET_RED_CIRCLE = Util.WIDGET_RED_CIRCLE; + + public static void gaugeUsage(Meter meter) { + // Construct a gauge to record measurements as they occur, which cannot be spatially + // re-aggregated. + DoubleGauge gauge = + meter + .gaugeBuilder("fully.qualified.gauge") + .setDescription("The current temperature of the widget processing line") + .setUnit("K") + // Uncomment to optionally change the type to long + // .ofLongs() + .build(); + + // Record a measurement with no attributes or context. + // Attributes defaults to Attributes.empty(), context to Context.current(). + gauge.set(273.0); + + // Record a measurement with attributes, using pre-allocated attributes whenever possible. + gauge.set(273.0, WIDGET_RED_CIRCLE); + // Sometimes, attributes must be computed using application context. + gauge.set( + 273.0, + Attributes.of(WIDGET_SHAPE, computeWidgetShape(), WIDGET_COLOR, computeWidgetColor())); + + // Record a measurement with attributes, and context. + // Most users will opt to omit the context argument, preferring the default Context.current(). + gauge.set(1L, WIDGET_RED_CIRCLE, customContext()); + } +} +``` + + +#### Async Gauge + +[ObservableDoubleGauge](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableDoubleGauge.html) +and +[ObservableLongGauge](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableLongGauge.html) +are used to observe the latest value where spatial re-aggregation does not make +sense. + +The following code snippet explores async gauge API usage: + + + +```java +package otel; + +import static otel.Util.WIDGET_COLOR; +import static otel.Util.WIDGET_SHAPE; +import static otel.Util.computeWidgetColor; +import static otel.Util.computeWidgetShape; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.metrics.ObservableDoubleGauge; +import java.util.concurrent.atomic.AtomicReference; + +public class AsyncGaugeUsage { + private static final Attributes WIDGET_RED_CIRCLE = Util.WIDGET_RED_CIRCLE; + + public static void asyncGaugeUsage(Meter meter) { + AtomicReference processingLineTemp = new AtomicReference<>(273.0); + + // Construct an async counter to observe an existing counter in a callback + ObservableDoubleGauge asyncGauge = + meter + .gaugeBuilder("fully.qualified.gauge") + .setDescription("The current temperature of the widget processing line") + .setUnit("K") + // Uncomment to optionally change the type to long + // .ofLongs() + .buildWithCallback( + // the callback is invoked when a MetricReader reads metrics + observableMeasurement -> { + double currentWidgetCount = processingLineTemp.get(); + + // Record a measurement with no attributes. + // Attributes defaults to Attributes.empty(). + observableMeasurement.record(currentWidgetCount); + + // Record a measurement with attributes, using pre-allocated attributes whenever + // possible. + observableMeasurement.record(currentWidgetCount, WIDGET_RED_CIRCLE); + // Sometimes, attributes must be computed using application context. + observableMeasurement.record( + currentWidgetCount, + Attributes.of( + WIDGET_SHAPE, computeWidgetShape(), WIDGET_COLOR, computeWidgetColor())); + }); + + // Optionally close the gauge to unregister the callback when required + asyncGauge.close(); + } +} +``` + + +### LoggerProvider + +[LoggerProvider](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/logs/LoggerProvider.html) +is the API entry point for logs and provides [Loggers](#logger). See +[providers and scopes](#providers-and-scopes) for information on providers and +scopes. + +{{% alert %}} {{% param logBridgeWarning %}} {{% /alert %}} + +#### Logger + +[Logger](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/logs/Logger.html) +is used to [emit log records](#logrecordbuilder) for an +[instrumentation scope](#providers-and-scopes). See +[providers and scopes](#providers-and-scopes) for information on providers and +scopes. + +#### LogRecordBuilder + +[LogRecordBuilder](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/logs/LogRecordBuilder.html) +is used to construct and emit log records. + +The following code snippet explores `LogRecordBuilder` API usage: + + + +```java +package otel; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.Value; +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.api.logs.Severity; +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public class LogRecordUsage { + private static final Attributes WIDGET_RED_CIRCLE = Util.WIDGET_RED_CIRCLE; + + public static void logRecordUsage(Logger logger) { + logger + .logRecordBuilder() + // Set body. Note, setBody(..) is called multiple times for demonstration purposes but only + // the last call is used. + // Set the body to a string, syntactic sugar for setBody(Value.of("log message")) + .setBody("log message") + // Optionally set the body to a Value to record arbitrarily complex structured data + .setBody(Value.of("log message")) + .setBody(Value.of(1L)) + .setBody(Value.of(1.1)) + .setBody(Value.of(true)) + .setBody(Value.of(new byte[] {'a', 'b', 'c'})) + .setBody(Value.of(Value.of("entry1"), Value.of("entry2"))) + .setBody( + Value.of( + Map.of( + "stringKey", + Value.of("entry1"), + "mapKey", + Value.of(Map.of("stringKey", Value.of("entry2")))))) + // Set severity + .setSeverity(Severity.DEBUG) + .setSeverityText("debug") + // Set timestamp + .setTimestamp(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + // Optionally set the timestamp when the log was observed + .setObservedTimestamp(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + // Set attributes + .setAttribute(AttributeKey.stringKey("com.acme.string-key"), "value") + .setAttribute(AttributeKey.booleanKey("com.acme.bool-key"), true) + .setAttribute(AttributeKey.longKey("com.acme.long-key"), 1L) + .setAttribute(AttributeKey.doubleKey("com.acme.double-key"), 1.1) + .setAttribute( + AttributeKey.stringArrayKey("com.acme.string-array-key"), + Arrays.asList("value1", "value2")) + .setAttribute( + AttributeKey.booleanArrayKey("come.acme.bool-array-key"), Arrays.asList(true, false)) + .setAttribute(AttributeKey.longArrayKey("come.acme.long-array-key"), Arrays.asList(1L, 2L)) + .setAttribute( + AttributeKey.doubleArrayKey("come.acme.double-array-key"), Arrays.asList(1.1, 2.2)) + .setAllAttributes(WIDGET_RED_CIRCLE) + // Uncomment to optionally explicitly set the context used to correlate with spans. If + // omitted, Context.current() is used. + // .setContext(context) + // Emit the log record + .emit(); + } +} +``` + + +### Noop implementation + +The `OpenTelemetry#noop()` method provides access to a noop implementation of +[OpenTelemetry](#opentelemetry) and all API components it provides access to. As +the name suggests, the noop implementation does nothing and is designed to have +no impact on performance. Instrumentation may see impact on performance even +when the noop is used if it is computing / allocating attribute values and other +data required to record the telemetry. The noop is a useful default instance of +`OpenTelemetry` when a user has not configured and installed a concrete +implementation such as the [SDK](../sdk/). + +The following code snippet explores `OpenTelemetry#noop()` API usage: + + + +```java +package otel; + +import static otel.Util.WIDGET_COLOR; +import static otel.Util.WIDGET_RED_CIRCLE; +import static otel.Util.WIDGET_SHAPE; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.api.logs.Severity; +import io.opentelemetry.api.metrics.DoubleGauge; +import io.opentelemetry.api.metrics.DoubleHistogram; +import io.opentelemetry.api.metrics.LongCounter; +import io.opentelemetry.api.metrics.LongUpDownCounter; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.api.trace.Tracer; + +public class NoopUsage { + private static final String SCOPE_NAME = "fully.qualified.name"; + + public static void noopUsage() { + // Access the noop OpenTelemetry instance + OpenTelemetry noopOpenTelemetry = OpenTelemetry.noop(); + + // Noop tracing + Tracer noopTracer = OpenTelemetry.noop().getTracer(SCOPE_NAME); + noopTracer + .spanBuilder("span name") + .startSpan() + .setAttribute(WIDGET_SHAPE, "square") + .setStatus(StatusCode.OK) + .addEvent("event-name", Attributes.builder().put(WIDGET_COLOR, "red").build()) + .end(); + + // Noop metrics + Attributes attributes = WIDGET_RED_CIRCLE; + Meter noopMeter = OpenTelemetry.noop().getMeter(SCOPE_NAME); + DoubleHistogram histogram = noopMeter.histogramBuilder("fully.qualified.histogram").build(); + histogram.record(1.0, attributes); + // counter + LongCounter counter = noopMeter.counterBuilder("fully.qualified.counter").build(); + counter.add(1, attributes); + // async counter + noopMeter + .counterBuilder("fully.qualified.counter") + .buildWithCallback(observable -> observable.record(10, attributes)); + // updowncounter + LongUpDownCounter upDownCounter = + noopMeter.upDownCounterBuilder("fully.qualified.updowncounter").build(); + // async updowncounter + noopMeter + .upDownCounterBuilder("fully.qualified.updowncounter") + .buildWithCallback(observable -> observable.record(10, attributes)); + upDownCounter.add(-1, attributes); + // gauge + DoubleGauge gauge = noopMeter.gaugeBuilder("fully.qualified.gauge").build(); + gauge.set(1.1, attributes); + // async gauge + noopMeter + .gaugeBuilder("fully.qualified.gauge") + .buildWithCallback(observable -> observable.record(10, attributes)); + + // Noop logs + Logger noopLogger = OpenTelemetry.noop().getLogsBridge().get(SCOPE_NAME); + noopLogger + .logRecordBuilder() + .setBody("log message") + .setAttribute(WIDGET_SHAPE, "square") + .setSeverity(Severity.INFO) + .emit(); + } +} +``` + + +### Semantic attributes + +The [semantic conventions](/docs/specs/semconv/) describe how to collect +telemetry in a standardized way for common operations. This includes an +[attribute registry](/docs/specs/semconv/attributes-registry/), which enumerates +definitions for all attributes referenced in the conventions, organized by +domain. The +[semantic-conventions-java](https://github.com/open-telemetry/semantic-conventions-java) +project generates constants from the semantic conventions, which can be used to +help instrumentation conform: + +| Description | Artifact | +| -------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| Generated code for stable semantic conventions | `io.opentelemetry.semconv:opentelemetry-semconv:{{% param vers.semconv %}}-alpha` | +| Generated code for incubating semantic conventions | `io.opentelemetry.semconv:opentelemetry-semconv-incubating:{{% param vers.semconv %}}-alpha` | + +{{% alert %}} While both `opentelemetry-semconv` and +`opentelemetry-semconv-incubating` include the `-alpha` suffix and are subject +to breaking changes, the intent is to stabilize `opentelemetry-semconv` and +leave the `-alpha` suffix on `opentelemetry-semconv-incubating` permanently. +Libraries can use `opentelemetry-semconv-incubating` for testing, but should not +include it as a dependency: since attributes may come and go from version to +version, including it as a dependency may expose end users to runtime errors +when transitive version conflicts occur. {{% /alert %}} + +The attribute constants generated from semantic conventions are instances of +`AttributeKey`, and can be used anywhere the OpenTelemetry API accepts +attributes. + +The following code snippet explores semantic convention attribute API usage: + + + +```java +package otel; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.semconv.HttpAttributes; +import io.opentelemetry.semconv.ServerAttributes; +import io.opentelemetry.semconv.incubating.HttpIncubatingAttributes; + +public class SemanticAttributesUsage { + public static void semanticAttributesUsage() { + // Semantic attributes are organized by top-level domain and whether they are stable or + // incubating. + // For example: + // - stable attributes starting with http.* are in the HttpAttributes class. + // - stable attributes starting with server.* are in the ServerAttributes class. + // - incubating attributes starting with http.* are in the HttpIncubatingAttributes class. + // Attribute keys which define an enumeration of values are accessible in an inner + // {AttributeKey}Values class. + // For example, the enumeration of http.request.method values is available in the + // HttpAttributes.HttpRequestMethodValues class. + Attributes attributes = + Attributes.builder() + .put(HttpAttributes.HTTP_REQUEST_METHOD, HttpAttributes.HttpRequestMethodValues.GET) + .put(HttpAttributes.HTTP_ROUTE, "/users/:id") + .put(ServerAttributes.SERVER_ADDRESS, "example") + .put(ServerAttributes.SERVER_PORT, 8080L) + .put(HttpIncubatingAttributes.HTTP_RESPONSE_BODY_SIZE, 1024) + .build(); + } +} +``` + + +### Baggage + +[Baggage](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/baggage/Baggage.html) +is a bundle of application defined key-value pairs associated with a distributed +request or workflow execution. Baggage keys and values are strings, and values +have optional string metadata. Telemetry can be enriched with data from baggage +by configuring the [SDK](../sdk/) to add entries as attributes to spans, +metrics, and log records. The baggage API is built on top of +[context](#context), which allows span context to be implicitly passed around an +application and across threads. Most of the context API usage guidance applies +to baggage. + +Baggage is propagated across application boundaries with the +[W3CBaggagePropagator](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagator.html) +(see [TextMapPropagator](../sdk/#textmappropagator) for details). + +The following code snippet explores `Baggage` API usage: + + + +```java +package otel; + +import static io.opentelemetry.context.Context.current; + +import io.opentelemetry.api.baggage.Baggage; +import io.opentelemetry.api.baggage.BaggageEntry; +import io.opentelemetry.api.baggage.BaggageEntryMetadata; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.context.Scope; +import java.util.Map; +import java.util.stream.Collectors; + +public class BaggageUsage { + private static final Attributes WIDGET_RED_CIRCLE = Util.WIDGET_RED_CIRCLE; + + public static void baggageUsage() { + // Access current baggage with Baggage.current() + // output => context baggage: {} + Baggage currentBaggage = Baggage.current(); + System.out.println("current baggage: " + asString(currentBaggage)); + // ...or from a Context + currentBaggage = Baggage.fromContext(current()); + + // Baggage has a variety of methods for manipulating and reading data. + // Convert to builder and add entries: + Baggage newBaggage = + Baggage.current().toBuilder() + .put("shopId", "abc123") + .put("shopName", "opentelemetry-demo", BaggageEntryMetadata.create("metadata")) + .build(); + // ...or uncomment to start from empty + // newBaggage = Baggage.empty().toBuilder().put("shopId", "abc123").build(); + // output => new baggage: {shopId=abc123(), shopName=opentelemetry-demo(metadata)} + System.out.println("new baggage: " + asString(newBaggage)); + // Read an entry: + String shopIdValue = newBaggage.getEntryValue("shopId"); + // Inspect size: + int size = newBaggage.size(); + boolean isEmpty = newBaggage.isEmpty(); + // Convert to map representation: + Map map = newBaggage.asMap(); + // Iterate through entries: + newBaggage.forEach((s, baggageEntry) -> {}); + + // The current baggage still doesn't contain the new entries + // output => context baggage: {} + System.out.println("current baggage: " + asString(Baggage.current())); + + // Calling Baggage.makeCurrent() sets Baggage.current() to the baggage until the scope is + // closed, upon which Baggage.current() is restored to the state prior to when + // Baggage.makeCurrent() was called. + try (Scope scope = newBaggage.makeCurrent()) { + // The current baggage now contains the added value + // output => context baggage: {shopId=abc123(), shopName=opentelemetry-demo(metadata)} + System.out.println("current baggage: " + asString(Baggage.current())); + } + + // The current baggage no longer contains the new entries: + // output => context baggage: {} + System.out.println("current baggage: " + asString(Baggage.current())); + } + + private static String asString(Baggage baggage) { + return baggage.asMap().entrySet().stream() + .map( + entry -> + String.format( + "%s=%s(%s)", + entry.getKey(), + entry.getValue().getValue(), + entry.getValue().getMetadata().getValue())) + .collect(Collectors.joining(", ", "{", "}")); + } +} +``` + + +## Incubating API + +The `io.opentelemetry:opentelemetry-api-incubator:{{% param vers.otel %}}-alpha` +artifact contains experimental trace, metric, log, and context APIs which. +Incubating APIs may have breaking API changes in minor releases. Often, these +represent experimental specification features or API designs we want to vet with +user feedback before committing to. We encourage users to try these APIs and +open issues with any feedback (positive or negative). Libraries should not +depend on the incubating APIs, since users may be exposed to runtime errors when +transitive version conflicts occur. + +See +[incubator README](https://github.com/open-telemetry/opentelemetry-java/tree/main/api/incubator) +for available APIs and sample usage. diff --git a/content/en/docs/languages/java/api.md b/content/en/docs/languages/java/api.md index 5a77f07f940e..8c8e8f079851 100644 --- a/content/en/docs/languages/java/api.md +++ b/content/en/docs/languages/java/api.md @@ -1,6 +1,6 @@ --- -title: API reference -linkTitle: API +title: Javadoc API reference +linkTitle: Javadoc redirect: https://javadoc.io/doc/io.opentelemetry manualLinkTarget: _blank _build: { render: link } diff --git a/content/en/docs/languages/java/configuration.md b/content/en/docs/languages/java/configuration.md index f73a996a8786..5668297caa6d 100644 --- a/content/en/docs/languages/java/configuration.md +++ b/content/en/docs/languages/java/configuration.md @@ -1,7 +1,7 @@ --- title: Configure the SDK linkTitle: Configure the SDK -weight: 12 +weight: 13 aliases: [config] # prettier-ignore cSpell:ignore: authservice autoconfigured blrp Customizer Dotel ignore LOWMEMORY myservice ottrace PKCS retryable tracepropagators @@ -11,7 +11,7 @@ cSpell:ignore: authservice autoconfigured blrp Customizer Dotel ignore LOWMEMORY The [SDK](../sdk/) is the built-in reference implementation of the -[API](../instrumentation/), processing and exporting telemetry produced by +[API](../api-components/), processing and exporting telemetry produced by instrumentation API calls. Configuring the SDK to process and export appropriately is an essential step to integrating OpenTelemetry into an application. diff --git a/content/en/docs/languages/java/instrumentation.md b/content/en/docs/languages/java/instrumentation.md index f106bfc12bcc..9cf2e297ac27 100644 --- a/content/en/docs/languages/java/instrumentation.md +++ b/content/en/docs/languages/java/instrumentation.md @@ -1,1102 +1,201 @@ --- -title: Instrumentation +title: Instrumentation ecosystem aliases: - /docs/java/getting_started - /docs/java/manual_instrumentation - manual - manual_instrumentation -weight: 20 -description: Manual instrumentation for OpenTelemetry Java -# prettier-ignore -cSpell:ignore: Autowired customizer logback loggable multivalued rolldice springframework + - libraries +weight: 10 +description: Instrumentation ecosystem in OpenTelemetry Java +cSpell:ignore: Logback logback --- -{{% docs/languages/instrumentation-intro %}} +Instrumentation records telemetry using the [API](../api-components/). The +[SDK](../sdk/) is the built-in reference implementation of the API, and is +[configured](../configuration/) to process and export the telemetry produced by +instrumentation API calls. This page discusses the OpenTelemetry ecosystem in +OpenTelemetry Java, including resources for end users and cross-cutting +instrumentation topics: -{{% alert title="Note" color="info" %}} See [Manage Telemetry with SDK](../sdk/) -for a conceptual overview of OpenTelemetry Java SDK concepts. See -**[Configure the SDK](../configuration/)** for details on SDK configuration, -including -[zero-code SDK autoconfigure](../configuration/#zero-code-sdk-autoconfigure). -{{% /alert %}} +- [Instrumentation categories](#instrumentation-categories): There are a variety + of categories of instrumentation addressing different use cases and + installation patterns. +- [Context propagation](#context-propagation): Context propagation provides + correlation between traces, metrics, and logs, allowing the signals to + complement each other. +- [Semantic conventions](#semantic-conventions): The semantic conventions define + how to produce telemetry for standard operations. +- [Log instrumentation](#log-instrumentation): The semantic conventions define + how to produce telemetry for standard operations. + +{{% alert %}} While [instrumentation categories](#instrumentation-categories) +enumerates several options for instrumenting an application, we recommend users +start with the [Java agent](#zero-code-java-agent). The Java agent has a simple +installation process, and automatically detects and installs instrumentation +from a large library. {{% /alert %}} + +## Instrumentation categories + +There are several categories of instrumentation: + +- [Zero-code: Java agent](#zero-code-java-agent) is a form of zero-code + instrumentation **[1]** that dynamically manipulates application bytecode. +- [Zero-code: Spring Boot starter](#zero-code-spring-boot-starter) is a form of + zero-code instrumentation **[1]** that leverages spring autoconfigure to + install [library instrumentation](#library-instrumentation). +- [Library instrumentation](#library-instrumentation) wraps or uses extension + points to instrument a library, requiring users to install and/or adapt + library usage. +- [Native instrumentation](#native-instrumentation) is built directly into + libraries and frameworks. +- [Manual instrumentation](#manual-instrumentation) is written by application + authors, and typically specific to the application domain. + +**[1]**: Zero-code instrumentation is installed automatically based on detected +libraries / frameworks. + +The +[opentelemetry-java-instrumentation](https://github.com/open-telemetry/opentelemetry-java-instrumentation) +project contains the source code for Java agent, Spring Boot starter, and +Library instrumentation. + +### Zero-code: Java agent + +The Java agent is a form of zero-code +[automatic instrumentation](/docs/specs/otel/glossary/#automatic-instrumentation) +that dynamically manipulates application bytecode. + +For a list of libraries instrumented by the Java agent, see the +"Auto-instrumented versions" column on +[supported libraries](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md). + +See [Java agent](/docs/zero-code/java/agent/) for more details. + +### Zero-code: Spring Boot starter + +The Spring Boot starter is a form of zero-code +[automatic instrumentation](/docs/specs/otel/glossary/#automatic-instrumentation) +that leverages spring autoconfigure to install +[library instrumentation](#library-instrumentation). + +See [Spring Boot starter](/docs/zero-code/java/spring-boot-starter/) for +details. + +### Library instrumentation + +[Library instrumentation](/docs/specs/otel/glossary/#instrumentation-library) +wraps or uses extension points to instrument a library, requiring users to +install and/or adapt library usage. + +For a list of instrumentation libraries, see the "Standalone Library +Instrumentation" column on +[supported libraries](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md). + +### Native instrumentation + +[Native instrumentation](/docs/specs/otel/glossary/#natively-instrumented) is +built directly into libraries or frameworks. OpenTelemetry encourages library +authors to add native instrumentation using the [API](../api-components/). In +the long term, we hope the native instrumentation becomes the norm, and view the +instrumentation maintained by OpenTelemetry in +[opentelemetry-java-instrumentation](https://github.com/open-telemetry/opentelemetry-java-instrumentation) +as a temporary means of filling the gap. + +{{% docs/languages/native-libraries "java" %}} + +### Manual instrumentation + +[Manual instrumentation](/docs/specs/otel/glossary/#manual-instrumentation) is +written by application authors, and typically specific to the application +domain. + +### Shims + +A shim is instrumentation that bridges data from one observability library to +another, typically _from_ some library into OpenTelemetry. + +Shims maintained in the OpenTelemetry Java ecosystem: + +| Description | Documentation | Signal(s) | Artifact | +| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| Bridge [OpenTracing](https://opentracing.io/) into OpenTelemetry | [README](https://github.com/open-telemetry/opentelemetry-java/tree/main/opentracing-shim) | Traces | `io.opentelemetry:opentelemetry-opentracing-shim:{{% param vers.otel %}}` | +| Bridge [Opencensus](https://opencensus.io/) into OpenTelemetry | [README](https://github.com/open-telemetry/opentelemetry-java/tree/main/opencensus-shim) | Traces, Metrics | `io.opentelemetry:opentelemetry-opencensus-shim:{{% param vers.otel %}}-alpha` | +| Bridge [Micrometer](https://micrometer.io/) into OpenTelemetry | [README](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/micrometer/micrometer-1.5/library) | Metrics | `io.opentelemetry.instrumentation:opentelemetry-micrometer-1.5:{{% param vers.instrumentation %}}-alpha` | +| Bridge [JMX](https://docs.oracle.com/javase/7/docs/technotes/guides/management/agent.html) into OpenTelemetry | [README](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/jmx-metrics/javaagent/README.md) | Metrics | `io.opentelemetry.instrumentation:opentelemetry-jmx-metrics:{{% param vers.instrumentation %}}-alpha` | +| Bridge OpenTelemetry into [Prometheus Java client](https://github.com/prometheus/client_java) | [README](https://github.com/open-telemetry/opentelemetry-java-contrib/tree/main/prometheus-client-bridge) | Metrics | `io.opentelemetry.contrib:opentelemetry-prometheus-client-bridge:{{% param vers.contrib %}}-alpha` | +| Bridge OpenTelemetry into [Micrometer](https://micrometer.io/) | [README](https://github.com/open-telemetry/opentelemetry-java-contrib/tree/main/micrometer-meter-provider) | Metrics | `io.opentelemetry.contrib:opentelemetry-micrometer-meter-provider:{{% param vers.contrib %}}-alpha` | +| Bridge [Log4j](https://logging.apache.org/log4j/2.x/index.html) into OpenTelemetry | [README](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/log4j/log4j-appender-2.17/library) | Logs | `io.opentelemetry.instrumentation:opentelemetry-log4j-appender-2.17:{{% param vers.instrumentation %}}-alpha` | +| Bridge [Logback](https://logback.qos.ch/) into OpenTelemetry | [README](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/logback/logback-appender-1.0/library) | Logs | `io.opentelemetry.instrumentation:opentelemetry-logback-appender-1.0:{{% param vers.instrumentation %}}-alpha` | +| Bridge OpenTelemetry context into [Log4j](https://logging.apache.org/log4j/2.x/index.html) | [README](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure) | Context | `io.opentelemetry.instrumentation:opentelemetry-log4j-context-data-2.17-autoconfigure:{{% param vers.instrumentation %}}-alpha` | +| Bridge OpenTelemetry context into [Logback](https://logback.qos.ch/) | [README](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/logback/logback-mdc-1.0/library) | Context | `io.opentelemetry.instrumentation:opentelemetry-logback-mdc-1.0:{{% param vers.instrumentation %}}-alpha` | + +## Context propagation + +The OpenTelemetry APIs are designed to be complementary, with the whole greater +than the sum of the parts. Each signal has its own strengths, and collectively +stitch together a compelling observability story. + +Importantly, the data from the various signals are linked together through trace +context: + +- Spans are related to other spans through span parent and links, which each + record trace context of related spans. +- Metrics are related to spans through + [exemplars](/docs/specs/otel/metrics/data-model/#exemplars), which record + trace context of a particular measurement. +- Logs are related to spans by recording trace context on log records. + +For this correlation to work, trace context must be propagated throughout an +application (across function calls and threads), and across application +boundaries. The [context API](../api-components/#context-api) facilitates this. +Instrumentation needs to be written in a manner which is context aware: -{{% alert title="Note" color="info" %}} +- Libraries that represent the entry point to an application (i.e. HTTP servers, + message consumers, etc.) should + [extract context](../api-components/#contextpropagators) from incoming + messages. +- Libraries that represent an exit point from an application (i.e. HTTP clients, + message producers, etc.) should + [inject context](../api-components/#contextpropagators) into outgoing + messages. +- Libraries should implicitly or explicitly pass + [Context](../api-components/#context) through the callstack and across any + threads. + +## Semantic conventions -On this page you will learn how you can add traces, metrics and logs to your -code _manually_. But, you are not limited to only use one kind of -instrumentation: use [zero-code instrumentation](/docs/zero-code/java/agent/) to -get started and then enrich your code with manual instrumentation as needed. +The [semantic conventions](/docs/specs/semconv/) define how to produce telemetry +for standard operations. Among other things, the semantic conventions specify +span names, span kinds, metric instruments, metric units, metric types, and +attribute key, value, and requirement levels. -Note, that especially if you cannot modify the source code of your app, you can -skip manual instrumentation and only use automatic instrumentation. - -Also, for libraries your code depends on, you don't have to write -instrumentation code yourself, since they might come with OpenTelemetry built-in -_natively_ or you can make use of [instrumentation libraries](../libraries/). - -{{% /alert %}} - -## Example app preparation {#example-app} - -This page uses a modified version of the example app from -[Getting Started](../getting-started/) to help you learn about manual -instrumentation. - -You don't have to use the example app: if you want to instrument your own app or -library, follow the instructions here to adapt the process to your own code. - -### Prerequisites - -For running the example app, ensure that you have the following installed -locally: - -- Java JDK 17+, due to the use of Spring Boot 3. OpenTelemetry Java itself only - [requires Java 8+][java-vers]. -- [Gradle](https://gradle.org/). - -### Dependencies {#example-app-dependencies} - -To begin, set up an environment in a new directory called `java-simple`. Within -that directory, create a file called `build.gradle.kts` with the following -content: - -```kotlin -plugins { - id("java") - id("org.springframework.boot") version "3.0.6" - id("io.spring.dependency-management") version "1.1.0" -} - -sourceSets { - main { - java.setSrcDirs(setOf(".")) - } -} - -repositories { - mavenCentral() -} - -dependencies { - implementation("org.springframework.boot:spring-boot-starter-web") -} -``` - -### Create and launch an HTTP Server - -To highlight the difference between instrumenting a _library_ and a standalone -_app_, split out the dice rolling into a _library_ class, which then will be -imported as a dependency by the app. - -Create the _library file_ name `Dice.java` and add the following code to it: - -```java -package otel; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -public class Dice { - - private int min; - private int max; - - public Dice(int min, int max) { - this.min = min; - this.max = max; - } - - public List rollTheDice(int rolls) { - List results = new ArrayList(); - for (int i = 0; i < rolls; i++) { - results.add(this.rollOnce()); - } - return results; - } - - private int rollOnce() { - return ThreadLocalRandom.current().nextInt(this.min, this.max + 1); - } -} -``` - -Create the app files `DiceApplication.java` and `RollController.java` and add -the following code to them: - -```java -// DiceApplication.java -package otel; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.Banner; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class DiceApplication { - public static void main(String[] args) { - - SpringApplication app = new SpringApplication(DiceApplication.class); - app.setBannerMode(Banner.Mode.OFF); - app.run(args); - } -} -``` - -```java -// RollController.java -package otel; - -import java.util.List; -import java.util.Optional; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.server.ResponseStatusException; - -import otel.Dice; - -@RestController -public class RollController { - private static final Logger logger = LoggerFactory.getLogger(RollController.class); - - @GetMapping("/rolldice") - public List index(@RequestParam("player") Optional player, - @RequestParam("rolls") Optional rolls) { - - if (!rolls.isPresent()) { - throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Missing rolls parameter", null); - } - - List result = new Dice(1, 6).rollTheDice(rolls.get()); - - if (player.isPresent()) { - logger.info("{} is rolling the dice: {}", player.get(), result); - } else { - logger.info("Anonymous player is rolling the dice: {}", result); - } - return result; - } -} -``` - -To ensure that it is working, run the application with the following command and -open in your web browser: - -```shell -gradle assemble -java -jar ./build/libs/java-simple.jar -``` - -You should get a list of 12 numbers in your browser window, for example: - -```text -[5,6,5,3,6,1,2,5,4,4,2,4] -``` - -## Manual instrumentation setup - -For both library and app instrumentation, the first step is to install the -dependencies for the OpenTelemetry API. - -Throughout this documentation you will add dependencies. For a full list of -artifact coordinates, see [releases]. For semantic convention releases, see -[semantic-conventions-java]. - -[releases]: https://github.com/open-telemetry/opentelemetry-java#releases -[semantic-conventions-java]: - https://github.com/open-telemetry/semantic-conventions-java/releases - -### Dependency management - -A Bill of Material -([BOM](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#bill-of-materials-bom-poms)) -ensures that versions of dependencies (including transitive ones) are aligned. -Importing the `opentelemetry-bom` BOM is important to ensure version alignment -across all OpenTelemetry dependencies. - -{{< tabpane text=true >}} {{% tab Gradle %}} - -```kotlin { hl_lines=["1-5",9] } -dependencyManagement { - imports { - mavenBom("io.opentelemetry:opentelemetry-bom:{{% param vers.otel %}}") - } -} - -dependencies { - implementation("org.springframework.boot:spring-boot-starter-web"); - implementation("io.opentelemetry:opentelemetry-api"); -} -``` - -If you are not using Spring and its `io.spring.dependency-management` dependency -management plugin, install the OpenTelemetry BOM and API using Gradle -dependencies only. - -```kotlin -dependencies { - implementation(platform("io.opentelemetry:opentelemetry-bom:{{% param vers.otel %}}")); - implementation("io.opentelemetry:opentelemetry-api"); -} -``` - -{{% /tab %}} {{% tab Maven %}} - -```xml - - - - - io.opentelemetry - opentelemetry-bom - {{% param vers.otel %}} - pom - import - - - - - - io.opentelemetry - opentelemetry-api - - - -``` - -{{% /tab %}} {{% /tabpane %}} - -## Traces - -The following sections describe the OpenTelemetry Java tracing API. See -[SdkTracerProvider](../sdk/#sdktracerprovider) for an overview of trace SDK -concepts and configuration. - -### Acquiring a tracer - -To do [Tracing](/docs/concepts/signals/traces/) you'll need to acquire a -[`Tracer`](/docs/concepts/signals/traces/#tracer). - -**Note:** Methods of the OpenTelemetry SDK should never be called. - -First, a `Tracer` must be acquired, which is responsible for creating spans and -interacting with the [Context](#context-propagation). A tracer is acquired by -using the OpenTelemetry API specifying the name and version of the [library -instrumenting][instrumentation library] the [instrumented library] or application -to be monitored. More information is available in the specification chapter [Obtaining -a -Tracer]. - -Anywhere in your application where you write manual tracing code should call -`getTracer` to acquire a tracer. For example: - -```java -import io.opentelemetry.api.trace.Tracer; - -Tracer tracer = openTelemetry.getTracer("instrumentation-scope-name", "instrumentation-scope-version"); -``` - -The values of `instrumentation-scope-name` and `instrumentation-scope-version` -should uniquely identify the -[Instrumentation Scope](/docs/concepts/instrumentation-scope/), such as the -package, module or class name. This will help later help determining what the -source of telemetry is. While the name is required, the version is still -recommended despite being optional. Note, that all `Tracer`s that are created by -a single `OpenTelemetry` instance will interoperate, regardless of name. - -It's generally recommended to call `getTracer` in your app when you need it -rather than exporting the `tracer` instance to the rest of your app. This helps -avoid trickier application load issues when other required dependencies are -involved. - -In the case of the [example app](#example-app), there are two places where a -tracer may be acquired with an appropriate Instrumentation Scope: - -First, in the `index` method of the `RollController` as follows: - -```java { hl_lines=["4-6",11,"13-16"] } -package otel; - -// ... -import org.springframework.beans.factory.annotation.Autowired; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.trace.Tracer; - -@RestController -public class RollController { - private static final Logger logger = LoggerFactory.getLogger(RollController.class); - private final Tracer tracer; - - @Autowired - RollController(OpenTelemetry openTelemetry) { - tracer = openTelemetry.getTracer(RollController.class.getName(), "0.1.0"); - } - // ... -} -``` - -And second, in the _library file_ `Dice.java`: - -```java { hl_lines=["2-3","9-19"]} -// ... -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.trace.Tracer; - -public class Dice { - - private int min; - private int max; - private Tracer tracer; - - public Dice(int min, int max, OpenTelemetry openTelemetry) { - this.min = min; - this.max = max; - this.tracer = openTelemetry.getTracer(Dice.class.getName(), "0.1.0"); - } - - public Dice(int min, int max) { - this(min, max, OpenTelemetry.noop()); - } - - // ... -} -``` - -As an aside, if you are writing library instrumentation, it is strongly -recommended that you provide your users the ability to inject an instance of -`OpenTelemetry` into your instrumentation code. If this is not possible for some -reason, you can fall back to using an instance from the `GlobalOpenTelemetry` -class: - -```java -import io.opentelemetry.api.GlobalOpenTelemetry; - -Tracer tracer = GlobalOpenTelemetry.getTracer("instrumentation-scope-name", "instrumentation-scope-version"); -``` - -Note that you can't force end users to configure the global, so this is the most -brittle option for library instrumentation. - -### Acquiring a tracer in Java agent - -If you are using the [Java agent], you can acquire a `Tracer` from the global OpenTelemetry -instance: - -```java -import io.opentelemetry.api.GlobalOpenTelemetry; - -Tracer tracer = GlobalOpenTelemetry.getTracer("application"); -``` - -If you are using Spring Boot, you can add the following bean to your -`@SpringBootApplication` class - to acquire a `Tracer` as in the -[Spring Boot starter](#acquiring-a-tracer-in-spring-boot-starter) section below: - -```java -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.GlobalOpenTelemetry; - -@Configuration -public class OpenTelemetryConfig { - @Bean - public OpenTelemetry openTelemetry() { - return GlobalOpenTelemetry.get(); - } -} -``` - -### Acquiring a tracer in Spring Boot starter - -If you are using the [Spring Boot starter], you can acquire a `Tracer` from the -autowired OpenTelemetry instance: - -```java -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.trace.Tracer; - -@Controller -public class MyController { - private final Tracer tracer; - - public MyController(OpenTelemetry openTelemetry) { - this.tracer = openTelemetry.getTracer("application"); - } -} -``` - -### Create Spans - -Now that you have [tracers](/docs/concepts/signals/traces/#tracer) initialized, -you can create [spans](/docs/concepts/signals/traces/#spans). - -To create [Spans](/docs/concepts/signals/traces/#spans), you only need to -specify the name of the span. The start and end time of the span is -automatically set by the OpenTelemetry SDK. - -The code below illustrates how to create a span: - -```java { hl_lines=["1-2","8-11","25-30"] } -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.context.Scope; - -// ... - @GetMapping("/rolldice") - public List index(@RequestParam("player") Optional player, - @RequestParam("rolls") Optional rolls) { - Span span = tracer.spanBuilder("rollTheDice").startSpan(); - - // Make the span the current span - try (Scope scope = span.makeCurrent()) { - - if (!rolls.isPresent()) { - throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Missing rolls parameter", null); - } - - List result = new Dice(1, 6).rollTheDice(rolls.get()); - - if (player.isPresent()) { - logger.info("{} is rolling the dice: {}", player.get(), result); - } else { - logger.info("Anonymous player is rolling the dice: {}", result); - } - return result; - } catch(Throwable t) { - span.recordException(t); - throw t; - } finally { - span.end(); - } - } -``` - -It's required to call `end()` to end the span when you want it to end. - -If you followed the instructions using the [example app](#example-app) up to -this point, you can copy the code above into the `index` method of the -`RollController`. You should now be able to see spans emitted from your app. - -Start your app as follows, and then send it requests by visiting - with your browser or `curl`: - -```shell -gradle assemble -env \ -OTEL_SERVICE_NAME=dice-server \ -OTEL_TRACES_EXPORTER=logging \ -OTEL_METRICS_EXPORTER=logging \ -OTEL_LOGS_EXPORTER=logging \ -java -jar ./build/libs/java-simple.jar -``` - -After a while, you should see the spans printed in the console by the -`LoggingSpanExporter`, something like this: - -```log -2023-08-02T17:22:22.658+02:00 INFO 2313 --- [nio-8080-exec-1] i.o.e.logging.LoggingSpanExporter : 'rollTheDice' : 565232b11b9933fa6be8d6c4a1307fe2 6e1e011e2e8c020b INTERNAL [tracer: otel.RollController:0.1.0] {} -``` - -### Create nested Spans - -Most of the time, we want to correlate -[spans](/docs/concepts/signals/traces/#spans) for nested operations. -OpenTelemetry supports tracing within processes and across remote processes. For -more details how to share context between remote processes, see -[Context Propagation](#context-propagation). - -For example in the `Dice` class method `rollTheDice` calling method `rollOnce`, -the spans could be manually linked in the following way: - -```java { hl_lines=["1-2","5","7","9","12-14","17-21","23-25"]} -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.context.Context; -// ... - public List rollTheDice(int rolls) { - Span parentSpan = tracer.spanBuilder("parent").startSpan(); - List results = new ArrayList(); - try { - for (int i = 0; i < rolls; i++) { - results.add(this.rollOnce(parentSpan)); - } - return results; - } finally { - parentSpan.end(); - } - } - - private int rollOnce(Span parentSpan) { - Span childSpan = tracer.spanBuilder("child") - .setParent(Context.current().with(parentSpan)) - .startSpan(); - try { - return ThreadLocalRandom.current().nextInt(this.min, this.max + 1); - } finally { - childSpan.end(); - } - } -``` - -The OpenTelemetry API offers also an automated way to propagate the parent span -on the current thread: - -```java { hl_lines=["1-2","5-6","12-14","18-22","24-26"]} -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.context.Scope; -// ... - public List rollTheDice(int rolls) { - Span parentSpan = tracer.spanBuilder("parent").startSpan(); - try (Scope scope = parentSpan.makeCurrent()) { - List results = new ArrayList(); - for (int i = 0; i < rolls; i++) { - results.add(this.rollOnce()); - } - return results; - } finally { - parentSpan.end(); - } - } - - private int rollOnce() { - Span childSpan = tracer.spanBuilder("child") - // NOTE: setParent(...) is not required; - // `Span.current()` is automatically added as the parent - .startSpan(); - try(Scope scope = childSpan.makeCurrent()) { - return ThreadLocalRandom.current().nextInt(this.min, this.max + 1); - } finally { - childSpan.end(); - } - } -} -``` - -To link spans from remote processes, it is sufficient to set the -[Remote Context](#context-propagation) as parent. - -```java -Span childRemoteParent = tracer.spanBuilder("Child").setParent(remoteContext).startSpan(); -``` - -### Get the current span - -Sometimes it's helpful to do something with the current/active -[span](/docs/concepts/signals/traces/#spans) at a particular point in program -execution. - -```java -Span span = Span.current() -``` - -And if you want the current span for a particular `Context` object: - -```java -Span span = Span.fromContext(context) -``` - -### Span Attributes - -In OpenTelemetry [spans](/docs/concepts/signals/traces/#spans) can be created -freely and it's up to the implementor to annotate them with attributes specific -to the represented operation. -[Attributes](/docs/concepts/signals/traces/#attributes) provide additional -context on a span about the specific operation it tracks, such as results or -operation properties. - -```java -Span span = tracer.spanBuilder("/resource/path").setSpanKind(SpanKind.CLIENT).startSpan(); -span.setAttribute("http.method", "GET"); -span.setAttribute("http.url", url.toString()); -``` - -### Semantic Attributes - -There are semantic conventions for spans representing operations in well-known -protocols like HTTP or database calls. Semantic conventions for these spans are -defined in the specification at -[Trace Semantic Conventions](/docs/specs/semconv/general/trace/). - -First add the semantic conventions as a dependency to your application: - -{{< tabpane text=true >}} {{% tab Gradle %}} - -```kotlin -dependencies { - implementation("io.opentelemetry.semconv:opentelemetry-semconv:{{% param vers.semconv %}}-alpha") -} -``` - -{{% /tab %}} {{% tab Maven %}} - -```xml - - io.opentelemetry.semconv - opentelemetry-semconv - {{% param vers.semconv %}}-alpha - -``` - -{{% /tab %}} {{< /tabpane>}} - -Finally, you can update your file to include semantic attributes: - -```java -Span span = tracer.spanBuilder("/resource/path").setSpanKind(SpanKind.CLIENT).startSpan(); -span.setAttribute(SemanticAttributes.HTTP_METHOD, "GET"); -span.setAttribute(SemanticAttributes.HTTP_URL, url.toString()); -``` - -### Create Spans with events - -[Spans](/docs/concepts/signals/traces/#spans) can be annotated with named events -(called [Span Events](/docs/concepts/signals/traces/#span-events)) that can -carry zero or more [Span Attributes](#span-attributes), each of which itself is -a key:value map paired automatically with a timestamp. - -```java -span.addEvent("Init"); -... -span.addEvent("End"); -``` - -```java -Attributes eventAttributes = Attributes.of( - AttributeKey.stringKey("key"), "value", - AttributeKey.longKey("result"), 0L); - -span.addEvent("End Computation", eventAttributes); -``` - -### Create Spans with links - -A [Span](/docs/concepts/signals/traces/#spans) may be linked to zero or more -other Spans that are causally related via a -[Span Link](/docs/concepts/signals/traces/#span-links). Links can be used to -represent batched operations where a Span was initiated by multiple initiating -Spans, each representing a single incoming item being processed in the batch. - -```java -Span child = tracer.spanBuilder("childWithLink") - .addLink(parentSpan1.getSpanContext()) - .addLink(parentSpan2.getSpanContext()) - .addLink(parentSpan3.getSpanContext()) - .addLink(remoteSpanContext) - .startSpan(); -``` - -For more details how to read context from remote processes, see -[Context Propagation](#context-propagation). - -### Set span status - -A [status](/docs/concepts/signals/traces/#span-status) can be set on a -[span](/docs/concepts/signals/traces/#spans), typically used to specify that a -span has not completed successfully - `SpanStatus.Error`. In rare scenarios, you -could override the `Error` status with `OK`, but don't set `OK` on -successfully-completed spans. - -The status can be set at any time before the span is finished: - -```java -Span span = tracer.spanBuilder("my span").startSpan(); -// put the span into the current Context -try (Scope scope = span.makeCurrent()) { - // do something -} catch (Throwable t) { - span.setStatus(StatusCode.ERROR, "Something bad happened!"); - throw t; -} finally { - span.end(); // Cannot set a span after this call -} -``` - -### Record exceptions in spans - -It can be a good idea to record exceptions when they happen. It's recommended to -do this in conjunction with setting [span status](#set-span-status). - -```java -Span span = tracer.spanBuilder("my span").startSpan(); -// put the span into the current Context -try (Scope scope = span.makeCurrent()) { - // do something -} catch (Throwable throwable) { - span.setStatus(StatusCode.ERROR, "Something bad happened!"); - span.recordException(throwable); -} finally { - span.end(); // Cannot set a span after this call -} -``` - -This will capture things like the current stack trace in the span. - -### Context Propagation - -OpenTelemetry provides a text-based approach to propagate context to remote -services using the [W3C Trace Context](https://www.w3.org/TR/trace-context/) -HTTP headers. - -### Context propagation between threads - -The following example demonstrates how to propagate the context between threads: - -```java -io.opentelemetry.context.Context context = io.opentelemetry.context.Context.current(); -Thread thread = new Thread(context.wrap(new Runnable() { - @Override - public void run() { - // Code for which you want to propagate the context - } -})); -thread.start(); -``` - -### Context propagation between HTTP requests - -The following presents an example of an outgoing HTTP request using -`HttpURLConnection`. - -```java -// Tell OpenTelemetry to inject the context in the HTTP headers -TextMapSetter setter = - new TextMapSetter() { - @Override - public void set(HttpURLConnection carrier, String key, String value) { - // Insert the context as Header - carrier.setRequestProperty(key, value); - } -}; - -URL url = new URL("http://127.0.0.1:8080/resource"); -Span outGoing = tracer.spanBuilder("/resource").setSpanKind(SpanKind.CLIENT).startSpan(); -try (Scope scope = outGoing.makeCurrent()) { - // Use the Semantic Conventions. - // (Note that to set these, Span does not *need* to be the current instance in Context or Scope.) - outGoing.setAttribute(SemanticAttributes.HTTP_METHOD, "GET"); - outGoing.setAttribute(SemanticAttributes.HTTP_URL, url.toString()); - HttpURLConnection transportLayer = (HttpURLConnection) url.openConnection(); - // Inject the request with the *current* Context, which contains our current Span. - openTelemetry.getPropagators().getTextMapPropagator().inject(Context.current(), transportLayer, setter); - // Make outgoing call -} finally { - outGoing.end(); -} -... -``` - -Similarly, the text-based approach can be used to read the W3C Trace Context -from incoming requests. The following presents an example of processing an -incoming HTTP request using [HttpExchange][]. - -```java -TextMapGetter getter = - new TextMapGetter<>() { - @Override - public String get(HttpExchange carrier, String key) { - if (carrier.getRequestHeaders().containsKey(key)) { - return carrier.getRequestHeaders().get(key).get(0); - } - return null; - } - - @Override - public Iterable keys(HttpExchange carrier) { - return carrier.getRequestHeaders().keySet(); - } -}; -... -public void handle(HttpExchange httpExchange) { - // Extract the SpanContext and other elements from the request. - Context extractedContext = openTelemetry.getPropagators().getTextMapPropagator() - .extract(Context.current(), httpExchange, getter); - try (Scope scope = extractedContext.makeCurrent()) { - // Automatically use the extracted SpanContext as parent. - Span serverSpan = tracer.spanBuilder("GET /resource") - .setSpanKind(SpanKind.SERVER) - .startSpan(); - try { - // Add the attributes defined in the Semantic Conventions - serverSpan.setAttribute(SemanticAttributes.HTTP_METHOD, "GET"); - serverSpan.setAttribute(SemanticAttributes.HTTP_SCHEME, "http"); - serverSpan.setAttribute(SemanticAttributes.HTTP_HOST, "localhost:8080"); - serverSpan.setAttribute(SemanticAttributes.HTTP_TARGET, "/resource"); - // Serve the request - ... - } finally { - serverSpan.end(); - } - } -} -``` - -The following code presents an example to read the W3C Trace Context from -incoming request, add spans, and further propagate the context. The example -utilizes -[HttpHeaders](https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpHeaders.html) -to fetch the traceparent header for context propagation. - -```java -TextMapGetter getter = - new TextMapGetter() { - @Override - public String get(HttpHeaders headers, String s) { - assert headers != null; - return headers.getHeaderString(s); - } - - @Override - public Iterable keys(HttpHeaders headers) { - List keys = new ArrayList<>(); - MultivaluedMap requestHeaders = headers.getRequestHeaders(); - requestHeaders.forEach((k, v) ->{ - keys.add(k); - }); - } -}; - -TextMapSetter setter = - new TextMapSetter() { - @Override - public void set(HttpURLConnection carrier, String key, String value) { - // Insert the context as Header - carrier.setRequestProperty(key, value); - } -}; - -//... -public void handle( HttpHeaders headers){ - Context extractedContext = opentelemetry.getPropagators().getTextMapPropagator() - .extract(Context.current(), headers, getter); - try (Scope scope = extractedContext.makeCurrent()) { - // Automatically use the extracted SpanContext as parent. - Span serverSpan = tracer.spanBuilder("GET /resource") - .setSpanKind(SpanKind.SERVER) - .startSpan(); - - try(Scope ignored = serverSpan.makeCurrent()) { - // Add the attributes defined in the Semantic Conventions - serverSpan.setAttribute(SemanticAttributes.HTTP_METHOD, "GET"); - serverSpan.setAttribute(SemanticAttributes.HTTP_SCHEME, "http"); - serverSpan.setAttribute(SemanticAttributes.HTTP_HOST, "localhost:8080"); - serverSpan.setAttribute(SemanticAttributes.HTTP_TARGET, "/resource"); - - HttpURLConnection transportLayer = (HttpURLConnection) url.openConnection(); - // Inject the request with the *current* Context, which contains our current Span. - openTelemetry.getPropagators().getTextMapPropagator().inject(Context.current(), transportLayer, setter); - // Make outgoing call - }finally { - serverSpan.end(); - } - } -} -``` - -## Metrics - -[Spans](/docs/concepts/signals/traces/#spans) provide detailed information about -your application, but produce data that is proportional to the load on the -system. In contrast, [metrics](/docs/concepts/signals/metrics) combine -individual measurements into aggregations, and produce data which is constant as -a function of system load. The aggregations lack details required to diagnose -low level issues, but complement spans by helping to identify trends and -providing application runtime telemetry. - -The metrics API defines a variety of instruments. Instruments record -measurements, which are aggregated by the metrics SDK and eventually exported -out of process. Instruments come in synchronous and asynchronous varieties. -Synchronous instruments record measurements as they happen. Asynchronous -instruments register a callback, which is invoked once per collection, and which -records measurements at that point in time. - -The following sections describe the OpenTelemetry Java metrics API. See -[SdkMeterProvider](../sdk/#sdkmeterprovider) for an overview of metrics SDK -concepts and configuration. - -### Acquiring a meter - -Anywhere in your application where you have manually instrumented code you can -call `opentelemetry.meterBuilder(instrumentationScopeName)` to get or create a -new meter instance using the builder pattern, or -`opentelemetry.getMeter(instrumentationScopeName)` to get or create a meter -based on just the instrument scope name. - -```java -// Get or create a named meter instance with instrumentation version using builder -Meter meter = openTelemetry.meterBuilder("dice-server") - .setInstrumentationVersion("0.1.0") - .build(); - -// Get or create a named meter instance by name only -Meter meter = openTelemetry.getMeter("dice-server"); -``` - -Now that you have [meters](/docs/concepts/signals/metrics/#meter) initialized. -you can create -[metric instruments](/docs/concepts/signals/metrics/#metric-instruments). - -### Acquiring a meter in Java agent - -If you are using the [Java agent], you can acquire a `Meter` from the global OpenTelemetry -instance: - -```java -import io.opentelemetry.api.GlobalOpenTelemetry; - -Meter meter = GlobalOpenTelemetry.getMeter("application"); -``` - -If you are using Spring Boot, you can add the following bean to your -`@SpringBootApplication` class - to acquire a `Meter` as in the -[Spring Boot starter](#acquiring-a-meter-in-spring-boot-starter) section below: - -```java -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.GlobalOpenTelemetry; - -@Configuration -public class OpenTelemetryConfig { - @Bean - public OpenTelemetry openTelemetry() { - return GlobalOpenTelemetry.get(); - } -} -``` - -### Acquiring a meter in Spring Boot starter - -If you are using the [Spring Boot starter], you can acquire a `Meter` from the -autowired OpenTelemetry instance: - -```java -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.metrics.Meter; - -@Controller -public class MyController { - private final Meter meter; - - public MyController(OpenTelemetry openTelemetry) { - this.meter = openTelemetry.getMeter("application"); - } -} -``` - -### Using Counters - -Counters can be used to measure non-negative, increasing values. - -```java -LongCounter counter = meter.counterBuilder("dice-lib.rolls.counter") - .setDescription("How many times the dice have been rolled.") - .setUnit("rolls") - .build(); - -counter.add(1, attributes); -``` - -### Using Observable (Async) Counters - -Observable counters can be used to measure an additive, non-negative, -monotonically increasing value. These counters specifically focus on the total -accumulated amount, which is gathered from external sources. Unlike synchronous -counters where each increment is recorded as it happens, observable counters -allow you to asynchronously monitor the overall sum of multiple increments. - -```java -ObservableLongCounter counter = meter.counterBuilder("dice-lib.uptime") - .buildWithCallback(measurement -> measurement.record(getUpTime())); -``` - -### Using UpDown Counters - -UpDown counters can increment and decrement, allowing you to observe a value -that goes up or down. - -```java -LongUpDownCounter counter = meter.upDownCounterBuilder("dice-lib.score") - .setDescription("Score from dice rolls.") - .setUnit("points") - .build(); - -//... - -counter.add(10, attributes); - -//... - -counter.add(-20, attributes); -``` - -### Using Observable (Async) UpDown Counters - -Observable UpDown counters can increment and decrement, allowing you to measure -an additive, non-negative, non-monotonically increasing cumulative value. These -UpDown counters specifically focus on the total accumulated amount, which is -gathered from external sources. Unlike synchronous UpDown counters where each -increment is recorded as it happens, observable counters allow you to -asynchronously monitor the overall sum of multiple increments. - -```java -ObservableDoubleUpDownCounter upDownCounter = meter.upDownCounterBuilder("dice-lib.score") - .buildWithCallback(measurement -> measurement.record(calculateScore())); -``` - -### Using Histograms - -Histograms are used to measure a distribution of values over time. - -```java -LongHistogram histogram = meter.histogramBuilder("dice-lib.rolls") - .ofLongs() // Required to get a LongHistogram, default is DoubleHistogram - .setDescription("A distribution of the value of the rolls.") - .setExplicitBucketBoundariesAdvice(Arrays.asList(1L, 2L, 3L, 4L, 5L, 6L, 7L)) - .setUnit("points") - .build(); - -histogram.record(7, attributes); -``` - -### Using Observable (Async) Gauges - -Observable Gauges should be used to measure non-additive values. - -```java -ObservableDoubleGauge gauge = meter.gaugeBuilder("jvm.memory.used") - .buildWithCallback(measurement -> measurement.record(getMemoryUsed())); -``` - -### Adding Attributes - -When you generate metrics, adding attributes creates unique metric series based -on each distinct set of attributes that receive measurements. This leads to the -concept of 'cardinality', which is the total number of unique series. -Cardinality directly affects the size of the metric payloads that are exported. -Therefore, it's important to carefully select the dimensions included in these -attributes to prevent a surge in cardinality, often referred to as 'cardinality -explosion'. - -```java -Attributes attrs = Attributes.of( - stringKey("hostname"), "i-98c3d4938", - stringKey("region"), "us-east-1"); - -histogram.record(7, attrs); -``` - -## Logs - -Logs are distinct from metrics and traces in that **there is no user-facing -OpenTelemetry logs API**. Instead, there is tooling to bridge logs from existing -popular log frameworks (e.g. SLF4j, JUL, Logback, Log4j) into the OpenTelemetry -ecosystem. For rationale behind this design decision, see -[Logging specification](/docs/specs/otel/logs/). - -The two typical workflows discussed below each cater to different application -requirements. +When writing instrumentation, consult the semantic conventions and conform to +any which are applicable to the domain. + +OpenTelemetry Java [publishes artifacts](../api-components/#semantic-attributes) +to assist in conforming to the semantic conventions, including generated +constants for attribute keys and values. + +TODO: discuss instrumentation API and how it helps conform to semantic +conventions + +## Log instrumentation + +While the [LoggerProvider](../api-components/#loggerprovider) / +[Logger](../api-components/#logger) APIs are structurally similar to the +equivalent [trace](../api-components/#tracerprovider) and +[metric](../api-components/#meterprovider) APIs, they serve a different use +case. As of now, `LoggerProvider` / `Logger` and associated classes represent +the [Log Bridge API](/docs/specs/otel/logs/bridge-api/), which exists to write +log appenders to bridge logs recorded through other log APIs / frameworks into +OpenTelemetry. They are not intended for end user use as a replacement for Log4j +/ SLF4J / Logback / etc. + +There are two typical workflows for consuming log instrumentation in +OpenTelemetry catering to different application requirements: ### Direct to collector @@ -1104,47 +203,23 @@ In the direct to collector workflow, logs are emitted directly from an application to a collector using a network protocol (e.g. OTLP). This workflow is simple to set up as it doesn't require any additional log forwarding components, and allows an application to easily emit structured logs that -conform to the [log data model][log data model]. However, the overhead required -for applications to queue and export logs to a network location may not be -suitable for all applications. +conform to the [log data model](/docs/specs/otel/logs/data-model/). However, the +overhead required for applications to queue and export logs to a network +location may not be suitable for all applications. To use this workflow: -- Install appropriate [Log Appender](#log-appenders). +- Install appropriate log appender. **[1]** - Configure the OpenTelemetry [Log SDK](../sdk/#sdkloggerprovider) to export log records to desired target destination (the - [collector][opentelemetry collector] or other). - -#### Log appenders - -A log appender bridges logs from a log framework into the OpenTelemetry -[Log SDK](../sdk/#sdkloggerprovider) using the [Logs Bridge -API][logs bridge API]. Log appenders are available for various popular Java log -frameworks: - -- [Log4j2 Appender][log4j2 appender] -- [Logback Appender][logback appender] - -The links above contain full usage and installation documentation, but -installation is generally as follows: - -- Add required dependency via gradle or maven. -- Extend the application's log configuration (i.e. `logback.xml`, `log4j.xml`, - etc) to include a reference to the OpenTelemetry log appender. - - Optionally configure the log framework to determine which logs (i.e. filter - by severity or logger name) are passed to the appender. - - Optionally configure the appender to indicate how logs are mapped to - OpenTelemetry Log Records (i.e. capture thread information, context data, - markers, etc). - -Log appenders automatically include the trace context in log records, enabling -log correlation with traces. - -The [Log Appender example][log appender example] demonstrates setup for a -variety of scenarios. + [collector](https://github.com/open-telemetry/opentelemetry-collector) or + other). -See [SdkLoggerProvider](../sdk/#sdkloggerprovider) for an overview of log SDK -concepts and configuration. +**[1]**: Log appenders are a type of [shim](#shims) which bridges logs from a +log framework into the OpenTelemetry log SDK. See "Bridge Log4j into +OpenTelemetry", "Bridge Logback into OpenTelemetry" entries. See +[Log Appender example](https://github.com/open-telemetry/opentelemetry-java-docs/tree/main/log-appender) +for demonstration of a variety of scenarios. ### Via file or stdout @@ -1155,48 +230,11 @@ as the collector. This workflow may be preferable in situations where application requirements do not permit additional overhead from [direct to collector](#direct-to-collector). However, it requires that all log fields required down stream are encoded into the logs, and that the component -reading the logs parse the data into the [log data model][log data model]. The -installation and configuration of log forwarding components is outside the scope -of this document. - -Log correlation with traces is available by installing -[log context instrumentation](#log-context-instrumentation). - -#### Log context instrumentation - -OpenTelemetry provides components which enrich log context with trace context -for various popular Java log frameworks: - -- [Log4j context data instrumentation][log4j context instrumentation] -- [Logback MDC instrumentation][logback context instrumentation] - -This links above contain full usage and installation documentation, but -installation is generally as follows: - -- Add required dependency via gradle or maven. -- Extend the application's log configuration (i.e. `logback.xml` or `log4j.xml`, - etc) to reference the trace context fields in the log pattern. - -[httpexchange]: - https://docs.oracle.com/javase/8/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpExchange.html -[java-vers]: - https://github.com/open-telemetry/opentelemetry-java/blob/main/VERSIONING.md#language-version-compatibility -[instrumentation library]: /docs/specs/otel/glossary/#instrumentation-library -[instrumented library]: /docs/specs/otel/glossary/#instrumented-library -[logs bridge API]: /docs/specs/otel/logs/bridge-api -[log data model]: /docs/specs/otel/logs/data-model -[log4j2 appender]: - https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/log4j/log4j-appender-2.17/library -[logback appender]: - https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/logback/logback-appender-1.0/library -[log appender example]: - https://github.com/open-telemetry/opentelemetry-java-docs/tree/main/log-appender -[log4j context instrumentation]: - https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure -[logback context instrumentation]: - https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/logback/logback-mdc-1.0/library -[obtaining a tracer]: /docs/specs/otel/trace/api/#get-a-tracer -[opentelemetry collector]: - https://github.com/open-telemetry/opentelemetry-collector -[Java agent]: /docs/zero-code/java/agent/ -[Spring Boot starter]: /docs/zero-code/java/spring-boot-starter/ +reading the logs parse the data into the +[log data model](/docs/specs/otel/logs/data-model). The installation and +configuration of log forwarding components is outside the scope of this +document. + +Log correlation with traces is available by installing a [shim](#shims) to +bridge OpenTelemetry context into the log framework. See "Bridge OpenTelemetry +context into Log4j", "Bridge OpenTelemetry context into Logback" entries. diff --git a/content/en/docs/languages/java/libraries.md b/content/en/docs/languages/java/libraries.md deleted file mode 100644 index e222378b2738..000000000000 --- a/content/en/docs/languages/java/libraries.md +++ /dev/null @@ -1,187 +0,0 @@ ---- -title: Using instrumentation libraries -linkTitle: Libraries -weight: 40 -cSpell:ignore: getenv httpclient println ---- - -{{% docs/languages/libraries-intro "java" %}} - -## Use Instrumentation Libraries - -If a library does not come with OpenTelemetry out of the box, you can use -[instrumentation libraries](/docs/specs/otel/glossary/#instrumentation-library) -in order to generate telemetry data for a library or framework. - -The Java agent for automatic instrumentation includes instrumentation libraries -for many common Java frameworks. Most are turned on by default. If you need to -turn off certain instrumentation libraries, you can -[suppress them](/docs/zero-code/java/agent/disable/). - -If you use [code-based instrumentation](../instrumentation), you can leverage -some instrumentation libraries for your dependencies standalone. To find out -which standalone instrumentation libraries are available, take a look at -[this list](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md#libraries--frameworks). -Follow the instructions of each instrumentation library to set them up. - -## Example app - -The following example instruments an HTTP client application using library -instrumentation which calls an HTTP server. - -You can use the dice example app as HTTP server from -[Getting Started](../getting-started/) or you can create your own HTTP server. - -### Dependencies - -Set up an environment in a new directory named `java-simple-http-client`. Inside -the directory, create a file named `build.gradle.kts` with the following -content: - -{{% alert title="Note" color="info" %}} The example is built using Gradle. You -might need to amend the directory structure and `pom.xml` to run using Maven. -{{% /alert %}} - -{{< tabpane text=true >}} {{% tab Gradle %}} - -```kotlin -plugins { - id("java") - id("application") -} - -application { - mainClass.set("otel.SampleHttpClient") -} - -sourceSets { - main { - java.setSrcDirs(setOf(".")) - } -} - -repositories { - mavenCentral() -} - -dependencies { - implementation("io.opentelemetry:opentelemetry-api:{{% param vers.otel %}}"); - implementation("io.opentelemetry:opentelemetry-sdk:{{% param vers.otel %}}"); - implementation("io.opentelemetry:opentelemetry-exporter-logging:{{% param vers.otel %}}"); - implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:{{% param vers.otel %}}"); - implementation("io.opentelemetry.instrumentation:opentelemetry-java-http-client:{{% param vers.instrumentation %}}-alpha"); -} -``` - -{{% /tab %}} {{% tab Maven %}} - -```xml - - - io.opentelemetry.instrumentation - opentelemetry-java-http-client - {{% param vers.instrumentation %}}-alpha - - -``` - -{{< /tab >}} {{< /tabpane>}} - -### Setup - -The following example shows how you can instrument external API calls using -[Java HTTP client library](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/java-http-client/library): - -```java -// SampleHttpClient.java -package otel; - -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; -import io.opentelemetry.instrumentation.httpclient.JavaHttpClientTelemetry; -import java.net.http.HttpClient; - -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpHeaders; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; - -public final class SampleHttpClient { - //Init OpenTelemetry - private static final OpenTelemetry openTelemetry = AutoConfiguredOpenTelemetrySdk.initialize().getOpenTelemetrySdk(); - - //Use this HttpClient implementation for making standard http client calls. - public HttpClient createTracedClient(OpenTelemetry openTelemetry) { - return JavaHttpClientTelemetry.builder(openTelemetry).build().newHttpClient(createClient()); - } - - //your configuration of the Java HTTP Client goes here: - private HttpClient createClient() { - return HttpClient.newBuilder().build(); - } - - public static void main(String[] args) throws Exception { - HttpRequest request = HttpRequest.newBuilder() - .GET() - .uri(URI.create(System.getenv().getOrDefault("EXTERNAL_API_ENDPOINT", "http://localhost:8080/rolldice"))) - //.setHeader("User-Agent", "Java 11 HttpClient Bot") // add request header - .build(); - - SampleHttpClient s = new SampleHttpClient(); - HttpResponse response = s.createTracedClient(openTelemetry).send(request, HttpResponse.BodyHandlers.ofString()); - // print response headers - HttpHeaders headers = response.headers(); - headers.map().forEach((k, v) -> System.out.println(k + ":" + v)); - // print status code - System.out.println(response.statusCode()); - // print response body - System.out.println(response.body()); - - } -} -``` - -### Run - -Set the `EXTERNAL_API_ENDPOINT` environment variable to specify the external API -endpoint. By default, it points to `http://localhost:8080/rolldice`, where -[example dice app](../getting-started/#example-application) is running. - -To check your code, run the app: - -```sh -env \ -OTEL_SERVICE_NAME=http-client \ -OTEL_TRACES_EXPORTER=logging \ -OTEL_METRICS_EXPORTER=logging \ -OTEL_LOGS_EXPORTER=logging \ -gradle run -``` - -When you run the app, the instrumentation libraries do the following: - -- Start a new trace. -- Generate a span that represents the request made to the external API endpoint. -- If you use an instrumented HTTP server, as in the - [dice app](../getting-started/#example-application), more trace spans are - generated with the same trace ID. - -## Available instrumentation libraries - -For a full list of instrumentation libraries, see -[opentelemetry-java-instrumentation](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md#libraries--frameworks). - -## Next steps - -After you've set up instrumentation libraries, you might want to add -[additional instrumentation](../instrumentation) to collect custom telemetry -data. - -You might also want to [configure the SDK](../configuration/) to export to one -or more telemetry backends. - -For existing library instrumentations, also see -[Java agent](/docs/zero-code/java/agent/). - -[opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) diff --git a/content/en/docs/languages/java/sdk.md b/content/en/docs/languages/java/sdk.md index 11aa6f478ab5..f2c58896dbce 100644 --- a/content/en/docs/languages/java/sdk.md +++ b/content/en/docs/languages/java/sdk.md @@ -1,6 +1,6 @@ --- title: Manage Telemetry with SDK -weight: 11 +weight: 12 cSpell:ignore: autoconfigured FQCNs Interceptable Logback okhttp --- @@ -8,7 +8,7 @@ cSpell:ignore: autoconfigured FQCNs Interceptable Logback okhttp The SDK is the built-in reference implementation of the -[API](../instrumentation/), processing and exporting telemetry produced by +[API](../api-components/), processing and exporting telemetry produced by instrumentation API calls. This page is a conceptual overview of the SDK, including descriptions, links to relevant Javadocs, artifact coordinates, sample programmatic configurations and more. See @@ -55,6 +55,9 @@ implementing various plugin extension interfaces: ## SDK components +The `io.opentelemetry:opentelemetry-sdk:{{% param vers.otel %}}` artifact +contains the OpenTelemetry SDK. + The following sections describe the core user-facing components of the SDK. Each component section includes: @@ -71,8 +74,7 @@ component section includes: ### OpenTelemetrySdk [OpenTelemetrySdk](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk/latest/io/opentelemetry/sdk/OpenTelemetrySdk.html) -is the SDK implementation of -[OpenTelemetry](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/OpenTelemetry.html). +is the SDK implementation of [OpenTelemetry](../api-components/#opentelemetry). It is a holder for top-level SDK components which makes it convenient to pass fully-configured SDK components to instrumentation. @@ -150,8 +152,8 @@ public class ResourceConfig { [SdkTracerProvider](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-trace/latest/io/opentelemetry/sdk/trace/SdkTracerProvider.html) is the SDK implementation of -[TracerProvider](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/trace/TracerProvider.html), -and is responsible for handling trace telemetry produced by the API. +[TracerProvider](../api-components/#tracerprovider), and is responsible for +handling trace telemetry produced by the API. `SdkTracerProvider` is configured by the application owner, and consists of: @@ -557,8 +559,7 @@ public class SpanLimitsConfig { ### SdkMeterProvider [SdkMeterProvider](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-metrics/latest/io/opentelemetry/sdk/metrics/SdkMeterProvider.html) -is the SDK implementation of -[MeterProvider](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/MeterProvider.html), +is the SDK implementation of [MeterProvider](../api-components/#meterprovider), and is responsible for handling metric telemetry produced by the API. `SdkMeterProvider` is configured by the application owner, and consists of: @@ -927,8 +928,8 @@ public class ViewConfig { [SdkLoggerProvider](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-sdk-logs/latest/io/opentelemetry/sdk/logs/SdkLoggerProvider.html) is the SDK implementation of -[LoggerProvider](https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/logs/LoggerProvider.html), -and is responsible for handling log telemetry produced by the log bridge API. +[LoggerProvider](../api-components/#loggerprovider), and is responsible for +handling log telemetry produced by the log bridge API. `SdkLoggerProvider` is configured by the application owner, and consists of: @@ -1198,6 +1199,9 @@ public class LogLimitsConfig { is a [plugin extension interface](#sdk-plugin-extension-interfaces) responsible for propagating context across process boundaries in a text format. +TextMapPropagators built-in to the SDK and maintained by the community in +`opentelemetry-java-contrib`: + | Class | Artifact | Description | | --------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | `W3CTraceContextPropagator` | `io.opentelemetry:opentelemetry-api:{{% param vers.otel %}}` | Propagate trace context using W3C trace context propagation protocol. | diff --git a/layouts/partials/docs/native-libraries.md b/layouts/partials/docs/native-libraries.md new file mode 100644 index 000000000000..15f392695be0 --- /dev/null +++ b/layouts/partials/docs/native-libraries.md @@ -0,0 +1,31 @@ + +{{ $howMany := .Get 1 | default 10 -}} +{{ $langIndex := .Get 0 }} +{{ $lang := index $.Site.Data.instrumentation $langIndex -}} +{{ $integrations := where (slice ) ".language" $langIndex -}} + +{{ $integrations := slice }} {{ range $entry := $.Site.Data.registry }} +{{ if and (and (eq $entry.language $langIndex) (eq $entry.isNative true)) (eq $entry.registryType "instrumentation") }} +{{ $integrations = $integrations | append $entry }} {{ end }} {{ end }} + +{{ range first $howMany (sort $integrations "name") -}} + + +- [{{ .title }}]({{ .urls.docs }}) +{{- end }} + +{{ if eq (len $integrations) 0 -}} + + +{{ else -}} + +{{ end -}} diff --git a/layouts/shortcodes/docs/languages/libraries-intro.md b/layouts/shortcodes/docs/languages/libraries-intro.md index 00a40302dbe3..614e46f3ae41 100644 --- a/layouts/shortcodes/docs/languages/libraries-intro.md +++ b/layouts/shortcodes/docs/languages/libraries-intro.md @@ -31,24 +31,4 @@ OpenTelemetry SDK with your app. The library might require some additional configuration for the instrumentation. Go to the documentation for that library to learn more. -{{ range first $howMany (sort $integrations "name") -}} - - -- [{{ .title }}]({{ .urls.docs }}) -{{- end }} - -{{ if eq (len $integrations) 0 -}} - - -{{ else -}} - -{{ end -}} +{{ partial "docs/native-libraries.md" . }} diff --git a/layouts/shortcodes/docs/languages/native-libraries.md b/layouts/shortcodes/docs/languages/native-libraries.md new file mode 100644 index 000000000000..53f520730de3 --- /dev/null +++ b/layouts/shortcodes/docs/languages/native-libraries.md @@ -0,0 +1 @@ +{{ partial "docs/native-libraries.md" . }} diff --git a/static/refcache.json b/static/refcache.json index 9fc02794914b..d7639447eba3 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -3047,6 +3047,10 @@ "StatusCode": 200, "LastSeen": "2024-08-09T10:45:54.649845-04:00" }, + "https://docs.oracle.com/javase/7/docs/technotes/guides/management/agent.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:17.488566-05:00" + }, "https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#availableProcessors--": { "StatusCode": 200, "LastSeen": "2024-01-30T16:04:00.071297-05:00" @@ -7519,6 +7523,10 @@ "StatusCode": 200, "LastSeen": "2024-01-30T06:06:25.505322-05:00" }, + "https://github.com/prometheus/client_java": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:19.363961-05:00" + }, "https://github.com/prometheus/prometheus/commit/d9d51c565c622cdc7d626d3e7569652bc28abe15#diff-bdaf80ebc5fa26365f45db53435b960ce623ea6f86747fb8870ad1abc355f64fR76-R83": { "StatusCode": 200, "LastSeen": "2024-01-18T19:37:11.409183-05:00" @@ -9019,6 +9027,14 @@ "StatusCode": 200, "LastSeen": "2024-08-09T10:43:55.405438-04:00" }, + "https://logback.qos.ch/": { + "StatusCode": 206, + "LastSeen": "2024-09-30T10:42:23.585047-05:00" + }, + "https://logging.apache.org/log4j/2.x/index.html": { + "StatusCode": 206, + "LastSeen": "2024-09-30T10:42:20.642504-05:00" + }, "https://lookerstudio.google.com/s/tSTKxK1ECeU": { "StatusCode": 200, "LastSeen": "2024-03-06T14:56:05.033361-05:00" @@ -10063,6 +10079,10 @@ "StatusCode": 206, "LastSeen": "2024-01-18T19:07:33.813401-05:00" }, + "https://opentracing.io/": { + "StatusCode": 206, + "LastSeen": "2024-09-30T10:42:13.94789-05:00" + }, "https://operatorhub.io/operator/opentelemetry-operator": { "StatusCode": 206, "LastSeen": "2024-01-18T19:10:45.627677-05:00" @@ -12923,22 +12943,134 @@ "StatusCode": 200, "LastSeen": "2024-01-18T19:55:46.525923-05:00" }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/GlobalOpenTelemetry.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:23.12239-05:00" + }, "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/OpenTelemetry.html": { "StatusCode": 200, "LastSeen": "2024-08-05T15:19:48.24217-05:00" }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/baggage/Baggage.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:43:07.738549-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagator.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:43:07.651421-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/common/Attributes.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:20.917364-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/logs/LogRecordBuilder.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:43:04.945711-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/logs/Logger.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:43:01.318503-05:00" + }, "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/logs/LoggerProvider.html": { "StatusCode": 200, "LastSeen": "2024-08-05T15:59:36.584528-05:00" }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/DoubleCounter.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T11:26:12.546964-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/DoubleGauge.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:56.762156-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/DoubleHistogram.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:51.433911-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/DoubleUpDownCounter.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:39.724087-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/LongCounter.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T11:26:11.401131-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/LongGauge.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:57.12662-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/LongHistogram.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:52.311487-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/LongUpDownCounter.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:37.428847-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/Meter.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:27.180222-05:00" + }, "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/MeterProvider.html": { "StatusCode": 200, "LastSeen": "2024-08-05T15:59:35.353354-05:00" }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableDoubleCounter.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:35.879775-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableDoubleGauge.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:57.769016-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableDoubleUpDownCounter.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:49.469015-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableLongCounter.htmll": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:34.290165-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableLongGauge.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:43:02.724791-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/ObservableLongUpDownCounter.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:45.458127-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/trace/Span.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:25.46897-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/trace/SpanBuilder.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:25.000171-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/trace/Tracer.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:23.509988-05:00" + }, "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/trace/TracerProvider.html": { "StatusCode": 200, "LastSeen": "2024-08-05T15:19:51.603241-05:00" }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/trace/propagation/W3CTraceContextPropagator.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:26.645518-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-context/latest/io/opentelemetry/context/Context.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:14.126006-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-context/latest/io/opentelemetry/context/ContextStorage.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T11:26:04.981525-05:00" + }, + "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-context/latest/io/opentelemetry/context/propagation/ContextPropagators.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:19.966187-05:00" + }, "https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-context/latest/io/opentelemetry/context/propagation/TextMapPropagator.html": { "StatusCode": 200, "LastSeen": "2024-08-05T15:20:15.97313-05:00" @@ -13031,6 +13163,10 @@ "StatusCode": 200, "LastSeen": "2024-08-05T15:19:47.672179-05:00" }, + "https://www.javadoc.io/static/io.opentelemetry/opentelemetry-context/1.41.0/io/opentelemetry/context/ContextStorage.html": { + "StatusCode": 200, + "LastSeen": "2024-09-30T10:42:16.987832-05:00" + }, "https://www.jenkins.io": { "StatusCode": 206, "LastSeen": "2024-01-30T05:18:35.317496-05:00" From ebd44572139665fd0681b9aa0d3b61eaba31cd03 Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Fri, 18 Oct 2024 07:06:39 -0500 Subject: [PATCH 20/76] Update opentelemetry-java-instrumentation version to v2.9.0 (#5428) --- content/en/docs/languages/java/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/languages/java/_index.md b/content/en/docs/languages/java/_index.md index 36a40f27de57..65234d7132ae 100644 --- a/content/en/docs/languages/java/_index.md +++ b/content/en/docs/languages/java/_index.md @@ -6,7 +6,7 @@ description: >- aliases: [/java, /java/metrics, /java/tracing] cascade: vers: - instrumentation: 2.8.0 + instrumentation: 2.9.0 otel: 1.43.0 contrib: 1.38.0 semconv: 1.28.0 From b3bf36eff931aa832b4d3f61840bf7a98aeaf2e5 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Fri, 18 Oct 2024 08:14:52 -0400 Subject: [PATCH 21/76] [CI] Ensure spec processing works even if path contains a space (#5422) --- scripts/content-modules/adjust-pages.pl | 12 ++++++------ scripts/content-modules/cp-pages.sh | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/content-modules/adjust-pages.pl b/scripts/content-modules/adjust-pages.pl index c0d7fc219dc5..ae801b5728eb 100755 --- a/scripts/content-modules/adjust-pages.pl +++ b/scripts/content-modules/adjust-pages.pl @@ -127,15 +127,15 @@ () # Images s|(\.\./)?internal(/img/[-\w]+\.png)|$2|g; s|(\]\()(img/.*?\))|$1../$2|g if $ARGV !~ /(logs|schemas)._index/ && $ARGV !~ /otlp\/docs/; - s|(\]\()([^)]+\.png\))|$1../$2|g if $ARGV =~ /\/tmp\/semconv\/docs\/general\/attributes/; - s|(\]\()([^)]+\.png\))|$1../$2|g if $ARGV =~ /\/tmp\/semconv\/docs\/http\/http-spans/; + s|(\]\()([^)]+\.png\))|$1../$2|g if $ARGV =~ /\btmp\/semconv\/docs\/general\/attributes/; + s|(\]\()([^)]+\.png\))|$1../$2|g if $ARGV =~ /\btmp\/semconv\/docs\/http\/http-spans/; s|\.\.\/README.md\b|$otelSpecRepoUrl/|g if $ARGV =~ /specification._index/; s|\.\.\/README.md\b|..| if $ARGV =~ /specification.library-guidelines.md/; - s|\.\./(opentelemetry/proto/?.*)|$otlpSpecRepoUrl/tree/v$otlpSpecVers/$1|g if $ARGV =~ /\/tmp\/otlp/; - s|\.\./README.md\b|$otlpSpecRepoUrl/|g if $ARGV =~ /\/tmp\/otlp/; - s|\.\./examples/README.md\b|$otlpSpecRepoUrl/tree/v$otlpSpecVers/examples/|g if $ARGV =~ /\/tmp\/otlp/; + s|\.\./(opentelemetry/proto/?.*)|$otlpSpecRepoUrl/tree/v$otlpSpecVers/$1|g if $ARGV =~ /\btmp\/otlp/; + s|\.\./README.md\b|$otlpSpecRepoUrl/|g if $ARGV =~ /\btmp\/otlp/; + s|\.\./examples/README.md\b|$otlpSpecRepoUrl/tree/v$otlpSpecVers/examples/|g if $ARGV =~ /\btmp\/otlp/; s|\bREADME.md\b|_index.md|g if $ARGV !~ /otel\/specification\/protocol\/_index.md/; @@ -144,7 +144,7 @@ () s|(\.\.\/)+(supplementary-guidelines\/compatibility\/[^)]+)|$otelSpecRepoUrl/tree/v$otelSpecVers/$2|g; # Rewrite inline links - if ($ARGV =~ /\/tmp\/opamp/) { + if ($ARGV =~ /\btmp\/opamp/) { s|\]\(([^:\)]*?)\.md((#.*?)?)\)|]($1/$2)|g; } else { s|\]\(([^:\)]*?\.md(#.*?)?)\)|]({{% relref "$1" %}})|g; diff --git a/scripts/content-modules/cp-pages.sh b/scripts/content-modules/cp-pages.sh index a561afcf54a3..074d7652287b 100755 --- a/scripts/content-modules/cp-pages.sh +++ b/scripts/content-modules/cp-pages.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash -SCRIPT_DIR="$(cd `dirname $0`; pwd)" -DEST_BASE="$(cd $SCRIPT_DIR; cd ../../; pwd)/tmp" +SCRIPT_DIR=$(dirname $0) +DEST_BASE=tmp ## OTel specification From 26b9decb5b09eaae85726cafd8133c8a4253ed69 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Fri, 18 Oct 2024 08:15:13 -0400 Subject: [PATCH 22/76] Update Docsy to v0.10.0-37-g7478e1a1 (#5435) --- .gitmodules | 2 +- themes/docsy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index ec8382827470..a222421c703b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "themes/docsy"] path = themes/docsy url = https://github.com/google/docsy.git - docsy-pin = v0.10.0-26-g79511949 + docsy-pin = v0.10.0-37-g7478e1a1 docsy-note = "2024-04-01 Switching to google/docsy.git from cncf/docsy.git since we don't have any CNCF customizations." docsy-reminder = "Ensure that any tag referenced by `docsy-pin` is present in the remote repo (url), otherwise add (push) the tags to the repo." [submodule "content-modules/opentelemetry-specification"] diff --git a/themes/docsy b/themes/docsy index 795119495470..7478e1a158da 160000 --- a/themes/docsy +++ b/themes/docsy @@ -1 +1 @@ -Subproject commit 7951194954708d7cc992e3540c8fc823cc99a953 +Subproject commit 7478e1a158dadbba35a1092883d1e7f16ef0f153 From a2fd8c4821848d266c28b731367ac3bd40992650 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Fri, 18 Oct 2024 09:01:21 -0400 Subject: [PATCH 23/76] OTel diagram: drop fill color in support of dark mode (#5436) --- static/img/otel-diagram.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/img/otel-diagram.svg b/static/img/otel-diagram.svg index 0bca7d5433b4..f7f198f4e4b3 100644 --- a/static/img/otel-diagram.svg +++ b/static/img/otel-diagram.svg @@ -1,6 +1,6 @@ - + From 418b15e9e71d6ab83e8592cbfab9a21423f92a47 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Fri, 18 Oct 2024 11:11:17 -0400 Subject: [PATCH 24/76] [infra] Update pkgs, Hugo to 0.136.1 (#5437) --- package.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index ed05f392b032..7090bfc9f329 100644 --- a/package.json +++ b/package.json @@ -111,23 +111,23 @@ "update:submodule": "set -x && git submodule update --remote ${DEPTH:- --depth 999}" }, "devDependencies": { - "@cspell/dict-es-es": "^3.0.0", - "@cspell/dict-fr-fr": "^2.2.2", - "@cspell/dict-pt-br": "^2.3.0", + "@cspell/dict-es-es": "^3.0.3", + "@cspell/dict-fr-fr": "^2.2.5", + "@cspell/dict-pt-br": "^2.3.3", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", "autoprefixer": "^10.4.20", - "cspell": "^8.14.4", + "cspell": "^8.15.4", "gulp": "^5.0.0", - "hugo-extended": "0.133.0", + "hugo-extended": "0.136.1", "js-yaml": "^4.1.0", "markdown-link-check": "^3.12.2", "markdownlint": "^0.35.0", "postcss-cli": "^11.0.0", "prettier": "^3.3.3", "require-dir": "^1.2.0", - "textlint": "^14.2.0", + "textlint": "^14.2.1", "textlint-filter-rule-allowlist": "^4.0.0", "textlint-filter-rule-comments": "^1.2.2", "textlint-rule-terminology": "^5.2.12", @@ -148,8 +148,8 @@ "path": "^0.12.7" }, "optionalDependencies": { - "netlify-cli": "^17.36.4", - "npm-check-updates": "^17.1.3" + "netlify-cli": "^17.37.1", + "npm-check-updates": "^17.1.4" }, "enginesComment": "Ensure that engines.node value stays consistent with the project's .nvmrc", "engines": { From 0823a19f07912749ec9b6f76596ab6cae2b81bd2 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 19 Oct 2024 06:44:17 +0800 Subject: [PATCH 25/76] [zh] Add anchors and tweak lines in style-guide.md (#5430) Signed-off-by: windsonsea --- .htmltest.yml | 2 - content/zh/docs/contributing/style-guide.md | 58 +++++++++++++-------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/.htmltest.yml b/.htmltest.yml index 58774c8382e5..69135fd32180 100644 --- a/.htmltest.yml +++ b/.htmltest.yml @@ -8,8 +8,6 @@ CheckMailto: false TestFilesConcurrently: true IgnoreDirs: - ^blog/(\d+/)?page/\d+ - # TODO drop after https://github.com/open-telemetry/opentelemetry.io/issues/5267 is fixed: - - zh/docs/contributing/pr-checks # TODO drop after https://github.com/open-telemetry/opentelemetry.io/issues/5423 is fixed: - (ja|pt)/docs/concepts/instrumentation/libraries/ IgnoreInternalURLs: # list of paths diff --git a/content/zh/docs/contributing/style-guide.md b/content/zh/docs/contributing/style-guide.md index 24ad8a816096..c9800905d6cc 100644 --- a/content/zh/docs/contributing/style-guide.md +++ b/content/zh/docs/contributing/style-guide.md @@ -4,7 +4,7 @@ description: 编写 OpenTelemetry 文档时的术语和风格指南。 linkTitle: 风格指南 weight: 20 cSpell:ignore: open-telemetry postgre style-guide textlintrc -default_lang_commit: d78e63a +default_lang_commit: 2394fa1f1c693e547093e46e83a6819d3c26e9d5 --- OpenTelemetry 还没有官方的风格指南,当前版本的 OpenTelemetry 文档风格受到以下风格指南的启发: @@ -23,22 +23,24 @@ OpenTelemetry 还没有官方的风格指南,当前版本的 OpenTelemetry 文 {{% /alert %}} -## OpenTelemetry.io 单词列表 +## OpenTelemetry.io 单词列表 {#opentelemetryio-word-list} 请在整个网站上统一使用以下 OpenTelemetry 特定术语和词语列表。 -| Term | Usage | -| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| OpenTelemetry | OpenTelemetry 应始终大写。请勿使用 Open-Telemetry。 | -| OTel | OTel 是 OpenTelemetry 的公认缩写形式。请勿使用 OTEL。 | -| Collector | 当引用 OpenTelemetry Collector 时,请始终将 Collector 大写。在句子开头请使用 `The Collector` 或 `The Opentelemetry Collector`, 在句中或句尾则使用 `the Collector` 或 `the OpenTelemetry Collector`。如果您要将 Collector 用作形容词(例如, `Collector 配置` ),请只使用 `Collector` 。 | -| OTEP | OpenTelemetry 增强提案(OpenTelemetry Enhancement Proposal)。复数形式请写作 `OTEPs` 。请不要写成 `OTep` 或 `otep`。 | -| OpAMP | 开放代理管理协议(Open Agent Management Protocol)。请勿在描述或说明中写成 `OPAMP` 或 `opamp`。 | -| | | +| 术语 | 用法 | +| ---- | ----- | +| OpenTelemetry | OpenTelemetry 应始终大写。请勿使用 Open-Telemetry。| +| OTel | OTel 是 OpenTelemetry 的公认缩写形式。请勿使用 OTEL。| +| Collector | 当引用 OpenTelemetry Collector 时,请始终将 Collector 大写。在句子开头请使用 `The Collector` 或 `The Opentelemetry Collector`, 在句中或句尾则使用 `the Collector` 或 `the OpenTelemetry Collector`。如果您要将 Collector 用作形容词(例如, `Collector 配置` ),请只使用 `Collector`。| +| OTEP | OpenTelemetry 增强提案(OpenTelemetry Enhancement Proposal)。复数形式请写作 `OTEPs` 。请不要写成 `OTep` 或 `otep`。| +| OpAMP | 开放代理管理协议(Open Agent Management Protocol)。请勿在描述或说明中写成 `OPAMP` 或 `opamp`。| + -确保正确书写专有名词(例如其他 CNCF 项目或第三方工具)并使用原始大写字母。例如,书写 `PostgreSQL` 而不是 `postgre`。有关完整列表,请查看 [`.textlintrc.yml`](https://github.com/open-telemetry/opentelemetry.io/blob/main/.textlintrc.yml) 文件。 +确保正确书写专有名词(例如其他 CNCF 项目或第三方工具)并使用原始大写字母。例如, +书写 `PostgreSQL` 而不是 `postgre`。有关完整列表,请查看 +[`.textlintrc.yml`](https://github.com/open-telemetry/opentelemetry.io/blob/main/.textlintrc.yml) 文件。 另请参阅 [词汇表](/docs/concepts/glossary/) 以获取 OpenTelemetry术语及其定义的列表。 @@ -46,19 +48,27 @@ OpenTelemetry 还没有官方的风格指南,当前版本的 OpenTelemetry 文 运行 `npm run check:text -- --fix` 命令以修复书写不正确的术语和单词。 -## Markdown 标准 +## Markdown 标准 {#markdown-standards} -为了增强 Markdown 文件的标准性和一致性,所有文件都应遵循 [markdownlint](https://github.com/DavidAnson/markdownlint) 确定的相关规则。有关完整列表,请查看 [`.markdownlint.json`](https://github.com/open-telemetry/opentelemetry.io/blob/main/.markdownlint.json) 文件。 +为了增强 Markdown 文件的标准性和一致性,所有文件都应遵循 +[markdownlint](https://github.com/DavidAnson/markdownlint) +确定的相关规则。有关完整列表,请查看 +[`.markdownlint.json`](https://github.com/open-telemetry/opentelemetry.io/blob/main/.markdownlint.json) +文件。 运行 `npm run check:markdown` 命令以验证所有文件是否遵循标准。 运行 `npm run fix:markdown` 命令以修复与 Markdown 相关的格式问题。 -## 拼写检查 +## 拼写检查 {#spell-checking} -使用 [CSpell](https://github.com/streetsidesoftware/cspell) 确保所有文本拼写正确。有关 OpenTelemetry 网站特定单词的列表,请参阅 [`.cspell.yml`](https://github.com/open-telemetry/opentelemetry.io/blob/main/.cspell.yml) 文件。 +使用 [CSpell](https://github.com/streetsidesoftware/cspell) 确保所有文本拼写正确。 +有关 OpenTelemetry 网站特定单词的列表,请参阅 +[`.cspell.yml`](https://github.com/open-telemetry/opentelemetry.io/blob/main/.cspell.yml) 文件。 -运行 `npm run check:spelling` 命令以验证所有单词拼写是否正确。如果 `cspell` 指示 `Unknown word` 错误,请验证您是否正确编写了该单词。如果正确,请将此单词添加到文件顶部的 `cSpell:ignore` 部分。如果不存在这样的部分,您可以将其添加到 Markdown 文件的元数据中: +运行 `npm run check:spelling` 命令以验证所有单词拼写是否正确。如果 `cspell` 指示 +`Unknown word` 错误,请验证您是否正确编写了该单词。如果正确,请将此单词添加到文件顶部的 +`cSpell:ignore` 部分。如果不存在这样的部分,您可以将其添加到 Markdown 文件的元数据中: ```markdown --- @@ -67,19 +77,23 @@ cSpell:ignore: --- ``` -对于任何其他文件,请在适合文件上下文的注释行中添加 `cSpell:ignore `。对于 [registry](/ecosystem/registry/) 条目 YAML 文件,它可能看起来像这样: +对于任何其他文件,请在适合文件上下文的注释行中添加 `cSpell:ignore `。 +对于 [registry](/ecosystem/registry/) 条目 YAML 文件,它可能看起来像这样: ```yaml # cSpell:ignore title: registryEntryTitle ``` -网站工具通过移除重复单词、删除全局单词列表中的单词以及对单词进行排序来规范特定于页面的词典(即 `cSpell:ignore` 单词列表)。要规范特定于页面的词典,请运行 `npm run fix:dict`。 +网站工具通过移除重复单词、删除全局单词列表中的单词以及对单词进行排序来规范特定于页面的词典(即 +`cSpell:ignore` 单词列表)。要规范特定于页面的词典,请运行 `npm run fix:dict`。 -## 文件格式 +## 文件格式 {#file-format} -为了执行关于文件结构的特定标准,所有文件都应使用 [prettier](https://prettier.io) 进行格式化。在提交 PR 之前运行 `npm run fix:format`,或者在提交 PR 之后运行它并推送额外的提交。 +为了执行关于文件结构的特定标准,所有文件都应使用 [prettier](https://prettier.io) +进行格式化。在提交 PR 之前运行 `npm run fix:format`,或者在提交 PR 之后运行它并推送额外的提交。 -## 文件名 +## 文件名 {#file-names} -所有文件名都应采用[短横线命名](https://en.wikipedia.org/wiki/Letter_case#Kebab_case)。运行 `npm run fix:filenames` 以自动重命名文件。 +所有文件名都应采用[短横线命名](https://en.wikipedia.org/wiki/Letter_case#Kebab_case)。 +运行 `npm run fix:filenames` 以自动重命名文件。 From 277e52d5e74f2da0c4bbcf90f3f44e4d9f11d079 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Mon, 21 Oct 2024 05:21:05 -0400 Subject: [PATCH 26/76] Update docsy to 0.11.0 and Hugo to patch 0.136.2 (#5442) --- .gitmodules | 2 +- package.json | 2 +- themes/docsy | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index a222421c703b..896a8818601b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "themes/docsy"] path = themes/docsy url = https://github.com/google/docsy.git - docsy-pin = v0.10.0-37-g7478e1a1 + docsy-pin = v0.11.0 docsy-note = "2024-04-01 Switching to google/docsy.git from cncf/docsy.git since we don't have any CNCF customizations." docsy-reminder = "Ensure that any tag referenced by `docsy-pin` is present in the remote repo (url), otherwise add (push) the tags to the repo." [submodule "content-modules/opentelemetry-specification"] diff --git a/package.json b/package.json index 7090bfc9f329..5684f3fa47c1 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "autoprefixer": "^10.4.20", "cspell": "^8.15.4", "gulp": "^5.0.0", - "hugo-extended": "0.136.1", + "hugo-extended": "0.136.2", "js-yaml": "^4.1.0", "markdown-link-check": "^3.12.2", "markdownlint": "^0.35.0", diff --git a/themes/docsy b/themes/docsy index 7478e1a158da..cf0c68f041da 160000 --- a/themes/docsy +++ b/themes/docsy @@ -1 +1 @@ -Subproject commit 7478e1a158dadbba35a1092883d1e7f16ef0f153 +Subproject commit cf0c68f041daac066a0292d521461dbd092d7c31 From 65179dd7aa456de8f11190644cb5b6c6c9ab0ac5 Mon Sep 17 00:00:00 2001 From: arusevm <31587605+arusevm@users.noreply.github.com> Date: Mon, 21 Oct 2024 12:29:53 +0300 Subject: [PATCH 27/76] Adding utility for Apache Druid ingestion of OTLP (#5427) Co-authored-by: Severin Neumann --- .../tools-java-druid-extension-otlp.yaml | 28 +++++++++++++++++++ static/refcache.json | 20 +++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 data/registry/tools-java-druid-extension-otlp.yaml diff --git a/data/registry/tools-java-druid-extension-otlp.yaml b/data/registry/tools-java-druid-extension-otlp.yaml new file mode 100644 index 000000000000..f0020a71f6ad --- /dev/null +++ b/data/registry/tools-java-druid-extension-otlp.yaml @@ -0,0 +1,28 @@ +title: Apache Druid extension for OTLP +registryType: utilities +language: java +tags: + - java + - druid + - utilities + - analytics + - dashboards + - monitoring +license: Apache 2.0 +description: This extension allows [Apache Druid](https://druid.apache.org/) to + ingest OpenTelemetry signals. + + An example setup would be to use the [Kafka + Exporter](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/kafkaexporter/README.md) + to publish OTLP data into Kafka topics, and then setup Druid ingestion jobs, + using this extension, to populate tables. +authors: + - name: mishmash io + email: opensourcemaintainers@mishmash.io + url: https://mishmash.io +urls: + repo: https://github.com/mishmash-io/opentelemetry-server-embedded + docs: https://github.com/mishmash-io/opentelemetry-server-embedded/tree/main/druid-otlp-format +createdAt: 2024-10-17 +isNative: false +isFirstParty: false diff --git a/static/refcache.json b/static/refcache.json index d7639447eba3..c29f78be943c 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -3335,6 +3335,10 @@ "StatusCode": 200, "LastSeen": "2024-01-30T15:24:54.677789-05:00" }, + "https://druid.apache.org/": { + "StatusCode": 206, + "LastSeen": "2024-10-18T16:50:18.107656338+03:00" + }, "https://dyladan.me/histograms/2023/05/02/why-histograms/": { "StatusCode": 206, "LastSeen": "2024-01-30T06:01:18.587594-05:00" @@ -5655,6 +5659,10 @@ "StatusCode": 200, "LastSeen": "2024-04-19T17:43:49.897716918Z" }, + "https://github.com/mishmash-io/opentelemetry-server-embedded": { + "StatusCode": 200, + "LastSeen": "2024-10-18T16:50:17.016614951+03:00" + }, "https://github.com/mjwolf": { "StatusCode": 200, "LastSeen": "2024-08-06T15:18:44.682117+02:00" @@ -9215,6 +9223,10 @@ "StatusCode": 206, "LastSeen": "2024-01-18T19:02:08.769984-05:00" }, + "https://mishmash.io": { + "StatusCode": 200, + "LastSeen": "2024-10-18T16:50:17.995881058+03:00" + }, "https://mobyproject.org/": { "StatusCode": 206, "LastSeen": "2024-08-07T15:43:31.13946+02:00" @@ -9931,6 +9943,10 @@ "StatusCode": 206, "LastSeen": "2024-02-23T22:55:04.014798-05:00" }, + "https://opentelemetry.io/docs/concepts/glossary/#instrumentation-library": { + "StatusCode": 206, + "LastSeen": "2024-10-18T16:49:48.155152358+03:00" + }, "https://opentelemetry.io/docs/concepts/instrumentation/libraries/": { "StatusCode": 206, "LastSeen": "2024-04-30T09:31:37.735092936Z" @@ -9975,6 +9991,10 @@ "StatusCode": 206, "LastSeen": "2024-09-04T09:48:32.91926+02:00" }, + "https://opentelemetry.io/docs/specs/otel/document-status": { + "StatusCode": 206, + "LastSeen": "2024-10-18T16:49:48.125677461+03:00" + }, "https://opentelemetry.io/docs/specs/otel/glossary/#instrumentation-library": { "StatusCode": 206, "LastSeen": "2024-04-30T09:31:37.929550219Z" From 0457368038be45cf5344063e98929f9cb4aec800 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Mon, 21 Oct 2024 11:35:50 -0400 Subject: [PATCH 28/76] [i18n, CI] How to deal with broken links in non-en pages when updating en pages (#5448) --- .cspell.yml | 2 + .htmltest.yml | 8 +- content/en/blog/_index.md | 6 +- content/en/docs/contributing/localization.md | 28 ++++ .../concepts/instrumentation/libraries.md | 4 + .../concepts/instrumentation/libraries.md | 4 + package.json | 9 +- scripts/htmltest-config.pl | 135 ++++++++++++++++++ scripts/htmltest-config.sh | 8 ++ 9 files changed, 196 insertions(+), 8 deletions(-) create mode 100755 scripts/htmltest-config.pl create mode 100755 scripts/htmltest-config.sh diff --git a/.cspell.yml b/.cspell.yml index 8e7b3da37da6..57d3c4fbc4f2 100644 --- a/.cspell.yml +++ b/.cspell.yml @@ -53,3 +53,5 @@ dictionaries: - softwareTerms # Other - companies +words: # Valid words across all locales + - htmltest diff --git a/.htmltest.yml b/.htmltest.yml index 69135fd32180..0d3a9386b8e2 100644 --- a/.htmltest.yml +++ b/.htmltest.yml @@ -7,9 +7,13 @@ IgnoreInternalEmptyHash: true # TODO: remove after resolution of https://github. CheckMailto: false TestFilesConcurrently: true IgnoreDirs: + # DO NOT EDIT! IgnoreDirs list is auto-generated from markdown file front matter. + # TODO drop next line after https://github.com/open-telemetry/opentelemetry.io/issues/5423 is fixed for ja pages: + - ^ja/docs/concepts/instrumentation/libraries/ + # TODO drop next line after https://github.com/open-telemetry/opentelemetry.io/issues/5423 is fixed for pt pages: + - ^pt/docs/concepts/instrumentation/libraries/ - ^blog/(\d+/)?page/\d+ - # TODO drop after https://github.com/open-telemetry/opentelemetry.io/issues/5423 is fixed: - - (ja|pt)/docs/concepts/instrumentation/libraries/ + # DO NOT EDIT! IgnoreDirs list is auto-generated from markdown file front matter. IgnoreInternalURLs: # list of paths IgnoreURLs: # list of regexs of paths or URLs to be ignored - ^/api$ diff --git a/content/en/blog/_index.md b/content/en/blog/_index.md index 022dd0feceae..7d0b3e2d57bf 100644 --- a/content/en/blog/_index.md +++ b/content/en/blog/_index.md @@ -1,7 +1,9 @@ --- title: Blog -menu: - main: { weight: 50 } +menu: { main: { weight: 50 } } redirects: [{ from: '', to: '2024/ 301!' }] outputs: [HTML, RSS] +htmltest: + IgnoreDirs: + - ^blog/(\d+/)?page/\d+ --- diff --git a/content/en/docs/contributing/localization.md b/content/en/docs/contributing/localization.md index f1a25fd11505..2d9d2e55673e 100644 --- a/content/en/docs/contributing/localization.md +++ b/content/en/docs/contributing/localization.md @@ -11,6 +11,34 @@ English is the default language, with US English as the default (implicit) local A growing number of other localizations are supported, as can be seen from the languages dropdown menu in the top nav. +## English language maintainer guidance + +### When link checking fails for non-English pages + +English is the default language of the OpenTelemetry website. After you add, +edit, or reorganized English language documentation, link checking may fail for +non-English pages. When this happens: + + + +- Do **not** fix the broken links. Each non-English page is associated with a + specific commit of the corresponding English page, as identified by the git + commit hash value of the `default_lang_commit` front matter key. +- Configure the link checker to ignore the non-English pages by adding the + following to the page's front matter, or to the closest common ancestor file, + when more than one page has link errors: + ```yaml + htmltest: + # TODO: remove the IgnoreDirs once broken links are fixed + IgnoreDirs: + - path-regex/to/non-en/directory/contain/files/to/ignore + - path-2-etc + ``` +- Run `npm run check:links` and include any updates to the `.htmltest.yml` + config file with your PR. + + + ## Translation guidance We recommend that you follow the guidance offered in this section when diff --git a/content/ja/docs/concepts/instrumentation/libraries.md b/content/ja/docs/concepts/instrumentation/libraries.md index e7c89111f324..38d1ed962104 100644 --- a/content/ja/docs/concepts/instrumentation/libraries.md +++ b/content/ja/docs/concepts/instrumentation/libraries.md @@ -3,6 +3,10 @@ title: ライブラリ description: ライブラリにネイティブ計装を追加する方法を紹介します。 weight: 40 default_lang_commit: d8c5612 +htmltest: + IgnoreDirs: + # TODO drop next line after https://github.com/open-telemetry/opentelemetry.io/issues/5423 is fixed for ja pages: + - ^ja/docs/concepts/instrumentation/libraries/ --- OpenTelemetryは、多くのライブラリに[計装ライブラリ][instrumentation libraries]を提供していて、これは通常、ライブラリフックやモンキーパッチライブラリコードを通して行われます。 diff --git a/content/pt/docs/concepts/instrumentation/libraries.md b/content/pt/docs/concepts/instrumentation/libraries.md index 3410ddd032f4..f9dd1e39938d 100644 --- a/content/pt/docs/concepts/instrumentation/libraries.md +++ b/content/pt/docs/concepts/instrumentation/libraries.md @@ -3,6 +3,10 @@ title: Bibliotecas description: Aprenda como adicionar instrumentação nativa à sua biblioteca. weight: 40 default_lang_commit: a570a00c7a238ffe26528d7bfb20efdbaf939c39 +htmltest: + IgnoreDirs: + # TODO drop next line after https://github.com/open-telemetry/opentelemetry.io/issues/5423 is fixed for pt pages: + - ^pt/docs/concepts/instrumentation/libraries/ --- O OpenTelemetry fornece [bibliotecas de instrumentação][] para várias diff --git a/package.json b/package.json index 5684f3fa47c1..0beecdac83d4 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,4 @@ { - "spelling": "cSpell:ignore docsy elemetry htmltest hugo loglevel netlify nowrap prebuild precheck preinstall postbuild postget refcache textlint -", "Notes": [ "The 'all' runs _all_ named scripts in sequence, even if one fails; and exits with failure in that case." ], @@ -86,8 +85,8 @@ "prebuild:preview": "npm run _prebuild", "prebuild:production": "npm run _prebuild", "prebuild": "npm run _prebuild", - "precheck:links:internal": "npm run build", - "precheck:links": "npm run build", + "precheck:links:internal": "npm run build && npm run update:htmltest-config", + "precheck:links": "npm run build && npm run update:htmltest-config", "prefix:submodules": "npm run update:submodule", "prenetlify-build:production": "echo 'IgnoreTagAttribute: rel' >> .htmltest.yml", "prepare": "npm run seq -- get:submodule _prepare:docsy", @@ -102,6 +101,7 @@ "test-and-fix": "npm run seq -- check fix:dict fix:filenames", "test": "npm run check", "update:docsy-dep": "npm install --save-dev autoprefixer@latest postcss-cli@latest", + "update:htmltest-config": "scripts/htmltest-config.sh", "update:hugo": "npm install --save-dev --save-exact hugo-extended@latest", "update:hugo+": "npm run update:hugo && npm run update:docsy-dep", "update:netlify": "npm install --save-optional netlify-cli@latest", @@ -160,5 +160,6 @@ "prettier": { "proseWrap": "always", "singleQuote": true - } + }, + "spelling": "cSpell:ignore docsy elemetry htmltest hugo loglevel netlify nowrap postnetlify prebuild precheck preinstall postbuild postget refcache textlint -" } diff --git a/scripts/htmltest-config.pl b/scripts/htmltest-config.pl new file mode 100755 index 000000000000..ebbf0d61a911 --- /dev/null +++ b/scripts/htmltest-config.pl @@ -0,0 +1,135 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +my $gD = 0; + +sub main { + my @ignore_dirs; + + collect_htmltest_config_from_front_matter(\@ignore_dirs, @ARGV); + update_htmltest_config_file(\@ignore_dirs); +} + +sub collect_htmltest_config_from_front_matter { + my ($ignore_dirs_ref, @files) = @_; + + foreach my $file_path (@files) { + my @htmltest_config = extract_htmltest_config($file_path); + next unless @htmltest_config; + push @$ignore_dirs_ref, @htmltest_config; + } +} + +sub extract_htmltest_config { + # Returns list of htmlconfig lines extracted from the front matter of $file_path + my ($file_path) = @_; + + open my $fh, '<', $file_path or die "Could not open '$file_path': $!"; + my $content = do { local $/; <$fh> }; + close $fh; + + return unless $content =~ /---\n(.*?)\n---/s; + + my $front_matter = $1; + my @htmltest_config = _extract_htmltest_config($front_matter); + + return unless @htmltest_config; + + if (@htmltest_config == 1) { + warn "Warning: Failed to extract htmltest config from front matter in file '$file_path'.\n"; + return; + } + + shift @htmltest_config; + + if (@htmltest_config >= 1 && $htmltest_config[0] =~ /^IgnoreDirs:/i) { + return _extract_ignore_dirs($file_path, @htmltest_config) + } + + # TODO: Add support for `IgnoreURLs`. + + warn "Warning: Unrecognized htmltest config from front matter in file '$file_path'.\n"; +} + +sub _extract_ignore_dirs { + my ($file_path, + @ignore_dirs_config_lines # Can include comment lines + ) = @_; + my @config; + + foreach my $line (@ignore_dirs_config_lines) { + next if $line =~ /^IgnoreDirs:\s*$/i; + if ($line =~ /\s*#/) { + push @config, $line; + } elsif ($line =~ /^IgnoreDirs:\s*\[\s*(.*?)\s*\]/i || $line =~ /^\s*-\s*(.*?)$/) { + push @config, (split /\s*,\s*/, $1); + } else { + warn "Warning: Unrecognized htmltest IgnoreDirs config from front matter in file '$file_path': $line\n"; + } + } + return @config; +} + +sub _extract_htmltest_config { + # Returns a list of htmltext config lines with whitespace trimmed away. + + my ($front_matter) = @_; + my @lines = split /\n/, $front_matter; + my @htmltest_lines; + my $in_htmltest_section = 0; + + foreach my $line (@lines) { + if ($line =~ /^htmltest:(.*?)(#.*)?$/) { + $in_htmltest_section = 1; + push @htmltest_lines, $line; + } elsif ($in_htmltest_section) { + if ($line =~ /^(\s{2,})(.*)$/) { + push @htmltest_lines, $2; + printf " > Config line: $line" if $gD; + } else { + last; + } + } + } + return @htmltest_lines; +} + +sub update_htmltest_config_file { + my ($ignore_dirs_ref) = @_; + my $htmltest_config_path = '.htmltest.yml'; + my $do_not_edit_msg = " # DO NOT EDIT! IgnoreDirs list is auto-generated from markdown file front matter.\n"; + + # Read config file as array of lines + open my $fh, '<', $htmltest_config_path or die "Could not open '$htmltest_config_path' for reading: $!"; + my @lines = <$fh>; + close $fh; + + # Replace the existing IgnoreDirs entries with the new ones + my $in_ignore_dirs = 0; + my @new_lines; + foreach my $line (@lines) { + if ($line =~ /^IgnoreDirs:/) { + push @new_lines, ($line, $do_not_edit_msg); + foreach my $ignore_dir (@$ignore_dirs_ref) { + my $prefix = $ignore_dir =~ /^#/ ? ' ' : ' - '; + push @new_lines, "$prefix$ignore_dir\n"; + } + push @new_lines, $do_not_edit_msg; + $in_ignore_dirs = 1; + } elsif ($in_ignore_dirs) { + next if $line =~ /^\s*([#-]|$)/; + $in_ignore_dirs = 0; + push @new_lines, $line; + } else { + push @new_lines, $line; + } + } + + open my $fh_out, '>', $htmltest_config_path or die "Could not open '$htmltest_config_path' for writing: $!"; + print $fh_out @new_lines; + close $fh_out; +} + +main(); diff --git a/scripts/htmltest-config.sh b/scripts/htmltest-config.sh new file mode 100755 index 000000000000..02696c7c919c --- /dev/null +++ b/scripts/htmltest-config.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# +# We handle listing all markdown files here because it is more portable across +# supported operating systems. + +SCRIPT_DIR=$(dirname $0) +FILES=$(find content -name "*.md") +exec $SCRIPT_DIR/htmltest-config.pl $FILES From fc72093f2329e7675ca02f645e1fae52e621b40e Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Tue, 22 Oct 2024 10:10:28 +0200 Subject: [PATCH 29/76] zero-code/python: add django applications notes in operator doc (#5443) Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Phillip Carter --- content/en/docs/zero-code/python/operator.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/content/en/docs/zero-code/python/operator.md b/content/en/docs/zero-code/python/operator.md index 7675786a8563..9f5e6761b6dd 100644 --- a/content/en/docs/zero-code/python/operator.md +++ b/content/en/docs/zero-code/python/operator.md @@ -3,7 +3,8 @@ title: Using the OpenTelemetry Operator to Inject Auto-Instrumentation linkTitle: Operator aliases: [/docs/languages/python/automatic/operator] weight: 30 -cSpell:ignore: distro grpcio mkdir psutil uninstrumented virtualenv +# prettier-ignore +cSpell:ignore: distro grpcio mkdir myapp psutil PYTHONPATH uninstrumented virtualenv --- If you run your Python service in Kubernetes, you can take advantage of the @@ -26,3 +27,13 @@ specific Python version. The provides images for a single Python version based on the glibc C library. If you want to use it you might need to build your own image operator Docker image for Python auto-instrumentation. + +#### Django applications + +Applications that run from their own executable like Django requires to set in +your deployment file two environment variables: + +- `PYTHONPATH`, with the path to the Django application root directory, e.g. + "/app" +- `DJANGO_SETTINGS_MODULE`, with the name of the Django settings module, e.g. + "myapp.settings" From 4a8e68ba8755c41ff8ad3d6f5417c1f66849d9b6 Mon Sep 17 00:00:00 2001 From: Juliano Costa Date: Tue, 22 Oct 2024 13:23:08 +0200 Subject: [PATCH 30/76] Update feature-flags.md (#5444) --- content/en/docs/demo/feature-flags.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/demo/feature-flags.md b/content/en/docs/demo/feature-flags.md index 4b9fd1c72999..71f9995131f5 100644 --- a/content/en/docs/demo/feature-flags.md +++ b/content/en/docs/demo/feature-flags.md @@ -18,7 +18,7 @@ change the `defaultVariant` value in the config file for a given flag to "on". | `adServiceFailure` | Ad Service | Generate an error for `GetAds` 1/10th of the time | | `adServiceManualGc` | Ad Service | Trigger full manual garbage collections in the ad service | | `adServiceHighCpu` | Ad Service | Trigger high cpu load in the ad service. If you want to demo cpu throttling, set cpu resource limits | -| `cartServiceFailure` | Cart Service | Generate an error for `EmptyCart` 1/10th of the time | +| `cartServiceFailure` | Cart Service | Generate an error whenever `EmptyCart` is called | | `productCatalogFailure` | Product Catalog | Generate an error for `GetProduct` requests with product ID: `OLJCESPC7Z` | | `recommendationServiceCacheFailure` | Recommendation | Create a memory leak due to an exponentially growing cache. 1.4x growth, 50% of requests trigger growth. | | `paymentServiceFailure` | Payment Service | Generate an error when calling the `charge` method. | From 70110e4d45733c51d372d99aaab489120f41e3c5 Mon Sep 17 00:00:00 2001 From: "Chen, Zhi-Yuan" Date: Thu, 24 Oct 2024 17:58:26 +0900 Subject: [PATCH 31/76] Update operator.md (#5425) Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Tiffany Hrabusa <30397949+tiffany76@users.noreply.github.com> --- content/en/docs/kubernetes/helm/operator.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/kubernetes/helm/operator.md b/content/en/docs/kubernetes/helm/operator.md index 39ec637131b1..aed4886dfffe 100644 --- a/content/en/docs/kubernetes/helm/operator.md +++ b/content/en/docs/kubernetes/helm/operator.md @@ -63,8 +63,8 @@ generate/configure the required TLS certificate. `.Values.admissionWebhooks.create` and `admissionWebhooks.certManager.enabled` while setting your custom cert secret name in `admissionWebhooks.secretName` - You can disable webhooks all together by disabling - `.Values.admissionWebhooks.create` and setting env var to - `ENABLE_WEBHOOKS: "false"` + `.Values.admissionWebhooks.create` and setting env var + `.Values.manager.env.ENABLE_WEBHOOKS` to `false` All the configuration options (with comments) available in the chart can be viewed in its From 6a3fb5f928569c27e8351da25cc418d4f3cad681 Mon Sep 17 00:00:00 2001 From: Samylle Sales Date: Thu, 24 Oct 2024 05:58:56 -0300 Subject: [PATCH 32/76] [pt-br] feat: localized apis and sdks languages for pt-br (#5393) --- content/pt/docs/languages/_index.md | 62 +++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 content/pt/docs/languages/_index.md diff --git a/content/pt/docs/languages/_index.md b/content/pt/docs/languages/_index.md new file mode 100644 index 000000000000..322681ad4122 --- /dev/null +++ b/content/pt/docs/languages/_index.md @@ -0,0 +1,62 @@ +--- +title: APIs e SDKs de Linguagens +description: + A instrumentação de código do OpenTelemetry é suportada para muitas linguagens + populares de programação. +weight: 250 +redirects: [{ from: /docs/instrumentation/*, to: ':splat' }] +default_lang_commit: b3a087c468094eb144ab3114aff06838c8fb06ca +--- + +A [instrumentação][] de código do OpenTelemetry é suportada para as linguagens +listadas na tabela de [Estado e Lançamentos](#status-and-releases) abaixo. +Implementações não oficiais para [outras linguagens](/docs/languages/other) +também estão disponíveis. Você pode encontrá-las no +[registro](/ecosystem/registry/). + +Para Go, .NET, PHP, Python, Java e JavaScript, você pode usar +[soluções de instrumentação automática](/docs/zero-code) para instrumentar suas +aplicações sem alterações de código. + +Se você estiver usando Kubernetes, você pode usar o [OpenTelemetry Operator para +Kubernetes][otel-op] para [injetar soluções de implementação +automática][implementação automática] em suas aplicações. + +## Estado e Lançamentos {#status-and-releases} + +O estado atual dos principais componentes funcionais do OpenTelemetry estão a +seguir: + +{{% alert title="Importante" color="warning" %}} + +Independente do estado de um API/SDK, se a sua instrumentação depende de +[convenções semânticas] que são marcadas como [Experimental] na [especificação +de +convenções semânticas], seu fluxo de dados pode estar sujeito à **quebra de +compatibilidade** + +[convenções semânticas]: /docs/concepts/semantic-conventions/ +[Experimental]: /docs/specs/otel/document-status/ +[especificação de convenções semânticas]: /docs/specs/semconv/ + +{{% /alert %}} + +{{% telemetry-support-table " " %}} + +## Referências da API + +Os Grupos de Interesse Especial (SIGs), que implementam a API e o SDK do +OpenTelemetry em diferentes linguagens e também disponibilizam referências da +API para desenvolvedores. As referências a seguir estão disponíveis: + +{{% apidocs %}} + +{{% alert title="Nota" color="info" %}} + +A lista acima é um alias para [`/api`](/api). + +{{% /alert %}} + +[implementação automática]: /docs/kubernetes/operator/automatic/ +[instrumentação]: /docs/concepts/instrumentation/ +[otel-op]: /docs/kubernetes/operator/ From b1196c3f4d22da6ceedd8edbdd4faccd7b2b2453 Mon Sep 17 00:00:00 2001 From: Daniel Lok Date: Thu, 24 Oct 2024 17:52:43 +0800 Subject: [PATCH 33/76] Add MLflow entry to the OpenTelemetry integrations registry (#5470) Signed-off-by: Daniel Lok Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Severin Neumann --- .../application-integration-python-mlflow.yml | 20 +++++++++++++++++++ static/refcache.json | 16 +++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 data/registry/application-integration-python-mlflow.yml diff --git a/data/registry/application-integration-python-mlflow.yml b/data/registry/application-integration-python-mlflow.yml new file mode 100644 index 000000000000..39e6fa3c8ed2 --- /dev/null +++ b/data/registry/application-integration-python-mlflow.yml @@ -0,0 +1,20 @@ +title: MLflow +registryType: application integration +language: python +tags: + - python + - MLflow + - LLMs +license: Apache-2.0 +description: + The MLflow tracing feature is built using OpenTelemetry, and allows users to + trace the execution of their generative AI applications. +authors: + - name: MLflow Authors + url: https://github.com/mlflow +urls: + website: https://mlflow.org/ + repo: https://github.com/mlflow/mlflow/ + docs: https://mlflow.org/docs/latest/llms/tracing/index.html +createdAt: '2024-10-24' +isNative: true diff --git a/static/refcache.json b/static/refcache.json index c29f78be943c..508800b3d219 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -5671,6 +5671,14 @@ "StatusCode": 200, "LastSeen": "2024-01-30T16:04:58.425652-05:00" }, + "https://github.com/mlflow": { + "StatusCode": 200, + "LastSeen": "2024-10-24T09:04:39.209525077Z" + }, + "https://github.com/mlflow/mlflow/": { + "StatusCode": 200, + "LastSeen": "2024-10-24T09:04:36.357311431Z" + }, "https://github.com/mlocati/docker-php-extension-installer": { "StatusCode": 200, "LastSeen": "2024-01-18T19:55:35.599232-05:00" @@ -9227,6 +9235,14 @@ "StatusCode": 200, "LastSeen": "2024-10-18T16:50:17.995881058+03:00" }, + "https://mlflow.org/": { + "StatusCode": 206, + "LastSeen": "2024-10-24T09:04:26.938953245Z" + }, + "https://mlflow.org/docs/latest/llms/tracing/index.html": { + "StatusCode": 206, + "LastSeen": "2024-10-24T09:04:29.562895157Z" + }, "https://mobyproject.org/": { "StatusCode": 206, "LastSeen": "2024-08-07T15:43:31.13946+02:00" From 7bed44944376c062ad05c2d93da1b9884f214839 Mon Sep 17 00:00:00 2001 From: Daniel Gomez Blanco Date: Thu, 24 Oct 2024 14:08:55 +0100 Subject: [PATCH 34/76] Add 2024 GC Election results blogpost (#5476) --- content/en/blog/2024/gc-election-results.md | 32 +++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 content/en/blog/2024/gc-election-results.md diff --git a/content/en/blog/2024/gc-election-results.md b/content/en/blog/2024/gc-election-results.md new file mode 100644 index 000000000000..fc102c1543e2 --- /dev/null +++ b/content/en/blog/2024/gc-election-results.md @@ -0,0 +1,32 @@ +--- +title: Announcing the 2024 Governance Committee Election Results +linkTitle: 2024 GC Election Results +date: 2024-10-24 +author: OpenTelemetry Governance Committee +cSpell:ignore: Baeyens +--- + +We are delighted to announce the results of the +[2024 OpenTelemetry Governance Committee Election](https://github.com/open-telemetry/community/blob/main/elections/2024/governance-committee-election.md)! + +The OpenTelemetry project continues to bring together an exceptionally vibrant +community, who are shaping the future of observability with their contributions. +This year, active contributors have shown their commitment again by +participating in our election process, and they've done it in great numbers. + +701 contributors were eligible to vote this year, and 299 of them cast their +ballot. This is a new record for the project! With a participation rate of 43%, +it represents a significant increase from the 2023 election, where 206 ballots +were cast with 616 eligible voters, proof of OpenTelemetry's healthy growth and +engagement. + +Four positions were up for election in this year's Governance Committee +selection process. Without further ado, please join us in congratulating +[Alolita Sharma](https://github.com/alolita), +[Morgan McLean](https://github.com/mtwo), +[Pablo Baeyens Fernández](https://github.com/mx-psi), and +[Trask Stalnaker](https://github.com/trask)! All will serve a two-year term. + +We'd like to thank everyone who participated -- candidates, voters, and the +election organizers -- for their efforts. You can find the +[full results of the election here](https://vote.heliosvoting.org/helios/elections/176e7ca8-647d-11ef-9b9a-2a30e2a223da/view). From d69454a163325d90dfd6ed741383ad136d248eb8 Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Thu, 24 Oct 2024 12:34:47 -0500 Subject: [PATCH 35/76] Auto-update registry versions (9eb493e61ff03a6fba8cb3cbffdb39a0b3770b5e) (#5472) Co-authored-by: Severin Neumann --- data/registry/collector-builder.yml | 2 +- data/registry/collector-exporter-alertmanager.yml | 2 +- data/registry/collector-exporter-alibaba-cloud-log-service.yml | 2 +- data/registry/collector-exporter-aws-xray.yml | 2 +- data/registry/collector-exporter-awscloudwatchlogs.yml | 2 +- data/registry/collector-exporter-awsemf.yml | 2 +- data/registry/collector-exporter-awss3.yml | 2 +- data/registry/collector-exporter-azure-monitor.yml | 2 +- data/registry/collector-exporter-azuredataexplorer.yml | 2 +- data/registry/collector-exporter-carbon.yml | 2 +- data/registry/collector-exporter-cassandra.yml | 2 +- data/registry/collector-exporter-clickhouse.yml | 2 +- data/registry/collector-exporter-coralogix.yml | 2 +- data/registry/collector-exporter-datadog.yml | 2 +- data/registry/collector-exporter-dataset.yml | 2 +- data/registry/collector-exporter-debug.yml | 2 +- data/registry/collector-exporter-elasticsearch.yml | 2 +- data/registry/collector-exporter-file.yml | 2 +- data/registry/collector-exporter-googlecloud.yml | 2 +- data/registry/collector-exporter-googlecloudpubsub.yml | 2 +- data/registry/collector-exporter-googlemanagedprometheus.yml | 2 +- data/registry/collector-exporter-honeycombmarker.yml | 2 +- data/registry/collector-exporter-influxdb.yml | 2 +- data/registry/collector-exporter-kafka.yml | 2 +- data/registry/collector-exporter-kinetica.yml | 2 +- data/registry/collector-exporter-load-balancing.yml | 2 +- data/registry/collector-exporter-logicmonitor.yml | 2 +- data/registry/collector-exporter-logzio.yml | 2 +- data/registry/collector-exporter-loki.yml | 2 +- data/registry/collector-exporter-mezmo.yml | 2 +- data/registry/collector-exporter-nop.yml | 2 +- data/registry/collector-exporter-opencensus.yml | 2 +- data/registry/collector-exporter-opensearch.yml | 2 +- data/registry/collector-exporter-otelarrow.yml | 2 +- data/registry/collector-exporter-otlp.yml | 2 +- data/registry/collector-exporter-prometheus-remote-write.yml | 2 +- data/registry/collector-exporter-prometheus.yml | 2 +- data/registry/collector-exporter-pulsar.yml | 2 +- data/registry/collector-exporter-rabbitmq.yml | 2 +- data/registry/collector-exporter-sapm.yml | 2 +- data/registry/collector-exporter-sentry.yml | 2 +- data/registry/collector-exporter-signalfx.yml | 2 +- data/registry/collector-exporter-splunk-hec.yml | 2 +- data/registry/collector-exporter-splunk-sapm.yml | 2 +- data/registry/collector-exporter-sumologic.yml | 2 +- data/registry/collector-exporter-syslog.yml | 2 +- data/registry/collector-exporter-tencentcloudlogservice.yml | 2 +- data/registry/collector-exporter-zipkin.yml | 2 +- data/registry/collector-extension-ack.yml | 2 +- data/registry/collector-extension-asapauth.yml | 2 +- data/registry/collector-extension-basicauth.yml | 2 +- data/registry/collector-extension-bearertokenauth.yml | 2 +- data/registry/collector-extension-encoding.yml | 2 +- data/registry/collector-extension-googleclientauth.yml | 2 +- data/registry/collector-extension-headerssetter.yml | 2 +- data/registry/collector-extension-healthcheck.yml | 2 +- data/registry/collector-extension-http-forwarder.yml | 2 +- data/registry/collector-extension-jaegerremotesampling.yml | 2 +- data/registry/collector-extension-memorylimiter.yml | 2 +- data/registry/collector-extension-oauth2clientauth.yml | 2 +- data/registry/collector-extension-oidcauth.yml | 2 +- data/registry/collector-extension-opamp.yml | 2 +- data/registry/collector-extension-pprof.yml | 2 +- data/registry/collector-extension-remotetap.yml | 2 +- data/registry/collector-extension-sigv4auth.yml | 2 +- data/registry/collector-extension-solarwindsapmsettings.yml | 2 +- data/registry/collector-extension-sumologic.yml | 2 +- data/registry/collector-processor-attributes.yml | 2 +- data/registry/collector-processor-batch.yml | 2 +- data/registry/collector-processor-cumulativetodelta.yml | 2 +- data/registry/collector-processor-deltatocumulative.yml | 2 +- data/registry/collector-processor-deltatorate.yml | 2 +- data/registry/collector-processor-filter.yml | 2 +- data/registry/collector-processor-group-by-trace.yml | 2 +- data/registry/collector-processor-groupbyattrs.yml | 2 +- data/registry/collector-processor-interval.yml | 2 +- data/registry/collector-processor-k8sattributes.yml | 2 +- data/registry/collector-processor-logstransform.yml | 2 +- data/registry/collector-processor-metrics-transform.yml | 2 +- data/registry/collector-processor-metricsgeneration.yml | 2 +- data/registry/collector-processor-probabilisticsampler.yml | 2 +- data/registry/collector-processor-redaction.yml | 2 +- data/registry/collector-processor-remotetap.yml | 2 +- data/registry/collector-processor-resource-detection.yml | 2 +- data/registry/collector-processor-resource.yml | 2 +- data/registry/collector-processor-routing.yml | 2 +- data/registry/collector-processor-schema.yml | 2 +- data/registry/collector-processor-span.yml | 2 +- data/registry/collector-processor-sumologic.yml | 2 +- data/registry/collector-processor-tail-sampling.yml | 2 +- data/registry/collector-processor-transform.yml | 2 +- data/registry/collector-receiver-activedirectoryds.yml | 2 +- data/registry/collector-receiver-aerospike.yml | 2 +- data/registry/collector-receiver-apache.yml | 2 +- data/registry/collector-receiver-apachespark.yml | 2 +- data/registry/collector-receiver-aws-ecs-container-metrics.yml | 2 +- data/registry/collector-receiver-aws-xray.yml | 2 +- data/registry/collector-receiver-awscloudwatch.yml | 2 +- data/registry/collector-receiver-awscloudwatchmetrics.yml | 2 +- data/registry/collector-receiver-awscontainerinsight.yml | 2 +- data/registry/collector-receiver-awsfirehose.yml | 2 +- data/registry/collector-receiver-awss3.yml | 2 +- data/registry/collector-receiver-azureblob.yml | 2 +- data/registry/collector-receiver-azureeventhub.yml | 2 +- data/registry/collector-receiver-azuremonitor.yml | 2 +- data/registry/collector-receiver-bigip.yml | 2 +- data/registry/collector-receiver-carbon.yml | 2 +- data/registry/collector-receiver-chrony.yml | 2 +- data/registry/collector-receiver-cloudflare.yml | 2 +- data/registry/collector-receiver-cloudfoundry.yml | 2 +- data/registry/collector-receiver-collectd.yml | 2 +- data/registry/collector-receiver-couchdb.yml | 2 +- data/registry/collector-receiver-datadog.yml | 2 +- data/registry/collector-receiver-docker-stats.yml | 2 +- data/registry/collector-receiver-elasticsearch.yml | 2 +- data/registry/collector-receiver-expvar.yml | 2 +- data/registry/collector-receiver-filelog.yml | 2 +- data/registry/collector-receiver-filestats.yml | 2 +- data/registry/collector-receiver-flinkmetrics.yml | 2 +- data/registry/collector-receiver-fluent-forward.yml | 2 +- data/registry/collector-receiver-googlecloudpubsub.yml | 2 +- data/registry/collector-receiver-googlecloudspanner.yml | 2 +- data/registry/collector-receiver-haproxy.yml | 2 +- data/registry/collector-receiver-host-metrics.yml | 2 +- data/registry/collector-receiver-httpcheck.yml | 2 +- data/registry/collector-receiver-iis.yml | 2 +- data/registry/collector-receiver-influxdb.yml | 2 +- data/registry/collector-receiver-jaeger.yml | 2 +- data/registry/collector-receiver-jmx.yml | 2 +- data/registry/collector-receiver-journald.yml | 2 +- data/registry/collector-receiver-k8s-cluster.yml | 2 +- data/registry/collector-receiver-k8sevents.yml | 2 +- data/registry/collector-receiver-k8sobjects.yml | 2 +- data/registry/collector-receiver-kafka.yml | 2 +- data/registry/collector-receiver-kafkametrics.yml | 2 +- data/registry/collector-receiver-kubelet-stats.yml | 2 +- data/registry/collector-receiver-loki.yml | 2 +- data/registry/collector-receiver-memcached.yml | 2 +- data/registry/collector-receiver-mongodb.yml | 2 +- data/registry/collector-receiver-mongodbatlas.yml | 2 +- data/registry/collector-receiver-mysql.yml | 2 +- data/registry/collector-receiver-namedpipe.yml | 2 +- data/registry/collector-receiver-nginx.yml | 2 +- data/registry/collector-receiver-nop.yml | 2 +- data/registry/collector-receiver-nsxt.yml | 2 +- data/registry/collector-receiver-opencensus.yml | 2 +- data/registry/collector-receiver-oracledb.yml | 2 +- data/registry/collector-receiver-osquery.yml | 2 +- data/registry/collector-receiver-otelarrow.yml | 2 +- data/registry/collector-receiver-otlp.yml | 2 +- data/registry/collector-receiver-otlpjsonfile.yml | 2 +- data/registry/collector-receiver-podman.yml | 2 +- data/registry/collector-receiver-postgresql.yml | 2 +- data/registry/collector-receiver-prometheus.yml | 2 +- data/registry/collector-receiver-pulsar.yml | 2 +- data/registry/collector-receiver-purefa.yml | 2 +- data/registry/collector-receiver-purefb.yml | 2 +- data/registry/collector-receiver-rabbitmq.yml | 2 +- data/registry/collector-receiver-receiver-creator.yml | 2 +- data/registry/collector-receiver-redis.yml | 2 +- data/registry/collector-receiver-riak.yml | 2 +- data/registry/collector-receiver-saphana.yml | 2 +- data/registry/collector-receiver-sapm.yml | 2 +- data/registry/collector-receiver-signalfx.yml | 2 +- data/registry/collector-receiver-simple-prometheus.yml | 2 +- data/registry/collector-receiver-skywalking.yml | 2 +- data/registry/collector-receiver-snmp.yml | 2 +- data/registry/collector-receiver-snowflake.yml | 2 +- data/registry/collector-receiver-solace.yml | 2 +- data/registry/collector-receiver-splunk-hec.yml | 2 +- data/registry/collector-receiver-splunkenterprise.yml | 2 +- data/registry/collector-receiver-sqlquery.yml | 2 +- data/registry/collector-receiver-sqlserver.yml | 2 +- data/registry/collector-receiver-sshcheck.yml | 2 +- data/registry/collector-receiver-statsd.yml | 2 +- data/registry/collector-receiver-syslog.yml | 2 +- data/registry/collector-receiver-tcplog.yml | 2 +- data/registry/collector-receiver-udplog.yml | 2 +- data/registry/collector-receiver-vcenter.yml | 2 +- data/registry/collector-receiver-wavefront.yml | 2 +- data/registry/collector-receiver-webhookevent.yml | 2 +- data/registry/collector-receiver-windows-perf-counters.yml | 2 +- data/registry/collector-receiver-windowseventlog.yml | 2 +- data/registry/collector-receiver-zipkin.yml | 2 +- data/registry/collector-receiver-zookeeper.yml | 2 +- data/registry/exporter-js-instana.yml | 2 +- data/registry/exporter-js-jaeger.yml | 2 +- data/registry/exporter-js-prometheus.yml | 2 +- data/registry/exporter-js-zipkin.yml | 2 +- data/registry/exporter-php-zipkin.yml | 2 +- data/registry/instrumentation-erlang-bandit.yml | 2 +- data/registry/instrumentation-js-fetch.yml | 2 +- data/registry/instrumentation-js-grpc.yml | 2 +- data/registry/instrumentation-js-http.yml | 2 +- data/registry/instrumentation-js-langchain.yml | 2 +- data/registry/instrumentation-js-openai.yml | 2 +- data/registry/instrumentation-js-pg.yml | 2 +- data/registry/instrumentation-js-postgres.yml | 2 +- data/registry/instrumentation-js-prisma.yml | 2 +- data/registry/instrumentation-js-xml-http-request.yml | 2 +- data/registry/instrumentation-php-guzzle.yml | 2 +- data/registry/instrumentation-php-pdo.yml | 2 +- data/registry/instrumentation-php-psr3.yml | 2 +- data/registry/instrumentation-php-symfony.yml | 2 +- data/registry/instrumentation-ruby-actionmailer.yml | 2 +- data/registry/instrumentation-ruby-active-record.yml | 2 +- data/registry/instrumentation-ruby-all.yml | 2 +- data/registry/instrumentation-ruby-rack.yml | 2 +- data/registry/instrumentation-ruby-rails.yml | 2 +- data/registry/resource-detector-js-container.yml | 2 +- 210 files changed, 210 insertions(+), 210 deletions(-) diff --git a/data/registry/collector-builder.yml b/data/registry/collector-builder.yml index c9c81e027c39..74ed5068a5ee 100644 --- a/data/registry/collector-builder.yml +++ b/data/registry/collector-builder.yml @@ -17,5 +17,5 @@ createdAt: 2023-12-18 package: registry: go name: go.opentelemetry.io/collector/cmd/builder - version: v0.111.0 + version: v0.112.0 quickInstall: false diff --git a/data/registry/collector-exporter-alertmanager.yml b/data/registry/collector-exporter-alertmanager.yml index ae2c432f146f..36ccc1f7da93 100644 --- a/data/registry/collector-exporter-alertmanager.yml +++ b/data/registry/collector-exporter-alertmanager.yml @@ -17,7 +17,7 @@ authors: package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alertmanagerexporter - version: v0.111.0 + version: v0.112.0 urls: repo: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/alertmanagerexporter createdAt: 2023-12-05 diff --git a/data/registry/collector-exporter-alibaba-cloud-log-service.yml b/data/registry/collector-exporter-alibaba-cloud-log-service.yml index ac71376cadc6..0b8f09ca9ebd 100644 --- a/data/registry/collector-exporter-alibaba-cloud-log-service.yml +++ b/data/registry/collector-exporter-alibaba-cloud-log-service.yml @@ -17,4 +17,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-aws-xray.yml b/data/registry/collector-exporter-aws-xray.yml index a2feab9bca71..9083d1dcb2f7 100644 --- a/data/registry/collector-exporter-aws-xray.yml +++ b/data/registry/collector-exporter-aws-xray.yml @@ -16,4 +16,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-awscloudwatchlogs.yml b/data/registry/collector-exporter-awscloudwatchlogs.yml index 3f79f7e6722d..9e5747570a6b 100644 --- a/data/registry/collector-exporter-awscloudwatchlogs.yml +++ b/data/registry/collector-exporter-awscloudwatchlogs.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-awsemf.yml b/data/registry/collector-exporter-awsemf.yml index 47b61ed4ad23..ccda4e2996f4 100644 --- a/data/registry/collector-exporter-awsemf.yml +++ b/data/registry/collector-exporter-awsemf.yml @@ -16,4 +16,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-awss3.yml b/data/registry/collector-exporter-awss3.yml index 2f989422d1d9..908bfeb0f60c 100644 --- a/data/registry/collector-exporter-awss3.yml +++ b/data/registry/collector-exporter-awss3.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-azure-monitor.yml b/data/registry/collector-exporter-azure-monitor.yml index 49550a386262..0cbd886a5332 100644 --- a/data/registry/collector-exporter-azure-monitor.yml +++ b/data/registry/collector-exporter-azure-monitor.yml @@ -16,4 +16,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-azuredataexplorer.yml b/data/registry/collector-exporter-azuredataexplorer.yml index 9a081f5196a7..18d72f6cefed 100644 --- a/data/registry/collector-exporter-azuredataexplorer.yml +++ b/data/registry/collector-exporter-azuredataexplorer.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-carbon.yml b/data/registry/collector-exporter-carbon.yml index 042407c41d91..f8f1f5c80cc6 100644 --- a/data/registry/collector-exporter-carbon.yml +++ b/data/registry/collector-exporter-carbon.yml @@ -16,4 +16,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-cassandra.yml b/data/registry/collector-exporter-cassandra.yml index 5e8f00a26578..c408ede1acba 100644 --- a/data/registry/collector-exporter-cassandra.yml +++ b/data/registry/collector-exporter-cassandra.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-clickhouse.yml b/data/registry/collector-exporter-clickhouse.yml index f320b3afc445..d65b87b5c705 100644 --- a/data/registry/collector-exporter-clickhouse.yml +++ b/data/registry/collector-exporter-clickhouse.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-coralogix.yml b/data/registry/collector-exporter-coralogix.yml index 226e10abb4bc..29b1d1f0ff33 100644 --- a/data/registry/collector-exporter-coralogix.yml +++ b/data/registry/collector-exporter-coralogix.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-datadog.yml b/data/registry/collector-exporter-datadog.yml index 817550f1f894..4e43127f2196 100644 --- a/data/registry/collector-exporter-datadog.yml +++ b/data/registry/collector-exporter-datadog.yml @@ -16,4 +16,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-dataset.yml b/data/registry/collector-exporter-dataset.yml index 6c17beea67d9..913dd41455da 100644 --- a/data/registry/collector-exporter-dataset.yml +++ b/data/registry/collector-exporter-dataset.yml @@ -16,4 +16,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-debug.yml b/data/registry/collector-exporter-debug.yml index 7740608d7d32..e3d30cad056f 100644 --- a/data/registry/collector-exporter-debug.yml +++ b/data/registry/collector-exporter-debug.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: go.opentelemetry.io/collector/exporter/debugexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-elasticsearch.yml b/data/registry/collector-exporter-elasticsearch.yml index c4d2d270c759..1a4344ef62f8 100644 --- a/data/registry/collector-exporter-elasticsearch.yml +++ b/data/registry/collector-exporter-elasticsearch.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-file.yml b/data/registry/collector-exporter-file.yml index 749fb5db1c92..9a13fab32f32 100644 --- a/data/registry/collector-exporter-file.yml +++ b/data/registry/collector-exporter-file.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-googlecloud.yml b/data/registry/collector-exporter-googlecloud.yml index 53ea9c150f72..0a680185ce2e 100644 --- a/data/registry/collector-exporter-googlecloud.yml +++ b/data/registry/collector-exporter-googlecloud.yml @@ -17,4 +17,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-googlecloudpubsub.yml b/data/registry/collector-exporter-googlecloudpubsub.yml index bd7f125cad72..14c9a8e13cbe 100644 --- a/data/registry/collector-exporter-googlecloudpubsub.yml +++ b/data/registry/collector-exporter-googlecloudpubsub.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-googlemanagedprometheus.yml b/data/registry/collector-exporter-googlemanagedprometheus.yml index ddac492527f6..1abc8034019b 100644 --- a/data/registry/collector-exporter-googlemanagedprometheus.yml +++ b/data/registry/collector-exporter-googlemanagedprometheus.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-27 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-honeycombmarker.yml b/data/registry/collector-exporter-honeycombmarker.yml index c807acf91d27..fd41cb0a54a9 100644 --- a/data/registry/collector-exporter-honeycombmarker.yml +++ b/data/registry/collector-exporter-honeycombmarker.yml @@ -18,4 +18,4 @@ createdAt: 2023-10-17 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/honeycombmarkerexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-influxdb.yml b/data/registry/collector-exporter-influxdb.yml index 901684ea8dd2..aff89782a21c 100644 --- a/data/registry/collector-exporter-influxdb.yml +++ b/data/registry/collector-exporter-influxdb.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-kafka.yml b/data/registry/collector-exporter-kafka.yml index b4c6e89c0ca6..8472b1c6f067 100644 --- a/data/registry/collector-exporter-kafka.yml +++ b/data/registry/collector-exporter-kafka.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-kinetica.yml b/data/registry/collector-exporter-kinetica.yml index c02de83bc378..1858476a6c4e 100644 --- a/data/registry/collector-exporter-kinetica.yml +++ b/data/registry/collector-exporter-kinetica.yml @@ -18,4 +18,4 @@ createdAt: 2023-09-19 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kineticaexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-load-balancing.yml b/data/registry/collector-exporter-load-balancing.yml index 0440f3b7b5c6..7f185a55f2d5 100644 --- a/data/registry/collector-exporter-load-balancing.yml +++ b/data/registry/collector-exporter-load-balancing.yml @@ -16,4 +16,4 @@ createdAt: 2020-10-22 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-logicmonitor.yml b/data/registry/collector-exporter-logicmonitor.yml index 52fe776cccb2..e1771775eddb 100644 --- a/data/registry/collector-exporter-logicmonitor.yml +++ b/data/registry/collector-exporter-logicmonitor.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-logzio.yml b/data/registry/collector-exporter-logzio.yml index 99afe36868ea..f6610b48c335 100644 --- a/data/registry/collector-exporter-logzio.yml +++ b/data/registry/collector-exporter-logzio.yml @@ -16,4 +16,4 @@ createdAt: 2020-10-22 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-loki.yml b/data/registry/collector-exporter-loki.yml index 3b9fdd69f41b..e08841990d9b 100644 --- a/data/registry/collector-exporter-loki.yml +++ b/data/registry/collector-exporter-loki.yml @@ -16,4 +16,4 @@ createdAt: 2020-10-22 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-mezmo.yml b/data/registry/collector-exporter-mezmo.yml index c8438b43d0bb..e1c298d3cd5d 100644 --- a/data/registry/collector-exporter-mezmo.yml +++ b/data/registry/collector-exporter-mezmo.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-nop.yml b/data/registry/collector-exporter-nop.yml index 01ab07f95980..8f56e0dc6b7f 100644 --- a/data/registry/collector-exporter-nop.yml +++ b/data/registry/collector-exporter-nop.yml @@ -19,4 +19,4 @@ createdAt: 2024-04-18 package: registry: go-collector name: go.opentelemetry.io/collector/exporter/nopexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-opencensus.yml b/data/registry/collector-exporter-opencensus.yml index f699e3ad26e0..0f5ecf59750c 100644 --- a/data/registry/collector-exporter-opencensus.yml +++ b/data/registry/collector-exporter-opencensus.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-opensearch.yml b/data/registry/collector-exporter-opensearch.yml index 6440004ba83b..8ae7a49398c5 100644 --- a/data/registry/collector-exporter-opensearch.yml +++ b/data/registry/collector-exporter-opensearch.yml @@ -18,4 +18,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-otelarrow.yml b/data/registry/collector-exporter-otelarrow.yml index 5b9b431e8ede..a689190ad230 100644 --- a/data/registry/collector-exporter-otelarrow.yml +++ b/data/registry/collector-exporter-otelarrow.yml @@ -21,4 +21,4 @@ createdAt: 2024-02-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-otlp.yml b/data/registry/collector-exporter-otlp.yml index 1b9210c18429..61b4edbf5ee5 100644 --- a/data/registry/collector-exporter-otlp.yml +++ b/data/registry/collector-exporter-otlp.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: go.opentelemetry.io/collector/exporter/otlpexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-prometheus-remote-write.yml b/data/registry/collector-exporter-prometheus-remote-write.yml index cf28aa979b27..a3422d67796b 100644 --- a/data/registry/collector-exporter-prometheus-remote-write.yml +++ b/data/registry/collector-exporter-prometheus-remote-write.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-prometheus.yml b/data/registry/collector-exporter-prometheus.yml index 219c41539ff7..9aa74c50a20e 100644 --- a/data/registry/collector-exporter-prometheus.yml +++ b/data/registry/collector-exporter-prometheus.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-pulsar.yml b/data/registry/collector-exporter-pulsar.yml index bee759d92527..8e82743fc999 100644 --- a/data/registry/collector-exporter-pulsar.yml +++ b/data/registry/collector-exporter-pulsar.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-27 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-rabbitmq.yml b/data/registry/collector-exporter-rabbitmq.yml index a4ca904b03b0..890818d7add6 100644 --- a/data/registry/collector-exporter-rabbitmq.yml +++ b/data/registry/collector-exporter-rabbitmq.yml @@ -17,4 +17,4 @@ createdAt: 2024-04-18 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/rabbitmqexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-sapm.yml b/data/registry/collector-exporter-sapm.yml index d7b46d691baf..be05021e3716 100644 --- a/data/registry/collector-exporter-sapm.yml +++ b/data/registry/collector-exporter-sapm.yml @@ -18,4 +18,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-sentry.yml b/data/registry/collector-exporter-sentry.yml index 9b85fc0d53f1..e49fe991b66f 100644 --- a/data/registry/collector-exporter-sentry.yml +++ b/data/registry/collector-exporter-sentry.yml @@ -16,4 +16,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-signalfx.yml b/data/registry/collector-exporter-signalfx.yml index 7d747a790dc0..dae8c9b3e00a 100644 --- a/data/registry/collector-exporter-signalfx.yml +++ b/data/registry/collector-exporter-signalfx.yml @@ -16,4 +16,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-splunk-hec.yml b/data/registry/collector-exporter-splunk-hec.yml index d6b0a9ba8d9b..df1614136b23 100644 --- a/data/registry/collector-exporter-splunk-hec.yml +++ b/data/registry/collector-exporter-splunk-hec.yml @@ -18,4 +18,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-splunk-sapm.yml b/data/registry/collector-exporter-splunk-sapm.yml index e1716575422b..1a4eca68c2d1 100644 --- a/data/registry/collector-exporter-splunk-sapm.yml +++ b/data/registry/collector-exporter-splunk-sapm.yml @@ -16,4 +16,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-sumologic.yml b/data/registry/collector-exporter-sumologic.yml index b56ef54ca089..9fe46157699d 100644 --- a/data/registry/collector-exporter-sumologic.yml +++ b/data/registry/collector-exporter-sumologic.yml @@ -16,4 +16,4 @@ createdAt: 2020-10-22 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-syslog.yml b/data/registry/collector-exporter-syslog.yml index 6e3c9247509f..b2f4a01a6aca 100644 --- a/data/registry/collector-exporter-syslog.yml +++ b/data/registry/collector-exporter-syslog.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-tencentcloudlogservice.yml b/data/registry/collector-exporter-tencentcloudlogservice.yml index f7b58670a207..0fde1d071bb2 100644 --- a/data/registry/collector-exporter-tencentcloudlogservice.yml +++ b/data/registry/collector-exporter-tencentcloudlogservice.yml @@ -17,4 +17,4 @@ createdAt: 2022-10-27 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-exporter-zipkin.yml b/data/registry/collector-exporter-zipkin.yml index ce247c50f500..0f980d9da374 100644 --- a/data/registry/collector-exporter-zipkin.yml +++ b/data/registry/collector-exporter-zipkin.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-ack.yml b/data/registry/collector-extension-ack.yml index f1215414f353..163e7c3e738d 100644 --- a/data/registry/collector-extension-ack.yml +++ b/data/registry/collector-extension-ack.yml @@ -18,4 +18,4 @@ createdAt: 2024-04-18 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-asapauth.yml b/data/registry/collector-extension-asapauth.yml index d916820aef68..e7e3e5fbc66c 100644 --- a/data/registry/collector-extension-asapauth.yml +++ b/data/registry/collector-extension-asapauth.yml @@ -19,4 +19,4 @@ createdAt: 2022-11-07 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-basicauth.yml b/data/registry/collector-extension-basicauth.yml index 3d429868e820..c24a476ca289 100644 --- a/data/registry/collector-extension-basicauth.yml +++ b/data/registry/collector-extension-basicauth.yml @@ -19,4 +19,4 @@ createdAt: 2022-11-07 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-bearertokenauth.yml b/data/registry/collector-extension-bearertokenauth.yml index a7f5a9634929..637355eefcae 100644 --- a/data/registry/collector-extension-bearertokenauth.yml +++ b/data/registry/collector-extension-bearertokenauth.yml @@ -18,4 +18,4 @@ createdAt: 2021-06-22 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-encoding.yml b/data/registry/collector-extension-encoding.yml index 0541d2832406..a157816b81d4 100644 --- a/data/registry/collector-extension-encoding.yml +++ b/data/registry/collector-extension-encoding.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-googleclientauth.yml b/data/registry/collector-extension-googleclientauth.yml index 62fe4c947530..ba3a8d7c7494 100644 --- a/data/registry/collector-extension-googleclientauth.yml +++ b/data/registry/collector-extension-googleclientauth.yml @@ -20,4 +20,4 @@ createdAt: 2024-04-18 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-headerssetter.yml b/data/registry/collector-extension-headerssetter.yml index 2a9f28ebd2ad..b86ba2d67a2a 100644 --- a/data/registry/collector-extension-headerssetter.yml +++ b/data/registry/collector-extension-headerssetter.yml @@ -20,4 +20,4 @@ createdAt: 2022-11-07 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-healthcheck.yml b/data/registry/collector-extension-healthcheck.yml index b301a34fee73..da8c59b58b86 100644 --- a/data/registry/collector-extension-healthcheck.yml +++ b/data/registry/collector-extension-healthcheck.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-http-forwarder.yml b/data/registry/collector-extension-http-forwarder.yml index d526093dfe7a..62402340bbc3 100644 --- a/data/registry/collector-extension-http-forwarder.yml +++ b/data/registry/collector-extension-http-forwarder.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-jaegerremotesampling.yml b/data/registry/collector-extension-jaegerremotesampling.yml index 8b02399ae886..303ad2095aa9 100644 --- a/data/registry/collector-extension-jaegerremotesampling.yml +++ b/data/registry/collector-extension-jaegerremotesampling.yml @@ -19,4 +19,4 @@ createdAt: 2022-11-07 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-memorylimiter.yml b/data/registry/collector-extension-memorylimiter.yml index 6f0c38e2b24a..3d8748d3f8be 100644 --- a/data/registry/collector-extension-memorylimiter.yml +++ b/data/registry/collector-extension-memorylimiter.yml @@ -18,4 +18,4 @@ createdAt: 2024-04-18 package: registry: go-collector name: go.opentelemetry.io/collector/extension/memorylimiterextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-oauth2clientauth.yml b/data/registry/collector-extension-oauth2clientauth.yml index e090bafb91b0..e30d4ff5e78e 100644 --- a/data/registry/collector-extension-oauth2clientauth.yml +++ b/data/registry/collector-extension-oauth2clientauth.yml @@ -18,4 +18,4 @@ createdAt: 2021-06-22 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-oidcauth.yml b/data/registry/collector-extension-oidcauth.yml index eaf2697890f8..49cad0d8dc88 100644 --- a/data/registry/collector-extension-oidcauth.yml +++ b/data/registry/collector-extension-oidcauth.yml @@ -19,4 +19,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-opamp.yml b/data/registry/collector-extension-opamp.yml index 48d10d38632d..3ded8d5d841a 100644 --- a/data/registry/collector-extension-opamp.yml +++ b/data/registry/collector-extension-opamp.yml @@ -16,4 +16,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-pprof.yml b/data/registry/collector-extension-pprof.yml index c12b4e3b5d4b..4d389b8e99bf 100644 --- a/data/registry/collector-extension-pprof.yml +++ b/data/registry/collector-extension-pprof.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-remotetap.yml b/data/registry/collector-extension-remotetap.yml index a46c52591a8a..fb3747534d6b 100644 --- a/data/registry/collector-extension-remotetap.yml +++ b/data/registry/collector-extension-remotetap.yml @@ -19,4 +19,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/remotetapextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-sigv4auth.yml b/data/registry/collector-extension-sigv4auth.yml index b4d40febb9e5..787638b91025 100644 --- a/data/registry/collector-extension-sigv4auth.yml +++ b/data/registry/collector-extension-sigv4auth.yml @@ -19,4 +19,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-solarwindsapmsettings.yml b/data/registry/collector-extension-solarwindsapmsettings.yml index 18bee2aa1abf..434c86e59984 100644 --- a/data/registry/collector-extension-solarwindsapmsettings.yml +++ b/data/registry/collector-extension-solarwindsapmsettings.yml @@ -21,4 +21,4 @@ createdAt: 2024-02-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-extension-sumologic.yml b/data/registry/collector-extension-sumologic.yml index a78646e3f11d..7afd15944aed 100644 --- a/data/registry/collector-extension-sumologic.yml +++ b/data/registry/collector-extension-sumologic.yml @@ -18,4 +18,4 @@ createdAt: 2024-04-18 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-attributes.yml b/data/registry/collector-processor-attributes.yml index 78fffd31d57c..83e574933c06 100644 --- a/data/registry/collector-processor-attributes.yml +++ b/data/registry/collector-processor-attributes.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-batch.yml b/data/registry/collector-processor-batch.yml index 6de9e7dc995c..0da9d6f66529 100644 --- a/data/registry/collector-processor-batch.yml +++ b/data/registry/collector-processor-batch.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: go.opentelemetry.io/collector/processor/batchprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-cumulativetodelta.yml b/data/registry/collector-processor-cumulativetodelta.yml index 8b5d6512ccdd..9cdf9eeb9676 100644 --- a/data/registry/collector-processor-cumulativetodelta.yml +++ b/data/registry/collector-processor-cumulativetodelta.yml @@ -19,4 +19,4 @@ createdAt: 2022-10-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-deltatocumulative.yml b/data/registry/collector-processor-deltatocumulative.yml index 27c7bcf6249a..2162568c6d59 100644 --- a/data/registry/collector-processor-deltatocumulative.yml +++ b/data/registry/collector-processor-deltatocumulative.yml @@ -19,4 +19,4 @@ createdAt: 2024-02-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-deltatorate.yml b/data/registry/collector-processor-deltatorate.yml index 616af282915c..4b5e6f8caad5 100644 --- a/data/registry/collector-processor-deltatorate.yml +++ b/data/registry/collector-processor-deltatorate.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-filter.yml b/data/registry/collector-processor-filter.yml index 7c5e6a4bfe34..538050032285 100644 --- a/data/registry/collector-processor-filter.yml +++ b/data/registry/collector-processor-filter.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-group-by-trace.yml b/data/registry/collector-processor-group-by-trace.yml index 0ef7b8a12191..05b4b2b8af3c 100644 --- a/data/registry/collector-processor-group-by-trace.yml +++ b/data/registry/collector-processor-group-by-trace.yml @@ -19,4 +19,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-groupbyattrs.yml b/data/registry/collector-processor-groupbyattrs.yml index ce2830ace087..3c51c92a02e8 100644 --- a/data/registry/collector-processor-groupbyattrs.yml +++ b/data/registry/collector-processor-groupbyattrs.yml @@ -20,4 +20,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-interval.yml b/data/registry/collector-processor-interval.yml index 20396c618a40..c6641571c838 100644 --- a/data/registry/collector-processor-interval.yml +++ b/data/registry/collector-processor-interval.yml @@ -18,4 +18,4 @@ createdAt: 2024-02-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/intervalprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-k8sattributes.yml b/data/registry/collector-processor-k8sattributes.yml index a13976e38952..db7bbd27e4e3 100644 --- a/data/registry/collector-processor-k8sattributes.yml +++ b/data/registry/collector-processor-k8sattributes.yml @@ -19,4 +19,4 @@ createdAt: 2022-03-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-logstransform.yml b/data/registry/collector-processor-logstransform.yml index c8b87b7ee19d..3afda4cfe641 100644 --- a/data/registry/collector-processor-logstransform.yml +++ b/data/registry/collector-processor-logstransform.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/logstransformprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-metrics-transform.yml b/data/registry/collector-processor-metrics-transform.yml index 826d15eedc00..2864a67b1727 100644 --- a/data/registry/collector-processor-metrics-transform.yml +++ b/data/registry/collector-processor-metrics-transform.yml @@ -19,4 +19,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-metricsgeneration.yml b/data/registry/collector-processor-metricsgeneration.yml index 45b086d31afb..496bcd65860e 100644 --- a/data/registry/collector-processor-metricsgeneration.yml +++ b/data/registry/collector-processor-metricsgeneration.yml @@ -19,4 +19,4 @@ createdAt: 2022-10-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-probabilisticsampler.yml b/data/registry/collector-processor-probabilisticsampler.yml index 1fd003f0a929..b7693a5f94e1 100644 --- a/data/registry/collector-processor-probabilisticsampler.yml +++ b/data/registry/collector-processor-probabilisticsampler.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-redaction.yml b/data/registry/collector-processor-redaction.yml index 5e09741bd81b..e2c22d821ce5 100644 --- a/data/registry/collector-processor-redaction.yml +++ b/data/registry/collector-processor-redaction.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-remotetap.yml b/data/registry/collector-processor-remotetap.yml index e888c5febba0..3b711ece3cda 100644 --- a/data/registry/collector-processor-remotetap.yml +++ b/data/registry/collector-processor-remotetap.yml @@ -20,4 +20,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-resource-detection.yml b/data/registry/collector-processor-resource-detection.yml index eddf6aebfc46..5b6b1c588249 100644 --- a/data/registry/collector-processor-resource-detection.yml +++ b/data/registry/collector-processor-resource-detection.yml @@ -20,4 +20,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-resource.yml b/data/registry/collector-processor-resource.yml index f726e0619b13..c1c5526b9dbb 100644 --- a/data/registry/collector-processor-resource.yml +++ b/data/registry/collector-processor-resource.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-routing.yml b/data/registry/collector-processor-routing.yml index a5cd4ccb5cc3..4370b19dd085 100644 --- a/data/registry/collector-processor-routing.yml +++ b/data/registry/collector-processor-routing.yml @@ -19,4 +19,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-schema.yml b/data/registry/collector-processor-schema.yml index e397a57d2b96..1bc1ef05d7e7 100644 --- a/data/registry/collector-processor-schema.yml +++ b/data/registry/collector-processor-schema.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/schemaprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-span.yml b/data/registry/collector-processor-span.yml index 93c8c9e1d0db..94071902af53 100644 --- a/data/registry/collector-processor-span.yml +++ b/data/registry/collector-processor-span.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-sumologic.yml b/data/registry/collector-processor-sumologic.yml index 393dfa71166c..5bf683ac4aef 100644 --- a/data/registry/collector-processor-sumologic.yml +++ b/data/registry/collector-processor-sumologic.yml @@ -20,4 +20,4 @@ createdAt: 2023-12-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/sumologicprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-tail-sampling.yml b/data/registry/collector-processor-tail-sampling.yml index a65119aeed76..f15d0f59307f 100644 --- a/data/registry/collector-processor-tail-sampling.yml +++ b/data/registry/collector-processor-tail-sampling.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-24 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-processor-transform.yml b/data/registry/collector-processor-transform.yml index ace9b7ce518a..fdc4e376d2cb 100644 --- a/data/registry/collector-processor-transform.yml +++ b/data/registry/collector-processor-transform.yml @@ -20,4 +20,4 @@ createdAt: 2022-10-11 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-activedirectoryds.yml b/data/registry/collector-receiver-activedirectoryds.yml index 850e1715090b..60476a16f2b5 100644 --- a/data/registry/collector-receiver-activedirectoryds.yml +++ b/data/registry/collector-receiver-activedirectoryds.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-aerospike.yml b/data/registry/collector-receiver-aerospike.yml index fb9758ace993..4a3d69a1d281 100644 --- a/data/registry/collector-receiver-aerospike.yml +++ b/data/registry/collector-receiver-aerospike.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-apache.yml b/data/registry/collector-receiver-apache.yml index 754e5ef25654..cf7d74fc9bf2 100644 --- a/data/registry/collector-receiver-apache.yml +++ b/data/registry/collector-receiver-apache.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-apachespark.yml b/data/registry/collector-receiver-apachespark.yml index 43bc6655e407..3b1dc4b890d4 100644 --- a/data/registry/collector-receiver-apachespark.yml +++ b/data/registry/collector-receiver-apachespark.yml @@ -19,4 +19,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-aws-ecs-container-metrics.yml b/data/registry/collector-receiver-aws-ecs-container-metrics.yml index 139ed58351cd..252cc54da0e8 100644 --- a/data/registry/collector-receiver-aws-ecs-container-metrics.yml +++ b/data/registry/collector-receiver-aws-ecs-container-metrics.yml @@ -20,4 +20,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-aws-xray.yml b/data/registry/collector-receiver-aws-xray.yml index 3db37f674b51..6fcfc04e395b 100644 --- a/data/registry/collector-receiver-aws-xray.yml +++ b/data/registry/collector-receiver-aws-xray.yml @@ -19,4 +19,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-awscloudwatch.yml b/data/registry/collector-receiver-awscloudwatch.yml index f1d7b1b2ca0f..5c8d3f339ea4 100644 --- a/data/registry/collector-receiver-awscloudwatch.yml +++ b/data/registry/collector-receiver-awscloudwatch.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-awscloudwatchmetrics.yml b/data/registry/collector-receiver-awscloudwatchmetrics.yml index 09d71277f5a0..820111809c86 100644 --- a/data/registry/collector-receiver-awscloudwatchmetrics.yml +++ b/data/registry/collector-receiver-awscloudwatchmetrics.yml @@ -20,4 +20,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchmetricsreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-awscontainerinsight.yml b/data/registry/collector-receiver-awscontainerinsight.yml index 84b803fb1417..b8916612fc04 100644 --- a/data/registry/collector-receiver-awscontainerinsight.yml +++ b/data/registry/collector-receiver-awscontainerinsight.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-awsfirehose.yml b/data/registry/collector-receiver-awsfirehose.yml index 98b031cebde8..b7e73df2add3 100644 --- a/data/registry/collector-receiver-awsfirehose.yml +++ b/data/registry/collector-receiver-awsfirehose.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsfirehosereceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-awss3.yml b/data/registry/collector-receiver-awss3.yml index 9838b8d3800b..fbebf3b49c7c 100644 --- a/data/registry/collector-receiver-awss3.yml +++ b/data/registry/collector-receiver-awss3.yml @@ -18,4 +18,4 @@ createdAt: 2024-04-18 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awss3receiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-azureblob.yml b/data/registry/collector-receiver-azureblob.yml index 718542c6b047..598767a5fed4 100644 --- a/data/registry/collector-receiver-azureblob.yml +++ b/data/registry/collector-receiver-azureblob.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-azureeventhub.yml b/data/registry/collector-receiver-azureeventhub.yml index 15f7cdbf9e37..e3926f126f42 100644 --- a/data/registry/collector-receiver-azureeventhub.yml +++ b/data/registry/collector-receiver-azureeventhub.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-azuremonitor.yml b/data/registry/collector-receiver-azuremonitor.yml index 35b94d3b603d..a18d1fb51e63 100644 --- a/data/registry/collector-receiver-azuremonitor.yml +++ b/data/registry/collector-receiver-azuremonitor.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-bigip.yml b/data/registry/collector-receiver-bigip.yml index 7691e128c4f3..088a098a39f7 100644 --- a/data/registry/collector-receiver-bigip.yml +++ b/data/registry/collector-receiver-bigip.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-carbon.yml b/data/registry/collector-receiver-carbon.yml index 4f2ef51e0f64..11390bcac93d 100644 --- a/data/registry/collector-receiver-carbon.yml +++ b/data/registry/collector-receiver-carbon.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-chrony.yml b/data/registry/collector-receiver-chrony.yml index 59d643b9bdbb..4bcdf3d4f63f 100644 --- a/data/registry/collector-receiver-chrony.yml +++ b/data/registry/collector-receiver-chrony.yml @@ -18,4 +18,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-cloudflare.yml b/data/registry/collector-receiver-cloudflare.yml index 92dad9897427..66de3a78106a 100644 --- a/data/registry/collector-receiver-cloudflare.yml +++ b/data/registry/collector-receiver-cloudflare.yml @@ -18,4 +18,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudflarereceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-cloudfoundry.yml b/data/registry/collector-receiver-cloudfoundry.yml index 7585f8eb239c..d48fc2a94205 100644 --- a/data/registry/collector-receiver-cloudfoundry.yml +++ b/data/registry/collector-receiver-cloudfoundry.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-collectd.yml b/data/registry/collector-receiver-collectd.yml index 83097cea40cb..6fee85dadabb 100644 --- a/data/registry/collector-receiver-collectd.yml +++ b/data/registry/collector-receiver-collectd.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/collectdreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-couchdb.yml b/data/registry/collector-receiver-couchdb.yml index 9a46c7ec949a..86aa292064db 100644 --- a/data/registry/collector-receiver-couchdb.yml +++ b/data/registry/collector-receiver-couchdb.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-datadog.yml b/data/registry/collector-receiver-datadog.yml index 232c7ac322f4..ee1d12acb70d 100644 --- a/data/registry/collector-receiver-datadog.yml +++ b/data/registry/collector-receiver-datadog.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-docker-stats.yml b/data/registry/collector-receiver-docker-stats.yml index aa136c245121..dfd8d7146345 100644 --- a/data/registry/collector-receiver-docker-stats.yml +++ b/data/registry/collector-receiver-docker-stats.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-elasticsearch.yml b/data/registry/collector-receiver-elasticsearch.yml index a4f40fecaf85..87df5f2abf1e 100644 --- a/data/registry/collector-receiver-elasticsearch.yml +++ b/data/registry/collector-receiver-elasticsearch.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-expvar.yml b/data/registry/collector-receiver-expvar.yml index 0eef6dd72820..fb6ab3a07a49 100644 --- a/data/registry/collector-receiver-expvar.yml +++ b/data/registry/collector-receiver-expvar.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-filelog.yml b/data/registry/collector-receiver-filelog.yml index 5b153718bf4e..1b76ddd83687 100644 --- a/data/registry/collector-receiver-filelog.yml +++ b/data/registry/collector-receiver-filelog.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-filestats.yml b/data/registry/collector-receiver-filestats.yml index 485d15b1af9d..dc18a66aab5f 100644 --- a/data/registry/collector-receiver-filestats.yml +++ b/data/registry/collector-receiver-filestats.yml @@ -18,4 +18,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filestatsreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-flinkmetrics.yml b/data/registry/collector-receiver-flinkmetrics.yml index aca58b0d674d..5a2271e74d5f 100644 --- a/data/registry/collector-receiver-flinkmetrics.yml +++ b/data/registry/collector-receiver-flinkmetrics.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-fluent-forward.yml b/data/registry/collector-receiver-fluent-forward.yml index 51e3e95b1f4e..9513fcd72f9d 100644 --- a/data/registry/collector-receiver-fluent-forward.yml +++ b/data/registry/collector-receiver-fluent-forward.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-googlecloudpubsub.yml b/data/registry/collector-receiver-googlecloudpubsub.yml index 7d9197b6320f..5e42e6b45db1 100644 --- a/data/registry/collector-receiver-googlecloudpubsub.yml +++ b/data/registry/collector-receiver-googlecloudpubsub.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-googlecloudspanner.yml b/data/registry/collector-receiver-googlecloudspanner.yml index 362cf104b623..87e81386f9b5 100644 --- a/data/registry/collector-receiver-googlecloudspanner.yml +++ b/data/registry/collector-receiver-googlecloudspanner.yml @@ -17,4 +17,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudspannerreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-haproxy.yml b/data/registry/collector-receiver-haproxy.yml index d9472371c1da..9663cc470b0b 100644 --- a/data/registry/collector-receiver-haproxy.yml +++ b/data/registry/collector-receiver-haproxy.yml @@ -18,4 +18,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-host-metrics.yml b/data/registry/collector-receiver-host-metrics.yml index 06f50c8c13a4..2df519f747a9 100644 --- a/data/registry/collector-receiver-host-metrics.yml +++ b/data/registry/collector-receiver-host-metrics.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-httpcheck.yml b/data/registry/collector-receiver-httpcheck.yml index 898b8fbccee4..c187868b83ce 100644 --- a/data/registry/collector-receiver-httpcheck.yml +++ b/data/registry/collector-receiver-httpcheck.yml @@ -19,4 +19,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-iis.yml b/data/registry/collector-receiver-iis.yml index 95c6061e57bf..dc3a83a72569 100644 --- a/data/registry/collector-receiver-iis.yml +++ b/data/registry/collector-receiver-iis.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-influxdb.yml b/data/registry/collector-receiver-influxdb.yml index 037b52e2eaf4..fe870b2df4f3 100644 --- a/data/registry/collector-receiver-influxdb.yml +++ b/data/registry/collector-receiver-influxdb.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/influxdbreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-jaeger.yml b/data/registry/collector-receiver-jaeger.yml index 1f8ebe551b9d..dc1341d72dcd 100644 --- a/data/registry/collector-receiver-jaeger.yml +++ b/data/registry/collector-receiver-jaeger.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-jmx.yml b/data/registry/collector-receiver-jmx.yml index eeffca363275..3f38179f5c04 100644 --- a/data/registry/collector-receiver-jmx.yml +++ b/data/registry/collector-receiver-jmx.yml @@ -19,4 +19,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-journald.yml b/data/registry/collector-receiver-journald.yml index 745bc0c3c8e8..830b020fe4ad 100644 --- a/data/registry/collector-receiver-journald.yml +++ b/data/registry/collector-receiver-journald.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/journaldreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-k8s-cluster.yml b/data/registry/collector-receiver-k8s-cluster.yml index 1e62b5feeed1..d1c9aa18a0f5 100644 --- a/data/registry/collector-receiver-k8s-cluster.yml +++ b/data/registry/collector-receiver-k8s-cluster.yml @@ -20,4 +20,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-k8sevents.yml b/data/registry/collector-receiver-k8sevents.yml index 729ce58344a1..c0304af7793f 100644 --- a/data/registry/collector-receiver-k8sevents.yml +++ b/data/registry/collector-receiver-k8sevents.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-k8sobjects.yml b/data/registry/collector-receiver-k8sobjects.yml index c6dfb6d8851b..8188cd23afec 100644 --- a/data/registry/collector-receiver-k8sobjects.yml +++ b/data/registry/collector-receiver-k8sobjects.yml @@ -18,4 +18,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-kafka.yml b/data/registry/collector-receiver-kafka.yml index 80b19ccd8d83..df73f25b1f62 100644 --- a/data/registry/collector-receiver-kafka.yml +++ b/data/registry/collector-receiver-kafka.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-kafkametrics.yml b/data/registry/collector-receiver-kafkametrics.yml index f171dc3d1dcc..b41772933a77 100644 --- a/data/registry/collector-receiver-kafkametrics.yml +++ b/data/registry/collector-receiver-kafkametrics.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-kubelet-stats.yml b/data/registry/collector-receiver-kubelet-stats.yml index 57b36bbffabf..09f56b69ef68 100644 --- a/data/registry/collector-receiver-kubelet-stats.yml +++ b/data/registry/collector-receiver-kubelet-stats.yml @@ -19,4 +19,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-loki.yml b/data/registry/collector-receiver-loki.yml index eb5c1895ef33..f672fc78c90c 100644 --- a/data/registry/collector-receiver-loki.yml +++ b/data/registry/collector-receiver-loki.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-memcached.yml b/data/registry/collector-receiver-memcached.yml index 730aec7928b9..bbdd4759fd2b 100644 --- a/data/registry/collector-receiver-memcached.yml +++ b/data/registry/collector-receiver-memcached.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-mongodb.yml b/data/registry/collector-receiver-mongodb.yml index 8c8543d139ba..5501a74e78aa 100644 --- a/data/registry/collector-receiver-mongodb.yml +++ b/data/registry/collector-receiver-mongodb.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-mongodbatlas.yml b/data/registry/collector-receiver-mongodbatlas.yml index 5e397f9011e1..d49cbf1afa6a 100644 --- a/data/registry/collector-receiver-mongodbatlas.yml +++ b/data/registry/collector-receiver-mongodbatlas.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-mysql.yml b/data/registry/collector-receiver-mysql.yml index 0c5c82e71cf1..93d9ea65e6bd 100644 --- a/data/registry/collector-receiver-mysql.yml +++ b/data/registry/collector-receiver-mysql.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-namedpipe.yml b/data/registry/collector-receiver-namedpipe.yml index 6f3f79320f40..0dc1ef99da21 100644 --- a/data/registry/collector-receiver-namedpipe.yml +++ b/data/registry/collector-receiver-namedpipe.yml @@ -18,4 +18,4 @@ createdAt: 2024-01-19 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/namedpipereceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-nginx.yml b/data/registry/collector-receiver-nginx.yml index efa2df89eb98..1b528fadfaec 100644 --- a/data/registry/collector-receiver-nginx.yml +++ b/data/registry/collector-receiver-nginx.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-nop.yml b/data/registry/collector-receiver-nop.yml index d251aed4a172..946d3d603967 100644 --- a/data/registry/collector-receiver-nop.yml +++ b/data/registry/collector-receiver-nop.yml @@ -18,4 +18,4 @@ createdAt: 2024-04-18 package: registry: go-collector name: go.opentelemetry.io/collector/receiver/nopreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-nsxt.yml b/data/registry/collector-receiver-nsxt.yml index 9d652215fb8e..14b586e7751e 100644 --- a/data/registry/collector-receiver-nsxt.yml +++ b/data/registry/collector-receiver-nsxt.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-opencensus.yml b/data/registry/collector-receiver-opencensus.yml index e32dbb9a6cb8..e85fafe3b7e4 100644 --- a/data/registry/collector-receiver-opencensus.yml +++ b/data/registry/collector-receiver-opencensus.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-oracledb.yml b/data/registry/collector-receiver-oracledb.yml index 0fc2404b1b91..6766249e1ac5 100644 --- a/data/registry/collector-receiver-oracledb.yml +++ b/data/registry/collector-receiver-oracledb.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-osquery.yml b/data/registry/collector-receiver-osquery.yml index ebb1c30622d9..99ca334e7fe1 100644 --- a/data/registry/collector-receiver-osquery.yml +++ b/data/registry/collector-receiver-osquery.yml @@ -18,4 +18,4 @@ createdAt: 2024-01-19 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/osqueryreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-otelarrow.yml b/data/registry/collector-receiver-otelarrow.yml index ff2314a0c6e5..68826d62eaec 100644 --- a/data/registry/collector-receiver-otelarrow.yml +++ b/data/registry/collector-receiver-otelarrow.yml @@ -18,4 +18,4 @@ createdAt: 2024-04-18 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otelarrowreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-otlp.yml b/data/registry/collector-receiver-otlp.yml index 857555351f12..44b11f08a500 100644 --- a/data/registry/collector-receiver-otlp.yml +++ b/data/registry/collector-receiver-otlp.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: go.opentelemetry.io/collector/receiver/otlpreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-otlpjsonfile.yml b/data/registry/collector-receiver-otlpjsonfile.yml index 08afb9546407..b5352dd0a212 100644 --- a/data/registry/collector-receiver-otlpjsonfile.yml +++ b/data/registry/collector-receiver-otlpjsonfile.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-podman.yml b/data/registry/collector-receiver-podman.yml index 40bc951d7c2e..a068e0ff37d9 100644 --- a/data/registry/collector-receiver-podman.yml +++ b/data/registry/collector-receiver-podman.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-postgresql.yml b/data/registry/collector-receiver-postgresql.yml index 9a24f4e8901c..adff17dc4da4 100644 --- a/data/registry/collector-receiver-postgresql.yml +++ b/data/registry/collector-receiver-postgresql.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-prometheus.yml b/data/registry/collector-receiver-prometheus.yml index 2ace9afcdaeb..c0fe526604c6 100644 --- a/data/registry/collector-receiver-prometheus.yml +++ b/data/registry/collector-receiver-prometheus.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-pulsar.yml b/data/registry/collector-receiver-pulsar.yml index de619e0f77b7..a62414b9cf2a 100644 --- a/data/registry/collector-receiver-pulsar.yml +++ b/data/registry/collector-receiver-pulsar.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/pulsarreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-purefa.yml b/data/registry/collector-receiver-purefa.yml index a5ea80cf6ab3..2f16ed5bb57a 100644 --- a/data/registry/collector-receiver-purefa.yml +++ b/data/registry/collector-receiver-purefa.yml @@ -18,4 +18,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefareceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-purefb.yml b/data/registry/collector-receiver-purefb.yml index a13739d37a9d..9ed3a6e49c93 100644 --- a/data/registry/collector-receiver-purefb.yml +++ b/data/registry/collector-receiver-purefb.yml @@ -19,4 +19,4 @@ createdAt: 2023-02-01 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefbreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-rabbitmq.yml b/data/registry/collector-receiver-rabbitmq.yml index 640c5a453a5e..863984302090 100644 --- a/data/registry/collector-receiver-rabbitmq.yml +++ b/data/registry/collector-receiver-rabbitmq.yml @@ -18,4 +18,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-receiver-creator.yml b/data/registry/collector-receiver-receiver-creator.yml index fa87eaf8d89c..0249b4342c1b 100644 --- a/data/registry/collector-receiver-receiver-creator.yml +++ b/data/registry/collector-receiver-receiver-creator.yml @@ -19,4 +19,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-redis.yml b/data/registry/collector-receiver-redis.yml index ddfc3ebe5fc1..a0058a393988 100644 --- a/data/registry/collector-receiver-redis.yml +++ b/data/registry/collector-receiver-redis.yml @@ -19,4 +19,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-riak.yml b/data/registry/collector-receiver-riak.yml index dc4a38784b2c..480ae3009267 100644 --- a/data/registry/collector-receiver-riak.yml +++ b/data/registry/collector-receiver-riak.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-saphana.yml b/data/registry/collector-receiver-saphana.yml index 8d830131abab..cbdbf98ec8b8 100644 --- a/data/registry/collector-receiver-saphana.yml +++ b/data/registry/collector-receiver-saphana.yml @@ -19,4 +19,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/saphanareceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-sapm.yml b/data/registry/collector-receiver-sapm.yml index 30626ddf7393..e127dc911c63 100644 --- a/data/registry/collector-receiver-sapm.yml +++ b/data/registry/collector-receiver-sapm.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-signalfx.yml b/data/registry/collector-receiver-signalfx.yml index 9a60cf56db70..5bc89a6a704a 100644 --- a/data/registry/collector-receiver-signalfx.yml +++ b/data/registry/collector-receiver-signalfx.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-simple-prometheus.yml b/data/registry/collector-receiver-simple-prometheus.yml index 2c0b750848be..cc1d83b2d6fc 100644 --- a/data/registry/collector-receiver-simple-prometheus.yml +++ b/data/registry/collector-receiver-simple-prometheus.yml @@ -19,4 +19,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-skywalking.yml b/data/registry/collector-receiver-skywalking.yml index 4ef03caee433..9be3532b74c3 100644 --- a/data/registry/collector-receiver-skywalking.yml +++ b/data/registry/collector-receiver-skywalking.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/skywalkingreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-snmp.yml b/data/registry/collector-receiver-snmp.yml index a749784abf31..ac2a3176414e 100644 --- a/data/registry/collector-receiver-snmp.yml +++ b/data/registry/collector-receiver-snmp.yml @@ -19,4 +19,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-snowflake.yml b/data/registry/collector-receiver-snowflake.yml index 60982a8367d2..02e30697d770 100644 --- a/data/registry/collector-receiver-snowflake.yml +++ b/data/registry/collector-receiver-snowflake.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-solace.yml b/data/registry/collector-receiver-solace.yml index ebfe8ac5daa5..74c8eb7543e0 100644 --- a/data/registry/collector-receiver-solace.yml +++ b/data/registry/collector-receiver-solace.yml @@ -17,4 +17,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-splunk-hec.yml b/data/registry/collector-receiver-splunk-hec.yml index a294b6fe259a..1757f22b6129 100644 --- a/data/registry/collector-receiver-splunk-hec.yml +++ b/data/registry/collector-receiver-splunk-hec.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-splunkenterprise.yml b/data/registry/collector-receiver-splunkenterprise.yml index a9995c15be54..d2f12d0ed7b7 100644 --- a/data/registry/collector-receiver-splunkenterprise.yml +++ b/data/registry/collector-receiver-splunkenterprise.yml @@ -19,4 +19,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-sqlquery.yml b/data/registry/collector-receiver-sqlquery.yml index 103710d5bff3..a306d05449b6 100644 --- a/data/registry/collector-receiver-sqlquery.yml +++ b/data/registry/collector-receiver-sqlquery.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlqueryreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-sqlserver.yml b/data/registry/collector-receiver-sqlserver.yml index 1f236b05c8e4..12d02102c685 100644 --- a/data/registry/collector-receiver-sqlserver.yml +++ b/data/registry/collector-receiver-sqlserver.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-sshcheck.yml b/data/registry/collector-receiver-sshcheck.yml index 69ea3acae4f4..dfe68466cc5a 100644 --- a/data/registry/collector-receiver-sshcheck.yml +++ b/data/registry/collector-receiver-sshcheck.yml @@ -19,4 +19,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-statsd.yml b/data/registry/collector-receiver-statsd.yml index 1cfd926fed74..9158a94946f2 100644 --- a/data/registry/collector-receiver-statsd.yml +++ b/data/registry/collector-receiver-statsd.yml @@ -17,4 +17,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-syslog.yml b/data/registry/collector-receiver-syslog.yml index c8d1bf4cb582..5311d474be63 100644 --- a/data/registry/collector-receiver-syslog.yml +++ b/data/registry/collector-receiver-syslog.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-tcplog.yml b/data/registry/collector-receiver-tcplog.yml index a7bdeb4ccf29..62e32835f4f9 100644 --- a/data/registry/collector-receiver-tcplog.yml +++ b/data/registry/collector-receiver-tcplog.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-udplog.yml b/data/registry/collector-receiver-udplog.yml index 064416d11ca7..5803c8115bcf 100644 --- a/data/registry/collector-receiver-udplog.yml +++ b/data/registry/collector-receiver-udplog.yml @@ -16,4 +16,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-vcenter.yml b/data/registry/collector-receiver-vcenter.yml index 0145b93334e2..d82a85074e4f 100644 --- a/data/registry/collector-receiver-vcenter.yml +++ b/data/registry/collector-receiver-vcenter.yml @@ -18,4 +18,4 @@ createdAt: 2020-11-05 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-wavefront.yml b/data/registry/collector-receiver-wavefront.yml index d1bfc770a21b..b570037eb3af 100644 --- a/data/registry/collector-receiver-wavefront.yml +++ b/data/registry/collector-receiver-wavefront.yml @@ -16,4 +16,4 @@ createdAt: 2020-06-06 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/wavefrontreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-webhookevent.yml b/data/registry/collector-receiver-webhookevent.yml index e17d7e1422e1..551fef871d34 100644 --- a/data/registry/collector-receiver-webhookevent.yml +++ b/data/registry/collector-receiver-webhookevent.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-windows-perf-counters.yml b/data/registry/collector-receiver-windows-perf-counters.yml index cb3504379ad8..07755c264a91 100644 --- a/data/registry/collector-receiver-windows-perf-counters.yml +++ b/data/registry/collector-receiver-windows-perf-counters.yml @@ -19,4 +19,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-windowseventlog.yml b/data/registry/collector-receiver-windowseventlog.yml index 547bd52159cc..00fdc3669d46 100644 --- a/data/registry/collector-receiver-windowseventlog.yml +++ b/data/registry/collector-receiver-windowseventlog.yml @@ -18,4 +18,4 @@ createdAt: 2022-10-25 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/collector-receiver-zipkin.yml b/data/registry/collector-receiver-zipkin.yml index 17e3b594e248..4887cf1927a1 100644 --- a/data/registry/collector-receiver-zipkin.yml +++ b/data/registry/collector-receiver-zipkin.yml @@ -13,7 +13,7 @@ authors: package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver - version: v0.111.0 + version: v0.112.0 urls: repo: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/zipkinreceiver createdAt: 2020-11-05 diff --git a/data/registry/collector-receiver-zookeeper.yml b/data/registry/collector-receiver-zookeeper.yml index 2a3f084187ea..53dd67c52d9d 100644 --- a/data/registry/collector-receiver-zookeeper.yml +++ b/data/registry/collector-receiver-zookeeper.yml @@ -18,4 +18,4 @@ createdAt: 2021-02-26 package: registry: go-collector name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver - version: v0.111.0 + version: v0.112.0 diff --git a/data/registry/exporter-js-instana.yml b/data/registry/exporter-js-instana.yml index dd5a314734c4..394c5f204615 100644 --- a/data/registry/exporter-js-instana.yml +++ b/data/registry/exporter-js-instana.yml @@ -15,4 +15,4 @@ createdAt: 2022-04-18 package: registry: npm name: '@instana/opentelemetry-exporter' - version: 3.20.2 + version: 4.0.0 diff --git a/data/registry/exporter-js-jaeger.yml b/data/registry/exporter-js-jaeger.yml index a3238cf96a4e..0aabb60da310 100644 --- a/data/registry/exporter-js-jaeger.yml +++ b/data/registry/exporter-js-jaeger.yml @@ -14,4 +14,4 @@ createdAt: 2020-02-06 package: registry: npm name: '@opentelemetry/exporter-jaeger' - version: 1.26.0 + version: 1.27.0 diff --git a/data/registry/exporter-js-prometheus.yml b/data/registry/exporter-js-prometheus.yml index 281c404aa293..e2fc09614efc 100644 --- a/data/registry/exporter-js-prometheus.yml +++ b/data/registry/exporter-js-prometheus.yml @@ -14,4 +14,4 @@ createdAt: 2020-02-06 package: registry: npm name: '@opentelemetry/exporter-prometheus' - version: 0.53.0 + version: 0.54.0 diff --git a/data/registry/exporter-js-zipkin.yml b/data/registry/exporter-js-zipkin.yml index eff9d385bc53..935eb193fd15 100644 --- a/data/registry/exporter-js-zipkin.yml +++ b/data/registry/exporter-js-zipkin.yml @@ -11,7 +11,7 @@ authors: package: name: '@opentelemetry/exporter-zipkin' registry: npm - version: 1.26.0 + version: 1.27.0 urls: repo: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-exporter-zipkin docs: /docs/languages/js/exporters/#zipkin diff --git a/data/registry/exporter-php-zipkin.yml b/data/registry/exporter-php-zipkin.yml index dc74f13d5ac8..c66455a83588 100644 --- a/data/registry/exporter-php-zipkin.yml +++ b/data/registry/exporter-php-zipkin.yml @@ -12,7 +12,7 @@ authors: package: name: open-telemetry/exporter-zipkin registry: packagist - version: 1.1.0 + version: 1.1.1 urls: repo: https://github.com/open-telemetry/opentelemetry-php/tree/main/src/Contrib/Zipkin createdAt: 2022-12-14 diff --git a/data/registry/instrumentation-erlang-bandit.yml b/data/registry/instrumentation-erlang-bandit.yml index d4c720cba68e..73364f9dffa1 100644 --- a/data/registry/instrumentation-erlang-bandit.yml +++ b/data/registry/instrumentation-erlang-bandit.yml @@ -18,4 +18,4 @@ isFirstParty: false package: registry: hex name: opentelemetry_bandit - version: 0.1.4 + version: 0.2.0-rc.1 diff --git a/data/registry/instrumentation-js-fetch.yml b/data/registry/instrumentation-js-fetch.yml index f687cf504d34..939dc1923062 100644 --- a/data/registry/instrumentation-js-fetch.yml +++ b/data/registry/instrumentation-js-fetch.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-fetch' - version: 0.53.0 + version: 0.54.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-grpc.yml b/data/registry/instrumentation-js-grpc.yml index 1bf65a95daac..ca6353b31d8c 100644 --- a/data/registry/instrumentation-js-grpc.yml +++ b/data/registry/instrumentation-js-grpc.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-grpc' - version: 0.53.0 + version: 0.54.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-http.yml b/data/registry/instrumentation-js-http.yml index 845dfe2f7c19..cb20d8b27d03 100644 --- a/data/registry/instrumentation-js-http.yml +++ b/data/registry/instrumentation-js-http.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-http' - version: 0.53.0 + version: 0.54.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-langchain.yml b/data/registry/instrumentation-js-langchain.yml index 405dfcb50d35..feb8aa54a273 100644 --- a/data/registry/instrumentation-js-langchain.yml +++ b/data/registry/instrumentation-js-langchain.yml @@ -18,5 +18,5 @@ createdAt: 2024-06-05 package: registry: npm name: '@arizeai/openinference-instrumentation-langchain' - version: 0.2.0 + version: 1.0.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-openai.yml b/data/registry/instrumentation-js-openai.yml index 1b371fc5fdca..8c57c7241851 100644 --- a/data/registry/instrumentation-js-openai.yml +++ b/data/registry/instrumentation-js-openai.yml @@ -18,5 +18,5 @@ createdAt: 2024-06-05 package: registry: npm name: '@arizeai/openinference-instrumentation-openai' - version: 0.5.0 + version: 1.0.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-pg.yml b/data/registry/instrumentation-js-pg.yml index a063b2296fcb..326d9a83aa5a 100644 --- a/data/registry/instrumentation-js-pg.yml +++ b/data/registry/instrumentation-js-pg.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-pg' - version: 0.45.1 + version: 0.46.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-postgres.yml b/data/registry/instrumentation-js-postgres.yml index 92e0cbc5396d..013bfcb29413 100644 --- a/data/registry/instrumentation-js-postgres.yml +++ b/data/registry/instrumentation-js-postgres.yml @@ -17,5 +17,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-pg' - version: 0.45.1 + version: 0.46.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-prisma.yml b/data/registry/instrumentation-js-prisma.yml index fb463f9b2e15..646f60052e95 100644 --- a/data/registry/instrumentation-js-prisma.yml +++ b/data/registry/instrumentation-js-prisma.yml @@ -17,5 +17,5 @@ createdAt: 2022-08-25 package: registry: npm name: '@prisma/instrumentation' - version: 5.21.0 + version: 5.21.1 isFirstParty: true diff --git a/data/registry/instrumentation-js-xml-http-request.yml b/data/registry/instrumentation-js-xml-http-request.yml index b0b4e86b0707..a237be330c88 100644 --- a/data/registry/instrumentation-js-xml-http-request.yml +++ b/data/registry/instrumentation-js-xml-http-request.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-xml-http-request' - version: 0.53.0 + version: 0.54.0 isFirstParty: false diff --git a/data/registry/instrumentation-php-guzzle.yml b/data/registry/instrumentation-php-guzzle.yml index 53d07f4f7576..95212624294a 100644 --- a/data/registry/instrumentation-php-guzzle.yml +++ b/data/registry/instrumentation-php-guzzle.yml @@ -15,5 +15,5 @@ createdAt: 2024-01-19 package: registry: packagist name: open-telemetry/opentelemetry-auto-guzzle - version: 1.0.0 + version: 1.0.1 isFirstParty: false diff --git a/data/registry/instrumentation-php-pdo.yml b/data/registry/instrumentation-php-pdo.yml index 92522edd52e5..32d0d71aabff 100644 --- a/data/registry/instrumentation-php-pdo.yml +++ b/data/registry/instrumentation-php-pdo.yml @@ -15,5 +15,5 @@ createdAt: 2023-05-22 package: registry: packagist name: open-telemetry/opentelemetry-auto-pdo - version: 0.0.15 + version: 0.0.16 isFirstParty: false diff --git a/data/registry/instrumentation-php-psr3.yml b/data/registry/instrumentation-php-psr3.yml index d30f73eead7a..ff0ba130d1cc 100644 --- a/data/registry/instrumentation-php-psr3.yml +++ b/data/registry/instrumentation-php-psr3.yml @@ -17,5 +17,5 @@ createdAt: 2023-07-10 package: registry: packagist name: open-telemetry/opentelemetry-auto-psr3 - version: 0.0.7 + version: 0.0.8 isFirstParty: false diff --git a/data/registry/instrumentation-php-symfony.yml b/data/registry/instrumentation-php-symfony.yml index 3a2f3a721397..a3660b093f17 100644 --- a/data/registry/instrumentation-php-symfony.yml +++ b/data/registry/instrumentation-php-symfony.yml @@ -15,5 +15,5 @@ createdAt: 2023-05-22 package: registry: packagist name: open-telemetry/opentelemetry-auto-symfony - version: 1.0.0beta29 + version: 1.0.0beta30 isFirstParty: false diff --git a/data/registry/instrumentation-ruby-actionmailer.yml b/data/registry/instrumentation-ruby-actionmailer.yml index 5c3de4fc1eff..f013df9712ba 100644 --- a/data/registry/instrumentation-ruby-actionmailer.yml +++ b/data/registry/instrumentation-ruby-actionmailer.yml @@ -19,5 +19,5 @@ createdAt: 2024-07-08 package: registry: gems name: opentelemetry-instrumentation-action_mailer - version: 0.1.0 + version: 0.2.0 isFirstParty: false diff --git a/data/registry/instrumentation-ruby-active-record.yml b/data/registry/instrumentation-ruby-active-record.yml index c02056ef45fb..aca1b3aecd93 100644 --- a/data/registry/instrumentation-ruby-active-record.yml +++ b/data/registry/instrumentation-ruby-active-record.yml @@ -15,5 +15,5 @@ createdAt: 2020-11-09 package: registry: gems name: opentelemetry-instrumentation-active_record - version: 0.7.4 + version: 0.8.0 isFirstParty: false diff --git a/data/registry/instrumentation-ruby-all.yml b/data/registry/instrumentation-ruby-all.yml index 193690e310a4..4c8e7dd1102a 100644 --- a/data/registry/instrumentation-ruby-all.yml +++ b/data/registry/instrumentation-ruby-all.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: gems name: opentelemetry-instrumentation-all - version: 0.66.0 + version: 0.67.0 isFirstParty: false diff --git a/data/registry/instrumentation-ruby-rack.yml b/data/registry/instrumentation-ruby-rack.yml index a14f3ee1fd06..07774887bd88 100644 --- a/data/registry/instrumentation-ruby-rack.yml +++ b/data/registry/instrumentation-ruby-rack.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: gems name: opentelemetry-instrumentation-rack - version: 0.24.6 + version: 0.25.0 isFirstParty: false diff --git a/data/registry/instrumentation-ruby-rails.yml b/data/registry/instrumentation-ruby-rails.yml index f9ef6fc07857..3cf3a839f759 100644 --- a/data/registry/instrumentation-ruby-rails.yml +++ b/data/registry/instrumentation-ruby-rails.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: gems name: opentelemetry-instrumentation-rails - version: 0.31.2 + version: 0.32.0 isFirstParty: false diff --git a/data/registry/resource-detector-js-container.yml b/data/registry/resource-detector-js-container.yml index 143c76f68072..45550cea1b6a 100644 --- a/data/registry/resource-detector-js-container.yml +++ b/data/registry/resource-detector-js-container.yml @@ -17,4 +17,4 @@ createdAt: 2022-12-07 package: registry: npm name: '@opentelemetry/resource-detector-container' - version: 0.4.3 + version: 0.4.4 From 8f1ff1c806c8bba2f6d9072f2075cdbec600977c Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Fri, 25 Oct 2024 01:05:24 -0500 Subject: [PATCH 36/76] Auto-update registry versions (8aedcae862cefce38f8d5746abb17b7ed8014a22) (#5479) --- data/registry/exporter-js-azure.yml | 2 +- data/registry/instrumentation-go-gorm.yml | 2 +- data/registry/instrumentation-ruby-active-job.yml | 2 +- data/registry/instrumentation-ruby-all.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/registry/exporter-js-azure.yml b/data/registry/exporter-js-azure.yml index 2495796e2dc4..790856f34548 100644 --- a/data/registry/exporter-js-azure.yml +++ b/data/registry/exporter-js-azure.yml @@ -13,7 +13,7 @@ authors: package: name: '@azure/monitor-opentelemetry-exporter' registry: npm - version: 1.0.0-beta.26 + version: 1.0.0-beta.27 urls: repo: https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/monitor/monitor-opentelemetry-exporter createdAt: 2021-11-01 diff --git a/data/registry/instrumentation-go-gorm.yml b/data/registry/instrumentation-go-gorm.yml index efc7f88556fd..aebc7f3f6e35 100644 --- a/data/registry/instrumentation-go-gorm.yml +++ b/data/registry/instrumentation-go-gorm.yml @@ -18,4 +18,4 @@ isFirstParty: true package: registry: go name: gorm.io/plugin/opentelemetry - version: v0.1.7 + version: v0.1.8 diff --git a/data/registry/instrumentation-ruby-active-job.yml b/data/registry/instrumentation-ruby-active-job.yml index 8403c88d95fd..5017df229f84 100644 --- a/data/registry/instrumentation-ruby-active-job.yml +++ b/data/registry/instrumentation-ruby-active-job.yml @@ -15,5 +15,5 @@ createdAt: 2020-11-09 package: registry: gems name: opentelemetry-instrumentation-active_job - version: 0.7.7 + version: 0.7.8 isFirstParty: false diff --git a/data/registry/instrumentation-ruby-all.yml b/data/registry/instrumentation-ruby-all.yml index 4c8e7dd1102a..809a5b3f9a05 100644 --- a/data/registry/instrumentation-ruby-all.yml +++ b/data/registry/instrumentation-ruby-all.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: gems name: opentelemetry-instrumentation-all - version: 0.67.0 + version: 0.68.0 isFirstParty: false From b075b9d308dcb32dbadfc22b523c0283b81f1dd5 Mon Sep 17 00:00:00 2001 From: Rebecca <92574715+Beccamak@users.noreply.github.com> Date: Fri, 25 Oct 2024 07:43:49 +0100 Subject: [PATCH 37/76] PR for "Rework Building a Connector images" (#5407) Signed-off-by: svrnm Co-authored-by: svrnm Co-authored-by: Severin Neumann --- .../{connector.md => connector/index.md} | 4 +- .../otel-collector-after-connector.svg | 235 ++++++++++++++++++ .../otel-collector-before-connector.svg | 177 +++++++++++++ .../img/otel-collector-after-connector.png | Bin 114420 -> 0 bytes .../img/otel-collector-before-connector.png | Bin 85741 -> 0 bytes 5 files changed, 414 insertions(+), 2 deletions(-) rename content/en/docs/collector/building/{connector.md => connector/index.md} (99%) create mode 100644 content/en/docs/collector/building/connector/otel-collector-after-connector.svg create mode 100644 content/en/docs/collector/building/connector/otel-collector-before-connector.svg delete mode 100644 content/en/docs/collector/img/otel-collector-after-connector.png delete mode 100644 content/en/docs/collector/img/otel-collector-before-connector.png diff --git a/content/en/docs/collector/building/connector.md b/content/en/docs/collector/building/connector/index.md similarity index 99% rename from content/en/docs/collector/building/connector.md rename to content/en/docs/collector/building/connector/index.md index e36741c2f030..410cfb733635 100644 --- a/content/en/docs/collector/building/connector.md +++ b/content/en/docs/collector/building/connector/index.md @@ -54,11 +54,11 @@ following links: ### The Old Architecture: -![Before picture of how processors emitted data directly to another pipelines exporter](../../img/otel-collector-before-connector.png) +![Before picture of how processors emitted data directly to another pipelines exporter](./otel-collector-before-connector.svg) ### New Architecture Using a Connector: -![How the pipeline should work using the connector component](../../img/otel-collector-after-connector.png) +![How the pipeline should work using the connector component](./otel-collector-after-connector.svg) ## Building Example Connector diff --git a/content/en/docs/collector/building/connector/otel-collector-after-connector.svg b/content/en/docs/collector/building/connector/otel-collector-after-connector.svg new file mode 100644 index 000000000000..a6bd7802b339 --- /dev/null +++ b/content/en/docs/collector/building/connector/otel-collector-after-connector.svg @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/en/docs/collector/building/connector/otel-collector-before-connector.svg b/content/en/docs/collector/building/connector/otel-collector-before-connector.svg new file mode 100644 index 000000000000..662198cd7766 --- /dev/null +++ b/content/en/docs/collector/building/connector/otel-collector-before-connector.svg @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/en/docs/collector/img/otel-collector-after-connector.png b/content/en/docs/collector/img/otel-collector-after-connector.png deleted file mode 100644 index e106c5fd9726cd0ffa8ae986065ba68bee8ca794..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114420 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 LB^mrV1F!!BK)zFV diff --git a/content/en/docs/collector/img/otel-collector-before-connector.png b/content/en/docs/collector/img/otel-collector-before-connector.png deleted file mode 100644 index a8667d4b6edfececc8a90a6f984001ce71369234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85741 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 z 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%0A@NSw7rm^4cs%|ep2Zl!l|N$ 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 z

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 z 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 From c705446a47fb030a350cf8eb08951272f8ea1f06 Mon Sep 17 00:00:00 2001 From: Susan Githaiga <117893498+SusanGithaigaN@users.noreply.github.com> Date: Fri, 25 Oct 2024 10:01:32 +0300 Subject: [PATCH 38/76] Review visualizations for dark/light mode compatibility (#5438) --- content/en/docs/collector/img/otel-collector.svg | 6 +++--- static/img/waterfall-trace.svg | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/en/docs/collector/img/otel-collector.svg b/content/en/docs/collector/img/otel-collector.svg index 022696c23bb7..1e1583cfb3b2 100644 --- a/content/en/docs/collector/img/otel-collector.svg +++ b/content/en/docs/collector/img/otel-collector.svg @@ -1,6 +1,6 @@ - - - + + + diff --git a/static/img/waterfall-trace.svg b/static/img/waterfall-trace.svg index 794f85b9926f..e662435657d6 100644 --- a/static/img/waterfall-trace.svg +++ b/static/img/waterfall-trace.svg @@ -1,6 +1,6 @@ - + From 1ac2f27190c8bc0064beed51e2b5d87bb87e5f07 Mon Sep 17 00:00:00 2001 From: Damien Mathieu <42@dmathieu.com> Date: Fri, 25 Oct 2024 09:08:21 +0200 Subject: [PATCH 39/76] State of Profiling blog post (#5475) Co-authored-by: Severin Neumann Co-authored-by: Severin Neumann Co-authored-by: Pablo Baeyens --- .cspell/en-words.txt | 1 + content/en/blog/2024/state-profiling.md | 117 ++++++++++++++++++++++++ static/refcache.json | 32 +++++++ 3 files changed, 150 insertions(+) create mode 100644 content/en/blog/2024/state-profiling.md diff --git a/.cspell/en-words.txt b/.cspell/en-words.txt index 7f3a83d42974..d22571563ed6 100644 --- a/.cspell/en-words.txt +++ b/.cspell/en-words.txt @@ -34,6 +34,7 @@ discoverability dotnet Dyla dynatrace +ebpf emailservice EMEA erlang diff --git a/content/en/blog/2024/state-profiling.md b/content/en/blog/2024/state-profiling.md new file mode 100644 index 000000000000..70010be554bd --- /dev/null +++ b/content/en/blog/2024/state-profiling.md @@ -0,0 +1,117 @@ +--- +title: The State of Profiling +linkTitle: Profiling state +date: 2024-10-25 +cSpell:ignore: Baeyens Florian Geisendörfer Kalkanis Lehner Mathieu Rühsen +author: >- + [Damien Mathieu](https://github.com/dmathieu) (Elastic), [Pablo + Baeyens](https://github.com/mx-psi) (Datadog), [Felix + Geisendörfer](https://github.com/felixge) (Datadog), [Christos + Kalkanis](https://github.com/christos68k) (Elastic), [Morgan + McLean](https://github.com/mtwo) (Splunk), [Florian + Lehner](https://github.com/florianl) (Elastic), [Tim + Rühsen](https://github.com/rockdaboot) (Elastic) +issue: https://github.com/open-telemetry/opentelemetry.io/issues/5477 +sig: Profiling SIG +--- + +A little over six months ago, OpenTelemetry announced +[support for the profiling signal](/blog/2024/profiling/). While the signal is +still in development and isn’t yet recommended for production use, the Profiling +SIG has made substantial progress on many fronts. + +This post provides a summary of the progress the Profiling SIG has made over the +past six months. + +## OTLP improvements + +Profiles were added as a new signal type to OTLP in +[v1.3.0](https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v1.3.0), +though this area is still marked as unstable as we continue to make changes to +it. + +While our original intent was to keep wire compatibility with +[pprof](https://github.com/google/pprof), that goal proved impractical, so the +Profiling SIG +[has decided](https://github.com/open-telemetry/opentelemetry-proto/issues/567#issuecomment-2286565449) +to refactor the protocol and not aim for strict compatibility with pprof. +Instead, we will aim for convertibility, similarly to what we already do for +other signals. This shift is still a work in progress, and is causing several +breaking changes to the profiling section of the protocol. Note that this has no +impact on the stable sections that make up the majority of the OTLP protocol, +like metrics, spans, logs, resources, etc. + +## eBPF agent improvements + +Back in June, the +[donation of the Elastic Continuous Profiling Agent](/blog/2024/elastic-contributes-continuous-profiling-agent/) +was finalized. Since then, the +[opentelemetry-ebpf-profiler](https://github.com/open-telemetry/opentelemetry-ebpf-profiler) +repository has been buzzing with improvements. + +Our next goal for the eBPF agent is for it to run as a Collector receiver. Once +this is complete, the Collector can be run on every node as an agent, which +collects profiles for that host and forwards them using OTLP. This architecture +will allow us to extract some specific parts of the agent that aren’t strictly +profiling, such as retrieving host metadata and system metrics, and move them to +processors, making the agent lighter and more modular. + +## Collector support + +Since +[v0.112.0](https://github.com/open-telemetry/opentelemetry-collector/releases/tag/v0.112.0), +the OpenTelemetry Collector is able to receive, process and export profiling +data, and has support for profile ingestion and export using OTLP. + +You can try it out by enabling the `service.profilesSupport` +[feature gate](https://github.com/open-telemetry/opentelemetry-collector/blob/main/featuregate/README.md#controlling-gates) +in your collector, followed by a configuration similar to the following, which +ingests and exports data using OTLP: + +```yaml +receivers: + otlp: + protocols: + grpc: +exporters: + otlp: + endpoint: 'localhost:4317' +service: + pipelines: + profiles: + receivers: [otlp] + exporters: [otlp] +``` + +While this feature can be used now on the Collector, we do not yet recommend +doing so in production: it is still under heavy development and is expected to +have breaking changes, such as the ones mentioned above with OTLP. + +However, this support in the Collector means that any receiver, processor or +exporter of the Collector can now start adding profiles support, which we highly +encourage to do, as a way to allow a smoother integration in the future, as well +as to find potential issues early. If you wish to report a bug or contribute on +this effort, you can +[view them on the contrib repository](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22+label%3Adata%3Aprofiles). + +## Semantic Conventions and Specification + +To improve interoperability, the Profiling SIG worked also on +[OpenTelemetry Semantic Conventions for profiling](/docs/specs/semconv/attributes-registry/profile/). +There is also ongoing work to introduce a +[profiling OpenTelemetry specification](https://github.com/open-telemetry/opentelemetry-specification/pull/4197). +This work will continue and should enable wide adoption across different +platforms, tools and other OTel signals. + +## What’s next ? + +Support for profiles in OpenTelemetry is moving very quickly, and while we’re +still far from being able to provide a stable signal, we are happy to report +that folks can start hacking with it, and integrate it within their modules. + +If you’re interested in helping profiling move forward, or face issues when +integrating with it, the Profiling SIG is always happy to get or provide help. + +You can find us on +[#otel-profiles](https://cloud-native.slack.com/archives/C03J794L0BV) in the +CNCF slack. diff --git a/static/refcache.json b/static/refcache.json index 508800b3d219..0871d6726e69 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -1831,6 +1831,10 @@ "StatusCode": 200, "LastSeen": "2024-08-09T10:45:49.257983-04:00" }, + "https://cloud-native.slack.com/archives/C03J794L0BV": { + "StatusCode": 200, + "LastSeen": "2024-10-24T15:10:31.184402+02:00" + }, "https://cloud-native.slack.com/archives/C041APFBYQP": { "StatusCode": 200, "LastSeen": "2024-01-30T05:18:18.947225-05:00" @@ -4999,6 +5003,10 @@ "StatusCode": 200, "LastSeen": "2024-06-12T11:21:46.656082+02:00" }, + "https://github.com/google/pprof": { + "StatusCode": 200, + "LastSeen": "2024-10-24T15:10:16.695786+02:00" + }, "https://github.com/gosnmp/gosnmp": { "StatusCode": 200, "LastSeen": "2024-01-18T19:55:40.84138-05:00" @@ -5991,6 +5999,10 @@ "StatusCode": 200, "LastSeen": "2024-01-30T16:14:54.058976-05:00" }, + "https://github.com/open-telemetry/opentelemetry-collector-contrib/issues": { + "StatusCode": 200, + "LastSeen": "2024-10-24T15:10:27.834953+02:00" + }, "https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/16462": { "StatusCode": 200, "LastSeen": "2024-01-30T05:18:40.093521-05:00" @@ -6243,6 +6255,10 @@ "StatusCode": 200, "LastSeen": "2024-07-02T09:23:49.72181125Z" }, + "https://github.com/open-telemetry/opentelemetry-collector/releases/tag/v0.112.0": { + "StatusCode": 200, + "LastSeen": "2024-10-24T15:10:25.832305+02:00" + }, "https://github.com/open-telemetry/opentelemetry-collector/releases/tag/v0.63.0": { "StatusCode": 200, "LastSeen": "2024-01-30T16:04:58.261649-05:00" @@ -6503,6 +6519,10 @@ "StatusCode": 200, "LastSeen": "2024-01-30T16:15:25.802104-05:00" }, + "https://github.com/open-telemetry/opentelemetry-ebpf-profiler": { + "StatusCode": 200, + "LastSeen": "2024-10-24T15:10:22.597683+02:00" + }, "https://github.com/open-telemetry/opentelemetry-erlang": { "StatusCode": 200, "LastSeen": "2024-01-18T19:10:24.771487-05:00" @@ -6971,10 +6991,18 @@ "StatusCode": 200, "LastSeen": "2024-01-18T19:37:06.679199-05:00" }, + "https://github.com/open-telemetry/opentelemetry-proto/issues/567#issuecomment-2286565449": { + "StatusCode": 200, + "LastSeen": "2024-10-24T15:10:18.85325+02:00" + }, "https://github.com/open-telemetry/opentelemetry-proto/issues/new": { "StatusCode": 200, "LastSeen": "2024-08-09T10:45:27.522647-04:00" }, + "https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v1.3.0": { + "StatusCode": 200, + "LastSeen": "2024-10-24T15:10:14.278497+02:00" + }, "https://github.com/open-telemetry/opentelemetry-python": { "StatusCode": 200, "LastSeen": "2024-01-18T19:37:16.269952-05:00" @@ -7123,6 +7151,10 @@ "StatusCode": 200, "LastSeen": "2024-01-18T20:05:26.46768-05:00" }, + "https://github.com/open-telemetry/opentelemetry-specification/pull/4197": { + "StatusCode": 200, + "LastSeen": "2024-10-24T15:10:29.718998+02:00" + }, "https://github.com/open-telemetry/opentelemetry-specification/releases/tag/v1.17.0": { "StatusCode": 200, "LastSeen": "2024-01-30T05:18:18.661983-05:00" From efffc3d07b7f4699b786ce830561f27a966f74c3 Mon Sep 17 00:00:00 2001 From: Susan Githaiga <117893498+SusanGithaigaN@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:08:34 +0300 Subject: [PATCH 40/76] Fix image display for dark mode on Instrumentation Scope page #5438 (#5440) --- .../instrumentation-scope/spans-with-instrumentation-scope.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/instrumentation-scope/spans-with-instrumentation-scope.svg b/content/en/docs/concepts/instrumentation-scope/spans-with-instrumentation-scope.svg index ccbfc25c43dc..9e5ecfb13cae 100644 --- a/content/en/docs/concepts/instrumentation-scope/spans-with-instrumentation-scope.svg +++ b/content/en/docs/concepts/instrumentation-scope/spans-with-instrumentation-scope.svg @@ -1,3 +1,3 @@ - /api/placeOrderCheckoutService::placeOrderprepareOrderItemsCartService::getCartCache::findCache::findProductService::getProductCache::findCache::findDB::querycheckoutCache::findDB::query \ No newline at end of file + /api/placeOrderCheckoutService::placeOrderprepareOrderItemsCartService::getCartCache::findCache::findProductService::getProductCache::findCache::findDB::querycheckoutCache::findDB::query From 4c20cefb1e7a84f9e53a0afa889e2cbad0c576a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 06:59:00 -0700 Subject: [PATCH 41/76] Bump @opentelemetry/instrumentation from 0.53.0 to 0.54.0 (#5491) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0beecdac83d4..385bf6116e20 100644 --- a/package.json +++ b/package.json @@ -140,7 +140,7 @@ "@opentelemetry/context-zone": "^1.26.0", "@opentelemetry/core": "^1.26.0", "@opentelemetry/exporter-trace-otlp-http": "^0.53.0", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/resources": "^1.26.0", "@opentelemetry/sdk-trace-base": "^1.26.0", "@opentelemetry/sdk-trace-web": "^1.26.0", From f00a4d1d1a9b3be488db438d9ce00562452cf638 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 07:00:22 -0700 Subject: [PATCH 42/76] Bump @opentelemetry/auto-instrumentations-web from 0.41.0 to 0.42.0 (#5493) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 385bf6116e20..bb69aa70d508 100644 --- a/package.json +++ b/package.json @@ -136,7 +136,7 @@ }, "dependencies": { "@opentelemetry/api": "^1.9.0", - "@opentelemetry/auto-instrumentations-web": "^0.41.0", + "@opentelemetry/auto-instrumentations-web": "^0.42.0", "@opentelemetry/context-zone": "^1.26.0", "@opentelemetry/core": "^1.26.0", "@opentelemetry/exporter-trace-otlp-http": "^0.53.0", From 12a2340ffa439477c165ffd1365c93c4ae172017 Mon Sep 17 00:00:00 2001 From: Tiffany Hrabusa <30397949+tiffany76@users.noreply.github.com> Date: Tue, 29 Oct 2024 07:01:19 -0700 Subject: [PATCH 43/76] Update tiffany76's affiliation (#5495) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dee55cf0ff9e..3f4e8247d349 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Here is a list of community roles with current and previous members: - Approvers: [@open-telemetry/docs-approvers][] - [Michael Hausenblas](https://github.com/mhausenblas), Amazon - - [Tiffany Hrabusa](https://github.com/tiffany76) + - [Tiffany Hrabusa](https://github.com/tiffany76), Grafana Labs - Maintainers: [@open-telemetry/docs-maintainers][] From 6c52e5cacc85befc0051cae941c1a726ea58391d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 14:11:10 +0000 Subject: [PATCH 44/76] Bump @opentelemetry/exporter-trace-otlp-http from 0.53.0 to 0.54.0 (#5492) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb69aa70d508..ca1aa7cd4a3b 100644 --- a/package.json +++ b/package.json @@ -139,7 +139,7 @@ "@opentelemetry/auto-instrumentations-web": "^0.42.0", "@opentelemetry/context-zone": "^1.26.0", "@opentelemetry/core": "^1.26.0", - "@opentelemetry/exporter-trace-otlp-http": "^0.53.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.54.0", "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/resources": "^1.26.0", "@opentelemetry/sdk-trace-base": "^1.26.0", From a0ced6aeaf8a5d3cd9a21ce9453272d268916533 Mon Sep 17 00:00:00 2001 From: Peter Bons Date: Tue, 29 Oct 2024 15:11:25 +0100 Subject: [PATCH 45/76] Remove duplicate text (#5499) --- content/en/docs/languages/net/instrumentation.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/content/en/docs/languages/net/instrumentation.md b/content/en/docs/languages/net/instrumentation.md index 509e87d6b0ed..b1394c13fad4 100644 --- a/content/en/docs/languages/net/instrumentation.md +++ b/content/en/docs/languages/net/instrumentation.md @@ -636,14 +636,6 @@ var activity = MyActivitySource.StartActivity( {{% docs/languages/span-status-preamble %}} -A [status](/docs/concepts/signals/traces/#span-status) can be set on a -[span](/docs/concepts/signals/traces/#spans), typically used to specify that a -span has not completed successfully - `SpanStatus.Error`. - -By default, all spans are `Unset`, which means a span completed without error. -The `Ok` status is reserved for when you need to explicitly mark a span as -successful rather than stick with the default of Unset (i.e., “without error”). - The status can be set at any time before the span is finished. It can be a good idea to record exceptions when they happen. It's recommended to From 1240aa55d9c4bc67fb2fe00016e95e1fff2e26c0 Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Tue, 29 Oct 2024 09:53:10 -0500 Subject: [PATCH 46/76] Auto-update registry versions (79386269b4eee476256046f086bf1ff8f2ee0b3d) (#5496) Co-authored-by: Phillip Carter --- data/registry/exporter-js-instana.yml | 2 +- data/registry/instrumentation-dotnet-wcf.yml | 2 +- data/registry/instrumentation-js-amqplib.yml | 2 +- data/registry/instrumentation-js-aws-lambda.yml | 2 +- data/registry/instrumentation-js-aws-sdk.yml | 2 +- data/registry/instrumentation-js-bunyan.yml | 2 +- data/registry/instrumentation-js-cassandra-driver.yml | 2 +- data/registry/instrumentation-js-cassandra.yml | 2 +- data/registry/instrumentation-js-connect.yml | 2 +- data/registry/instrumentation-js-cucumber.yml | 2 +- data/registry/instrumentation-js-dataloader.yml | 2 +- data/registry/instrumentation-js-dns.yml | 2 +- data/registry/instrumentation-js-document-load.yml | 2 +- data/registry/instrumentation-js-express.yml | 2 +- data/registry/instrumentation-js-fastify.yml | 2 +- data/registry/instrumentation-js-fs.yml | 2 +- data/registry/instrumentation-js-generic-pool.yml | 2 +- data/registry/instrumentation-js-graphql.yml | 2 +- data/registry/instrumentation-js-hapi.yml | 2 +- data/registry/instrumentation-js-ioredis.yml | 2 +- data/registry/instrumentation-js-knex.yml | 2 +- data/registry/instrumentation-js-koa.yml | 2 +- data/registry/instrumentation-js-long-task.yml | 2 +- data/registry/instrumentation-js-lru-memoizer.yml | 2 +- data/registry/instrumentation-js-memcached.yml | 2 +- data/registry/instrumentation-js-mongodb.yml | 2 +- data/registry/instrumentation-js-mongoose-instrumentation.yml | 2 +- data/registry/instrumentation-js-mysql.yml | 2 +- data/registry/instrumentation-js-mysql2.yml | 2 +- data/registry/instrumentation-js-nestjs-core.yml | 2 +- data/registry/instrumentation-js-nestjs.yml | 2 +- data/registry/instrumentation-js-net.yml | 2 +- data/registry/instrumentation-js-pg.yml | 2 +- data/registry/instrumentation-js-pillarjs-router.yml | 2 +- data/registry/instrumentation-js-pino.yml | 2 +- data/registry/instrumentation-js-postgres.yml | 2 +- data/registry/instrumentation-js-redis-4.yml | 2 +- data/registry/instrumentation-js-redis.yml | 2 +- data/registry/instrumentation-js-restify.yml | 2 +- data/registry/instrumentation-js-router.yml | 2 +- data/registry/instrumentation-js-runtimenode.yml | 2 +- data/registry/instrumentation-js-socket.io.yml | 2 +- data/registry/instrumentation-js-tedious.yml | 2 +- data/registry/instrumentation-js-undici.yml | 2 +- data/registry/instrumentation-js-user-interaction.yml | 2 +- data/registry/instrumentation-js-winston.yml | 2 +- data/registry/resource-detector-js-alibabacloud.yml | 2 +- data/registry/resource-detector-js-aws.yml | 2 +- data/registry/resource-detector-js-azure.yml | 2 +- data/registry/resource-detector-js-container.yml | 2 +- data/registry/resource-detector-js-gcp.yml | 2 +- data/registry/resource-detector-js-instana.yml | 2 +- 52 files changed, 52 insertions(+), 52 deletions(-) diff --git a/data/registry/exporter-js-instana.yml b/data/registry/exporter-js-instana.yml index 394c5f204615..59123ac21ad2 100644 --- a/data/registry/exporter-js-instana.yml +++ b/data/registry/exporter-js-instana.yml @@ -15,4 +15,4 @@ createdAt: 2022-04-18 package: registry: npm name: '@instana/opentelemetry-exporter' - version: 4.0.0 + version: 4.0.1 diff --git a/data/registry/instrumentation-dotnet-wcf.yml b/data/registry/instrumentation-dotnet-wcf.yml index 4480d36da7aa..d235ffa3e58d 100644 --- a/data/registry/instrumentation-dotnet-wcf.yml +++ b/data/registry/instrumentation-dotnet-wcf.yml @@ -18,4 +18,4 @@ isFirstParty: false package: registry: nuget name: OpenTelemetry.Instrumentation.Wcf - version: 1.0.0-rc.17 + version: 1.0.0-rc.18 diff --git a/data/registry/instrumentation-js-amqplib.yml b/data/registry/instrumentation-js-amqplib.yml index f9459577a47d..ffe335c3bb7f 100644 --- a/data/registry/instrumentation-js-amqplib.yml +++ b/data/registry/instrumentation-js-amqplib.yml @@ -14,7 +14,7 @@ authors: package: name: '@opentelemetry/instrumentation-amqplib' registry: npm - version: 0.42.0 + version: 0.43.0 urls: repo: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/instrumentation-amqplib createdAt: 2020-06-15 diff --git a/data/registry/instrumentation-js-aws-lambda.yml b/data/registry/instrumentation-js-aws-lambda.yml index 823775774773..17fa7dc4ec12 100644 --- a/data/registry/instrumentation-js-aws-lambda.yml +++ b/data/registry/instrumentation-js-aws-lambda.yml @@ -15,5 +15,5 @@ createdAt: 2021-07-08 package: name: '@opentelemetry/instrumentation-aws-lambda' registry: npm - version: 0.45.0 + version: 0.46.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-aws-sdk.yml b/data/registry/instrumentation-js-aws-sdk.yml index 52f1339519c0..761cd1bd7eed 100644 --- a/data/registry/instrumentation-js-aws-sdk.yml +++ b/data/registry/instrumentation-js-aws-sdk.yml @@ -21,5 +21,5 @@ createdAt: 2020-06-15 package: name: '@opentelemetry/instrumentation-aws-sdk' registry: npm - version: 0.44.0 + version: 0.45.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-bunyan.yml b/data/registry/instrumentation-js-bunyan.yml index dcdb05dc6bf2..27c171bcf6ac 100644 --- a/data/registry/instrumentation-js-bunyan.yml +++ b/data/registry/instrumentation-js-bunyan.yml @@ -16,5 +16,5 @@ createdAt: 2021-07-08 package: name: '@opentelemetry/instrumentation-bunyan' registry: npm - version: 0.41.0 + version: 0.42.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-cassandra-driver.yml b/data/registry/instrumentation-js-cassandra-driver.yml index 29f5cd314c22..39b61f5ae311 100644 --- a/data/registry/instrumentation-js-cassandra-driver.yml +++ b/data/registry/instrumentation-js-cassandra-driver.yml @@ -16,5 +16,5 @@ createdAt: 2021-07-08 package: name: '@opentelemetry/instrumentation-cassandra-driver' registry: npm - version: 0.41.0 + version: 0.42.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-cassandra.yml b/data/registry/instrumentation-js-cassandra.yml index 40c76e78c2c8..819b44804048 100644 --- a/data/registry/instrumentation-js-cassandra.yml +++ b/data/registry/instrumentation-js-cassandra.yml @@ -17,5 +17,5 @@ createdAt: 2021-07-08 package: registry: npm name: '@opentelemetry/instrumentation-cassandra-driver' - version: 0.41.0 + version: 0.42.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-connect.yml b/data/registry/instrumentation-js-connect.yml index 1036a2db8cce..ee7813943e64 100644 --- a/data/registry/instrumentation-js-connect.yml +++ b/data/registry/instrumentation-js-connect.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: name: '@opentelemetry/instrumentation-connect' registry: npm - version: 0.39.0 + version: 0.40.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-cucumber.yml b/data/registry/instrumentation-js-cucumber.yml index d3534a040326..e1893f518a1b 100644 --- a/data/registry/instrumentation-js-cucumber.yml +++ b/data/registry/instrumentation-js-cucumber.yml @@ -17,5 +17,5 @@ createdAt: 2022-10-27 package: registry: npm name: '@opentelemetry/instrumentation-cucumber' - version: 0.9.0 + version: 0.10.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-dataloader.yml b/data/registry/instrumentation-js-dataloader.yml index 6d2ad781f57d..71876b461897 100644 --- a/data/registry/instrumentation-js-dataloader.yml +++ b/data/registry/instrumentation-js-dataloader.yml @@ -17,5 +17,5 @@ createdAt: 2022-10-27 package: registry: npm name: '@opentelemetry/instrumentation-dataloader' - version: 0.12.0 + version: 0.13.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-dns.yml b/data/registry/instrumentation-js-dns.yml index c2b2f9545b9f..b72a2a3cdb80 100644 --- a/data/registry/instrumentation-js-dns.yml +++ b/data/registry/instrumentation-js-dns.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-dns' - version: 0.39.0 + version: 0.40.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-document-load.yml b/data/registry/instrumentation-js-document-load.yml index 0d94450ddbc1..13b92edc69ce 100644 --- a/data/registry/instrumentation-js-document-load.yml +++ b/data/registry/instrumentation-js-document-load.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-document-load' - version: 0.40.0 + version: 0.41.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-express.yml b/data/registry/instrumentation-js-express.yml index e1c017a6c0f5..f82ebf0dee3e 100644 --- a/data/registry/instrumentation-js-express.yml +++ b/data/registry/instrumentation-js-express.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-express' - version: 0.43.0 + version: 0.44.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-fastify.yml b/data/registry/instrumentation-js-fastify.yml index 7dd29e97ea7d..2a5f65da794f 100644 --- a/data/registry/instrumentation-js-fastify.yml +++ b/data/registry/instrumentation-js-fastify.yml @@ -15,5 +15,5 @@ createdAt: 2020-08-28 package: registry: npm name: '@opentelemetry/instrumentation-fastify' - version: 0.40.0 + version: 0.41.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-fs.yml b/data/registry/instrumentation-js-fs.yml index 17617ea0aa3e..30c20a2b72a8 100644 --- a/data/registry/instrumentation-js-fs.yml +++ b/data/registry/instrumentation-js-fs.yml @@ -15,5 +15,5 @@ createdAt: 2021-07-08 package: registry: npm name: '@opentelemetry/instrumentation-fs' - version: 0.15.0 + version: 0.16.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-generic-pool.yml b/data/registry/instrumentation-js-generic-pool.yml index 6282ffa47af6..3d88caf363ee 100644 --- a/data/registry/instrumentation-js-generic-pool.yml +++ b/data/registry/instrumentation-js-generic-pool.yml @@ -16,5 +16,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-generic-pool' - version: 0.39.0 + version: 0.40.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-graphql.yml b/data/registry/instrumentation-js-graphql.yml index d3452c06606a..658d7cec68f7 100644 --- a/data/registry/instrumentation-js-graphql.yml +++ b/data/registry/instrumentation-js-graphql.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-graphql' - version: 0.43.0 + version: 0.44.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-hapi.yml b/data/registry/instrumentation-js-hapi.yml index 8a8ae6a78e10..79475103811b 100644 --- a/data/registry/instrumentation-js-hapi.yml +++ b/data/registry/instrumentation-js-hapi.yml @@ -15,5 +15,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-hapi' - version: 0.41.0 + version: 0.42.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-ioredis.yml b/data/registry/instrumentation-js-ioredis.yml index 7086fb533b3f..fdc1db7eb41a 100644 --- a/data/registry/instrumentation-js-ioredis.yml +++ b/data/registry/instrumentation-js-ioredis.yml @@ -15,5 +15,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-ioredis' - version: 0.43.0 + version: 0.44.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-knex.yml b/data/registry/instrumentation-js-knex.yml index 61de037a35d4..63acb01bc33d 100644 --- a/data/registry/instrumentation-js-knex.yml +++ b/data/registry/instrumentation-js-knex.yml @@ -17,5 +17,5 @@ createdAt: 2021-07-08 package: registry: npm name: '@opentelemetry/instrumentation-knex' - version: 0.40.0 + version: 0.41.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-koa.yml b/data/registry/instrumentation-js-koa.yml index 07de8981cbea..20d2a3e37084 100644 --- a/data/registry/instrumentation-js-koa.yml +++ b/data/registry/instrumentation-js-koa.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-koa' - version: 0.43.0 + version: 0.44.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-long-task.yml b/data/registry/instrumentation-js-long-task.yml index 8a3bac0c7148..64b9976a38ee 100644 --- a/data/registry/instrumentation-js-long-task.yml +++ b/data/registry/instrumentation-js-long-task.yml @@ -14,5 +14,5 @@ createdAt: 2021-07-08 package: registry: npm name: '@opentelemetry/instrumentation-long-task' - version: 0.40.0 + version: 0.41.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-lru-memoizer.yml b/data/registry/instrumentation-js-lru-memoizer.yml index 5f94fc71c476..759b3bc353c9 100644 --- a/data/registry/instrumentation-js-lru-memoizer.yml +++ b/data/registry/instrumentation-js-lru-memoizer.yml @@ -17,5 +17,5 @@ createdAt: 2022-10-27 package: registry: npm name: '@opentelemetry/instrumentation-lru-memoizer' - version: 0.40.0 + version: 0.41.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-memcached.yml b/data/registry/instrumentation-js-memcached.yml index 50ae19fcfc5d..c6eb4c2fe8b2 100644 --- a/data/registry/instrumentation-js-memcached.yml +++ b/data/registry/instrumentation-js-memcached.yml @@ -15,5 +15,5 @@ createdAt: 2021-07-08 package: registry: npm name: '@opentelemetry/instrumentation-memcached' - version: 0.39.0 + version: 0.40.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-mongodb.yml b/data/registry/instrumentation-js-mongodb.yml index add69c2c7656..22198af3e172 100644 --- a/data/registry/instrumentation-js-mongodb.yml +++ b/data/registry/instrumentation-js-mongodb.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-mongodb' - version: 0.47.0 + version: 0.48.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-mongoose-instrumentation.yml b/data/registry/instrumentation-js-mongoose-instrumentation.yml index 54ce3bc29aee..e0916a68b13f 100644 --- a/data/registry/instrumentation-js-mongoose-instrumentation.yml +++ b/data/registry/instrumentation-js-mongoose-instrumentation.yml @@ -16,5 +16,5 @@ createdAt: 2021-02-17 package: registry: npm name: '@opentelemetry/instrumentation-mongoose' - version: 0.42.0 + version: 0.43.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-mysql.yml b/data/registry/instrumentation-js-mysql.yml index 4636e825d096..1ec1ff0f0bce 100644 --- a/data/registry/instrumentation-js-mysql.yml +++ b/data/registry/instrumentation-js-mysql.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-mysql' - version: 0.41.0 + version: 0.42.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-mysql2.yml b/data/registry/instrumentation-js-mysql2.yml index a9035b181e60..8314b54d30f5 100644 --- a/data/registry/instrumentation-js-mysql2.yml +++ b/data/registry/instrumentation-js-mysql2.yml @@ -18,5 +18,5 @@ createdAt: 2021-07-08 package: registry: npm name: '@opentelemetry/instrumentation-mysql2' - version: 0.41.0 + version: 0.42.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-nestjs-core.yml b/data/registry/instrumentation-js-nestjs-core.yml index 772dcc7bfa32..3d5412eef3fc 100644 --- a/data/registry/instrumentation-js-nestjs-core.yml +++ b/data/registry/instrumentation-js-nestjs-core.yml @@ -17,5 +17,5 @@ createdAt: 2021-07-09 package: registry: npm name: '@opentelemetry/instrumentation-nestjs-core' - version: 0.40.0 + version: 0.41.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-nestjs.yml b/data/registry/instrumentation-js-nestjs.yml index 66f578d12088..0ac98f06c7d0 100644 --- a/data/registry/instrumentation-js-nestjs.yml +++ b/data/registry/instrumentation-js-nestjs.yml @@ -16,5 +16,5 @@ createdAt: 2021-07-09 package: registry: npm name: '@opentelemetry/instrumentation-nestjs-core' - version: 0.40.0 + version: 0.41.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-net.yml b/data/registry/instrumentation-js-net.yml index 8d1f1ed2f9da..a6a78ff14593 100644 --- a/data/registry/instrumentation-js-net.yml +++ b/data/registry/instrumentation-js-net.yml @@ -14,5 +14,5 @@ createdAt: 2021-07-08 package: registry: npm name: '@opentelemetry/instrumentation-net' - version: 0.39.0 + version: 0.40.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-pg.yml b/data/registry/instrumentation-js-pg.yml index 326d9a83aa5a..5a4dee7c7b8e 100644 --- a/data/registry/instrumentation-js-pg.yml +++ b/data/registry/instrumentation-js-pg.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-pg' - version: 0.46.0 + version: 0.47.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-pillarjs-router.yml b/data/registry/instrumentation-js-pillarjs-router.yml index 5ace3a140b26..29cf8268ed5c 100644 --- a/data/registry/instrumentation-js-pillarjs-router.yml +++ b/data/registry/instrumentation-js-pillarjs-router.yml @@ -20,5 +20,5 @@ createdAt: 2021-07-08 package: registry: npm name: '@opentelemetry/instrumentation-restify' - version: 0.41.0 + version: 0.42.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-pino.yml b/data/registry/instrumentation-js-pino.yml index b4f2e853d380..8e0c00dca658 100644 --- a/data/registry/instrumentation-js-pino.yml +++ b/data/registry/instrumentation-js-pino.yml @@ -16,5 +16,5 @@ createdAt: 2021-07-08 package: registry: npm name: '@opentelemetry/instrumentation-pino' - version: 0.42.0 + version: 0.43.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-postgres.yml b/data/registry/instrumentation-js-postgres.yml index 013bfcb29413..baa1c11c5aab 100644 --- a/data/registry/instrumentation-js-postgres.yml +++ b/data/registry/instrumentation-js-postgres.yml @@ -17,5 +17,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-pg' - version: 0.46.0 + version: 0.47.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-redis-4.yml b/data/registry/instrumentation-js-redis-4.yml index 9f2c491ad783..901bc073a903 100644 --- a/data/registry/instrumentation-js-redis-4.yml +++ b/data/registry/instrumentation-js-redis-4.yml @@ -16,5 +16,5 @@ createdAt: 2022-10-27 package: registry: npm name: '@opentelemetry/instrumentation-redis-4' - version: 0.42.1 + version: 0.43.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-redis.yml b/data/registry/instrumentation-js-redis.yml index ee453a6923dc..a56a3460821c 100644 --- a/data/registry/instrumentation-js-redis.yml +++ b/data/registry/instrumentation-js-redis.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-redis' - version: 0.42.0 + version: 0.43.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-restify.yml b/data/registry/instrumentation-js-restify.yml index abfd85006d6f..bd63f02c2b20 100644 --- a/data/registry/instrumentation-js-restify.yml +++ b/data/registry/instrumentation-js-restify.yml @@ -15,5 +15,5 @@ createdAt: 2021-07-08 package: registry: npm name: '@opentelemetry/instrumentation-restify' - version: 0.41.0 + version: 0.42.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-router.yml b/data/registry/instrumentation-js-router.yml index 70a93f53ac7c..16c047e1bf62 100644 --- a/data/registry/instrumentation-js-router.yml +++ b/data/registry/instrumentation-js-router.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-router' - version: 0.40.0 + version: 0.41.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-runtimenode.yml b/data/registry/instrumentation-js-runtimenode.yml index f490d56e072b..52a18b6df3eb 100644 --- a/data/registry/instrumentation-js-runtimenode.yml +++ b/data/registry/instrumentation-js-runtimenode.yml @@ -19,5 +19,5 @@ createdAt: 2024-04-18 package: registry: npm name: '@opentelemetry/instrumentation-runtime-node' - version: 0.7.0 + version: 0.8.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-socket.io.yml b/data/registry/instrumentation-js-socket.io.yml index c19c6087b6cb..31469d9ba5a5 100644 --- a/data/registry/instrumentation-js-socket.io.yml +++ b/data/registry/instrumentation-js-socket.io.yml @@ -16,5 +16,5 @@ createdAt: 2022-10-27 package: registry: npm name: '@opentelemetry/instrumentation-socket.io' - version: 0.42.0 + version: 0.43.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-tedious.yml b/data/registry/instrumentation-js-tedious.yml index 3d9e2131326d..114408f4b404 100644 --- a/data/registry/instrumentation-js-tedious.yml +++ b/data/registry/instrumentation-js-tedious.yml @@ -16,5 +16,5 @@ createdAt: 2022-10-27 package: registry: npm name: '@opentelemetry/instrumentation-tedious' - version: 0.14.0 + version: 0.15.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-undici.yml b/data/registry/instrumentation-js-undici.yml index abb5a08ed9ce..9631b68e4ea5 100644 --- a/data/registry/instrumentation-js-undici.yml +++ b/data/registry/instrumentation-js-undici.yml @@ -19,5 +19,5 @@ createdAt: 2024-04-18 package: registry: npm name: '@opentelemetry/instrumentation-undici' - version: 0.6.0 + version: 0.7.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-user-interaction.yml b/data/registry/instrumentation-js-user-interaction.yml index 703f01086d39..5f991e06fcd5 100644 --- a/data/registry/instrumentation-js-user-interaction.yml +++ b/data/registry/instrumentation-js-user-interaction.yml @@ -14,5 +14,5 @@ createdAt: 2020-11-09 package: registry: npm name: '@opentelemetry/instrumentation-user-interaction' - version: 0.40.0 + version: 0.41.0 isFirstParty: false diff --git a/data/registry/instrumentation-js-winston.yml b/data/registry/instrumentation-js-winston.yml index f29f3ad2f63f..070873c2f1d6 100644 --- a/data/registry/instrumentation-js-winston.yml +++ b/data/registry/instrumentation-js-winston.yml @@ -16,5 +16,5 @@ createdAt: 2021-07-08 package: registry: npm name: '@opentelemetry/instrumentation-winston' - version: 0.40.0 + version: 0.41.0 isFirstParty: false diff --git a/data/registry/resource-detector-js-alibabacloud.yml b/data/registry/resource-detector-js-alibabacloud.yml index 017fa0620752..71c4a9fb792d 100644 --- a/data/registry/resource-detector-js-alibabacloud.yml +++ b/data/registry/resource-detector-js-alibabacloud.yml @@ -16,4 +16,4 @@ createdAt: 2022-12-07 package: registry: npm name: '@opentelemetry/resource-detector-alibaba-cloud' - version: 0.29.3 + version: 0.29.4 diff --git a/data/registry/resource-detector-js-aws.yml b/data/registry/resource-detector-js-aws.yml index de31d958789e..7f873a68e493 100644 --- a/data/registry/resource-detector-js-aws.yml +++ b/data/registry/resource-detector-js-aws.yml @@ -15,4 +15,4 @@ createdAt: 2022-12-07 package: registry: npm name: '@opentelemetry/resource-detector-aws' - version: 1.6.2 + version: 1.7.0 diff --git a/data/registry/resource-detector-js-azure.yml b/data/registry/resource-detector-js-azure.yml index c68c198b4d58..95d2a252fd51 100644 --- a/data/registry/resource-detector-js-azure.yml +++ b/data/registry/resource-detector-js-azure.yml @@ -15,4 +15,4 @@ createdAt: 2022-12-07 package: registry: npm name: '@opentelemetry/resource-detector-azure' - version: 0.2.11 + version: 0.2.12 diff --git a/data/registry/resource-detector-js-container.yml b/data/registry/resource-detector-js-container.yml index 45550cea1b6a..f5180bccaabc 100644 --- a/data/registry/resource-detector-js-container.yml +++ b/data/registry/resource-detector-js-container.yml @@ -17,4 +17,4 @@ createdAt: 2022-12-07 package: registry: npm name: '@opentelemetry/resource-detector-container' - version: 0.4.4 + version: 0.5.0 diff --git a/data/registry/resource-detector-js-gcp.yml b/data/registry/resource-detector-js-gcp.yml index e4193857d08b..a213d8d17d98 100644 --- a/data/registry/resource-detector-js-gcp.yml +++ b/data/registry/resource-detector-js-gcp.yml @@ -15,4 +15,4 @@ createdAt: 2022-12-07 package: registry: npm name: '@opentelemetry/resource-detector-gcp' - version: 0.29.12 + version: 0.29.13 diff --git a/data/registry/resource-detector-js-instana.yml b/data/registry/resource-detector-js-instana.yml index d64864f80b94..4fddf94f3241 100644 --- a/data/registry/resource-detector-js-instana.yml +++ b/data/registry/resource-detector-js-instana.yml @@ -17,4 +17,4 @@ createdAt: 2022-12-07 package: registry: npm name: '@opentelemetry/resource-detector-instana' - version: 0.13.0 + version: 0.14.0 From 333077737f4745fd3db1464e2390d1c7ebf9ecb5 Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Tue, 29 Oct 2024 14:40:46 -0500 Subject: [PATCH 47/76] Auto-update registry versions (433ebfa42cbde06abcad5071d1f266e20d7ab9d1) (#5487) Co-authored-by: Phillip Carter From c9cbae45871ef7e32af54b1cb630a229fc7abe23 Mon Sep 17 00:00:00 2001 From: Daniel Gomez Blanco Date: Tue, 29 Oct 2024 20:09:04 +0000 Subject: [PATCH 48/76] Add blogpost announcing Community Awards (#5482) Co-authored-by: Tiffany Hrabusa <30397949+tiffany76@users.noreply.github.com> Co-authored-by: Austin Parker Co-authored-by: Patrice Chalin Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> --- .../en/announcements/2024-community-awards.md | 9 ++++++ content/en/blog/2024/community-awards.md | 28 +++++++++++++++++++ static/refcache.json | 4 +++ 3 files changed, 41 insertions(+) create mode 100644 content/en/announcements/2024-community-awards.md create mode 100644 content/en/blog/2024/community-awards.md diff --git a/content/en/announcements/2024-community-awards.md b/content/en/announcements/2024-community-awards.md new file mode 100644 index 000000000000..eaf465e9499b --- /dev/null +++ b/content/en/announcements/2024-community-awards.md @@ -0,0 +1,9 @@ +--- +title: OpenTelemetry Community Awards +date: 2024-10-29 +expiryDate: 2024-11-08 +--- + + +[**2024 OpenTelemetry Community Awards**](/blog/2024/community-awards/) +nominations are open! diff --git a/content/en/blog/2024/community-awards.md b/content/en/blog/2024/community-awards.md new file mode 100644 index 000000000000..e1fc9b54de94 --- /dev/null +++ b/content/en/blog/2024/community-awards.md @@ -0,0 +1,28 @@ +--- +title: 2024 OpenTelemetry Community Awards +linkTitle: OpenTelemetry Community Awards +date: 2024-10-29 +author: OpenTelemetry Governance Committee +--- + +OpenTelemetry is a community-driven project, fueled by a group of awesome humans +who are actively revolutionizing the field of observability with their +contributions. Whether it's through code, documentation, project management, +outreach, adoption, or simply helping others answer technical questions on our +[CNCF Slack](https://slack.cncf.io/), we want to recognize these contributions +and the people behind them -- because we're all human, and we all like that warm +fuzzy feeling of appreciation. + +We are thrilled to announce the first-ever **OpenTelemetry Community Awards**! +This is your chance to nominate individuals who have made a notable impact to +OpenTelemetry over the past year. _Everyone_ can nominate _anyone_ in the +community, be they a contributor, end-user, or community member. + +Submit nominations using +[this Google Form](https://forms.gle/ioqFNmDhKNYYAtRs7). + +Although we require sign-in to ensure only one form submission per person, +nominations are completely anonymous. You can nominate up to five people per +submission, and nominations will be open **until midnight UTC on November 8th, +2024**. Winners will be announced at KubeCon + CloudNativeCon North +America 2024. diff --git a/static/refcache.json b/static/refcache.json index 0871d6726e69..26b8eb37e7ed 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -3727,6 +3727,10 @@ "StatusCode": 200, "LastSeen": "2024-05-01T16:48:59.737619-04:00" }, + "https://forms.gle/ioqFNmDhKNYYAtRs7": { + "StatusCode": 200, + "LastSeen": "2024-10-25T10:27:00.363272+01:00" + }, "https://forms.gle/mEDWyn6G7iCe4bvJ7": { "StatusCode": 200, "LastSeen": "2024-01-18T19:02:03.877372-05:00" From 11278691e38f7fb3816f0ef159947bc2d1c7c544 Mon Sep 17 00:00:00 2001 From: shuiyisong <113876041+shuiyisong@users.noreply.github.com> Date: Wed, 30 Oct 2024 16:19:36 +0800 Subject: [PATCH 49/76] Update GreptimeDB URL in vendor list (#5497) --- data/ecosystem/vendors.yaml | 2 +- static/refcache.json | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/data/ecosystem/vendors.yaml b/data/ecosystem/vendors.yaml index fc3e626255b8..4e38e04beec3 100644 --- a/data/ecosystem/vendors.yaml +++ b/data/ecosystem/vendors.yaml @@ -380,7 +380,7 @@ commercial: true - name: GreptimeDB nativeOTLP: true - url: https://docs.greptime.com/user-guide/clients/otlp + url: https://docs.greptime.com/user-guide/ingest-data/for-observerbility/opentelemetry contact: info@greptime.com oss: true commercial: true diff --git a/static/refcache.json b/static/refcache.json index 26b8eb37e7ed..4b1a17a2cbfe 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -2747,6 +2747,10 @@ "StatusCode": 200, "LastSeen": "2024-01-30T15:24:43.194115-05:00" }, + "https://docs.greptime.com/user-guide/ingest-data/for-observerbility/opentelemetry": { + "StatusCode": 200, + "LastSeen": "2024-10-29T16:21:59.273877+08:00" + }, "https://docs.groundcover.com/integrations/data-sources/opentelemetry/traces-and-logs": { "StatusCode": 200, "LastSeen": "2024-08-18T14:44:07.000049769Z" From 340410f233e8cd5d1ab6281728fae08b77d5c75a Mon Sep 17 00:00:00 2001 From: Bastian Krol Date: Wed, 30 Oct 2024 09:20:32 +0100 Subject: [PATCH 50/76] add Dash0 to vendor list (#5488) --- data/ecosystem/vendors.yaml | 6 ++++++ static/refcache.json | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/data/ecosystem/vendors.yaml b/data/ecosystem/vendors.yaml index 4e38e04beec3..146c9e458f29 100644 --- a/data/ecosystem/vendors.yaml +++ b/data/ecosystem/vendors.yaml @@ -90,6 +90,12 @@ contact: hello@cribl.io oss: false commercial: true +- name: Dash0 + nativeOTLP: true + url: https://www.dash0.com/ + contact: hi@dash0.com + oss: false + commercial: true - name: DaoCloud nativeOTLP: true url: https://docs.daocloud.io/en/insight/06UserGuide/01quickstart/otel/otel/ diff --git a/static/refcache.json b/static/refcache.json index 4b1a17a2cbfe..441cd85be88e 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -12691,6 +12691,10 @@ "StatusCode": 200, "LastSeen": "2024-01-18T19:06:23.804112-05:00" }, + "https://www.dash0.com/": { + "StatusCode": 200, + "LastSeen": "2024-10-28T11:30:33.016936+01:00" + }, "https://www.datadoghq.com/blog/engineering/php-8-observability-baked-right-in/": { "StatusCode": 206, "LastSeen": "2024-01-30T05:18:29.107161-05:00" From 1ad2dbef9aa7e8d90c46784adcc6ca6d17f52fae Mon Sep 17 00:00:00 2001 From: Andrzej Stencel Date: Wed, 30 Oct 2024 12:02:40 +0100 Subject: [PATCH 51/76] Update collector provider versions for v0.112.0 (#5501) --- content/en/docs/collector/custom-collector.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/en/docs/collector/custom-collector.md b/content/en/docs/collector/custom-collector.md index 5f2c874fc784..d88480e14f15 100644 --- a/content/en/docs/collector/custom-collector.md +++ b/content/en/docs/collector/custom-collector.md @@ -166,11 +166,11 @@ receivers: go.opentelemetry.io/collector/receiver/otlpreceiver {{% version-from-registry collector-receiver-otlp %}} providers: - - gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v1.17.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v1.17.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v1.17.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.17.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.17.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v1.18.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v1.18.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v1.18.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.18.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.18.0 ``` {{% alert color="primary" title="Tip" %}} From 7c4da874adfdf17c7aaeae29719de794633e43bf Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Wed, 30 Oct 2024 08:01:25 -0500 Subject: [PATCH 52/76] Update opentelemetry-collector-releases version to v0.112.0 (#5469) --- content/en/docs/collector/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/collector/_index.md b/content/en/docs/collector/_index.md index 4aeecbd40f26..6885af6eaab7 100644 --- a/content/en/docs/collector/_index.md +++ b/content/en/docs/collector/_index.md @@ -3,7 +3,7 @@ title: Collector description: Vendor-agnostic way to receive, process and export telemetry data. aliases: [collector/about] cascade: - vers: 0.111.0 + vers: 0.112.0 weight: 270 --- From f18e626e780cab04c54259ada990580d351a3c34 Mon Sep 17 00:00:00 2001 From: Martin Holman Date: Wed, 30 Oct 2024 06:01:54 -0700 Subject: [PATCH 53/76] Fix span start typo (#5365) --- content/en/docs/languages/swift/instrumentation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/languages/swift/instrumentation.md b/content/en/docs/languages/swift/instrumentation.md index 074981241bef..c4ccc47b8e4a 100644 --- a/content/en/docs/languages/swift/instrumentation.md +++ b/content/en/docs/languages/swift/instrumentation.md @@ -77,7 +77,7 @@ operation. Spans are the building blocks of Traces. To create a span use the span builder associated with the tracer: ```swift -let span = let builder = tracer.spanBuilder(spanName: "\(name)").startSpan() +let span = tracer.spanBuilder(spanName: "\(name)").startSpan() ... span.end() ``` From dd860905c55106478744f8cae2e64e3bf7b53b6e Mon Sep 17 00:00:00 2001 From: Erfan Derakhshani Date: Wed, 30 Oct 2024 16:44:08 +0330 Subject: [PATCH 54/76] Update libraries.md (#5465) --- content/en/docs/concepts/instrumentation/libraries.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/instrumentation/libraries.md b/content/en/docs/concepts/instrumentation/libraries.md index 3501730b343c..7fa645f6fdf1 100644 --- a/content/en/docs/concepts/instrumentation/libraries.md +++ b/content/en/docs/concepts/instrumentation/libraries.md @@ -341,7 +341,7 @@ There might be some exceptions where you don't need to propagate context: context propagation in addition to active spans. - Put spans (trace context) created by library in the context explicitly, document how to access it. - - Alow users to pass trace context in your context. + - Allow users to pass trace context in your context. - Within the library, propagate trace context explicitly. Active spans might change during callbacks. - Capture active context from users on the public API surface as soon as you From 266c5c88695a27977e67135b751502cc08c64394 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Thu, 31 Oct 2024 07:13:19 -0400 Subject: [PATCH 55/76] Update Node LTS + Hugo patch and other pkg vers (#5504) --- package.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index ca1aa7cd4a3b..530e10113633 100644 --- a/package.json +++ b/package.json @@ -118,16 +118,16 @@ "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", "autoprefixer": "^10.4.20", - "cspell": "^8.15.4", + "cspell": "^8.15.5", "gulp": "^5.0.0", - "hugo-extended": "0.136.2", + "hugo-extended": "0.136.5", "js-yaml": "^4.1.0", "markdown-link-check": "^3.12.2", - "markdownlint": "^0.35.0", + "markdownlint": "^0.36.1", "postcss-cli": "^11.0.0", "prettier": "^3.3.3", "require-dir": "^1.2.0", - "textlint": "^14.2.1", + "textlint": "^14.3.0", "textlint-filter-rule-allowlist": "^4.0.0", "textlint-filter-rule-comments": "^1.2.2", "textlint-rule-terminology": "^5.2.12", @@ -137,23 +137,23 @@ "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-web": "^0.42.0", - "@opentelemetry/context-zone": "^1.26.0", - "@opentelemetry/core": "^1.26.0", + "@opentelemetry/context-zone": "^1.27.0", + "@opentelemetry/core": "^1.27.0", "@opentelemetry/exporter-trace-otlp-http": "^0.54.0", "@opentelemetry/instrumentation": "^0.54.0", - "@opentelemetry/resources": "^1.26.0", - "@opentelemetry/sdk-trace-base": "^1.26.0", - "@opentelemetry/sdk-trace-web": "^1.26.0", + "@opentelemetry/resources": "^1.27.0", + "@opentelemetry/sdk-trace-base": "^1.27.0", + "@opentelemetry/sdk-trace-web": "^1.27.0", "@opentelemetry/semantic-conventions": "^1.27.0", "path": "^0.12.7" }, "optionalDependencies": { - "netlify-cli": "^17.37.1", - "npm-check-updates": "^17.1.4" + "netlify-cli": "^17.37.2", + "npm-check-updates": "^17.1.9" }, "enginesComment": "Ensure that engines.node value stays consistent with the project's .nvmrc", "engines": { - "node": "20.x" + "node": "22.x" }, "gitHubActionCacheKey": "2023-07-13 - change this key to force cache refresh", "private": true, From c1b29a81fe4e136e99bbd9ef19da7bcfb73c2609 Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Thu, 31 Oct 2024 13:45:25 -0500 Subject: [PATCH 56/76] Auto-update registry versions (f58ab8b839ad98aee6c9a5454652c99aa27b01ff) (#5506) --- data/registry/instrumentation-js-cerbos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/registry/instrumentation-js-cerbos.yml b/data/registry/instrumentation-js-cerbos.yml index ecaf0ebc7218..1f0017739da3 100644 --- a/data/registry/instrumentation-js-cerbos.yml +++ b/data/registry/instrumentation-js-cerbos.yml @@ -21,5 +21,5 @@ createdAt: 2023-09-13 package: name: '@cerbos/opentelemetry' registry: npm - version: 0.5.3 + version: 0.5.4 isFirstParty: true From 4487b3840aff95111e5015e46c9fc26bbe5c9da3 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Thu, 31 Oct 2024 16:02:02 -0400 Subject: [PATCH 57/76] [infra] Update docsy for fr (#5507) --- .gitmodules | 2 +- themes/docsy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 896a8818601b..819280234443 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "themes/docsy"] path = themes/docsy url = https://github.com/google/docsy.git - docsy-pin = v0.11.0 + docsy-pin = v0.11.0-2-g68aa7b3 docsy-note = "2024-04-01 Switching to google/docsy.git from cncf/docsy.git since we don't have any CNCF customizations." docsy-reminder = "Ensure that any tag referenced by `docsy-pin` is present in the remote repo (url), otherwise add (push) the tags to the repo." [submodule "content-modules/opentelemetry-specification"] diff --git a/themes/docsy b/themes/docsy index cf0c68f041da..68aa7b39fc81 160000 --- a/themes/docsy +++ b/themes/docsy @@ -1 +1 @@ -Subproject commit cf0c68f041daac066a0292d521461dbd092d7c31 +Subproject commit 68aa7b39fc81e2239f3984cacf4c7dc09e7d6b0f From 6a190e3d87050c917a6d77dfcdf3ee0a34016541 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Fri, 1 Nov 2024 11:21:28 -0400 Subject: [PATCH 58/76] [CI] htmltest config: sort files before processing (#5509) --- .htmltest.yml | 2 +- scripts/htmltest-config.pl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.htmltest.yml b/.htmltest.yml index 0d3a9386b8e2..bd55c60045d9 100644 --- a/.htmltest.yml +++ b/.htmltest.yml @@ -8,11 +8,11 @@ CheckMailto: false TestFilesConcurrently: true IgnoreDirs: # DO NOT EDIT! IgnoreDirs list is auto-generated from markdown file front matter. + - ^blog/(\d+/)?page/\d+ # TODO drop next line after https://github.com/open-telemetry/opentelemetry.io/issues/5423 is fixed for ja pages: - ^ja/docs/concepts/instrumentation/libraries/ # TODO drop next line after https://github.com/open-telemetry/opentelemetry.io/issues/5423 is fixed for pt pages: - ^pt/docs/concepts/instrumentation/libraries/ - - ^blog/(\d+/)?page/\d+ # DO NOT EDIT! IgnoreDirs list is auto-generated from markdown file front matter. IgnoreInternalURLs: # list of paths IgnoreURLs: # list of regexs of paths or URLs to be ignored diff --git a/scripts/htmltest-config.pl b/scripts/htmltest-config.pl index ebbf0d61a911..8e187b084079 100755 --- a/scripts/htmltest-config.pl +++ b/scripts/htmltest-config.pl @@ -15,7 +15,7 @@ sub main { sub collect_htmltest_config_from_front_matter { my ($ignore_dirs_ref, @files) = @_; - foreach my $file_path (@files) { + foreach my $file_path (sort @files) { my @htmltest_config = extract_htmltest_config($file_path); next unless @htmltest_config; push @$ignore_dirs_ref, @htmltest_config; From 4c5468f8d16434f25f335e1b45922ca0f4cec18f Mon Sep 17 00:00:00 2001 From: OpenTelemetry Bot <107717825+opentelemetrybot@users.noreply.github.com> Date: Sat, 2 Nov 2024 10:10:01 -0500 Subject: [PATCH 59/76] Auto-update registry versions (05d4efe64f5ab5f9f85c19a65bd26083b47f55d8) (#5510) --- data/registry/exporter-dotnet-inmemory.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/registry/exporter-dotnet-inmemory.yml b/data/registry/exporter-dotnet-inmemory.yml index 7c7e0a8208b2..07cf5e6fc115 100644 --- a/data/registry/exporter-dotnet-inmemory.yml +++ b/data/registry/exporter-dotnet-inmemory.yml @@ -17,4 +17,4 @@ createdAt: 2022-11-07 package: registry: nuget name: OpenTelemetry.Exporter.InMemory - version: 1.10.0-beta.1 + version: 1.10.0-rc.1 From f84f21206aa9d87789918a0ec4801f55020161a0 Mon Sep 17 00:00:00 2001 From: Ezzio Moreira Date: Sat, 2 Nov 2024 13:19:51 -0300 Subject: [PATCH 60/76] [pt] Add translations for content/pt/docs/concepts/instrumentation/_index.md (#5287) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marylia Gutierrez Co-authored-by: Emídio Neto <9735060+emdneto@users.noreply.github.com> Co-authored-by: Marylia Gutierrez --- .../docs/concepts/instrumentation/_index.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 content/pt/docs/concepts/instrumentation/_index.md diff --git a/content/pt/docs/concepts/instrumentation/_index.md b/content/pt/docs/concepts/instrumentation/_index.md new file mode 100644 index 000000000000..539373707905 --- /dev/null +++ b/content/pt/docs/concepts/instrumentation/_index.md @@ -0,0 +1,56 @@ +--- +title: Instrumentação +description: Como o OpenTelemetry facilita a instrumentação +weight: 15 +default_lang_commit: 82bd738d51426acb34e126b230a8a1281f193e3e +--- + +Para que um sistema seja observável, ele deve ser **instrumentado**: ou seja, o +código dos componentes do sistema deve emitir +[rastros](/docs/concepts/signals/traces/), +[métricas](/docs/concepts/signals/metrics/) e +[logs](/docs/concepts/signals/logs/). + +Com o OpenTelemetry, você pode instrumentar seu código de duas maneiras: + +1. [Soluções manuais](/docs/concepts/instrumentation/code-based) por meio das + [APIs e SDKs oficiais para a maioria das linguagens](/docs/languages/) +2. [Soluções sem código](/docs/concepts/instrumentation/zero-code/) + +As **soluções manuais** permitem obter uma visão mais aprofundada e telemetria +rica diretamente da sua aplicação. Possibilitando o uso da API OpenTelemetry +para gerar telemetria a partir da sua aplicação, atuando como um complemento +essencial para telemetria gerada pelas soluções sem código. + +As **soluções sem código** são ótimas para começar ou quando você não pode +modificar a aplicação da qual precisa extrair telemetria. Provendo telemetria +rica das bibliotecas que você utiliza e/ou do ambiente em que sua aplicação está +sendo executada. Outra forma de pensar nisso é que elas oferecem informações +sobre o que está acontecendo _nas bordas_ da sua aplicação. + +Você pode utilizar ambas as soluções simultaneamente. + +## Benefícios adicionais do OpenTelemetry + +O OpenTelemetry oferece mais do que apenas soluções de telemetria manuais e sem +código. Os seguintes recursos também fazem parte do OpenTelemetry: + +- Bibliotecas podem utilizar a API OpenTelemetry como dependência, sem impactar + as aplicações que usam essa biblioteca, a menos que o SDK do OpenTelemetry + seja importado. +- Para cada [sinal](/docs/concepts/signals) (rastros, métricas, logs), você tem + à disposição diversos métodos para criá-los, processá-los e exportá-los. +- Com a [propagação de contexto](/docs/concepts/context-propagation) integrada + nas implementações, você pode correlacionar sinais, independentemente de onde + eles são gerados. +- [Recursos](/docs/concepts/resources) e + [Escopo de instrumentação](/docs/concepts/instrumentation-scope) permitem + agrupar sinais por diferentes entidades, como + [host](/docs/specs/semconv/resource/host/), + [sistema operacional](/docs/specs/semconv/resource/os/) ou + [cluster K8s](/docs/specs/semconv/resource/k8s/#cluster). +- Cada implementação específica de linguagem da API e SDK segue os requisitos e + expectativas da [especificação OpenTelemetry](/docs/specs/otel/). +- As [Convenções Semânticas](/docs/concepts/semantic-conventions) fornecem um + esquema de nomenclatura comum que pode ser usado para padronização em + diferentes bases de código e plataformas. From 4ebb2ee0de7abd26cde31768d45f9576735e9f47 Mon Sep 17 00:00:00 2001 From: Lindemberg-Chagas <113239054+Lindemberg-Chagas@users.noreply.github.com> Date: Sat, 2 Nov 2024 13:26:04 -0300 Subject: [PATCH 61/76] [pt-br] Localize content/pt/docs/concepts/components.md (#5396) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ezzio Moreira Co-authored-by: Emídio Neto <9735060+emdneto@users.noreply.github.com> Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Severin Neumann --- content/pt/docs/concepts/components.md | 143 +++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 content/pt/docs/concepts/components.md diff --git a/content/pt/docs/concepts/components.md b/content/pt/docs/concepts/components.md new file mode 100644 index 000000000000..b7a74b6823b0 --- /dev/null +++ b/content/pt/docs/concepts/components.md @@ -0,0 +1,143 @@ +--- +title: Componentes +description: Os principais componentes que compõem o OpenTelemetry +weight: 20 +default_lang_commit: 2f34c456ab38b4d3502cd07bc36fa1455d4ef875 +--- + +O OpenTelemetry é atualmente composto por vários componentes principais: + +- [Especificação](#specification) +- [Collector](#collector) +- [Implementações de API e SDK específicas](#language-specific-api--sdk-implementations) + - [Bibliotecas de Instrumentação](#instrumentation-libraries) + - [Exporters](#exporters) + - [Instrumentação sem código](#zero-code-instrumentation) + - [Detectores de Recursos](#resource-detectors) + - [Propagadores entre Serviços](#cross-service-propagators) + - [Amostragens](#samplers) +- [Kubernetes Operator](#kubernetes-operator) +- [Função como Serviço](#function-as-a-service-assets) + +O OpenTelemetry permite que você substitua o uso de SDKs ou ferramentas +específicas para gerar e exportar dados de telemetria. + +## Especificação {#specification} + +Descreve os requisitos e expectativas entre diferentes linguagens para todas as +implementações. Além de uma definição de termos, a especificação define o +seguinte: + +- **API:** Define tipos de dados e operações para gerar e correlacionar dados de + rastreamento, métricas e logs. +- **SDK:** Define os requisitos para implementação específica de linguagem da + API. São definidos aqui também os conceitos de configuração, processamento e + exportação de dados. +- **Data:** Define o Protocolo OpenTelemetry (OTLP) e as convenções semânticas + independentes de fornecedores que um backend de telemetria pode suportar. + +Para mais informações, consulte [especificação](/docs/specs/). + +## Collector + +O Collector é um proxy para qualquer sistema de telemetria que pode receber..., +processar e exportar dados de telemetria. Ele suporta o recebimento de dados de +telemetria em vários formatos. (Por exemplo, OTLP, Jaeger, Prometheus, bem como +muitas outras ferramentas ) .e enviar dados para um ou mais sistema de +telemetria. Ele também suporta o processamento e a filtragem de dados de +telemetria antes de serem exportados. + +Para mais informações, consulte [Coletor](/docs/collector/). + +## Implementações de API e SDK específicas {#language-specific-api--sdk-implementations} + +O OpenTelemetry também possui SDKs para as linguagens mais populares do mercado +e permitem usar a API do OpenTelemetry para gerar dados de telemetria e exportar +esses dados para qualquer sistema de telemetria. Esses SDKs também permitem que +você utilize qualquer biblioteca e ou frameworks dessas linguagens da +instrumentação manual. + +Para mais informações, consulte +[Instrumentando](/docs/concepts/instrumentation/). + +### Bibliotecas de instrumentação {#instrumentation-libraries} + +O OpenTelemetry suporta um grande número de componentes que geram dados de +telemetria relevantes a partir de bibliotecas e frameworks populares para as +linguagens suportadas. Por exemplo, requisições HTTP de entrada e saída de uma +biblioteca HTTP geram dados sobre essas requisições. Um objetivo aspiracional do +OpenTelemetry é que todas as bibliotecas populares sejam construídas para serem +observáveis por padrão, de modo que dependências separadas não sejam +necessárias. + +Para mais informações, consulte +[Bibliotecas de instrumentação](/docs/concepts/instrumentation/libraries/). + +### Exporters + +{{% docs/languages/exporters/intro %}} + +### Instrumentação sem código {#zero-code-instrumentation} + +O OpenTelemetry possibilita essa forma de instrumentar sua aplicação sem alterar +seu código-fonte. Embora o mecanismo dependa da linguagem, a instrumentação sem +código adiciona as capacidades da API e do SDK do OpenTelemetry à sua aplicação. +Além disso, pode adicionar um conjunto de bibliotecas de instrumentação e +dependências do exportador. + +Para mais informações, consulte +[Instrumentação sem código](/docs/concepts/instrumentation/zero-code/). + +### Detectores de recursos {#resource-detectors} + +Um [recurso](/docs/concepts/resources/) representa a entidade que produz +telemetria como atributos de recurso. Por exemplo, um processo que produz +telemetria que está sendo executado em um contêiner no Kubernetes tem um nome de +Pod, um namespace e possivelmente um nome de implantação. Você pode incluir +todos esses atributos no recurso. As implementações específicas de linguagem do +OpenTelemetry fornecem detecção de recursos a partir da variável de ambiente +`OTEL_RESOURCE_ATTRIBUTES` e para muitas entidades comuns, como tempo de +execução do processo, serviço, host ou sistema operacional. + +Para mais informações, consulte [Recursos](/docs/concepts/resources/). + +### Propagadores entre serviços {#cross-service-propagators} + +A propagação é o mecanismo que move dados entre serviços e processos. Embora não +se limite ao rastreamento, a propagação permite que os rastros construam +informações sobre um sistema através de serviços que estão distribuídos +arbitrariamente entre limites de processos e redes. + +Na grande maioria dos casos de uso, a propagação de contexto ocorre por meio de +bibliotecas de instrumentação. Se for necessário, você pode usar propagadores +manualmente para serializar e desserializar aspectos como o contexto de um +trecho e a [bagagem](/docs/concepts/signals/baggage/). + +### Amostragem {#samplers} + +A amostragem é um processo que restringe a quantidade de rastros que são gerados +por um sistema. Cada implementação específica de linguagem do OpenTelemetry +oferece [amostradores pela cabeça](/docs/concepts/sampling/#head-sampling). +[Amostragem](/docs/concepts/sampling/#head-sampling). + +Para mais informações, consulte [Amostragem](/docs/concepts/sampling). + +## Operador Kubernetes {#kubernetes-operator} + +O OpenTelemetry Operator é a implementação de um Operador Kubernetes. O operador +gerencia o OpenTelemetry Collector e a instrumentação sem código das cargas de +trabalho que utilizam OpenTelemetry. + +Para mais informações, consulte +[Kubernetes Operator](/docs/kubernetes/operator/). + +## Função como Serviço {#function-as-a-service-assets} + +O OpenTelemetry oferece vários métodos de monitoramento de Function-as-a-Service +fornecidos por diferentes provedores de nuvem. A comunidade OpenTelemetry +atualmente disponibiliza camadas Lambda pré-construídas, capazes de realizar +instrumentação sem código na sua aplicação, bem como a opção de uma camada +Lambda do Coletor independente, que pode ser usada ao instrumentar aplicações +manualmente ou automaticamente. + +Para mais informações, consulte [Função como Serviço](/docs/faas/). From 90a4c7428d0f4b2bbd95b3279fca57c71c327964 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Sat, 2 Nov 2024 12:32:39 -0400 Subject: [PATCH 62/76] [i18n] Mention spell checker requirement for new localizations (#5515) --- content/en/docs/contributing/localization.md | 31 +++++++++++++------- static/refcache.json | 12 ++++++++ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/content/en/docs/contributing/localization.md b/content/en/docs/contributing/localization.md index 2d9d2e55673e..615669b7ef09 100644 --- a/content/en/docs/contributing/localization.md +++ b/content/en/docs/contributing/localization.md @@ -235,22 +235,30 @@ For more details about the script, run `npm run check:i18n -- -h`. To start a new localization for the OpenTelemetry website, [raise an issue](https://github.com/open-telemetry/opentelemetry.io/issues/) to share your interest to contribute. Tag all other individuals that are willing to -write and review translations in the language you want to add. You need at least -two potential contributors, three would be ideal. Include the following task +write and review translations in the language you want to add. **You need at +least two potential contributors**, ideally three. Include the following task list in your issue as well: ```markdown -- [ ] List at least 2 contributors for the new language: `<@gitHubHandle1>`, - `<@gitHubHandle2>`, ... -- [ ] Localize index page to `` -- [ ] Create an issue label for `lang:` -- [ ] Create org-level group for `` approvers -- [ ] Update components owners for `content/` +- [ ] Contributors for the new language: @GITHUB_HANDLE1, @GITHUB_HANDLE2, ... +- [ ] Localize site homepage to YOUR_LANGUAGE_NAME +- [ ] Create an issue label for `lang:LANG_ID` +- [ ] Create org-level group for `LANG_ID` approvers +- [ ] Update components owners for `content/LANG_ID` +- [ ] Set up spell checking, if a cSpell dictionary is available ``` -For the `` use the -[ISO 639-1 code](https://en.wikipedia.org/wiki/ISO_639-1) for the language you -want to add. +Notes: + +- For `LANG_ID`, use an official + [ISO 639-1 code](https://en.wikipedia.org/wiki/ISO_639-1) for the language you + want to add. +- Look for + [cSpell dictionaries](https://github.com/streetsidesoftware/cspell-dicts) + available as NPM packages + [@cspell/dict-LANG_ID](https://www.npmjs.com/search?q=%40cspell%2Fdict). If a + dictionary isn't available for your dialect or region, choose the closest + region. For an example of how to set this up, see [PR #5386]. After you created that issue and have the required amount of contributors, maintainers will ask you to provide a pull request with a translation of the @@ -279,3 +287,4 @@ if you are an approver already. [main]: https://github.com/open-telemetry/opentelemetry.io/commits/main/ [multilingual framework]: https://gohugo.io/content-management/multilingual/ +[PR #5386]: https://github.com/open-telemetry/opentelemetry.io/pull/5386/files diff --git a/static/refcache.json b/static/refcache.json index 441cd85be88e..3ca2176ed8e5 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -7271,6 +7271,10 @@ "StatusCode": 200, "LastSeen": "2024-01-30T15:26:01.154768-05:00" }, + "https://github.com/open-telemetry/opentelemetry.io/pull/5386/files": { + "StatusCode": 200, + "LastSeen": "2024-11-02T12:26:48.450866-04:00" + }, "https://github.com/open-telemetry/opentelemetry.io/pulls": { "StatusCode": 200, "LastSeen": "2024-01-30T16:15:25.833527-05:00" @@ -7843,6 +7847,10 @@ "StatusCode": 200, "LastSeen": "2024-02-15T11:30:50.628118+01:00" }, + "https://github.com/streetsidesoftware/cspell-dicts": { + "StatusCode": 200, + "LastSeen": "2024-11-02T12:26:45.305184-04:00" + }, "https://github.com/strimzi": { "StatusCode": 200, "LastSeen": "2024-01-18T20:05:40.859417-05:00" @@ -13403,6 +13411,10 @@ "StatusCode": 200, "LastSeen": "2024-01-18T19:55:41.775458-05:00" }, + "https://www.npmjs.com/search": { + "StatusCode": 200, + "LastSeen": "2024-11-02T12:26:46.909401-04:00" + }, "https://www.nuget.org/packages/": { "StatusCode": 200, "LastSeen": "2024-01-30T15:25:18.124486-05:00" From 87e2eda73d2df5e1d5038835b71c6978b8652c64 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Sat, 2 Nov 2024 13:01:16 -0400 Subject: [PATCH 63/76] [zh] Fix misnamed blog section (#5514) --- content/zh/{blogs => blog}/2024/_index.md | 0 content/zh/{blogs => blog}/2024/docs-localized.md | 0 content/zh/blog/_index.md | 10 ++++++++++ content/zh/blogs/_index.md | 8 -------- 4 files changed, 10 insertions(+), 8 deletions(-) rename content/zh/{blogs => blog}/2024/_index.md (100%) rename content/zh/{blogs => blog}/2024/docs-localized.md (100%) create mode 100644 content/zh/blog/_index.md delete mode 100644 content/zh/blogs/_index.md diff --git a/content/zh/blogs/2024/_index.md b/content/zh/blog/2024/_index.md similarity index 100% rename from content/zh/blogs/2024/_index.md rename to content/zh/blog/2024/_index.md diff --git a/content/zh/blogs/2024/docs-localized.md b/content/zh/blog/2024/docs-localized.md similarity index 100% rename from content/zh/blogs/2024/docs-localized.md rename to content/zh/blog/2024/docs-localized.md diff --git a/content/zh/blog/_index.md b/content/zh/blog/_index.md new file mode 100644 index 000000000000..74a812f4909b --- /dev/null +++ b/content/zh/blog/_index.md @@ -0,0 +1,10 @@ +--- +title: 博客 +menu: { main: { weight: 50 } } +redirects: [{ from: '', to: '2024/ 301!' }] +outputs: [HTML, RSS] +htmltest: + IgnoreDirs: + - ^blog/(\d+/)?page/\d+ +default_lang_commit: 4c5468f8d16434f25f335e1b45922ca0f4cec18f +--- diff --git a/content/zh/blogs/_index.md b/content/zh/blogs/_index.md deleted file mode 100644 index 00f668f1f558..000000000000 --- a/content/zh/blogs/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: 博客 -menu: - main: { weight: 50 } -redirects: [{ from: '', to: '2024/ 301!' }] -outputs: [HTML, RSS] -default_lang_commit: aca2e07f0d3a6 ---- From 7f58ca6f134dc0e3b9e89c6c931147af9125fc09 Mon Sep 17 00:00:00 2001 From: Miguel Luna <39376769+mlunadia@users.noreply.github.com> Date: Sat, 2 Nov 2024 18:30:44 +0000 Subject: [PATCH 64/76] Update es-palabras.txt (#5505) --- .cspell/es-palabras.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.cspell/es-palabras.txt b/.cspell/es-palabras.txt index 8d062d7535b9..a6f26c4b633b 100644 --- a/.cspell/es-palabras.txt +++ b/.cspell/es-palabras.txt @@ -13,3 +13,4 @@ deserializar Muestreadores muestreadores monitoreo +multilenguaje From 614d8179254a558333551a6e2dbf8a78df9a70b2 Mon Sep 17 00:00:00 2001 From: ChrisTineo Date: Sat, 2 Nov 2024 14:42:48 -0400 Subject: [PATCH 65/76] feat: [es] Create /docs/contributing/pull-requests.md (#5502) Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Pablo Baeyens Co-authored-by: Fabrizio Ferri-Benedetti --- content/es/docs/contributing/pull-requests.md | 512 ++++++++++++++++++ static/refcache.json | 4 + 2 files changed, 516 insertions(+) create mode 100644 content/es/docs/contributing/pull-requests.md diff --git a/content/es/docs/contributing/pull-requests.md b/content/es/docs/contributing/pull-requests.md new file mode 100644 index 000000000000..624db9e6e20a --- /dev/null +++ b/content/es/docs/contributing/pull-requests.md @@ -0,0 +1,512 @@ +--- +title: Agregar nuevo contenido +description: + Aprende a agregar contenido nuevo utilizando la interfaz de GitHub o desde tu + editor de código. +weight: 2 +default_lang_commit: f724c15be360e5059fb89e696d9a5cc8d00496f6 +cSpell:ignore: aplícala vincúlalos solucionándolas +--- + +Para contribuir con nuevas páginas de contenido o mejorar las páginas de +contenido existentes, abre un Pull Request (PR): + +- Si tu cambio es pequeño, o no estás familiarizado con Git, lee + [Editar con GitHub](#changes-using-github) para aprender a editar la página + desde la interfaz de GitHub. +- Si tu cambio es más complejo, lee + [Editar desde una rama local](#fork-the-repo) para aprender cómo realizar + cambios desde tu editor de código. + +{{% alert title="Consejo" %}} + +Convierte tu Pull Request en borrador para indicar que el contenido aún no está +listo para su revisión. Los miembros aún pueden comentar o realizar revisiones +de alto nivel, aunque no revisarán el contenido en su totalidad hasta que +indiques que ya no es un borrador. + +{{% /alert %}} + +La siguiente figura ilustra cómo contribuir con nueva documentación. + +```mermaid +flowchart LR + subgraph first[Cómo contribuir] + direction TB + T[ ] -.- + B[Haz un fork al repo de GitHub] --- C[Escribe el nuevo contenido utilizando Markdown
y compila la página web en Hugo] + C --- D[Sube tus cambios locales al Fork] + D --- E[Abre un Pull Request] + E --- F[Firma el CNCF CLA] + end + +classDef grey fill:#dddddd,stroke:#ffffff,stroke-width:px,color:#000000, font-size:15px; +classDef white fill:#ffffff,stroke:#000,stroke-width:px,color:#000,font-weight:bold +classDef spacewhite fill:#ffffff,stroke:#fff,stroke-width:0px,color:#000 +class A,B,C,D,E,F,G,H grey +class S,T spacewhite +class first,second white +``` + +_Figura 1. Contribuyendo con nuevo contenido._ + +## Editar con GitHub {#changes-using-github} + +Si no tienes mucha experiencia con Git, aquí tienes un método más sencillo para +abrir un Pull Request. La Figura 2 describe los pasos y los detalles a +continuación. + +```mermaid +flowchart LR +A([fa:fa-user Nuevo
Contribuyente]) --- id1[(open-telemetry/opentelemetry.io
GitHub)] +subgraph tasks[Editando en GitHub] +direction TB + 0[ ] -.- + 1[Edita esta página] --> 2[Usa el editor de markdown en GitHub
para hacer tus cambios] + 2 --> 3[Agrega tus propuesta de cambios] + +end +subgraph tasks2[ ] +direction TB +4[Selecciona los archivos a cambiar] --> 5[Haz click en Crear Pull Request] --> 6[Llena los cambios en Abriendo un Pull Request] +6 --> 7[Haz click en Crear pull request] +end + +id1 --> tasks --> tasks2 + +classDef grey fill:#dddddd,stroke:#ffffff,stroke-width:px,color:#000000, font-size:15px; +classDef white fill:#ffffff,stroke:#000,stroke-width:px,color:#000,font-weight:bold +classDef k8s fill:#326ce5,stroke:#fff,stroke-width:1px,color:#fff; +classDef spacewhite fill:#ffffff,stroke:#fff,stroke-width:0px,color:#000 +class A,1,2,3,4,5,6,7 grey +class 0 spacewhite +class tasks,tasks2 white +class id1 k8s +``` + +_Figura 2. Pasos para abrir un Pull Request desde GitHub._ + +1. En la página de la tarea en GitHub, selecciona **Editar esta página** en el + panel de navegación en la derecha. + +1. Si no eres miembro de este proyecto, puedes hacer fork al repositorio de + GitHub. Selecciona **Fork**. + +1. Haz tus cambios desde el editor de GitHub. + +1. Llena el formulario de **Subir cambios**. + +1. Selecciona **Proponer cambios**. + +1. Selecciona **Crear pull request**. + +1. Cuando la pantalla de **Abrir un pull request** aparezca. Agrega una + descripción para que los supervisores puedan comprender tus cambios. + +1. Selecciona **Crear pull request**. + +Antes de hacer merge de tus cambios, Los miembros de la comunidad de +OpenTelemetry harán revisión de tus cambios y los aprobarán. + +Si un miembro te pide hacer cambios: + +1. Ve a la pestaña de **Archivos cambiados**. +1. Selecciona el icono del lápiz (Editar) en cualquiera de los archivos + cambiados en tu pull request. +1. Haz los cambios solicitados. Si hay alguna sugerencia de código, aplícala. +1. Haz commit de tus cambios. + +Cuando la revisión a terminado, un miembro de la comunidad hará merge de tu pull +request y tus cambios estarán disponibles al público en algunos minutos. + +{{% alert title="Tip" %}} + +Haz un comentario con `/fix:format` en tu pull request para realizar una +revisión automática de formateo de tus cambios. + +{{% /alert %}} + +## Editar desde una rama local {#fork-the-repo} + +Si eres un usuario más experimentado con Git, o tus cambios afectan varios +archivos a la vez, trabaja desde una rama local. + +Asegúrate de que tienes +[Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) instalado +en tu computadora. También puedes usar una interfaz gráfica de Git. + +La figura 3 muestra los pasos a seguir cuando se trabaja desde una rama local. A +continuación se detallan los pasos. + +```mermaid +flowchart LR +1[Haz fork del repositorio
open-telemetry/opentelemetry] --> 2[Crea una rama local
y agrega el remote upstream] +subgraph changes[Tus cambios] +direction TB +S[ ] -.- +3[Crea una rama
ejemplo: mi_nueva_rama] --> 3a[Haz los cambios
en un editor de texto] --> 4["Revisa tus cambios
localmente usando Hugo
(localhost:1313)"] +end +subgraph changes2[Haz Commit / Push] +direction TB +T[ ] -.- +5[Haz commit de tus cambios] --> 6[Haz push de tus cambios
origin/mi_nueva_rama] +end + +2 --> changes --> changes2 + +classDef grey fill:#dddddd,stroke:#ffffff,stroke-width:px,color:#000000, font-size:15px; +classDef white fill:#ffffff,stroke:#000,stroke-width:px,color:#000,font-weight:bold +classDef k8s fill:#326ce5,stroke:#fff,stroke-width:1px,color:#fff; +classDef spacewhite fill:#ffffff,stroke:#fff,stroke-width:0px,color:#000 +class 1,2,3,3a,4,5,6 grey +class S,T spacewhite +class changes,changes2 white +``` + +_Figura 3. Trabajando desde una rama local para hacer cambios._ + +### Haz fork al repositorio de opentelemetry.io + +1. Navega al repositorio + [`opentelemetry.io`](https://github.com/open-telemetry/opentelemetry.io/) . +1. Selecciona **Fork**. + +### Crea un clon local y agrega el upstream + +1. En tu terminal, clona tu fork y instala las dependencias: + + ```shell + git clone git@github.com:/opentelemetry.io.git + cd opentelemetry.io + npm install + ``` + +1. Coloca el repositorio de `open-telemetry/opentelemetry.io` como el `upstream` + remote: + + ```shell + git remote add upstream https://github.com/open-telemetry/opentelemetry.io.git + ``` + +1. Confirma los valores de los remotes `origin` y `upstream`: + + ```shell + git remote -v + ``` + + La salida debe ser similar a: + + ```none + origin git@github.com:/opentelemetry.io.git (fetch) + origin git@github.com:/opentelemetry.io.git (push) + upstream https://github.com/open-telemetry/opentelemetry.io.git (fetch) + upstream https://github.com/open-telemetry/opentelemetry.io.git (push) + ``` + +1. Actualiza los cambios de la rama `origin/main` en tu fork y la rama + `upstream/main` del repositorio original `open-telemetry/opentelemetry.io`: + + ```shell + git fetch origin + git fetch upstream + ``` + +Esto se asegura de que tu repositorio local está actualizado antes de que +empieces a hacer tus cambios localmente. Realiza esto frecuentemente para +mantener tu copia local sincronizada con la versión en el repositorio original. + +### Crea una rama + +1. Crea una rama. Este ejemplo asume que tomaremos de referencia la rama + `upstream/main`: + + ```shell + git checkout -b upstream/main + ``` + +1. Haz tus cambios en tu editor de código favorito. + +Usa el comando `git status` con regularidad para visualizar los archivos que has +cambiado. + +### Haz commit de tus cambios + +Cuando estás listo para subir tu pull request, haz commit de tus cambios. + +1. En tu repositorio local, revisa los cambios que quieres subir a GitHub: + + ```shell + git status + ``` + + La salida debe ser similar a: + + ```none + On branch + Your branch is up to date with 'origin/'. + + Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git checkout -- ..." to discard changes in working directory) + + modified: content/en/docs/nombre_de_tu_archivo.md + + no changes added to commit (use "git add" and/or "git commit -a") + ``` + +1. Agrega los archivos listados debajo de **Changes not staged for commit** al + commit: + + ```shell + git add + ``` + + Repite esto para cada uno de los archivos a subir. + +1. Luego de modificar todos los archivos, crea un commit: + + ```shell + git commit -m "Mensaje de tu commit" + ``` + +1. Sube los cambios a tu rama local: + + ```shell + git push origin + ``` + +1. Una vez tus cambios fueron subidos, GitHub te notifica si quieres crear un + Pull Request (PR) de tus cambios. + +### Abrir un Pull Request de tu Fork {#open-a-pr} + +La Figura 4 muestra los pasos para abrir un PR desde tu rama a +[opentelemetry.io](https://github.com/open-telemetry/opentelemetry.io). + +```mermaid +flowchart LR +subgraph first[ ] +direction TB +1[Abre el repositorio opentelemetry.io] --> 2[Haz click en nuevo Pull Request] +2 --> 3[Haz click en comparar entre forks] +3 --> 4[Selecciona tu fork
desde el drop-down] +end +subgraph second [ ] +direction TB +5[Selleciona tu rama desde
el menu de comparación] --> 6[Haz click en crear nuevo Pull Request] +6 --> 7[Agrega una descripción
a tu PR] +7 --> 8[Haz click en crear pull request] +end + +first --> second + +classDef grey fill:#dddddd,stroke:#ffffff,stroke-width:px,color:#000000, font-size:15px; +classDef white fill:#ffffff,stroke:#000,stroke-width:px,color:#000,font-weight:bold +class 1,2,3,4,5,6,7,8 grey +class first,second white +``` + +\_Figura 4. Pasos para abrir un PR desde tu fork a +[opentelemetry.io](https://github.com/open-telemetry/opentelemetry.io). + +1. En un navegador web, ve al repositorio + [`opentelemetry.io`](https://github.com/open-telemetry/opentelemetry.io) . +1. Selecciona **Nuevo Pull Request**. +1. Selecciona **Comparar ramas**. +1. En el menú desplegable **repositorio principal**, selecciona su rama. +1. En el menú desplegable **Comparar**, selecciona tu rama. +1. Selecciona **Crear Pull Request**. +1. Agrega una descripción para tu pull request: + + - **Título** (50 caracteres o menos): Resume la intención del cambio. + - **Descripción**: Describe el cambio con más detalle. + + - Si hay un problema de GitHub relacionado, incluye `Fixes #12345` o + `Closes #12345` en la descripción para que la automatización de GitHub + cierre el problema mencionado después de fusionar el PR. Si hay otros PR + relacionados, vincúlalos también. + - Si quieres asesoramiento sobre algo específico, incluye cualquier pregunta + que te gustaría que los miembros consideren en tu descripción. + +1 Haz click en el botón **Crear pull request**. + +Tu pull request estará disponible en +[pull Requests](https://github.com/open-telemetry/opentelemetry.io/pulls). + +Después de abrir un PR, GitHub ejecuta pruebas automatizadas e intenta +implementar una vista previa usando [Netlify](https://www.netlify.com/). + +- Si la compilación de Netlify falla, selecciona **Detalles** para obtener más + información. +- Si la compilación de Netlify se realiza correctamente, selecciona **Detalles** + para abrir una versión preparada del sitio web de OpenTelemetry con los + cambios aplicados. Así es como los revisores verifican sus cambios. + +También pueden fallar otras comprobaciones. Consulta la +[lista de todas las comprobaciones de PR](/docs/contributing/pr-checks). + +### Soluciona problemas de contenido automáticamente {#fix-content-issues-automatically} + +Antes de enviar un cambio al repositorio, ejecuta el siguiente comando y (i) +aborda los problemas informados, (ii) confirma los archivos modificados por el +script: + +```sh +npm run test-and-fix +``` + +Para probar y solucionar por separado todos los problemas con tus archivos, +ejecuta: + +```sh +npm run test # Checks but does not update any files +npm run fix:all # May update files +``` + +Para enumerar los scripts NPM disponibles, ejecuta `npm run`. Consulta los +[Pre-requisitos de PR](/docs/contributing/pr-checks) para obtener más +información sobre las verificaciones de los Pull Request y cómo solucionar +errores automáticamente. + +### Obtén una vista previa de tus cambios localmente {#preview-locally} + +Obtén una vista previa de tus cambios localmente antes de enviarlos o abrir un +pull request. Una vista previa te permite detectar errores de compilación o +problemas de formato de Markdown. + +Para crear y servir el sitio localmente con Hugo, ejecuta el siguiente comando: + +```shell +npm run serve +``` + +Navega a `http://localhost:1313` en su navegador web para ver la vista previa +local. Hugo observa los cambios y reconstruye el sitio según sea necesario. + +Para detener la instancia local de Hugo, vuelve a la terminal y escriba +`Ctrl+C`, o cierre la ventana de la terminal. + +### Implementaciones del sitio y vistas previas de PR + +Si envías una PR, Netlify crea una [Vista Previa de Implementación][] para que puedas +revisar sus cambios. Una vez que se fusiona su PR, Netlify implementa el sitio actualizado +en el servidor de producción. + +> **Nota**: Las vistas previas de PR incluyen _páginas de borrador_, pero las +> compilaciones de producción no. + +Para ver los registros de implementación y más, visita el [Panel de Control][] +del proyecto. Se requiere inicio de sesión en Netlify. + +### Pautas de PR + +Antes de fusionar un PR, a veces se requieren algunas iteraciones de revisión y +edición. Para ayudarnos a nosotros y a ti mismo a hacer que este proceso sea lo +más sencillo posible, te pedimos que respetes lo siguiente: + +- Si su PR no es una solución rápida, entonces **trabaja desde una copia**: + selecciona el botón + [Fork](https://github.com/open-telemetry/opentelemetry.io/fork) en la parte + superior del repositorio y clone el repositorio localmente. Cuando esté listo, + genere un PR al repositorio original. +- **No trabajes desde la rama `main`** de su fork: crea una rama específica para + el PR. +- Asegúrate de que los mantenedores tengan permiso para + [aplicar cambios a tu solicitud de incorporación de cambios](https://docs.github.com/es/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork). + +### Cambios de los revisores + +A veces, los revisores suben cambios en tu pull request. Antes de realizar +cualquier otro cambio, actualiza tu rama. + +1. Actualiza los commits de tu fork y haz rebase de tu rama actual: + + ```shell + git fetch origin + git rebase origin/ + ``` + +1. Luego de hacer rebase, sube tus nuevos cambios a tu fork: + + ```shell + git push --force-with-lease origin + ``` + +También puedes resolver conflictos de fusión desde la interfaz de usuario de +GitHub. + +### Conflictos en ramas y git rebase + +Si otro colaborador realiza cambios en el mismo archivo en otro pull request, +puedes crear un merge. Es tu responsabilidad resolver todos los conflictos en tu +Pull Request. + +1. Actualiza tu fork y haz git rebase de tu rama local: + + ```shell + git fetch origin + git rebase origin/ + ``` + + Luego haz force-push de tus cambios a tu fork: + + ```shell + git push --force-with-lease origin + ``` + +1. Actualiza los cambios de la rama `upstream/main` en + `open-telemetry/opentelemetry.io` y haz git rebase a tu rama actual: + + ```shell + git fetch upstream + git rebase upstream/main + ``` + +1. Inspecciona los resultados del git rebase: + + ```shell + git status + ``` + + Esto indicará la cantidad de archivos marcados con conflictos. + +1. Abra cada archivo en conflicto y busque los marcadores de conflicto: `>>>`, + `<<<`, y `===`. Resuelva el conflicto y elimine el marcador de conflicto. + +Para obtener más información, consulta +[Cómo se presentan los conflictos](https://git-scm.com/docs/git-merge#_how_conflicts_are_presented). + +1. Agrega los archivos al conjunto de cambios: + + ```shell + git add + ``` + +1. Haz force push de los cambios en tu rama a tu fork: + + ```shell + git push --force-with-lease origin + ``` + + El pull request ya no muestra ningún conflicto. + +### Requisitos para hacer merge + +Los pull request se hacen merge cuando cumplen con los siguientes criterios: + +- Todas las revisiones realizadas por aprobadores, mantenedores, miembros del + comité técnico o expertos en la materia tienen el estado "Aprobado". +- No hay conversaciones sin resolver. +- Aprobado por al menos un aprobador. +- No hay comprobaciones de PR fallidas. +- La rama de PR está actualizada con la rama base. + +> **Importante** +> +> No te preocupes demasiado por las comprobaciones de PR fallidas. Los miembros +> de la comunidad te ayudarán a solucionarlas, ya sea proporcionándote +> instrucciones sobre cómo solucionarlas o solucionándolas en tu nombre. + +[Panel de Control]: https://app.netlify.com/sites/opentelemetry/overview +[Vista Previa de Implementación]: + https://www.netlify.com/blog/2016/07/20/introducing-deploy-previews-in-netlify/ diff --git a/static/refcache.json b/static/refcache.json index 3ca2176ed8e5..6ed165868c30 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -2635,6 +2635,10 @@ "StatusCode": 206, "LastSeen": "2024-06-12T11:21:20.570863+02:00" }, + "https://docs.github.com/es/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork": { + "StatusCode": 206, + "LastSeen": "2024-10-30T15:12:28.788328409Z" + }, "https://docs.google.com/document/d/1-23Sf7-xZK3OL5Ogv2pK0NP9YotlSa0PKU9bvvtQwp8": { "StatusCode": 200, "LastSeen": "2024-08-15T15:44:20.868165+02:00" From 1cfbf5b033708259110e5cbe1ce96b63bb46fb4b Mon Sep 17 00:00:00 2001 From: jack-berg <34418638+jack-berg@users.noreply.github.com> Date: Sat, 2 Nov 2024 18:03:39 -0500 Subject: [PATCH 66/76] Add Intro to OpenTelemetry Java page (#5471) --- content/en/docs/languages/java/_index.md | 71 ------- .../en/docs/languages/java/getting-started.md | 2 +- .../en/docs/languages/java/instrumentation.md | 2 + content/en/docs/languages/java/intro.md | 183 ++++++++++++++++++ static/refcache.json | 36 ++++ 5 files changed, 222 insertions(+), 72 deletions(-) create mode 100644 content/en/docs/languages/java/intro.md diff --git a/content/en/docs/languages/java/_index.md b/content/en/docs/languages/java/_index.md index 65234d7132ae..7a7091bbbbc3 100644 --- a/content/en/docs/languages/java/_index.md +++ b/content/en/docs/languages/java/_index.md @@ -14,74 +14,3 @@ weight: 18 --- {{% docs/languages/index-intro java /%}} - -### Repositories - -OpenTelemetry Java consists of the following repositories: - -- [opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java): - Components for manual instrumentation including API and SDK as well as - extensions, the OpenTracing shim. -- [opentelemetry-java-docs][]: Manual instrumentation examples. -- [opentelemetry-java-instrumentation](https://github.com/open-telemetry/opentelemetry-java-instrumentation): - Built on top of opentelemetry-java and provides a Java agent JAR that can be - attached to any Java 8+ application and dynamically injects bytecode to - capture telemetry from a number of popular libraries and frameworks. -- [opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib): - Provides helpful libraries and standalone OpenTelemetry-based utilities that - don't fit the express scope of the OpenTelemetry Java or Java Instrumentation - projects. For example, JMX metric gathering. -- [semantic-conventions-java](https://github.com/open-telemetry/semantic-conventions-java): - Java implementation of - [OpenTelemetry Semantic Conventions](/docs/specs/semconv/). For example, - `ResourceAttributes.SERVICE_NAME`. -- [opentelemetry-proto-java](https://github.com/open-telemetry/opentelemetry-proto-java): - Java bindings for the [OpenTelemetry Protocol (OTLP)](/docs/specs/otlp/). - -### Components - -See [components] for a complete list of published components. - -### Releases - -Published [releases][] are available on [maven central][]. We strongly recommend -using our BOM to keep the versions of the various components in sync. - -#### Maven - -```xml - - - - - io.opentelemetry - opentelemetry-bom - {{% param vers.otel %}} - pom - import - - - - - - io.opentelemetry - opentelemetry-api - - - -``` - -#### Gradle - -```kotlin -dependencies { - implementation(platform("io.opentelemetry:opentelemetry-bom:{{% param vers.otel %}}")) - implementation("io.opentelemetry:opentelemetry-api") -} -``` - -[maven central]: https://mvnrepository.com/artifact/io.opentelemetry -[opentelemetry-java-docs]: - https://github.com/open-telemetry/opentelemetry-java-docs#java-opentelemetry-examples -[releases]: https://github.com/open-telemetry/opentelemetry-java/releases -[components]: https://github.com/open-telemetry/opentelemetry-java#releases diff --git a/content/en/docs/languages/java/getting-started.md b/content/en/docs/languages/java/getting-started.md index bb4078b15cfd..69fd4a79dedd 100644 --- a/content/en/docs/languages/java/getting-started.md +++ b/content/en/docs/languages/java/getting-started.md @@ -1,5 +1,5 @@ --- -title: Getting Started +title: Getting Started by Example description: Get telemetry for your app in less than 5 minutes! weight: 10 --- diff --git a/content/en/docs/languages/java/instrumentation.md b/content/en/docs/languages/java/instrumentation.md index 9cf2e297ac27..c08589bf13d6 100644 --- a/content/en/docs/languages/java/instrumentation.md +++ b/content/en/docs/languages/java/instrumentation.md @@ -53,6 +53,8 @@ There are several categories of instrumentation: libraries and frameworks. - [Manual instrumentation](#manual-instrumentation) is written by application authors, and typically specific to the application domain. +- [Shims](#shims) bridge data from one observability library to another, + typically _from_ some library into OpenTelemetry. **[1]**: Zero-code instrumentation is installed automatically based on detected libraries / frameworks. diff --git a/content/en/docs/languages/java/intro.md b/content/en/docs/languages/java/intro.md new file mode 100644 index 000000000000..fd57761b6e32 --- /dev/null +++ b/content/en/docs/languages/java/intro.md @@ -0,0 +1,183 @@ +--- +title: Intro to OpenTelemetry Java +description: Intro to the OpenTelemetry Java ecosystem +weight: 9 +--- + +OpenTelemetry Java is the set of OpenTelemetry observability tools for the Java +ecosystem. At a high level, it consists of the API, the SDK, and +instrumentation. + +This page introduces the ecosystem, with a conceptual [overview](#overview), a +guide to [navigating the docs](#navigating-the-docs), a list of +[repositories](#repositories) with key details about releases and artifacts. + +## Overview + +The API is a set of classes and interfaces for recording telemetry across key +observability signals. It supports multiple implementations, with a low-overhead +minimalist Noop (i.e. pronounced "no-op") and SDK reference implementation +provided out of the box. It is designed to be taken as a direct dependency by +libraries, frameworks, and application owners looking to add instrumentation. It +comes with strong backwards compatibility guarantees, zero transitive +dependencies, and supports Java 8+. + +The SDK is the built-in reference implementation of the API, processing and +exporting telemetry produced by instrumentation API calls. Configuring the SDK +to process and export appropriately is an essential step to integrating +OpenTelemetry into an application. The SDK has autoconfiguration and +programmatic configuration options. + +Instrumentation records telemetry using the API. There are a variety of +categories of instrumentation, including: zero-code Java agent, zero-code Spring +Boot starter, library, native, manual, and shims. + +For a language-agnostic overview, see [OpenTelemetry concepts](/docs/concepts/). + +## Navigating the docs + +The OpenTelemetry Java documentation is organized as follows: + +- [Getting Started by Example](../getting-started/): A quick example to get off + the ground running with OpenTelemetry Java, demonstrating integration of the + OpenTelemetry Java agent into a simple web application. +- [Instrumentation ecosystem](../instrumentation/): A guide to the OpenTelemetry + Java instrumentation ecosystem. This is a key resource for application authors + looking to integrate OpenTelemetry Java into applications. Learn about the + different categories of instrumentation, and decide which is right for you. +- [Record Telemetry with API](../api-components/): A technical reference for the + OpenTelemetry API, exploring all key aspects of the API with working code + examples. Most users will use this page like an encyclopedia, consulting the + index of sections as needed, rather than reading front to back. +- [Manage Telemetry with SDK](../sdk/) A technical reference for the + OpenTelemetry SDK, exploring all SDK plugin extension points and the + programmatic configuration API with working code examples. Most users will use + this page like an encyclopedia, consulting the index of sections as needed, + rather than reading front to back. +- [Configure the SDK](../configuration/): A technical reference for configuring + the SDK, focussing on zero-code autoconfiguration. Includes a reference of all + supported environment variables and system properties for configuring the SDK. + Explores all programmatic customization points with working code examples. + Most users will use this page like an encyclopedia, consulting the index of + sections as needed, rather than reading front to back. +- **Learn More**: Supplementary resources, including end-to-end + [examples](../examples/), [Javadoc](../api/), component + [registry](../registry/), and a [performance reference](../performance/). + +## Repositories + +OpenTelemetry Java source code is organized into several repositories: + +| Repository | Description | Group ID | Current Version | Release cadence | +| ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) | Core API and SDK components | `io.opentelemetry` | `{{% param vers.otel %}}` | [Friday after first Monday of the month](https://github.com/open-telemetry/opentelemetry-java/blob/main/RELEASING.md#release-cadence) | +| [opentelemetry-java-instrumentation](https://github.com/open-telemetry/opentelemetry-java-instrumentation) | Instrumentation maintained by OpenTelemetry, including OpenTelemetry Java agent | `io.opentelemetry.instrumentation` | `{{% param vers.instrumentation %}}` | [Wednesday after second Monday of the month](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/RELEASING.md#release-cadence) | +| [opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib) | Community maintained components that don't fit the express scope of other repositories | `io.opentelemetry.contrib` | `{{% param vers.contrib %}}` | [Friday after second Monday of the month](https://github.com/open-telemetry/opentelemetry-java-contrib/blob/main/RELEASING.md#release-cadence) | +| [semantic-conventions-java](https://github.com/open-telemetry/semantic-conventions-java) | Generated code for semantic conventions | `io.opentelemetry.semconv` | `{{% param vers.semconv %}}` | Following releases of [semantic-conventions](https://github.com/open-telemetry/semantic-conventions) | +| [opentelemetry-proto-java](https://github.com/open-telemetry/opentelemetry-proto-java) | Generated bindings for OTLP | `io.opentelemetry.proto` | `1.3.2-alpha` | Following releases of [opentelemetry-proto](https://github.com/open-telemetry/opentelemetry-proto) | +| [opentelemetry-java-examples](https://github.com/open-telemetry/opentelemetry-java-examples) | End-to-end code examples demonstrating a variety of patterns using the API, SDK, and instrumentation | n/a | n/a | n/a | + +`opentelemetry-java`, `opentelemetry-java-instrumentation`, and +`opentelemetry-java-contrib` each publish large catalogs of artifacts. Please +consult repositories for details, or see the "Managed Dependencies" column in +the [Bill of Materials](#dependencies-and-boms) table to see a full list of +managed dependencies. + +As a general rule, artifacts published from the same repository have the same +version. The exception to this is `opentelemetry-java-contrib`, which can be +thought of as a group of independent projects that are co-located in the same +repository to take advantage of shared tooling. For now, the artifacts of +`opentelemetry-java-contrib` are aligned but this is a coincidence and will +change in the future. + +The repositories have a release cadence which mirrors their high level +dependency structure: + +- `opentelemetry-java` is the core and releases first each month. +- `opentelemetry-java-instrumentation` depends on `opentelemetry-java` and is + next to publish. +- `opentelemetry-java-contrib` depends on `opentelemetry-java-instrumentation` + and `opentelemetry-java` and is last to publish. +- Although `semantic-conventions-java` is a dependency of + `opentelemetry-java-instrumentation`, it is an independent artifact with an + independent release schedule. + +## Dependencies and BOMs + +A +[bill of materials](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#bill-of-materials-bom-poms), +or BOM for short, is an artifact that helps keep the versions of related +dependencies aligned. OpenTelemetry Java publishes several BOMs catering to +different use cases, listed below in order of increasing scope. We highly +recommend using a BOM. + +{{% alert %}} Because the BOMs are hierarchical, adding dependencies on multiple +BOMs is not recommended, as it is redundant and can lead unintuitive dependency +version resolution. {{% /alert %}} + +Click the link in the "Managed Dependencies" column to see a list of the +artifacts managed by the BOM. + +| Description | Repository | Group ID | Artifact ID | Current Version | Managed Dependencies | +| -------------------------------------------------------------------------------------------- | ------------------------------------ | ---------------------------------- | ----------------------------------------- | ------------------------------------------ | --------------------------------------------------------- | +| Stable core API and SDK artifacts | `opentelemetry-java` | `io.opentelemetry` | `opentelemetry-bom` | `{{% param vers.otel %}}` | [latest pom.xml][opentelemetry-bom] | +| Experimental core API and SDK artifacts, including all of `opentelemetry-bom` | `opentelemetry-java` | `io.opentelemetry` | `opentelemetry-bom-alpha` | `{{% param vers.otel %}}-alpha` | [latest pom.xml][opentelemetry-bom-alpha] | +| Stable instrumentation artifacts, including all of `opentelemetry-bom` | `opentelemetry-java-instrumentation` | `io.opentelemetry.instrumentation` | `opentelemetry-instrumentation-bom` | `{{% param vers.instrumentation %}}` | [latest pom.xml][opentelemetry-instrumentation-bom] | +| Experimental instrumentation artifacts, including all of `opentelemetry-instrumentation-bom` | `opentelemetry-java-instrumentation` | `io.opentelemetry.instrumentation` | `opentelemetry-instrumentation-bom-alpha` | `{{% param vers.instrumentation %}}-alpha` | [latest pom.xml][opentelemetry-instrumentation-alpha-bom] | + +The following code snippet demonstrates adding a BOM dependency, +with`{{bomGroupId}}`, `{{bomArtifactId}}`, and `{{bomVersion}}` referring to the +"Group ID", "Artifact ID", and "Current Version" table columns, respectively. + +{{< tabpane text=true >}} {{% tab "Gradle" %}} + +```kotlin +dependencies { + implementation(platform("{{bomGroupId}}:{{bomArtifactId}}:{{bomVersion}}")) + // Add a dependency on an artifact whose version is managed by the bom + implementation("io.opentelemetry:opentelemetry-api") +} +``` + +{{% /tab %}} {{% tab Maven %}} + +```xml + + + + + {{bomGroupId}} + {{bomArtifactId}} + {{bomVersion}} + pom + import + + + + + + + io.opentelemetry + opentelemetry-api + + + +``` + +{{% /tab %}} {{< /tabpane >}} + +[opentelemetry-bom]: +https://repo1.maven.org/maven2/io/opentelemetry/opentelemetry-bom/{{% param +vers.otel %}}/opentelemetry-bom-{{% param vers.otel %}}.pom +[opentelemetry-bom-alpha]: +https://repo1.maven.org/maven2/io/opentelemetry/opentelemetry-bom-alpha/{{% +param vers.otel +%}}-alpha/opentelemetry-bom-alpha-{{% param vers.otel %}}-alpha.pom +[opentelemetry-instrumentation-bom]: +https://repo1.maven.org/maven2/io/opentelemetry/instrumentation/opentelemetry-instrumentation-bom/{{% +param vers.instrumentation +%}}/opentelemetry-instrumentation-bom-{{% param vers.instrumentation %}}.pom +[opentelemetry-instrumentation-alpha-bom]: +https://repo1.maven.org/maven2/io/opentelemetry/instrumentation/opentelemetry-instrumentation-bom-alpha/{{% +param vers.instrumentation +%}}-alpha/opentelemetry-instrumentation-bom-alpha-{{% param vers.instrumentation %}}-alpha.pom diff --git a/static/refcache.json b/static/refcache.json index 6ed165868c30..a846be21ff75 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -6663,6 +6663,10 @@ "StatusCode": 200, "LastSeen": "2024-01-18T19:37:32.008516-05:00" }, + "https://github.com/open-telemetry/opentelemetry-java-examples": { + "StatusCode": 200, + "LastSeen": "2024-10-23T20:19:13.793874-05:00" + }, "https://github.com/open-telemetry/opentelemetry-java-instrumentation": { "StatusCode": 200, "LastSeen": "2024-01-18T19:10:45.254006-05:00" @@ -11603,6 +11607,38 @@ "StatusCode": 200, "LastSeen": "2024-01-30T05:18:35.161372-05:00" }, + "https://repo1.maven.org/maven2/io/opentelemetry/instrumentation/opentelemetry-instrumentation-bom-alpha/2.7.0-alpha/opentelemetry-instrumentation-bom-alpha-2.7.0-alpha.pom": { + "StatusCode": 206, + "LastSeen": "2024-10-23T20:20:08.34491-05:00" + }, + "https://repo1.maven.org/maven2/io/opentelemetry/instrumentation/opentelemetry-instrumentation-bom-alpha/2.9.0-alpha/opentelemetry-instrumentation-bom-alpha-2.9.0-alpha.pom": { + "StatusCode": 206, + "LastSeen": "2024-10-23T20:19:21.596018-05:00" + }, + "https://repo1.maven.org/maven2/io/opentelemetry/instrumentation/opentelemetry-instrumentation-bom/2.7.0/opentelemetry-instrumentation-bom-2.7.0.pom": { + "StatusCode": 206, + "LastSeen": "2024-10-23T20:20:07.402964-05:00" + }, + "https://repo1.maven.org/maven2/io/opentelemetry/instrumentation/opentelemetry-instrumentation-bom/2.9.0/opentelemetry-instrumentation-bom-2.9.0.pom": { + "StatusCode": 206, + "LastSeen": "2024-10-23T20:19:19.595194-05:00" + }, + "https://repo1.maven.org/maven2/io/opentelemetry/opentelemetry-bom-alpha/1.42.1-alpha/opentelemetry-bom-alpha-1.42.1-alpha.pom": { + "StatusCode": 206, + "LastSeen": "2024-10-23T20:20:05.963898-05:00" + }, + "https://repo1.maven.org/maven2/io/opentelemetry/opentelemetry-bom-alpha/1.43.0-alpha/opentelemetry-bom-alpha-1.43.0-alpha.pom": { + "StatusCode": 206, + "LastSeen": "2024-10-23T20:19:18.147885-05:00" + }, + "https://repo1.maven.org/maven2/io/opentelemetry/opentelemetry-bom/1.42.1/opentelemetry-bom-1.42.1.pom": { + "StatusCode": 206, + "LastSeen": "2024-10-23T20:20:05.242921-05:00" + }, + "https://repo1.maven.org/maven2/io/opentelemetry/opentelemetry-bom/1.43.0/opentelemetry-bom-1.43.0.pom": { + "StatusCode": 206, + "LastSeen": "2024-10-23T20:19:16.148466-05:00" + }, "https://research.facebook.com/file/877841159827226/holistic-configuration-management-at-facebook.pdf": { "StatusCode": 206, "LastSeen": "2024-01-30T16:14:42.741857-05:00" From 81475f03c84cf259ddcdf780bee46893e7c10e44 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Sat, 2 Nov 2024 19:04:41 -0400 Subject: [PATCH 67/76] Add jdbi to native java instrumentation registry (#5512) --- data/registry/instrumentation-java-jdbi.yml | 20 ++++++++++++++++++++ static/refcache.json | 16 ++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 data/registry/instrumentation-java-jdbi.yml diff --git a/data/registry/instrumentation-java-jdbi.yml b/data/registry/instrumentation-java-jdbi.yml new file mode 100644 index 000000000000..e400e221a906 --- /dev/null +++ b/data/registry/instrumentation-java-jdbi.yml @@ -0,0 +1,20 @@ +# cSpell:ignore JDBI jdbi Jdbi +title: JDBI +registryType: instrumentation +language: java +tags: + - java + - jdbi +urls: + repo: https://github.com/jdbi/jdbi + docs: https://jdbi.org/#_opentelemetry_tracing + website: https://jdbi.org/ +license: Apache-2.0 +description: + Installing the JdbiOpenTelemetryPlugin enables Jdbi statements to emit trace + spans recording metadata like SQL, parameters, and execution time. +authors: + - name: JDBI Authors + url: https://github.com/jdbi +createdAt: '2024-11-02' +isNative: true diff --git a/static/refcache.json b/static/refcache.json index a846be21ff75..57d114ecf950 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -5251,6 +5251,14 @@ "StatusCode": 200, "LastSeen": "2024-08-06T15:18:28.014809+02:00" }, + "https://github.com/jdbi": { + "StatusCode": 200, + "LastSeen": "2024-11-02T06:14:06.865612-04:00" + }, + "https://github.com/jdbi/jdbi": { + "StatusCode": 200, + "LastSeen": "2024-11-02T06:14:05.661704-04:00" + }, "https://github.com/jeanbisutti": { "StatusCode": 200, "LastSeen": "2024-01-30T16:14:42.388742-05:00" @@ -8627,6 +8635,14 @@ "StatusCode": 200, "LastSeen": "2024-01-30T15:25:04.309715-05:00" }, + "https://jdbi.org/": { + "StatusCode": 206, + "LastSeen": "2024-11-02T06:13:48.275274-04:00" + }, + "https://jdbi.org/#_opentelemetry_tracing": { + "StatusCode": 206, + "LastSeen": "2024-11-02T06:13:48.208691-04:00" + }, "https://jessitron.com/": { "StatusCode": 200, "LastSeen": "2024-01-18T19:02:03.729447-05:00" From d96ef10c0bf452f6e01b9d9b596355693638e0d9 Mon Sep 17 00:00:00 2001 From: Tiffany Hrabusa <30397949+tiffany76@users.noreply.github.com> Date: Sat, 2 Nov 2024 16:05:30 -0700 Subject: [PATCH 68/76] Add Collector security documentation (#5209) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Juraci Paixão Kröhling Co-authored-by: Pablo Baeyens Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Reiley Yang Co-authored-by: Patrice Chalin --- content/en/docs/security/_index.md | 37 ++++ .../en/docs/security/config-best-practices.md | 208 ++++++++++++++++++ content/en/docs/security/cve.md | 2 +- .../docs/security/hosting-best-practices.md | 63 ++++++ content/en/docs/security/security-response.md | 2 +- static/refcache.json | 12 + 6 files changed, 322 insertions(+), 2 deletions(-) create mode 100644 content/en/docs/security/config-best-practices.md create mode 100644 content/en/docs/security/hosting-best-practices.md diff --git a/content/en/docs/security/_index.md b/content/en/docs/security/_index.md index 85c229f08e23..1fd43aef309d 100644 --- a/content/en/docs/security/_index.md +++ b/content/en/docs/security/_index.md @@ -2,3 +2,40 @@ title: Security weight: 970 --- + +In this section, learn how the OpenTelemetry project discloses vulnerabilities +and responds to incidents and discover what you can do to securely collect and +transmit your observability data. + +## Common Vulnerabilities and Exposures (CVEs) + +For CVEs across all repositories, see +[Common Vulnerabilities and Exposures](cve/). + +## Incident response + +Learn how to report a vulnerability or find out how incident responses are +handled in [Community incident response guidelines](security-response/). + +## Collector security + +When setting up the OpenTelemetry Collector, consider implementing security best +practices in both your hosting infrastructure and your Collector configuration. +Running a secure Collector can help you + +- Protect telemetry that shouldn't but might contain sensitive information, such + as personally identifiable information (PII), application-specific data, or + network traffic patterns. +- Prevent data tampering that makes telemetry unreliable and disrupts incident + responses. +- Comply with data privacy and security regulations. +- Defend against denial of service (DoS) attacks. + +See [Hosting best practices](hosting-best-practices/) to learn how to secure +your Collector's infrastructure. + +See [Configuration best practices](config-best-practices/) to learn how to +securely configure your Collector. + +For Collector component developers, see +[Security best practices](https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/security-best-practices.md). diff --git a/content/en/docs/security/config-best-practices.md b/content/en/docs/security/config-best-practices.md new file mode 100644 index 000000000000..f751d3ec3ff2 --- /dev/null +++ b/content/en/docs/security/config-best-practices.md @@ -0,0 +1,208 @@ +--- +title: Collector configuration best practices +linkTitle: Collector configuration +weight: 112 +cSpell:ignore: exporterhelper +--- + +When configuring the OpenTelemetry (OTel) Collector, consider these best +practices to better secure your Collector instance. + +## Create secure configurations + +Follow these guidelines to secure your Collector's configuration and its +pipelines. + +### Store your configuration securely + +The Collector's configuration might contain sensitive information including: + +- Authentication information such as API tokens. +- TLS certificates including private keys. + +You should store sensitive information securely such as on an encrypted +filesystem or secret store. You can use environment variables to handle +sensitive and non-sensitive data as the Collector supports +[environment variable expansion](/docs/collector/configuration/#environment-variables). + +### Use encryption and authentication + +Your OTel Collector configuration should include encryption and authentication. + +- For communication encryption, see + [Configuring certificates](/docs/collector/configuration/#setting-up-certificates). +- For authentication, use the OTel Collector's authentication mechanism, as + described in [Authentication](/docs/collector/configuration/#authentication). + +### Minimize the number of components + +We recommend limiting the set of components in your Collector configuration to +only those you need. Minimizing the number of components you use minimizes the +attack surface exposed. + +- Use the + [OpenTelemetry Collector Builder (`ocb`)](/docs/collector/custom-collector) to + create a Collector distribution that uses only the components you need. +- Remove unused components from your configuration. + +### Configure with care + +Some components can increase the security risk of your Collector pipelines. + +- Receivers, exporters, and other components should establish network + connections over a secure channel, potentially authenticated as well. +- Receivers and exporters might expose buffer, queue, payload, and worker + settings using configuration parameters. If these settings are available, you + should proceed with caution before modifying the default configuration values. + Improperly setting these values might expose the OpenTelemetry Collector to + additional attack vectors. + +## Set permissions carefully + +Avoid running the Collector as a root user. Some components might require +special permissions, however. In those cases, follow the principle of least +privilege and make sure your components only have the access they need to do +their job. + +### Observers + +Observers are implemented as extensions. Extensions are a type of component that +adds capabilities on top of the primary functions of the Collector. Extensions +don't require direct access to telemetry and aren't part of pipelines, but they +can still pose security risks if they require special permissions. + +An observer discovers networked endpoints such as a Kubernetes pod, Docker +container, or local listening port on behalf of the +[receiver creator](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/receivercreator/README.md). +In order to discover services, observers might require greater access. For +example, the `k8s_observer` requires +[role-based access control (RBAC) permissions](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/observer/k8sobserver#setting-up-rbac-permissions) +in Kubernetes. + +## Manage specific security risks + +Configure your Collector to block these security threats. + +### Protect against denial of service attacks + +For server-like receivers and extensions, you can protect your Collector from +exposure to the public internet or to wider networks than necessary by binding +these components' endpoints to addresses that limit connections to authorized +users. Try to always use specific interfaces, such as a pod's IP, or `localhost` +instead of `0.0.0.0`. For more information, see +[CWE-1327: Binding to an Unrestricted IP Address](https://cwe.mitre.org/data/definitions/1327.html). + +From Collector v0.110.0, the default host for all servers in Collector +components is `localhost`. For earlier versions of the Collector, change the +default endpoint from `0.0.0.0` to `localhost` in all components by enabling the +`component.UseLocalHostAsDefaultHost` +[feature gate](https://github.com/open-telemetry/opentelemetry-collector/tree/main/featuregate). + +If `localhost` resolves to a different IP due to your DNS settings, then +explicitly use the loopback IP instead: `127.0.0.1` for IPv4 or `::1` for IPv6. +For example, here's an IPv4 configuration using a gRPC port: + +```yaml +receivers: + otlp: + protocols: + grpc: + endpoint: 127.0.0.1:4317 +``` + +In IPv6 setups, make sure your system supports both IPv4 and IPv6 loopback +addresses so the network functions properly in dual-stack environments and +applications, where both protocol versions are used. + +If you are working in environments that have nonstandard networking setups, such +as Docker or Kubernetes, see the +[example configurations](https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/security-best-practices.md#safeguards-against-denial-of-service-attacks) +in our component developer documentation for ideas on how to bind your component +endpoints. + +### Scrub sensitive data + +[Processors](/docs/collector/configuration/#processors) are the Collector +components that sit between receivers and exporters. They are responsible for +processing telemetry before it's analyzed. You can use the OpenTelemetry +Collector's `redaction` processor to obfuscate or scrub sensitive data before +exporting it to a backend. + +The +[`redaction` processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/redactionprocessor) +deletes span, log, and metric datapoint attributes that don't match a list of +allowed attributes. It also masks attribute values that match a blocked value +list. Attributes that aren't on the allowed list are removed before any value +checks are done. + +For example, here is a configuration that masks values containing credit card +numbers: + +```yaml +processors: + redaction: + allow_all_keys: false + allowed_keys: + - description + - group + - id + - name + ignored_keys: + - safe_attribute + blocked_values: # Regular expressions for blocking values of allowed span attributes + - '4[0-9]{12}(?:[0-9]{3})?' # Visa credit card number + - '(5[1-5][0-9]{14})' # MasterCard number + summary: debug +``` + +See the +[documentation](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/redactionprocessor) +to learn how to add the `redaction` processor to your Collector configuration. + +### Safeguard resource utilization + +After implementing safeguards for resource utilization in your +[hosting infrastructure](../hosting-best-practices/), consider also adding these +safeguards to your OpenTelemetry Collector configuration. + +Batching your telemetry and limiting the memory available to your Collector can +prevent out-of-memory errors and usage spikes. You can also handle traffic +spikes by adjusting queue sizes to manage memory usage while avoiding data loss. +For example, use the +[`exporterhelper`](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md) +to manage queue size for your `otlp` exporter: + +```yaml +exporters: + otlp: + endpoint: + sending_queue: + queue_size: 800 +``` + +Filtering unwanted telemetry is another way you can protect your Collector's +resources. Not only does filtering protect your Collector instance, but it also +reduces the load on your backend. You can use the +[`filter` processor](/docs/collector/transforming-telemetry/#basic-filtering) to +drop logs, metrics, and spans you don't need. For example, here's a +configuration that drops non-HTTP spans: + +```yaml +processors: + filter: + error_mode: ignore + traces: + span: + - attributes["http.request.method"] == nil +``` + +You can also configure your components with appropriate timeout and retry +limits. These limits should allow your Collector to handle failures without +accumulating too much data in memory. See the +[`exporterhelper` documentation](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md) +for more information. + +Finally, consider using compression with your exporters to reduce the send size +of your data and conserve network and CPU resources. By default, the +[`otlp` exporter](https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/otlpexporter) +uses `gzip` compression. diff --git a/content/en/docs/security/cve.md b/content/en/docs/security/cve.md index 3c6b8fb18730..208406d36109 100644 --- a/content/en/docs/security/cve.md +++ b/content/en/docs/security/cve.md @@ -1,6 +1,6 @@ --- title: Common Vulnerabilities and Exposures -weight: 102 +weight: 100 --- This is a list of reported Common Vulnerabilities and Exposures (CVEs) across diff --git a/content/en/docs/security/hosting-best-practices.md b/content/en/docs/security/hosting-best-practices.md new file mode 100644 index 000000000000..531c959ff635 --- /dev/null +++ b/content/en/docs/security/hosting-best-practices.md @@ -0,0 +1,63 @@ +--- +title: Collector hosting best practices +linkTitle: Collector hosting +weight: 115 +--- + +When setting up hosting for OpenTelemetry (OTel) Collector, consider these best +practices to better secure your hosting instance. + +## Store data securely + +Your Collector configuration file might contain sensitive data, including +authentication tokens or TLS certificates. See the best practices for +[securing your configuration](../config-best-practices/#create-secure-configurations). + +If you are storing telemetry for processing, make sure to restrict access to +those directories to prevent tampering with raw data. + +## Keep your secrets safe + +Kubernetes [secrets](https://kubernetes.io/docs/concepts/configuration/secret/) +are credentials that hold confidential data. They authenticate and authorize +privileged access. If you're using a Kubernetes deployment for your Collector, +make sure to follow these +[recommended practices](https://kubernetes.io/docs/concepts/security/secrets-good-practices/) +to improve security for your clusters. + +## Apply the principle of least privilege + +The Collector should not require privileged access, except where the data it's +collecting is in a privileged location. For example, in a Kubernetes deployment, +system logs, application logs, and container runtime logs are often stored in a +node volume that requires special permission to access. If your Collector is +running as a daemonset on the node, make sure to grant only the specific volume +mount permissions it needs to access these logs and no more. You can configure +privilege access with role-based access control (RBAC). See +[RBAC good practices](https://kubernetes.io/docs/concepts/security/rbac-good-practices/) +for more information. + +## Control access to server-like components + +Some Collector components such as receivers and exporters can function like +servers. To limit access to authorized users, you should: + +- Enable authentication by using bearer token authentication extensions and + basic authentication extensions, for example. +- Restrict the IPs that your Collector runs on. + +## Safeguard resource utilization + +Use the Collector's own +[internal telemetry](/docs/collector/internal-telemetry/) to monitor its +performance. Collect metrics from the Collector about its CPU, memory, and +throughput usage and set alerts for resource exhaustion. + +If resource limits are reached, consider horizontally +[scaling the Collector](/docs/collector/scaling/) by deploying multiple +instances in a load-balanced configuration. Scaling your Collector distributes +the resource demands and prevents bottlenecks. + +Once you secure resource utilization in your deployment, make sure your +Collector instance also uses +[safeguards in its configuration](../config-best-practices/#safeguard-resource-utilization). diff --git a/content/en/docs/security/security-response.md b/content/en/docs/security/security-response.md index a20ba04cfcfe..39adb1d12017 100644 --- a/content/en/docs/security/security-response.md +++ b/content/en/docs/security/security-response.md @@ -1,5 +1,5 @@ --- -title: Community Incident Response Guidelines +title: Community incident response guidelines weight: 102 --- diff --git a/static/refcache.json b/static/refcache.json index 57d114ecf950..70449f341f27 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -8755,6 +8755,10 @@ "StatusCode": 206, "LastSeen": "2024-08-09T10:44:30.895853-04:00" }, + "https://kubernetes.io/docs/concepts/configuration/secret/": { + "StatusCode": 206, + "LastSeen": "2024-10-17T20:41:39.419625448-07:00" + }, "https://kubernetes.io/docs/concepts/configuration/secret/#using-a-secret": { "StatusCode": 206, "LastSeen": "2024-04-25T00:01:05.630302-04:00" @@ -8783,6 +8787,14 @@ "StatusCode": 206, "LastSeen": "2024-08-09T10:45:22.265624-04:00" }, + "https://kubernetes.io/docs/concepts/security/rbac-good-practices/": { + "StatusCode": 206, + "LastSeen": "2024-10-28T23:48:13.923440181Z" + }, + "https://kubernetes.io/docs/concepts/security/secrets-good-practices/": { + "StatusCode": 206, + "LastSeen": "2024-10-17T20:41:39.602462106-07:00" + }, "https://kubernetes.io/docs/concepts/services-networking/service/": { "StatusCode": 206, "LastSeen": "2024-01-30T06:06:10.439014-05:00" From 05bc2e86bff27144136b666f2cf2770d8c6fff7d Mon Sep 17 00:00:00 2001 From: David Rifkin <50370157+davidlawrencer@users.noreply.github.com> Date: Sat, 2 Nov 2024 18:07:01 -0500 Subject: [PATCH 69/76] distribution: Add distros for Embrace Android and Apple (#5478) Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> --- data/ecosystem/distributions.yaml | 8 ++++++++ static/refcache.json | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/data/ecosystem/distributions.yaml b/data/ecosystem/distributions.yaml index 943360f48e63..6a6bc924e38f 100644 --- a/data/ecosystem/distributions.yaml +++ b/data/ecosystem/distributions.yaml @@ -103,3 +103,11 @@ url: https://github.com/elastic/elastic-otel-python docsUrl: https://github.com/elastic/elastic-otel-python components: [Python] +- name: Embrace Android Distribution for OpenTelemetry + url: https://github.com/embrace-io/embrace-android-sdk + docsUrl: https://embrace.io/docs/open-telemetry/integration/?android-language=java + components: [Java] +- name: Embrace Apple Distribution for OpenTelemetry + url: https://github.com/embrace-io/embrace-apple-sdk + docsUrl: https://embrace.io/docs/open-telemetry/integration/#apple + components: [Swift] diff --git a/static/refcache.json b/static/refcache.json index 70449f341f27..ffad37318856 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -3375,6 +3375,14 @@ "StatusCode": 200, "LastSeen": "2024-01-30T16:14:47.246698-05:00" }, + "https://embrace.io/docs/open-telemetry/integration/": { + "StatusCode": 206, + "LastSeen": "2024-11-02T22:02:32.429124483Z" + }, + "https://embrace.io/docs/open-telemetry/integration/#apple": { + "StatusCode": 206, + "LastSeen": "2024-11-02T22:02:37.069605183Z" + }, "https://embrace.io/opentelemetry-for-mobile/": { "StatusCode": 206, "LastSeen": "2024-04-25T10:29:55.539338+02:00" @@ -4859,6 +4867,14 @@ "StatusCode": 200, "LastSeen": "2024-08-09T11:17:19.10152+02:00" }, + "https://github.com/embrace-io/embrace-android-sdk": { + "StatusCode": 200, + "LastSeen": "2024-11-02T22:02:28.968321617Z" + }, + "https://github.com/embrace-io/embrace-apple-sdk": { + "StatusCode": 200, + "LastSeen": "2024-11-02T22:02:35.245741377Z" + }, "https://github.com/emdneto": { "StatusCode": 200, "LastSeen": "2024-08-09T11:16:41.547073+02:00" From 66945329b6314cf6e9e99444514ca86b71661b09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Barto=C5=A1?= Date: Sun, 3 Nov 2024 00:12:49 +0100 Subject: [PATCH 70/76] Add Keycloak to integrations (#5498) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Bartoš Co-authored-by: Václav Muzikář Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Phillip Carter --- .../application-integration-java-keycloak.yml | 22 +++++++++++++++++++ static/refcache.json | 16 ++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 data/registry/application-integration-java-keycloak.yml diff --git a/data/registry/application-integration-java-keycloak.yml b/data/registry/application-integration-java-keycloak.yml new file mode 100644 index 000000000000..7b7bcc0867a0 --- /dev/null +++ b/data/registry/application-integration-java-keycloak.yml @@ -0,0 +1,22 @@ +# cSpell:ignore keycloak +title: Keycloak +registryType: application integration +language: java +tags: + - keycloak + - iam + - sso +urls: + website: https://www.keycloak.org + repo: https://github.com/keycloak/keycloak + docs: https://www.keycloak.org/server/tracing +license: Apache 2.0 +description: + Keycloak utilizes OpenTelemetry for distributed tracing provided by the + Quarkus OpenTelemetry extension. +authors: + - name: Keycloak Contributors + url: https://github.com/keycloak +createdAt: '2024-10-29' +isNative: false +cncfProjectLevel: incubating diff --git a/static/refcache.json b/static/refcache.json index ffad37318856..57493f18010a 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -5447,6 +5447,14 @@ "StatusCode": 200, "LastSeen": "2024-08-09T11:17:29.568811+02:00" }, + "https://github.com/keycloak": { + "StatusCode": 200, + "LastSeen": "2024-10-30T21:34:00.859928291Z" + }, + "https://github.com/keycloak/keycloak": { + "StatusCode": 200, + "LastSeen": "2024-10-30T21:33:58.058084045Z" + }, "https://github.com/kieronlanning": { "StatusCode": 200, "LastSeen": "2024-04-26T09:57:50.019728503+01:00" @@ -13355,10 +13363,18 @@ "StatusCode": 206, "LastSeen": "2024-01-18T19:36:55.905893-05:00" }, + "https://www.keycloak.org": { + "StatusCode": 206, + "LastSeen": "2024-10-30T21:33:55.346508746Z" + }, "https://www.keycloak.org/": { "StatusCode": 206, "LastSeen": "2024-01-18T19:55:51.649479-05:00" }, + "https://www.keycloak.org/server/tracing": { + "StatusCode": 206, + "LastSeen": "2024-10-30T21:33:56.91911467Z" + }, "https://www.konghq.com/": { "StatusCode": 200, "LastSeen": "2024-01-30T15:37:02.403477-05:00" From 3a508b4229b6028aada39dccab585b3ca3d8f8be Mon Sep 17 00:00:00 2001 From: Jade Guiton Date: Sun, 3 Nov 2024 00:14:19 +0100 Subject: [PATCH 71/76] Document enabling trace self-telemetry (#5449) Co-authored-by: Pablo Baeyens Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Alex Boten <223565+codeboten@users.noreply.github.com> Co-authored-by: Tiffany Hrabusa <30397949+tiffany76@users.noreply.github.com> --- .../en/docs/collector/internal-telemetry.md | 128 ++++++++++++------ 1 file changed, 88 insertions(+), 40 deletions(-) diff --git a/content/en/docs/collector/internal-telemetry.md b/content/en/docs/collector/internal-telemetry.md index 2af0b71a4e0b..c850dd150f55 100644 --- a/content/en/docs/collector/internal-telemetry.md +++ b/content/en/docs/collector/internal-telemetry.md @@ -65,46 +65,6 @@ service: level: detailed ``` -The Collector can also be configured to push its own metrics to an -[OTLP receiver](https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otlpreceiver) -and send them through configured pipelines. In the following example, the -Collector is configured to push metrics every 10s using OTLP gRPC to -`localhost:14317`: - -```yaml -receivers: - otlp/internal_metrics: - protocols: - grpc: - endpoint: localhost:14317 -exporters: - debug: -service: - pipelines: - metrics: - receivers: [otlp/internal_metrics] - exporters: [debug] - telemetry: - metrics: - readers: - - periodic: - interval: 10000 - exporter: - otlp: - protocol: grpc/protobuf - endpoint: localhost:14317 -``` - -{{% alert title="Caution" color="warning" %}} - -When self-monitoring, the Collector collects its own telemetry and sends it to -the desired backend for analysis. This can be a risky practice. If the Collector -is underperforming, its self-monitoring capability could be impacted. As a -result, the self-monitored telemetry might not reach the backend in time for -critical analysis. - -{{% /alert %}} - ### Configure internal logs Log output is found in `stderr`. You can configure logs in the config @@ -144,6 +104,94 @@ journalctl | grep otelcol | grep Error {{% /tab %}} {{< /tabpane >}} +### Configure internal traces + +The Collector does not expose traces by default, but it can be configured to. + +{{% alert title="Caution" color="warning" %}} + +Internal tracing is an experimental feature, and no guarantees are made as to +the stability of the emitted span names and attributes. + +{{% /alert %}} + +The following configuration can be used to emit internal traces from the +Collector to an OTLP/gRPC backend: + +```yaml +service: + telemetry: + traces: + processors: + - batch: + exporter: + otlp: + protocol: grpc/protobuf + endpoint: https://backend:4317 +``` + +See the [example configuration][kitchen-sink-config] for additional options. +Note that the `tracer_provider` section there corresponds to `traces` here. + +[kitchen-sink-config]: + https://github.com/open-telemetry/opentelemetry-configuration/blob/main/examples/kitchen-sink.yaml + +### Self-monitoring + +The Collector can be configured to push its own telemetry to an +[OTLP receiver](https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otlpreceiver) +and send the data through configured pipelines. In the following example, the +Collector is configured to push metrics and traces every 10s using OTLP gRPC to +`localhost:14317`: + +```yaml +receivers: + otlp/internal: + protocols: + grpc: + endpoint: localhost:14317 +exporters: + debug: +service: + pipelines: + metrics: + receivers: [otlp/internal] + exporters: [debug] + traces: + receivers: [otlp/internal] + exporters: [debug] + telemetry: + metrics: + readers: + - periodic: + interval: 10000 + exporter: + otlp: + protocol: grpc/protobuf + endpoint: localhost:14317 + traces: + processors: + batch: + exporter: + otlp: + protocol: grpc/protobuf + endpoint: localhost:14317 +``` + +{{% alert title="Caution" color="warning" %}} + +When self-monitoring, the Collector collects its own telemetry and sends it to +the desired backend for analysis. This can be a risky practice. If the Collector +is underperforming, its self-monitoring capability could be impacted. As a +result, the self-monitored telemetry might not reach the backend in time for +critical analysis. + +Moreover, sending internal telemetry through the Collector's own pipelines can +create a continuous loop of spans, metric points, or logs, putting undue strain +on the Collector's performance. This setup should not be used in production. + +{{% /alert %}} + ## Types of internal telemetry The OpenTelemetry Collector aims to be a model of observable service by clearly From 9ce65565ab334b3c83fcf3a09f9eaee6a1fa79a0 Mon Sep 17 00:00:00 2001 From: DIANAAJAMBO <124655553+DIANAAJAMBO@users.noreply.github.com> Date: Sun, 3 Nov 2024 02:21:57 +0300 Subject: [PATCH 72/76] Libraries page (#5480) --- .../concepts/instrumentation/libraries.md | 2 + static/img/libraries-instrumentation.svg | 186 ++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100755 static/img/libraries-instrumentation.svg diff --git a/content/en/docs/concepts/instrumentation/libraries.md b/content/en/docs/concepts/instrumentation/libraries.md index 7fa645f6fdf1..7ef1ddcf74ff 100644 --- a/content/en/docs/concepts/instrumentation/libraries.md +++ b/content/en/docs/concepts/instrumentation/libraries.md @@ -22,6 +22,8 @@ and document hooks. Other advantages provided by native instrumentation include: various consumption scenarios using a wide variety of well-documented OpenTelemetry extensibility points. +![ Native Instrumentation vs instrumentation libraries](/img/libraries-instrumentation.svg) + ## Semantic conventions [Semantic conventions](/docs/specs/semconv/general/trace/) are the main source diff --git a/static/img/libraries-instrumentation.svg b/static/img/libraries-instrumentation.svg new file mode 100755 index 000000000000..d606fe0b27f6 --- /dev/null +++ b/static/img/libraries-instrumentation.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f74ac938887d97e7e4b217ce6504e3f729009854 Mon Sep 17 00:00:00 2001 From: Min Uk Lee Date: Sun, 3 Nov 2024 09:00:52 +0900 Subject: [PATCH 73/76] Update opamp-spec submodule to v0.10.0 (#5329) Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com> Co-authored-by: Phillip Carter --- .gitmodules | 2 +- content-modules/opamp-spec | 2 +- static/refcache.json | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 819280234443..b444d2d24a00 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,7 +23,7 @@ [submodule "content-modules/opamp-spec"] path = content-modules/opamp-spec url = https://github.com/open-telemetry/opamp-spec - opamp-pin = v0.9.0-2-g950df29 + opamp-pin = v0.10.0 [submodule "content-modules/opentelemetry-go"] path = content-modules/opentelemetry-go url = https://github.com/open-telemetry/opentelemetry-go diff --git a/content-modules/opamp-spec b/content-modules/opamp-spec index 950df2967e22..fb2ff487c70a 160000 --- a/content-modules/opamp-spec +++ b/content-modules/opamp-spec @@ -1 +1 @@ -Subproject commit 950df2967e22526aa553aac1d874ac90b973d140 +Subproject commit fb2ff487c70ac1895652ab5c4a965dfc2ae20d03 diff --git a/static/refcache.json b/static/refcache.json index 57493f18010a..7e8866a3e710 100644 --- a/static/refcache.json +++ b/static/refcache.json @@ -3235,6 +3235,10 @@ "StatusCode": 200, "LastSeen": "2024-08-09T10:47:09.376386-04:00" }, + "https://docs.splunk.com/Documentation/Splunk/latest/Updating/Aboutdeploymentserver": { + "StatusCode": 200, + "LastSeen": "2024-11-02T23:00:07.34114093Z" + }, "https://docs.splunk.com/Observability/gdi/opentelemetry/opentelemetry.html": { "StatusCode": 206, "LastSeen": "2024-01-30T06:06:25.583516-05:00" @@ -3311,6 +3315,10 @@ "StatusCode": 206, "LastSeen": "2024-01-30T16:14:30.370824-05:00" }, + "https://docs.vmware.com/en/vRealize-Log-Insight/8.10/com.vmware.log-insight.agent.admin.doc/GUID-40C13E10-1554-4F1B-B832-69CEBF85E7A0.html": { + "StatusCode": 206, + "LastSeen": "2024-11-02T23:00:10.422732673Z" + }, "https://docs.vmware.com/en/vRealize-Log-Insight/8.4/com.vmware.log-insight.agent.admin.doc/GUID-40C13E10-1554-4F1B-B832-69CEBF85E7A0.html": { "StatusCode": 206, "LastSeen": "2024-08-09T10:47:15.455246-04:00" @@ -12575,6 +12583,10 @@ "StatusCode": 200, "LastSeen": "2024-01-18T19:37:17.279668-05:00" }, + "https://web.archive.org/web/20240223142649/https://kofo.dev/how-to-mtls-in-golang": { + "StatusCode": 200, + "LastSeen": "2024-11-02T23:00:15.805376094Z" + }, "https://wicg.github.io/ua-client-hints/#interface": { "StatusCode": 206, "LastSeen": "2024-01-18T19:36:42.997199-05:00" @@ -13015,6 +13027,10 @@ "StatusCode": 206, "LastSeen": "2024-01-18T19:07:50.513752-05:00" }, + "https://www.ietf.org/archive/id/draft-ietf-uuidrev-rfc4122bis-14.html#name-uuid-version-7": { + "StatusCode": 200, + "LastSeen": "2024-11-02T23:00:01.024560709Z" + }, "https://www.ietf.org/rfc/rfc4122.txt": { "StatusCode": 206, "LastSeen": "2024-04-04T20:00:31.717502-04:00" From c8295a6ad2c1fc163573adfd05f80d4879671356 Mon Sep 17 00:00:00 2001 From: Miguel Luna <39376769+mlunadia@users.noreply.github.com> Date: Mon, 4 Nov 2024 07:12:37 +0000 Subject: [PATCH 74/76] [es] adding docs/concepts/components (#5391) Co-authored-by: Fabrizio Ferri-Benedetti --- content/es/docs/concepts/components.md | 146 +++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 content/es/docs/concepts/components.md diff --git a/content/es/docs/concepts/components.md b/content/es/docs/concepts/components.md new file mode 100644 index 000000000000..be665264af10 --- /dev/null +++ b/content/es/docs/concepts/components.md @@ -0,0 +1,146 @@ +--- +title: Componentes +description: Componentes que forman OpenTelemetry +aliases: [data-collection] +weight: 20 +default_lang_commit: 9b7da35fd7abd77d867177902b36d95e5f322182 +--- + +OpenTelemetry está compuesto por varios componentes principales: + +- [Especificación](#especificación) +- [Collector](#collector) +- [Implementaciones de API y SDK específicas del lenguaje](#implementaciones-de-api-y-sdk-específicas-del-lenguaje) + - [Librerías de Instrumentación](#librerías-de-instrumentación) + - [Exportadores](#exportadores) + - [Instrumentación sin código](#instrumentación-sin-código) + - [Detectores de Recursos](#detectores-de-recursos) + - [Propagadores entre servicios](#propagadores-entre-servicios) + - [Muestreadores](#muestreadores) +- [Operador de Kubernetes](#operador-de-kubernetes) +- [Elementos de Función como Servicio](#elementos-de-función-como-servicio) + +OpenTelemetry te permite reemplazar la necesidad de SDKs y herramientas +específicas de proveedores para generar y exportar datos de telemetría. + +## Especificación + +Describe los requisitos y expectativas multilenguaje para todas las +implementaciones. Más allá de la definición de términos, la especificación +define lo siguiente: + +- **API:** Define tipos de datos y operaciones para generar y correlacionar + datos de trazas, métricas y logs. +- **SDK:** Define requisitos para una implementación específica del lenguaje de + la API. La configuración, procesamiento de datos y conceptos de exportación + también se definen aquí. +- **Datos:** Define el Protocolo de OpenTelemetry (OTLP) y convenciones + semánticas neutrales que un backend de telemetría puede soportar. + +Para más información, consulta las [especificaciones](/docs/specs/). + +## Collector + +El Collector de OpenTelemetry es un proxy neutral que puede recibir, procesar y +exportar datos de telemetría. Soporta recibir datos de telemetría en múltiples +formatos (por ejemplo, OTLP, Jaeger, Prometheus, así como muchas herramientas +comerciales/proprietarias) y enviar datos a uno o más backends. También permite +procesar y filtrar datos de telemetría antes de exportarlos. + +Para más información, consulta el [Collector](/docs/collector/). + +## Implementaciones de API y SDK específicas del lenguaje + +OpenTelemetry también cuenta con SDKs específicos para cada lenguaje que te +permiten usar la API de OpenTelemetry para generar datos de telemetría en el +lenguaje de tu elección y exportarlos a un backend preferido. Estos SDKs también +permiten incorporar librerías de instrumentación para librerías y frameworks +comunes, que puedes utilizar para conectar la instrumentación manual en tu +aplicación. + +Para más información, consulta +[Instrumentación](/docs/concepts/instrumentation/). + +### Librerías de instrumentación + +OpenTelemetry soporta una amplia gama de componentes que generan datos de +telemetría relevantes desde librerías y frameworks populares para los lenguajes +soportados. Por ejemplo, las solicitudes HTTP entrantes y salientes desde una +librería HTTP generan datos sobre esas solicitudes. + +Un objetivo aspiracional de OpenTelemetry es que todas las librerías populares +estén diseñadas para ser observables por defecto, para que no se requieran +dependencias separadas. + +Para más información, consulta +[Instrumentación de librerías](/docs/concepts/instrumentation/libraries/). + +### Exportadores + +{{% docs/languages/exporters/intro %}} + +### Instrumentación sin código + +Si aplica, una implementación específica de OpenTelemetry en un lenguaje +proporciona una forma de instrumentar tu aplicación sin tocar el código fuente. +Aunque el mecanismo subyacente depende del lenguaje, la instrumentación sin +código añade las capacidades de API y SDK de OpenTelemetry a tu aplicación. +Adicionalmente, puede añadir un conjunto de librerías de instrumentación y +dependencias de exportador. + +Para más información, consulta +[Instrumentación sin código](/docs/concepts/instrumentation/zero-code/). + +### Detectores de recursos + +Un [recurso](/docs/concepts/resources/) representa la entidad que produce +telemetría como atributos de tipo recurso. Por ejemplo, un proceso que produce +telemetría y que se está ejecutando en un contenedor en Kubernetes tiene el +nombre del Pod, un nombre del namespace y posiblemente un nombre del Deployment. +Puedes incluir todos estos atributos como tipo recurso. + +Las implementaciones específicas de OpenTelemetry para cada lenguaje +proporcionan detección de recursos desde la variable de entorno +`OTEL_RESOURCE_ATTRIBUTES` y para muchas entidades comunes, como el runtime del +proceso, servicio, host o sistema operativo. + +Para más información, consulta [Recursos](/docs/concepts/resources/). + +### Propagadores entre servicios + +La propagación es el mecanismo que transfiere datos entre servicios y procesos. +Aunque no está limitado a las trazas, la propagación permite que las trazas +construyan información causal sobre un sistema a través de servicios +distribuidos arbitrariamente entre fronteras de procesos y redes. + +Para la gran mayoría de los casos, la propagación de contexto ocurre a través de +librerías de instrumentación. Si es necesario, puedes utilizar propagadores tú +mismo para serializar y deserializar intereses compartidos, como el contexto de +un span y el [equipaje](/docs/concepts/signals/baggage/). + +### Muestreadores + +El muestreo es un proceso que restringe la cantidad de trazas generadas por un +sistema. Cada implementación específica de OpenTelemetry para un lenguaje ofrece +varios [muestreadores de cabecera](/docs/concepts/sampling/#head-sampling). + +Para más información, consulta [Muestreo](/docs/concepts/sampling). + +## Operador de Kubernetes + +El Operador de OpenTelemetry es una implementación de un Operador de Kubernetes. +El operador gestiona el Collector de OpenTelemetry y la auto-instrumentación de +las aplicaciones usando OpenTelemetry. + +Para más información, consulta el [Operador K8s](/docs/kubernetes/operator/). + +## Elementos de Función como Servicio + +OpenTelemetry soporta varios métodos de monitoreo para Function-as-a-Service +proporcionados por diferentes proveedores de servicios en la nube. La comunidad +de OpenTelemetry proporciona capas Lambda prefabricadas capaces de +auto-instrumentar tu aplicación, así como la opción de una capa Lambda de +Collector independiente que puede usarse al instrumentar aplicaciones manual o +automáticamente. + +Para más información, consulta [Funciones como Servicio](/docs/faas/). From 974cfd13b8f11557c491f47cbc3c6fc5eec9432e Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Mon, 4 Nov 2024 02:47:21 -0500 Subject: [PATCH 75/76] [CI] Avoid dup htmltest config for blog pages (#5518) --- .htmltest.yml | 2 ++ content/en/blog/_index.md | 2 ++ content/zh/blog/_index.md | 3 --- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.htmltest.yml b/.htmltest.yml index bd55c60045d9..2278e2d4e6ac 100644 --- a/.htmltest.yml +++ b/.htmltest.yml @@ -8,6 +8,8 @@ CheckMailto: false TestFilesConcurrently: true IgnoreDirs: # DO NOT EDIT! IgnoreDirs list is auto-generated from markdown file front matter. + # 2024-11-03 The following entry is for `en` pages only. Other locales do + # not currently require it. - ^blog/(\d+/)?page/\d+ # TODO drop next line after https://github.com/open-telemetry/opentelemetry.io/issues/5423 is fixed for ja pages: - ^ja/docs/concepts/instrumentation/libraries/ diff --git a/content/en/blog/_index.md b/content/en/blog/_index.md index 7d0b3e2d57bf..8de02c03c741 100644 --- a/content/en/blog/_index.md +++ b/content/en/blog/_index.md @@ -5,5 +5,7 @@ redirects: [{ from: '', to: '2024/ 301!' }] outputs: [HTML, RSS] htmltest: IgnoreDirs: + # 2024-11-03 The following entry is for `en` pages only. Other locales do + # not currently require it. - ^blog/(\d+/)?page/\d+ --- diff --git a/content/zh/blog/_index.md b/content/zh/blog/_index.md index 74a812f4909b..28910ac4a474 100644 --- a/content/zh/blog/_index.md +++ b/content/zh/blog/_index.md @@ -3,8 +3,5 @@ title: 博客 menu: { main: { weight: 50 } } redirects: [{ from: '', to: '2024/ 301!' }] outputs: [HTML, RSS] -htmltest: - IgnoreDirs: - - ^blog/(\d+/)?page/\d+ default_lang_commit: 4c5468f8d16434f25f335e1b45922ca0f4cec18f --- From d3c66e3ab27c11f839a04bd59718e0dbfa0f49ff Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Mon, 4 Nov 2024 10:52:18 -0500 Subject: [PATCH 76/76] Blog RSS workaround via redirect (#5520) --- content/en/blog/_index.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/content/en/blog/_index.md b/content/en/blog/_index.md index 8de02c03c741..9fddb96c7694 100644 --- a/content/en/blog/_index.md +++ b/content/en/blog/_index.md @@ -1,7 +1,11 @@ --- title: Blog menu: { main: { weight: 50 } } -redirects: [{ from: '', to: '2024/ 301!' }] +redirects: + # Every January, update the year number in the paths below + - { from: '', to: '2024/ 301!' } + # Workaround to https://github.com/open-telemetry/opentelemetry.io/issues/4440: + - { from: 'index.xml', to: '2024/index.xml 301!' } outputs: [HTML, RSS] htmltest: IgnoreDirs: