Skip to content

Commit

Permalink
feat: add telemetry to middleware
Browse files Browse the repository at this point in the history
  • Loading branch information
eminetto committed Apr 7, 2023
1 parent 19dd2d1 commit d96d39f
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 10 deletions.
27 changes: 21 additions & 6 deletions feedbacks/main.go
@@ -1,24 +1,27 @@
package main

import (
"context"
"database/sql"
"encoding/json"
"fmt"
"github.com/eminetto/api-o11y/feedbacks/feedback"
"github.com/eminetto/api-o11y/feedbacks/feedback/mysql"
"github.com/eminetto/api-o11y/internal/middleware"
"github.com/eminetto/api-o11y/internal/telemetry"
"github.com/go-chi/chi/v5"
"github.com/go-chi/httplog"
_ "github.com/go-sql-driver/mysql"
"github.com/google/uuid"
"go.opentelemetry.io/otel/codes"
"net/http"
"os"
"time"
)

func main() {
// Logger
logger := httplog.NewLogger("auth", httplog.Options{
logger := httplog.NewLogger("feedbacks", httplog.Options{
JSON: true,
})
dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_HOST"), os.Getenv("DB_PORT"), os.Getenv("DB_DATABASE"))
Expand All @@ -27,14 +30,20 @@ func main() {
logger.Panic().Msg(err.Error())
}
defer db.Close()
repo := mysql.NewUserMySQL(db)
ctx := context.Background()
otel, err := telemetry.New(ctx, "feedbacks")
if err != nil {
logger.Panic().Msg(err.Error())
}
defer otel.Shutdown(ctx)
repo := mysql.NewUserMySQL(db, otel)

fService := feedback.NewService(repo)
fService := feedback.NewService(repo, otel)

r := chi.NewRouter()
r.Use(httplog.RequestLogger(logger))
r.Use(middleware.IsAuthenticated)
r.Post("/v1/feedback", storeFeedback(fService))
r.Post("/v1/feedback", storeFeedback(ctx, fService, otel))

http.Handle("/", r)
srv := &http.Server{
Expand All @@ -49,9 +58,11 @@ func main() {
}
}

func storeFeedback(fService feedback.UseCase) http.HandlerFunc {
func storeFeedback(ctx context.Context, fService feedback.UseCase, otel telemetry.Telemetry) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
oplog := httplog.LogEntry(r.Context())
ctx, span := otel.Start(ctx, "store")
defer span.End()
var f feedback.Feedback
err := json.NewDecoder(r.Body).Decode(&f)
if err != nil {
Expand All @@ -63,15 +74,19 @@ func storeFeedback(fService feedback.UseCase) http.HandlerFunc {
var result struct {
ID uuid.UUID `json:"id"`
}
result.ID, err = fService.Store(r.Context(), &f)
result.ID, err = fService.Store(ctx, &f)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
oplog.Error().Msg(err.Error())
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return
}
if err := json.NewEncoder(w).Encode(result); err != nil {
w.WriteHeader(http.StatusBadGateway)
oplog.Error().Msg(err.Error())
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return
}
return
Expand Down
17 changes: 13 additions & 4 deletions internal/middleware/is_authenticated.go
Expand Up @@ -4,18 +4,24 @@ import (
"context"
"encoding/json"
"errors"
"github.com/eminetto/api-o11y/internal/telemetry"
"go.opentelemetry.io/otel/codes"
"net/http"
"os"
"strconv"
"strings"
)

func IsAuthenticated(next http.Handler) http.Handler {
func IsAuthenticated(ctx context.Context, telemetry telemetry.Telemetry, next http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
ctx, span := telemetry.Start(ctx, "IsAuthenticated")
defer span.End()
errorMessage := "Erro na autenticação"
tokenString := r.Header.Get("Authorization")
if tokenString == "" {
err := errors.New("Unauthorized")
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
respondWithError(rw, http.StatusUnauthorized, err.Error(), errorMessage)
return
}
Expand All @@ -25,6 +31,8 @@ func IsAuthenticated(next http.Handler) http.Handler {

req, err := http.Post(os.Getenv("AUTH_URL")+"/v1/validate-token", "text/plain", strings.NewReader(payload))
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
respondWithError(rw, http.StatusUnauthorized, err.Error(), errorMessage)
return
}
Expand All @@ -35,12 +43,13 @@ func IsAuthenticated(next http.Handler) http.Handler {
var res result
err = json.NewDecoder(req.Body).Decode(&res)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
respondWithError(rw, http.StatusUnauthorized, err.Error(), errorMessage)
return
}

ctx := context.WithValue(r.Context(), "email", res.Email)
next.ServeHTTP(rw, r.WithContext(ctx))
newCTX := context.WithValue(ctx, "email", res.Email)
next.ServeHTTP(rw, r.WithContext(newCTX))
})
}

Expand Down

0 comments on commit d96d39f

Please sign in to comment.