Skip to content

Commit 2ecd0b7

Browse files
Add documentation example for receiver package (open-telemetry#5675) (open-telemetry#12922)
#### Description This PR introduces a testable example to the package [receiver](/receiver). it's a similar example to the documentation one on https://opentelemetry.io/docs/collector/building/receiver/#designing-and-validating-receiver-settings #### Issue: open-telemetry#5675 (comment) #### Testing the testable example was executed successfully ![image](https://github.com/user-attachments/assets/47454f60-25d8-411b-a78f-c3e855dfd04f) #### Documentation this testable example follows https://go.dev/blog/examples#larger-examples format and should be automatically added to `receiver` package documentation --------- Co-authored-by: Pablo Baeyens <[email protected]>
1 parent ff60f5b commit 2ecd0b7

File tree

2 files changed

+136
-1
lines changed

2 files changed

+136
-1
lines changed

receiver/example_test.go

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package receiver_test
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"time"
10+
11+
"go.opentelemetry.io/collector/component"
12+
"go.opentelemetry.io/collector/consumer"
13+
"go.opentelemetry.io/collector/pdata/pcommon"
14+
"go.opentelemetry.io/collector/pdata/ptrace"
15+
"go.opentelemetry.io/collector/receiver"
16+
)
17+
18+
var typeStr = component.MustNewType("example")
19+
20+
type exampleConfig struct {
21+
Interval time.Duration
22+
}
23+
24+
// Reciver must implement the Start() and Shutdown() methods so the receiver type can be compliant
25+
// with the receiver.Traces interface.
26+
type exampleReceiver struct {
27+
host component.Host
28+
cancel context.CancelFunc
29+
nextConsumer consumer.Traces
30+
config exampleConfig
31+
}
32+
33+
func (rcvr *exampleReceiver) Start(ctx context.Context, host component.Host) error {
34+
rcvr.host = host
35+
ctx, rcvr.cancel = context.WithCancel(ctx)
36+
37+
go func() {
38+
ticker := time.NewTicker(rcvr.config.Interval)
39+
defer ticker.Stop()
40+
41+
for {
42+
select {
43+
case <-ticker.C:
44+
// Your receiver processing code should come here
45+
err := rcvr.nextConsumer.ConsumeTraces(ctx, generateTrace())
46+
if err != nil {
47+
fmt.Println("Error when consuming trace: %w", err)
48+
}
49+
case <-ctx.Done():
50+
return
51+
}
52+
}
53+
}()
54+
55+
return nil
56+
}
57+
58+
func (rcvr *exampleReceiver) Shutdown(_ context.Context) error {
59+
if rcvr.cancel != nil {
60+
rcvr.cancel()
61+
}
62+
return nil
63+
}
64+
65+
func generateTrace() ptrace.Traces {
66+
traces := ptrace.NewTraces()
67+
68+
// In reallity you may need to fetch or receive and transform
69+
// some telemetry data.
70+
// For this example we will just generate some dummy data
71+
resourceSpan := traces.ResourceSpans().AppendEmpty()
72+
resource := resourceSpan.Resource()
73+
74+
attrs := resource.Attributes()
75+
attrs.PutInt("id", 1)
76+
77+
scopeSpans := resourceSpan.ScopeSpans().AppendEmpty()
78+
scopeSpans.Scope().SetName("example-system")
79+
scopeSpans.Scope().SetVersion("v1.0")
80+
81+
traceID := pcommon.TraceID([]byte("1"))
82+
spanID := pcommon.SpanID([]byte("2"))
83+
84+
span := scopeSpans.Spans().AppendEmpty()
85+
span.SetTraceID(traceID)
86+
span.SetSpanID(spanID)
87+
span.SetName("Operation 1")
88+
span.SetKind(ptrace.SpanKindClient)
89+
span.Status().SetCode(ptrace.StatusCodeOk)
90+
span.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now()))
91+
span.SetEndTimestamp(pcommon.NewTimestampFromTime(time.Now().Add(4 * time.Millisecond)))
92+
93+
// Other resources and spans could also be added.
94+
95+
return traces
96+
}
97+
98+
func createDefaultConfig() component.Config {
99+
return &exampleConfig{
100+
Interval: time.Minute,
101+
}
102+
}
103+
104+
func createExampleReceiver(_ context.Context, _ receiver.Settings,
105+
baseCfg component.Config, consumer consumer.Traces,
106+
) (receiver.Traces, error) {
107+
exampleCfg := baseCfg.(*exampleConfig)
108+
109+
rcvr := &exampleReceiver{
110+
nextConsumer: consumer,
111+
config: *exampleCfg,
112+
}
113+
114+
return rcvr, nil
115+
}
116+
117+
func NewFactory() receiver.Factory {
118+
return receiver.NewFactory(
119+
typeStr,
120+
createDefaultConfig,
121+
receiver.WithTraces(createExampleReceiver, component.StabilityLevelAlpha))
122+
}
123+
124+
func Example() {
125+
// The NewFactory method can then be used on the Collector's initialization process
126+
// on your components.go file.
127+
128+
// In this example we will just instantiate and print it's type
129+
130+
exampleReceiver := NewFactory()
131+
fmt.Println(exampleReceiver.Type())
132+
133+
// Output:
134+
// example
135+
}

receiver/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require (
77
go.opentelemetry.io/collector/component v1.31.0
88
go.opentelemetry.io/collector/consumer v1.31.0
99
go.opentelemetry.io/collector/consumer/consumertest v0.125.0
10+
go.opentelemetry.io/collector/pdata v1.31.0
1011
go.opentelemetry.io/collector/pipeline v0.125.0
1112
go.uber.org/goleak v1.3.0
1213
)
@@ -26,7 +27,6 @@ require (
2627
go.opentelemetry.io/collector/consumer/xconsumer v0.125.0 // indirect
2728
go.opentelemetry.io/collector/featuregate v1.31.0 // indirect
2829
go.opentelemetry.io/collector/internal/telemetry v0.125.0 // indirect
29-
go.opentelemetry.io/collector/pdata v1.31.0 // indirect
3030
go.opentelemetry.io/collector/pdata/pprofile v0.125.0 // indirect
3131
go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 // indirect
3232
go.opentelemetry.io/otel v1.35.0 // indirect

0 commit comments

Comments
 (0)