From ba22562fd3dd6c4fe2785df09076f2f79e0b70c3 Mon Sep 17 00:00:00 2001 From: Dmitrii Anoshin Date: Sat, 22 Jun 2024 21:16:30 -0700 Subject: [PATCH 1/4] [chore] Assign k8s distribution to components in documentation (#10459) --- cmd/mdatagen/statusdata.go | 1 + connector/forwardconnector/README.md | 3 ++- connector/forwardconnector/metadata.yaml | 2 +- exporter/debugexporter/README.md | 3 ++- exporter/debugexporter/metadata.yaml | 2 +- exporter/nopexporter/README.md | 3 ++- exporter/nopexporter/metadata.yaml | 2 +- exporter/otlpexporter/README.md | 3 ++- exporter/otlpexporter/metadata.yaml | 2 +- exporter/otlphttpexporter/README.md | 3 ++- exporter/otlphttpexporter/metadata.yaml | 2 +- extension/zpagesextension/README.md | 3 ++- extension/zpagesextension/metadata.yaml | 2 +- processor/batchprocessor/README.md | 3 ++- processor/batchprocessor/metadata.yaml | 2 +- processor/memorylimiterprocessor/README.md | 3 ++- processor/memorylimiterprocessor/metadata.yaml | 2 +- receiver/otlpreceiver/README.md | 3 ++- receiver/otlpreceiver/metadata.yaml | 2 +- 19 files changed, 28 insertions(+), 18 deletions(-) diff --git a/cmd/mdatagen/statusdata.go b/cmd/mdatagen/statusdata.go index db130aaf3ea..f09c68f98e9 100644 --- a/cmd/mdatagen/statusdata.go +++ b/cmd/mdatagen/statusdata.go @@ -19,6 +19,7 @@ import ( var distros = map[string]string{ "core": "https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol", "contrib": "https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib", + "k8s": "https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s", } type Codeowners struct { diff --git a/connector/forwardconnector/README.md b/connector/forwardconnector/README.md index fad3289c1e2..acbf15eba18 100644 --- a/connector/forwardconnector/README.md +++ b/connector/forwardconnector/README.md @@ -3,12 +3,13 @@ | Status | | | ------------- |-----------| -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Fforward%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Fforward) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Fforward%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Fforward) | [beta]: https://github.com/open-telemetry/opentelemetry-collector#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s ## Supported Pipeline Types diff --git a/connector/forwardconnector/metadata.yaml b/connector/forwardconnector/metadata.yaml index 41fc2707019..b3ea1d24c0a 100644 --- a/connector/forwardconnector/metadata.yaml +++ b/connector/forwardconnector/metadata.yaml @@ -4,4 +4,4 @@ status: class: connector stability: beta: [traces_to_traces, metrics_to_metrics, logs_to_logs] - distributions: [core, contrib] + distributions: [core, contrib, k8s] diff --git a/exporter/debugexporter/README.md b/exporter/debugexporter/README.md index 6f8eac92623..9746c7a1658 100644 --- a/exporter/debugexporter/README.md +++ b/exporter/debugexporter/README.md @@ -4,13 +4,14 @@ | Status | | | ------------- |-----------| | Stability | [development]: traces, metrics, logs | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Warnings | [Unstable Output Format](#warnings) | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fdebug%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fdebug) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fdebug%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fdebug) | [development]: https://github.com/open-telemetry/opentelemetry-collector#development [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s Exports data to the console (stderr) via `zap.Logger`. diff --git a/exporter/debugexporter/metadata.yaml b/exporter/debugexporter/metadata.yaml index 4c60b9589e8..2c9f9093c4d 100644 --- a/exporter/debugexporter/metadata.yaml +++ b/exporter/debugexporter/metadata.yaml @@ -4,5 +4,5 @@ status: class: exporter stability: development: [traces, metrics, logs] - distributions: [core, contrib] + distributions: [core, contrib, k8s] warnings: [Unstable Output Format] diff --git a/exporter/nopexporter/README.md b/exporter/nopexporter/README.md index 99b54523fb0..98a98b37ca0 100644 --- a/exporter/nopexporter/README.md +++ b/exporter/nopexporter/README.md @@ -4,12 +4,13 @@ | Status | | | ------------- |-----------| | Stability | [beta]: traces, metrics, logs | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fnop%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fnop) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fnop%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fnop) | [beta]: https://github.com/open-telemetry/opentelemetry-collector#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s Serves as a placeholder exporter in a pipeline. This can be useful if you want diff --git a/exporter/nopexporter/metadata.yaml b/exporter/nopexporter/metadata.yaml index 3c61e2e6433..9c0c931892d 100644 --- a/exporter/nopexporter/metadata.yaml +++ b/exporter/nopexporter/metadata.yaml @@ -4,4 +4,4 @@ status: class: exporter stability: beta: [traces, metrics, logs] - distributions: [core, contrib] + distributions: [core, contrib, k8s] diff --git a/exporter/otlpexporter/README.md b/exporter/otlpexporter/README.md index 8926a14369b..b4a5c7b055d 100644 --- a/exporter/otlpexporter/README.md +++ b/exporter/otlpexporter/README.md @@ -5,13 +5,14 @@ | ------------- |-----------| | Stability | [beta]: logs | | | [stable]: traces, metrics | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fotlp%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fotlp) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fotlp%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fotlp) | [beta]: https://github.com/open-telemetry/opentelemetry-collector#beta [stable]: https://github.com/open-telemetry/opentelemetry-collector#stable [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s Export data via gRPC using [OTLP]( diff --git a/exporter/otlpexporter/metadata.yaml b/exporter/otlpexporter/metadata.yaml index f24e40e1f91..0d517c86116 100644 --- a/exporter/otlpexporter/metadata.yaml +++ b/exporter/otlpexporter/metadata.yaml @@ -5,7 +5,7 @@ status: stability: stable: [traces, metrics] beta: [logs] - distributions: [core, contrib] + distributions: [core, contrib, k8s] tests: config: diff --git a/exporter/otlphttpexporter/README.md b/exporter/otlphttpexporter/README.md index fb15c0dab7a..c41aef98ff6 100644 --- a/exporter/otlphttpexporter/README.md +++ b/exporter/otlphttpexporter/README.md @@ -5,13 +5,14 @@ | ------------- |-----------| | Stability | [beta]: logs | | | [stable]: traces, metrics | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fotlphttp%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fotlphttp) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fotlphttp%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fotlphttp) | [beta]: https://github.com/open-telemetry/opentelemetry-collector#beta [stable]: https://github.com/open-telemetry/opentelemetry-collector#stable [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s Export traces and/or metrics via HTTP using [OTLP]( diff --git a/exporter/otlphttpexporter/metadata.yaml b/exporter/otlphttpexporter/metadata.yaml index 5e1c41d3243..c5dddcf25e8 100644 --- a/exporter/otlphttpexporter/metadata.yaml +++ b/exporter/otlphttpexporter/metadata.yaml @@ -5,7 +5,7 @@ status: stability: stable: [traces, metrics] beta: [logs] - distributions: [core, contrib] + distributions: [core, contrib, k8s] tests: config: diff --git a/extension/zpagesextension/README.md b/extension/zpagesextension/README.md index bdae98913ef..357552e7513 100644 --- a/extension/zpagesextension/README.md +++ b/extension/zpagesextension/README.md @@ -4,12 +4,13 @@ | Status | | | ------------- |-----------| | Stability | [beta] | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fzpages%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fzpages) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fzpages%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fzpages) | [beta]: https://github.com/open-telemetry/opentelemetry-collector#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s Enables an extension that serves zPages, an HTTP endpoint that provides live diff --git a/extension/zpagesextension/metadata.yaml b/extension/zpagesextension/metadata.yaml index 558eec8fccd..13101e73964 100644 --- a/extension/zpagesextension/metadata.yaml +++ b/extension/zpagesextension/metadata.yaml @@ -4,4 +4,4 @@ status: class: extension stability: beta: [extension] - distributions: [core, contrib] + distributions: [core, contrib, k8s] diff --git a/processor/batchprocessor/README.md b/processor/batchprocessor/README.md index 85ae733d28a..44b297fc344 100644 --- a/processor/batchprocessor/README.md +++ b/processor/batchprocessor/README.md @@ -4,12 +4,13 @@ | Status | | | ------------- |-----------| | Stability | [beta]: traces, metrics, logs | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fbatch%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fbatch) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fbatch%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fbatch) | [beta]: https://github.com/open-telemetry/opentelemetry-collector#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s The batch processor accepts spans, metrics, or logs and places them into diff --git a/processor/batchprocessor/metadata.yaml b/processor/batchprocessor/metadata.yaml index dd47697b850..06e7065358a 100644 --- a/processor/batchprocessor/metadata.yaml +++ b/processor/batchprocessor/metadata.yaml @@ -4,7 +4,7 @@ status: class: processor stability: beta: [traces, metrics, logs] - distributions: [core, contrib] + distributions: [core, contrib, k8s] tests: diff --git a/processor/memorylimiterprocessor/README.md b/processor/memorylimiterprocessor/README.md index 6f5e51da789..87795b62404 100644 --- a/processor/memorylimiterprocessor/README.md +++ b/processor/memorylimiterprocessor/README.md @@ -4,12 +4,13 @@ | Status | | | ------------- |-----------| | Stability | [beta]: traces, metrics, logs | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fmemorylimiter%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fmemorylimiter) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fmemorylimiter%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fmemorylimiter) | [beta]: https://github.com/open-telemetry/opentelemetry-collector#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s ## Overview diff --git a/processor/memorylimiterprocessor/metadata.yaml b/processor/memorylimiterprocessor/metadata.yaml index 92f9d2f821b..cf155ca04ab 100644 --- a/processor/memorylimiterprocessor/metadata.yaml +++ b/processor/memorylimiterprocessor/metadata.yaml @@ -4,7 +4,7 @@ status: class: processor stability: beta: [traces, metrics, logs] - distributions: [core, contrib] + distributions: [core, contrib, k8s] tests: config: diff --git a/receiver/otlpreceiver/README.md b/receiver/otlpreceiver/README.md index a5572071629..255395fb5d6 100644 --- a/receiver/otlpreceiver/README.md +++ b/receiver/otlpreceiver/README.md @@ -5,13 +5,14 @@ | ------------- |-----------| | Stability | [beta]: logs | | | [stable]: traces, metrics | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Areceiver%2Fotlp%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Areceiver%2Fotlp) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Areceiver%2Fotlp%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Areceiver%2Fotlp) | [beta]: https://github.com/open-telemetry/opentelemetry-collector#beta [stable]: https://github.com/open-telemetry/opentelemetry-collector#stable [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s Receives data via gRPC or HTTP using [OTLP]( diff --git a/receiver/otlpreceiver/metadata.yaml b/receiver/otlpreceiver/metadata.yaml index c3036a3341d..db490cfe6fe 100644 --- a/receiver/otlpreceiver/metadata.yaml +++ b/receiver/otlpreceiver/metadata.yaml @@ -5,4 +5,4 @@ status: stability: stable: [traces, metrics] beta: [logs] - distributions: [core, contrib] + distributions: [core, contrib, k8s] From 3364ba111a1f89ac3d4e97eaef35d160c69f23ad Mon Sep 17 00:00:00 2001 From: Andrzej Stencel Date: Mon, 24 Jun 2024 10:49:59 +0200 Subject: [PATCH 2/4] [exporter/debug] format spans as one-liners in `normal` verbosity (#10280) #### Description This is an initial barebones implementation that only outputs the span's name, trace ID and span ID. Other useful fields like duration etc. can be added in follow-up enhancements. This pull request is part of https://github.com/open-telemetry/opentelemetry-collector/issues/7806; it implements the change for traces. The changes for [logs](https://github.com/open-telemetry/opentelemetry-collector/pull/10225) and metrics will be proposed in separate pull requests. This change applies to the Debug exporter only. The behavior of the Logging exporter remains unchanged. To use this behavior, switch from the deprecated Logging exporter to Debug exporter. #### Link to tracking issue - https://github.com/open-telemetry/opentelemetry-collector/issues/7806 #### Testing Added unit tests for the formatter. #### Documentation Described the formatting in the Debug exporter's README. --------- Co-authored-by: Pablo Baeyens --- ...ebug-exporter-normal-verbosity-traces.yaml | 25 +++++++++ exporter/debugexporter/README.md | 15 +++--- exporter/debugexporter/exporter.go | 7 ++- .../debugexporter/internal/normal/common.go | 20 ++++++++ .../debugexporter/internal/normal/logs.go | 11 ---- .../debugexporter/internal/normal/traces.go | 51 +++++++++++++++++++ .../internal/normal/traces_test.go | 48 +++++++++++++++++ 7 files changed, 157 insertions(+), 20 deletions(-) create mode 100644 .chloggen/debug-exporter-normal-verbosity-traces.yaml create mode 100644 exporter/debugexporter/internal/normal/common.go create mode 100644 exporter/debugexporter/internal/normal/traces.go create mode 100644 exporter/debugexporter/internal/normal/traces_test.go diff --git a/.chloggen/debug-exporter-normal-verbosity-traces.yaml b/.chloggen/debug-exporter-normal-verbosity-traces.yaml new file mode 100644 index 00000000000..00a105bac1e --- /dev/null +++ b/.chloggen/debug-exporter-normal-verbosity-traces.yaml @@ -0,0 +1,25 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver) +component: exporter/debug + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: In `normal` verbosity, display one line of text for each span + +# One or more tracking issues or pull requests related to the change +issues: [7806] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: + +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [] diff --git a/exporter/debugexporter/README.md b/exporter/debugexporter/README.md index 9746c7a1658..1e75cc872ca 100644 --- a/exporter/debugexporter/README.md +++ b/exporter/debugexporter/README.md @@ -63,21 +63,22 @@ Here's an example output: ### Normal verbosity -With `verbosity: normal`, the exporter outputs about one line for each telemetry record, including its body and attributes. +With `verbosity: normal`, the exporter outputs about one line for each telemetry record. The "one line per telemetry record" is not a strict rule. For example, logs with multiline body will be output as multiple lines. > [!IMPORTANT] -> Currently the `normal` verbosity is only implemented for logs. -> Metrics and traces are going to be implemented in the future. -> The current behavior for metrics and traces is the same as in `basic` verbosity. +> Currently the `normal` verbosity is only implemented for logs and traces. +> Metrics are going to be implemented in the future. +> The current behavior for metrics is the same as in `basic` verbosity. Here's an example output: ```console -2024-05-27T12:46:22.423+0200 info LogsExporter {"kind": "exporter", "data_type": "logs", "name": "debug", "resource logs": 1, "log records": 1} -2024-05-27T12:46:22.423+0200 info the message app=server - {"kind": "exporter", "data_type": "logs", "name": "debug"} +2024-05-31T13:26:37.531+0200 info TracesExporter {"kind": "exporter", "data_type": "traces", "name": "debug", "resource spans": 1, "spans": 2} +2024-05-31T13:26:37.531+0200 info okey-dokey-0 082bc2f70f519e32a39fd26ae69b43c0 51201084f4d65159 +lets-go 082bc2f70f519e32a39fd26ae69b43c0 cd321682f3514378 + {"kind": "exporter", "data_type": "traces", "name": "debug"} ``` ### Detailed verbosity diff --git a/exporter/debugexporter/exporter.go b/exporter/debugexporter/exporter.go index ab5865e41c7..6f3a59298d7 100644 --- a/exporter/debugexporter/exporter.go +++ b/exporter/debugexporter/exporter.go @@ -30,17 +30,20 @@ type debugExporter struct { func newDebugExporter(logger *zap.Logger, verbosity configtelemetry.Level) *debugExporter { var logsMarshaler plog.Marshaler + var tracesMarshaler ptrace.Marshaler if verbosity == configtelemetry.LevelDetailed { logsMarshaler = otlptext.NewTextLogsMarshaler() + tracesMarshaler = otlptext.NewTextTracesMarshaler() } else { logsMarshaler = normal.NewNormalLogsMarshaler() + tracesMarshaler = normal.NewNormalTracesMarshaler() } return &debugExporter{ verbosity: verbosity, logger: logger, logsMarshaler: logsMarshaler, metricsMarshaler: otlptext.NewTextMetricsMarshaler(), - tracesMarshaler: otlptext.NewTextTracesMarshaler(), + tracesMarshaler: tracesMarshaler, } } @@ -48,7 +51,7 @@ func (s *debugExporter) pushTraces(_ context.Context, td ptrace.Traces) error { s.logger.Info("TracesExporter", zap.Int("resource spans", td.ResourceSpans().Len()), zap.Int("spans", td.SpanCount())) - if s.verbosity != configtelemetry.LevelDetailed { + if s.verbosity == configtelemetry.LevelBasic { return nil } diff --git a/exporter/debugexporter/internal/normal/common.go b/exporter/debugexporter/internal/normal/common.go new file mode 100644 index 00000000000..957583f9c8e --- /dev/null +++ b/exporter/debugexporter/internal/normal/common.go @@ -0,0 +1,20 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package normal // import "go.opentelemetry.io/collector/exporter/debugexporter/internal/normal" + +import ( + "fmt" + + "go.opentelemetry.io/collector/pdata/pcommon" +) + +// writeAttributes returns a slice of strings in the form "attrKey=attrValue" +func writeAttributes(attributes pcommon.Map) (attributeStrings []string) { + attributes.Range(func(k string, v pcommon.Value) bool { + attribute := fmt.Sprintf("%s=%s", k, v.AsString()) + attributeStrings = append(attributeStrings, attribute) + return true + }) + return attributeStrings +} diff --git a/exporter/debugexporter/internal/normal/logs.go b/exporter/debugexporter/internal/normal/logs.go index 9a2ff4cd808..dbf2e5dda08 100644 --- a/exporter/debugexporter/internal/normal/logs.go +++ b/exporter/debugexporter/internal/normal/logs.go @@ -8,7 +8,6 @@ import ( "fmt" "strings" - "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" ) @@ -40,13 +39,3 @@ func (normalLogsMarshaler) MarshalLogs(ld plog.Logs) ([]byte, error) { } return buffer.Bytes(), nil } - -// writeAttributes returns a slice of strings in the form "attrKey=attrValue" -func writeAttributes(attributes pcommon.Map) (attributeStrings []string) { - attributes.Range(func(k string, v pcommon.Value) bool { - attribute := fmt.Sprintf("%s=%s", k, v.AsString()) - attributeStrings = append(attributeStrings, attribute) - return true - }) - return attributeStrings -} diff --git a/exporter/debugexporter/internal/normal/traces.go b/exporter/debugexporter/internal/normal/traces.go new file mode 100644 index 00000000000..3aa32731ad6 --- /dev/null +++ b/exporter/debugexporter/internal/normal/traces.go @@ -0,0 +1,51 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package normal // import "go.opentelemetry.io/collector/exporter/debugexporter/internal/normal" + +import ( + "bytes" + "strings" + + "go.opentelemetry.io/collector/pdata/ptrace" +) + +type normalTracesMarshaler struct{} + +// Ensure normalTracesMarshaller implements interface ptrace.Marshaler +var _ ptrace.Marshaler = normalTracesMarshaler{} + +// NewNormalTracesMarshaler returns a ptrace.Marshaler for normal verbosity. It writes one line of text per log record +func NewNormalTracesMarshaler() ptrace.Marshaler { + return normalTracesMarshaler{} +} + +func (normalTracesMarshaler) MarshalTraces(md ptrace.Traces) ([]byte, error) { + var buffer bytes.Buffer + for i := 0; i < md.ResourceSpans().Len(); i++ { + resourceTraces := md.ResourceSpans().At(i) + for j := 0; j < resourceTraces.ScopeSpans().Len(); j++ { + scopeTraces := resourceTraces.ScopeSpans().At(j) + for k := 0; k < scopeTraces.Spans().Len(); k++ { + span := scopeTraces.Spans().At(k) + + buffer.WriteString(span.Name()) + + buffer.WriteString(" ") + buffer.WriteString(span.TraceID().String()) + + buffer.WriteString(" ") + buffer.WriteString(span.SpanID().String()) + + if span.Attributes().Len() > 0 { + spanAttributes := writeAttributes(span.Attributes()) + buffer.WriteString(" ") + buffer.WriteString(strings.Join(spanAttributes, " ")) + } + + buffer.WriteString("\n") + } + } + } + return buffer.Bytes(), nil +} diff --git a/exporter/debugexporter/internal/normal/traces_test.go b/exporter/debugexporter/internal/normal/traces_test.go new file mode 100644 index 00000000000..84f69d4a176 --- /dev/null +++ b/exporter/debugexporter/internal/normal/traces_test.go @@ -0,0 +1,48 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package normal + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "go.opentelemetry.io/collector/pdata/ptrace" +) + +func TestMarshalTraces(t *testing.T) { + tests := []struct { + name string + input ptrace.Traces + expected string + }{ + { + name: "empty traces", + input: ptrace.NewTraces(), + expected: "", + }, + { + name: "one span", + input: func() ptrace.Traces { + traces := ptrace.NewTraces() + span := traces.ResourceSpans().AppendEmpty().ScopeSpans().AppendEmpty().Spans().AppendEmpty() + span.SetName("span-name") + span.SetTraceID([16]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10}) + span.SetSpanID([8]byte{0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}) + span.Attributes().PutStr("key1", "value1") + span.Attributes().PutStr("key2", "value2") + return traces + }(), + expected: `span-name 0102030405060708090a0b0c0d0e0f10 1112131415161718 key1=value1 key2=value2 +`, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + output, err := NewNormalTracesMarshaler().MarshalTraces(tt.input) + assert.NoError(t, err) + assert.Equal(t, tt.expected, string(output)) + }) + } +} From 1d1ff4a16cb9a1e7890febb37a595a3030dd77b3 Mon Sep 17 00:00:00 2001 From: Andrzej Stencel Date: Mon, 24 Jun 2024 16:58:37 +0200 Subject: [PATCH 3/4] [exporter/debug] format metric data points as one-liners in `normal` verbosity (#10462) #### Description This pull request is part of https://github.com/open-telemetry/opentelemetry-collector/issues/7806; it implements the change for metrics. The changes for [logs](https://github.com/open-telemetry/opentelemetry-collector/pull/10225) and [traces](https://github.com/open-telemetry/opentelemetry-collector/pull/10280) have been proposed in separate pull requests. This change applies to the Debug exporter only. The behavior of the Logging exporter remains unchanged. To use this behavior, switch from the deprecated Logging exporter to Debug exporter. #### Link to tracking issue - https://github.com/open-telemetry/opentelemetry-collector/issues/7806 #### Testing Added unit tests for the formatter. #### Documentation Described the formatting in the Debug exporter's README. --- ...ebug-exporter-normal-verbosity-traces.yaml | 25 --- ...l => debug-exporter-normal-verbosity.yaml} | 2 +- exporter/debugexporter/README.md | 13 +- exporter/debugexporter/exporter.go | 7 +- .../debugexporter/internal/normal/metrics.go | 149 ++++++++++++++++++ .../internal/normal/metrics_test.go | 120 ++++++++++++++ 6 files changed, 280 insertions(+), 36 deletions(-) delete mode 100644 .chloggen/debug-exporter-normal-verbosity-traces.yaml rename .chloggen/{debug-exporter-normal-verbosity-logs.yaml => debug-exporter-normal-verbosity.yaml} (90%) create mode 100644 exporter/debugexporter/internal/normal/metrics.go create mode 100644 exporter/debugexporter/internal/normal/metrics_test.go diff --git a/.chloggen/debug-exporter-normal-verbosity-traces.yaml b/.chloggen/debug-exporter-normal-verbosity-traces.yaml deleted file mode 100644 index 00a105bac1e..00000000000 --- a/.chloggen/debug-exporter-normal-verbosity-traces.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# Use this changelog template to create an entry for release notes. - -# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' -change_type: enhancement - -# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver) -component: exporter/debug - -# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). -note: In `normal` verbosity, display one line of text for each span - -# One or more tracking issues or pull requests related to the change -issues: [7806] - -# (Optional) One or more lines of additional information to render under the primary note. -# These lines will be padded with 2 spaces and then inserted directly into the document. -# Use pipe (|) for multiline entries. -subtext: - -# Optional: The change log or logs in which this entry should be included. -# e.g. '[user]' or '[user, api]' -# Include 'user' if the change is relevant to end users. -# Include 'api' if there is a change to a library API. -# Default: '[user]' -change_logs: [] diff --git a/.chloggen/debug-exporter-normal-verbosity-logs.yaml b/.chloggen/debug-exporter-normal-verbosity.yaml similarity index 90% rename from .chloggen/debug-exporter-normal-verbosity-logs.yaml rename to .chloggen/debug-exporter-normal-verbosity.yaml index d874275a547..8fe3264a232 100644 --- a/.chloggen/debug-exporter-normal-verbosity-logs.yaml +++ b/.chloggen/debug-exporter-normal-verbosity.yaml @@ -7,7 +7,7 @@ change_type: enhancement component: exporter/debug # A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). -note: In `normal` verbosity, display one line of text for each log record +note: In `normal` verbosity, display one line of text for each telemetry record (log, data point, span) # One or more tracking issues or pull requests related to the change issues: [7806] diff --git a/exporter/debugexporter/README.md b/exporter/debugexporter/README.md index 1e75cc872ca..f10b6ee8f87 100644 --- a/exporter/debugexporter/README.md +++ b/exporter/debugexporter/README.md @@ -67,17 +67,12 @@ With `verbosity: normal`, the exporter outputs about one line for each telemetry The "one line per telemetry record" is not a strict rule. For example, logs with multiline body will be output as multiple lines. -> [!IMPORTANT] -> Currently the `normal` verbosity is only implemented for logs and traces. -> Metrics are going to be implemented in the future. -> The current behavior for metrics is the same as in `basic` verbosity. - Here's an example output: ```console -2024-05-31T13:26:37.531+0200 info TracesExporter {"kind": "exporter", "data_type": "traces", "name": "debug", "resource spans": 1, "spans": 2} -2024-05-31T13:26:37.531+0200 info okey-dokey-0 082bc2f70f519e32a39fd26ae69b43c0 51201084f4d65159 -lets-go 082bc2f70f519e32a39fd26ae69b43c0 cd321682f3514378 +2024-06-24T15:18:58.559+0200 info TracesExporter {"kind": "exporter", "data_type": "traces", "name": "debug", "resource spans": 1, "spans": 2} +2024-06-24T15:18:58.559+0200 info okey-dokey-0 4bdc558f0f0650e3ccaac8f3ae133954 8b69459f015c164b net.peer.ip=1.2.3.4 peer.service=telemetrygen-client +lets-go 4bdc558f0f0650e3ccaac8f3ae133954 8820ee5366817639 net.peer.ip=1.2.3.4 peer.service=telemetrygen-server {"kind": "exporter", "data_type": "traces", "name": "debug"} ``` @@ -128,3 +123,5 @@ Attributes: ## Warnings - Unstable Output Format: The output formats for all verbosity levels is not guaranteed and may be changed at any time without a breaking change. + +[telemetrygen]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen diff --git a/exporter/debugexporter/exporter.go b/exporter/debugexporter/exporter.go index 6f3a59298d7..324cd19935c 100644 --- a/exporter/debugexporter/exporter.go +++ b/exporter/debugexporter/exporter.go @@ -30,19 +30,22 @@ type debugExporter struct { func newDebugExporter(logger *zap.Logger, verbosity configtelemetry.Level) *debugExporter { var logsMarshaler plog.Marshaler + var metricsMarshaler pmetric.Marshaler var tracesMarshaler ptrace.Marshaler if verbosity == configtelemetry.LevelDetailed { logsMarshaler = otlptext.NewTextLogsMarshaler() + metricsMarshaler = otlptext.NewTextMetricsMarshaler() tracesMarshaler = otlptext.NewTextTracesMarshaler() } else { logsMarshaler = normal.NewNormalLogsMarshaler() + metricsMarshaler = normal.NewNormalMetricsMarshaler() tracesMarshaler = normal.NewNormalTracesMarshaler() } return &debugExporter{ verbosity: verbosity, logger: logger, logsMarshaler: logsMarshaler, - metricsMarshaler: otlptext.NewTextMetricsMarshaler(), + metricsMarshaler: metricsMarshaler, tracesMarshaler: tracesMarshaler, } } @@ -68,7 +71,7 @@ func (s *debugExporter) pushMetrics(_ context.Context, md pmetric.Metrics) error zap.Int("resource metrics", md.ResourceMetrics().Len()), zap.Int("metrics", md.MetricCount()), zap.Int("data points", md.DataPointCount())) - if s.verbosity != configtelemetry.LevelDetailed { + if s.verbosity == configtelemetry.LevelBasic { return nil } diff --git a/exporter/debugexporter/internal/normal/metrics.go b/exporter/debugexporter/internal/normal/metrics.go new file mode 100644 index 00000000000..c8e8eca17d6 --- /dev/null +++ b/exporter/debugexporter/internal/normal/metrics.go @@ -0,0 +1,149 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package normal // import "go.opentelemetry.io/collector/exporter/debugexporter/internal/normal" + +import ( + "bytes" + "fmt" + "strings" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +type normalMetricsMarshaler struct{} + +// Ensure normalMetricsMarshaller implements interface pmetric.Marshaler +var _ pmetric.Marshaler = normalMetricsMarshaler{} + +// NewNormalMetricsMarshaler returns a pmetric.Marshaler for normal verbosity. It writes one line of text per log record +func NewNormalMetricsMarshaler() pmetric.Marshaler { + return normalMetricsMarshaler{} +} + +func (normalMetricsMarshaler) MarshalMetrics(md pmetric.Metrics) ([]byte, error) { + var buffer bytes.Buffer + for i := 0; i < md.ResourceMetrics().Len(); i++ { + resourceMetrics := md.ResourceMetrics().At(i) + for j := 0; j < resourceMetrics.ScopeMetrics().Len(); j++ { + scopeMetrics := resourceMetrics.ScopeMetrics().At(j) + for k := 0; k < scopeMetrics.Metrics().Len(); k++ { + metric := scopeMetrics.Metrics().At(k) + + var dataPointLines []string + switch metric.Type() { + case pmetric.MetricTypeGauge: + dataPointLines = writeNumberDataPoints(metric, metric.Gauge().DataPoints()) + case pmetric.MetricTypeSum: + dataPointLines = writeNumberDataPoints(metric, metric.Sum().DataPoints()) + case pmetric.MetricTypeHistogram: + dataPointLines = writeHistogramDataPoints(metric) + case pmetric.MetricTypeExponentialHistogram: + dataPointLines = writeExponentialHistogramDataPoints(metric) + case pmetric.MetricTypeSummary: + dataPointLines = writeSummaryDataPoints(metric) + } + for _, line := range dataPointLines { + buffer.WriteString(line) + } + } + } + } + return buffer.Bytes(), nil +} + +func writeNumberDataPoints(metric pmetric.Metric, dataPoints pmetric.NumberDataPointSlice) (lines []string) { + for i := 0; i < dataPoints.Len(); i++ { + dataPoint := dataPoints.At(i) + dataPointAttributes := writeAttributes(dataPoint.Attributes()) + + var value string + switch dataPoint.ValueType() { + case pmetric.NumberDataPointValueTypeInt: + value = fmt.Sprintf("%v", dataPoint.IntValue()) + case pmetric.NumberDataPointValueTypeDouble: + value = fmt.Sprintf("%v", dataPoint.DoubleValue()) + } + + dataPointLine := fmt.Sprintf("%s{%s} %s\n", metric.Name(), strings.Join(dataPointAttributes, ","), value) + lines = append(lines, dataPointLine) + } + return lines +} + +func writeHistogramDataPoints(metric pmetric.Metric) (lines []string) { + for i := 0; i < metric.Histogram().DataPoints().Len(); i++ { + dataPoint := metric.Histogram().DataPoints().At(i) + dataPointAttributes := writeAttributes(dataPoint.Attributes()) + + var value string + value = fmt.Sprintf("count=%d", dataPoint.Count()) + if dataPoint.HasSum() { + value += fmt.Sprintf(" sum=%v", dataPoint.Sum()) + } + if dataPoint.HasMin() { + value += fmt.Sprintf(" min=%v", dataPoint.Min()) + } + if dataPoint.HasMax() { + value += fmt.Sprintf(" max=%v", dataPoint.Max()) + } + + for bucketIndex := 0; bucketIndex < dataPoint.BucketCounts().Len(); bucketIndex++ { + bucketBound := "" + if bucketIndex < dataPoint.ExplicitBounds().Len() { + bucketBound = fmt.Sprintf("le%v=", dataPoint.ExplicitBounds().At(bucketIndex)) + } + bucketCount := dataPoint.BucketCounts().At(bucketIndex) + value += fmt.Sprintf(" %s%d", bucketBound, bucketCount) + } + + dataPointLine := fmt.Sprintf("%s{%s} %s\n", metric.Name(), strings.Join(dataPointAttributes, ","), value) + lines = append(lines, dataPointLine) + } + return lines +} + +func writeExponentialHistogramDataPoints(metric pmetric.Metric) (lines []string) { + for i := 0; i < metric.ExponentialHistogram().DataPoints().Len(); i++ { + dataPoint := metric.ExponentialHistogram().DataPoints().At(i) + dataPointAttributes := writeAttributes(dataPoint.Attributes()) + + var value string + value = fmt.Sprintf("count=%d", dataPoint.Count()) + if dataPoint.HasSum() { + value += fmt.Sprintf(" sum=%v", dataPoint.Sum()) + } + if dataPoint.HasMin() { + value += fmt.Sprintf(" min=%v", dataPoint.Min()) + } + if dataPoint.HasMax() { + value += fmt.Sprintf(" max=%v", dataPoint.Max()) + } + + // TODO display buckets + + dataPointLine := fmt.Sprintf("%s{%s} %s\n", metric.Name(), strings.Join(dataPointAttributes, ","), value) + lines = append(lines, dataPointLine) + } + return lines +} + +func writeSummaryDataPoints(metric pmetric.Metric) (lines []string) { + for i := 0; i < metric.Summary().DataPoints().Len(); i++ { + dataPoint := metric.Summary().DataPoints().At(i) + dataPointAttributes := writeAttributes(dataPoint.Attributes()) + + var value string + value = fmt.Sprintf("count=%d", dataPoint.Count()) + value += fmt.Sprintf(" sum=%f", dataPoint.Sum()) + + for quantileIndex := 0; quantileIndex < dataPoint.QuantileValues().Len(); quantileIndex++ { + quantile := dataPoint.QuantileValues().At(quantileIndex) + value += fmt.Sprintf(" q%v=%v", quantile.Quantile(), quantile.Value()) + } + + dataPointLine := fmt.Sprintf("%s{%s} %s\n", metric.Name(), strings.Join(dataPointAttributes, ","), value) + lines = append(lines, dataPointLine) + } + return lines +} diff --git a/exporter/debugexporter/internal/normal/metrics_test.go b/exporter/debugexporter/internal/normal/metrics_test.go new file mode 100644 index 00000000000..8d941297cf6 --- /dev/null +++ b/exporter/debugexporter/internal/normal/metrics_test.go @@ -0,0 +1,120 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package normal + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +func TestMarshalMetrics(t *testing.T) { + tests := []struct { + name string + input pmetric.Metrics + expected string + }{ + { + name: "empty metrics", + input: pmetric.NewMetrics(), + expected: "", + }, + { + name: "sum data point", + input: func() pmetric.Metrics { + metrics := pmetric.NewMetrics() + metric := metrics.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty().Metrics().AppendEmpty() + metric.SetName("system.cpu.time") + dataPoint := metric.SetEmptySum().DataPoints().AppendEmpty() + dataPoint.SetDoubleValue(123.456) + dataPoint.Attributes().PutStr("state", "user") + dataPoint.Attributes().PutStr("cpu", "0") + return metrics + }(), + expected: `system.cpu.time{state=user,cpu=0} 123.456 +`, + }, + { + name: "gauge data point", + input: func() pmetric.Metrics { + metrics := pmetric.NewMetrics() + metric := metrics.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty().Metrics().AppendEmpty() + metric.SetName("system.cpu.utilization") + dataPoint := metric.SetEmptyGauge().DataPoints().AppendEmpty() + dataPoint.SetDoubleValue(78.901234567) + dataPoint.Attributes().PutStr("state", "free") + dataPoint.Attributes().PutStr("cpu", "8") + return metrics + }(), + expected: `system.cpu.utilization{state=free,cpu=8} 78.901234567 +`, + }, + { + name: "histogram", + input: func() pmetric.Metrics { + metrics := pmetric.NewMetrics() + metric := metrics.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty().Metrics().AppendEmpty() + metric.SetName("http.server.request.duration") + dataPoint := metric.SetEmptyHistogram().DataPoints().AppendEmpty() + dataPoint.Attributes().PutInt("http.response.status_code", 200) + dataPoint.Attributes().PutStr("http.request.method", "GET") + dataPoint.ExplicitBounds().FromRaw([]float64{0.125, 0.5, 1, 3}) + dataPoint.BucketCounts().FromRaw([]uint64{1324, 13, 0, 2, 1}) + dataPoint.SetCount(1340) + dataPoint.SetSum(99.573) + dataPoint.SetMin(0.017) + dataPoint.SetMax(8.13) + return metrics + }(), + expected: `http.server.request.duration{http.response.status_code=200,http.request.method=GET} count=1340 sum=99.573 min=0.017 max=8.13 le0.125=1324 le0.5=13 le1=0 le3=2 1 +`, + }, + { + name: "exponential histogram", + input: func() pmetric.Metrics { + metrics := pmetric.NewMetrics() + metric := metrics.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty().Metrics().AppendEmpty() + metric.SetName("http.server.request.duration") + dataPoint := metric.SetEmptyExponentialHistogram().DataPoints().AppendEmpty() + dataPoint.Attributes().PutInt("http.response.status_code", 200) + dataPoint.Attributes().PutStr("http.request.method", "GET") + dataPoint.SetCount(1340) + dataPoint.SetSum(99.573) + dataPoint.SetMin(0.017) + dataPoint.SetMax(8.13) + return metrics + }(), + expected: `http.server.request.duration{http.response.status_code=200,http.request.method=GET} count=1340 sum=99.573 min=0.017 max=8.13 +`, + }, + { + name: "summary", + input: func() pmetric.Metrics { + metrics := pmetric.NewMetrics() + metric := metrics.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty().Metrics().AppendEmpty() + metric.SetName("summary") + dataPoint := metric.SetEmptySummary().DataPoints().AppendEmpty() + dataPoint.Attributes().PutInt("http.response.status_code", 200) + dataPoint.Attributes().PutStr("http.request.method", "GET") + dataPoint.SetCount(1340) + dataPoint.SetSum(99.573) + quantile := dataPoint.QuantileValues().AppendEmpty() + quantile.SetQuantile(0.01) + quantile.SetValue(15) + return metrics + }(), + expected: `summary{http.response.status_code=200,http.request.method=GET} count=1340 sum=99.573000 q0.01=15 +`, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + output, err := NewNormalMetricsMarshaler().MarshalMetrics(tt.input) + assert.NoError(t, err) + assert.Equal(t, tt.expected, string(output)) + }) + } +} From 227fb823dbf33e6a62b842aef5a70e10ed1db84f Mon Sep 17 00:00:00 2001 From: Damien Mathieu <42@dmathieu.com> Date: Mon, 24 Jun 2024 16:58:57 +0200 Subject: [PATCH 4/4] Add pprofile wrapper and testdata (#10401) #### Description This adds pprofile wrapper (the non-generated bit of pprofile), as well as test data. cc @mx-psi --------- Co-authored-by: Pablo Baeyens --- .chloggen/pprofile-wrapper.yaml | 25 ++++++++ .chloggen/profile-testdata.yaml | 25 ++++++++ Makefile | 2 + cmd/builder/internal/builder/main_test.go | 1 + cmd/mdatagen/go.mod | 2 + cmd/otelcorecol/builder-config.yaml | 5 +- cmd/otelcorecol/go.mod | 2 + config/configgrpc/go.mod | 3 + config/confighttp/go.mod | 2 + config/internal/go.mod | 2 + confmap/converter/expandconverter/go.mod | 2 + connector/forwardconnector/go.mod | 2 + connector/go.mod | 3 + consumer/go.mod | 4 +- consumer/go.sum | 1 - exporter/debugexporter/go.mod | 3 + exporter/go.mod | 3 + exporter/loggingexporter/go.mod | 2 + exporter/nopexporter/go.mod | 2 + exporter/otlpexporter/go.mod | 3 + exporter/otlphttpexporter/go.mod | 2 + extension/ballastextension/go.mod | 2 + extension/memorylimiterextension/go.mod | 2 + extension/zpagesextension/go.mod | 2 + go.mod | 3 + internal/e2e/go.mod | 3 + otelcol/go.mod | 3 + otelcol/otelcoltest/go.mod | 3 + pdata/internal/wrapper_profiles.go | 46 +++++++++++++++ pdata/pprofile/profiles.go | 51 +++++++++++++++++ pdata/pprofile/profiles_test.go | 69 +++++++++++++++++++++++ pdata/testdata/go.mod | 7 ++- pdata/testdata/profile.go | 46 +++++++++++++++ processor/batchprocessor/go.mod | 3 + processor/go.mod | 3 + processor/memorylimiterprocessor/go.mod | 3 + receiver/go.mod | 2 + receiver/nopreceiver/go.mod | 2 + receiver/otlpreceiver/go.mod | 3 + service/go.mod | 3 + 40 files changed, 347 insertions(+), 5 deletions(-) create mode 100644 .chloggen/pprofile-wrapper.yaml create mode 100644 .chloggen/profile-testdata.yaml create mode 100644 pdata/internal/wrapper_profiles.go create mode 100644 pdata/pprofile/profiles.go create mode 100644 pdata/pprofile/profiles_test.go create mode 100644 pdata/testdata/profile.go diff --git a/.chloggen/pprofile-wrapper.yaml b/.chloggen/pprofile-wrapper.yaml new file mode 100644 index 00000000000..bd69f1e9925 --- /dev/null +++ b/.chloggen/pprofile-wrapper.yaml @@ -0,0 +1,25 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver) +component: pdata/pprofile + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Add pprofile wrapper to convert proto into pprofile. + +# One or more tracking issues or pull requests related to the change +issues: [10401] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: + +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [api] diff --git a/.chloggen/profile-testdata.yaml b/.chloggen/profile-testdata.yaml new file mode 100644 index 00000000000..fb2be1ee340 --- /dev/null +++ b/.chloggen/profile-testdata.yaml @@ -0,0 +1,25 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver) +component: pdata/testdata + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Add pdata testdata for profiles. + +# One or more tracking issues or pull requests related to the change +issues: [10401] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: + +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [api] diff --git a/Makefile b/Makefile index 067da69bd5d..60ee82a7681 100644 --- a/Makefile +++ b/Makefile @@ -284,6 +284,7 @@ check-contrib: -replace go.opentelemetry.io/collector/otelcol/otelcoltest=$(CURDIR)/otelcol/otelcoltest \ -replace go.opentelemetry.io/collector/pdata=$(CURDIR)/pdata \ -replace go.opentelemetry.io/collector/pdata/testdata=$(CURDIR)/pdata/testdata \ + -replace go.opentelemetry.io/collector/pdata/pprofile=$(CURDIR)/pdata/pprofile \ -replace go.opentelemetry.io/collector/processor=$(CURDIR)/processor \ -replace go.opentelemetry.io/collector/processor/batchprocessor=$(CURDIR)/processor/batchprocessor \ -replace go.opentelemetry.io/collector/processor/memorylimiterprocessor=$(CURDIR)/processor/memorylimiterprocessor \ @@ -341,6 +342,7 @@ restore-contrib: -dropreplace go.opentelemetry.io/collector/otelcol/otelcoltest \ -dropreplace go.opentelemetry.io/collector/pdata \ -dropreplace go.opentelemetry.io/collector/pdata/testdata \ + -dropreplace go.opentelemetry.io/collector/pdata/pprofile \ -dropreplace go.opentelemetry.io/collector/processor \ -dropreplace go.opentelemetry.io/collector/processor/batchprocessor \ -dropreplace go.opentelemetry.io/collector/processor/memorylimiterprocessor \ diff --git a/cmd/builder/internal/builder/main_test.go b/cmd/builder/internal/builder/main_test.go index fa0c0d35d24..ea39bcf785c 100644 --- a/cmd/builder/internal/builder/main_test.go +++ b/cmd/builder/internal/builder/main_test.go @@ -78,6 +78,7 @@ var ( "/otelcol", "/pdata", "/pdata/testdata", + "/pdata/pprofile", "/semconv", "/service", } diff --git a/cmd/mdatagen/go.mod b/cmd/mdatagen/go.mod index 45649111b17..e96e33fbcc4 100644 --- a/cmd/mdatagen/go.mod +++ b/cmd/mdatagen/go.mod @@ -87,3 +87,5 @@ retract ( v0.76.1 v0.65.0 ) + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/cmd/otelcorecol/builder-config.yaml b/cmd/otelcorecol/builder-config.yaml index 6197cd1c540..5630bd9ac80 100644 --- a/cmd/otelcorecol/builder-config.yaml +++ b/cmd/otelcorecol/builder-config.yaml @@ -1,8 +1,8 @@ # NOTE: # This builder configuration is NOT used to build any official binary. -# To see the builder manifests used for official binaries, +# To see the builder manifests used for official binaries, # check https://github.com/open-telemetry/opentelemetry-collector-releases -# +# # For the OpenTelemetry Collector Core official distribution sources, check # https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol @@ -77,6 +77,7 @@ replaces: - go.opentelemetry.io/collector/featuregate => ../../featuregate - go.opentelemetry.io/collector/pdata => ../../pdata - go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata + - go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile - go.opentelemetry.io/collector/processor => ../../processor - go.opentelemetry.io/collector/receiver => ../../receiver - go.opentelemetry.io/collector/receiver/nopreceiver => ../../receiver/nopreceiver diff --git a/cmd/otelcorecol/go.mod b/cmd/otelcorecol/go.mod index 19864d8c1f6..40274203ee1 100644 --- a/cmd/otelcorecol/go.mod +++ b/cmd/otelcorecol/go.mod @@ -203,6 +203,8 @@ replace go.opentelemetry.io/collector/pdata => ../../pdata replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile + replace go.opentelemetry.io/collector/processor => ../../processor replace go.opentelemetry.io/collector/receiver => ../../receiver diff --git a/config/configgrpc/go.mod b/config/configgrpc/go.mod index 7d3954590d3..82b0d2755d8 100644 --- a/config/configgrpc/go.mod +++ b/config/configgrpc/go.mod @@ -52,6 +52,7 @@ require ( go.opentelemetry.io/collector/confmap v0.103.0 // indirect go.opentelemetry.io/collector/extension v0.103.0 // indirect go.opentelemetry.io/collector/featuregate v1.10.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect go.opentelemetry.io/otel/metric v1.27.0 // indirect go.opentelemetry.io/otel/sdk v1.27.0 // indirect @@ -94,6 +95,8 @@ replace go.opentelemetry.io/collector/pdata => ../../pdata replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile + replace go.opentelemetry.io/collector/component => ../../component replace go.opentelemetry.io/collector/consumer => ../../consumer diff --git a/config/confighttp/go.mod b/config/confighttp/go.mod index beb57170b41..cbca50bb8c1 100644 --- a/config/confighttp/go.mod +++ b/config/confighttp/go.mod @@ -91,3 +91,5 @@ replace go.opentelemetry.io/collector/component => ../../component replace go.opentelemetry.io/collector/consumer => ../../consumer replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/config/internal/go.mod b/config/internal/go.mod index 302136bd7f5..7935ffc8420 100644 --- a/config/internal/go.mod +++ b/config/internal/go.mod @@ -33,3 +33,5 @@ replace go.opentelemetry.io/collector/consumer => ../../consumer replace go.opentelemetry.io/collector/component => ../../component replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/confmap/converter/expandconverter/go.mod b/confmap/converter/expandconverter/go.mod index f622a5442d2..e2c0bd1125f 100644 --- a/confmap/converter/expandconverter/go.mod +++ b/confmap/converter/expandconverter/go.mod @@ -40,3 +40,5 @@ replace go.opentelemetry.io/collector/pdata => ../../../pdata replace go.opentelemetry.io/collector/featuregate => ../../../featuregate replace go.opentelemetry.io/collector/consumer => ../../../consumer + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../../pdata/pprofile diff --git a/connector/forwardconnector/go.mod b/connector/forwardconnector/go.mod index d24d5022777..ee5c2b80467 100644 --- a/connector/forwardconnector/go.mod +++ b/connector/forwardconnector/go.mod @@ -77,3 +77,5 @@ retract ( ) replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/configtelemetry + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/connector/go.mod b/connector/go.mod index ec511264df7..4bb65875437 100644 --- a/connector/go.mod +++ b/connector/go.mod @@ -31,6 +31,7 @@ require ( github.com/prometheus/common v0.54.0 // indirect github.com/prometheus/procfs v0.15.0 // indirect go.opentelemetry.io/collector/config/configtelemetry v0.103.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/otel v1.27.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect go.opentelemetry.io/otel/metric v1.27.0 // indirect @@ -61,3 +62,5 @@ replace go.opentelemetry.io/collector/featuregate => ../featuregate replace go.opentelemetry.io/collector/pdata => ../pdata replace go.opentelemetry.io/collector/pdata/testdata => ../pdata/testdata + +replace go.opentelemetry.io/collector/pdata/pprofile => ../pdata/pprofile diff --git a/consumer/go.mod b/consumer/go.mod index 121a85a3ca1..5afc53a9c3d 100644 --- a/consumer/go.mod +++ b/consumer/go.mod @@ -13,10 +13,10 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/kr/text v0.2.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/net v0.23.0 // indirect golang.org/x/sys v0.18.0 // indirect @@ -31,6 +31,8 @@ replace go.opentelemetry.io/collector/pdata => ../pdata replace go.opentelemetry.io/collector/pdata/testdata => ../pdata/testdata +replace go.opentelemetry.io/collector/pdata/pprofile => ../pdata/pprofile + retract ( v0.76.0 // Depends on retracted pdata v1.0.0-rc10 module, use v0.76.1 v0.69.0 // Release failed, use v0.69.1 diff --git a/consumer/go.sum b/consumer/go.sum index 4ae987d011c..ff7072f4244 100644 --- a/consumer/go.sum +++ b/consumer/go.sum @@ -1,4 +1,3 @@ -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/exporter/debugexporter/go.mod b/exporter/debugexporter/go.mod index d7b06607b5d..dc28381d31e 100644 --- a/exporter/debugexporter/go.mod +++ b/exporter/debugexporter/go.mod @@ -43,6 +43,7 @@ require ( go.opentelemetry.io/collector/config/configretry v0.103.0 // indirect go.opentelemetry.io/collector/extension v0.103.0 // indirect go.opentelemetry.io/collector/featuregate v1.10.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/collector/receiver v0.103.0 // indirect go.opentelemetry.io/otel v1.27.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect @@ -76,6 +77,8 @@ replace go.opentelemetry.io/collector/pdata => ../../pdata replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile + replace go.opentelemetry.io/collector/receiver => ../../receiver replace go.opentelemetry.io/collector/extension => ../../extension diff --git a/exporter/go.mod b/exporter/go.mod index 6b36eb211cf..c84500495f6 100644 --- a/exporter/go.mod +++ b/exporter/go.mod @@ -51,6 +51,7 @@ require ( github.com/prometheus/procfs v0.15.0 // indirect go.opentelemetry.io/collector/confmap v0.103.0 // indirect go.opentelemetry.io/collector/featuregate v1.10.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect golang.org/x/net v0.25.0 // indirect golang.org/x/text v0.15.0 // indirect @@ -75,6 +76,8 @@ replace go.opentelemetry.io/collector/pdata => ../pdata replace go.opentelemetry.io/collector/pdata/testdata => ../pdata/testdata +replace go.opentelemetry.io/collector/pdata/pprofile => ../pdata/pprofile + replace go.opentelemetry.io/collector/receiver => ../receiver retract v0.76.0 // Depends on retracted pdata v1.0.0-rc10 module diff --git a/exporter/loggingexporter/go.mod b/exporter/loggingexporter/go.mod index 70b16b95bc1..c03f7bca6e7 100644 --- a/exporter/loggingexporter/go.mod +++ b/exporter/loggingexporter/go.mod @@ -88,3 +88,5 @@ retract ( replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/configtelemetry replace go.opentelemetry.io/collector/config/configretry => ../../config/configretry + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/exporter/nopexporter/go.mod b/exporter/nopexporter/go.mod index 11b194e85b7..dfee2fb64d2 100644 --- a/exporter/nopexporter/go.mod +++ b/exporter/nopexporter/go.mod @@ -78,3 +78,5 @@ replace go.opentelemetry.io/collector/confmap => ../../confmap replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/configtelemetry replace go.opentelemetry.io/collector/extension => ../../extension + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/exporter/otlpexporter/go.mod b/exporter/otlpexporter/go.mod index 171134158ab..0582666f260 100644 --- a/exporter/otlpexporter/go.mod +++ b/exporter/otlpexporter/go.mod @@ -59,6 +59,7 @@ require ( go.opentelemetry.io/collector/extension v0.103.0 // indirect go.opentelemetry.io/collector/extension/auth v0.103.0 // indirect go.opentelemetry.io/collector/featuregate v1.10.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/collector/receiver v0.103.0 // indirect go.opentelemetry.io/contrib/config v0.7.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect @@ -116,6 +117,8 @@ replace go.opentelemetry.io/collector/pdata => ../../pdata replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile + replace go.opentelemetry.io/collector/receiver => ../../receiver replace go.opentelemetry.io/collector/consumer => ../../consumer diff --git a/exporter/otlphttpexporter/go.mod b/exporter/otlphttpexporter/go.mod index 9611315bdcd..61c34d04c25 100644 --- a/exporter/otlphttpexporter/go.mod +++ b/exporter/otlphttpexporter/go.mod @@ -115,6 +115,8 @@ replace go.opentelemetry.io/collector/pdata => ../../pdata replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile + replace go.opentelemetry.io/collector/receiver => ../../receiver replace go.opentelemetry.io/collector/consumer => ../../consumer diff --git a/extension/ballastextension/go.mod b/extension/ballastextension/go.mod index c174281d886..40eec48ca11 100644 --- a/extension/ballastextension/go.mod +++ b/extension/ballastextension/go.mod @@ -81,3 +81,5 @@ retract ( replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/configtelemetry replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/extension/memorylimiterextension/go.mod b/extension/memorylimiterextension/go.mod index 892db56f289..85017f19736 100644 --- a/extension/memorylimiterextension/go.mod +++ b/extension/memorylimiterextension/go.mod @@ -75,3 +75,5 @@ replace go.opentelemetry.io/collector/consumer => ../../consumer replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/configtelemetry replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/extension/zpagesextension/go.mod b/extension/zpagesextension/go.mod index 39eac98fb79..94fbb642050 100644 --- a/extension/zpagesextension/go.mod +++ b/extension/zpagesextension/go.mod @@ -113,3 +113,5 @@ replace go.opentelemetry.io/collector/config/configauth => ../../config/configau replace go.opentelemetry.io/collector/extension/auth => ../auth replace go.opentelemetry.io/collector/config/confighttp => ../../config/confighttp + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/go.mod b/go.mod index 06653587634..9531c1b08f0 100644 --- a/go.mod +++ b/go.mod @@ -57,6 +57,7 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opentelemetry.io/collector/config/configtelemetry v0.103.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/otel v1.27.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect @@ -101,3 +102,5 @@ retract ( v0.57.0 // Release failed, use v0.57.2 v0.32.0 // Contains incomplete metrics transition to proto 0.9.0, random components are not working. ) + +replace go.opentelemetry.io/collector/pdata/pprofile => ./pdata/pprofile diff --git a/internal/e2e/go.mod b/internal/e2e/go.mod index 648508434b8..62b7951791e 100644 --- a/internal/e2e/go.mod +++ b/internal/e2e/go.mod @@ -62,6 +62,7 @@ require ( go.opentelemetry.io/collector/extension v0.103.0 // indirect go.opentelemetry.io/collector/extension/auth v0.103.0 // indirect go.opentelemetry.io/collector/featuregate v1.10.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/contrib/config v0.7.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect @@ -121,6 +122,8 @@ replace go.opentelemetry.io/collector/pdata => ../../pdata replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile + replace go.opentelemetry.io/collector/consumer => ../../consumer replace go.opentelemetry.io/collector/receiver/otlpreceiver => ../../receiver/otlpreceiver diff --git a/otelcol/go.mod b/otelcol/go.mod index 9ad6a104267..29c3cfd6540 100644 --- a/otelcol/go.mod +++ b/otelcol/go.mod @@ -70,6 +70,7 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/collector/consumer v0.103.0 // indirect go.opentelemetry.io/collector/pdata v1.10.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/collector/pdata/testdata v0.103.0 // indirect go.opentelemetry.io/collector/semconv v0.103.0 // indirect go.opentelemetry.io/contrib/config v0.7.0 // indirect @@ -109,6 +110,8 @@ replace go.opentelemetry.io/collector/pdata => ../pdata replace go.opentelemetry.io/collector/pdata/testdata => ../pdata/testdata +replace go.opentelemetry.io/collector/pdata/pprofile => ../pdata/pprofile + replace go.opentelemetry.io/collector/extension/zpagesextension => ../extension/zpagesextension replace go.opentelemetry.io/collector/extension => ../extension diff --git a/otelcol/otelcoltest/go.mod b/otelcol/otelcoltest/go.mod index 1a415596200..0a786db0a56 100644 --- a/otelcol/otelcoltest/go.mod +++ b/otelcol/otelcoltest/go.mod @@ -65,6 +65,7 @@ require ( go.opentelemetry.io/collector/consumer v0.103.0 // indirect go.opentelemetry.io/collector/featuregate v1.10.0 // indirect go.opentelemetry.io/collector/pdata v1.10.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/collector/pdata/testdata v0.103.0 // indirect go.opentelemetry.io/collector/semconv v0.103.0 // indirect go.opentelemetry.io/contrib/config v0.7.0 // indirect @@ -136,6 +137,8 @@ replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata replace go.opentelemetry.io/collector/pdata => ../../pdata +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile + replace go.opentelemetry.io/collector/confmap/provider/httpsprovider => ../../confmap/provider/httpsprovider replace go.opentelemetry.io/collector/connector => ../../connector diff --git a/pdata/internal/wrapper_profiles.go b/pdata/internal/wrapper_profiles.go new file mode 100644 index 00000000000..564c8945862 --- /dev/null +++ b/pdata/internal/wrapper_profiles.go @@ -0,0 +1,46 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package internal // import "go.opentelemetry.io/collector/pdata/internal" + +import ( + otlpcollectorprofile "go.opentelemetry.io/collector/pdata/internal/data/protogen/collector/profiles/v1experimental" + otlpprofile "go.opentelemetry.io/collector/pdata/internal/data/protogen/profiles/v1experimental" +) + +type Profiles struct { + orig *otlpcollectorprofile.ExportProfilesServiceRequest + state *State +} + +func GetOrigProfiles(ms Profiles) *otlpcollectorprofile.ExportProfilesServiceRequest { + return ms.orig +} + +func GetProfilesState(ms Profiles) *State { + return ms.state +} + +func SetProfilesState(ms Profiles, state State) { + *ms.state = state +} + +func NewProfiles(orig *otlpcollectorprofile.ExportProfilesServiceRequest, state *State) Profiles { + return Profiles{orig: orig, state: state} +} + +// ProfilesToProto internal helper to convert Profiles to protobuf representation. +func ProfilesToProto(l Profiles) otlpprofile.ProfilesData { + return otlpprofile.ProfilesData{ + ResourceProfiles: l.orig.ResourceProfiles, + } +} + +// ProfilesFromProto internal helper to convert protobuf representation to Profiles. +// This function set exclusive state assuming that it's called only once per Profiles. +func ProfilesFromProto(orig otlpprofile.ProfilesData) Profiles { + state := StateMutable + return NewProfiles(&otlpcollectorprofile.ExportProfilesServiceRequest{ + ResourceProfiles: orig.ResourceProfiles, + }, &state) +} diff --git a/pdata/pprofile/profiles.go b/pdata/pprofile/profiles.go new file mode 100644 index 00000000000..4a81effa3d2 --- /dev/null +++ b/pdata/pprofile/profiles.go @@ -0,0 +1,51 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pprofile // import "go.opentelemetry.io/collector/pdata/pprofile" + +import ( + "go.opentelemetry.io/collector/pdata/internal" + otlpcollectorprofile "go.opentelemetry.io/collector/pdata/internal/data/protogen/collector/profiles/v1experimental" +) + +// profiles is the top-level struct that is propagated through the profiles pipeline. +// Use NewProfiles to create new instance, zero-initialized instance is not valid for use. +type Profiles internal.Profiles + +func newProfiles(orig *otlpcollectorprofile.ExportProfilesServiceRequest) Profiles { + state := internal.StateMutable + return Profiles(internal.NewProfiles(orig, &state)) +} + +func (ms Profiles) getOrig() *otlpcollectorprofile.ExportProfilesServiceRequest { + return internal.GetOrigProfiles(internal.Profiles(ms)) +} + +func (ms Profiles) getState() *internal.State { + return internal.GetProfilesState(internal.Profiles(ms)) +} + +// NewProfiles creates a new Profiles struct. +func NewProfiles() Profiles { + return newProfiles(&otlpcollectorprofile.ExportProfilesServiceRequest{}) +} + +// IsReadOnly returns true if this ResourceProfiles instance is read-only. +func (ms Profiles) IsReadOnly() bool { + return *ms.getState() == internal.StateReadOnly +} + +// CopyTo copies the Profiles instance overriding the destination. +func (ms Profiles) CopyTo(dest Profiles) { + ms.ResourceProfiles().CopyTo(dest.ResourceProfiles()) +} + +// ResourceProfiles returns the ResourceProfilesSlice associated with this Profiles. +func (ms Profiles) ResourceProfiles() ResourceProfilesSlice { + return newResourceProfilesSlice(&ms.getOrig().ResourceProfiles, internal.GetProfilesState(internal.Profiles(ms))) +} + +// MarkReadOnly marks the ResourceProfiles as shared so that no further modifications can be done on it. +func (ms Profiles) MarkReadOnly() { + internal.SetProfilesState(internal.Profiles(ms), internal.StateReadOnly) +} diff --git a/pdata/pprofile/profiles_test.go b/pdata/pprofile/profiles_test.go new file mode 100644 index 00000000000..010637fcd31 --- /dev/null +++ b/pdata/pprofile/profiles_test.go @@ -0,0 +1,69 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pprofile + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "go.opentelemetry.io/collector/pdata/pcommon" +) + +func TestReadOnlyProfilesInvalidUsage(t *testing.T) { + profiles := NewProfiles() + assert.False(t, profiles.IsReadOnly()) + res := profiles.ResourceProfiles().AppendEmpty().Resource() + res.Attributes().PutStr("k1", "v1") + profiles.MarkReadOnly() + assert.True(t, profiles.IsReadOnly()) + assert.Panics(t, func() { res.Attributes().PutStr("k2", "v2") }) +} + +func BenchmarkProfilesUsage(b *testing.B) { + profiles := NewProfiles() + fillTestResourceProfilesSlice(profiles.ResourceProfiles()) + ts := pcommon.NewTimestampFromTime(time.Now()) + + b.ReportAllocs() + b.ResetTimer() + + for bb := 0; bb < b.N; bb++ { + for i := 0; i < profiles.ResourceProfiles().Len(); i++ { + rs := profiles.ResourceProfiles().At(i) + res := rs.Resource() + res.Attributes().PutStr("foo", "bar") + v, ok := res.Attributes().Get("foo") + assert.True(b, ok) + assert.Equal(b, "bar", v.Str()) + v.SetStr("new-bar") + assert.Equal(b, "new-bar", v.Str()) + res.Attributes().Remove("foo") + for j := 0; j < rs.ScopeProfiles().Len(); j++ { + iss := rs.ScopeProfiles().At(j) + iss.Scope().SetName("new_test_name") + assert.Equal(b, "new_test_name", iss.Scope().Name()) + for k := 0; k < iss.Profiles().Len(); k++ { + s := iss.Profiles().At(k) + s.ProfileID().FromRaw([]byte("profile_id")) + assert.Equal(b, "profile_id", string(s.ProfileID().AsRaw())) + s.SetStartTime(ts) + assert.Equal(b, ts, s.StartTime()) + s.SetEndTime(ts) + assert.Equal(b, ts, s.EndTime()) + } + s := iss.Profiles().AppendEmpty() + s.ProfileID().FromRaw([]byte("new_profile_id")) + s.SetStartTime(ts) + s.SetEndTime(ts) + s.Attributes().PutStr("foo1", "bar1") + s.Attributes().PutStr("foo2", "bar2") + iss.Profiles().RemoveIf(func(lr ProfileContainer) bool { + return string(lr.ProfileID().AsRaw()) == "new_profile_id" + }) + } + } + } +} diff --git a/pdata/testdata/go.mod b/pdata/testdata/go.mod index b310727a48f..dd15ae52815 100644 --- a/pdata/testdata/go.mod +++ b/pdata/testdata/go.mod @@ -2,7 +2,10 @@ module go.opentelemetry.io/collector/pdata/testdata go 1.21.0 -require go.opentelemetry.io/collector/pdata v1.10.0 +require ( + go.opentelemetry.io/collector/pdata v1.10.0 + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 +) require ( github.com/gogo/protobuf v1.3.2 // indirect @@ -19,3 +22,5 @@ require ( ) replace go.opentelemetry.io/collector/pdata => ../ + +replace go.opentelemetry.io/collector/pdata/pprofile => ../pprofile diff --git a/pdata/testdata/profile.go b/pdata/testdata/profile.go new file mode 100644 index 00000000000..04df7cc06f8 --- /dev/null +++ b/pdata/testdata/profile.go @@ -0,0 +1,46 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testdata // import "go.opentelemetry.io/collector/pdata/testdata" + +import ( + "time" + + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pprofile" +) + +var ( + profileStartTimestamp = pcommon.NewTimestampFromTime(time.Date(2020, 2, 11, 20, 26, 12, 321, time.UTC)) + profileEndTimestamp = pcommon.NewTimestampFromTime(time.Date(2020, 2, 11, 20, 26, 13, 789, time.UTC)) +) + +// GenerateProfiles generates dummy profiling data for tests +func GenerateProfiles(profilesCount int) pprofile.Profiles { + td := pprofile.NewProfiles() + initResource(td.ResourceProfiles().AppendEmpty().Resource()) + ss := td.ResourceProfiles().At(0).ScopeProfiles().AppendEmpty().Profiles() + ss.EnsureCapacity(profilesCount) + for i := 0; i < profilesCount; i++ { + switch i % 2 { + case 0: + fillProfileOne(ss.AppendEmpty()) + case 1: + fillProfileTwo(ss.AppendEmpty()) + } + } + return td +} + +func fillProfileOne(profile pprofile.ProfileContainer) { + profile.ProfileID().FromRaw([]byte("profileA")) + profile.SetStartTime(profileStartTimestamp) + profile.SetEndTime(profileEndTimestamp) + profile.SetDroppedAttributesCount(1) +} + +func fillProfileTwo(profile pprofile.ProfileContainer) { + profile.ProfileID().FromRaw([]byte("profileB")) + profile.SetStartTime(profileStartTimestamp) + profile.SetEndTime(profileEndTimestamp) +} diff --git a/processor/batchprocessor/go.mod b/processor/batchprocessor/go.mod index 5b9cdc0af1d..82ae287c710 100644 --- a/processor/batchprocessor/go.mod +++ b/processor/batchprocessor/go.mod @@ -44,6 +44,7 @@ require ( github.com/prometheus/common v0.54.0 // indirect github.com/prometheus/procfs v0.15.0 // indirect go.opentelemetry.io/collector/featuregate v1.10.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect go.opentelemetry.io/otel/sdk v1.27.0 // indirect go.uber.org/multierr v1.11.0 // indirect @@ -78,3 +79,5 @@ retract ( ) replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/configtelemetry + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/processor/go.mod b/processor/go.mod index 97acff2356d..d202175e947 100644 --- a/processor/go.mod +++ b/processor/go.mod @@ -34,6 +34,7 @@ require ( github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.54.0 // indirect github.com/prometheus/procfs v0.15.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect go.opentelemetry.io/otel/sdk v1.27.0 // indirect go.uber.org/multierr v1.11.0 // indirect @@ -60,4 +61,6 @@ replace go.opentelemetry.io/collector/pdata => ../pdata replace go.opentelemetry.io/collector/pdata/testdata => ../pdata/testdata +replace go.opentelemetry.io/collector/pdata/pprofile => ../pdata/pprofile + replace go.opentelemetry.io/collector/config/configtelemetry => ../config/configtelemetry diff --git a/processor/memorylimiterprocessor/go.mod b/processor/memorylimiterprocessor/go.mod index 69b5c61fa77..742ec39145c 100644 --- a/processor/memorylimiterprocessor/go.mod +++ b/processor/memorylimiterprocessor/go.mod @@ -45,6 +45,7 @@ require ( github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opentelemetry.io/collector/config/configtelemetry v0.103.0 // indirect go.opentelemetry.io/collector/featuregate v1.10.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/collector/pdata/testdata v0.103.0 // indirect go.opentelemetry.io/otel v1.27.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect @@ -85,3 +86,5 @@ retract ( ) replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/configtelemetry + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/receiver/go.mod b/receiver/go.mod index c1a73d56abb..4df1edb183a 100644 --- a/receiver/go.mod +++ b/receiver/go.mod @@ -62,3 +62,5 @@ replace go.opentelemetry.io/collector/pdata/testdata => ../pdata/testdata retract v0.76.0 // Depends on retracted pdata v1.0.0-rc10 module replace go.opentelemetry.io/collector/config/configtelemetry => ../config/configtelemetry + +replace go.opentelemetry.io/collector/pdata/pprofile => ../pdata/pprofile diff --git a/receiver/nopreceiver/go.mod b/receiver/nopreceiver/go.mod index c034cd2f02c..f883f64c2f6 100644 --- a/receiver/nopreceiver/go.mod +++ b/receiver/nopreceiver/go.mod @@ -71,3 +71,5 @@ replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/con replace go.opentelemetry.io/collector => ../.. replace go.opentelemetry.io/collector/featuregate => ../../featuregate + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/receiver/otlpreceiver/go.mod b/receiver/otlpreceiver/go.mod index 07da9641f2d..3b24dc33d7c 100644 --- a/receiver/otlpreceiver/go.mod +++ b/receiver/otlpreceiver/go.mod @@ -61,6 +61,7 @@ require ( go.opentelemetry.io/collector/extension v0.103.0 // indirect go.opentelemetry.io/collector/extension/auth v0.103.0 // indirect go.opentelemetry.io/collector/featuregate v1.10.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/contrib/config v0.7.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect @@ -128,3 +129,5 @@ retract ( v0.76.0 // Depends on retracted pdata v1.0.0-rc10 module, use v0.76.1 v0.69.0 // Release failed, use v0.69.1 ) + +replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile diff --git a/service/go.mod b/service/go.mod index f5367ba0e72..24d125be540 100644 --- a/service/go.mod +++ b/service/go.mod @@ -84,6 +84,7 @@ require ( go.opentelemetry.io/collector/config/configtls v0.103.0 // indirect go.opentelemetry.io/collector/config/internal v0.103.0 // indirect go.opentelemetry.io/collector/extension/auth v0.103.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.103.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect go.opentelemetry.io/contrib/zpages v0.52.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect @@ -146,3 +147,5 @@ replace go.opentelemetry.io/collector/config/internal => ../config/internal replace go.opentelemetry.io/collector/config/configtls => ../config/configtls replace go.opentelemetry.io/collector/config/configcompression => ../config/configcompression + +replace go.opentelemetry.io/collector/pdata/pprofile => ../pdata/pprofile