Skip to content

Commit 738866f

Browse files
committed
New otelcol.exporter.debug component
1 parent f998c10 commit 738866f

File tree

13 files changed

+450
-0
lines changed

13 files changed

+450
-0
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ Main (unreleased)
3636

3737
- Added live debugging support for `prometheus.relabel`. (@wildum)
3838

39+
- A new `otelcol.exporter.debug` component for printing OTel telemetry from
40+
other `otelcol` components to the console. (@BarunKGP)
41+
3942
### Enhancements
4043

4144
- (_Public preview_) Add native histogram support to `otelcol.receiver.prometheus`. (@wildum)

docs/sources/reference/compatibility/_index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ The following components, grouped by namespace, _export_ OpenTelemetry `otelcol.
286286
- [otelcol.connector.spanlogs](../components/otelcol.connector.spanlogs)
287287
- [otelcol.connector.spanmetrics](../components/otelcol.connector.spanmetrics)
288288
- [otelcol.exporter.awss3](../components/otelcol.exporter.awss3)
289+
- [otelcol.exporter.debug](../components/otelcol.exporter.debug)
289290
- [otelcol.exporter.kafka](../components/otelcol.exporter.kafka)
290291
- [otelcol.exporter.loadbalancing](../components/otelcol.exporter.loadbalancing)
291292
- [otelcol.exporter.logging](../components/otelcol.exporter.logging)
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
---
2+
canonical: https://grafana.com/docs/alloy/latest/reference/components/otelcol.exporter.debug/
3+
description: Learn about otelcol.exporter.debug
4+
title: otelcol.exporter.debug
5+
---
6+
7+
<span class="badge docs-labels__stage docs-labels__item">Experimental</span>
8+
9+
# otelcol.exporter.debug
10+
11+
`otelcol.exporter.debug` accepts telemetry data from other `otelcol` components and writes them to the console (stderr).
12+
You can control the verbosity of the logs.
13+
14+
{{< admonition type="note" >}}
15+
`otelcol.exporter.debug` is a wrapper over the upstream OpenTelemetry Collector `debug` exporter.
16+
If necessary, bug reports or feature requests are redirected to the upstream repository.
17+
{{< /admonition >}}
18+
19+
Multiple `otelcol.exporter.debug` components can be specified by giving them different labels.
20+
21+
## Usage
22+
23+
```river
24+
otelcol.exporter.debug "LABEL" { }
25+
```
26+
27+
## Arguments
28+
29+
`otelcol.exporter.debug` supports the following arguments:
30+
31+
Name | Type | Description | Default | Required
32+
---- | ---- | ----------- | ------- | --------
33+
`verbosity` | `string` | Verbosity of the generated logs. | `"normal"` | no
34+
`sampling_initial` | `int` | Number of messages initially logged each second. | `2` | no
35+
`sampling_thereafter` | `int` | Sampling rate after the initial messages are logged. | `500` | no
36+
37+
The `verbosity` argument must be one of:
38+
* `"basic"`: A single-line summary of received data is logged to stderr, with a total count of telemetry records for every batch of received logs, metrics or traces.
39+
* `"normal"`: Currently, this produces the same output as `"basic"` verbosity.
40+
* `"detailed"`: All details of every telemetry record are logged to stderr, typically writing multiple lines for every telemetry record.
41+
42+
Example of `"basic"` and `"normal"` output:
43+
```
44+
ts=2024-06-13T11:24:13.782957Z level=info msg=TracesExporter component_path=/ component_id=otelcol.exporter.debug.default "resource spans": 1, spans: 2
45+
```
46+
47+
Example of `"detailed"` output:
48+
```
49+
ts=2024-06-13T11:24:13.782957Z level=info msg=TracesExporter component_path=/ component_id=otelcol.exporter.debug.default "resource spans"=1 spans=2
50+
ts=2024-06-13T11:24:13.783101Z level=info msg="ResourceSpans #0
51+
Resource SchemaURL: https://opentelemetry.io/schemas/1.4.0
52+
Resource attributes:
53+
-> service.name: Str(telemetrygen)
54+
ScopeSpans #0
55+
ScopeSpans SchemaURL:
56+
InstrumentationScope telemetrygen
57+
Span #0
58+
Trace ID : 3bde5d3ee82303571bba6e1136781fe4
59+
Parent ID : 5e9dcf9bac4acc1f
60+
ID : 2cf3ef2899aba35c
61+
Name : okey-dokey
62+
Kind : Server
63+
Start time : 2023-11-11 04:49:03.509369393 +0000 UTC
64+
End time : 2023-11-11 04:49:03.50949377 +0000 UTC
65+
Status code : Unset
66+
Status message :
67+
Attributes:
68+
-> net.peer.ip: Str(1.2.3.4)
69+
-> peer.service: Str(telemetrygen-client)
70+
Span #1
71+
Trace ID : 3bde5d3ee82303571bba6e1136781fe4
72+
Parent ID :
73+
ID : 5e9dcf9bac4acc1f
74+
Name : lets-go
75+
Kind : Client
76+
Start time : 2023-11-11 04:49:03.50935117 +0000 UTC
77+
End time : 2023-11-11 04:49:03.50949377 +0000 UTC
78+
Status code : Unset
79+
Status message :
80+
Attributes:
81+
-> net.peer.ip: Str(1.2.3.4)
82+
-> peer.service: Str(telemetrygen-server)
83+
{"kind": "exporter", "data_type": "traces", "name": "debug"}"
84+
```
85+
86+
Note that the above `"detailed"` example was edited to replace all instances of `\n` with a new line.
87+
88+
## Blocks
89+
90+
The following blocks are supported inside the definition of
91+
`otelcol.exporter.debug`:
92+
93+
Hierarchy | Block | Description | Required
94+
--------------|-------------------|----------------------------------------------------------------------------|---------
95+
debug_metrics | [debug_metrics][] | Configures the metrics that this component generates to monitor its state. | no
96+
97+
The `>` symbol indicates deeper levels of nesting. For example, `client > tls`
98+
refers to a `tls` block defined inside a `client` block.
99+
100+
[debug_metrics]: #debug_metrics-block
101+
102+
### debug_metrics block
103+
104+
{{< docs/shared lookup="reference/components/otelcol-debug-metrics-block.md" source="alloy" version="<ALLOY_VERSION>" >}}
105+
106+
## Exported fields
107+
108+
The following fields are exported and can be referenced by other components:
109+
110+
Name | Type | Description
111+
---- | ---- | -----------
112+
`input` | `otelcol.Consumer` | A value that other components can use to send telemetry data to.
113+
114+
`input` accepts `otelcol.Consumer` data for any telemetry signal (metrics,
115+
logs, or traces).
116+
117+
## Component health
118+
119+
`otelcol.exporter.debug` is only reported as unhealthy if given an invalid
120+
configuration.
121+
122+
## Debug information
123+
124+
`otelcol.exporter.debug` does not expose any component-specific debug
125+
information.
126+
127+
## Example
128+
129+
This example scrapes Prometheus UNIX metrics and writes them to the console:
130+
131+
```river
132+
prometheus.exporter.unix "default" { }
133+
134+
prometheus.scrape "default" {
135+
targets = prometheus.exporter.unix.default.targets
136+
forward_to = [otelcol.receiver.prometheus.default.receiver]
137+
}
138+
139+
otelcol.receiver.prometheus "default" {
140+
output {
141+
metrics = [otelcol.exporter.debug.default.input]
142+
}
143+
}
144+
145+
otelcol.exporter.debug "default" {
146+
verbosity = "detailed"
147+
sampling_initial = 1
148+
sampling_thereafter = 1
149+
}
150+
```
151+
<!-- START GENERATED COMPATIBLE COMPONENTS -->
152+
153+
## Compatible components
154+
155+
`otelcol.exporter.debug` has exports that can be consumed by the following components:
156+
157+
- Components that consume [OpenTelemetry `otelcol.Consumer`](../../compatibility/#opentelemetry-otelcolconsumer-consumers)
158+
159+
{{< admonition type="note" >}}
160+
Connecting some components may not be sensible or components may require further configuration to make the connection work correctly.
161+
Refer to the linked documentation for more details.
162+
{{< /admonition >}}
163+
164+
<!-- END GENERATED COMPATIBLE COMPONENTS -->

docs/sources/reference/components/otelcol.exporter.logging.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ title: otelcol.exporter.logging
66

77
# otelcol.exporter.logging
88

9+
{{< admonition type="warning" >}}
10+
The OpenTelemetry Collector `logging` exporter is deprecated.
11+
It is due to be removed from the upstream Collector repository in September 2024.
12+
`otelcol.exporter.logging` may also be removed in a future Alloy version.
13+
Please use `otelcol.exporter.debug` instead.
14+
{{< /admonition >}}
15+
916
`otelcol.exporter.logging` accepts telemetry data from other `otelcol` components
1017
and writes them to the console.
1118

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ require (
195195
go.opentelemetry.io/collector/connector v0.102.1
196196
go.opentelemetry.io/collector/consumer v0.102.1
197197
go.opentelemetry.io/collector/exporter v0.102.1
198+
go.opentelemetry.io/collector/exporter/debugexporter v0.102.1
198199
go.opentelemetry.io/collector/exporter/loggingexporter v0.102.1
199200
go.opentelemetry.io/collector/exporter/otlpexporter v0.102.1
200201
go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.1

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2306,6 +2306,8 @@ go.opentelemetry.io/collector/consumer v0.102.1 h1:0CkgHhxwx4lI/m+hWjh607xyjooW5
23062306
go.opentelemetry.io/collector/consumer v0.102.1/go.mod h1:HoXqmrRV13jLnP3/Gg3fYNdRkDPoO7UW58hKiLyFF60=
23072307
go.opentelemetry.io/collector/exporter v0.102.1 h1:4VURYgBNJscxfMhZWitzcwA1cig5a6pH0xZSpdECDnM=
23082308
go.opentelemetry.io/collector/exporter v0.102.1/go.mod h1:1pmNxvrvvbWDW6PiGObICdj0eOSGV4Fzwpm5QA1GU54=
2309+
go.opentelemetry.io/collector/exporter/debugexporter v0.102.1 h1:eATGZwBNmqUn8xRr7oGQhoegjeOOCdmtbYgziUoFMf8=
2310+
go.opentelemetry.io/collector/exporter/debugexporter v0.102.1/go.mod h1:k5rDZX5pV3DsXZzvI+sk7PKMUljtB7T25PPXAPGBjEs=
23092311
go.opentelemetry.io/collector/exporter/loggingexporter v0.102.1 h1:LblufdV22DxB5NZa66CGCQZjadYTVxT+O5NR9YjNQ9Y=
23102312
go.opentelemetry.io/collector/exporter/loggingexporter v0.102.1/go.mod h1:zmOEwiQlfvEHnakWNO1YFNubgWZvZee+5Wshuck5lZk=
23112313
go.opentelemetry.io/collector/exporter/otlpexporter v0.102.1 h1:bOXE7u1iy0SKwH2mnVyIMKkvFIR9bn9iIm1Cf/CJlZU=

internal/component/all/all.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ import (
6868
_ "github.com/grafana/alloy/internal/component/otelcol/connector/spanlogs" // Import otelcol.connector.spanlogs
6969
_ "github.com/grafana/alloy/internal/component/otelcol/connector/spanmetrics" // Import otelcol.connector.spanmetrics
7070
_ "github.com/grafana/alloy/internal/component/otelcol/exporter/awss3" // Import otelcol.exporter.awss3exporter
71+
_ "github.com/grafana/alloy/internal/component/otelcol/exporter/debug" // Import otelcol.exporter.debug
7172
_ "github.com/grafana/alloy/internal/component/otelcol/exporter/kafka" // Import otelcol.exporter.kafka
7273
_ "github.com/grafana/alloy/internal/component/otelcol/exporter/loadbalancing" // Import otelcol.exporter.loadbalancing
7374
_ "github.com/grafana/alloy/internal/component/otelcol/exporter/logging" // Import otelcol.exporter.logging
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package debug
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/grafana/alloy/internal/component"
7+
"github.com/grafana/alloy/internal/component/otelcol"
8+
otelcolCfg "github.com/grafana/alloy/internal/component/otelcol/config"
9+
"github.com/grafana/alloy/internal/component/otelcol/exporter"
10+
"github.com/grafana/alloy/internal/featuregate"
11+
otelcomponent "go.opentelemetry.io/collector/component"
12+
"go.opentelemetry.io/collector/config/configtelemetry"
13+
"go.opentelemetry.io/collector/exporter/debugexporter"
14+
otelextension "go.opentelemetry.io/collector/extension"
15+
)
16+
17+
func init() {
18+
component.Register(component.Registration{
19+
Name: "otelcol.exporter.debug",
20+
Stability: featuregate.StabilityExperimental,
21+
Args: Arguments{},
22+
Exports: otelcol.ConsumerExports{},
23+
24+
Build: func(opts component.Options, args component.Arguments) (component.Component, error) {
25+
fact := debugexporter.NewFactory()
26+
return exporter.New(opts, fact, args.(Arguments), exporter.TypeAll)
27+
},
28+
})
29+
}
30+
31+
type Arguments struct {
32+
Verbosity string `alloy:"verbosity,attr,optional"`
33+
SamplingInitial int `alloy:"sampling_initial,attr,optional"`
34+
SamplingThereafter int `alloy:"sampling_thereafter,attr,optional"`
35+
36+
// DebugMetrics configures component internal metrics. Optional.
37+
DebugMetrics otelcolCfg.DebugMetricsArguments `alloy:"debug_metrics,block,optional"`
38+
}
39+
40+
func (args Arguments) convertVerbosity() (configtelemetry.Level, error) {
41+
var verbosity configtelemetry.Level
42+
switch args.Verbosity {
43+
case "basic":
44+
verbosity = configtelemetry.LevelBasic
45+
case "normal":
46+
verbosity = configtelemetry.LevelNormal
47+
case "detailed":
48+
verbosity = configtelemetry.LevelDetailed
49+
default:
50+
// Invalid verbosity
51+
// debugexporter only supports basic, normal and detailed levels
52+
return verbosity, fmt.Errorf("invalid verbosity %q", args.Verbosity)
53+
}
54+
55+
return verbosity, nil
56+
}
57+
58+
var _ exporter.Arguments = Arguments{}
59+
60+
// SetToDefault implements river.Defaulter.
61+
func (args *Arguments) SetToDefault() {
62+
*args = Arguments{
63+
Verbosity: "normal",
64+
SamplingInitial: 2,
65+
SamplingThereafter: 500,
66+
}
67+
args.DebugMetrics.SetToDefault()
68+
}
69+
70+
// Convert implements exporter.Arguments.
71+
func (args Arguments) Convert() (otelcomponent.Config, error) {
72+
verbosity, err := args.convertVerbosity()
73+
if err != nil {
74+
return nil, fmt.Errorf("error in conversion to config arguments, %v", err)
75+
}
76+
77+
return &debugexporter.Config{
78+
Verbosity: verbosity,
79+
SamplingInitial: args.SamplingInitial,
80+
SamplingThereafter: args.SamplingThereafter,
81+
}, nil
82+
}
83+
84+
// Extensions implements exporter.Arguments.
85+
func (args Arguments) Extensions() map[otelcomponent.ID]otelextension.Extension {
86+
return nil
87+
}
88+
89+
// Exporters implements exporter.Arguments.
90+
func (args Arguments) Exporters() map[otelcomponent.DataType]map[otelcomponent.ID]otelcomponent.Component {
91+
return nil
92+
}
93+
94+
// DebugMetricsConfig implements receiver.Arguments.
95+
func (args Arguments) DebugMetricsConfig() otelcolCfg.DebugMetricsArguments {
96+
return args.DebugMetrics
97+
}

0 commit comments

Comments
 (0)