otelchi/examples/multi-services/front-svc/main.go

84 lines
2.1 KiB
Go

package main
import (
"context"
"fmt"
"io"
"log"
"net/http"
"os"
"github.com/go-chi/chi/v5"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
"toastielab.dev/toastie-stuff/otelchi"
"toastielab.dev/toastie-stuff/otelchi/examples/multi-services/utils"
)
const (
envKeyBackServiceURL = "BACK_SERVICE_URL"
addr = ":8090"
serviceName = "front-svc"
)
func main() {
// initialize tracer
tracer, err := utils.NewTracer(serviceName)
if err != nil {
log.Fatalf("unable to initialize tracer due: %v", err)
}
if err = utils.NewMeter(serviceName); err != nil {
log.Fatalf("unable to initialize meter provider due: %v", err)
}
// define router
r := chi.NewRouter()
r.Use(otelchi.Middleware(serviceName, otelchi.WithChiRoutes(r)))
r.Get("/", utils.HealthCheckHandler)
r.Get("/greet", func(w http.ResponseWriter, r *http.Request) {
name, err := getRandomName(r.Context(), tracer)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(err.Error()))
return
}
w.Write([]byte(fmt.Sprintf("Hello, %s!", name)))
})
// execute server
log.Printf("front service is listening on %v", addr)
err = http.ListenAndServe(addr, r)
if err != nil {
log.Fatalf("unable to execute server due: %v", err)
}
}
func getRandomName(ctx context.Context, tracer trace.Tracer) (string, error) {
// start span
ctx, span := tracer.Start(ctx, "getRandomName")
defer span.End()
// call back service, notice that here we call the service using instrumented
// http client
resp, err := otelhttp.Get(ctx, os.Getenv(envKeyBackServiceURL)+"/name")
if err != nil {
err = fmt.Errorf("unable to execute http request due: %w", err)
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return "", err
}
defer resp.Body.Close()
// read response body
data, err := io.ReadAll(resp.Body)
if err != nil {
err = fmt.Errorf("unable to read response data due: %w", err)
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return "", err
}
return string(data), nil
}