Skip to content

Commit a4a7a81

Browse files
committed
introduce size
1 parent 2761907 commit a4a7a81

File tree

8 files changed

+462
-141
lines changed

8 files changed

+462
-141
lines changed

README.md

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,10 @@ docker run --rm otelgen logs \
126126
| `--service` | Service name for telemetry | otelgen | No |
127127
| `--rate` | Number of telemetry items per second | 1 | No |
128128
| `--duration` | How long to generate telemetry (e.g., 10s, 1m, 1h) | 10s | No |
129-
| `--insecure` | Use insecure connection (not implemented yet) | false | No |
129+
| `--size` | Payload size to increase data volume (e.g., 1kb, 1mb, 500b) | - | No |
130+
| `--headers` | Additional headers (e.g., key1=value1,key2=value2) | - | No |
131+
| `--verbose` | Enable verbose logging | false | No |
132+
| `--insecure-skip-verify` | Skip TLS certificate verification (insecure) | false | No |
130133

131134
## Protocol Support
132135

@@ -154,6 +157,15 @@ If you don't specify a port in the endpoint URL, the following defaults are used
154157

155158
# Production endpoint test
156159
./otelgen logs --otlp-endpoint grpcs://prod.example.com:443 --service prod-app --rate 10 --duration 30s
160+
161+
# Test with increased payload size (1KB per trace)
162+
./otelgen traces --otlp-endpoint grpc://localhost --service test-app --size 1kb --duration 10s
163+
164+
# Load test with large payloads (1MB per metric)
165+
./otelgen metrics --otlp-endpoint http://localhost:80 --service load-test --size 1mb --rate 10 --duration 30s
166+
167+
# Test with custom payload size (500 bytes)
168+
./otelgen logs --otlp-endpoint grpcs://example.com:443 --service test-app --size 500b --rate 5 --duration 1m
157169
```
158170

159171
## What Gets Generated
@@ -162,13 +174,59 @@ If you don't specify a port in the endpoint URL, the following defaults are used
162174
- Parent spans with child spans
163175
- Random operation types and IDs
164176
- Realistic timing and nesting
177+
- Optional payload padding via attributes when `--size` is specified
165178

166179
### Metrics
167180
- Counter: `otelgen.requests`
168181
- Histogram: `otelgen.duration`
169182
- Gauge: `otelgen.cpu_usage`
183+
- Optional payload padding via attributes when `--size` is specified
170184

171185
### Logs
172-
- Various log levels (INFO, WARN, ERROR, DEBUG)
173-
- Realistic log messages
174-
- Additional attributes (component, request_id, user_id)
186+
- Proper OTLP log records with resource attributes
187+
- Various log levels (INFO, WARN, ERROR, DEBUG) mapped to appropriate severity
188+
- Log body contains realistic JSON structured data including:
189+
- Timestamp, service name, environment, version
190+
- HTTP request details (method, endpoint, status code, duration, user agent, client IP)
191+
- User information (ID, email, role, organization)
192+
- Error details with stack traces (for ERROR level)
193+
- Database query metrics (30% of logs)
194+
- Additional attributes: component, request_id, user_id
195+
- When `--size` is specified, the JSON body is expanded to reach target size
196+
197+
#### Sample Log Output
198+
```json
199+
{
200+
"timestamp": "2025-01-23T10:15:30.123456789Z",
201+
"level": "INFO",
202+
"message": "Request processed successfully",
203+
"service": "api-gateway",
204+
"environment": "production",
205+
"version": "v1.2.3",
206+
"host": "server-3",
207+
"pod_id": "pod-42-aBcDeFgH",
208+
"request_id": "req-XyZ123AbC456-1737628530",
209+
"trace_id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
210+
"span_id": "q1w2e3r4t5y6u7i8",
211+
"http": {
212+
"method": "POST",
213+
"endpoint": "/api/v1/orders",
214+
"status_code": 201,
215+
"duration_ms": 234,
216+
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
217+
"client_ip": "10.142.15.89"
218+
},
219+
"user": {
220+
"id": "user_1234",
221+
"email": "user1234@example.com",
222+
"role": "user",
223+
"org_id": "org_56"
224+
},
225+
"database": {
226+
"query_time_ms": 45,
227+
"rows_affected": 1,
228+
"connection_id": 23,
229+
"database": "orders_db"
230+
}
231+
}
232+
```

cmd/otelgen/main.go

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ var (
2222
serviceName string
2323
rate int
2424
duration string
25+
size string
2526
headers map[string]string
2627
verbose bool
2728
insecureSkip bool
@@ -39,6 +40,7 @@ func main() {
3940
cmd.Flags().StringVar(&serviceName, "service", "otelgen", "Service name")
4041
cmd.Flags().IntVar(&rate, "rate", 1, "Rate of telemetry generation per second")
4142
cmd.Flags().StringVar(&duration, "duration", "10s", "Duration to generate telemetry (e.g., 10s, 1m)")
43+
cmd.Flags().StringVar(&size, "size", "", "Payload size (e.g., 1kb, 1mb, 500b)")
4244
cmd.Flags().StringToStringVar(&headers, "headers", nil, "Additional headers (e.g., key1=value1,key2=value2)")
4345
cmd.Flags().BoolVar(&verbose, "verbose", false, "Enable verbose logging")
4446
cmd.Flags().BoolVar(&insecureSkip, "insecure-skip-verify", false, "Skip TLS certificate verification (insecure)")
@@ -83,11 +85,19 @@ func runTraces(cmd *cobra.Command, args []string) error {
8385
return fmt.Errorf("invalid endpoint: %w", err)
8486
}
8587

88+
payloadSize, err := otelgen.ParseSize(size)
89+
if err != nil {
90+
return fmt.Errorf("invalid size: %w", err)
91+
}
92+
8693
if verbose {
8794
fmt.Printf("Endpoint: %s\n", endpoint.String())
8895
fmt.Printf("Service: %s\n", serviceName)
8996
fmt.Printf("Rate: %d/s\n", rate)
9097
fmt.Printf("Duration: %s\n", duration)
98+
if payloadSize > 0 {
99+
fmt.Printf("Payload Size: %d bytes\n", payloadSize)
100+
}
91101
fmt.Printf("Secure: %v\n", endpoint.Secure)
92102
fmt.Printf("Protocol: %s\n", endpoint.Protocol)
93103
fmt.Printf("Insecure Skip Verify: %v\n", insecureSkip)
@@ -100,7 +110,7 @@ func runTraces(cmd *cobra.Command, args []string) error {
100110
fmt.Printf("Generating traces to %s for service %s at %d/s for %s\n",
101111
endpoint.String(), serviceName, rate, duration)
102112

103-
return otelgen.GenerateTraces(endpoint, serviceName, rate, duration, headers, verbose, insecureSkip)
113+
return otelgen.GenerateTraces(endpoint, serviceName, rate, duration, payloadSize, headers, verbose, insecureSkip)
104114
}
105115

106116
func runMetrics(cmd *cobra.Command, args []string) error {
@@ -109,11 +119,19 @@ func runMetrics(cmd *cobra.Command, args []string) error {
109119
return fmt.Errorf("invalid endpoint: %w", err)
110120
}
111121

122+
payloadSize, err := otelgen.ParseSize(size)
123+
if err != nil {
124+
return fmt.Errorf("invalid size: %w", err)
125+
}
126+
112127
if verbose {
113128
fmt.Printf("Endpoint: %s\n", endpoint.String())
114129
fmt.Printf("Service: %s\n", serviceName)
115130
fmt.Printf("Rate: %d/s\n", rate)
116131
fmt.Printf("Duration: %s\n", duration)
132+
if payloadSize > 0 {
133+
fmt.Printf("Payload Size: %d bytes\n", payloadSize)
134+
}
117135
fmt.Printf("Secure: %v\n", endpoint.Secure)
118136
fmt.Printf("Protocol: %s\n", endpoint.Protocol)
119137
fmt.Printf("Insecure Skip Verify: %v\n", insecureSkip)
@@ -126,7 +144,7 @@ func runMetrics(cmd *cobra.Command, args []string) error {
126144
fmt.Printf("Generating metrics to %s for service %s at %d/s for %s\n",
127145
endpoint.String(), serviceName, rate, duration)
128146

129-
return otelgen.GenerateMetrics(endpoint, serviceName, rate, duration, headers, verbose, insecureSkip)
147+
return otelgen.GenerateMetrics(endpoint, serviceName, rate, duration, payloadSize, headers, verbose, insecureSkip)
130148
}
131149

132150
func runLogs(cmd *cobra.Command, args []string) error {
@@ -135,11 +153,19 @@ func runLogs(cmd *cobra.Command, args []string) error {
135153
return fmt.Errorf("invalid endpoint: %w", err)
136154
}
137155

156+
payloadSize, err := otelgen.ParseSize(size)
157+
if err != nil {
158+
return fmt.Errorf("invalid size: %w", err)
159+
}
160+
138161
if verbose {
139162
fmt.Printf("Endpoint: %s\n", endpoint.String())
140163
fmt.Printf("Service: %s\n", serviceName)
141164
fmt.Printf("Rate: %d/s\n", rate)
142165
fmt.Printf("Duration: %s\n", duration)
166+
if payloadSize > 0 {
167+
fmt.Printf("Payload Size: %d bytes\n", payloadSize)
168+
}
143169
fmt.Printf("Secure: %v\n", endpoint.Secure)
144170
fmt.Printf("Protocol: %s\n", endpoint.Protocol)
145171
fmt.Printf("Insecure Skip Verify: %v\n", insecureSkip)
@@ -152,5 +178,5 @@ func runLogs(cmd *cobra.Command, args []string) error {
152178
fmt.Printf("Generating logs to %s for service %s at %d/s for %s\n",
153179
endpoint.String(), serviceName, rate, duration)
154180

155-
return otelgen.GenerateLogs(endpoint, serviceName, rate, duration, headers, verbose, insecureSkip)
181+
return otelgen.GenerateLogs(endpoint, serviceName, rate, duration, payloadSize, headers, verbose, insecureSkip)
156182
}

go.mod

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,41 @@
11
module github.com/edgedelta/otelgen
22

3-
go 1.21
3+
go 1.23.0
44

55
require (
66
github.com/spf13/cobra v1.8.0
7-
go.opentelemetry.io/otel v1.24.0
7+
go.opentelemetry.io/otel v1.38.0
8+
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0
9+
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0
810
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.24.0
911
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.24.0
1012
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0
1113
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0
12-
go.opentelemetry.io/otel/metric v1.24.0
13-
go.opentelemetry.io/otel/sdk v1.24.0
14-
go.opentelemetry.io/otel/sdk/metric v1.24.0
15-
go.opentelemetry.io/otel/trace v1.24.0
16-
google.golang.org/grpc v1.62.0
14+
go.opentelemetry.io/otel/log v0.14.0
15+
go.opentelemetry.io/otel/metric v1.38.0
16+
go.opentelemetry.io/otel/sdk v1.38.0
17+
go.opentelemetry.io/otel/sdk/log v0.14.0
18+
go.opentelemetry.io/otel/sdk/metric v1.38.0
19+
go.opentelemetry.io/otel/trace v1.38.0
20+
google.golang.org/grpc v1.75.0
1721
)
1822

1923
require (
2024
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
21-
github.com/go-logr/logr v1.4.1 // indirect
25+
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
26+
github.com/go-logr/logr v1.4.3 // indirect
2227
github.com/go-logr/stdr v1.2.2 // indirect
23-
github.com/golang/protobuf v1.5.3 // indirect
24-
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect
28+
github.com/google/uuid v1.6.0 // indirect
29+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect
2530
github.com/inconshreveable/mousetrap v1.1.0 // indirect
2631
github.com/spf13/pflag v1.0.5 // indirect
32+
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
2733
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect
28-
go.opentelemetry.io/proto/otlp v1.1.0 // indirect
29-
golang.org/x/net v0.20.0 // indirect
30-
golang.org/x/sys v0.17.0 // indirect
31-
golang.org/x/text v0.14.0 // indirect
32-
google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect
33-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect
34-
google.golang.org/protobuf v1.32.0 // indirect
34+
go.opentelemetry.io/proto/otlp v1.7.1 // indirect
35+
golang.org/x/net v0.43.0 // indirect
36+
golang.org/x/sys v0.35.0 // indirect
37+
golang.org/x/text v0.28.0 // indirect
38+
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect
39+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect
40+
google.golang.org/protobuf v1.36.8 // indirect
3541
)

0 commit comments

Comments
 (0)