diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 906f58787d93..f61d9e7aba30 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -13,4 +13,4 @@
#
# Global owners, will be the owners for everything in the repo.
-* @open-telemetry/docs-approvers
\ No newline at end of file
+* @open-telemetry/docs-approvers
diff --git a/.github/component-label-map.yml b/.github/component-label-map.yml
index e1e0116a0080..1b1a7cae663c 100644
--- a/.github/component-label-map.yml
+++ b/.github/component-label-map.yml
@@ -26,6 +26,7 @@ sig:go:
- changed-files:
- any-glob-to-any-file:
- content/en/docs/languages/go/**
+ - content/en/docs/zero-code/go/**
sig:java:
- changed-files:
- any-glob-to-any-file:
diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml
index 88d8f3033ab0..9897cb3c5018 100644
--- a/.github/workflows/check-i18n.yml
+++ b/.github/workflows/check-i18n.yml
@@ -4,12 +4,15 @@ on:
pull_request:
jobs:
- i18n-check:
+ check-i18n:
name: I18N check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # all
- - run: scripts/i18n-check.sh -u
- - run: .github/workflows/scripts/i18n-check-helper.sh
+ - name: Any files missing hash key?
+ run: scripts/check-i18n.sh -n -x -v
+ - name: Any files with invalid hash keys?
+ run: scripts/check-i18n.sh -v
+ - run: .github/workflows/scripts/check-i18n-helper.sh
diff --git a/.github/workflows/scripts/i18n-check-helper.sh b/.github/workflows/scripts/check-i18n-helper.sh
similarity index 57%
rename from .github/workflows/scripts/i18n-check-helper.sh
rename to .github/workflows/scripts/check-i18n-helper.sh
index 8887a0dcf45e..f83f3825279b 100755
--- a/.github/workflows/scripts/i18n-check-helper.sh
+++ b/.github/workflows/scripts/check-i18n-helper.sh
@@ -10,12 +10,12 @@ if [[ -z $CHANGES ]]; then
fi
cat < website.
-
-### Setup
-
-#### Cloud-IDE setup
-
-These instructions are for [Gitpod.io][], adjust as needed for your favorite
-cloud IDE:
-
-1. Fork this repository. For help, see [Fork a repository][fork].
-2. From [gitpod.io/workspaces][], create a new workspace (do this only once) or
- open an existing workspace over your fork. You can also visit a link of the
- form:
- .
-
- > **Note**: If you have the necessary permissions to work from this
- > repository, or just want to look around, open
- > .
-
-Gitpod will automatically install the repo-specific packages for you. You're now
-ready to [build](#build), [serve](#serve) and/or make updates to the website
-files.
-
-#### Local setup
-
-1. [Fork][] and then [clone][] this repository.
-2. **Change** to the repository directory.
-3. **Install or upgrade** to the [**active LTS** release][nodejs-rel] of
- **Node.js**. We recommend using **[nvm][]** to manage your Node
- installation. Under Linux, run the following command (which will
- install/upgrade to the version specified in [.nvmrc][]):
-
- ```sh
- nvm install
- ```
-
- To [install under Windows][nodejs-win], use [nvm-windows][]:
-
- ```cmd
- > nvm install lts && nvm use lts
- ```
-
-4. Get npm packages and other prerequisites:
-
- ```sh
- npm install
- ```
-
-You're now ready to [build](#build), [serve](#serve) and/or make updates to the
-website files.
-
-### Build
-
-To **build** the site run:
-
-```sh
-npm run build
-```
-
-You'll find the generated site files under `public`.
-
-### Serve
-
-To **serve** the site run:
-
-```sh
-npm run serve
-```
-
-The site will be served at [localhost:1313][].
-
-If you need to test [Netlify] redirects, use the following command, and visit
-the site at [localhost:8888][]:
-
-```sh
-npm run serve:netlify
-```
-
-> **Note 1**: The serve command serves files from memory, not from disk.
->
-> **Note 2**: See an error like `too many open files` or `pipe failed` under
-> macOS? You may need to increase the file descriptor limit. See
-> [Hugo issue #6109](https://github.com/gohugoio/hugo/issues/6109).
-
-### Content and submodules
-
-The website is built from the following content:
-
-- Files under `content/`, `static/`, etc. per [Hugo][] defaults.
-- Mount points, defined in [hugo.yaml][] under `mounts`. Mounts are either
- directly from git submodules under [content-modules][], or preprocessed
- content from `content-modules` (placed under `tmp/`), and no where else.
-
-[hugo.yaml]:
- https://github.com/open-telemetry/opentelemetry.io/blob/main/hugo.yaml
-[content-modules]:
- https://github.com/open-telemetry/opentelemetry.io/tree/main/content-modules
-
-### Submodule changes
-
-If you change any content inside of a [content-modules][] submodule, then you'll
-need to **_first_** submit a PR (containing the submodule changes) to the
-submodule's repository. Only after the submodule PR has been accepted, can you
-update the submodule and have the changes appear in this website.
-
-It is easiest to manage your `content-modules` changes by working with the
-repository that the corresponding submodule is linked to, rather than inside the
-submodule itself.
-
-> **For expert contributors**, you can work directly in the submodule. You'll
-> then be able to directly build and serve your (submodule) changes. By default,
-> the CI scripts get submodules on every invocation. To prevent this behavior
-> while you work within a submodule, set the environment variable `GET=no`.
-> You'll also need to `git fetch --unshallow` the submodule before you can
-> submit a PR. Alternatively, set `DEPTH=100` and re-fetch submodules.
-
-## Approver and Maintainer practices
-
-This last section includes guidelines and some common practices used by
-approvers and maintainers while doing code reviews:
-
-- PRs with changes to documentation co-owned by a SIG (collector, demo,
- language-specific...) should aim for two approvals: one by a docs approver and
- one by a SIG approver:
- - Doc approver label such PRs with `sig:` and tag the SIG `-approvers`
- group on that PR
- - If no SIG approval is given within a certain grace period (two weeks in
- general, but may be less in urgent cases), docs maintainer may use their own
- judgement to merge that PR
-- If the PR branch is `out-of-date with the base branch`, they do not need to be
- updated continuously: every update triggers all the PR CI checks to be run!
- It's often enough to update them before merging.
-- A PR by non-maintainers should **never** update git sub modules. This happens
- by accident from time to time. Let the PR author know that they should not
- worry about it, we will fix this before merging, but in the future they should
- make sure that they work from an up-to-date fork.
-- If the contributor is having trouble signing the CLA or used the wrong email
- by mistake in one of their commits, ask them to fix the issue or rebase the
- pull request. Worst case scenario, close and re-open the PR to trigger a new
- CLA check.
-- Words unknown to cspell should be added to the cspell ignore list per page by
- PR authors. Only approvers and maintainers will add commonly used terms to the
- global list.
-- When an approver or maintainer won't be available to contribute for an
- extended period of time (more than a few days or a week) or won't be available
- in that period of time, they should communicate this using the
- [#otel-comms](https://cloud-native.slack.com/archives/C02UN96HZH6) channel and
- updating the GitHub status.
-
-[.nvmrc]: .nvmrc
-[clone]:
- https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository
-[fork]: https://docs.github.com/en/get-started/quickstart/fork-a-repo
-[gitpod.io]: https://gitpod.io
-[gitpod.io/workspaces]: https://gitpod.io/workspaces
-[hugo]: https://gohugo.io
-[localhost:1313]: http://localhost:1313
-[localhost:8888]: http://localhost:8888
-[netlify]: https://netlify.com
-[new-issue]:
- https://github.com/open-telemetry/opentelemetry.io/issues/new/choose
-[nodejs-rel]: https://nodejs.org/en/about/previous-releases
-[nodejs-win]:
- https://docs.microsoft.com/en-us/windows/dev-environment/javascript/nodejs-on-windows
-[nvm]:
- https://github.com/nvm-sh/nvm/blob/master/README.md#installing-and-updating
-[nvm-windows]: https://github.com/coreybutler/nvm-windows
-[org]: https://github.com/open-telemetry
+To learn how to contribute new content and fixes to this project, see
+[Contributing](https://opentelemetry.io/docs/contributing/), which includes a
+style guide and useful information on the review process.
diff --git a/README.md b/README.md
index cb27b13cb7c9..3d2973e89694 100644
--- a/README.md
+++ b/README.md
@@ -27,9 +27,16 @@ to the registry][].
## Contributing
-We have curated some issues with the tags [help wanted][] and [good first
-issue][]. This should allow you to quickly find a place to contribute. See [CONTRIBUTING.md][]
-for more information.
+See the [Contributing](https://opentelemetry.io/docs/contributing) page on our
+docs.
+
+## Found a security issue?
+
+If you discover a security issue, read the
+[Security Policy](https://github.com/open-telemetry/opentelemetry.io/security/policy)
+before opening an issue.
+
+## Meetings
We, the OTel Communications SIG, meet every two weeks on Monday at 10:00 PT.
Check out the [OpenTelemetry community calendar][] for the Zoom link and any
@@ -38,16 +45,19 @@ updates to this schedule.
Meeting notes are available as a public [Google doc][]. If you have trouble accessing
the doc, get in touch in the `#otel-comms` channel on [Slack][].
+## Roles
+
Here is a list of community roles with current and previous members:
- Approvers: [@open-telemetry/docs-approvers][]
- - [Fabrizio Ferri-Benedetti](https://github.com/theletterf), Splunk
- [Michael Hausenblas](https://github.com/mhausenblas), Amazon
+ - [Tiffany Hrabusa](https://github.com/tiffany76)
- Maintainers: [@open-telemetry/docs-maintainers][]
- [Austin Parker](https://github.com/austinlparker), Honeycomb
+ - [Fabrizio Ferri-Benedetti](https://github.com/theletterf), Splunk
- [Patrice Chalin](https://github.com/chalin), CNCF
- [Phillip Carter](https://github.com/cartermp), Honeycomb
- [Severin Neumann](https://github.com/svrnm), Cisco
@@ -82,16 +92,12 @@ contributed][contributors]!
[contributing.md]: CONTRIBUTING.md
[contributors]:
https://github.com/open-telemetry/opentelemetry.io/graphs/contributors
-[hugo]: https://gohugo.io
-[netlify]: https://netlify.com
[opentelemetry]: https://opentelemetry.io
[registry]: https://opentelemetry.io/ecosystem/registry/
[opentelemetry community calendar]:
https://calendar.google.com/calendar/embed?src=google.com_b79e3e90j7bbsa2n2p5an5lf60%40group.calendar.google.com
-[help wanted]:
- https://github.com/open-telemetry/opentelemetry.io/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22
-[good first issue]:
- https://github.com/open-telemetry/opentelemetry.io/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22
[google doc]:
https://docs.google.com/document/d/1wW0jLldwXN8Nptq2xmgETGbGn9eWP8fitvD5njM-xZY/edit?usp=sharing
[slack]: https://slack.cncf.io/
+[hugo]: https://gohugo.io
+[netlify]: https://netlify.com
diff --git a/content-modules/opentelemetry-go b/content-modules/opentelemetry-go
index eabcef4c2da6..5661ff0ded32 160000
--- a/content-modules/opentelemetry-go
+++ b/content-modules/opentelemetry-go
@@ -1 +1 @@
-Subproject commit eabcef4c2da6149b7e6dbbb8b7294402fcc287c1
+Subproject commit 5661ff0ded32cf1b83f1147dae96ca403c198504
diff --git a/content-modules/opentelemetry-proto b/content-modules/opentelemetry-proto
index b3060d2104df..40b3c1b74676 160000
--- a/content-modules/opentelemetry-proto
+++ b/content-modules/opentelemetry-proto
@@ -1 +1 @@
-Subproject commit b3060d2104df364136d75a35779e6bd48bac449a
+Subproject commit 40b3c1b746767cbc13c2e39da3eaf1a23e54ffdd
diff --git a/content-modules/opentelemetry-specification b/content-modules/opentelemetry-specification
index a7bb6473769d..518b1a57df9c 160000
--- a/content-modules/opentelemetry-specification
+++ b/content-modules/opentelemetry-specification
@@ -1 +1 @@
-Subproject commit a7bb6473769d93ddbe063071c94729a242a2cdb2
+Subproject commit 518b1a57df9c5dcb1e7110b408cb4c16e9c28505
diff --git a/content/en/blog/2022/debug-otel-with-otel/index.md b/content/en/blog/2022/debug-otel-with-otel/index.md
index 530842a4f0bf..622f09478107 100644
--- a/content/en/blog/2022/debug-otel-with-otel/index.md
+++ b/content/en/blog/2022/debug-otel-with-otel/index.md
@@ -261,4 +261,4 @@ COPY opentelemetry_module.conf /etc/nginx/conf.d
https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases/tag/webserver%2Fv1.0.1
[java]:
/docs/zero-code/java/agent/configuration/#capturing-http-request-and-response-headers
-[python]: /docs/languages/python/automatic/
+[python]: /docs/zero-code/python/
diff --git a/content/en/blog/2023/end-user-discussions-03.md b/content/en/blog/2023/end-user-discussions-03.md
index fd88538c28a7..a7e2b4497c27 100644
--- a/content/en/blog/2023/end-user-discussions-03.md
+++ b/content/en/blog/2023/end-user-discussions-03.md
@@ -190,7 +190,7 @@ agent to the host metrics receiver for infrastructure monitoring.
maturing in OTel; for example, the Java JAR agent takes care of instrumenting
[most libraries](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md#libraries--frameworks)
that are used by applications. Auto-instrumentation is also available for
- [Python](/docs/languages/python/automatic/), [.NET](/docs/zero-code/net/), and
+ [Python](/docs/zero-code/python/), [.NET](/docs/zero-code/net/), and
[Node.js](/docs/zero-code/js/).
- If you’re using Kubernetes, they can use the
[OTel operator](https://github.com/open-telemetry/opentelemetry-operator),
diff --git a/content/en/blog/2023/end-user-q-and-a-01.md b/content/en/blog/2023/end-user-q-and-a-01.md
index b0fae1f5b62a..ccb51f0cb0df 100644
--- a/content/en/blog/2023/end-user-q-and-a-01.md
+++ b/content/en/blog/2023/end-user-q-and-a-01.md
@@ -169,7 +169,7 @@ They are hoping to leverage
[OpenTelemetry’s Exemplars](/docs/specs/otel/metrics/data-model/#exemplars) to
link traces and metrics.
-### How is the organization sending telemetry data to various observability back-ends?
+### How is the organization sending telemetry data to various observability backends?
J’s team uses a combination of the proprietary backend agent and the
OpenTelemetry Collector (for metrics). They are one of the primary users of
diff --git a/content/en/blog/2023/php-auto-instrumentation/index.md b/content/en/blog/2023/php-auto-instrumentation/index.md
index d24e5db88b71..8c8b924b47d3 100644
--- a/content/en/blog/2023/php-auto-instrumentation/index.md
+++ b/content/en/blog/2023/php-auto-instrumentation/index.md
@@ -153,7 +153,7 @@ We have all necessary components in place:
and frameworks.
- Development tools that can help lower barrier for users and developers
interested in instrumenting arbitrary code.
-- [Documentation](/docs/languages/php/automatic/)
+- [Documentation](/docs/zero-code/php/)
One of our goals is to increase awareness of this work and involve more people
that will help us improve it, extend coverage and fix bugs.
diff --git a/content/en/blog/2024/hardening-the-collector-one.md b/content/en/blog/2024/hardening-the-collector-one.md
new file mode 100644
index 000000000000..12d92c0976d3
--- /dev/null
+++ b/content/en/blog/2024/hardening-the-collector-one.md
@@ -0,0 +1,149 @@
+---
+title: 'Hardening the Collector Episode 1: A new default bind address'
+linkTitle: A new default bind address for the Collector
+date: 2024-07-02
+author: '[Pablo Baeyens](https://github.com/mx-psi) (OpenTelemetry, Datadog)'
+# prettier-ignore
+cSpell:ignore: awsfirehose awsproxy awsxray Baeyens jaegerremotesampling loki OSTIF remotetap sapm signalfx skywalking splunk
+issue: 4760
+sig: Collector SIG
+---
+
+The OpenTelemetry Collector recently went through a security audit sponsored by
+the [CNCF](https://www.cncf.io/), facilitated by [OSTIF](https://ostif.org/),
+and performed by [7ASecurity](https://7asecurity.com/). As part of this process
+we published a security advisory related to a
+[DoS vulnerability](/blog/2024/cve-2024-36129/) that was
+[fully addressed in v0.102.1](https://github.com/open-telemetry/opentelemetry-collector/releases/tag/v0.102.1).
+
+The security audit also motivated us to think about ways to harden official
+Collector builds and have a more secure default configuration. We are working on
+adopting [several][releases-586] [best][core-10469] [practices][core-10470] that
+were recommended in the audit to achieve this and we will be publishing a series
+of blog posts to keep the community informed. While we expect the report to be
+made public soon, we can already say that we are very satisfied with the
+confirmation that the Collector has proven to be very secure, highlighting the
+secure coding practices and processes we already have in place.
+
+One of the changes we have been working on is changing the default bind address
+for Collector servers, such as those exposed by receivers or extensions that
+listen for incoming connections. Up to v0.103.0, the default behavior was to
+listen on all network interfaces by using the
+[unspecified address `0.0.0.0`](https://en.wikipedia.org/wiki/0.0.0.0) on server
+addresses. While this is a convenient default for test cases and development
+environments, it is
+[not the recommended practice for production environments](https://cwe.mitre.org/data/definitions/1327.html),
+since it can expose the Collector servers to unnecessary risks. Starting on
+v0.104.0 the default bind address becomes `localhost` for all Collector servers.
+
+It has been a long way to get here. We started discussing this in relation to
+[CVE-2022-27664](https://github.com/advisories/GHSA-69cg-p879-7622) on [v0.63.0
+(September 2022)][core-6151], when we added a warning and improved our
+documentation. On [v0.94.0 (September 2023)][core-8510], we decided to add a
+feature gate, `component.UseLocalHostAsDefaultHost` to allow users to opt-in to
+the new behavior. Finally, this feature gate was enabled by default on [v0.104.0
+(June 2024)][core-10352] motivated by the security audit and
+[CVE-2024-36129](/blog/2024/cve-2024-36129/).
+
+## What have we changed?
+
+Starting on v0.104.0, the default bind address of all servers exposed by the
+Collector are `localhost` instead of `0.0.0.0`. For example, the OTLP receiver
+default endpoints for OTLP/gRPC and OTLP/HTTP are now `localhost:4317` and
+`localhost:4318` respectively. The full list of components affected by this
+change is:
+
+- [`otlp` receiver](https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otlpreceiver#otlp-receiver)
+- [`awsfirehose` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/awsfirehosereceiver#aws-kinesis-data-firehose-receiver)
+- [`awsxray` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/awsxrayreceiver#aws-x-ray-receiver)
+- [`influxdb` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/influxdbreceiver#influxdb-receiver)
+- [`jaeger` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/jaegerreceiver#jaeger-receiver)
+- [`loki` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/lokireceiver#loki-receiver)
+- [`opencensus` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/opencensusreceiver#opencensus-receiver)
+- [`sapm` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/sapmreceiver#sapm-receiver)
+- [`signalfx` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/signalfxreceiver#signalfx-receiver)
+- [`skywalking` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/skywalkingreceiver#skywalking-receiver)
+- [`splunk_hec` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/splunkhecreceiver#splunk-hec-receiver)
+- [`zipkin` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/zipkinreceiver#zipkin-receiver)
+- [`zookeeper` receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/zookeeperreceiver#zookeeper-receiver)
+- [`awsproxy` extension](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/awsproxy#aws-proxy)
+- [`health_check` extension](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/healthcheckextension#health-check)
+- [`jaegerremotesampling` extension](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/jaegerremotesampling#jaegers-remote-sampling-extension)
+- [`remotetap` processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/remotetapprocessor#remote-tap-processor)
+
+When in doubt, check the specific components' documentation to see the new
+default values.
+
+Starting on the [OpenTelemetry Collector Helm Chart][helm-chart] v0.47.1 and on
+v0.87.0 of the OpenTelemetry Collector official Docker images we updated the
+default configuration for all components to explicitly set the endpoints to an
+explicit value.
+
+## What does it mean to me?
+
+If you are relying on the default configuration you may need to start explicitly
+setting the endpoint on your Collector components. For example, if you are using
+the following configuration with the OTLP receiver:
+
+```yaml
+receivers:
+ otlp:
+ protocols:
+ grpc:
+```
+
+You may now need to explicitly set the `otlp::protocols::grpc::endpoint`
+[configuration setting](https://github.com/open-telemetry/opentelemetry-collector/blob/v0.103.0/receiver/otlpreceiver/config.md):
+
+```yaml
+receivers:
+ otlp:
+ protocols:
+ grpc:
+ endpoint: ${env:HOST_IP}:4317
+```
+
+where the `HOST_IP` environment variable is set to the bind address you want to
+use (for example, `status.podIP` on Kubernetes).
+
+Because of the changes in the Collector Helm Chart and Collector Docker images
+you are not affected if using the default configuration on either of these.
+
+## How can I prepare for this change?
+
+Since v0.63.0 the Collector logs a warning related to this when you have an
+endpoint using the 0.0.0.0 address. Before upgrading, you can check for this
+warning and address it. From v0.94.0 to v0.103.0 you can also preview the impact
+of this change by [enabling][feature-gate] the
+`component.UseLocalHostAsDefaultHost` feature gate.
+
+Addressing this change should be straightforward, however, due to the number of
+components that are impacted, starting on v0.104.0 you can temporarily opt out
+of this change by disabling the `component.UseLocalHostAsDefaultHost` feature
+gate so you can work on addressing this at your own pace. This feature gate will
+be marked as stable in a future Collector release, so we recommend addressing
+this as soon as possible.
+
+## What's next?
+
+As we work on adopting the best practices recommended by the security audit, we
+will be publishing more blog posts to keep the community informed. This will
+include hardening the Collector binaries on macOS and further the default
+behavior of Collector servers. Stay tuned!
+
+[helm-chart]:
+ https://github.com/open-telemetry/opentelemetry-helm-charts?tab=readme-ov-file#opentelemetry-collector
+[feature-gate]:
+ https://github.com/open-telemetry/opentelemetry-collector/tree/v0.103.0/featuregate#controlling-gates
+[releases-586]:
+ https://github.com/open-telemetry/opentelemetry-collector-releases/issues/586
+[core-6151]:
+ https://github.com/open-telemetry/opentelemetry-collector/issues/6151
+[core-8510]:
+ https://github.com/open-telemetry/opentelemetry-collector/issues/8510
+[core-10469]:
+ https://github.com/open-telemetry/opentelemetry-collector/issues/10469
+[core-10470]:
+ https://github.com/open-telemetry/opentelemetry-collector/issues/10470
+[core-10352]:
+ https://github.com/open-telemetry/opentelemetry-collector/pull/10352
diff --git a/content/en/blog/2024/humans-of-otel-eu-2024.md b/content/en/blog/2024/humans-of-otel-eu-2024.md
new file mode 100644
index 000000000000..1acb1c05f6d9
--- /dev/null
+++ b/content/en/blog/2024/humans-of-otel-eu-2024.md
@@ -0,0 +1,514 @@
+---
+title: The Humans OpenTelemetry - KubeCon EU 2024
+linkTitle: Humans of OTel EU 2024
+date: 2024-06-15
+author: >-
+ [Adriana Villela](https://github.com/avillela) (ServiceNow),
+issue: 4660
+sig: End User SIG
+# prettier-ignore
+cSpell:ignore: adnan blanco bsfMECwmsm0 centralizations dyrmishi fintech jiekun mclean observability odegaard rahić reopelle sheeran skyscanner stackdriver tracetest vijay youtube
+---
+
+We're back with our second edition of
+[Humans of OpenTelemetry](/blog/2023/humans-of-otel/), this time from KubeCon EU
+in Paris. Once again, [Reese Lee](https://github.com/reese-lee) and I
+interviewed OpenTelemetry contributors and end users, and learned how they got
+involved with OTel:
+
+- [Iris Dyrmishi (Miro)](https://www.linkedin.com/in/iris-dyrmishi-b15a9a164/)
+- [Severin Neumann (Cisco)](https://github.com/svrnm)
+- [Kayla Reopelle (New Relic)](https://github.com/kaylareopelle)
+- [Morgan McLean (Splunk)](https://github.com/mtwo)
+- [Henrik Rexed (Dynatrace)](https://github.com/henrikrexed)
+- [Vijay Samuel (eBay)](https://github.com/ccaraman)
+- [Daniel Gomez Blanco (Skyscanner)](https://github.com/danielgblanco)
+- [Doug Odegaard (ServiceNow)](https://github.com/dodegaard)
+- [Adnan Rahić (Tracetest)](https://github.com/adnanrahic)
+- [Rynn Mancuso (Honeycomb)](https://github.com/musingvirtual)
+
+Also, special thanks to:
+
+- [Reese Lee](https://github.com/reese-lee), my co-interviewer
+- [Henrik Rexed](https://github.com/henrikrexed) for providing the audio and
+ video recording equipment, and doing the initial edits of the raw footage
+- [Zhu Jiekun](https://github.com/jiekun) for assisting with his own camera
+
+You can watch the full recording here:
+
+{{}}
+
+ Thanks to everyone who has contributed to OpenTelemetry to date, and we
+look forward to your continued contributions in 2024 and beyond! 🎉
+
+## Transcript
+
+If reading is more your thing, check out the transcript of our conversations
+below.
+
+### 1- Meet the Humans of OTel
+
+**IRIS DYRMISHI:** Well, I'm Iris Dyrmishi. I'm a senior observability engineer
+at Miro and my life, my professional life is all about observability. I build an
+observability platform that provides the tools for engineering teams at Miro to
+monitor, to observe and get the best of their applications.
+
+**SEVERIN NEUMANN:** My name is Severin Neumann. I'm working at Cisco at the
+open source program office and I'm a member of the OpenTelemetry governance
+committee and I'm one of the co-maintainers of the OpenTelemetry documentation.
+
+**KAYLA REOPELLE:** My name is Kayla Reopelle. I work for New Relic and I am
+contributing to the OpenTelemetry Ruby project.
+
+**MORGAN MCLEAN:** My name is Morgan McLean,I'm a director of product management
+at Splunk.I've been with OpenTelemetry since day one. I'm one of the co-founders
+of the project. I'm on the governance committee. Wow. What do I work on within
+OTel?A bit of everything. I mean early on it was literally everything. Myself
+and Ted and various others were doing many, many jobs. More recently I was
+involved in the release of traces, metrics 1.0. Logs 1.0 last year. Right now
+I'm working on profiling as well as OpenTelemetry's expansion into mainframe
+computing.
+
+**HENRIK REXED:** My name is Henrik Rexed. I am a cloud native advocate at
+Dynatrace and I'm passionate about observability, performance, and I'm trying to
+help the community by providing content on getting started on any solutions out
+there.
+
+**VIJAY SAMUEL:** My name is Vijay Samuel and I help do architecture for the
+observability platform at eBay.
+
+**DANIEL GOMEZ BLANCO:** I'm Daniel Gomez Blanco. I'm a principal engineer at
+Skyscanner and also member of the OpenTelemetry governance committee.
+
+**DOUG ODEGAARD:** My name is Doug Odegaard. I'm a senior solutions architect
+with ServiceNow Cloud Observability, which is also formerly Lightstep. I'm also
+a previous customer of using OpenTelemetry for several years prior to that.
+
+**ADNAN RAHIĆ:** Hey, I am Adnan. I work at Tracetest as a developer advocate
+which is...you can guess better than me what that is. Pretty much do a bunch of
+everything regarding OpenTelemetry. I'm one of the contributors for the
+documentation, for the blog, and the demo.
+
+**RYNN MANCUSO:** My name is Rynn Mancuso. I work for Honeycomb.io and I am one
+of the maintainers of the End User SIG.
+
+### 2- What does observability mean to you?
+
+**IRIS DYRMISHI:** What does observability mean to me? observability to me is
+the biggest passion of my life and also my professional career. It is one of
+those areas that you are not very interested when you start your career because
+you don't know anything about it. It's not taught in school, it's not preached
+by the tech communities a lot, but then you discover it and say, "Wow, this is
+amazing!" We're actually making a change and we're helping the teams make the
+best of their product. So yeah, that's all.
+
+**SEVERIN NEUMANN:** I think observability is a big game changer, right? So it's
+evolution from what we have done, especially APM, over the last few years. So I
+worked for a very long time at AppDynamics and we sold APM agents to customers
+and we gave them a lot of the things that observability is promising today as
+well. But the big change I see with observability that it's coming down, let's
+say to everybody, right? So this is making the things that we did there
+available for everybody. And even more, we're moving away from this... Hey,
+let's add a post compilation agent into your application to like, yeah, let's
+make native observability. Let's make this a thing that developers, that
+operation teams are using across all the organizations.
+
+**KAYLA REOPELLE:** So to me observability means having peace of mind. It means
+having something that you can rely on in order to see what happened and what
+went wrong. I think observability is also a way to feel more technically
+connected to your customers and your users, so that you can see the ways that
+they're interacting with your software instead of just the ways that you might
+interact with it.
+
+**MORGAN MCLEAN:** I mean, observability to me transcends just the computing
+industry. It's the ability to peer into something and understand how it works,
+what it's doing right now, and thus if it breaks, how to fix it more quickly.
+Certainly when we think about telemetry in this industry, what observability
+classically has meant is visibility to backend infrastructure and applications
+kind of excitingly, I think it's expanding right now, right? With OpenTelemetry
+we're pushing into client applications, we're pushing into mainframes, as I
+mentioned earlier. And so it's really visibility into any systems that impact
+your business, any technical system observability.
+
+**HENRIK REXED:** Usually when people mention of observability they say it's a
+replacement of the old name monitoring. But in fact for me it's more than
+monitoring, because monitoring is like, you just look at something and
+observability is like having enough information to understand a given situation.
+So if you just look at metrics then, okay, you have a guess that something is
+going on, but you don't understand. So having the options to get more
+information like logs, events, exceptions, traces, compiling, then at the end
+combine all those dimensions together, then you say, okay, I got it, this is my
+problem and I can resolve it.
+
+**VIJAY SAMUEL:** What does observability mean to me? I belong to what is called
+the site engineering organization inside of eBay, and our goal is to make sure
+that we can observe everything that's going on in the site and ensure that we
+have high availability. So basically, observability means knowing if the site is
+running fine or not, because that's why I'm there.
+
+**DANIEL GOMEZ BLANCO:** What does observability mean to me? It's a way for us
+to understand what's happening within our systems, because we run quite a
+complex system, so we need to understand what goes on inside of them so we can
+deliver a good experience for our end users at the end of the day.
+
+**DOUG ODEGAARD:** So observability is, to me, I've been a full stack developer
+for years, and so as we observe...actually I ended up on an incident response
+team doing tracking of incidents, but also trying to figure out what was wrong.
+And it pointed out to me how much we need this, how hard it was to look at so
+many different screens and so forth.
+
+**ADNAN RAHIĆ:** So observability is, to me, I've been a full stack developer
+for years, and so as we observe...actually I ended up on an incident response
+team doing tracking of incidents, but also trying to figure out what was wrong.
+And it pointed out to me how much we need this, how hard it was to look at so
+many different screens and so forth.observability for me is the way to actually
+see what's happening in your system. It's the pinnacle of not being up the whole
+night trying to figure out what went wrong. And with OpenTelemetry and with the
+rise of tracing the last couple of years, it has hit an all time high with
+regards to the possibilities that we have right now. So I'm just really, really
+happy to be part of the project. I'm also really happy that it's growing at that
+pace, that it's growing right now, and I can't see how that's going to evolve
+within the next couple of years.
+
+**RYNN MANCUSO:** For me, observability is about being able to ask deeper
+questions of our systems, being able to demand, I think more than just alerting
+on things that are emergencies, things we've seen before, but actually being
+able to go out into the unknown and understand how complex systems are
+performing.
+
+### 3- What does OpenTelemetry mean to you?
+
+**IRIS DYRMISHI:** OpenTelemetry is the tool that is making observability great
+again. I would say that observability is seeing the surge, now that
+OpenTelemetry is becoming so popular, it's allowing centralization of telemetry
+signals, it's allowing semantic conventions, and it's generally helping
+observability teams and engineering teams take more attention to the
+observability and building it and making it better.
+
+**SEVERIN NEUMANN:** What does OpenTelemetry mean to me? I think it's the
+vehicle for observability. It's enabling that. And I joined OpenTelemetry
+community a few years back because I was curious about this idea to bring
+observability to everybody. And I think we are doing a really good job. And what
+it also means to me now is that it's an amazing community. Right? So we're at
+KubeCon here, and I meet so many people I just know from those conversations,
+and now I can talk to them in person. And we talk a lot about OpenTelemetry, but
+we also talk a lot about other things than OpenTelemetry. We talk about
+observability, of course, about what we think about is going to happen in a few
+years and all those other things, and that's what OpenTelemetry means to me.
+
+**KAYLA REOPELLE:** So OpenTelemetry to me seems like it's a community effort to
+take the best of what's already been out there for instrumentation and collect
+it in one group so that everyone can benefit from it. I think that we've learned
+so much as different agent engineers, but there's also so much to learn from
+users of the products themselves. And OpenTelemetry does a great job of bringing
+both people who are, you know, experts in observability, and experts in
+languages to make something that's really great and meaningful for everyone.
+
+**MORGAN MCLEAN:** I mean, OpenTelemetry is my baby. Put so much effort into
+creating this project. What does it mean to me? I mean, there's the boring
+answer, which is it extracts signals: metrics, traces, logs, profiles,
+everything else from your infrastructure, from your services, from your clients,
+makes those observable, processable on the backend. But I think to a lot of us
+who've been in this community so long, and a lot of us like yourself and Henrik
+here and others who participate in the community so much, I mean, OTel is also
+just a really nice open source community to participate in. It's a thing I just
+enjoy working on. I know that's abstract and kind of like a sort of squishy
+thing to say, but I don't know. OTel has a lot of meaning to me in many
+different ways. All very positive.
+
+**HENRIK REXED:** OpenTelemetry for me, means the future. Because at the end, by
+having an open standard, we have the luxury to have a common standard for common
+format, for all the solution of the market and having that common format for all
+the industry and all the vendors and all the solutions, it will just open use
+cases. I think testing used to rely on, I don't know, feedback from users. And
+now with observability data, we could be so much efficient in the way we're
+testing, we could be so much efficient in replacing marketing tools, business
+analytics tools. I think it's the future. And one thing that also a lot of
+people talk about, AI everywhere, machine learning, blah, blah, blah, but I
+think it's the same thing as a Tesla. I mean, Tesla, when you drive your car, it
+takes decisions based on the sensors that it measures. And if you don't have
+those sensors and those measurements, then you cannot have a smart... you can
+have the smartest systems, but without the data, you cannot take the right
+decisions. I think it's an enabler also for the future implementations of modern
+applications.
+
+**VIJAY SAMUEL:** OpenTelemetry is the standard for observability going forward,
+and it's very important because as we have gone through the journey of
+observability over the past few years, we have had to hunt for open standards in
+Prometheus and few others. Now, at least with ingestion and collection, it's a
+single standard for everyone to adopt. And I think that's pretty powerful for
+the long run.
+
+**DANIEL GOMEZ BLANCO:** What does OpenTelemetry mean to me? That, I think is
+bringing people together, bringing everyone together under one single language
+and the ones that way of thinking about telemetry. I think human languages are
+difficult enough for us to understand each other. And I think, you know,
+OpenTelemetry is bringing the technology together and one single way of like,
+thinking about telemetry, thinking about how we observe our systems.
+
+**DOUG ODEGAARD:** To me, OpenTelemetry is bringing the ability to have product
+teams, infrastructure teams, helping their jobs make it easier and also just
+improve the customer experience and just make it overall a better experience to
+do our jobs.
+
+**ADNAN RAHIĆ:** OpenTelemetry is the, I'm going to say, the future of
+observability. We've seen so many companies, many vendors move to an
+OpenTelemetry-first mindset, and the way that you can use OpenTelemetry to
+generate them, to actually gather all telemetry signals with one set of
+libraries, with one tool. It's just the way it was supposed to be. You're not
+locked into one tool, one vendor, one cloud provider anymore. You can do
+basically whatever you want, and you can use both the metrics, logs, and traces
+for basically anything you want to do. Really happy to see it.
+
+**RYNN MANCUSO:** OpenTelemetry is an instrumentation protocol that helps us ask
+more detailed questions about observability because it collects multiple signals
+from many flexible types of systems. Folks monitor everything from the control
+plane in Kubernetes all the way up to physical on-prem systems. It's a really
+flexible language and it's beautiful community of humans that came together over
+the pandemic to build something really special.
+
+### 4- How did you get involved with OpenTelemetry?
+
+**IRIS DYRMISHI:** I was working in a very fast-pacing observability team, and
+we were maintaining a lot of tools and we really did not have conventions there,
+we did not have centralizations and we really were not flexible when it came to
+backends and vendor agnostic in general. So we discovered this amazing tool
+called OpenTelemetry. We said okay, let's give it a try. It worked great for us.
+And here I am today, one year later, more than one year later, and let's say
+pushing the migration to OpenTelemetry in my second project.
+
+**SEVERIN NEUMANN:** How did I get involved into OpenTelemetry? So yeah, I
+mentioned that... so I got curious a few years ago. So I was... I was at
+AppDynamics working as a so-called domain architect, and I was an expert for
+Node.js, Python and a lot of those other languages. And there was always this
+conversation around like, hey, there's this thing now called OpenTelemetry and
+should we not integrate this into our product? And I was like, okay, I want to
+learn more. Then I was like, what is a good way to learn something new about an
+open source technology? Yeah, get involved into that. So I was involved in
+JavaScript at some point, and then at some point I realized like, yeah, but if I
+really want to get a good view into OpenTelemetry, doing documentation is a good
+way into that. And that's how I ended up being a maintainer for the
+documentation.
+
+**KAYLA REOPELLE:** I got involved in OpenTelemetry last spring when New Relic
+asked me to take a look at what the current status was of the OpenTelemetry Ruby
+project. I also work as an engineer on the New Relic Ruby agent team, and that
+gave me an opportunity to start to contribute to the project. And I noticed that
+a lot of the signals for Ruby weren't yet stable. So a lot of my work so far has
+been going into trying to bring logs and metrics to stability in Ruby.
+
+**MORGAN MCLEAN:** I was working at Google on Google's observability products
+like tracing, profiling, debugging, that sort of thing. And one of the
+challenges we had in tracing was getting data from people's applications. It's
+really, really hard. You need integrations of hundreds of thousands of pieces of
+software. No one team, no one company is going to maintain that. It's just
+infeasible. And so we want to do something open source. There were other open
+source standards. There was one that had started, I think, roughly around the
+same time we were doing this, called OpenTracing. We started OpenCensus.
+
+At some point, especially amongst the more social media savvy members, the team,
+which I am not one of, there was some contention between those projects about
+where people who maintain databases and language runtime things should actually
+spend their integration efforts, and it was limiting the success of both
+projects. So I was leading OpenCensus. Ted and Dan and others were leading
+OpenTracing. And in late 2018, early 2019, we finally sort of brought things to
+a head and decided to merge those into what is now called OpenTelemetry. So
+that's sort of, you know, I've been involved since then, I've been...now I work
+at Splunk. Different company, but still on the same types of things. But that's
+how my involvement started, and it's just grown and grown and snowballed from
+there.
+
+**HENRIK REXED:** When I started the adventure in observability, of course, I
+joined Dynatrace, and Dynatrace has their vendor agent, the OneAgent, and I saw
+this movement of OpenTelemetry, and coming from the performance background, I
+looked at it and I said, "Whoa, an open standard." "That sounds quite exciting"
+because I had a performance, a gig for a customer, where I implemented like a
+collecting logs and processing it and putting machine learning. And I told
+myself at that time, it would be so wonderful to have one common standard. So
+then instead of doing a custom implementation, I could have something for
+everyone. And when I looked at the, just the definition of the project and the
+things behind the project, I was so excited. I said, oh, gosh, I want to be
+involved in the project. And that's where I started to build content to help the
+community get started.
+
+I used to be a developer, but I'm a bad developer for sure. So that's why I'm
+trying to help the project in other ways, in all the directions. And yeah, my
+goal is increase the adoption of the open standards, making sure that it's been
+adopted everywhere, so then we can move forward by implementing even more
+exciting implementations.
+
+**VIJAY SAMUEL:** I started a few years ago for two reasons. One, we were
+looking to introduce tracing inside the company, and at that time, OpenTracing
+and OpenCensus was converging into OpenTelemetry. We started evaluating
+OpenTelemetry for that. And given that we were moving into OpenTelemetry for
+tracing, I also went through the journey of migrating our metrics collection
+into OpenTelemetry. That's basically how I got involved.
+
+**DANIEL GOMEZ BLANCO:** How did I get involved in OpenTelemetry? I got involved
+through my work at Skyscanner, as an end user. I was driving adoption and open
+standards for telemetry. During COVID there was a need for simplification and
+how we approach infrastructure, how we approach, how we collect, how we process,
+and how we export telemetry data, and also basically... to basically lead the
+adoption of open standards and their simplification effort. So as an
+observability lead, I got more involved in the community aspect of
+OpenTelemetry, decided to interact with all their end users and meeting people
+that want to solve the same problems and want to find a solution that works for
+everyone.
+
+**DOUG ODEGAARD:** So, OpenTelemetry, I actually, for several years, in my
+previous position, I was hired to actually develop observability software. I was
+writing my own thing, we were doing a lot of alert management and various
+things. It was so much work and I thought, this has got to be easier. Plus I
+wanted to make sure that it could be future, future proof, dare I use that term?
+But also extensible.
+
+And when I discovered OpenTelemetry, I was just like, oh, thank you. Because
+it's something that the company could carry forward. And also we didn't have to
+worry about storing the data as much. And so it's really provided a really
+excellent platform so that we can focus on the task at hand versus how to do the
+job. So how I got involved in the project was actually first as a customer. It
+was about three, close to four years ago, kind of the infancy of OpenTelemetry.
+And I would go online, I would look at the documentation, or I would be in the
+code a lot, but I wanted to learn more. So I would go to a SIG call and there
+would be someone from Google and Microsoft and other companies, and then there
+was this guy from this small fintech in the US. And at first it was a little
+awkward, but they were so excited to have me in the call because I was an end
+user. And so it really was, it was a wonderful experience to begin that way, to
+realize that I could contribute to this rather than simply be a consumer of it.
+So it was great. And then I transitioned my career into working for a vendor,
+and we implement these systems now for customers like myself that I was years
+ago. So it's kind of a pay it forward, give back type of thing.
+
+**ADNAN RAHIĆ:** How did we get involved into the OpenTelemetry project? We
+started contributing more to the blog with you guys started contributing a bit
+to the docs as well. And yeah, it's just been a whole-hearted effort in the team
+to always kind of dedicate a few, a few minutes of each day to check out the
+OpenTelemetry project, find a way to contribute.
+
+**RYNN MANCUSO:** I got involved in the OpenTelemetry project...honestly, I was
+working at one observability company in marketing, and they didn't see the
+point. They didn't want me to get involved. And I really believed in open
+source. I'd worked in Mozilla and Wikimedia and really believed that, like, this
+was the way forward from a strategic perspective. So the second I could switch
+to a company that did let me get involved, that's what I did. And now I'm at
+Honeycomb. And I'm glad to say within the first three months, I made project
+member and started working with the End User Working Group and worked to grow it
+into a SIG, into all the programs that it has today, together with others.
+
+### 5- What's your favorite telemetry signal?
+
+**IRIS DYRMISHI:** Tracing is my favorite signal.
+
+**SEVERIN NEUMANN:** My favorite signal now is profiling, because I think this
+is really closing a big gap that was missing in observability, right? So I
+mentioned before, right, I come from the APM space, and now for me, APM,
+observability, it's very hard to make, like, a difference here. But one thing
+that when I talk with people using APM products right now is they're like, hey,
+where's code level visibility with OpenTelemetry, right? My commercial agent is
+giving me that line of code that is breaking something. And this is what we get
+with profiling. And that's why I'm really, really excited about it.
+
+**KAYLA REOPELLE:** To decide a favorite signal is kind of difficult for me. I
+really love the power of traces. I think that traces can tell stories in ways
+that are very meaningful. But on the same, like, on the other hand, I've been so
+immersed in logs and trying to allow logs to have more connections to spans and
+traces, I definitely have a soft spot for logs as well.
+
+**MORGAN MCLEAN:** I mean, I'm partial to distributed traces because that's
+where this project got its start. And I think early on, that's where a lot of
+the value was. No one else was really doing standardized distributed trace
+collection right? There were some open source examples of it attached to, like,
+Zipkin and Jaeger. But I think the reason OpenTelemetry got so much traction so
+quickly is that it was providing that.
+
+I'm also partial to logs, which we launched last year, just because that's one
+where, like, I've been involved in a lot of parts of OTel... But that's one
+where like, I was involved in a lot of the core specification early on in
+driving that. And so it was really exciting to see that ship. Also, logs are
+just a thing that throughout my career before working on any of this, I just get
+frustrated with, because they're never standardized, slow to process, they're
+expensive. OTel going to bring a lot of changes there for the better for
+everyone who uses logs.
+
+And finally, I guess profiles, because I work on that now. When I was at Google
+many years ago, I launched what I think was the world's first distributed
+continuous profiling product, at least publicly available one, which was Google
+cloud profiling, Stackdriver profiling, they still support it, I still think
+it's free, it's very powerful. But profiling has always been a bit of a niche
+thing. Like, I know, like at Splunk and other companies, we support it, but it's
+not as well known as metrics, and traces, and logs. I think with OTel, starting
+later this year, we're gonna launch like full support for profiles. That's
+really gonna change. Like, we had customers at Google who would spend an hour of
+our profiler and save like 20, 30% of their aggregate compute because they found
+some really poorly optimized code really quickly. For more people to have that
+ability and speed things up and for developers actually to get insight into how
+things work, that's super exciting. Like, the tech has been there a long time
+and OTel bringing this mainstream is huge.
+
+**HENRIK REXED:** When people ask me, who is your favorite kid? Usually I say, I
+don't have a favorite kid, you know. All my kids are wonderful. They all have, I
+don't know, a great thing, you know, out of it. So I think I love traces because
+sometimes it helps you to understand where it slowed down. I love metrics
+because as a performance engineer, I used to use metrics a lot. And I love logs
+because logs at the end, there's no sampling. So if you just do analytics on
+logs, wow, you are so much precise.
+
+So I don't think I have a favorite signal. I'll just say that depending on what
+I need and pick and choose, there's clearly one signal that will help me more.
+There's one thing that I'm very eager and waiting since Valencia is continuous
+profiling, because I love profiling and I think traces is great, but if there is
+a problem somewhere, profiling would be so much helpful. So I think, yeah, I
+don't answer your questions, but I say, yeah, I love all the signals provided by
+OpenTelemetry.
+
+**VIJAY SAMUEL:** I am thoroughly biased towards metrics. I feel metrics are the
+most powerful signal. As long as you are thinking through your instrumentation
+and making sure that you have the right granularity cardinality being sent in,
+to the platform, you can do powerful, powerful things with regards to anomaly
+detection, machine learning and many other things. So I love metrics.
+
+**DANIEL GOMEZ BLANCO:** I mean, I have to say traces, because they give you the
+context. Traces give you the backbone correlation for all the other signals,
+right? But I do think that the current design of the API design of metrics is so
+powerful that I'm like falling in love again with metrics because of that way
+that we decouple instrumentation and measurement from aggregation of metrics is
+so powerful and so much richness to basically give us a way to describe our
+systems, that I'm falling back again in love with metrics.
+
+**DOUG ODEGAARD:** My favorite signal, I have to say, I'm partial to traces
+because I've been doing software development for so long that that was the first
+thing that really turned me on to it was the ability to see that, especially
+because I know what it's like, like to debug. But it's also, I also know what
+it's like in an incident to have to focus in very quickly. So yes, traces are my
+favorite, but I do also like to send that trace ID and span ID into the logs
+now. It's kind of becoming my next favorite.
+
+**ADNAN RAHIĆ:** My favorite signal is traces. I'm going to say traces,
+definitely. My favorite singer is Ed Sheeran.
+
+**RYNN MANCUSO:** What is my favorite signal? I mean, I work for Honeycomb, so I
+am constitutionally obliged to say traces are my favorite signal.
+
+## Join us!
+
+If you have a story to share about how you use OpenTelemetry at your
+organization, we’d love to hear from you! Ways to share:
+
+- Join the
+ [#otel-sig-end-user channel](https://cloud-native.slack.com/archives/C01RT3MSWGZ)
+ on the
+ [CNCF Community Slack](https://communityinviter.com/apps/cloud-native/cncf)
+- Join our [OTel in Practice](/community/end-user/otel-in-practice/) sessions
+- Share your stories on the [OpenTelemetry blog](/docs/contributing/blog/)
+- Contact us on the
+ [CNCF Community Slack](https://communityinviter.com/apps/cloud-native/cncf)
+ for any other types of sessions you'd like to see!
+
+Be sure to follow OpenTelemetry on
+[Mastodon](https://fosstodon.org/@opentelemetry) and
+[LinkedIn](https://www.linkedin.com/company/opentelemetry/), and share your
+stories using the **#OpenTelemetry** hashtag!
+
+And don't forget to subscribe to our
+[YouTube channel](https://youtube.com/@otel-official) for more great
+OpenTelemetry content!
diff --git a/content/en/blog/2024/new-otel-features-envoy-istio/index.md b/content/en/blog/2024/new-otel-features-envoy-istio/index.md
index bc94ca7c3c3e..7c030b4140e9 100644
--- a/content/en/blog/2024/new-otel-features-envoy-istio/index.md
+++ b/content/en/blog/2024/new-otel-features-envoy-istio/index.md
@@ -182,7 +182,7 @@ And finally, we configure the `OTEL_RESOURCE_ATTRIBUTES` environment variable
for the Envoy proxies:
```shell
-cat <.*"
+kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o ".*"
```
Then you can check it out on the Jaeger UI -- you should see some traces!
diff --git a/content/en/blog/2024/otel-get-started-survey/1-technologies-used.png b/content/en/blog/2024/otel-get-started-survey/1-technologies-used.png
new file mode 100644
index 000000000000..7f6bdcbac966
Binary files /dev/null and b/content/en/blog/2024/otel-get-started-survey/1-technologies-used.png differ
diff --git a/content/en/blog/2024/otel-get-started-survey/2-level.png b/content/en/blog/2024/otel-get-started-survey/2-level.png
new file mode 100644
index 000000000000..5635dcad0d88
Binary files /dev/null and b/content/en/blog/2024/otel-get-started-survey/2-level.png differ
diff --git a/content/en/blog/2024/otel-get-started-survey/3-languages.png b/content/en/blog/2024/otel-get-started-survey/3-languages.png
new file mode 100644
index 000000000000..8d1f0b29c9ac
Binary files /dev/null and b/content/en/blog/2024/otel-get-started-survey/3-languages.png differ
diff --git a/content/en/blog/2024/otel-get-started-survey/4-resources.png b/content/en/blog/2024/otel-get-started-survey/4-resources.png
new file mode 100644
index 000000000000..7659de930a93
Binary files /dev/null and b/content/en/blog/2024/otel-get-started-survey/4-resources.png differ
diff --git a/content/en/blog/2024/otel-get-started-survey/5-importance.png b/content/en/blog/2024/otel-get-started-survey/5-importance.png
new file mode 100644
index 000000000000..10ac158dac3d
Binary files /dev/null and b/content/en/blog/2024/otel-get-started-survey/5-importance.png differ
diff --git a/content/en/blog/2024/otel-get-started-survey/index.md b/content/en/blog/2024/otel-get-started-survey/index.md
new file mode 100644
index 000000000000..901fced67a9b
--- /dev/null
+++ b/content/en/blog/2024/otel-get-started-survey/index.md
@@ -0,0 +1,101 @@
+---
+title: Insights from the OpenTelemetry Getting Started Survey
+linkTitle: OpenTelemetry Getting Started Survey
+date: 2024-06-19
+author: '[Ana Margarita Medina](https://github.com/AnaMMedina21) (ServiceNow)'
+issue: 4662
+sig: End User SIG
+---
+
+Getting started with new technologies can be hard, which is why we try to meet
+our end-users where they are. As a part of that goal,
+[the OpenTelemetry End-User SIG](/community/end-user/) recently surveyed the
+community to find out how we can best help our users get started with
+OpenTelemetry. The 104 responses we received will help drive improvements in
+enablement content from the community as well as vendors.
+
+Check out the results!
+
+## Key takeaways
+
+- No matter their level of OTel experience, folks would like to see the
+ following:
+ 1. Comprehensive documentation (67.3% of respondents).
+ 2. Reference implementations for instrumentation (65.3% of respondents).
+ 3. Detailed tutorials (63.4% of respondents).
+- Respondents are mostly working with containerization technologies, with 79.8%
+ of respondents using Kubernetes and 63.5% of respondents using Docker.
+- Over 83% of respondents stated that the Traces Specification, Instrumentation
+ APIs and SDKs, and Metrics Specification are the most important aspects of
+ their OTel journey.
+
+## Detailed insights
+
+### Q: What technologies are you using when setting up your observability journey?
+
+Out of 104 respondents, most are working with containers: 79.8% are using
+Kubernetes and 63.5% are using Docker.
+
+![Chart showing what technologies are being used](1-technologies-used.png)
+
+### Q: Where in your observability journey is your organization?
+
+Out of 104 respondents:
+
+- 25% are beginners and they are learning about observability or have used
+ monitoring tools.
+- 49% are intermediates and are setting up observability practice.
+- 26% are experts and have a well-established observability practice.
+
+![Chart showing where in their observability journey they are](2-level.png)
+
+### Q: What languages are you using in your organization?
+
+[JavaScript](/docs/languages/js/), [Java](/docs/languages/java/),
+[Go](/docs/languages/go/), and [Python](/docs/languages/python/) are the most
+widely used languages. They are being utilized by over 50% of the respondents.
+
+[Other languages](/docs/languages/other/) used included Scala, TypeScript,
+[Erlang/Elixir](/docs/languages/erlang/), Perl, R, Lua, Matlab, Julia, Haskell,
+COBOL, Kotlin, and SAS.
+
+![Chart showing what languages are being used](3-languages.png)
+
+### Q: What resources do you wish you had when getting started with OpenTelemetry?
+
+Depending on where in their observability journey they are, respondents prefer
+different resources:
+
+- Those who are learning about observability and those who are setting up an
+ observability practice would like to see comprehensive documentation and
+ detailed tutorials and videos.
+- Those who have a well-established observability practice prefer reference
+ implementations for instrumentation as well as comprehensive documentation.
+
+![Chart showing what resources folks want](4-resources.png)
+
+### Q: What part of the project is most important to you in your OTel journey?
+
+Most respondents stated that
+[Traces Specification,](/docs/specs/otel/trace/api/)
+[Instrumentation APIs and SDKs](/docs/languages/), and
+[Metrics Specification](/docs/specs/otel/metrics/api/) are most important to
+them.
+
+![Chart showing what aspects are the most important](5-importance.png)
+
+## Learn more
+
+For a more detailed look at the survey results, you can check out the
+[results](https://github.com/open-telemetry/sig-end-user/tree/main/end-user-surveys/getting-started).
+
+## Keep in touch
+
+Thanks to everyone who participated in the survey! We rely on your feedback to
+help guide the future development of OpenTelemetry and to ensure it continues to
+meet your evolving needs. We will post upcoming surveys in the following
+avenues:
+
+- [#otel-sig-end-user Slack channel](https://cloud-native.slack.com/archives/C01RT3MSWGZ)
+ – you can also reach out to us here!
+- [End user resources page](/community/end-user/).
diff --git a/content/en/docs/collector/_index.md b/content/en/docs/collector/_index.md
index 25880ade1fd7..c6613dda5666 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.102.1
+ vers: 0.104.0
weight: 270
---
diff --git a/content/en/docs/collector/internal-telemetry.md b/content/en/docs/collector/internal-telemetry.md
index 0b300553fb2e..2c4190b4a205 100644
--- a/content/en/docs/collector/internal-telemetry.md
+++ b/content/en/docs/collector/internal-telemetry.md
@@ -5,10 +5,11 @@ weight: 25
cSpell:ignore: alloc journalctl kube otecol pprof tracez underperforming zpages
---
-You can monitor the health of any OpenTelemetry Collector instance by checking
+You can inspect the health of any OpenTelemetry Collector instance by checking
its own internal telemetry. Read on to learn about this telemetry and how to
-configure it to help you [troubleshoot](/docs/collector/troubleshooting/)
-Collector issues.
+configure it to help you
+[monitor](#use-internal-telemetry-to-monitor-the-collector) and
+[troubleshoot](/docs/collector/troubleshooting/) the Collector.
## Activate internal telemetry in the Collector
@@ -97,9 +98,9 @@ critical analysis.
### Configure internal logs
Log output is found in `stderr`. You can configure logs in the config
-`service::telemetry::logs`. The [configuration
-options](https://github.com/open-telemetry/opentelemetry-collector/blob/v{{% param
-vers %}}/service/telemetry/config.go) are:
+`service::telemetry::logs`. The
+[configuration options](https://github.com/open-telemetry/opentelemetry-collector/blob/main/service/telemetry/config.go)
+are:
| Field name | Default value | Description |
| ---------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -133,7 +134,7 @@ journalctl | grep otelcol | grep Error
{{% /tab %}} {{< /tabpane >}}
-## Types of internal observability
+## Types of internal telemetry
The OpenTelemetry Collector aims to be a model of observable service by clearly
exposing its own operational metrics. Additionally, it collects host resource
@@ -272,3 +273,63 @@ The Collector logs the following internal events:
- Data dropping due to invalid data stops.
- A crash is detected, differentiated from a clean stop. Crash data is included
if available.
+
+## Use internal telemetry to monitor the Collector
+
+This section recommends best practices for monitoring the Collector using its
+own telemetry.
+
+### Critical monitoring
+
+#### Data loss
+
+Use the rate of `otelcol_processor_dropped_spans > 0` and
+`otelcol_processor_dropped_metric_points > 0` to detect data loss. Depending on
+your project's requirements, select a narrow time window before alerting begins
+to avoid notifications for small losses that are within the desired reliability
+range and not considered outages.
+
+### Secondary monitoring
+
+#### Queue length
+
+Most exporters provide a
+[queue or retry mechanism](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md)
+that is recommended for use in any production deployment of the Collector.
+
+The `otelcol_exporter_queue_capacity` metric indicates the capacity, in batches,
+of the retry queue. The `otelcol_exporter_queue_size` metric indicates the
+current size of the retry queue. Use these two metrics to check if the queue
+capacity can support your workload.
+
+Using the following three metrics, you can identify the number of spans, metric
+points, and log records that failed to reach the sending queue:
+
+- `otelcol_exporter_enqueue_failed_spans`
+- `otelcol_exporter_enqueue_failed_metric_points`
+- `otelcol_exporter_enqueue_failed_log_records`
+
+These failures could be caused by a queue filled with unsettled elements. You
+might need to decrease your sending rate or horizontally scale Collectors.
+
+The queue or retry mechanism also supports logging for monitoring. Check the
+logs for messages such as `Dropping data because sending_queue is full`.
+
+#### Receive failures
+
+Sustained rates of `otelcol_receiver_refused_spans` and
+`otelcol_receiver_refused_metric_points` indicate that too many errors were
+returned to clients. Depending on the deployment and the clients' resilience,
+this might indicate clients' data loss.
+
+Sustained rates of `otelcol_exporter_send_failed_spans` and
+`otelcol_exporter_send_failed_metric_points` indicate that the Collector is not
+able to export data as expected. These metrics do not inherently imply data loss
+since there could be retries. But a high rate of failures could indicate issues
+with the network or backend receiving the data.
+
+#### Data flow
+
+You can monitor data ingress with the `otelcol_receiver_accepted_spans` and
+`otelcol_receiver_accepted_metric_points` metrics and data egress with the
+`otelcol_exporter_sent_spans` and `otelcol_exporter_sent_metric_points` metrics.
diff --git a/content/en/docs/collector/management.md b/content/en/docs/collector/management.md
index d41987eea02b..7e4a7ce2247b 100644
--- a/content/en/docs/collector/management.md
+++ b/content/en/docs/collector/management.md
@@ -90,7 +90,7 @@ We will set up a simple OpAMP control plane consisting of an example OpAMP
server and let an OpenTelemetry Collector connect to it via an example OpAMP
supervisor.
-First, clone the `open-telemetry/opamp-go` repo:
+First, clone the `open-telemetry/opamp-go` repository:
```sh
git clone https://github.com/open-telemetry/opamp-go.git
@@ -159,7 +159,7 @@ service:
```
Now it's time to launch the supervisor (which in turn will launch your
-OpenTelemetry collector):
+OpenTelemetry Collector):
```console
$ go run .
diff --git a/content/en/docs/collector/troubleshooting.md b/content/en/docs/collector/troubleshooting.md
index 8278d00b678b..2483bddb0058 100644
--- a/content/en/docs/collector/troubleshooting.md
+++ b/content/en/docs/collector/troubleshooting.md
@@ -1,37 +1,135 @@
---
title: Troubleshooting
-description: Recommendations for troubleshooting the collector
+description: Recommendations for troubleshooting the Collector
weight: 25
+cSpell:ignore: confmap pprof tracez zpages
---
-This page describes some options when troubleshooting the health or performance
-of the OpenTelemetry Collector. The Collector provides a variety of metrics,
-logs, and extensions for debugging issues.
+On this page, you can learn how to troubleshoot the health and performance of
+the OpenTelemetry Collector.
-## Internal telemetry
+## Troubleshooting tools
+
+The Collector provides a variety of metrics, logs, and extensions for debugging
+issues.
+
+### Internal telemetry
You can configure and use the Collector's own
[internal telemetry](/docs/collector/internal-telemetry/) to monitor its
performance.
-## Sending test data
+### Local exporters
+
+For certain types of issues, such as configuration verification and network
+debugging, you can send a small amount of test data to a Collector configured to
+output to local logs. Using a
+[local exporter](https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter#general-information),
+you can inspect the data being processed by the Collector.
+
+For live troubleshooting, consider using the
+[`debug` exporter](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/debugexporter/README.md),
+which can confirm that the Collector is receiving, processing, and exporting
+data. For example:
+
+```yaml
+receivers:
+ zipkin:
+exporters:
+ debug:
+service:
+ pipelines:
+ traces:
+ receivers: [zipkin]
+ processors: []
+ exporters: [debug]
+```
+
+To begin testing, generate a Zipkin payload. For example, you can create a file
+called `trace.json` that contains:
+
+```json
+[
+ {
+ "traceId": "5982fe77008310cc80f1da5e10147519",
+ "parentId": "90394f6bcffb5d13",
+ "id": "67fae42571535f60",
+ "kind": "SERVER",
+ "name": "/m/n/2.6.1",
+ "timestamp": 1516781775726000,
+ "duration": 26000,
+ "localEndpoint": {
+ "serviceName": "api"
+ },
+ "remoteEndpoint": {
+ "serviceName": "apip"
+ },
+ "tags": {
+ "data.http_response_code": "201"
+ }
+ }
+]
+```
-For certain types of issues, particularly verifying configuration and debugging
-network issues, it can be helpful to send a small amount of data to a collector
-configured to output to local logs. For details, see
-[Local exporters](https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/troubleshooting.md#local-exporters).
+With the Collector running, send this payload to the Collector:
+
+```shell
+curl -X POST localhost:9411/api/v2/spans -H'Content-Type: application/json' -d @trace.json
+```
-## Check available components in the Collector
+You should see a log entry like the following:
+
+```shell
+2023-09-07T09:57:43.468-0700 info TracesExporter {"kind": "exporter", "data_type": "traces", "name": "debug", "resource spans": 1, "spans": 2}
+```
+
+You can also configure the `debug` exporter so the entire payload is printed:
+
+```yaml
+exporters:
+ debug:
+ verbosity: detailed
+```
+
+If you re-run the previous test with the modified configuration, the log output
+looks like this:
+
+```shell
+2023-09-07T09:57:12.820-0700 info TracesExporter {"kind": "exporter", "data_type": "traces", "name": "debug", "resource spans": 1, "spans": 2}
+2023-09-07T09:57:12.821-0700 info ResourceSpans #0
+Resource SchemaURL: https://opentelemetry.io/schemas/1.4.0
+Resource attributes:
+ -> service.name: Str(telemetrygen)
+ScopeSpans #0
+ScopeSpans SchemaURL:
+InstrumentationScope telemetrygen
+Span #0
+ Trace ID : 0c636f29e29816ea76e6a5b8cd6601cf
+ Parent ID : 1a08eba9395c5243
+ ID : 10cebe4b63d47cae
+ Name : okey-dokey
+ Kind : Internal
+ Start time : 2023-09-07 16:57:12.045933 +0000 UTC
+ End time : 2023-09-07 16:57:12.046058 +0000 UTC
+ Status code : Unset
+ Status message :
+Attributes:
+ -> span.kind: Str(server)
+ -> net.peer.ip: Str(1.2.3.4)
+ -> peer.service: Str(telemetrygen)
+```
+
+### Check Collector components
Use the following sub-command to list the available components in a Collector
distribution, including their stability levels. Please note that the output
-format may change across versions.
+format might change across versions.
-```sh
+```shell
otelcol components
```
-Sample output
+Sample output:
```yaml
buildinfo:
@@ -120,24 +218,162 @@ extensions:
extension: Beta
```
+### Extensions
+
+Here is a list of extensions you can enable for debugging the Collector.
+
+#### Performance Profiler (pprof)
+
+The
+[pprof extension](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/extension/pprofextension/README.md),
+which is available locally on port `1777`, allows you to profile the Collector
+as it runs. This is an advanced use-case that should not be needed in most
+circumstances.
+
+#### zPages
+
+The
+[zPages extension](https://github.com/open-telemetry/opentelemetry-collector/tree/main/extension/zpagesextension/README.md),
+which is exposed locally on port `55679`, can be used to inspect live data from
+the Collector's receivers and exporters.
+
+The TraceZ page, exposed at `/debug/tracez`, is useful for debugging trace
+operations, such as:
+
+- Latency issues. Find the slow parts of an application.
+- Deadlocks and instrumentation problems. Identify running spans that don't end.
+- Errors. Determine what types of errors are occurring and where they happen.
+
+Note that `zpages` might contain error logs that the Collector does not emit
+itself.
+
+For containerized environments, you might want to expose this port on a public
+interface instead of just locally. The `endpoint` can be configured using the
+`extensions` configuration section:
+
+```yaml
+extensions:
+ zpages:
+ endpoint: 0.0.0.0:55679
+```
+
## Checklist for debugging complex pipelines
It can be difficult to isolate problems when telemetry flows through multiple
-collectors and networks. For each "hop" of telemetry data through a collector or
-other component in your telemetry pipeline, it’s important to verify the
-following:
+Collectors and networks. For each "hop" of telemetry through a Collector or
+other component in your pipeline, it’s important to verify the following:
-- Are there error messages in the logs of the collector?
+- Are there error messages in the logs of the Collector?
- How is the telemetry being ingested into this component?
-- How is the telemetry being modified (i.e. sampling, redacting) by this
- component?
+- How is the telemetry being modified (for example, sampling or redacting) by
+ this component?
- How is the telemetry being exported from this component?
- What format is the telemetry in?
- How is the next hop configured?
- Are there any network policies that prevent data from getting in or out?
-### More
+## Common Collector issues
+
+This section covers how to resolve common Collector issues.
+
+### Collector is experiencing data issues
+
+The Collector and its components might experience data issues.
+
+#### Collector is dropping data
+
+The Collector might drop data for a variety of reasons, but the most common are:
+
+- The Collector is improperly sized, resulting in an inability to process and
+ export the data as fast as it is received.
+- The exporter destination is unavailable or accepting the data too slowly.
+
+To mitigate drops, configure the
+[`batch` processor](https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/batchprocessor/README.md).
+In addition, it might be necessary to configure the
+[queued retry options](https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/exporterhelper#configuration)
+on enabled exporters.
+
+#### Collector is not receiving data
+
+The Collector might not receive data for the following reasons:
+
+- A network configuration issue.
+- An incorrect receiver configuration.
+- An incorrect client configuration.
+- The receiver is defined in the `receivers` section but not enabled in any
+ `pipelines`.
+
+Check the Collector's
+[logs](/docs/collector/internal-telemetry/#configure-internal-logs) as well as
+[zPages](https://github.com/open-telemetry/opentelemetry-collector/blob/main/extension/zpagesextension/README.md)
+for potential issues.
+
+#### Collector is not processing data
+
+Most processing issues result from of a misunderstanding of how the processor
+works or a misconfiguration of the processor. For example:
+
+- The attributes processor works only for "tags" on spans. The span name is
+ handled by the span processor.
+- Processors for trace data (except tail sampling) work only on individual
+ spans.
+
+#### Collector is not exporting data
+
+The Collector might not export data for the following reasons:
+
+- A network configuration issue.
+- An incorrect exporter configuration.
+- The destination is unavailable.
+
+Check the Collector's
+[logs](/docs/collector/internal-telemetry/#configure-internal-logs) as well as
+[zPages](https://github.com/open-telemetry/opentelemetry-collector/blob/main/extension/zpagesextension/README.md)
+for potential issues.
+
+Exporting data often does not work because of a network configuration issue,
+such as a firewall, DNS, or proxy issue. Note that the Collector does have
+[proxy support](https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter#proxy-support).
+
+### Collector is experiencing control issues
+
+The Collector might experience failed startups or unexpected exits or restarts.
+
+#### Collector exits or restarts
+
+The Collector might exit or restart due to:
+
+- Memory pressure from a missing or misconfigured
+ [`memory_limiter` processor](https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/memorylimiterprocessor/README.md).
+- Improper sizing for load.
+- Improper configuration. For example, a queue size configured higher than
+ available memory.
+- Infrastructure resource limits. For example, Kubernetes.
+
+#### Collector fails to start in Windows Docker containers
+
+With v0.90.1 and earlier, the Collector might fail to start in a Windows Docker
+container, producing the error message
+`The service process could not connect to the service controller`. In this case,
+the `NO_WINDOWS_SERVICE=1` environment variable must be set to force the
+Collector to start as if it were running in an interactive terminal, without
+attempting to run as a Windows service.
+
+### Collector is experiencing configuration issues
+
+The Collector might experience problems due to configuration issues.
+
+#### Null maps
+
+During configuration resolution of multiple configs, values in earlier configs
+are removed in favor of later configs, even if the later value is null. You can
+fix this issue by
+
+- Using `{}` to represent an empty map, such as `processors: {}` instead of
+ `processors:`.
+- Omitting empty configurations such as `processors:` from the configuration.
-For detailed recommendations, including common problems, see
-[Troubleshooting](https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/troubleshooting.md)
-from the Collector repository.
+See
+[confmap troubleshooting](https://github.com/open-telemetry/opentelemetry-collector/blob/main/confmap/README.md#null-maps)
+for more information.
diff --git a/content/en/docs/concepts/instrumentation/libraries.md b/content/en/docs/concepts/instrumentation/libraries.md
index a2bd6b7cd3a6..8077817eb8f9 100644
--- a/content/en/docs/concepts/instrumentation/libraries.md
+++ b/content/en/docs/concepts/instrumentation/libraries.md
@@ -115,7 +115,7 @@ You may be rightfully concerned about adding new dependencies, here are some
considerations to help you decide how to minimize dependency hell:
- OpenTelemetry Trace API reached stability in early 2021, it follows
- [Semantic Versioning 2.0](/docs/specs/otel/versioning-and-stability) and we
+ [Semantic Versioning 2.0](/docs/specs/otel/versioning-and-stability/) and we
take API stability seriously.
- When taking dependency, use the earliest stable OpenTelemetry API (1.0.\*) and
avoid updating it unless you have to use new features.
diff --git a/content/en/docs/concepts/instrumentation/zero-code.md b/content/en/docs/concepts/instrumentation/zero-code.md
index 40144874aa87..14a158f40975 100644
--- a/content/en/docs/concepts/instrumentation/zero-code.md
+++ b/content/en/docs/concepts/instrumentation/zero-code.md
@@ -45,7 +45,8 @@ Other configuration options are available, including:
Automatic instrumentation is available for the following languages:
- [.NET](/docs/zero-code/net/)
+- [Go](/docs/zero-code/go)
- [Java](/docs/zero-code/java/)
- [JavaScript](/docs/zero-code/js/)
-- [PHP](/docs/languages/php/automatic/)
-- [Python](/docs/languages/python/automatic/)
+- [PHP](/docs/zero-code/php/)
+- [Python](/docs/zero-code/python/)
diff --git a/content/en/docs/concepts/signals/baggage.md b/content/en/docs/concepts/signals/baggage.md
index 1e7c7cc4d84d..7cf6d1379fce 100644
--- a/content/en/docs/concepts/signals/baggage.md
+++ b/content/en/docs/concepts/signals/baggage.md
@@ -4,46 +4,52 @@ weight: 4
description: Contextual information that is passed between signals.
---
-In OpenTelemetry, Baggage is contextual information that’s passed between spans.
-It's a key-value store that resides alongside span context in a trace, making
-values available to any span created within that trace.
+In OpenTelemetry, Baggage is contextual information that resides next to
+context. Baggage is a key-value store, which means it lets you
+[propagate](/docs/concepts/context-propagation/#propagation) any data you like
+alongside [context](/docs/concepts/context-propagation/#context).
-For example, imagine you want to have a `ClientId` attribute on every span in
-your trace, which involves multiple services; however, `ClientId` is only
-available in one specific service. To accomplish your goal, you can use
-OpenTelemetry Baggage to propagate this value across your system.
+Baggage means you can pass data across services and processes, making it
+available to add to [traces](/docs/concepts/signals/traces/),
+[metrics](/docs/concepts/signals/metrics/), or
+[logs](/docs/concepts/signals/logs/) in those services.
-OpenTelemetry uses
-[Context Propagation](/docs/concepts/signals/traces/#context-propagation) to
-pass Baggage around, and each of the different library implementations has
-propagators that parse and make that Baggage available without you needing to
-explicitly implement it.
+## Example
-![OTel Baggage](/img/otel-baggage.svg)
+Baggage is often used in tracing to propagate additional data across services.
+
+For example, imagine you have a `clientId` at the start of a request, but you'd
+like for that ID to be available on all spans in a trace, some metrics in
+another service, and some logs along the way. Because the trace may span
+multiple services, you need some way to propagate that data without copying the
+`clientId` across many places in your codebase.
-## Why does OTel Baggage exist?
+By using
+[Context Propagation](/docs/concepts/signals/traces/#context-propagation) to
+pass baggage across these services, the `clientId` is available to add to any
+additional spans, metrics, or logs. Additionally, instrumentations automatically
+propagate baggage for you.
-Baggage provides a uniform way to store and propagate information across a trace
-and other signals. For example, you may want to attach information from your
-application to a span and retrieve that information much later and use it later
-on with another span. However, spans in OpenTelemetry are immutable once
-created, and can be exported before you need information on them later on.
-Baggage allows you to work around this problem by providing a place to store and
-retrieve information.
+![OTel Baggage](/img/otel-baggage.svg)
## What should OTel Baggage be used for?
-Common use cases include information that’s only accessible further up a stack.
-This can include things like Account Identification, User IDs, Product IDs, and
-origin IPs, for example. Passing these down your stack allows you to then add
-them to your Spans in downstream services to make it easier to filter when
-you’re searching in your Observability backend.
+Baggage is best used to include information typically available only at the
+start of a request further downstream. This can include things like Account
+Identification, User IDs, Product IDs, and origin IPs, for example.
+
+Propagating this information using baggage allows for deeper analysis of
+telemetry in a backend. For example, if you include information like a User ID
+on a span that tracks a database call, you can much more easily answer questions
+like "which users are experiencing the slowest database calls?" You can also log
+information about a downstream operation and include that same User ID in the
+log data.
![OTel Baggage](/img/otel-baggage-2.svg)
## Baggage security considerations
-Sensitive Baggage items could be shared with unintended resources, like
+Sensitive Baggage items can be shared with unintended resources, like
third-party APIs. This is because automatic instrumentation includes Baggage in
most of your service’s network requests. Specifically, Baggage and other parts
of trace context are sent in HTTP headers, making it visible to anyone
@@ -52,22 +58,21 @@ then this risk may not apply, but keep in mind that downstream services could
propagate Baggage outside your network.
Also, there are no built-in integrity checks to ensure that Baggage items are
-yours, so exercise caution when retrieving them.
+yours, so exercise caution when reading them.
-## Baggage is not the same as Span attributes
+## Baggage is not the same as attributes
-One important thing to note about Baggage is that it is not a subset of the
-[Span Attributes](/docs/concepts/signals/traces/#attributes). When you add
-something as Baggage, it does not automatically end up on the Attributes of the
-child system’s spans. You must explicitly take something out of Baggage and
-append it as Attributes.
+An important thing to note about baggage is that it is a separate key-value
+store and is unassociated with attributes on spans, metrics, or logs without
+explicitly adding them.
-For example, in .NET you might do this:
+To add baggage entries to attributes, you need to explicitly read the data from
+baggage and add it as attributes to your spans, metrics, or logs.
-```csharp
-var accountId = Baggage.GetBaggage("AccountId");
-Activity.Current?.SetTag("AccountId", accountId);
-```
+Because a common use cases for Baggage is to add data to
+[Span Attributes](/docs/concepts/signals/traces/#attributes) across a whole
+trace, several languages have Baggage Span Processors that add data from baggage
+as attributes on span creation.
> For more information, see the [baggage specification][].
diff --git a/content/en/docs/concepts/signals/logs.md b/content/en/docs/concepts/signals/logs.md
index c044175aa33d..e186218d0c62 100644
--- a/content/en/docs/concepts/signals/logs.md
+++ b/content/en/docs/concepts/signals/logs.md
@@ -95,7 +95,7 @@ Logs are a [stable](/docs/specs/otel/versioning-and-stability/#stable) signal in
the OpenTelemetry specification. For the individual language specific
implementations of the Logs API & SDK, the status is as follows:
-{{% logs-support-table %}}
+{{% signal-support-table "logs" %}}
## Specification
diff --git a/content/en/docs/concepts/signals/metrics.md b/content/en/docs/concepts/signals/metrics.md
index 4dc888a0f497..8e64ae9d86a7 100644
--- a/content/en/docs/concepts/signals/metrics.md
+++ b/content/en/docs/concepts/signals/metrics.md
@@ -114,7 +114,7 @@ Metrics are a [stable](/docs/specs/otel/versioning-and-stability/#stable) signal
in the OpenTelemetry specification. For the individual language specific
implementations of the Metrics API & SDK, the status is as follows:
-{{% metrics-support-table " " %}}
+{{% signal-support-table "metrics" %}}
## Specification
diff --git a/content/en/docs/contributing/_index.md b/content/en/docs/contributing/_index.md
index 5a16627ed0fa..5057845e9788 100644
--- a/content/en/docs/contributing/_index.md
+++ b/content/en/docs/contributing/_index.md
@@ -3,22 +3,8 @@ title: Contributing
description: Learn how to contribute to OpenTelemetry documentation.
aliases: [/docs/contribution-guidelines]
weight: 980
-cSpell:ignore: prepopulated spacewhite
---
-The following guide describes how to contribute to OpenTelemetry documentation.
-For guidance on how to contribute to the OpenTelemetry project in general, see
-the
-[OpenTelemetry Contributor Guide](https://github.com/open-telemetry/community/blob/main/CONTRIBUTING.md)
-, which provides details on the Contributor License Agreement and the Code of
-Conduct. In extent, every language implementation, collector, and conventions
-[repository](https://github.com/open-telemetry/) has their own specific
-contributing guides.
-
-For documentation, you can open an issue about OpenTelemetry, or contribute a
-change with a pull request (PR) to the
-[`opentelemetry.io` GitHub repository](https://github.com/open-telemetry/opentelemetry.io).
-
OpenTelemetry documentation contributors:
- Improve existing content.
@@ -26,658 +12,18 @@ OpenTelemetry documentation contributors:
- Update the OpenTelemetry Registry.
- Improve the code that builds the site.
-## Requirements
-
-To contribute, you need to be familiar with the following techs and tools:
-
-- [git](https://git-scm.com/)
-- [GitHub](https://github.com/)
-- Markdown ([CommonMark](https://commonmark.org/))
-- YAML
-
-For technical details concerning how the documentation is built and tested
-locally, see the
-[CONTRIBUTING.md](https://github.com/open-telemetry/opentelemetry.io/blob/main/CONTRIBUTING.md)
-file.
-
-### Sign the CNCF CLA {#sign-the-cla}
-
-All OpenTelemetry contributors must read the
-[Contributor guide](https://github.com/open-telemetry/community/blob/main/CONTRIBUTING.md)
-and
-[sign the Contributor License Agreement (CLA)](https://docs.linuxfoundation.org/lfx/easycla/contributors)
-.
-
-Pull requests from contributors who haven't signed the CLA fail the automated
-tests. The name and email you provide must match those found in your
-`git config`, and your git name and email must match those used for the CNCF
-CLA.
-
-## Contribute new content
-
-```mermaid
-flowchart LR
- subgraph first[How to contribute]
- direction TB
- T[ ] -.-
- B[Fork the repo in GitHub] --- C[Write docs in markdown and build site with Hugo]
- C --- D[Push source to the fork]
- D --- E[Open a pull request]
- E --- F[Sign the 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
-```
-
-_Figure 1. Contributing new content._
-
-The previous figure illustrates how to contribute new documentation.
-
-To contribute new content pages or improve existing content pages, open a pull
-request (PR):
-
-- If your change is small, or you're unfamiliar with Git, read
- [Changes using GitHub](#changes-using-github) to learn how to edit a page.
-- If your changes are large, read [Work from a local fork](#fork-the-repo) to
- learn how to make changes locally on your computer.
-
-{{% alert title="Tip" %}}
-
-Turn your pull request into a draft to signal that the content still isn't ready
-for review. Maintainers may still comment or do high-level reviews, though they
-won't review the content in full until you remove the draft status.
-
-{{% /alert %}}
-
-### Changes using GitHub {#changes-using-github}
-
-If you're less experienced with Git workflows, here's an easier method of
-opening a pull request. Figure 2 outlines the steps and the details follow.
-
-```mermaid
-flowchart LR
-A([fa:fa-user New Contributor]) --- id1[(open-telemetry/opentelemetry.io GitHub)]
-subgraph tasks[Changes using GitHub]
-direction TB
- 0[ ] -.-
- 1[1. Edit this page] --> 2[2. Use GitHub markdown editor to make changes]
- 2 --> 3[3. fill in Propose file change]
-
-end
-subgraph tasks2[ ]
-direction TB
-4[4. select Propose file change] --> 5[5. select Create pull request] --> 6[6. fill in Open a pull request]
-6 --> 7[7. select Create 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
-```
-
-_Figure 2. Steps for opening a PR using GitHub._
-
-1. On the page where you see the issue, select the **Edit this page** option in
- the right-hand side navigation panel.
-
-1. If you're not a member of the project, GitHub offers to create a fork of the
- repository. Select **Fork this repository**.
-
-1. Make your changes in the GitHub editor.
-
-1. Fill in the **Propose file change** form.
-
-1. Select **Propose file change**.
-
-1. Select **Create pull request**.
-
-1. The **Open a pull request** screen appears. Your description helps reviewers
- understand your change.
-
-1. Select **Create pull request**.
-
-Before merging a pull request, OpenTelemetry community members review and
-approve it.
-
-If a reviewer asks you to make changes:
-
-1. Go to the **Files changed** tab.
-1. Select the pencil (edit) icon on any files changed by the pull request.
-1. Make the changes requested. If there's a code suggestion, apply it.
-1. Commit the changes.
-
-When your review is complete, a reviewer merges your PR and your changes goes
-live a few minutes later.
-
-{{% alert title="Tip" %}}
-
-Comment `/fix:format` on your pull request to trigger an automated check for
-formatting issues.
-
-{{% /alert %}}
-
-### Work from a local fork {#fork-the-repo}
-
-If you're more experienced with Git, or if your changes are larger than a few
-lines, work from a local fork.
-
-Make sure you have
-[git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) installed
-on your computer. You can also use a user interface for Git.
-
-Figure 3 shows the steps to follow when you work from a local fork. The details
-for each step follow.
-
-```mermaid
-flowchart LR
-1[Fork the open-telemetry/opentelemetry repository] --> 2[Create local clone and set upstream]
-subgraph changes[Your changes]
-direction TB
-S[ ] -.-
-3[Create a branch example: my_new_branch] --> 3a[Make changes using a text editor] --> 4["Preview your changes locally using Hugo (localhost:1313)"]
-end
-subgraph changes2[Commit / Push]
-direction TB
-T[ ] -.-
-5[Commit your changes] --> 6[Push commit to origin/my_new_branch]
-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
-```
-
-_Figure 3. Working from a local fork to make your changes._
-
-#### Fork the opentelemetry.io repository
-
-1. Navigate to the
- [`opentelemetry.io`](https://github.com/open-telemetry/opentelemetry.io/)
- repository.
-1. Select **Fork**.
-
-#### Create a local clone and set the upstream
-
-1. In a terminal window, clone your fork and install the requirements:
-
- ```shell
- git clone git@github.com:/opentelemetry.io.git
- cd opentelemetry.io
- npm install
- ```
-
-1. Set the `open-telemetry/opentelemetry.io` repository as the `upstream`
- remote:
-
- ```shell
- git remote add upstream https://github.com/open-telemetry/opentelemetry.io.git
- ```
-
-1. Confirm your `origin` and `upstream` repositories:
-
- ```shell
- git remote -v
- ```
-
- Output is similar to:
-
- ```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. Fetch commits from your fork's `origin/main` and
- `open-telemetry/opentelemetry.io`'s `upstream/main`:
-
- ```shell
- git fetch origin
- git fetch upstream
- ```
-
- This makes sure your local repository is up to date before you start making
- changes. Push changes from upstream to origin regularly to keep your fork in
- sync with upstream.
-
-#### Create a branch
-
-1. Create a new branch. This example assumes the base branch is `upstream/main`:
-
- ```shell
- git checkout -b upstream/main
- ```
-
-1. Make your changes using a code or text editor.
-
-At any time, use the `git status` command to see what files you've changed.
-
-#### Commit your changes
-
-When you are ready to submit a pull request, commit your changes.
-
-1. In your local repository, check which files you need to commit:
-
- ```shell
- git status
- ```
-
- Output is similar to:
-
- ```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/file-you-are-editing.md
-
- no changes added to commit (use "git add" and/or "git commit -a")
- ```
-
-1. Add the files listed under **Changes not staged for commit** to the commit:
-
- ```shell
- git add
- ```
-
- Repeat this for each file.
-
-1. After adding all the files, create a commit:
-
- ```shell
- git commit -m "Your commit message"
- ```
-
-1. Push your local branch and its new commit to your remote fork:
-
- ```shell
- git push origin
- ```
-
-1. Once the changes are pushed, GitHub lets you know that you can create a PR.
-
-#### Open a pull request from your fork {#open-a-pr}
-
-Figure 4 shows the steps to open a PR from your fork to
-[opentelemetry.io](https://github.com/open-telemetry/opentelemetry.io).
-
-```mermaid
-flowchart LR
-subgraph first[ ]
-direction TB
-1[1. Go to opentelemetry.io repository] --> 2[2. Select New Pull Request]
-2 --> 3[3. Select compare across forks]
-3 --> 4[4. Select your fork from head repository drop-down menu]
-end
-subgraph second [ ]
-direction TB
-5[5. Select your branch from the compare drop-down menu] --> 6[6. Select Create Pull Request]
-6 --> 7[7. Add a description to your PR]
-7 --> 8[8. Select Create 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
-```
-
-_Figure 4. Steps to open a PR from your fork to_
-[opentelemetry.io](https://github.com/open-telemetry/opentelemetry.io).
-
-1. In a web browser, go to the
- [`opentelemetry.io`](https://github.com/open-telemetry/opentelemetry.io)
- repository.
-1. Select **New Pull Request**.
-1. Select **compare across forks**.
-1. From the **head repository** drop-down menu, select your fork.
-1. From the **compare** drop-down menu, select your branch.
-1. Select **Create Pull Request**.
-1. Add a description for your pull request:
-
- - **Title** (50 characters or less): Summarize the intent of the change.
- - **Description**: Describe the change in more detail.
-
- - If there is a related GitHub issue, include `Fixes #12345` or
- `Closes #12345` in the description so that GitHub's automation closes the
- mentioned issue after merging the PR. If there are other related PRs,
- link those as well.
- - If you want advice on something specific, include any questions you'd
- like reviewers to think about in your description.
+The following guides describe how to contribute to OpenTelemetry documentation.
-1. Select the **Create pull request** button.
-
-Your pull request is available in
-[Pull requests](https://github.com/open-telemetry/opentelemetry.io/pulls).
-
-After opening a PR, GitHub runs automated tests and tries to deploy a preview
-using [Netlify](https://www.netlify.com/).
-
-- If the Netlify build fails, select **Details** for more information.
-- If the Netlify build succeeds, select **Details** to open a staged version of
- the OpenTelemetry website with your changes applied. This is how reviewers
- check your changes.
-
-Other checks might also fail. See the
-[list of all PR checks](/docs/contributing/pr-checks).
-
-#### Fix content issues automatically
-
-Before submitting a change to the repository, run the following command and (i)
-address any reported issues, (ii) commit any files changed by the script:
-
-```sh
-npm run test-and-fix
-```
-
-To separately test and fix all issues with your files, run:
-
-```sh
-npm run test # Checks but does not update any files
-npm run fix:all # May update files
-```
-
-To list available NPM scripts, run `npm run`.
-
-#### Preview your changes locally {#preview-locally}
-
-Preview your changes locally before pushing them or opening a pull request. A
-preview lets you catch build errors or markdown formatting problems.
-
-To build and serve the site locally with Hugo, run the following command:
-
-```shell
-npm run serve
-```
-
-Navigate to `http://localhost:1313` in your web browser to see the local
-preview. Hugo watches for changes and rebuilds the site as needed.
-
-To stop the local Hugo instance, go back to the terminal and type `Ctrl+C`, or
-close the terminal window.
-
-#### Site deploys and PR previews
-
-If you submit a PR, Netlify creates a [deploy preview][] so that you can review your
-changes. Once your PR is merged, Netlify deploys the updated site to the production
-server.
-
-> **Note**: PR previews include _draft pages_, but production builds do not.
-
-To see deploy logs and more, visit the project's [dashboard][] -- Netlify login
-required.
-
-#### PR guidelines
-
-Before a PR gets merged, it sometimes requires a few iterations of
-review-and-edit. To help us and yourself make this process as easy as possible,
-we ask that you adhere to the following:
-
-- If your PR isn't a quick fix, then **work from a fork**: Click the
- [Fork](https://github.com/open-telemetry/opentelemetry.io/fork) button at the
- top of the repository and clone the fork locally. When you are ready, raise a
- PR with the upstream repository.
-- **Do not work from the `main`** branch of your fork, but create a PR-specific
- branch.
-- Ensure that maintainers are
- [allowed to apply changes to your pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork).
-
-#### Changes from reviewers
-
-Sometimes reviewers commit to your pull request. Before making any other
-changes, fetch those commits.
-
-1. Fetch commits from your remote fork and rebase your working branch:
-
- ```shell
- git fetch origin
- git rebase origin/
- ```
-
-1. After rebasing, force-push new changes to your fork:
-
- ```shell
- git push --force-with-lease origin
- ```
-
-You can also solve merge conflicts from the GitHub UI.
-
-#### Merge conflicts and rebasing
-
-If another contributor commits changes to the same file in another PR, it can
-create a merge conflict. You must resolve all merge conflicts in your PR.
-
-1. Update your fork and rebase your local branch:
-
- ```shell
- git fetch origin
- git rebase origin/
- ```
-
- Then force-push the changes to your fork:
-
- ```shell
- git push --force-with-lease origin
- ```
-
-1. Fetch changes from `open-telemetry/opentelemetry.io`'s `upstream/main` and
- rebase your branch:
-
- ```shell
- git fetch upstream
- git rebase upstream/main
- ```
-
-1. Inspect the results of the rebase:
-
- ```shell
- git status
- ```
-
- This results in a number of files marked as conflicted.
-
-1. Open each conflicted file and look for the conflict markers: `>>>`, `<<<`,
- and `===`. Resolve the conflict and delete the conflict marker.
-
- For more information, see
- [How conflicts are presented](https://git-scm.com/docs/git-merge#_how_conflicts_are_presented).
-
-1. Add the files to the changeset:
-
- ```shell
- git add
- ```
-
-1. Continue the rebase:
-
- ```shell
- git rebase --continue
- ```
-
-1. Repeat steps 2 to 5 as needed.
-
- After applying all commits, the `git status` command shows that the rebase is
- complete.
-
-1. Force-push the branch to your fork:
-
- ```shell
- git push --force-with-lease origin
- ```
-
- The pull request no longer shows any conflicts.
-
-#### Merge requirements
-
-Pull requests are merged when they comply with the following criteria:
-
-- All reviews by approvers, maintainers, technical committee members, or subject
- matter experts have the status "Approved".
-- No unresolved conversations.
-- Approved by at least one approver.
-- No failing PR checks.
-- PR branch is up-to-date with the base branch.
-
-> **Important**
->
-> Do not worry too much about failing PR checks. Community members will help you
-> to get them fixed, by either providing you with instructions how to fix them
-> or by fixing them on your behalf.
-
-## Open an issue
-
-If you notice an error or want to suggest improvements to existing content, open
-an issue.
-
-1. Click the **Create documentation issue** link on any document. This redirects
- you to a GitHub issue page prepopulated with some headers.
-2. Describe the issue or suggestion for improvement. Provide as many details as
- you can.
-3. Click **Submit new issue**.
-
-After submitting, check in on your issue occasionally or turn on GitHub
-notifications. It might take a few days until maintainers and approvers respond.
-Reviewers and other community members might ask questions before they can take
-action on your issue.
-
-### Suggesting new content or features
-
-If you have an idea for new content or a feature, but you aren't sure where it
-should go, you can still file an issue. You can also report bugs and security
-vulnerabilities.
-
-1. Go to
- [GitHub](https://github.com/open-telemetry/opentelemetry.io/issues/new/) and
- select **New issue** inside the **Issues** tab.
-
-1. Select the type of issue that best applies to your request or doubt.
-
-1. Fill out the template.
-
-1. Submit the issue.
-
-### How to file great issues
-
-Keep the following in mind when filing an issue:
-
-- Provide a clear issue description. Describe what specifically is missing, out
- of date, wrong, or needs improvement.
-- Explain the specific impact the issue has on users.
-- Limit the scope of a given issue to a reasonable unit of work. For problems
- with a large scope, break them down into smaller issues. For example, "Fix the
- security docs" is too broad, but "Add details to the 'Restricting network
- access' topic" is specific enough to be actionable.
-- Search the existing issues to see if there's anything related or similar to
- the new issue.
-- If the new issue relates to another issue or pull request, refer to it either
- by its full URL or by the issue or pull request number prefixed with a `#`
- character. For example, `Introduced by #987654`.
-- Follow the
- [Code of Conduct](https://github.com/open-telemetry/community/blob/main/code-of-conduct.md).
- Respect your fellow contributors. For example, "The docs are terrible" is not
- helpful or polite feedback.
-
-## Announcement management
-
-An announcement is a _regular Hugo page_ contained under the `announcements`
-section of a locale. This means that we leverage Hugo's builtin handling of page
-dates (future or expired), internationalization, and more, to automatically show
-or hide banners depending on the build date, determine banner ordering, handle
-fall back to English banners, etc.
-
-> Announcements are currently used as banners only. We _might_ eventually
-> support slightly more general announcements as well.
-
-### Creating an announcement
-
-To add a new announcement, create an announcement markdown file under the
-`announcements` folder of your localization using the following command:
-
-```sh
-hugo new --kind announcement content/YOUR-LOCALE/announcements/announcement-file-name.md
-```
-
-Adjust according to your desired locale and file name. Add the announcement text
-as the body of the page.
-
-> For banners, the announcement body should be a short phrase.
-
-{{% alert title="For localizations" %}}
-
-If you are creating a **locale specific announcement override**, make sure that
-you use the **same filename** as the English language announcement.
-
-{{% /alert %}}
-
-### Announcement list
-
-Any given announcement will appear in a site build when the build date falls
-between the `date` and `expiryDate` fields of the announcement. When those
-fields are missing they are assumed to be "now" and "forever", respectively.
-
-Announcements will appear in the standard page order as determined using Hugo's
-[Regular pages](https://gohugo.io/methods/site/regularpages/) function. That is,
-the "lightest" announcements (by `weight`) will appear first; when weights are
-the same or unspecified, the most recent announcements (by `date`) will appear
-first, etc.
-
-So, if you want to force an announcement to the top, use a negative `weight` in
-the front matter.
-
-## Contribute to other repositories
-
-OpenTelemetry is an open source project, and we gladly accept new contributions
-and contributors. See the CONTRIBUTING.md file in each SIG repository for
-information on getting started.
-
-Individual SIGs may maintain documentation above and beyond what is offered
-here, but we strive for accurate general guidance on using the project from our
-main website.
-
-If you see text you'd like to improve, use GitHub to search all repositories in
-the OpenTelemetry organization. This can help you figure out where to submit
-your issue or PR. Each repository has its own processes and procedures. Before
-you file an issue or submit a PR, read that repository's `README.md`,
-`CONTRIBUTING.md`, and `code-of-conduct.md`, if they exist.
-
-Most repositories use issue and PR templates. Have a look through some open
-issues and PRs to get a feel for that team's processes. Make sure to fill out
-the templates with as much detail as possible when you file issues or PRs.
+For guidance on how to contribute to the OpenTelemetry project in general, see
+the
+[OpenTelemetry Contributor Guide](https://github.com/open-telemetry/community/blob/main/CONTRIBUTING.md)
+, which provides details on the Contributor License Agreement and the Code of
+Conduct. Every language implementation, Collector, and conventions
+[repository](https://github.com/open-telemetry/) has its own specific
+contributing guides.
## Other ways to contribute
- Visit the [OpenTelemetry community site](/community/).
- Add your application to the [Registry](/ecosystem).
- Submit a [blog post or case study](/docs/contributing/blog/).
-
-[dashboard]: https://app.netlify.com/sites/opentelemetry/overview
-[deploy preview]:
- https://www.netlify.com/blog/2016/07/20/introducing-deploy-previews-in-netlify/
-
-## Code of conduct
-
-OpenTelemetry follows the
-[CNCF Community Code of Conduct](https://github.com/cncf/foundation/blob/main/code-of-conduct.md).
diff --git a/content/en/docs/contributing/announcements.md b/content/en/docs/contributing/announcements.md
new file mode 100644
index 000000000000..808ee7f902b7
--- /dev/null
+++ b/content/en/docs/contributing/announcements.md
@@ -0,0 +1,68 @@
+---
+title: Announcements
+description: Create announcements or banners for special events.
+weight: 50
+---
+
+An announcement is a _regular Hugo page_ contained under the `announcements`
+section of a locale. This means that we leverage Hugo's builtin handling of page
+dates (future or expired), internationalization, and more, to automatically show
+or hide banners depending on the build date, determine banner ordering, handle
+fall back to English banners, etc.
+
+> Announcements are currently used as banners only. We _might_ eventually
+> support slightly more general announcements as well.
+
+### Creating an announcement
+
+To add a new announcement, create an announcement markdown file under the
+`announcements` folder of your localization using the following command:
+
+```sh
+hugo new --kind announcement content/YOUR-LOCALE/announcements/announcement-file-name.md
+```
+
+Adjust according to your desired locale and file name. Add the announcement text
+as the body of the page.
+
+> For banners, the announcement body should be a short phrase.
+
+{{% alert title="For localizations" %}}
+
+If you are creating a **locale specific announcement override**, make sure that
+you use the **same filename** as the English language announcement.
+
+{{% /alert %}}
+
+### Announcement list
+
+Any given announcement will appear in a site build when the build date falls
+between the `date` and `expiryDate` fields of the announcement. When those
+fields are missing they are assumed to be "now" and "forever", respectively.
+
+Announcements will appear in the standard page order as determined using Hugo's
+[Regular pages](https://gohugo.io/methods/site/regularpages/) function. That is,
+the "lightest" announcements (by `weight`) will appear first; when weights are
+the same or unspecified, the most recent announcements (by `date`) will appear
+first, etc.
+
+So, if you want to force an announcement to the top, use a negative `weight` in
+the front matter.
+
+If you find a bug or a problem with the content of this repository, or you would
+like to request an enhancement, [create an issue][new-issue].
+
+If you discover a security issue, read the
+[Security Policy](https://github.com/open-telemetry/opentelemetry.io/security/policy)
+before opening an issue.
+
+Before reporting a new issue, make sure that the issue was not already reported
+or fixed by searching through our
+[issues list](https://github.com/open-telemetry/opentelemetry.io/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc).
+
+When creating a new issue, include a short, meaningful title and a clear
+description. Add as much relevant information as you can, and, if possible, a
+test case.
+
+[new-issue]:
+ https://github.com/open-telemetry/opentelemetry.io/issues/new/choose
diff --git a/content/en/docs/contributing/blog.md b/content/en/docs/contributing/blog.md
index dda6ff74788b..c798246149dd 100644
--- a/content/en/docs/contributing/blog.md
+++ b/content/en/docs/contributing/blog.md
@@ -79,13 +79,13 @@ Follow these steps to create a post from the template:
1. Run the following command from the repository root:
```sh
- npx hugo new content/en/blog/2023/short-name-for-post.md
+ npx hugo new content/en/blog/2024/short-name-for-post.md
```
If your post has images or other assets, run the following command:
```sh
- npx hugo new content/en/blog/2023/short-name-for-post/index.md
+ npx hugo new content/en/blog/2024/short-name-for-post/index.md
```
1. Edit the Markdown file at the path you provided in the previous command. The
diff --git a/content/en/docs/contributing/development.md b/content/en/docs/contributing/development.md
new file mode 100644
index 000000000000..570aced402f2
--- /dev/null
+++ b/content/en/docs/contributing/development.md
@@ -0,0 +1,138 @@
+---
+title: Development
+description:
+ Learn how to set up a development environment for the opentelemetry.io site.
+weight: 60
+---
+
+The following instructions explain how to set up a development environment for
+the website.
+
+## Cloud-IDE setup
+
+These instructions are for [Gitpod.io][], adjust as needed for your favorite
+cloud IDE:
+
+1. Fork this repository. For help, see [Fork a repository][fork].
+2. From [gitpod.io/workspaces][], create a new workspace (do this only once) or
+ open an existing workspace over your fork. You can also visit a link of the
+ form:
+ .
+
+ > **Note**: If you have the necessary permissions to work from this
+ > repository, or just want to look around, open
+ > .
+
+Gitpod automatically installs the repo-specific packages for you.
+
+You're now ready to [build](#build), [serve](#serve) or make updates to the
+website files.
+
+## Local setup
+
+1. [Fork][] and then [clone][] this repository.
+2. Go to the repository directory.
+3. Install or upgrade to the [**active LTS** release][nodejs-rel] of Node.js.
+ We recommend using [nvm][] to manage your Node installation. Under Linux,
+ run the following command, which will install and upgrade to the version
+ specified in the .nvmrc file:
+
+ ```sh
+ nvm install
+ ```
+
+ To [install under Windows][nodejs-win], use [nvm-windows][]:
+
+ ```cmd
+ > nvm install lts && nvm use lts
+ ```
+
+4. Get npm packages and other prerequisites:
+
+ ```sh
+ npm install
+ ```
+
+You're now ready to [build](#build), [serve](#serve) or make updates to the
+website files.
+
+### Build
+
+To build the site run:
+
+```sh
+npm run build
+```
+
+The generated site files are under `public`.
+
+### Serve
+
+To serve the site run:
+
+```sh
+npm run serve
+```
+
+The site is served at [localhost:1313][].
+
+If you need to test [Netlify] redirects, use the following command and visit the
+site at [localhost:8888][]:
+
+```sh
+npm run serve:netlify
+```
+
+The serve command serves files from memory, not from disk.
+
+If you see an error like `too many open files` or `pipe failed` under macOS, you
+might need to increase the file descriptor limit. See
+[Hugo issue #6109](https://github.com/gohugoio/hugo/issues/6109).
+
+### Content and submodules
+
+The website is built from the following content:
+
+- Files under `content/`, `static/`, etc. per [Hugo][] defaults.
+- Mount points, defined in [hugo.yaml][] under `mounts`. Mounts are either
+ directly from git submodules under [content-modules][], or preprocessed
+ content from `content-modules` (placed under `tmp/`), and no where else.
+
+[hugo.yaml]:
+ https://github.com/open-telemetry/opentelemetry.io/blob/main/hugo.yaml
+[content-modules]:
+ https://github.com/open-telemetry/opentelemetry.io/tree/main/content-modules
+
+### Submodule changes
+
+If you change any content inside of a [content-modules][] submodule, then you
+need to first submit a PR (containing the submodule changes) to the submodule's
+repository. Only after the submodule PR has been accepted, can you update the
+submodule and have the changes appear in this website.
+
+It's easiest to manage your `content-modules` changes by working with the
+repository that the corresponding submodule is linked to, rather than inside the
+submodule itself.
+
+Expert contributors can work directly in the submodule. You are then able to
+directly build and serve your (submodule) changes. By default, the CI scripts
+get submodules on every invocation. To prevent this behavior while you work
+within a submodule, set the environment variable `GET=no`. You also need to run
+`git fetch --unshallow` the submodule before you can submit a PR. Alternatively,
+set `DEPTH=100` and re-fetch submodules.
+
+[clone]:
+ https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository
+[fork]: https://docs.github.com/en/get-started/quickstart/fork-a-repo
+[gitpod.io]: https://gitpod.io
+[gitpod.io/workspaces]: https://gitpod.io/workspaces
+[hugo]: https://gohugo.io
+[localhost:1313]: http://localhost:1313
+[localhost:8888]: http://localhost:8888
+[netlify]: https://netlify.com
+[nodejs-rel]: https://nodejs.org/en/about/previous-releases
+[nodejs-win]:
+ https://docs.microsoft.com/en-us/windows/dev-environment/javascript/nodejs-on-windows
+[nvm]:
+ https://github.com/nvm-sh/nvm/blob/master/README.md#installing-and-updating
+[nvm-windows]: https://github.com/coreybutler/nvm-windows
diff --git a/content/en/docs/contributing/issues.md b/content/en/docs/contributing/issues.md
new file mode 100644
index 000000000000..4aeca18c85e9
--- /dev/null
+++ b/content/en/docs/contributing/issues.md
@@ -0,0 +1,57 @@
+---
+title: Reporting an issue
+description: How to report a bug, a security issue, or a potential improvement.
+weight: 50
+cSpell:ignore: prepopulated
+---
+
+If you notice an error or want to suggest improvements to existing content, open
+an issue.
+
+1. Click the **Create documentation issue** link on any document. This redirects
+ you to a GitHub issue page prepopulated with some headers.
+2. Describe the issue or suggestion for improvement. Provide as many details as
+ you can.
+3. Click **Submit new issue**.
+
+After submitting, check in on your issue occasionally or turn on GitHub
+notifications. It might take a few days until maintainers and approvers respond.
+Reviewers and other community members might ask questions before they can take
+action on your issue.
+
+## Suggesting new content or features
+
+If you have an idea for new content or a feature, but you aren't sure where it
+should go, you can still file an issue. You can also report bugs and security
+vulnerabilities.
+
+1. Go to
+ [GitHub](https://github.com/open-telemetry/opentelemetry.io/issues/new/) and
+ select **New issue** inside the **Issues** tab.
+
+1. Select the type of issue that best applies to your request or doubt.
+
+1. Fill out the template.
+
+1. Submit the issue.
+
+### How to file great issues
+
+Keep the following in mind when filing an issue:
+
+- Provide a clear issue description. Describe what specifically is missing, out
+ of date, wrong, or needs improvement.
+- Explain the specific impact the issue has on users.
+- Limit the scope of a given issue to a reasonable unit of work. For problems
+ with a large scope, break them down into smaller issues. For example, "Fix the
+ security docs" is too broad, but "Add details to the 'Restricting network
+ access' topic" is specific enough to be actionable.
+- Search the existing issues to see if there's anything related or similar to
+ the new issue.
+- If the new issue relates to another issue or pull request, refer to it either
+ by its full URL or by the issue or pull request number prefixed with a `#`
+ character. For example, `Introduced by #987654`.
+- Follow the
+ [Code of Conduct](https://github.com/open-telemetry/community/blob/main/code-of-conduct.md).
+ Respect your fellow contributors. For example, "The docs are terrible" is not
+ helpful or polite feedback.
diff --git a/content/en/docs/contributing/localization.md b/content/en/docs/contributing/localization.md
index dd8e8b3fd464..edcc9a62be6d 100644
--- a/content/en/docs/contributing/localization.md
+++ b/content/en/docs/contributing/localization.md
@@ -3,7 +3,7 @@ title: Site localization
description:
Guidance on creating and maintaining site page in non-English localizations.
linkTitle: Localization
-weight: 20
+weight: 25
---
{{% pageinfo color="warning" %}}
@@ -17,9 +17,31 @@ 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.
+## Translation tips
+
+When you translate page content, follow this guidance:
+
+- To ensure that heading anchor targets are uniform across localizations, when
+ translating headings:
+ - If the heading has an explicit ID (which is of the form `{ #some-id }` and
+ comes after the heading text), then preserve the given ID
+ - Otherwise, include a heading ID corresponding to the original English
+ heading text.
+- For link references that are local paths, preserve the path _as is_.
+
+{{% alert title="Note" %}}
+
+This repository has a custom render-link hook that Hugo uses to convert
+**absolute link paths to documentation pages** that are of the form
+`/docs/some-page`, to be locale specific, by prefixing the path with page
+language code when rendering the link. For example, the previous sample path
+would become `/ja/docs/some-page` when rendered from a Japanese page.
+
+{{% /alert %}}
+
## Keeping track of localized page drift {#track-changes}
-One of the main challenges of maintaining localized pages is identifying when
+One of the main challenges of maintaining localized pages, is identifying when
the corresponding English language pages have been updated. This section
explains how we handle this.
@@ -28,19 +50,21 @@ explains how we handle this.
When a localized page is written, such as `content/zh//page.md`, this
translation is based on a specific [`main` branch commit][main] of the
corresponding English language version of the page at
-`content/en//page.md`. Every localized page identifies this commit in
-the page's front matter as follows:
+`content/en//page.md`. In this repository, every localized page
+identifies the English page commit in the localized page's front matter as
+follows:
```markdown
---
title: Your localized page title
...
-## default_lang_commit:
+default_lang_commit:
```
The front matter above would be in `content/zh//page.md`. The commit
-corresponds to the latest commit of `content/en//page.md` in `main`.
+would correspond to the latest commit of `content/en//page.md` in
+`main`.
### Tracking changes to English pages
@@ -49,25 +73,26 @@ corresponding localized pages that need updating by running the following
command:
```console
-$ scripts/i18n-check.sh
+$ npm run check:i18n
1 1 content/en/docs/kubernetes/_index.md - content/zh/docs/kubernetes/_index.md
...
```
-Specify the path to your localization to restrict the output, for example:
+You can restrict the target pages to one or more localizations by providing
+path(s) like this:
```sh
-scripts/i18n-check.sh content/zh
+npm run check:i18n -- content/zh
```
### Viewing change details
For any given localized pages that need updating, you can see the diff details
of the corresponding English language pages by using the `-d` flag and providing
-the paths to your localized pages. For example:
+the paths to your localized pages, or omit the paths to see all. For example:
```console
-$ scripts/i18n-check.sh -d content/zh/docs/kubernetes
+$ npm run check:i18n -- -d content/zh/docs/kubernetes
diff --git a/content/en/docs/kubernetes/_index.md b/content/en/docs/kubernetes/_index.md
index 3592df5d..c7980653 100644
--- a/content/en/docs/kubernetes/_index.md
@@ -87,12 +112,20 @@ index 3592df5d..c7980653 100644
As you create pages for your localization, remember to add `default_lang_commit`
to the page front matter along with an appropriate commit hash from `main`.
-If your translation is based on an English page in `main` at `HEAD`, then run
-the following command to automatically add `default_lang_commit` to your page
-file's front matter using the commit hash at `HEAD`:
+If your page translation is based on an English page in `main` at ``, then
+run the following command to automatically add `default_lang_commit` to your
+page file's front matter using the commit ``. You can specify `HEAD` as an
+argument if your pages are now synced with `main` at `HEAD`. For example:
+
+```sh
+npm run check:i18n -- -n -c 1ca30b4d content/ja
+npm run check:i18n -- -n -c HEAD content/zh/docs/concepts
+```
+
+To list localization page files with missing hash keys, run:
```sh
-scripts/i18n-check.sh -u
+npm run check:i18n -- -n
```
### Updating `default_lang_commit` for existing pages
@@ -105,11 +138,32 @@ commit hash.
If your localized page now corresponds to the English language version in `main`
at `HEAD`, then erase the commit hash value in the front matter, and run the
-update command given in the previous section to automatically refresh the
+**add** command given in the previous section to automatically refresh the
`default_lang_commit` field value.
{{% /alert %}}
+If you have batch updated all of your localization pages that had drifted, you
+can update the commit hash of these files using the `-u` flag followed by a
+commit hash or 'HEAD' to use `main@HEAD`.
+
+```sh
+npm run check:i18n -- -c
+npm run check:i18n -- -c HEAD
+```
+
+{{% alert title="Important" %}}
+
+When you use `HEAD` as a hash specifier, the script will use the hash of `main`
+at HEAD in your **local environment**. Make sure that you fetch and pull `main`,
+if you want HEAD to correspond to `main` in GitHub.
+
+{{% /alert %}}
+
+### Script help
+
+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
diff --git a/content/en/docs/contributing/new-content.md b/content/en/docs/contributing/new-content.md
new file mode 100644
index 000000000000..7ccb57284f95
--- /dev/null
+++ b/content/en/docs/contributing/new-content.md
@@ -0,0 +1,503 @@
+---
+title: Add new content
+description: Learn how to add new content using GitHub UI or a local fork.
+weight: 2
+---
+
+To contribute new content pages or improve existing content pages, open a pull
+request (PR):
+
+- If your change is small, or you're unfamiliar with Git, read
+ [Changes using GitHub](#changes-using-github) to learn how to edit a page.
+- If your changes are large, read [Work from a local fork](#fork-the-repo) to
+ learn how to make changes locally on your computer.
+
+{{% alert title="Tip" %}}
+
+Turn your pull request into a draft to signal that the content still isn't ready
+for review. Maintainers may still comment or do high-level reviews, though they
+won't review the content in full until you remove the draft status.
+
+{{% /alert %}}
+
+The following figure illustrates how to contribute new documentation.
+
+```mermaid
+flowchart LR
+ subgraph first[How to contribute]
+ direction TB
+ T[ ] -.-
+ B[Fork the repo in GitHub] --- C[Write docs in markdown and build site with Hugo]
+ C --- D[Push source to the fork]
+ D --- E[Open a pull request]
+ E --- F[Sign the 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
+```
+
+_Figure 1. Contributing new content._
+
+## Changes using GitHub {#changes-using-github}
+
+If you're less experienced with Git workflows, here's an easier method of
+opening a pull request. Figure 2 outlines the steps and the details follow.
+
+```mermaid
+flowchart LR
+A([fa:fa-user New Contributor]) --- id1[(open-telemetry/opentelemetry.io GitHub)]
+subgraph tasks[Changes using GitHub]
+direction TB
+ 0[ ] -.-
+ 1[1. Edit this page] --> 2[2. Use GitHub markdown editor to make changes]
+ 2 --> 3[3. fill in Propose file change]
+
+end
+subgraph tasks2[ ]
+direction TB
+4[4. select Propose file change] --> 5[5. select Create pull request] --> 6[6. fill in Open a pull request]
+6 --> 7[7. select Create 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
+```
+
+_Figure 2. Steps for opening a PR using GitHub._
+
+1. On the page where you see the issue, select the **Edit this page** option in
+ the right-hand side navigation panel.
+
+1. If you're not a member of the project, GitHub offers to create a fork of the
+ repository. Select **Fork this repository**.
+
+1. Make your changes in the GitHub editor.
+
+1. Fill in the **Propose file change** form.
+
+1. Select **Propose file change**.
+
+1. Select **Create pull request**.
+
+1. The **Open a pull request** screen appears. Your description helps reviewers
+ understand your change.
+
+1. Select **Create pull request**.
+
+Before merging a pull request, OpenTelemetry community members review and
+approve it.
+
+If a reviewer asks you to make changes:
+
+1. Go to the **Files changed** tab.
+1. Select the pencil (edit) icon on any files changed by the pull request.
+1. Make the changes requested. If there's a code suggestion, apply it.
+1. Commit the changes.
+
+When your review is complete, a reviewer merges your PR and your changes goes
+live a few minutes later.
+
+{{% alert title="Tip" %}}
+
+Comment `/fix:format` on your pull request to trigger an automated check for
+formatting issues.
+
+{{% /alert %}}
+
+## Work from a local fork {#fork-the-repo}
+
+If you're more experienced with Git, or if your changes are larger than a few
+lines, work from a local fork.
+
+Make sure you have
+[git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) installed
+on your computer. You can also use a user interface for Git.
+
+Figure 3 shows the steps to follow when you work from a local fork. The details
+for each step follow.
+
+```mermaid
+flowchart LR
+1[Fork the open-telemetry/opentelemetry repository] --> 2[Create local clone and set upstream]
+subgraph changes[Your changes]
+direction TB
+S[ ] -.-
+3[Create a branch example: my_new_branch] --> 3a[Make changes using a text editor] --> 4["Preview your changes locally using Hugo (localhost:1313)"]
+end
+subgraph changes2[Commit / Push]
+direction TB
+T[ ] -.-
+5[Commit your changes] --> 6[Push commit to origin/my_new_branch]
+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
+```
+
+_Figure 3. Working from a local fork to make your changes._
+
+### Fork the opentelemetry.io repository
+
+1. Navigate to the
+ [`opentelemetry.io`](https://github.com/open-telemetry/opentelemetry.io/)
+ repository.
+1. Select **Fork**.
+
+### Create a local clone and set the upstream
+
+1. In a terminal window, clone your fork and install the requirements:
+
+ ```shell
+ git clone git@github.com:/opentelemetry.io.git
+ cd opentelemetry.io
+ npm install
+ ```
+
+1. Set the `open-telemetry/opentelemetry.io` repository as the `upstream`
+ remote:
+
+ ```shell
+ git remote add upstream https://github.com/open-telemetry/opentelemetry.io.git
+ ```
+
+1. Confirm your `origin` and `upstream` repositories:
+
+ ```shell
+ git remote -v
+ ```
+
+ Output is similar to:
+
+ ```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. Fetch commits from your fork's `origin/main` and
+ `open-telemetry/opentelemetry.io`'s `upstream/main`:
+
+ ```shell
+ git fetch origin
+ git fetch upstream
+ ```
+
+ This makes sure your local repository is up to date before you start making
+ changes. Push changes from upstream to origin regularly to keep your fork in
+ sync with upstream.
+
+### Create a branch
+
+1. Create a new branch. This example assumes the base branch is `upstream/main`:
+
+ ```shell
+ git checkout -b upstream/main
+ ```
+
+1. Make your changes using a code or text editor.
+
+At any time, use the `git status` command to see what files you've changed.
+
+### Commit your changes
+
+When you are ready to submit a pull request, commit your changes.
+
+1. In your local repository, check which files you need to commit:
+
+ ```shell
+ git status
+ ```
+
+ Output is similar to:
+
+ ```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/file-you-are-editing.md
+
+ no changes added to commit (use "git add" and/or "git commit -a")
+ ```
+
+1. Add the files listed under **Changes not staged for commit** to the commit:
+
+ ```shell
+ git add
+ ```
+
+ Repeat this for each file.
+
+1. After adding all the files, create a commit:
+
+ ```shell
+ git commit -m "Your commit message"
+ ```
+
+1. Push your local branch and its new commit to your remote fork:
+
+ ```shell
+ git push origin
+ ```
+
+1. Once the changes are pushed, GitHub lets you know that you can create a PR.
+
+### Open a pull request from your fork {#open-a-pr}
+
+Figure 4 shows the steps to open a PR from your fork to
+[opentelemetry.io](https://github.com/open-telemetry/opentelemetry.io).
+
+```mermaid
+flowchart LR
+subgraph first[ ]
+direction TB
+1[1. Go to opentelemetry.io repository] --> 2[2. Select New Pull Request]
+2 --> 3[3. Select compare across forks]
+3 --> 4[4. Select your fork from head repository drop-down menu]
+end
+subgraph second [ ]
+direction TB
+5[5. Select your branch from the compare drop-down menu] --> 6[6. Select Create Pull Request]
+6 --> 7[7. Add a description to your PR]
+7 --> 8[8. Select Create 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
+```
+
+_Figure 4. Steps to open a PR from your fork to_
+[opentelemetry.io](https://github.com/open-telemetry/opentelemetry.io).
+
+1. In a web browser, go to the
+ [`opentelemetry.io`](https://github.com/open-telemetry/opentelemetry.io)
+ repository.
+1. Select **New Pull Request**.
+1. Select **compare across forks**.
+1. From the **head repository** drop-down menu, select your fork.
+1. From the **compare** drop-down menu, select your branch.
+1. Select **Create Pull Request**.
+1. Add a description for your pull request:
+
+ - **Title** (50 characters or less): Summarize the intent of the change.
+ - **Description**: Describe the change in more detail.
+
+ - If there is a related GitHub issue, include `Fixes #12345` or
+ `Closes #12345` in the description so that GitHub's automation closes the
+ mentioned issue after merging the PR. If there are other related PRs,
+ link those as well.
+ - If you want advice on something specific, include any questions you'd
+ like reviewers to think about in your description.
+
+1. Select the **Create pull request** button.
+
+Your pull request is available in
+[Pull requests](https://github.com/open-telemetry/opentelemetry.io/pulls).
+
+After opening a PR, GitHub runs automated tests and tries to deploy a preview
+using [Netlify](https://www.netlify.com/).
+
+- If the Netlify build fails, select **Details** for more information.
+- If the Netlify build succeeds, select **Details** to open a staged version of
+ the OpenTelemetry website with your changes applied. This is how reviewers
+ check your changes.
+
+Other checks might also fail. See the
+[list of all PR checks](/docs/contributing/pr-checks).
+
+### Fix content issues automatically
+
+Before submitting a change to the repository, run the following command and (i)
+address any reported issues, (ii) commit any files changed by the script:
+
+```sh
+npm run test-and-fix
+```
+
+To separately test and fix all issues with your files, run:
+
+```sh
+npm run test # Checks but does not update any files
+npm run fix:all # May update files
+```
+
+To list available NPM scripts, run `npm run`. See
+[PR checks](/docs/contributing/pr-checks) for more information on pull request
+checks and how to fix errors automatically.
+
+### Preview your changes locally {#preview-locally}
+
+Preview your changes locally before pushing them or opening a pull request. A
+preview lets you catch build errors or markdown formatting problems.
+
+To build and serve the site locally with Hugo, run the following command:
+
+```shell
+npm run serve
+```
+
+Navigate to `http://localhost:1313` in your web browser to see the local
+preview. Hugo watches for changes and rebuilds the site as needed.
+
+To stop the local Hugo instance, go back to the terminal and type `Ctrl+C`, or
+close the terminal window.
+
+### Site deploys and PR previews
+
+If you submit a PR, Netlify creates a [deploy preview][] so that you can review your
+changes. Once your PR is merged, Netlify deploys the updated site to the production
+server.
+
+> **Note**: PR previews include _draft pages_, but production builds do not.
+
+To see deploy logs and more, visit the project's [dashboard][] -- Netlify login
+required.
+
+### PR guidelines
+
+Before a PR gets merged, it sometimes requires a few iterations of
+review-and-edit. To help us and yourself make this process as easy as possible,
+we ask that you adhere to the following:
+
+- If your PR isn't a quick fix, then **work from a fork**: Click the
+ [Fork](https://github.com/open-telemetry/opentelemetry.io/fork) button at the
+ top of the repository and clone the fork locally. When you are ready, raise a
+ PR with the upstream repository.
+- **Do not work from the `main`** branch of your fork, but create a PR-specific
+ branch.
+- Ensure that maintainers are
+ [allowed to apply changes to your pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork).
+
+### Changes from reviewers
+
+Sometimes reviewers commit to your pull request. Before making any other
+changes, fetch those commits.
+
+1. Fetch commits from your remote fork and rebase your working branch:
+
+ ```shell
+ git fetch origin
+ git rebase origin/
+ ```
+
+1. After rebasing, force-push new changes to your fork:
+
+ ```shell
+ git push --force-with-lease origin
+ ```
+
+You can also solve merge conflicts from the GitHub UI.
+
+### Merge conflicts and rebasing
+
+If another contributor commits changes to the same file in another PR, it can
+create a merge conflict. You must resolve all merge conflicts in your PR.
+
+1. Update your fork and rebase your local branch:
+
+ ```shell
+ git fetch origin
+ git rebase origin/
+ ```
+
+ Then force-push the changes to your fork:
+
+ ```shell
+ git push --force-with-lease origin
+ ```
+
+1. Fetch changes from `open-telemetry/opentelemetry.io`'s `upstream/main` and
+ rebase your branch:
+
+ ```shell
+ git fetch upstream
+ git rebase upstream/main
+ ```
+
+1. Inspect the results of the rebase:
+
+ ```shell
+ git status
+ ```
+
+ This results in a number of files marked as conflicted.
+
+1. Open each conflicted file and look for the conflict markers: `>>>`, `<<<`,
+ and `===`. Resolve the conflict and delete the conflict marker.
+
+ For more information, see
+ [How conflicts are presented](https://git-scm.com/docs/git-merge#_how_conflicts_are_presented).
+
+1. Add the files to the changeset:
+
+ ```shell
+ git add
+ ```
+
+1. Continue the rebase:
+
+ ```shell
+ git rebase --continue
+ ```
+
+1. Repeat steps 2 to 5 as needed.
+
+ After applying all commits, the `git status` command shows that the rebase is
+ complete.
+
+1. Force-push the branch to your fork:
+
+ ```shell
+ git push --force-with-lease origin
+ ```
+
+ The pull request no longer shows any conflicts.
+
+### Merge requirements
+
+Pull requests are merged when they comply with the following criteria:
+
+- All reviews by approvers, maintainers, technical committee members, or subject
+ matter experts have the status "Approved".
+- No unresolved conversations.
+- Approved by at least one approver.
+- No failing PR checks.
+- PR branch is up-to-date with the base branch.
+
+> **Important**
+>
+> Do not worry too much about failing PR checks. Community members will help you
+> to get them fixed, by either providing you with instructions how to fix them
+> or by fixing them on your behalf.
+
+[dashboard]: https://app.netlify.com/sites/opentelemetry/overview
+[deploy preview]:
+ https://www.netlify.com/blog/2016/07/20/introducing-deploy-previews-in-netlify/
diff --git a/content/en/docs/contributing/pr-checks.md b/content/en/docs/contributing/pr-checks.md
index 64b1e2d9ae0a..d59ce9abcb47 100644
--- a/content/en/docs/contributing/pr-checks.md
+++ b/content/en/docs/contributing/pr-checks.md
@@ -19,7 +19,7 @@ a set of checks are executed. The PR checks verify that...
{{% alert title="Note" color="primary" %}}
If any of the PR checks fails, please try to
-[fix content issues automatically](/docs/contributing/#fix-content-issues-automatically)
+[fix content issues automatically](/docs/contributing/new-content/#fix-content-issues-automatically)
first by running `npm run fix:all` on your machine.
Additionally, you can comment `/fix:all` on your Pull Request. This will make
@@ -34,7 +34,7 @@ can recover from a failed state.
## Easy CLA
This check fails if you haven't
-[signed the CLA](/docs/contributing/#sign-the-cla).
+[signed the CLA](/docs/contributing/requirements/#sign-the-cla).
## Netlify deployment
diff --git a/content/en/docs/contributing/requirements.md b/content/en/docs/contributing/requirements.md
new file mode 100644
index 000000000000..cd90ca36161f
--- /dev/null
+++ b/content/en/docs/contributing/requirements.md
@@ -0,0 +1,33 @@
+---
+title: Requirements
+description:
+ To contribute, you need to be familiar with the following techs and tools.
+weight: 1
+---
+
+To contribute, you need to be familiar with the following techs and tools:
+
+- [git](https://git-scm.com/)
+- [GitHub](https://github.com/)
+- Markdown ([CommonMark](https://commonmark.org/))
+- YAML
+
+For technical details concerning how the documentation is built and tested
+locally, see [Development](/docs/contributing/development).
+
+## Sign the CNCF CLA {#sign-the-cla}
+
+All OpenTelemetry contributors must read the
+[Contributor guide](https://github.com/open-telemetry/community/blob/main/CONTRIBUTING.md)
+and
+[sign the Contributor License Agreement (CLA)](https://docs.linuxfoundation.org/lfx/easycla/contributors).
+
+Pull requests from contributors who haven't signed the CLA fail the automated
+tests. The name and email you provide must match those found in your
+`git config`, and your git name and email must match those used for the CNCF
+CLA.
+
+## Code of conduct
+
+OpenTelemetry follows the
+[CNCF Community Code of Conduct](https://github.com/cncf/foundation/blob/main/code-of-conduct.md).
diff --git a/content/en/docs/contributing/sig-practices.md b/content/en/docs/contributing/sig-practices.md
new file mode 100644
index 000000000000..4397ddf2fa5b
--- /dev/null
+++ b/content/en/docs/contributing/sig-practices.md
@@ -0,0 +1,133 @@
+---
+title: SIG practices for approver and maintainers
+linkTitle: SIG practices
+description:
+ Learn how approvers and maintainers manage issues and contributions.
+weight: 999
+cSpell:ignore: chalin Comms docsy onboarded
+---
+
+This pages includes guidelines and some common practices used by approvers and
+maintainers.
+
+## Onboarding
+
+If a contributor steps up to take on a role with more responsibility towards the
+documentation (approver, maintainer) they will be onboarded by existing
+approvers and maintainers:
+
+- They are added to the `docs-approvers` (or `docs-maintainers`) group.
+- They are added to the `#otel-comms` and `#otel-maintainers` and private
+ in-team slack channels.
+- They are asked to enroll for the calendar invites for
+ [SIG Comms meeting](https://groups.google.com/a/opentelemetry.io/g/calendar-comms)
+ and
+ [maintainers meeting](https://groups.google.com/a/opentelemetry.io/g/calendar-maintainer-meeting).
+- They are asked to verify that the current meeting time for SIG Comms works for
+ them and if not to collaborate with existing approvers and maintainers to find
+ a time that suits everyone.
+- They are asked to review the different resources available for contributors:
+ - [Community Resources](https://github.com/open-telemetry/community/),
+ especially the document around
+ [Community Membership](https://github.com/open-telemetry/community/blob/main/community-membership.md)
+ and the
+ [social media guide](https://github.com/open-telemetry/community/blob/main/social-media-guide.md).
+ - [Contributing Guidelines](/docs/contributing) As part of this, they will
+ review those documents and provide feedback for improving them via issues or
+ pull requests.
+
+Additional valuable resources to review are
+
+- [Hugo documentation](https://gohugo.io/documentation/)
+- [Docsy documentation](https://www.docsy.dev/docs/)
+- [Marketing guidelines](/community/marketing-guidelines/), including the Linux
+ Foundation’s branding and
+ [trademark usage guidelines](https://www.linuxfoundation.org/legal/trademark-usage).
+ Those are especially valuable when reviewing entries to the registry,
+ integrations, vendors, adopters or distributions.
+
+## Collaboration
+
+- Approvers and maintainers have different work schedules and circumstances.
+ That's why all communication is assumed to be asynchronous and they should not
+ feel obligated to reply outside of their normal schedule.
+- When an approver or maintainer won't be available to contribute for an
+ extended period of time (more than a few days or a week) or won't be available
+ in that period of time, they should communicate this using the
+ [#otel-comms](https://cloud-native.slack.com/archives/C02UN96HZH6) channel and
+ updating the GitHub status.
+- Approver and maintainer adhere to the
+ [OTel Code of Conduct](https://github.com/open-telemetry/community/?tab=coc-ov-file#opentelemetry-community-code-of-conduct)
+ and the [Community Values](/community/mission/#community-values). They are
+ friendly and helpful towards contributors. In the case of a conflict,
+ misunderstanding or any other kind of situation that makes an
+ approver/maintainer feel uncomfortable they can step back from a conversation,
+ issue or PR and ask another approver/maintainer to step in.
+
+## Code reviews
+
+### General
+
+- If the PR branch is `out-of-date with the base branch`, they do not need to be
+ updated continuously: every update triggers all the PR CI checks to be run!
+ It's often enough to update them before merging.
+- A PR by non-maintainers should **never** update git sub modules. This happens
+ by accident from time to time. Let the PR author know that they should not
+ worry about it, we will fix this before merging, but in the future they should
+ make sure that they work from an up-to-date fork.
+- If the contributor is having trouble signing the CLA or used the wrong email
+ by mistake in one of their commits, ask them to fix the issue or rebase the
+ pull request. Worst case scenario, close and re-open the PR to trigger a new
+ CLA check.
+- Words unknown to cspell should be added to the cspell ignore list per page by
+ PR authors. Only approvers and maintainers will add commonly used terms to the
+ global list.
+
+### Co-owned PRs
+
+PRs with changes to documentation co-owned by a SIG (collector, demo,
+language-specific...) should aim for two approvals: one by a docs approver and
+one by a SIG approver:
+
+- Doc approver label such PRs with `sig:` and tag the SIG `-approvers`
+ group on that PR.
+- After a doc approver has reviewed and approved the PR, they can add the label
+ [`sig-approval-missing`](https://github.com/open-telemetry/opentelemetry.io/labels/sig-approval-missing).
+ This signals to the SIG that they need to handle the PR.
+- If no SIG approval is given within a certain grace period (two weeks in
+ general, but may be less in urgent cases), docs maintainer may use their own
+ judgement to merge that PR.
+
+### PRs from bots
+
+PRs created by bots can be merged by the following practice:
+
+- PRs that auto-update versions in the registry can be fixed, approved and
+ merged immediately.
+- PRs that auto-update the versions of SDKs, zero-code instrumentations or the
+ collector can be approved and merged except the corresponding SIG signals that
+ merging should be postponed.
+- PRs that auto-update the version of any specification often require updates to
+ scripts for the CI checks to pass. In that case
+ [@chalin](https://github.com/chalin/) will handle the PR. Otherwise those PRs
+ can as well be approved and merged except the corresponding SIG signals that
+ merging should be postponed.
+
+### Translation PRs
+
+PRs with changes to translations should aim for two approvals: one by a docs
+approver and one by a translation approver. Similar practices apply as suggested
+for the co-owned PRs.
+
+### Merging PRs
+
+The following workflow can be applied by maintainers to merge PRs:
+
+- Make sure that a PR has all approvals and all CI checks pass.
+- If the branch is out-of-date, rebase update it via the GitHub UI.
+- The update will trigger all CI checks to run again, wait for them to pass or
+ execute a script like the following to make it happen in the background:
+
+ ```shell
+ export PR=; gh pr checks ${PR} --watch && gh pr merge ${PR} --squash
+ ```
diff --git a/content/en/docs/contributing/style-guide.md b/content/en/docs/contributing/style-guide.md
index 3d3341733982..7438b97bc8dc 100644
--- a/content/en/docs/contributing/style-guide.md
+++ b/content/en/docs/contributing/style-guide.md
@@ -1,7 +1,8 @@
---
title: Documentation style guide
+description: Terminology and style when writing OpenTelemetry docs.
linkTitle: Style guide
-weight: 10
+weight: 20
cSpell:ignore: open-telemetry postgre style-guide textlintrc
---
@@ -22,7 +23,7 @@ before submitting a
(PR), run `npm run fix:all` on your local machine and commit the changes.
If you run into errors or [failed PR checks](/docs/contributing/pr-checks), read
-about our style guide below and what you can do to fix certain common issues.
+about our style guide and learn what you can do to fix certain common issues.
{{% /alert %}}
@@ -36,7 +37,7 @@ the site.
| --- | --- |
| OpenTelemetry | OpenTelemetry should always be capitalized. Don't use Open-Telemetry. |
| OTel | OTel is the accepted short form of OpenTelemetry. Don't use OTEL. |
-| Collector | When referring to the OpenTelemetry Collector, always capitalize Collector. |
+| Collector | When referring to the OpenTelemetry Collector, always capitalize Collector. Write "The Collector" or "The Opentelemetry Collector" if you're starting a sentence. Write "the Collector" or "the OpenTelemetry Collector" in the middle or end of a sentence. Use just "Collector" if you are using Collector as an adjective (for example, "Collector configuration").|
| OTEP | OpenTelemetry Enhancement Proposal. Write "OTEPs" as plural form. Don't write "OTep" or "otep". |
| OpAMP | Open Agent Management Protocol. Don't write "OPAMP" or "opamp" in descriptions or instructions. |
@@ -107,11 +108,11 @@ run `npm run fix:dict`.
## File format
To enforce a certain standard on how files are structured, all files should be
-formatted by [prettier](https://prettier.io). Run `npm fix:format` before
+formatted by [prettier](https://prettier.io). Run `npm run fix:format` before
submitting a PR, or run it afterwards and push an additional commit.
## File names
All file names should be in
[kebab case](https://en.wikipedia.org/wiki/Letter_case#Kebab_case). Run
-`npm fix:filenames` to automatically rename your files.
+`npm run fix:filenames` to automatically rename your files.
diff --git a/content/en/docs/demo/_index.md b/content/en/docs/demo/_index.md
index f4ed9dd79043..5eaecbffd280 100644
--- a/content/en/docs/demo/_index.md
+++ b/content/en/docs/demo/_index.md
@@ -23,24 +23,25 @@ Want to deploy the demo and see it in action? Start here.
Want to understand how a particular language's instrumentation works? Start
here.
-| Language | Automatic Instrumentation | Instrumentation Libraries | Manual Instrumentation |
-| ---------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
-| .NET | | [Cart Service](services/cart/) | [Cart Service](services/cart/) |
-| C++ | | | [Currency Service](services/currency/) |
-| Go | | [Accounting Service](services/accounting/), [Checkout Service](services/checkout/), [Product Catalog Service](services/product-catalog/) | [Checkout Service](services/checkout/), [Product Catalog Service](services/product-catalog/) |
-| Java | [Ad Service](services/ad/) | | [Ad Service](services/ad/) |
-| JavaScript | | [Frontend](services/frontend/) | [Frontend](services/frontend/), [Payment Service](services/payment/) |
-| Kotlin | | [Fraud Detection Service](services/fraud-detection/) | |
-| PHP | | [Quote Service](services/quote/) | [Quote Service](services/quote/) |
-| Python | [Recommendation Service](services/recommendation/) | | [Recommendation Service](services/recommendation/) |
-| Ruby | | [Email Service](services/email/) | [Email Service](services/email/) |
-| Rust | | [Shipping Service](services/shipping/) | [Shipping Service](services/shipping/) |
+| Language | Automatic Instrumentation | Instrumentation Libraries | Manual Instrumentation |
+| ---------- | -------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
+| .NET | [Accounting Service](services/accounting/) | [Cart Service](services/cart/) | [Cart Service](services/cart/) |
+| C++ | | | [Currency Service](services/currency/) |
+| Go | | [Checkout Service](services/checkout/), [Product Catalog Service](services/product-catalog/) | [Checkout Service](services/checkout/), [Product Catalog Service](services/product-catalog/) |
+| Java | [Ad Service](services/ad/) | | [Ad Service](services/ad/) |
+| JavaScript | | [Frontend](services/frontend/) | [Frontend](services/frontend/), [Payment Service](services/payment/) |
+| Kotlin | | [Fraud Detection Service](services/fraud-detection/) | |
+| PHP | | [Quote Service](services/quote/) | [Quote Service](services/quote/) |
+| Python | [Recommendation Service](services/recommendation/) | | [Recommendation Service](services/recommendation/) |
+| Ruby | | [Email Service](services/email/) | [Email Service](services/email/) |
+| Rust | | [Shipping Service](services/shipping/) | [Shipping Service](services/shipping/) |
## Service Documentation
Specific information about how OpenTelemetry is deployed in each service can be
found here:
+- [Accounting Service](services/accounting/)
- [Ad Service](services/ad/)
- [Cart Service](services/cart/)
- [Checkout Service](services/checkout/)
@@ -63,7 +64,7 @@ solve them.
We'll be adding more scenarios over time.
- Generate a [Product Catalog error](feature-flags) for `GetProduct` requests
- with product id: `OLJCESPC7Z` using the Feature Flag service
+ with product ID: `OLJCESPC7Z` using the Feature Flag service
- Discover a memory leak and diagnose it using metrics and traces.
[Read more](scenarios/recommendation-cache/)
diff --git a/content/en/docs/demo/architecture.md b/content/en/docs/demo/architecture.md
index 877843566688..f3049939048d 100644
--- a/content/en/docs/demo/architecture.md
+++ b/content/en/docs/demo/architecture.md
@@ -12,7 +12,7 @@ generator which uses [Locust](https://locust.io/) to fake user traffic.
```mermaid
graph TD
subgraph Service Diagram
-accountingservice(Accounting Service):::golang
+accountingservice(Accounting Service):::dotnet
adservice(Ad Service):::java
cache[(Cache (redis))]
cartservice(Cart Service):::dotnet
diff --git a/content/en/docs/demo/feature-flags.md b/content/en/docs/demo/feature-flags.md
index f7a798f4b625..4b9fd1c72999 100644
--- a/content/en/docs/demo/feature-flags.md
+++ b/content/en/docs/demo/feature-flags.md
@@ -19,7 +19,7 @@ change the `defaultVariant` value in the config file for a given flag to "on".
| `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 |
-| `productCatalogFailure` | Product Catalog | Generate an error for `GetProduct` requests with product id: `OLJCESPC7Z` |
+| `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. |
| `paymentServiceUnreachable` | Checkout Service | Use a bad address when calling the PaymentService to make it seem like the PaymentService is unavailable. |
diff --git a/content/en/docs/demo/services/_index.md b/content/en/docs/demo/services/_index.md
index ce9f0392d942..b09a35f1c016 100644
--- a/content/en/docs/demo/services/_index.md
+++ b/content/en/docs/demo/services/_index.md
@@ -8,7 +8,7 @@ To visualize request flows, see the [Service Diagram](../architecture/).
| Service | Language | Description |
| ----------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
-| [accountingservice](accounting/) | Go | Processes incoming orders and count the sum of all orders (mock/). |
+| [accountingservice](accounting/) | .NET | Processes incoming orders and count the sum of all orders (mock/). |
| [adservice](ad/) | Java | Provides text ads based on given context words. |
| [cartservice](cart/) | .NET | Stores the items in the user's shopping cart in Redis and retrieves it. |
| [checkoutservice](checkout/) | Go | Retrieves user cart, prepares order and orchestrates the payment, shipping and the email notification. |
diff --git a/content/en/docs/demo/services/accounting.md b/content/en/docs/demo/services/accounting.md
index 3523356c026f..f7e0fb200b0f 100644
--- a/content/en/docs/demo/services/accounting.md
+++ b/content/en/docs/demo/services/accounting.md
@@ -2,7 +2,6 @@
title: Accounting Service
linkTitle: Accounting
aliases: [accountingservice]
-cSpell:ignore: otelsarama otlptracegrpc sarama sdktrace
---
This service calculates the total amount of sold products. This is only mocked
@@ -10,54 +9,21 @@ and received orders are printed out.
[Accounting Service](https://github.com/open-telemetry/opentelemetry-demo/blob/main/src/accountingservice/)
-## Traces
+## Auto-instrumentation
-### Initializing Tracing
+This service relies on the OpenTelemetry .NET Automatic Instrumentation to
+automatically instrument libraries such as Kafka, and to configure the
+OpenTelemetry SDK. The instrumentation is added via Nuget package
+[OpenTelemetry.AutoInstrumentation](https://www.nuget.org/packages/OpenTelemetry.AutoInstrumentation)
+and activated using environment variables that are sourced from `instrument.sh`.
+Using this installation approach also guarantees that all instrumentation
+dependencies are properly aligned with the application.
-The OpenTelemetry SDK is initialized from `main` using the `initTracerProvider`
-function.
+## Publishing
-```go
-func initTracerProvider() (*sdktrace.TracerProvider, error) {
- ctx := context.Background()
+Add `--use-current-runtime` to the `dotnet publish` command to distribute
+appropriate native runtime components.
- exporter, err := otlptracegrpc.New(ctx)
- if err != nil {
- return nil, err
- }
- tp := sdktrace.NewTracerProvider(
- sdktrace.WithBatcher(exporter),
- sdktrace.WithResource(initResource()),
- )
- otel.SetTracerProvider(tp)
- otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
- return tp, nil
-}
-```
-
-You should call `TracerProvider.Shutdown()` when your service is shutdown to
-ensure all spans are exported. This service makes that call as part of a
-deferred function in main
-
-```go
-tp, err := initTracerProvider()
-if err != nil {
- log.Fatal(err)
-}
-defer func() {
- if err := tp.Shutdown(context.Background()); err != nil {
- log.Printf("Error shutting down tracer provider: %v", err)
- }
-}()
-```
-
-### Adding Kafka ( Sarama ) auto-instrumentation
-
-This service will receive the processed results of the Checkout Service via a
-Kafka topic. To instrument the Kafka client the ConsumerHandler implemented by
-the developer has to be wrapped.
-
-```go
-handler := groupHandler{} // implements sarama.ConsumerGroupHandler
-wrappedHandler := otelsarama.WrapConsumerGroupHandler(&handler)
+```sh
+dotnet publish "./AccountingService.csproj" --use-current-runtime -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
```
diff --git a/content/en/docs/demo/services/cart.md b/content/en/docs/demo/services/cart.md
index d325d9d6f74e..075f250e838c 100644
--- a/content/en/docs/demo/services/cart.md
+++ b/content/en/docs/demo/services/cart.md
@@ -25,8 +25,8 @@ and resource attributes is performed through environment variables.
```cs
Action appResourceBuilder =
resource => resource
- .AddDetector(new ContainerResourceDetector())
- .AddDetector(new HostDetector());
+ .AddContainerDetector()
+ .AddHostDetector();
builder.Services.AddOpenTelemetry()
.ConfigureResource(appResourceBuilder)
@@ -81,7 +81,8 @@ desired instrumentation libraries, exporters, etc.
```cs
Action appResourceBuilder =
resource => resource
- .AddDetector(new ContainerResourceDetector());
+ .AddContainerDetector()
+ .AddHostDetector();
builder.Services.AddOpenTelemetry()
.ConfigureResource(appResourceBuilder)
diff --git a/content/en/docs/demo/services/payment.md b/content/en/docs/demo/services/payment.md
index 3fbf0170c16d..5c018ceaa3d5 100644
--- a/content/en/docs/demo/services/payment.md
+++ b/content/en/docs/demo/services/payment.md
@@ -87,7 +87,7 @@ You can then use `opentelemetry.js` to start your app. This can be done in the
`ENTRYPOINT` command for the service's `Dockerfile`.
```dockerfile
-ENTRYPOINT [ "node", "./opentelemetry.js" ]
+ENTRYPOINT [ "node", "--require", "./opentelemetry.js", "./index.js" ]
```
## Traces
diff --git a/content/en/docs/kubernetes/operator/automatic.md b/content/en/docs/kubernetes/operator/automatic.md
index d606c01ed93b..22bd2963d3b2 100644
--- a/content/en/docs/kubernetes/operator/automatic.md
+++ b/content/en/docs/kubernetes/operator/automatic.md
@@ -404,7 +404,7 @@ spec:
#### Learn more {#python-learn-more}
-[See the Python agent Configuration docs for more details.](/docs/languages/python/automatic/configuration/#disabling-specific-instrumentations)
+[See the Python agent Configuration docs for more details.](/docs/zero-code/python/configuration/#disabling-specific-instrumentations)
### Go
diff --git a/content/en/docs/kubernetes/operator/troubleshooting/_index.md b/content/en/docs/kubernetes/operator/troubleshooting/_index.md
new file mode 100644
index 000000000000..91f696066c0f
--- /dev/null
+++ b/content/en/docs/kubernetes/operator/troubleshooting/_index.md
@@ -0,0 +1,8 @@
+---
+title: Troubleshooting the OpenTelemetry Operator for Kubernetes
+linkTitle: Troubleshooting
+description:
+ Contains a collection of tips for troubleshooting various aspects of the
+ OpenTelemetry Kubernetes Operator. For example, what to do when the target
+ allocator is failing to discover scrape targets.
+---
diff --git a/content/en/docs/kubernetes/operator/troubleshooting/target-allocator.md b/content/en/docs/kubernetes/operator/troubleshooting/target-allocator.md
new file mode 100644
index 000000000000..ea979bece401
--- /dev/null
+++ b/content/en/docs/kubernetes/operator/troubleshooting/target-allocator.md
@@ -0,0 +1,515 @@
+---
+title: Target Allocator
+cSpell:ignore: bleh targetallocator
+---
+
+If you’ve enabled
+[Target Allocator](/docs/kubernetes/operator/target-allocator/) service
+discovery on the [OpenTelemetry Operator](/docs/kubernetes/operator), and the
+Target Allocator is failing to discover scrape targets, there are a few
+troubleshooting steps that you can take to help you understand what’s going on
+and restore normal operation.
+
+## Troubleshooting steps
+
+### Did you deploy all of your resources to Kubernetes?
+
+As a first step, make sure that you have deployed all relevant resources to your
+Kubernetes cluster.
+
+### Do you know if metrics are actually being scraped?
+
+After you’ve deployed all of your resources to Kubernetes, make sure that the
+Target Allocator is discovering scrape targets from your
+[`ServiceMonitor`](https://prometheus-operator.dev/docs/operator/design/#servicemonitor)(s)
+or
+[`PodMonitor`](https://prometheus-operator.dev/docs/user-guides/getting-started/#using-podmonitors)(s).
+
+Suppose that you have this `ServiceMonitor` definition:
+
+```yaml
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: sm-example
+ namespace: opentelemetry
+ labels:
+ app.kubernetes.io/name: py-prometheus-app
+ release: prometheus
+spec:
+ selector:
+ matchLabels:
+ app: my-app
+ namespaceSelector:
+ matchNames:
+ - opentelemetry
+ endpoints:
+ - port: prom
+ path: /metrics
+ - port: py-client-port
+ interval: 15s
+ - port: py-server-port
+```
+
+this `Service` definition:
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+ name: py-prometheus-app
+ namespace: opentelemetry
+ labels:
+ app: my-app
+ app.kubernetes.io/name: py-prometheus-app
+spec:
+ selector:
+ app: my-app
+ app.kubernetes.io/name: py-prometheus-app
+ ports:
+ - name: prom
+ port: 8080
+```
+
+and this `OpenTelemetryCollector` definition:
+
+```yaml
+apiVersion: opentelemetry.io/v1beta1
+kind: OpenTelemetryCollector
+metadata:
+ name: otelcol
+ namespace: opentelemetry
+spec:
+ mode: statefulset
+ targetAllocator:
+ enabled: true
+ serviceAccount: opentelemetry-targetallocator-sa
+ prometheusCR:
+ enabled: true
+ podMonitorSelector: {}
+ serviceMonitorSelector: {}
+ config:
+ receivers:
+ otlp:
+ protocols:
+ grpc: {}
+ http: {}
+ prometheus:
+ config:
+ scrape_configs:
+ - job_name: 'otel-collector'
+ scrape_interval: 10s
+ static_configs:
+ - targets: ['0.0.0.0:8888']
+
+ processors:
+ batch: {}
+
+ exporters:
+ logging:
+ verbosity: detailed
+
+ service:
+ pipelines:
+ traces:
+ receivers: [otlp]
+ processors: [batch]
+ exporters: [logging]
+ metrics:
+ receivers: [otlp, prometheus]
+ processors: []
+ exporters: [logging]
+ logs:
+ receivers: [otlp]
+ processors: [batch]
+ exporters: [logging]
+```
+
+First, set up a `port-forward` in Kubernetes, so that you can expose the Target
+Allocator service:
+
+```shell
+kubectl port-forward svc/otelcol-targetallocator -n opentelemetry 8080:80
+```
+
+Where `otelcol-targetallocator` is the value of `metadata.name` in your
+`OpenTelemetryCollector` CR concatenated with the `-targetallocator` suffix, and
+`opentelemetry` is the namespace to which the `OpenTelemetryCollector` CR is
+deployed.
+
+{{% alert title="Tip" %}}
+
+You can also get the service name by running
+
+```shell
+kubectl get svc -l app.kubernetes.io/component=opentelemetry-targetallocator -n
+```
+
+{{% /alert %}}
+
+Next, get a list of jobs registered with the Target Allocator:
+
+```shell
+curl localhost:8080/jobs | jq
+```
+
+Your sample output should look like this:
+
+```json
+{
+ "serviceMonitor/opentelemetry/sm-example/1": {
+ "_link": "/jobs/serviceMonitor%2Fopentelemetry%2Fsm-example%2F1/targets"
+ },
+ "serviceMonitor/opentelemetry/sm-example/2": {
+ "_link": "/jobs/serviceMonitor%2Fopentelemetry%2Fsm-example%2F2/targets"
+ },
+ "otel-collector": {
+ "_link": "/jobs/otel-collector/targets"
+ },
+ "serviceMonitor/opentelemetry/sm-example/0": {
+ "_link": "/jobs/serviceMonitor%2Fopentelemetry%2Fsm-example%2F0/targets"
+ },
+ "podMonitor/opentelemetry/pm-example/0": {
+ "_link": "/jobs/podMonitor%2Fopentelemetry%2Fpm-example%2F0/targets"
+ }
+}
+```
+
+Where `serviceMonitor/opentelemetry/sm-example/0` represents one of the
+`Service` ports that the `ServiceMonitor`picked up:
+
+- `opentelemetry` is the namespace in which the `ServiceMonitor` resource
+ resides.
+- `sm-example` is the name of the `ServiceMonitor`.
+- `0` is one of the port endpoints matched between the `ServiceMonitor` and the
+ `Service`.
+
+Similarly, the `PodMonitor`, shows up as `podMonitor/opentelemetry/pm-example/0`
+in the `curl` output.
+
+This is good news, because it tells us that the scrape config discovery is
+working!
+
+You might also be wondering about the `otel-collector` entry. This is happening
+because `spec.config.receivers.prometheusReceiver` in the
+`OpenTelemetryCollector` resource (named `otel-collector`) has self-scrape
+enabled:
+
+```yaml
+prometheus:
+ config:
+ scrape_configs:
+ - job_name: 'otel-collector'
+ scrape_interval: 10s
+ static_configs:
+ - targets: ['0.0.0.0:8888']
+```
+
+We can take a deeper look into `serviceMonitor/opentelemetry/sm-example/0`, to
+see what scrape targets are getting picked up by running `curl` against the
+value of the `_link` output above:
+
+```shell
+curl localhost:8080/jobs/serviceMonitor%2Fopentelemetry%2Fsm-example%2F0/targets | jq
+```
+
+Sample output:
+
+```json
+{
+ "otelcol-collector-0": {
+ "_link": "/jobs/serviceMonitor%2Fopentelemetry%2Fsm-example%2F0/targets?collector_id=otelcol-collector-0",
+ "targets": [
+ {
+ "targets": ["10.244.0.11:8080"],
+ "labels": {
+ "__meta_kubernetes_endpointslice_port_name": "prom",
+ "__meta_kubernetes_pod_labelpresent_app_kubernetes_io_name": "true",
+ "__meta_kubernetes_endpointslice_port_protocol": "TCP",
+ "__meta_kubernetes_endpointslice_address_target_name": "py-prometheus-app-575cfdd46-nfttj",
+ "__meta_kubernetes_endpointslice_annotation_endpoints_kubernetes_io_last_change_trigger_time": "2024-06-21T20:01:37Z",
+ "__meta_kubernetes_endpointslice_labelpresent_app_kubernetes_io_name": "true",
+ "__meta_kubernetes_pod_name": "py-prometheus-app-575cfdd46-nfttj",
+ "__meta_kubernetes_pod_controller_name": "py-prometheus-app-575cfdd46",
+ "__meta_kubernetes_pod_label_app_kubernetes_io_name": "py-prometheus-app",
+ "__meta_kubernetes_endpointslice_address_target_kind": "Pod",
+ "__meta_kubernetes_pod_node_name": "otel-target-allocator-talk-control-plane",
+ "__meta_kubernetes_pod_labelpresent_pod_template_hash": "true",
+ "__meta_kubernetes_endpointslice_label_kubernetes_io_service_name": "py-prometheus-app",
+ "__meta_kubernetes_endpointslice_annotationpresent_endpoints_kubernetes_io_last_change_trigger_time": "true",
+ "__meta_kubernetes_service_name": "py-prometheus-app",
+ "__meta_kubernetes_pod_ready": "true",
+ "__meta_kubernetes_pod_labelpresent_app": "true",
+ "__meta_kubernetes_pod_controller_kind": "ReplicaSet",
+ "__meta_kubernetes_endpointslice_labelpresent_app": "true",
+ "__meta_kubernetes_pod_container_image": "otel-target-allocator-talk:0.1.0-py-prometheus-app",
+ "__address__": "10.244.0.11:8080",
+ "__meta_kubernetes_service_label_app_kubernetes_io_name": "py-prometheus-app",
+ "__meta_kubernetes_pod_uid": "495d47ee-9a0e-49df-9b41-fe9e6f70090b",
+ "__meta_kubernetes_endpointslice_port": "8080",
+ "__meta_kubernetes_endpointslice_label_endpointslice_kubernetes_io_managed_by": "endpointslice-controller.k8s.io",
+ "__meta_kubernetes_endpointslice_label_app": "my-app",
+ "__meta_kubernetes_service_labelpresent_app_kubernetes_io_name": "true",
+ "__meta_kubernetes_pod_host_ip": "172.24.0.2",
+ "__meta_kubernetes_namespace": "opentelemetry",
+ "__meta_kubernetes_endpointslice_endpoint_conditions_serving": "true",
+ "__meta_kubernetes_endpointslice_labelpresent_kubernetes_io_service_name": "true",
+ "__meta_kubernetes_endpointslice_endpoint_conditions_ready": "true",
+ "__meta_kubernetes_service_annotation_kubectl_kubernetes_io_last_applied_configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"annotations\":{},\"labels\":{\"app\":\"my-app\",\"app.kubernetes.io/name\":\"py-prometheus-app\"},\"name\":\"py-prometheus-app\",\"namespace\":\"opentelemetry\"},\"spec\":{\"ports\":[{\"name\":\"prom\",\"port\":8080}],\"selector\":{\"app\":\"my-app\",\"app.kubernetes.io/name\":\"py-prometheus-app\"}}}\n",
+ "__meta_kubernetes_endpointslice_endpoint_conditions_terminating": "false",
+ "__meta_kubernetes_pod_container_port_protocol": "TCP",
+ "__meta_kubernetes_pod_phase": "Running",
+ "__meta_kubernetes_pod_container_name": "my-app",
+ "__meta_kubernetes_pod_container_port_name": "prom",
+ "__meta_kubernetes_pod_ip": "10.244.0.11",
+ "__meta_kubernetes_service_annotationpresent_kubectl_kubernetes_io_last_applied_configuration": "true",
+ "__meta_kubernetes_service_labelpresent_app": "true",
+ "__meta_kubernetes_endpointslice_address_type": "IPv4",
+ "__meta_kubernetes_service_label_app": "my-app",
+ "__meta_kubernetes_pod_label_app": "my-app",
+ "__meta_kubernetes_pod_container_port_number": "8080",
+ "__meta_kubernetes_endpointslice_name": "py-prometheus-app-bwbvn",
+ "__meta_kubernetes_pod_label_pod_template_hash": "575cfdd46",
+ "__meta_kubernetes_endpointslice_endpoint_node_name": "otel-target-allocator-talk-control-plane",
+ "__meta_kubernetes_endpointslice_labelpresent_endpointslice_kubernetes_io_managed_by": "true",
+ "__meta_kubernetes_endpointslice_label_app_kubernetes_io_name": "py-prometheus-app"
+ }
+ }
+ ]
+ }
+}
+```
+
+The query parameter `collector_id` in the `_link` field of the above output
+states that these are the targets pertain to `otelcol-collector-0` (the name of
+the `StatefulSet` created for the `OpenTelemetryCollector` resource).
+
+{{% alert title="Note" %}}
+
+See the
+[Target Allocator readme](https://github.com/open-telemetry/opentelemetry-operator/blob/main/cmd/otel-allocator/README.md?plain=1#L128-L134)
+for more information on the `/jobs` endpoint.
+
+{{% /alert %}}
+
+### Is the Target Allocator enabled? Is Prometheus service discovery enabled?
+
+If the `curl` commands above don’t show a list of expected `ServiceMonitor`s and
+`PodMonitor`s, you need to check whether the features that populate those values
+are turned on.
+
+One thing to remember is that just because you include the `targetAllocator`
+section in the `OpenTelemetryCollector` CR doesn’t mean that it’s enabled. You
+need to explicitly enable it. Furthermore, if you want to use
+[Prometheus service discovery](https://github.com/open-telemetry/opentelemetry-operator/blob/main/cmd/otel-allocator/README.md#discovery-of-prometheus-custom-resources),
+you must explicitly enable it:
+
+- Set `spec.targetAllocator.enabled` to `true`
+- Set `spec.targetAllocator.prometheusCR.enabled` to `true`
+
+So that your `OpenTelemetryCollector` resource looks like this:
+
+```yaml
+apiVersion: opentelemetry.io/v1beta1
+kind: OpenTelemetryCollector
+metadata:
+ name: otelcol
+ namespace: opentelemetry
+spec:
+ mode: statefulset
+ targetAllocator:
+ enabled: true
+ serviceAccount: opentelemetry-targetallocator-sa
+ prometheusCR:
+ enabled: true
+```
+
+See the full `OpenTelemetryCollector`
+[resource definition in "Do you know if metrics are actually being scraped?"](#do-you-know-if-metrics-are-actually-beingscraped).
+
+### Did you configure a ServiceMonitor (or PodMonitor) selector?
+
+If you configured a
+[`ServiceMonitor`](https://observability.thomasriley.co.uk/prometheus/configuring-prometheus/using-service-monitors/#:~:text=The%20ServiceMonitor%20is%20used%20to,build%20the%20required%20Prometheus%20configuration.)
+selector, it means that the Target Allocator only looks for `ServiceMonitors`
+having a `metadata.label` that matches the value in
+[`serviceMonitorSelector`](https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#opentelemetrycollectorspectargetallocatorprometheuscr-1).
+
+Suppose that you configured a
+[`serviceMonitorSelector`](https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#opentelemetrycollectorspectargetallocatorprometheuscr-1)
+for your Target Allocator, like in the following example:
+
+```yaml
+apiVersion: opentelemetry.io/v1beta1
+kind: OpenTelemetryCollector
+metadata:
+ name: otelcol
+ namespace: opentelemetry
+spec:
+ mode: statefulset
+ targetAllocator:
+ enabled: true
+ serviceAccount: opentelemetry-targetallocator-sa
+ prometheusCR:
+ enabled: true
+ serviceMonitorSelector:
+ matchLabels:
+ app: my-app
+```
+
+By setting the value of
+`spec.targetAllocator.prometheusCR.serviceMonitorSelector.matchLabels` to
+`app: my-app`, it means that your `ServiceMonitor` resource must in turn have
+that same value in `metadata.labels`:
+
+```yaml
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: sm-example
+ labels:
+ app: my-app
+ release: prometheus
+spec:
+```
+
+See the full `ServiceMonitor`
+[resource definition in "Do you know if metrics are actually being scraped?"](#do-you-know-if-metrics-are-actually-beingscraped).
+
+In this case, the `OpenTelemetryCollector` resource's
+`prometheusCR.serviceMonitorSelector.matchLabels` is looking only for
+`ServiceMonitors` having the label `app: my-app`, which we see in the previous
+example.
+
+If your `ServiceMonitor` resource is missing that label, then the Target
+Allocator will fail to discover scrape targets from that `ServiceMonitor`.
+
+{{% alert title="Tip" %}}
+
+The same applies if you’re using a
+[PodMonitor](https://prometheus-operator.dev/docs/user-guides/getting-started/#using-podmonitors).
+In that case, you would use a
+[`podMonitorSelector`](https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#opentelemetrycollectorspectargetallocatorprometheuscr)
+instead of a `serviceMonitorSelector`.
+
+{{% /alert %}}
+
+### Did you leave out the serviceMonitorSelector and/or podMonitorSelector configuration altogether?
+
+As mentioned in
+["Did you configure a ServiceMonitor or PodMonitor selector"](#did-you-configure-a-servicemonitor-or-podmonitor-selector),
+setting mismatched values for `serviceMonitorSelector` and `podMonitorSelector`
+results in the Target Allocator failing to discover scrape targets from your
+`ServiceMonitors` and `PodMonitors`, respectively.
+
+Similarly, in
+[`v1beta1`](https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#opentelemetrycollector-1)
+of the `OpenTelemetryCollector` CR, leaving out this configuration altogether
+also results in the Target Allocator failing to discover scrape targets from
+your `ServiceMonitors` and `PodMonitors`.
+
+As of `v1beta1` of the `OpenTelemetryOperator`, a `serviceMonitorSelector` and
+`podMonitorSelector` must be included, even if you don’t intend to use it, like
+this:
+
+```yaml
+prometheusCR:
+ enabled: true
+ podMonitorSelector: {}
+ serviceMonitorSelector: {}
+```
+
+This configuration means that it will match on all `PodMonitor` and
+`ServiceMonitor` resources. See the
+[full OpenTelemetryCollector definition in "Do you know if metrics are actually being scraped?"](#do-you-know-if-metrics-are-actually-beingscraped).
+
+### Do your labels, namespaces, and ports match for your ServiceMonitor and your Service (or PodMonitor and your Pod)?
+
+The `ServiceMonitor` is configured to pick up Kubernetes
+[Services](https://kubernetes.io/docs/concepts/services-networking/service/)
+that match on:
+
+- Labels
+- Namespaces (optional)
+- Ports (endpoints)
+
+Suppose that you have this `ServiceMonitor`:
+
+```yaml
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: sm-example
+ labels:
+ app: my-app
+ release: prometheus
+spec:
+ selector:
+ matchLabels:
+ app: my-app
+ namespaceSelector:
+ matchNames:
+ - opentelemetry
+ endpoints:
+ - port: prom
+ path: /metrics
+ - port: py-client-port
+ interval: 15s
+ - port: py-server-port
+```
+
+The previous `ServiceMonitor` is looking for any services that have:
+
+- the label `app: my-app`
+- reside in a namespace called `opentelemetry`
+- a port named `prom`, `py-client-port`, _or_ `py-server-port`
+
+For example, the following `Service` resource would get picked up by the
+`ServiceMonitor`, because it matches the previous criteria:
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+ name: py-prometheus-app
+ namespace: opentelemetry
+ labels:
+ app: my-app
+ app.kubernetes.io/name: py-prometheus-app
+spec:
+ selector:
+ app: my-app
+ app.kubernetes.io/name: py-prometheus-app
+ ports:
+ - name: prom
+ port: 8080
+```
+
+The following `Service` resource would not be picked up, because the
+`ServiceMonitor` is looking for ports named `prom`, `py-client-port`, _or_
+`py-server-port`, and this service’s port is called `bleh`.
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+ name: py-prometheus-app
+ namespace: opentelemetry
+ labels:
+ app: my-app
+ app.kubernetes.io/name: py-prometheus-app
+spec:
+ selector:
+ app: my-app
+ app.kubernetes.io/name: py-prometheus-app
+ ports:
+ - name: bleh
+ port: 8080
+```
+
+{{% alert title="Tip" %}}
+
+If you’re using `PodMonitor`, the same applies, except that it picks up
+Kubernetes pods that match on labels, namespaces, and named ports.
+
+{{% /alert %}}
diff --git a/content/en/docs/languages/go/exporters.md b/content/en/docs/languages/go/exporters.md
index 954b371fc866..3427285a88b8 100644
--- a/content/en/docs/languages/go/exporters.md
+++ b/content/en/docs/languages/go/exporters.md
@@ -76,9 +76,6 @@ To send trace data to an OTLP endpoint (like the [collector](/docs/collector) or
Jaeger >= v1.35.0) you'll want to configure an OTLP exporter that sends to your
endpoint.
-To learn more on how to use the OTLP HTTP exporter, try the
-[otel-collector example](https://github.com/open-telemetry/opentelemetry-go/tree/main/example/otel-collector)
-
### OTLP traces over HTTP
[`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`](https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp)
diff --git a/content/en/docs/languages/java/_index.md b/content/en/docs/languages/java/_index.md
index 76d1aad34287..256928289626 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.4.0
+ instrumentation: 2.5.0
otel: 1.39.0
semconv: 1.25.0
weight: 18
diff --git a/content/en/docs/languages/java/configuration.md b/content/en/docs/languages/java/configuration.md
index ebdce4905c51..2e068ca73d65 100644
--- a/content/en/docs/languages/java/configuration.md
+++ b/content/en/docs/languages/java/configuration.md
@@ -180,8 +180,8 @@ exporters.
| System property | Description | Default |
| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- |
| `otel.{signal}.exporter` | Select the OpenTelemetry exporter for {signal}. | otlp |
-| `otel.exporter.otlp.endpoint` | The OTLP traces, metrics, and logs endpoint to connect to. Must be a URL with a scheme of either `http` or `https` based on the use of TLS. If protocol is `http/protobuf` the version and signal will be appended to the path (e.g. `v1/traces`, `v1/metrics`, or `v1/logs`). | `http://localhost:4317` when protocol is `grpc`, and `http://localhost:4318/v1/{signal}` when protocol is `http/protobuf`. |
-| `otel.exporter.otlp.{signal}.endpoint` | The OTLP {signal} endpoint to connect to. Must be a URL with a scheme of either `http` or `https` based on the use of TLS. | `http://localhost:4317` when protocol is `grpc`, and `http://localhost:4318/v1/{signal}` when protocol is `http/protobuf`. |
+| `otel.exporter.otlp.endpoint` | The endpoint to send all OTLP traces, metrics, and logs to. Often the address of an OpenTelemetry Collector. Must be a URL with a scheme of either `http` or `https` based on the use of TLS. If protocol is `http/protobuf` the version and signal will be appended to the path (e.g. `v1/traces`, `v1/metrics`, or `v1/logs`). | `http://localhost:4317` when protocol is `grpc`, and `http://localhost:4318/v1/{signal}` when protocol is `http/protobuf`. |
+| `otel.exporter.otlp.{signal}.endpoint` | The endpoint to send OTLP {signal} to. Often the address of an OpenTelemetry Collector. Must be a URL with a scheme of either `http` or `https` based on the use of TLS. | `http://localhost:4317` when protocol is `grpc`, and `http://localhost:4318/v1/{signal}` when protocol is `http/protobuf`. |
| `otel.exporter.otlp.certificate` | The path to the file containing trusted certificates to use when verifying an OTLP trace, metric, or log server's TLS credentials. The file should contain one or more X.509 certificates in PEM format. | The host platform's trusted root certificates are used. |
| `otel.exporter.otlp.{signal}.certificate` | The path to the file containing trusted certificates to use when verifying an OTLP {signal} server's TLS credentials. The file should contain one or more X.509 certificates in PEM format. | The host platform's trusted root certificates are used |
| `otel.exporter.otlp.client.key` | The path to the file containing private client key to use when verifying an OTLP trace, metric, or log client's TLS credentials. The file should contain one private key PKCS8 PEM format. | No client key file is used. |
@@ -197,7 +197,7 @@ exporters.
| `otel.exporter.otlp.protocol` | The transport protocol to use on OTLP trace, metric, and log requests. Options include `grpc` and `http/protobuf`. | `grpc` [^2] |
| `otel.exporter.otlp.{signal}.protocol` | The transport protocol to use on OTLP {signal} requests. Options include `grpc` and `http/protobuf`. | `grpc` [^2] |
| `otel.exporter.otlp.metrics.temporality.preference` | The preferred output aggregation temporality. Options include `DELTA`, `LOWMEMORY`, and `CUMULATIVE`. If `CUMULATIVE`, all instruments will have cumulative temporality. If `DELTA`, counter (sync and async) and histograms will be delta, up down counters (sync and async) will be cumulative. If `LOWMEMORY`, sync counter and histograms will be delta, async counter and up down counters (sync and async) will be cumulative. | `CUMULATIVE` |
-| `otel.exporter.otlp.metrics.default.histogram.aggregation` | The preferred default histogram aggregation. Options include `BASE2.EXPONENTIAL.BUCKET.HISTOGRAM` and `EXPLICIT.BUCKET.HISTOGRAM`. | `EXPLICIT.BUCKET.HISTOGRAM` |
+| `otel.exporter.otlp.metrics.default.histogram.aggregation` | The preferred default histogram aggregation. Options include `BASE2_EXPONENTIAL_BUCKET_HISTOGRAM` and `EXPLICIT_BUCKET_HISTOGRAM`. | `EXPLICIT_BUCKET_HISTOGRAM` |
| `otel.experimental.exporter.otlp.retry.enabled` | If `true`, enable [experimental retry support](#otlp-exporter-retry). | `false` |
[^2]: OpenTelemetry Java agent 2.x uses `http/protobuf` by default.
diff --git a/content/en/docs/languages/java/instrumentation.md b/content/en/docs/languages/java/instrumentation.md
index 146f5e474c7e..7050d917311e 100644
--- a/content/en/docs/languages/java/instrumentation.md
+++ b/content/en/docs/languages/java/instrumentation.md
@@ -571,7 +571,7 @@ If you followed the instructions to [initialize the SDK](#initialize-the-sdk)
above, you have a `TracerProvider` setup for you already. You can continue with
[acquiring a tracer](#acquiring-a-tracer).
-### Acquiring a Tracer
+### Acquiring a tracer
To do [Tracing](/docs/concepts/signals/traces/) you'll need to acquire a
[`Tracer`](/docs/concepts/signals/traces/#tracer).
@@ -676,6 +676,53 @@ Tracer tracer = GlobalOpenTelemetry.getTracer("instrumentation-scope-name", "ins
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,
@@ -1194,7 +1241,7 @@ OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.build();
```
-### Acquiring a Meter
+### Acquiring a meter
Anywhere in your application where you have manually instrumented code you can
call `opentelemetry.meterBuilder(instrumentationScopeName)` to get or create a
@@ -1216,6 +1263,55 @@ 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");
+ }
+}
+```
+
+a
+
### Using Counters
Counters can be used to measure non-negative, increasing values.
@@ -1857,3 +1953,5 @@ io.opentelemetry.sdk.trace.export.BatchSpanProcessor = io.opentelemetry.extensio
https://github.com/open-telemetry/opentelemetry-java/blob/main/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/ParentBasedSampler.java
[traceidratiobased]:
https://github.com/open-telemetry/opentelemetry-java/blob/main/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/samplers/TraceIdRatioBasedSampler.java
+[Java agent]: /docs/zero-code/java/agent/
+[Spring Boot starter]: /docs/zero-code/java/spring-boot-starter/
diff --git a/content/en/docs/languages/js/propagation.md b/content/en/docs/languages/js/propagation.md
index bca4b04b4ef7..ac27c08351a3 100644
--- a/content/en/docs/languages/js/propagation.md
+++ b/content/en/docs/languages/js/propagation.md
@@ -2,51 +2,258 @@
title: Propagation
description: Context propagation for the JS SDK
weight: 65
+cSpell:ignore: rolldice
---
-Propagation is the mechanism that moves data between services and processes.
-Although not limited to tracing, it is what allows traces to build causal
-information about a system across services that are arbitrarily distributed
-across process and network boundaries.
+{{% docs/languages/propagation js %}}
-## Context propagation with libraries
+## Automatic context propagations
-For the vast majority of use cases, context propagation is done with
-instrumentation libraries.
+[Instrumentation libraries](../libraries/) like
+[`@opentelemetry/instrumentation-http`](https://www.npmjs.com/package/@opentelemetry/instrumentation-http)
+or
+[`@opentelemetry/instrumentation-express`](https://www.npmjs.com/package/@opentelemetry/instrumentation-http)
+propagate context across services for you.
-For example, if you have several Node.js services that communicate over HTTP,
-you can use the
-[`express`](https://www.npmjs.com/package/@opentelemetry/instrumentation-express)
-and [`http`](https://www.npmjs.com/package/@opentelemetry/instrumentation-http)
-instrumentation libraries to automatically propagate trace context across
-services for you.
+If you followed the [Getting Started Guide](../getting-started/nodejs) you can
+create a client application that queries the `/rolldice` endpoint.
-**It is highly recommend that you use instrumentation libraries to propagate
-context.** Although it is possible to propagate context manually, if your system
-uses libraries to communicate between services, use a matching instrumentation
-library to propagate context.
+{{% alert title="Note" %}}
-Refer to [Libraries](/docs/languages/js/libraries) to learn more about
-instrumentation libraries and how to use them.
+You can combine this example with the sample application from the Getting
+Started guide of any other language as well. Correlation works across
+applications written in different languages without any differences.
-## Manual W3C Trace Context Propagation
+{{% /alert %}}
-In some cases, it is not possible to propagate context with an instrumentation
-library. There may not be an instrumentation library that matches a library
-you're using to have services communicate with one another. Or you many have
-requirements that instrumentation libraries cannot fulfill, even if they exist.
+Start by creating a new folder called `dice-client` and install the required
+dependencies:
+
+{{< tabpane text=true >}} {{% tab TypeScript %}}
+
+```sh
+npm init -y
+npm install typescript \
+ ts-node \
+ @types/node \
+ undici \
+ @opentelemetry/instrumentation-undici \
+ @opentelemetry/sdk-node
+
+# initialize typescript
+npx tsc --init
+```
+
+{{% /tab %}} {{% tab JavaScript %}}
+
+```sh
+npm init -y
+npm install undici \
+ @opentelemetry/instrumentation-undici \
+ @opentelemetry/sdk-node
+```
+
+{{% /tab %}} {{< /tabpane >}}
+
+Next, create a new file called `client.ts` (or client.js) with the following
+content:
+
+{{< tabpane text=true >}} {{% tab TypeScript %}}
+
+```ts
+import { NodeSDK } from '@opentelemetry/sdk-node';
+import {
+ SimpleSpanProcessor,
+ ConsoleSpanExporter,
+} from '@opentelemetry/sdk-trace-node';
+import { UndiciInstrumentation } from '@opentelemetry/instrumentation-undici';
+
+const sdk = new NodeSDK({
+ spanProcessors: [new SimpleSpanProcessor(new ConsoleSpanExporter())],
+ instrumentations: [new UndiciInstrumentation()],
+});
+sdk.start();
+
+import { request } from 'undici';
+
+request('http://localhost:8080/rolldice').then((response) => {
+ response.body.json().then((json: any) => console.log(json));
+});
+```
+
+{{% /tab %}} {{% tab JavaScript %}}
+
+```js
+const { NodeSDK } = require('@opentelemetry/sdk-node');
+const {
+ SimpleSpanProcessor,
+ ConsoleSpanExporter,
+} = require('@opentelemetry/sdk-trace-node');
+const {
+ UndiciInstrumentation,
+} = require('@opentelemetry/instrumentation-undici');
+
+const sdk = new NodeSDK({
+ spanProcessors: [new SimpleSpanProcessor(new ConsoleSpanExporter())],
+ instrumentations: [new UndiciInstrumentation()],
+});
+sdk.start();
+
+const { request } = require('undici');
+
+request('http://localhost:8080/rolldice').then((response) => {
+ response.body.json().then((json) => console.log(json));
+});
+```
+
+{{% /tab %}} {{% /tabpane %}}
+
+Make sure that you have the instrumented version of `app.ts` (or `app.js`) from
+the [Getting Started](../getting-started/nodejs) running in one shell:
+
+{{< tabpane text=true >}} {{% tab TypeScript %}}
+
+```console
+$ npx ts-node --require ./instrumentation.ts app.ts
+Listening for requests on http://localhost:8080
+```
+
+{{% /tab %}} {{% tab JavaScript %}}
+
+```console
+$ node --require ./instrumentation.js app.js
+Listening for requests on http://localhost:8080
+```
+
+{{% /tab %}} {{< /tabpane >}}
+
+Start a second shell and run the `client.ts` (or `client.js`):
+
+{{< tabpane text=true >}} {{% tab TypeScript %}}
+
+```shell
+npx ts-node client.ts
+```
+
+{{% /tab %}} {{% tab JavaScript %}}
+
+```shell
+node client.js
+```
+
+{{% /tab %}} {{< /tabpane >}}
+
+Both shells should emit span details to the console. The client output looks
+similar to the following:
+
+```javascript {hl_lines=[7,11]}
+{
+ resource: {
+ attributes: {
+ // ...
+ }
+ },
+ traceId: 'cccd19c3a2d10e589f01bfe2dc896dc2',
+ parentId: undefined,
+ traceState: undefined,
+ name: 'GET',
+ id: '6f64ce484217a7bf',
+ kind: 2,
+ timestamp: 1718875320295000,
+ duration: 19836.833,
+ attributes: {
+ 'url.full': 'http://localhost:8080/rolldice',
+ // ...
+ },
+ status: { code: 0 },
+ events: [],
+ links: []
+}
+```
+
+Take note of the traceId (`cccd19c3a2d10e589f01bfe2dc896dc2`) and ID
+(`6f64ce484217a7bf`). Both can be found in the output of client as well:
+
+```javascript {hl_lines=["6-7"]}
+{
+ resource: {
+ attributes: {
+ // ...
+ },
+ traceId: 'cccd19c3a2d10e589f01bfe2dc896dc2',
+ parentId: '6f64ce484217a7bf',
+ traceState: undefined,
+ name: 'GET /rolldice',
+ id: '027c5c8b916d29da',
+ kind: 1,
+ timestamp: 1718875320310000,
+ duration: 3894.792,
+ attributes: {
+ 'http.url': 'http://localhost:8080/rolldice',
+ // ...
+ },
+ status: { code: 0 },
+ events: [],
+ links: []
+}
+```
+
+Your client and server application successfully report connected spans. If you
+send both to a backend now the visualization will show this dependency for you.
+
+## Manual context propagation
+
+In some cases, it is not possible to propagate context automatically as outlined
+in the previous section. There might not be an instrumentation library that
+matches a library you're using to have services communicate with one another. Or
+you might have requirements that these libraries can't fulfill even if they
+existed.
When you must propagate context manually, you can use the
[context API](/docs/languages/js/context).
+### Generic example
+
The following generic example demonstrates how you can propagate trace context
manually.
First, on the sending service, you'll need to inject the current `context`:
+{{< tabpane text=true >}} {{% tab TypeScript %}}
+
+```typescript
+// Sending service
+import { Context, propagation, trace } from '@opentelemetry/api';
+
+// Define an interface for the output object that will hold the trace information.
+interface Carrier {
+ traceparent?: string;
+ tracestate?: string;
+}
+
+// Create an output object that conforms to that interface.
+const output: Carrier = {};
+
+// Serialize the traceparent and tracestate from context into
+// an output object.
+//
+// This example uses the active trace context, but you can
+// use whatever context is appropriate to your scenario.
+propagation.inject(context.active(), output);
+
+// Extract the traceparent and tracestate values from the output object.
+const { traceparent, tracestate } = output;
+
+// You can then pass the traceparent and tracestate
+// data to whatever mechanism you use to propagate
+// across services.
+```
+
+{{% /tab %}} {{% tab JavaScript %}}
+
```js
// Sending service
-import { context, propagation, trace } from '@opentelemetry/api';
+const { context, propagation } = require('@opentelemetry/api');
const output = {};
// Serialize the traceparent and tracestate from context into
@@ -62,9 +269,48 @@ const { traceparent, tracestate } = output;
// across services.
```
+{{% /tab %}} {{< /tabpane >}}
+
On the receiving service, you'll need to extract `context` (for example, from
parsed HTTP headers) and then set them as the current trace context.
+{{< tabpane text=true >}} {{% tab TypeScript %}}
+
+```typescript
+// Receiving service
+import { Context, propagation, trace, Span } from '@opentelemetry/api';
+
+// Define an interface for the input object that includes 'traceparent' & 'tracestate'.
+interface Carrier {
+ traceparent?: string;
+ tracestate?: string;
+}
+
+// Assume "input" is an object with 'traceparent' & 'tracestate' keys.
+const input: Carrier = {};
+
+// Extracts the 'traceparent' and 'tracestate' data into a context object.
+//
+// You can then treat this context as the active context for your
+// traces.
+let activeContext: Context = propagation.extract(context.active(), input);
+
+let tracer = trace.getTracer('app-name');
+
+let span: Span = tracer.startSpan(
+ spanName,
+ {
+ attributes: {},
+ },
+ activeContext,
+);
+
+// Set the created span as active in the deserialized context.
+trace.setSpan(activeContext, span);
+```
+
+{{% /tab %}} {{% tab JavaScript %}}
+
```js
// Receiving service
import { context, propagation, trace } from '@opentelemetry/api';
@@ -92,8 +338,208 @@ let span = tracer.startSpan(
trace.setSpan(activeContext, span);
```
+{{% /tab %}} {{< /tabpane >}}
+
From there, when you have a deserialized active context, you can create spans
that will be a part of the same trace from the other service.
You can also use the [Context](/docs/languages/js/context) API to modify or set
the deserialized context in other ways.
+
+### Custom protocol example
+
+A common use case for when you need to propagate context manually is when you
+use a custom protocol between services for communication. The following example
+uses a basic text-based TCP protocol to send a serialized object from one
+service to another.
+
+Start with creating a new folder called `propagation-example` and initialize it
+with dependencies as follows:
+
+```shell
+npm init -y
+npm install @opentelemetry/api @opentelemetry/sdk-node
+```
+
+Next create files `client.js` and `server.js` with the following content:
+
+```javascript
+// client.js
+const net = require('net');
+const { context, propagation, trace } = require('@opentelemetry/api');
+
+let tracer = trace.getTracer('client');
+
+// Connect to the server
+const client = net.createConnection({ port: 8124 }, () => {
+ // Send the serialized object to the server
+ let span = tracer.startActiveSpan('send', { kind: 1 }, (span) => {
+ const output = {};
+ propagation.inject(context.active(), output);
+ const { traceparent, tracestate } = output;
+
+ const objToSend = { key: 'value' };
+
+ if (traceparent) {
+ objToSend._meta = { traceparent, tracestate };
+ }
+
+ client.write(JSON.stringify(objToSend), () => {
+ client.end();
+ span.end();
+ });
+ });
+});
+```
+
+```javascript
+// server.js
+const net = require('net');
+const { context, propagation, trace } = require('@opentelemetry/api');
+
+let tracer = trace.getTracer('server');
+
+const server = net.createServer((socket) => {
+ socket.on('data', (data) => {
+ const message = data.toString();
+ // Parse the JSON object received from the client
+ try {
+ const json = JSON.parse(message);
+ let activeContext = context.active();
+ if (json._meta) {
+ activeContext = propagation.extract(context.active(), json._meta);
+ delete json._meta;
+ }
+ span = tracer.startSpan('receive', { kind: 1 }, activeContext);
+ trace.setSpan(activeContext, span);
+ console.log('Parsed JSON:', json);
+ } catch (e) {
+ console.error('Error parsing JSON:', e.message);
+ } finally {
+ span.end();
+ }
+ });
+});
+
+// Listen on port 8124
+server.listen(8124, () => {
+ console.log('Server listening on port 8124');
+});
+```
+
+Start a first shell to run the server:
+
+```console
+$ node server.js
+Server listening on port 8124
+```
+
+Then in a second shell run the client:
+
+```shell
+node client.js
+```
+
+The client should terminate immediately and the server should output the
+following:
+
+```text
+Parsed JSON: { key: 'value' }
+```
+
+Since the example so far only took dependency on the OpenTelemetry API all calls
+to it are [no-op instructions]() and
+the client and server behave as if OpenTelemetry is not used.
+
+{{% alert title="Note" color="warning" %}}
+
+This is especially important if your server and client code are libraries, since
+they should only use the OpenTelemetry API. To understand why, read the [concept
+page on how to add instrumentation to your library]((/docs/concepts/instrumentation/libraries/).
+
+{{% /alert %}}
+
+To enable OpenTelemetry and see the context propagation in action, create an
+additional file called `instrumentation.js` with the following content:
+
+```javascript
+// instrumentation.js
+const { NodeSDK } = require('@opentelemetry/sdk-node');
+const {
+ ConsoleSpanExporter,
+ SimpleSpanProcessor,
+} = require('@opentelemetry/sdk-trace-node');
+
+const sdk = new NodeSDK({
+ spanProcessors: [new SimpleSpanProcessor(new ConsoleSpanExporter())],
+});
+
+sdk.start();
+```
+
+Use this file to run both, the server and the client, with instrumentation
+enabled:
+
+```console
+$ node -r ./instrumentation.js server.js
+Server listening on port 8124
+```
+
+and
+
+```shell
+node -r ./instrumentation client.js
+```
+
+After the client has sent data to the server and terminated you should see spans
+in the console output of both shells.
+
+The output for the client looks like the following:
+
+```javascript {hl_lines=[7,11]}
+{
+ resource: {
+ attributes: {
+ // ...
+ }
+ },
+ traceId: '4b5367d540726a70afdbaf49240e6597',
+ parentId: undefined,
+ traceState: undefined,
+ name: 'send',
+ id: '92f125fa335505ec',
+ kind: 1,
+ timestamp: 1718879823424000,
+ duration: 1054.583,
+ // ...
+}
+```
+
+The output for the server looks like the following:
+
+```javascript {hl_lines=[7,8]}
+{
+ resource: {
+ attributes: {
+ // ...
+ }
+ },
+ traceId: '4b5367d540726a70afdbaf49240e6597',
+ parentId: '92f125fa335505ec',
+ traceState: undefined,
+ name: 'receive',
+ id: '53da0c5f03cb36e5',
+ kind: 1,
+ timestamp: 1718879823426000,
+ duration: 959.541,
+ // ...
+}
+```
+
+Similar to the [manual example](#manual-context-propagation) the spans are
+connected using the `traceId` and the `id`/`parentId`.
+
+## Next steps
+
+To learn more about propagation, read the
+[Propagators API specification](/docs/specs/otel/context/api-propagators/).
diff --git a/content/en/docs/languages/js/serverless.md b/content/en/docs/languages/js/serverless.md
index 629d26fe292d..c418b95e00c3 100644
--- a/content/en/docs/languages/js/serverless.md
+++ b/content/en/docs/languages/js/serverless.md
@@ -25,7 +25,7 @@ If you are interested in a plug and play user experience, see
### Dependencies
-First, create an empty package.json:
+First, create an empty `package.json`:
```sh
npm init -y
diff --git a/content/en/docs/languages/php/exporters.md b/content/en/docs/languages/php/exporters.md
index 8f0a7a22bffd..d92534747a99 100644
--- a/content/en/docs/languages/php/exporters.md
+++ b/content/en/docs/languages/php/exporters.md
@@ -8,9 +8,9 @@ cSpell:ignore: fastcgi pecl
{{% alert title="Note" color="info" %}}
-If you use [automatic instrumentation](/docs/languages/php/automatic/) you can
-setup exporters with
-[zero-code configuration to setup exporters](/docs/languages/php/automatic/#zero-code-configuration-for-automatic-instrumentation).
+If you use [zero-code instrumentation](/docs/zero-code/php/) you can set up
+exporters with
+[zero-code configuration to setup exporters](/docs/zero-code/php#zero-code-configuration-for-automatic-instrumentation).
{{% /alert %}}
diff --git a/content/en/docs/languages/php/getting-started.md b/content/en/docs/languages/php/getting-started.md
index 8a8d5667b063..1b75c50f9afc 100644
--- a/content/en/docs/languages/php/getting-started.md
+++ b/content/en/docs/languages/php/getting-started.md
@@ -10,13 +10,13 @@ OpenTelemetry for PHP can be used to generate and export [traces][], [metrics][]
and [logs][].
This page will show you how to get started with OpenTelemetry in PHP. We will
-create a simple "roll the dice" application, then apply both automatic and
-manual instrumentation to generate [traces][] and export them to the console. We
+create a simple "roll the dice" application, then apply both zero-code and code
+based instrumentation to generate [traces][] and export them to the console. We
will then emit some [logs][] which will also be sent to the console.
## Prerequisites
-OpenTelemetry requires PHP 8.0+ for automatic instrumentation, however manual
+OpenTelemetry requires PHP 8.0+ for zero-code instrumentation, however manual
instrumentation will work with PHP 7.4
Ensure that you have the following installed:
@@ -86,10 +86,10 @@ php -S localhost:8080
Open in your web browser to ensure it is
working.
-## Add automatic instrumentation
+## Add zero-code instrumentation
Next, you’ll use the OpenTelemetry PHP extension to
-[automatically instrument](../automatic/) the application.
+[automatically instrument](/docs/zero-code/php/) the application.
1. Since the extension is built from source, you need to install some build
tools
@@ -116,7 +116,8 @@ Next, you’ll use the OpenTelemetry PHP extension to
{{% alert title="Note" color="warning" %}}Alternative methods of installing
the extension are detailed in
- [automatic instrumentation](../automatic/#installation). {{% /alert %}}
+ [zero-code instrumentation](/docs/zero-code/php/#installation).
+ {{% /alert %}}
3. Add the extension to your `php.ini` file:
@@ -487,7 +488,7 @@ values correspond to the active span at the time the log message was generated.
For more:
- Run this example with another [exporter][] for telemetry data.
-- Try [automatic instrumentation](../automatic/) on one of your own apps.
+- Try [zero-code instrumentation](/docs/zero-code/php/) on one of your own apps.
- Learn more about [manual instrumentation][] and try out some [examples](/docs/languages/php/examples/).
- Take a look at the [OpenTelemetry Demo](/docs/demo/), which includes the PHP
based [Quote Service](/docs/demo/services/quote/).
diff --git a/content/en/docs/languages/php/instrumentation.md b/content/en/docs/languages/php/instrumentation.md
index f4e70fbfd8b5..a983898532c8 100644
--- a/content/en/docs/languages/php/instrumentation.md
+++ b/content/en/docs/languages/php/instrumentation.md
@@ -690,7 +690,7 @@ See [Exporters](/docs/languages/php/exporters)
OpenTelemetry can be used to measure and record different types of metrics from
an application, which can then be
[pushed](/docs/specs/otel/metrics/sdk/#push-metric-exporter) to a metrics
-service such as the OpenTelemetry collector:
+service such as the OpenTelemetry Collector:
- counter
- async counter
diff --git a/content/en/docs/languages/php/libraries.md b/content/en/docs/languages/php/libraries.md
index 2b21f6f61ad9..7b85fa5b9073 100644
--- a/content/en/docs/languages/php/libraries.md
+++ b/content/en/docs/languages/php/libraries.md
@@ -37,7 +37,7 @@ You can turn off any instrumentation by adding its identifier to the
## Available instrumentation libraries
For a list of available instrumentations, see
-[OpenTelemetry instrumentation packages](https://packagist.org/search/?query=open-telemetry&tags=instrumentation)
+[OpenTelemetry instrumentation libraries](https://packagist.org/search/?query=open-telemetry&tags=instrumentation)
on Packagist.
## Next steps
@@ -49,7 +49,3 @@ custom telemetry data.
You might also want to configure an appropriate exporter to
[export your telemetry data](/docs/languages/php/exporters) to one or more
telemetry backends.
-
-You can also check the
-[automatic instrumentation for PHP](/docs/languages/php/automatic) for existing
-library instrumentations.
diff --git a/content/en/docs/languages/python/_index.md b/content/en/docs/languages/python/_index.md
index e373c4998a5d..072d7c3cfcad 100644
--- a/content/en/docs/languages/python/_index.md
+++ b/content/en/docs/languages/python/_index.md
@@ -11,7 +11,7 @@ weight: 22
## Version support
-OpenTelemetry-Python supports Python 3.6 and higher.
+OpenTelemetry-Python supports Python 3.8 and higher.
## Installation
@@ -61,8 +61,8 @@ pip install -e ./opentelemetry-sdk
## Repositories and benchmarks
-- Main repo: [opentelemetry-python][]
-- Contrib repo: [opentelemetry-python-contrib][]
+- Main repository: [opentelemetry-python][]
+- Contrib repository: [opentelemetry-python-contrib][]
[opentelemetry-python]: https://github.com/open-telemetry/opentelemetry-python
[opentelemetry-python-contrib]:
diff --git a/content/en/docs/languages/python/getting-started.md b/content/en/docs/languages/python/getting-started.md
index 53ac6c716ad4..388261189ea3 100644
--- a/content/en/docs/languages/python/getting-started.md
+++ b/content/en/docs/languages/python/getting-started.md
@@ -83,9 +83,9 @@ flask run -p 8080
## Instrumentation
-Automatic instrumentation will generate telemetry data on your behalf. There are
+Zero-code instrumentation will generate telemetry data on your behalf. There are
several options you can take, covered in more detail in
-[Automatic Instrumentation](../automatic/). Here we'll use the
+[Zero-code Instrumentation](/docs/zero-code/python/). Here we'll use the
`opentelemetry-instrument` agent.
Install the `opentelemetry-distro` package, which contains the OpenTelemetry
@@ -814,8 +814,8 @@ Value: 1
## Next steps
There are several options available for automatic instrumentation and Python.
-See [Automatic Instrumentation](../automatic/) to learn about them and how to
-configure them.
+See [Zero-code Instrumentation](/docs/zero-code/python/) to learn about them and
+how to configure them.
There's a lot more to manual instrumentation than just creating a child span. To
learn details about initializing manual instrumentation and many more parts of
diff --git a/content/en/docs/languages/python/instrumentation.md b/content/en/docs/languages/python/instrumentation.md
index c06da44236f6..0affdb667079 100644
--- a/content/en/docs/languages/python/instrumentation.md
+++ b/content/en/docs/languages/python/instrumentation.md
@@ -103,10 +103,6 @@ ending it when `do_work()` is finished.
To use the decorator, you must have a `tracer` instance available global to your
function declaration.
-If you need to add [attributes](#add-attributes-to-a-span),
-[events](#adding-events), or [links](#adding-links) then it's less convenient to
-use a decorator.
-
### Get the current span
Sometimes it's helpful to access whatever the current
diff --git a/content/en/docs/languages/python/libraries.md b/content/en/docs/languages/python/libraries.md
index faeade39fc33..dce7cfa23d95 100644
--- a/content/en/docs/languages/python/libraries.md
+++ b/content/en/docs/languages/python/libraries.md
@@ -104,7 +104,7 @@ You might also want to configure an appropriate exporter to
telemetry backends.
You can also check the
-[automatic instrumentation for Python](/docs/languages/python/automatic).
+[Zero-code instrumentation for Python](/docs/zero-code/python/).
[opentelemetry-python-contrib]:
https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation#readme
diff --git a/content/en/docs/languages/ruby/exporters.md b/content/en/docs/languages/ruby/exporters.md
index f5dd3779ec6e..42099925237d 100644
--- a/content/en/docs/languages/ruby/exporters.md
+++ b/content/en/docs/languages/ruby/exporters.md
@@ -115,7 +115,7 @@ end
```
If you now run your application, set the environment variable
-`OTEL_TRACES_EXPORTER` to zipkin:
+`OTEL_TRACES_EXPORTER` to Zipkin:
```sh
env OTEL_TRACES_EXPORTER=zipkin rails server
diff --git a/content/en/docs/languages/ruby/getting-started.md b/content/en/docs/languages/ruby/getting-started.md
index 16430e6a8f6f..1839617fe3a1 100644
--- a/content/en/docs/languages/ruby/getting-started.md
+++ b/content/en/docs/languages/ruby/getting-started.md
@@ -34,7 +34,7 @@ For more elaborate examples, see [examples](/docs/languages/ruby/examples/).
### Dependencies
-To begin, install rails:
+To begin, install Rails:
```sh
gem install rails
diff --git a/content/en/docs/zero-code/go.md b/content/en/docs/zero-code/go.md
new file mode 100644
index 000000000000..8a226a28a121
--- /dev/null
+++ b/content/en/docs/zero-code/go.md
@@ -0,0 +1,13 @@
+---
+title: Go zero-code instrumentation
+linkTitle: Go
+weight: 16
+---
+
+Zero-code instrumentation for Go provides a way to instrument any Go application
+and capture telemetry data from many popular libraries and frameworks without
+any code changes.
+
+This project is currently work in progress and you can visit the
+[opentelemetry-go-instrumentation repository](https://github.com/open-telemetry/opentelemetry-go-instrumentation/)
+to learn more.
diff --git a/content/en/docs/zero-code/java/_index.md b/content/en/docs/zero-code/java/_index.md
index aa82346ebeed..2005b37188c9 100644
--- a/content/en/docs/zero-code/java/_index.md
+++ b/content/en/docs/zero-code/java/_index.md
@@ -6,8 +6,8 @@ aliases:
- /docs/languages/java/automatic_instrumentation
cascade:
vers:
- instrumentation: 2.4.0
- otel: 1.38.0
+ instrumentation: 2.5.0
+ otel: 1.39.0
---
Zero-code instrumentation with Java uses a Java agent JAR or Spring Boot
diff --git a/content/en/docs/zero-code/java/spring-boot-starter/getting-started.md b/content/en/docs/zero-code/java/spring-boot-starter/getting-started.md
index eba5b9332a8b..18520fb770f4 100644
--- a/content/en/docs/zero-code/java/spring-boot-starter/getting-started.md
+++ b/content/en/docs/zero-code/java/spring-boot-starter/getting-started.md
@@ -13,7 +13,7 @@ application. For the pros and cons, see [Java zero-code instrumentation](..).
### Compatibility
-The OpenTelemetry Spring Boot starter works with Spring Boot 2.6+ and 3.0+, and
+The OpenTelemetry Spring Boot starter works with Spring Boot 2.6+ and 3.1+, and
Spring Boot native image applications. The
[opentelemetry-java-examples/spring-native](https://github.com/open-telemetry/opentelemetry-java-examples/tree/main/spring-native)
repository contains an example of a Spring Boot Native image application
@@ -29,7 +29,14 @@ Importing the `opentelemetry-bom` and `opentelemetry-instrumentation-bom-alpha`
BOMs when using the OpenTelemetry starter is important to ensure version
alignment across all OpenTelemetry dependencies.
-The following example shows how to import both BOMs using Maven:
+{{% alert title="Note" color="info" %}}
+
+If you import the `spring-boot-dependencies` BOM, you have to declare it after
+the OpenTelemetry BOMs.
+
+{{% /alert %}}
+
+The following example shows how to import the OpenTelemetry BOMs using Maven:
```xml
diff --git a/content/en/docs/zero-code/net/configuration.md b/content/en/docs/zero-code/net/configuration.md
index 690791b8ed80..b2199f7ce8ac 100644
--- a/content/en/docs/zero-code/net/configuration.md
+++ b/content/en/docs/zero-code/net/configuration.md
@@ -205,7 +205,7 @@ Important environment variables include:
- On .NET 6 and higher, the application must reference
[`Grpc.Net.Client`](https://www.nuget.org/packages/Grpc.Net.Client/) to use
the `grpc` OTLP exporter protocol. For example, by adding
- `` to the
+ `` to the
`.csproj` file.
- On .NET Framework, the `grpc` OTLP exporter protocol is not supported.
diff --git a/content/en/docs/zero-code/net/instrumentations.md b/content/en/docs/zero-code/net/instrumentations.md
index 2d8f2cee763b..189a8e60132d 100644
--- a/content/en/docs/zero-code/net/instrumentations.md
+++ b/content/en/docs/zero-code/net/instrumentations.md
@@ -4,7 +4,7 @@ linkTitle: Instrumentations
description: OpenTelemetry .NET Automatic Instrumentation supported libraries.
weight: 10
# prettier-ignore
-cSpell:ignore: ASPNET ASPNETCORE Bootstrapper DBSTATEMENT ELASTICTRANSPORT ENTITYFRAMEWORKCORE GRCPNETCLIENT GRPCNETCLIENT HOSTINGSTARTUPASSEMBLIES HTTPCLIENT ILOGGER MASSTRANSIT MYSQLCONNECTOR MYSQLDATA NETRUNTIME NPGSQL Npgsql NSERVICEBUS SQLCLIENT STACKEXCHANGEREDIS WCFCLIENT WCFSERVICE
+cSpell:ignore: ASPNET ASPNETCORE Bootstrapper DBSTATEMENT ELASTICTRANSPORT ENTITYFRAMEWORKCORE GRCPNETCLIENT GRPCNETCLIENT HOSTINGSTARTUPASSEMBLIES HTTPCLIENT ILOGGER MASSTRANSIT MYSQLCONNECTOR MYSQLDATA NETRUNTIME NPGSQL Npgsql NSERVICEBUS ORACLEMDA SQLCLIENT STACKEXCHANGEREDIS WCFCLIENT WCFSERVICE
---
The OpenTelemetry .NET Automatic Instrumentation supports a wide variety of
@@ -41,38 +41,43 @@ is the case-sensitive name of the instrumentation.
stable, but particular instrumentation are in Experimental status due to lack of
stable semantic convention.
-| ID | Instrumented library | Supported versions | Instrumentation type | Status |
-| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ | -------------------- | --------------------------------------------------------- |
-| `ASPNET` | ASP.NET (.NET Framework) MVC / WebApi \[1\] **Not supported on .NET** | \* | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `ASPNETCORE` | ASP.NET Core **Not supported on .NET Framework** | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `AZURE` | [Azure SDK](https://azure.github.io/azure-sdk/releases/latest/index.html) | \[2\] | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `ELASTICSEARCH` | [Elastic.Clients.Elasticsearch](https://www.nuget.org/packages/Elastic.Clients.Elasticsearch) | \[3\] | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `ELASTICTRANSPORT` | [Elastic.Transport](https://www.nuget.org/packages/Elastic.Transport) | ≥0.4.16 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `ENTITYFRAMEWORKCORE` | [Microsoft.EntityFrameworkCore](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore) **Not supported on .NET Framework** | ≥6.0.12 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `GRAPHQL` | [GraphQL](https://www.nuget.org/packages/GraphQL) **Not supported on .NET Framework** | ≥7.5.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `GRPCNETCLIENT` | [Grpc.Net.Client](https://www.nuget.org/packages/Grpc.Net.Client) | ≥2.52.0 & < 3.0.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `HTTPCLIENT` | [System.Net.Http.HttpClient](https://docs.microsoft.com/dotnet/api/system.net.http.httpclient) and [System.Net.HttpWebRequest](https://docs.microsoft.com/dotnet/api/system.net.httpwebrequest) | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `KAFKA` | [Confluent.Kafka](https://www.nuget.org/packages/Confluent.Kafka) | ≥1.4.0 < 3.0.0 | bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `MASSTRANSIT` | [MassTransit](https://www.nuget.org/packages/MassTransit) **Not supported on .NET Framework** | ≥8.0.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `MONGODB` | [MongoDB.Driver.Core](https://www.nuget.org/packages/MongoDB.Driver.Core) | ≥2.13.3 & < 3.0.0 | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `MYSQLCONNECTOR` | [MySqlConnector](https://www.nuget.org/packages/MySqlConnector) | ≥2.0.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `MYSQLDATA` | [MySql.Data](https://www.nuget.org/packages/MySql.Data) **Not supported on .NET Framework** | ≥8.1.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `NPGSQL` | [Npgsql](https://www.nuget.org/packages/Npgsql) | ≥6.0.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `NSERVICEBUS` | [NServiceBus](https://www.nuget.org/packages/NServiceBus) | ≥8.0.0 | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `QUARTZ` | [Quartz](https://www.nuget.org/packages/Quartz) **Not supported on .NET Framework 4.7.1 and older** | ≥3.4.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `SQLCLIENT` | [Microsoft.Data.SqlClient](https://www.nuget.org/packages/Microsoft.Data.SqlClient), [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient) and `System.Data` (shipped with .NET Framework) | \* \[4\] | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `STACKEXCHANGEREDIS` | [StackExchange.Redis](https://www.nuget.org/packages/StackExchange.Redis) **Not supported on .NET Framework** | ≥2.0.405 < 3.0.0 | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `WCFCLIENT` | WCF | \* | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `WCFSERVICE` | WCF **Not supported on .NET**. | \* | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| ID | Instrumented library | Supported versions | Instrumentation type | Status |
+| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------- | -------------------- | --------------------------------------------------------- |
+| `ASPNET` | ASP.NET (.NET Framework) MVC / WebApi \[1\] **Not supported on .NET** | \* \[2\] | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `ASPNETCORE` | ASP.NET Core **Not supported on .NET Framework** | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `AZURE` | [Azure SDK](https://azure.github.io/azure-sdk/releases/latest/index.html) | \[3\] | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `ELASTICSEARCH` | [Elastic.Clients.Elasticsearch](https://www.nuget.org/packages/Elastic.Clients.Elasticsearch) | \* \[4\] | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `ELASTICTRANSPORT` | [Elastic.Transport](https://www.nuget.org/packages/Elastic.Transport) | ≥0.4.16 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `ENTITYFRAMEWORKCORE` | [Microsoft.EntityFrameworkCore](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore) **Not supported on .NET Framework** | ≥6.0.12 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `GRAPHQL` | [GraphQL](https://www.nuget.org/packages/GraphQL) **Not supported on .NET Framework** | ≥7.5.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `GRPCNETCLIENT` | [Grpc.Net.Client](https://www.nuget.org/packages/Grpc.Net.Client) | ≥2.52.0 & < 3.0.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `HTTPCLIENT` | [System.Net.Http.HttpClient](https://docs.microsoft.com/dotnet/api/system.net.http.httpclient) and [System.Net.HttpWebRequest](https://docs.microsoft.com/dotnet/api/system.net.httpwebrequest) | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `KAFKA` | [Confluent.Kafka](https://www.nuget.org/packages/Confluent.Kafka) | ≥1.4.0 & < 3.0.0 \[5\] | bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `MASSTRANSIT` | [MassTransit](https://www.nuget.org/packages/MassTransit) **Not supported on .NET Framework** | ≥8.0.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `MONGODB` | [MongoDB.Driver.Core](https://www.nuget.org/packages/MongoDB.Driver.Core) | ≥2.13.3 & < 3.0.0 | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `MYSQLCONNECTOR` | [MySqlConnector](https://www.nuget.org/packages/MySqlConnector) | ≥2.0.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `MYSQLDATA` | [MySql.Data](https://www.nuget.org/packages/MySql.Data) **Not supported on .NET Framework** | ≥8.1.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `NPGSQL` | [Npgsql](https://www.nuget.org/packages/Npgsql) | ≥6.0.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `NSERVICEBUS` | [NServiceBus](https://www.nuget.org/packages/NServiceBus) | ≥8.0.0 & < 10.0.0 | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `ORACLEMDA` | [Oracle.ManagedDataAccess.Core](https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core) and [Oracle.ManagedDataAccess](https://www.nuget.org/packages/Oracle.ManagedDataAccess) **Not supported on ARM64** | ≥23.4.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `QUARTZ` | [Quartz](https://www.nuget.org/packages/Quartz) **Not supported on .NET Framework 4.7.1 and older** | ≥3.4.0 | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `SQLCLIENT` | [Microsoft.Data.SqlClient](https://www.nuget.org/packages/Microsoft.Data.SqlClient), [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient) and `System.Data` (shipped with .NET Framework) | \* \[6\] | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `STACKEXCHANGEREDIS` | [StackExchange.Redis](https://www.nuget.org/packages/StackExchange.Redis) **Not supported on .NET Framework** | ≥2.0.405 & < 3.0.0 | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `WCFCLIENT` | WCF | \* | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `WCFSERVICE` | WCF **Not supported on .NET**. | \* | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
\[1\]: Only integrated pipeline mode is supported.
-\[2\]: `Azure.` prefixed packages, released after October 1, 2021.
+\[2\]: `ASP.NET (.NET Framework) MVC / WebApi` is not supported on ARM64.
-\[3\]: `Elastic.Clients.Elasticsearch` version ≥8.0.0 and <8.10.0. Version
+\[3\]: `Azure.` prefixed packages, released after October 1, 2021.
+
+\[4\]: `Elastic.Clients.Elasticsearch` version ≥8.0.0 and <8.10.0. Version
≥8.10.0 is supported by `Elastic.Transport` instrumentation.
-\[4\]: `Microsoft.Data.SqlClient` v3.\* is not supported on .NET Framework, due
+\[5\]: `Confluent.Kafka` is supported from version ≥1.8.2 on ARM64.
+
+\[6\]: `Microsoft.Data.SqlClient` v3.\* is not supported on .NET Framework, due
to [issue](https://github.com/open-telemetry/opentelemetry-dotnet/issues/4243).
`System.Data.SqlClient` is supported from version 4.8.5.
@@ -82,14 +87,14 @@ to [issue](https://github.com/open-telemetry/opentelemetry-dotnet/issues/4243).
stable, but particular instrumentation are in Experimental status due to lack of
stable semantic convention.
-| ID | Instrumented library | Documentation | Supported versions | Instrumentation type | Status |
-| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ | -------------------- | --------------------------------------------------------- |
-| `ASPNET` | ASP.NET Framework \[1\] **Not supported on .NET** | [ASP.NET metrics](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.AspNet-1.7.0-beta.1/src/OpenTelemetry.Instrumentation.AspNet/README.md#list-of-metrics-produced) | \* | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `ASPNETCORE` | ASP.NET Core \[2\] **Not supported on .NET Framework** | [ASP.NET Core metrics](https://github.com/open-telemetry/opentelemetry-dotnet/blob/Instrumentation.AspNetCore-1.7.1/src/OpenTelemetry.Instrumentation.AspNetCore/README.md#list-of-metrics-produced) | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `HTTPCLIENT` | [System.Net.Http.HttpClient](https://docs.microsoft.com/dotnet/api/system.net.http.httpclient) and [System.Net.HttpWebRequest](https://docs.microsoft.com/dotnet/api/system.net.httpwebrequest) | [HttpClient metrics](https://github.com/open-telemetry/opentelemetry-dotnet/blob/Instrumentation.Http-1.7.1/src/OpenTelemetry.Instrumentation.Http/README.md#list-of-metrics-produced) | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `NETRUNTIME` | [OpenTelemetry.Instrumentation.Runtime](https://www.nuget.org/packages/OpenTelemetry.Instrumentation.Runtime) | [Runtime metrics](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.Runtime-1.7.0/src/OpenTelemetry.Instrumentation.Runtime/README.md#metrics) | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `PROCESS` | [OpenTelemetry.Instrumentation.Process](https://www.nuget.org/packages/OpenTelemetry.Instrumentation.Process) | [Process metrics](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.Process-0.5.0-beta.4/src/OpenTelemetry.Instrumentation.Process/README.md#metrics) | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `NSERVICEBUS` | [NServiceBus](https://www.nuget.org/packages/NServiceBus) | [NServiceBus metrics](https://docs.particular.net/samples/open-telemetry/prometheus-grafana/#reporting-metric-values) | ≥8.0.0 | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| ID | Instrumented library | Documentation | Supported versions | Instrumentation type | Status |
+| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ | -------------------- | --------------------------------------------------------- |
+| `ASPNET` | ASP.NET Framework \[1\] **Not supported on .NET** | [ASP.NET metrics](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.AspNet-1.9.0-beta.1/src/OpenTelemetry.Instrumentation.AspNet/README.md#list-of-metrics-produced) | \* | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `ASPNETCORE` | ASP.NET Core \[2\] **Not supported on .NET Framework** | [ASP.NET Core metrics](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.AspNetCore-1.9.0/src/OpenTelemetry.Instrumentation.AspNetCore/README.md#list-of-metrics-produced) | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `HTTPCLIENT` | [System.Net.Http.HttpClient](https://docs.microsoft.com/dotnet/api/system.net.http.httpclient) and [System.Net.HttpWebRequest](https://docs.microsoft.com/dotnet/api/system.net.httpwebrequest) | [HttpClient metrics](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.Http-1.9.0/src/OpenTelemetry.Instrumentation.Http/README.md#list-of-metrics-produced) | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `NETRUNTIME` | [OpenTelemetry.Instrumentation.Runtime](https://www.nuget.org/packages/OpenTelemetry.Instrumentation.Runtime) | [Runtime metrics](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.Runtime-1.9.0/src/OpenTelemetry.Instrumentation.Runtime/README.md#metrics) | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `PROCESS` | [OpenTelemetry.Instrumentation.Process](https://www.nuget.org/packages/OpenTelemetry.Instrumentation.Process) | [Process metrics](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.Process-0.5.0-beta.6/src/OpenTelemetry.Instrumentation.Process/README.md#metrics) | \* | source | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `NSERVICEBUS` | [NServiceBus](https://www.nuget.org/packages/NServiceBus) | [NServiceBus metrics](https://docs.particular.net/samples/open-telemetry/prometheus-grafana/#reporting-metric-values) | ≥8.0.0 & < 10.0.0 | source & bytecode | [Experimental](/docs/specs/otel/versioning-and-stability) |
\[1\]: The ASP.NET metrics are generated only if the `AspNet` trace
instrumentation is also enabled.
@@ -112,11 +117,20 @@ enabled without using the .NET CLR Profiler by setting the
### Instrumentation options
-| Environment variable | Description | Default value | Status |
-| ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------------------------------------------------- |
-| `OTEL_DOTNET_AUTO_ENTITYFRAMEWORKCORE_SET_DBSTATEMENT_FOR_TEXT` | Whether the Entity Framework Core instrumentation can pass SQL statements through the `db.statement` attribute. Queries might contain sensitive information. If set to `false`, `db.statement` is recorded only for executing stored procedures. | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `OTEL_DOTNET_AUTO_GRAPHQL_SET_DOCUMENT` | Whether the GraphQL instrumentation can pass raw queries through the `graphql.document` attribute. Queries might contain sensitive information. | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `OTEL_DOTNET_AUTO_SQLCLIENT_SET_DBSTATEMENT_FOR_TEXT` | Whether the SQL Client instrumentation can pass SQL statements through the `db.statement` attribute. Queries might contain sensitive information. If set to `false`, `db.statement` is recorded only for executing stored procedures. **Not supported on .NET Framework for System.Data.SqlClient.** | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `OTEL_DOTNET_EXPERIMENTAL_ASPNETCORE_DISABLE_URL_QUERY_REDACTION` | Whether the ASP.NET Core instrumentation turns off redaction of the `url.query` attribute value. | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `OTEL_DOTNET_EXPERIMENTAL_HTTPCLIENT_DISABLE_URL_QUERY_REDACTION` | Whether the HTTP client instrumentation turns off redaction of the `url.full` attribute value. | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
-| `OTEL_DOTNET_EXPERIMENTAL_ASPNET_DISABLE_URL_QUERY_REDACTION` | Whether the ASP.NET instrumentation turns off redaction of the `url.query` attribute value. | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| Environment variable | Description | Default value | Status |
+| --------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------------------------------------------------- |
+| `OTEL_DOTNET_AUTO_ENTITYFRAMEWORKCORE_SET_DBSTATEMENT_FOR_TEXT` | Whether the Entity Framework Core instrumentation can pass SQL statements through the `db.statement` attribute. Queries might contain sensitive information. If set to `false`, `db.statement` is recorded only for executing stored procedures. | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_AUTO_GRAPHQL_SET_DOCUMENT` | Whether the GraphQL instrumentation can pass raw queries through the `graphql.document` attribute. Queries might contain sensitive information. | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_AUTO_ORACLEMDA_SET_DBSTATEMENT_FOR_TEXT` | Whether the Oracle Client instrumentation can pass SQL statements through the `db.statement` attribute. Queries might contain sensitive information. If set to `false`, `db.statement` is recorded only for executing stored procedures. | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_AUTO_SQLCLIENT_SET_DBSTATEMENT_FOR_TEXT` | Whether the SQL Client instrumentation can pass SQL statements through the `db.statement` attribute. Queries might contain sensitive information. If set to `false`, `db.statement` is recorded only for executing stored procedures. **Not supported on .NET Framework for System.Data.SqlClient.** | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_AUTO_TRACES_ASPNET_INSTRUMENTATION_CAPTURE_REQUEST_HEADERS` | A comma-separated list of HTTP header names. ASP.NET instrumentations will capture HTTP request header values for all configured header names. | | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_AUTO_TRACES_ASPNET_INSTRUMENTATION_CAPTURE_RESPONSE_HEADERS` | A comma-separated list of HTTP header names. ASP.NET instrumentations will capture HTTP response header values for all configured header names. **Not supported on IIS Classic mode.** | | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_AUTO_TRACES_ASPNETCORE_INSTRUMENTATION_CAPTURE_REQUEST_HEADERS` | A comma-separated list of HTTP header names. ASP.NET Core instrumentations will capture HTTP request header values for all configured header names. | | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_AUTO_TRACES_ASPNETCORE_INSTRUMENTATION_CAPTURE_RESPONSE_HEADERS` | A comma-separated list of HTTP header names. ASP.NET Core instrumentations will capture HTTP response header values for all configured header names. | | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_AUTO_TRACES_GRPCNETCLIENT_INSTRUMENTATION_CAPTURE_REQUEST_METADATA` | A comma-separated list of gRPC metadata names. Grpc.Net.Client instrumentations will capture gRPC request metadata values for all configured metadata names. | | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_AUTO_TRACES_GRPCNETCLIENT_INSTRUMENTATION_CAPTURE_RESPONSE_METADATA` | A comma-separated list of gRPC metadata names. Grpc.Net.Client instrumentations will capture gRPC response metadata values for all configured metadata names. | | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_AUTO_TRACES_HTTP_INSTRUMENTATION_CAPTURE_REQUEST_HEADERS` | A comma-separated list of HTTP header names. HTTP Client instrumentations will capture HTTP request header values for all configured header names. | | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_AUTO_TRACES_HTTP_INSTRUMENTATION_CAPTURE_RESPONSE_HEADERS` | A comma-separated list of HTTP header names. HTTP Client instrumentations will capture HTTP response header values for all configured header names. | | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_EXPERIMENTAL_ASPNETCORE_DISABLE_URL_QUERY_REDACTION` | Whether the ASP.NET Core instrumentation turns off redaction of the `url.query` attribute value. | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_EXPERIMENTAL_HTTPCLIENT_DISABLE_URL_QUERY_REDACTION` | Whether the HTTP client instrumentation turns off redaction of the `url.full` attribute value. | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
+| `OTEL_DOTNET_EXPERIMENTAL_ASPNET_DISABLE_URL_QUERY_REDACTION` | Whether the ASP.NET instrumentation turns off redaction of the `url.query` attribute value. | `false` | [Experimental](/docs/specs/otel/versioning-and-stability) |
diff --git a/content/en/docs/languages/php/automatic.md b/content/en/docs/zero-code/php.md
similarity index 87%
rename from content/en/docs/languages/php/automatic.md
rename to content/en/docs/zero-code/php.md
index 1be02f687429..2bcebe17f677 100644
--- a/content/en/docs/languages/php/automatic.md
+++ b/content/en/docs/zero-code/php.md
@@ -1,7 +1,8 @@
---
-title: Automatic Instrumentation
-linkTitle: Automatic
+title: PHP zero-code instrumentation
+linkTitle: PHP
weight: 30
+aliases: [/docs/languages/php/automatic]
# prettier-ignore
cSpell:ignore: centos configurator democlass epel myapp pecl phar remi unindented userland
---
@@ -15,13 +16,13 @@ method runs.
{{% alert title="Important" color="warning" %}}Installing the OpenTelemetry
extension by itself will not generate traces. You must also install the
[SDK](https://packagist.org/packages/open-telemetry/sdk) **and** one or more
-[instrumentation packages](/ecosystem/registry/?component=instrumentation&language=php)
+[instrumentation libraries](/ecosystem/registry/?component=instrumentation&language=php)
for the frameworks and libraries that you are using, or alternatively write your
own.
You also _must_ use
[composer autoloading](https://getcomposer.org/doc/01-basic-usage.md#autoloading),
-as this is the mechanism all auto-instrumentation packages use to register
+as this is the mechanism all instrumentation libraries use to register
themselves. {{% /alert %}}
## Example
@@ -69,10 +70,13 @@ $demo = new DemoClass();
$demo->run();
```
-Here, we provide `pre` and `post` functions, which are executed before and after
-`DemoClass::run`. The `pre` function starts and activates a span, and the `post`
-function ends it. If an exception was thrown by `DemoClass::run()`, the `post`
-function will record it, without affecting exception propagation.
+In the example above we define `DemoClass`, then register `pre` and `post` hook
+functions on its `run` method. The hook functions will run before and after each
+execution of the `DemoClass::run()` method. The `pre` function starts and
+activates a span, and the `post` function ends it.
+
+If an exception was thrown by `DemoClass::run()`, the `post` function will
+record it, without affecting exception propagation.
## Installation
@@ -212,20 +216,20 @@ OpenTelemetry\API\Globals::registerInitializer(function (Configurator $configura
$tracer = Globals::tracerProvider()->getTracer('example');
//or, via CachedInstrumentation which uses `Globals` internally
$instrumentation = new CachedInstrumentation('example');
-$tracerProvider = $instrumentation->tracer();
+$tracer = $instrumentation->tracer();
```
## Supported libraries and frameworks
-Automatic Instrumentation comes with a number of instrumentation libraries for
-commonly used PHP libraries. For the full list, see
+Automatic Instrumentation is available for a number of instrumentation libraries
+for commonly used PHP libraries. For the full list, see
[instrumentation libraries on packagist](https://packagist.org/search/?query=open-telemetry&tags=instrumentation).
## Next steps
After you have automatic instrumentation configured for your app or service, you
-might want to add [manual instrumentation](../instrumentation) to collect custom
-telemetry data.
+might want to add [manual instrumentation](/docs/languages/php/instrumentation)
+to collect custom telemetry data.
For more examples, see
[opentelemetry-php-contrib/examples](https://github.com/open-telemetry/opentelemetry-php-contrib/tree/main/examples).
diff --git a/content/en/docs/languages/python/automatic/_index.md b/content/en/docs/zero-code/python/_index.md
similarity index 96%
rename from content/en/docs/languages/python/automatic/_index.md
rename to content/en/docs/zero-code/python/_index.md
index 3e24342ab725..50d2d9a14cfb 100644
--- a/content/en/docs/languages/python/automatic/_index.md
+++ b/content/en/docs/zero-code/python/_index.md
@@ -1,7 +1,8 @@
---
-title: Automatic Instrumentation
-linkTitle: Automatic
+title: Python zero-code instrumentation
+linkTitle: Python
weight: 30
+aliases: [/docs/languages/python/automatic]
# prettier-ignore
cSpell:ignore: devel distro mkdir myapp pyproject uninstrumented virtualenv Werkzeug
---
diff --git a/content/en/docs/languages/python/automatic/configuration.md b/content/en/docs/zero-code/python/configuration.md
similarity index 97%
rename from content/en/docs/languages/python/automatic/configuration.md
rename to content/en/docs/zero-code/python/configuration.md
index 11df56fbc064..f0c33f567498 100644
--- a/content/en/docs/languages/python/automatic/configuration.md
+++ b/content/en/docs/zero-code/python/configuration.md
@@ -2,7 +2,9 @@
title: Agent Configuration
linkTitle: Configuration
weight: 10
-aliases: [agent-config]
+aliases:
+ - /docs/languages/python/automatic/configuration
+ - /docs/languages/python/automatic/agent-config
# prettier-ignore
cSpell:ignore: distro healthcheck mkdir myapp Starlette uninstrumented urllib virtualenv
---
@@ -119,7 +121,7 @@ outputted.
warning)
- `OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED`: to enable
auto-instrumentation of logs. Attaches OTLP handler to Python root logger. See
- example [here](/docs/languages/python/automatic/logs-example)
+ example [here](/docs/zero-code/python/logs-example)
Examples:
diff --git a/content/en/docs/languages/python/automatic/example.md b/content/en/docs/zero-code/python/example.md
similarity index 99%
rename from content/en/docs/languages/python/automatic/example.md
rename to content/en/docs/zero-code/python/example.md
index d1c087a3f342..f791b02f6551 100644
--- a/content/en/docs/languages/python/automatic/example.md
+++ b/content/en/docs/zero-code/python/example.md
@@ -2,6 +2,7 @@
title: Auto-Instrumentation Example
linkTitle: Example
weight: 20
+aliases: [/docs/languages/python/automatic/example]
# prettier-ignore
cSpell:ignore: distro instrumentor mkdir MSIE Referer Starlette uninstrumented venv werkzeug
---
diff --git a/content/en/docs/languages/python/automatic/logs-example.md b/content/en/docs/zero-code/python/logs-example.md
similarity index 99%
rename from content/en/docs/languages/python/automatic/logs-example.md
rename to content/en/docs/zero-code/python/logs-example.md
index 7df014946a4e..3bd6076e1f0a 100644
--- a/content/en/docs/languages/python/automatic/logs-example.md
+++ b/content/en/docs/zero-code/python/logs-example.md
@@ -2,6 +2,7 @@
title: Logs Auto-Instrumentation Example
linkTitle: Logs Example
weight: 20
+aliases: [/docs/languages/python/automatic/logs-example]
# prettier-ignore
cSpell:ignore: distro instrumentor mkdir MSIE Referer Starlette uninstrumented virtualenv
---
diff --git a/content/en/docs/languages/python/automatic/operator.md b/content/en/docs/zero-code/python/operator.md
similarity index 90%
rename from content/en/docs/languages/python/automatic/operator.md
rename to content/en/docs/zero-code/python/operator.md
index 7b17202b59c9..a08fd5e0219d 100644
--- a/content/en/docs/languages/python/automatic/operator.md
+++ b/content/en/docs/zero-code/python/operator.md
@@ -1,6 +1,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
---
diff --git a/content/en/ecosystem/integrations.md b/content/en/ecosystem/integrations.md
index cc9ff3174b41..fe309ee3ad38 100644
--- a/content/en/ecosystem/integrations.md
+++ b/content/en/ecosystem/integrations.md
@@ -13,6 +13,10 @@ The following list contains a sample of libraries, services, and apps that have
either integrated OpenTelemetry APIs and SDKs directly for native telemetry or
provide a first-party plugin that fits into their own extensibility ecosystem.
+You will find open source (OSS) projects at the beginning of the list;
+commercial projects follow. Projects which are part of the
+[CNCF](https://www.cncf.io/) show a small CNCF logo beside their name.
+
{{% ecosystem/integrations-table %}}
## How to add your integration {#how-to-add}
diff --git a/content/ja/_index.md b/content/ja/_index.md
index 52f04bb63359..7033167eec42 100644
--- a/content/ja/_index.md
+++ b/content/ja/_index.md
@@ -4,7 +4,7 @@ description: >-
効果的な観測を可能にする、高品質でユビキタスかつポータブルなテレメトリー
developer_note: blocks/coverコラム(以下で使用)は、ファイル名に "background" を含む画像ファイルを背景画像として使用します。
show_banner: true
-default_lang_commit: c2cd5b14
+default_lang_commit: e89a198
---