Mal HTTP Antwort-in Gehen
In mein Programm Gehen, habe ich ein paar HTTP-requests und ich muss mal die Reaktionszeit (und nicht Zeit).
Hier ist mein Aktueller code (timing-request time):
func Get() int {
start := time.Now()
result, err := http.Get("http://www.google.com")
if err != nil {
log.Fatal(err)
}
defer result.Body.Close()
elapsed := time.Since(start).Seconds()
log.Println(elapsed)
return result.StatusCode
}
Eigentlich dieser code zeigt etwas über 5s-Anforderung, einschließlich DNS-Auflösung und anderen Dingen... Wenn ich führen Sie den gleichen test mit einem tool wie Apache JMeter, die Zeit ist nur etwa 100ms (das ist der eigentliche Antwortzeit der server, ohne kümmert sich um die Anfrage Zeit).
Was ich wirklich will, ist zu berechnen die Reale Antwortzeit der server. Wie kann ich berechnen, dies in der Go ?
- Was meinst du mit Reaktionszeit? Die Zeit aus, wenn der server beendet wird, der die Anfrage verarbeitet, um die Zeit, die der client empfangen? Ich bin mir nicht sicher, wie das möglich wäre - die Rundreise selbst -, dns-und alle, die fester Bestandteil der HTTP-Zyklus... Ihre beste Wette wäre, zu mal es auf dem server.
- Ok das ist, was ich dachte. In der Tat, ich weiß wirklich nicht, wie JMeter-tool ist das berechnen dieser Zeit, aber ich möchte so etwas wie dies. JMeter nicht überprüfen Sie den server (meiner Erkenntnis). Getestet habe ich mit wget, und das timing ist das gleiche, dass die, die berechnet wird, indem Sie mein Programm (etwa 5s einschließlich DNS-Auflösung).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Edit: Die folgende Antwort vor-Zeitraum 1.7. Gehen 1.7 Hinzugefügt HTTP-tracing, so sicher sein, zu prüfen, diese neue Antwort: Immer TTFB (time to first byte) Wert in golang
Originalantwort.
Messen können Sie es durch öffnen einer TCP-Verbindung und "sprechen" raw HTTP (wikipedia, rfc7230, rfc7231, rfc7232, rfc7233, rfc7234, rfc7235). Sie stellen eine Verbindung, senden Sie die Anforderung, und starten Sie den timer hier. Und auf die Reaktion warten. Damit werden Sie ausschließen, DNS-Auflösung und die Zeit, die erforderlich ist, um die Verbindung herzustellen.
Da haben Sie keinen Einblick, ob der server beginnt mit dem senden der Daten sofort zurück oder erst wenn alles fertig ist, und man keine info über den Netzwerk-Verzögerungen, es wird nicht exakt sein, sondern nur eine Schätzung.
Ich würde die Maßnahme zu 2 Punkte: wenn das erste byte gelesen werden kann und wenn alles gelesen wird:
Hinweis:
Kann es sinnvoll sein, die Messung in einem 3. Punkt: wenn alle die Antwort-Header gelesen werden. Dies ist erkannt als das Lesen volle Zeilen aus der Antwort (Verbindung) und die Begegnung mit einer leeren Zeile. Diese leere Zeile trennt Antwort-Header aus der Antwort der Körper.
Nicht zu, nehmen nichts Weg von der vollkommen gültig akzeptierte Antwort, eine alternative zu beachten ist, die zum implementieren einer benutzerdefinierten RoundTripper umschließt, die die Standard-http.Transport und net.Dialer. Dies kann hilfreich sein, wenn Sie code-Instrumentierung, die http verwendet.Client-oder wenn Sie benötigen, um Unterstützung von Proxys, TLS, keep-alive oder andere HTTP-Funktionen, aber nicht wollen/brauchen, zu re-implementieren Sie alle. Sie haben nicht ganz so viel Kontrolle, wie Sie mit einer voll angepassten client, aber es ' s lohnt sich in Ihrem toolbox.
Beispiel Runde tripper:
Habe ich fallen gelassen, dass in einem einfachen Beispiel-Programm hier: https://github.com/skyec/go-instrumented-roundtripper/blob/master/main.go
Gibt es Paket https://golang.org/pkg/net/http/httptrace/ da gehen 1.7;
Es unterstützt timing der folgenden Vorgänge aus:
Werfen Sie auch einen Blick auf https://github.com/davecheney/httpstat. Es ist schön Dienstprogramm für die Visualisierung von timing-Ergebnisse.