Go Programlamada gRPC-Gateway İle Protobuf Servislerinde OpenTelemetry Tracing Katmanı
Günümüzde mikroservis yapısı yaygın olarak kullanılan bir yazılım mimarisidir. Bu mimari, bağımsız servislere bölünmüş ve her bir hizmetin kendine özgü bir işlevi vardır. Ancak bu bağımsız servislere erişmenin ve işlemlerin izlenmesinin zorluğuna neden olabilir. Bu sorunu aşmak için, gRPC-Gateway gibi teknolojiler kullanılırken, hizmetlerin birbirleriyle etkileşimini izlemek için OpenTelemetry tracing katmanı kullanılır.
Neden Important?
Mikroservis yapısının avantajlarından biri, servislerin bağımsız olarak geliştirilebilmesidir. Ancak bu da, servislerin birbirleriyle etkileşimini izlemeyi zorlaştırır. Bu durum, hataların bulunması ve performans optimizasyonunun yapılması zorlaşır. İşte bu noktada, OpenTelemetry tracing katmanı devreye girer. Hizmetlerin birbirleriyle etkileşimini izleyerek, hataları bulunmaya ve performans optimizasyonunu yapabilme imkanı sağlar.
Teknik Detaylar
Bu makalede, gRPC-Gateway ile protobuf servislere OpenTelemetry tracing katmanı ekleyeceğiz. İlk olarak, gereksinimlerımızı tanımlayacağız.
Gereksinimler
- gRPC-Gateway: gRPC-Gateway, gRPC protokolünü HTTP protokolüne dönüştüren bir teknolojidir.
- Protobuf: Protobuf, gRPC için bir veri işleme dilidir.
- OpenTelemetry: OpenTelemetry, gRPC ve HTTP gibi uygulamaları izlemek için kullanılan bir teknolojidir.
Adımlar
1. Projeyi Oluştur
Yeni bir Go projemizi oluşturalım.
bashgo mod init tracing-proto-example
2. Protobuf Servisini Tanımla
Protobuf servisini tanımlayalım.
protosyntax = "proto3"; package tracing; service TracingService { rpc GetTracing(Empty) returns (Tracing) {} } message Empty {} message Tracing { string tracing_id = 1; }
3. Protobuf Servisini Compile Et
Protobuf servisini compile edelim.
bashprotoc --go_out=. --go-grpc_out=. tracing.proto
4. GRPC-Gateway'i Kullan
GRPC-Gateway'i kullanalım.
gopackage main import ( "context" "fmt" "log" "net/http" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "google.golang.org/grpc" pb "tracing/proto" ) func main() { // gRPC servisi oluştur lis, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("failed to listen: %v", err) } srv := grpc.NewServer() pb.RegisterTracingServiceServer(srv, &server{}) // gRPC-Gateway servisi oluştur gatewayMux := runtime.NewServeMux() if err := pb.RegisterTracingServiceHandler(context.Background(), gatewayMux, srv); err != nil { log.Fatalf("failed to register service: %v", err) } // HTTP server oluştur httpServer := &http.Server{ Addr: ":8080", Handler: gatewayMux, } // Server'leri başlat go func() { if err := srv.Serve(lis); err != nil { log.Fatalf("failed to serve gRPC: %v", err) } }() if err := httpServer.ListenAndServe(); err != http.ErrServerClosed { log.Fatalf("failed to serve gRPC: %v", err) } } type server struct{} func (s *server) GetTracing(ctx context.Context, _ *pb.Empty) (*pb.Tracing, error) { return &pb.Tracing{TracingId: "tracing-id"}, nil }
5. OpenTelemetry Tracing Katmanı Ekleyin
OpenTelemetry tracing katmanı ekleyelim.
gopackage main import ( "context" "log" "net/http" "github.com/opentelemetry/oauth2" "github.com/opentelemetry/otlp-go" "github.com/opentelemetry/otlp-go/otlphttp/ottlphttp" "github.com/opentelemetry/opentelemetry-go" "github.com/opentelemetry/opentelemetry-go/exporters/otlp/otlptrace" "github.com/opentelemetry/opentelemetry-go/service" "github.com/opentelemetry/opentelemetry-go/service/otlp" ) func main() { // gRPC servisi oluştur lis, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("failed to listen: %v", err) } srv := grpc.NewServer() pb.RegisterTracingServiceServer(srv, &server{}) // gRPC-Gateway servisi oluştur gatewayMux := runtime.NewServeMux() if err := pb.RegisterTracingServiceHandler(context.Background(), gatewayMux, srv); err != nil { log.Fatalf("failed to register service: %v", err) } // OpenTelemetry tracing katmanı oluştur otlpExporter, err := otlptrace.New(context.Background(), otlptrace.With Collector(oauth2.New
Konuyu Yanıtla
Markdown destekler · Alıntı, kod, liste kullanabilirsinizKonuyu yanıtlamak için giriş yapmalısınız.