mirror of
https://github.com/hanzoai/tasks.git
synced 2026-10-04 02:04:03 +00:00
## What changed? Exporting an OTEL trace file _per test case_ instead of _per test suite_. I also added a new `MemoryExporter` to make the OTEL collection more efficient and accurate. Compared to the previous approach, it acts completely in-process/in-memory; not via gRPC. ## Why? Removes successful test cases from the file output which makes the output smaller and easier to use. Also removes race condition. Also more efficient. ## How did you test it? - [ ] built - [ ] run locally and tested manually - [x] covered by existing tests - [ ] added new unit test(s) - [ ] added new functional test(s) Example: <img width="786" alt="Screenshot 2025-06-24 at 2 25 17 PM" src="https://github.com/user-attachments/assets/b3bb1916-1524-4889-be3b-57ef296b027c" />
73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package testtelemetry
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net"
|
|
"sync"
|
|
"testing"
|
|
|
|
ctrace "go.opentelemetry.io/proto/otlp/collector/trace/v1"
|
|
trace "go.opentelemetry.io/proto/otlp/trace/v1"
|
|
"go.temporal.io/server/common/testing/freeport"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
var _ ctrace.TraceServiceServer = (*MemoryCollector)(nil)
|
|
|
|
// MemoryCollector is a gRPC-based OTEL collector that collects spans in memory.
|
|
type MemoryCollector struct {
|
|
ctrace.UnimplementedTraceServiceServer
|
|
addr string
|
|
spansLock sync.RWMutex
|
|
spans []*trace.ResourceSpans
|
|
}
|
|
|
|
func StartMemoryCollector(tb testing.TB) (*MemoryCollector, error) {
|
|
grpcServer := grpc.NewServer()
|
|
l := &MemoryCollector{
|
|
addr: fmt.Sprintf("localhost:%d", freeport.MustGetFreePort()),
|
|
}
|
|
ctrace.RegisterTraceServiceServer(grpcServer, l)
|
|
|
|
listener, err := net.Listen("tcp", l.addr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
go func() {
|
|
if err := grpcServer.Serve(listener); err != nil {
|
|
tb.Errorf("OTEL logger failed to start: %v", err)
|
|
}
|
|
}()
|
|
|
|
go func() {
|
|
<-tb.Context().Done()
|
|
grpcServer.Stop()
|
|
}()
|
|
|
|
return l, nil
|
|
}
|
|
|
|
func (l *MemoryCollector) Addr() string {
|
|
return "http://" + l.addr
|
|
}
|
|
|
|
func (l *MemoryCollector) Spans() []*trace.ResourceSpans {
|
|
l.spansLock.RLock()
|
|
defer l.spansLock.RUnlock()
|
|
|
|
return l.spans
|
|
}
|
|
|
|
func (l *MemoryCollector) Export(
|
|
ctx context.Context,
|
|
request *ctrace.ExportTraceServiceRequest,
|
|
) (*ctrace.ExportTraceServiceResponse, error) {
|
|
l.spansLock.Lock()
|
|
defer l.spansLock.Unlock()
|
|
|
|
l.spans = append(l.spans, request.ResourceSpans...)
|
|
return &ctrace.ExportTraceServiceResponse{}, nil
|
|
}
|