feat: add independent platform modules and multi-provider storage
This commit is contained in:
117
telemetry/telemetry_test.go
Normal file
117
telemetry/telemetry_test.go
Normal file
@@ -0,0 +1,117 @@
|
||||
package telemetry_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
omni "git.yuntuo.hk/k2safe/go-omni"
|
||||
"git.yuntuo.hk/k2safe/go-omni/httpx"
|
||||
"git.yuntuo.hk/k2safe/go-omni/logx"
|
||||
"git.yuntuo.hk/k2safe/go-omni/telemetry"
|
||||
"github.com/redis/go-redis/v9"
|
||||
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
|
||||
"go.opentelemetry.io/otel/sdk/metric/metricdata"
|
||||
"go.opentelemetry.io/otel/sdk/trace/tracetest"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestHTTPTracePropagationMetricsAndRedisNil(t *testing.T) {
|
||||
exporter := tracetest.NewInMemoryExporter()
|
||||
reader := sdkmetric.NewManualReader()
|
||||
runtime, err := telemetry.New(telemetry.Config{Service: "test", SampleRatio: 1, Exporter: exporter, Reader: reader})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer runtime.Close()
|
||||
ctx := context.Background()
|
||||
upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if !strings.HasPrefix(r.Header.Get("Traceparent"), "00-11111111111111111111111111111111-") {
|
||||
t.Error("missing propagated trace")
|
||||
}
|
||||
io.WriteString(w, "ok")
|
||||
}))
|
||||
defer upstream.Close()
|
||||
app := omni.New(omni.WithLogger(false))
|
||||
app.Use(func(next httpx.Handler) httpx.Handler {
|
||||
return func(c *httpx.Context) error {
|
||||
err := next(c)
|
||||
if logx.TraceID(c.Context()) != "11111111111111111111111111111111" {
|
||||
t.Error("outer access log lost trace correlation")
|
||||
}
|
||||
return err
|
||||
}
|
||||
})
|
||||
app.Use(runtime.Middleware())
|
||||
app.GET("/users/:id", func(c *httpx.Context) error {
|
||||
if logx.TraceID(c.Context()) != "11111111111111111111111111111111" {
|
||||
t.Error("log correlation")
|
||||
}
|
||||
req, _ := http.NewRequestWithContext(c.Context(), "GET", upstream.URL+"?secret=hidden", nil)
|
||||
resp, err := (telemetry.Transport{Runtime: runtime}).RoundTrip(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
io.ReadAll(resp.Body)
|
||||
resp.Body.Close()
|
||||
if req.Header.Get("Traceparent") != "" {
|
||||
t.Error("caller headers mutated")
|
||||
}
|
||||
return c.OK("ok")
|
||||
})
|
||||
req := httptest.NewRequest("GET", "/users/privateUser?secret=hidden", nil)
|
||||
req.Header.Set("Traceparent", "00-11111111111111111111111111111111-2222222222222222-01")
|
||||
rec := httptest.NewRecorder()
|
||||
app.ServeHTTP(rec, req)
|
||||
if rec.Code != 200 {
|
||||
t.Fatal(rec.Code)
|
||||
}
|
||||
hook := telemetry.RedisHook{Runtime: runtime}
|
||||
if err = hook.ProcessHook(func(context.Context, redis.Cmder) error { return redis.Nil })(ctx, redis.NewStringCmd(ctx, "GET", "secret")); err != redis.Nil {
|
||||
t.Fatal("cache miss was swallowed", err)
|
||||
}
|
||||
if err = runtime.Flush(ctx); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
spans := exporter.GetSpans()
|
||||
if len(spans) != 3 {
|
||||
t.Fatalf("got %d spans", len(spans))
|
||||
}
|
||||
var client, server bool
|
||||
for _, s := range spans {
|
||||
if strings.Contains(s.Name, "privateUser") || strings.Contains(s.Name, "secret") {
|
||||
t.Fatal(s.Name)
|
||||
}
|
||||
if s.SpanKind == trace.SpanKindServer {
|
||||
server = true
|
||||
if s.Name != "GET /users/:id" || s.Parent.SpanID().String() != "2222222222222222" {
|
||||
t.Fatal(s.Name, s.Parent)
|
||||
}
|
||||
}
|
||||
if s.SpanKind == trace.SpanKindClient {
|
||||
client = true
|
||||
}
|
||||
}
|
||||
if !client || !server {
|
||||
t.Fatal("missing client/server span")
|
||||
}
|
||||
var metrics metricdata.ResourceMetrics
|
||||
if err = reader.Collect(ctx, &metrics); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var count int64
|
||||
for _, scope := range metrics.ScopeMetrics {
|
||||
for _, m := range scope.Metrics {
|
||||
if sum, ok := m.Data.(metricdata.Sum[int64]); ok {
|
||||
for _, p := range sum.DataPoints {
|
||||
count += p.Value
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if count != 1 {
|
||||
t.Fatal("request metric", count)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user