This commit is contained in:
2025-11-06 16:25:33 +01:00
commit a6876f9f0b
15 changed files with 1611 additions and 0 deletions
+224
View File
@@ -0,0 +1,224 @@
package main
import (
"bytes"
"context"
"fmt"
"log"
"net/http"
"time"
"go.opentelemetry.io/collector/pdata/pcommon"
"go.opentelemetry.io/collector/pdata/plog"
"go.opentelemetry.io/collector/pdata/pmetric"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
"go.opentelemetry.io/otel/trace"
)
func main() {
ctx := context.Background()
fmt.Println("Testing OTLP Debug Receiver...")
fmt.Println("Make sure the receiver is running on ports 8080 (HTTP) and 4317 (gRPC)")
fmt.Println()
// Test HTTP endpoint
fmt.Println("Testing HTTP endpoint...")
testHTTPTraces(ctx)
time.Sleep(1 * time.Second)
// Test gRPC endpoint
fmt.Println("Testing gRPC endpoint...")
testGRPCTraces(ctx)
time.Sleep(1 * time.Second)
// Test HTTP metrics
fmt.Println("Testing HTTP metrics...")
testHTTPMetrics()
time.Sleep(1 * time.Second)
// Test HTTP logs
fmt.Println("Testing HTTP logs...")
testHTTPLogs()
fmt.Println()
fmt.Println("Test completed! Check the receiver logs and web interface at http://localhost:8080")
fmt.Println("You should see traces, metrics, and logs from both HTTP and gRPC clients.")
}
func testHTTPTraces(ctx context.Context) {
// Create OTLP HTTP exporter
exporter, err := otlptracehttp.New(ctx,
otlptracehttp.WithEndpoint("localhost:8080"),
otlptracehttp.WithInsecure(),
)
if err != nil {
log.Fatalf("failed to create HTTP exporter: %v", err)
}
// Create tracer provider
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String("test-client-http"),
semconv.ServiceVersionKey.String("1.0.0"),
)),
)
defer func() {
if err := tp.Shutdown(ctx); err != nil {
log.Printf("failed to shutdown tracer provider: %v", err)
}
}()
otel.SetTracerProvider(tp)
// Create tracer
tracer := tp.Tracer("test-tracer")
// Create some sample spans
for i := 0; i < 3; i++ {
_, span := tracer.Start(ctx, fmt.Sprintf("http-test-span-%d", i),
trace.WithAttributes(
attribute.String("test.key", fmt.Sprintf("test-value-%d", i)),
attribute.Int("test.number", i),
),
)
// Add an event
span.AddEvent("test event", trace.WithAttributes(
attribute.String("event.key", "event.value"),
))
// Simulate some work
time.Sleep(10 * time.Millisecond)
span.End()
}
// Force flush
if err := tp.ForceFlush(ctx); err != nil {
log.Printf("failed to flush: %v", err)
}
fmt.Println("HTTP traces sent successfully")
}
func testGRPCTraces(ctx context.Context) {
// Create OTLP gRPC exporter
exporter, err := otlptracegrpc.New(ctx,
otlptracegrpc.WithEndpoint("localhost:4317"),
otlptracegrpc.WithInsecure(),
)
if err != nil {
log.Fatalf("failed to create gRPC exporter: %v", err)
}
// Create tracer provider
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String("test-client-grpc"),
semconv.ServiceVersionKey.String("1.0.0"),
)),
)
defer func() {
if err := tp.Shutdown(ctx); err != nil {
log.Printf("failed to shutdown tracer provider: %v", err)
}
}()
otel.SetTracerProvider(tp)
// Create tracer
tracer := tp.Tracer("test-tracer-grpc")
// Create some sample spans
for i := 0; i < 3; i++ {
_, span := tracer.Start(ctx, fmt.Sprintf("grpc-test-span-%d", i),
trace.WithAttributes(
attribute.String("test.key", fmt.Sprintf("grpc-test-value-%d", i)),
attribute.Int("test.number", i*10),
),
)
// Add an event
span.AddEvent("grpc test event", trace.WithAttributes(
attribute.String("grpc.event.key", "grpc.event.value"),
))
// Simulate some work
time.Sleep(10 * time.Millisecond)
span.End()
}
// Force flush
if err := tp.ForceFlush(ctx); err != nil {
log.Printf("failed to flush: %v", err)
}
fmt.Println("gRPC traces sent successfully")
}
func testHTTPMetrics() {
md := pmetric.NewMetrics()
resourceMetrics := md.ResourceMetrics().AppendEmpty()
resourceMetrics.Resource().Attributes().PutStr("service.name", "test-client-metric")
scopeMetrics := resourceMetrics.ScopeMetrics().AppendEmpty()
scopeMetrics.Scope().SetName("test-meter")
metric := scopeMetrics.Metrics().AppendEmpty()
metric.SetName("test_counter")
gauge := metric.SetEmptyGauge()
dataPoint := gauge.DataPoints().AppendEmpty()
dataPoint.SetIntValue(42)
dataPoint.Attributes().PutStr("test.key", "test-value")
marshaler := &pmetric.ProtoMarshaler{}
buf, err := marshaler.MarshalMetrics(md)
if err != nil {
log.Printf("failed to marshal metrics: %v", err)
return
}
resp, err := http.Post("http://localhost:8080/v1/metrics", "application/x-protobuf", bytes.NewReader(buf))
if err != nil {
log.Printf("failed to post metrics: %v", err)
return
}
resp.Body.Close()
fmt.Println("HTTP metrics sent successfully")
}
func testHTTPLogs() {
ld := plog.NewLogs()
resourceLogs := ld.ResourceLogs().AppendEmpty()
resourceLogs.Resource().Attributes().PutStr("service.name", "test-client-log")
scopeLogs := resourceLogs.ScopeLogs().AppendEmpty()
scopeLogs.Scope().SetName("test-logger")
logRecord := scopeLogs.LogRecords().AppendEmpty()
logRecord.Body().SetStr("test log message")
logRecord.SetTimestamp(pcommon.NewTimestampFromTime(time.Now()))
logRecord.Attributes().PutStr("test.key", "test-value")
marshaler := &plog.ProtoMarshaler{}
buf, err := marshaler.MarshalLogs(ld)
if err != nil {
log.Printf("failed to marshal logs: %v", err)
return
}
resp, err := http.Post("http://localhost:8080/v1/logs", "application/x-protobuf", bytes.NewReader(buf))
if err != nil {
log.Printf("failed to post logs: %v", err)
return
}
resp.Body.Close()
fmt.Println("HTTP logs sent successfully")
}