Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

Bu örnek, giden HTTP istemci isteğine ve geri gelen sunucu yanıtına OpenTelemetri izlemeyi nasıl ekleyebileceğinizi gösterir. Bunu, aşağıda linkte verilen önceki örneğin devamı olduğu için, kısa kesiyorum.


Yapılandırma


Bu kod parçası, önceki gönderide bulabileceğiniz http.go dosyasına yalnızca bir ektir - Golang HTTP API'de OpenTelemetry ve Jaeger izlemeyi uygulama.


// HTTPClientTransporter is a convenience function which helps attaching tracing
// functionality to conventional HTTP clients.
func HTTPClientTransporter(rt http.RoundTripper) http.RoundTripper {
return otelhttp.NewTransport(rt)
}

İstemci


Bu sadece bir örnek, bu yüzden onu düzeltmeniz gerekiyor. Burada başka bir sunucuyu arıyor ve bir yanıt bekliyor.


package service

import (
"context"
"fmt"
"net/http"
"time"

"github.com/you/client/internal/pkg/trace"
)

type service struct {
// ...
}

func (s service) httpRequest(ctx context.Context) error {
// Create a child span.
ctx, span := trace.NewSpan(ctx, "service.httpRequest", nil)
defer span.End()

ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()

req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://localhost:8090/server/users", nil)
if err != nil {
trace.AddSpanError(span, err)
trace.FailSpan(span, "request error")

return err
}

res, err := trace.HTTPClientTransporter(http.DefaultTransport).RoundTrip(req)
defer res.Body.Close()
if err != nil {
trace.AddSpanError(span, err)
trace.FailSpan(span, "rounttrip error")

return err
}

if res.StatusCode != http.StatusOK {
err := fmt.Errorf("unexpected response code")

trace.AddSpanError(span, err)
trace.FailSpan(span, "response error")

return err
}

return nil
}

Sunucu


Yukarıdaki gibi, bunu da düzeltmeniz gerekiyor.


// ...

func main() {
ctx := context.Background()

// Bootstrap tracer.
prv, err := trace.NewProvider(trace.ProviderConfig{
JaegerEndpoint: "http://localhost:14268/api/traces",
ServiceName: "server",
ServiceVersion: "2.0.0",
Environment: "dev",
Disabled: false,
})
if err != nil {
log.Fatalln(err)
}
defer prv.Close(ctx)

handler := http.NewServeMux()
handler.HandleFunc("/server/users", trace.HTTPHandlerFunc(app.User{}.Create, "users_create"))

log.Fatal(http.ListenAndServe(":8090", handler))
}

// ...

func (u User) Create(w http.ResponseWriter, r *http.Request) {
// Create the parent span.
_, span := trace.NewSpan(r.Context(), "User.Create", nil)
defer span.End()

// ...
}

Sonuç


İlk üçü başarılı, son ikisi ise başarısız istek izleme bilgisidir.