Go Programlamada gRPC-Gateway İle Protobuf Servislerinde OpenTelemetry Tracing Katmanı

Konuyu başlatankyr karacaMod·
Yanıt
0
Görüntülenme
1
Oy
0
Son yanıt
Henüz yok
1 görüntülenme

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.

bash
go mod init tracing-proto-example

2. Protobuf Servisini Tanımla

Protobuf servisini tanımlayalım.

proto
syntax = "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.

bash
protoc --go_out=. --go-grpc_out=. tracing.proto

4. GRPC-Gateway'i Kullan

GRPC-Gateway'i kullanalım.

go
package 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.

go
package 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
0 yanıt1

Konuyu Yanıtla

Markdown destekler · Alıntı, kod, liste kullanabilirsiniz

Konuyu yanıtlamak için giriş yapmalısınız.

Bu konuda yer alanlar

Bu gönderinin yazarı ve yorum yazan üyeler (yalnızca bu konu).