observer/example/main.go

121 lines
2.8 KiB
Go

package main
import (
"context"
"fmt"
"log"
"os"
"os/signal"
"time"
"git.ma-al.com/maal-libraries/observer/pkg/attr/layer_attr"
"git.ma-al.com/maal-libraries/observer/pkg/event"
"git.ma-al.com/maal-libraries/observer/pkg/exporters"
"git.ma-al.com/maal-libraries/observer/pkg/exporters/console_exporter"
tracing "git.ma-al.com/maal-libraries/observer/pkg/fiber_tracing"
"git.ma-al.com/maal-libraries/observer/pkg/level"
"github.com/gofiber/fiber/v2"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/trace"
)
func main() {
main := fiber.New()
exps := make([]exporters.TraceExporter, 0)
exps = append(exps, exporters.DevConsoleExporter(console_exporter.ProcessorOptions{}))
gelfExp, err := exporters.GelfExporter()
if err == nil {
exps = append(exps, gelfExp)
}
jaegerExp, err := exporters.OtlpHTTPExporter(otlptracehttp.WithEndpointURL("http://localhost:4318/v1/traces"))
if err == nil {
exps = append(exps, jaegerExp)
}
main.Use(tracing.NewMiddleware(tracing.Config{
AppName: "example",
Version: "0.0.0",
ServiceProvider: "maal",
Exporters: exps,
}))
defer tracing.ShutdownTracer()
main.Use(func(c *fiber.Ctx) error {
span := tracing.SpanFromContext(c)
span.AddEvent("pushed into a span an event from middleware")
span = trace.SpanFromContext(c.UserContext())
span.AddEvent("span also available from c.UserContext()")
return c.Next()
})
main.Get("/", Handler)
main.Get("/just/some/more/complex/path/:with/params", Handler)
// handle interrupts (shutdown)
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
oscall := <-c
log.Printf("system call: %+v", oscall)
main.Shutdown()
}()
if err := main.Listen(fmt.Sprintf(":%d", 3344)); err != nil {
log.Panic(err)
}
fmt.Println("Shutting down...")
}
func Handler(c *fiber.Ctx) error {
ctx, span := tracing.FStart(c, layer_attr.Handler{
Level: level.DEBUG,
}.AsOpts())
defer span.End()
event.NewInSpan(event.Event{
Level: level.WARN,
ShortMessage: "a warning event",
}, span)
err := Serv(ctx)
if err != nil {
return event.NewErrInSpan(event.Error{Err: err, Level: level.ERR}, span)
}
return c.SendStatus(fiber.StatusOK)
}
func Serv(ctx context.Context) *fiber.Error {
ctx, span := tracing.Start(ctx, "service span", layer_attr.Service{
Level: level.INFO,
Name: "some service",
}.AsOpts())
defer span.End()
for range []int{1, 2, 3} {
time.Sleep(time.Millisecond * 100)
}
err := Repo(ctx)
if err != nil {
return fiber.NewError(500, "xd")
}
return fiber.NewError(500, "x")
}
func Repo(ctx context.Context) error {
ctx, span := tracing.Start(ctx, "repo span", layer_attr.Repo{
Level: level.DEBUG,
Name: "some repo",
}.AsOpts())
defer span.End()
for range []int{1, 2, 3} {
time.Sleep(time.Millisecond * 100)
}
return nil
}