Skip to content

feat: simplify kod core #264

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 25 commits into from
Dec 25, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 55 additions & 52 deletions example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package kod_test
import (
"context"
"fmt"
"log/slog"
"testing"

"github.com/go-kod/kod"
Expand All @@ -11,10 +12,6 @@ import (
"github.com/go-kod/kod/interceptor/kmetric"
"github.com/go-kod/kod/interceptor/krecovery"
"github.com/go-kod/kod/interceptor/ktrace"
lognoop "go.opentelemetry.io/otel/log/noop"
metricnoop "go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/propagation"
tracenoop "go.opentelemetry.io/otel/trace/noop"
"go.uber.org/mock/gomock"
)

Expand Down Expand Up @@ -112,14 +109,15 @@ func Example_configGlobal() {
// This example demonstrates how to use logging with OpenTelemetry.
func Example_openTelemetryLog() {
logger, observer := kod.NewTestLogger()
slog.SetDefault(logger)

kod.RunTest(&testing.T{}, func(ctx context.Context, app *helloworld.App) {
app.L(ctx).Debug("Hello, World!")
app.L(ctx).Info("Hello, World!")
app.L(ctx).Warn("Hello, World!")
app.L(ctx).Error("Hello, World!")
app.HelloWorld.Get().SayHello(ctx)
}, kod.WithLogger(logger))
})

fmt.Println(observer.RemoveKeys("trace_id", "span_id", "time"))

Expand All @@ -133,32 +131,32 @@ func Example_openTelemetryLog() {
// {"component":"github.com/go-kod/kod/examples/helloworld/HelloWorld","level":"INFO","msg":"Hello, World!"}
}

// This example demonstrates how to use tracing with OpenTelemetry.
func Example_openTelemetryTrace() {
logger, observer := kod.NewTestLogger()

kod.Run(context.Background(), func(ctx context.Context, app *helloworld.App) error {
ctx, span := app.Tracer().Start(ctx, "example")
defer span.End()
app.L(ctx).Info("Hello, World!")
app.L(ctx).WarnContext(ctx, "Hello, World!")

app.HelloWorld.Get().SayHello(ctx)
return nil
}, kod.WithInterceptors(ktrace.Interceptor()), kod.WithLogger(logger))

fmt.Println(observer.Filter(func(m map[string]any) bool {
return m["trace_id"] != nil && m["span_id"] != nil
}).RemoveKeys("trace_id", "span_id", "time"))

// Output:
// helloWorld init
// Hello, World!
// helloWorld shutdown
// {"component":"github.com/go-kod/kod/Main","level":"INFO","msg":"Hello, World!"}
// {"component":"github.com/go-kod/kod/Main","level":"WARN","msg":"Hello, World!"}
// {"component":"github.com/go-kod/kod/examples/helloworld/HelloWorld","level":"INFO","msg":"Hello, World!"}
}
// // This example demonstrates how to use tracing with OpenTelemetry.
// func Example_openTelemetryTrace() {
// logger, observer := kod.NewTestLogger()

// kod.Run(context.Background(), func(ctx context.Context, app *helloworld.App) error {
// ctx, span := app.Tracer().Start(ctx, "example")
// defer span.End()
// app.L(ctx).Info("Hello, World!")
// app.L(ctx).WarnContext(ctx, "Hello, World!")

// app.HelloWorld.Get().SayHello(ctx)
// return nil
// }, kod.WithInterceptors(ktrace.Interceptor()), kod.WithLogger(logger))

// fmt.Println(observer.Filter(func(m map[string]any) bool {
// return m["trace_id"] != nil && m["span_id"] != nil
// }).RemoveKeys("trace_id", "span_id", "time"))

// // Output:
// // helloWorld init
// // Hello, World!
// // helloWorld shutdown
// // {"component":"github.com/go-kod/kod/Main","level":"INFO","msg":"Hello, World!"}
// // {"component":"github.com/go-kod/kod/Main","level":"WARN","msg":"Hello, World!"}
// // {"component":"github.com/go-kod/kod/examples/helloworld/HelloWorld","level":"INFO","msg":"Hello, World!"}
// }

// This example demonstrates how to use metrics with OpenTelemetry.
func Example_openTelemetryMetric() {
Expand All @@ -174,25 +172,6 @@ func Example_openTelemetryMetric() {
// helloWorld shutdown
}

// This example demonstrates how to use OpenTelemetry with a custom OpenTelemetry provider.
func Example_openTelemetryCustomProvider() {
kod.Run(context.Background(), func(ctx context.Context, app *helloworld.App) error {
app.HelloWorld.Get().SayHello(ctx)
return nil
},
kod.WithTracerProvider(tracenoop.NewTracerProvider()),
kod.WithMeterProvider(metricnoop.NewMeterProvider()),
kod.WithLogProvider(lognoop.NewLoggerProvider()),
kod.WithTextMapPropagator(propagation.NewCompositeTextMapPropagator(
propagation.TraceContext{}, propagation.Baggage{},
)),
)
// Output:
// helloWorld init
// Hello, World!
// helloWorld shutdown
}

// This example demonstrates how to use [kod.WithInterceptors] to provide global interceptors to the application.
func Example_interceptorGlobal() {
interceptor := interceptor.Interceptor(func(ctx context.Context, info interceptor.CallInfo, req, res []interface{}, next interceptor.HandleFunc) error {
Expand Down Expand Up @@ -292,17 +271,18 @@ func Example_testWithDefaultConfig() {
// helloWorld shutdown
}

// This example demonstrates how to use [kod.RunTest], [kod.NewTestLogger] and [kod.WithLogger] to run a test function with a custom logger.
// This example demonstrates how to use [kod.RunTest], [kod.NewTestLogger] to run a test function with a custom logger.
func Example_testWithLogObserver() {
logger, observer := kod.NewTestLogger()
slog.SetDefault(logger)

t := &testing.T{}
kod.RunTest(t, func(ctx context.Context, app *helloworld.App) {
app.L(ctx).Debug("Hello, World!")
app.L(ctx).Info("Hello, World!")
app.L(ctx).Warn("Hello, World!")
app.L(ctx).Error("Hello, World!")
}, kod.WithLogger(logger))
})

fmt.Println(observer.Len())
fmt.Println(observer.ErrorCount())
Expand All @@ -315,3 +295,26 @@ func Example_testWithLogObserver() {
// 1
// 0
}

type testCore struct{}

func (c testCore) Init(ctx context.Context, k *kod.Kod) error {
fmt.Println("core init")

k.Defer("testCore", func(context.Context) error {
fmt.Println("core shutdown")
return nil
})

return nil
}

func Example_testWithCore() {
kod.RunTest(&testing.T{}, func(ctx context.Context, app *helloworld.App) {
}, kod.WithCores(testCore{}))
// Output:
// core init
// helloWorld init
// helloWorld shutdown
// core shutdown
}
43 changes: 4 additions & 39 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,8 @@ require (
github.com/sony/gobreaker v1.0.0
github.com/spf13/cobra v1.8.1
github.com/stretchr/testify v1.10.0
go.opentelemetry.io/contrib/bridges/otelslog v0.8.0
go.opentelemetry.io/contrib/exporters/autoexport v0.58.0
go.opentelemetry.io/contrib/instrumentation/host v0.58.0
go.opentelemetry.io/contrib/instrumentation/runtime v0.58.0
go.opentelemetry.io/otel v1.33.0
go.opentelemetry.io/otel/log v0.9.0
go.opentelemetry.io/otel/metric v1.33.0
go.opentelemetry.io/otel/sdk v1.33.0
go.opentelemetry.io/otel/sdk/log v0.9.0
go.opentelemetry.io/otel/sdk/metric v1.33.0
go.opentelemetry.io/otel/trace v1.33.0
go.uber.org/goleak v1.3.0
go.uber.org/mock v0.5.0
Expand All @@ -40,64 +32,37 @@ require (
)

require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/ebitengine/purego v0.8.1 // indirect
github.com/gabriel-vasile/mimetype v1.4.5 // indirect
github.com/gabriel-vasile/mimetype v1.4.7 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/klauspost/compress v1.17.11 // indirect
github.com/knadh/koanf/maps v0.1.1 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/prometheus/client_golang v1.20.5 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.61.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/shirou/gopsutil/v4 v4.24.11 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/tklauser/go-sysconf v0.3.14 // indirect
github.com/tklauser/numcpus v0.9.0 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/bridges/prometheus v0.58.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.9.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.9.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.33.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.33.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 // indirect
go.opentelemetry.io/otel/exporters/prometheus v0.55.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.9.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.33.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.33.0 // indirect
go.opentelemetry.io/proto/otlp v1.4.0 // indirect
golang.org/x/crypto v0.30.0 // indirect
golang.org/x/crypto v0.31.0 // indirect
golang.org/x/mod v0.22.0 // indirect
golang.org/x/net v0.32.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 // indirect
google.golang.org/protobuf v1.35.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
Expand Down
Loading
Loading