10/05/2021 - GO
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.
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)
}
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
}
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()
// ...
}
İlk üçü başarılı, son ikisi ise başarısız istek izleme bilgisidir.