An open API service indexing awesome lists of open source software.

https://github.com/thiagonache/httpstats

The idea of this package is to provide an easy way to collect detailed HTTP metrics from the client. It exports a function that injects hooks using HTTPTrace Package.
https://github.com/thiagonache/httpstats

go golang golang-library http http-client stats

Last synced: 3 days ago
JSON representation

The idea of this package is to provide an easy way to collect detailed HTTP metrics from the client. It exports a function that injects hooks using HTTPTrace Package.

Awesome Lists containing this project

README

          

# httpstats

[![Go Reference](https://pkg.go.dev/badge/github.com/thiagonache/httpstats.svg)](https://pkg.go.dev/github.com/thiagonache/httpstats)
[![Go Report Card](https://goreportcard.com/badge/github.com/thiagonache/httpstats)](https://goreportcard.com/report/github.com/thiagonache/httpstats)

```go
import "github.com/thiagonache/httpstats"
```

The idea of this package is to provide an easy way to collect detailed HTTP
metrics from the client. It exports a function that injects hooks using
[HTTPTrace](https://pkg.go.dev/net/http/httptrace) Package. If you want a better
understand about how HTTPTrace works read [my blog
post](https://hi.thiagonbcarvalho.com/en/posts/httptrace/).

You just need to instantiate a new object and call the wrapper function of the http
module. For instance, to create a new request instead of using `http.NewRequest`
you should use `newStatsObject.NewRequest`.

## Example

Usual http call code

```go
c := &http.Client{}
req, err := http.NewRequest(http.MethodGet, "https://httpbin.org/get", nil)
if err != nil {
log.Fatal(err)
}
res, err := c.Do(req)
if err != nil {
log.Fatal(err)
}
body, err := io.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
```

Output

```json
{
"args": {},
"headers": {
"Accept-Encoding": "gzip",
"Host": "httpbin.org",
"User-Agent": "Go-http-client/2.0",
"X-Amzn-Trace-Id": "Root=1-62bdfa65-252f4f6244194d1257217609"
},
"origin": "201.95.218.50",
"url": "https://httpbin.org/get"
}
```

Using this package to get detailed metrics.

```go
s := httpstats.New()
c := &http.Client{}
req, err := s.NewRequest(http.MethodGet, "https://httpbin.org/get", nil)
...
fmt.Println("DNS:", s.DNS[0])
fmt.Println("Connect:", s.Connect[0])
```

Output

```json
{
"args": {},
"headers": {
"Accept-Encoding": "gzip",
"Host": "httpbin.org",
"User-Agent": "Go-http-client/2.0",
"X-Amzn-Trace-Id": "Root=1-62bdfaef-6a1f4a8533030f0f78dbb4e6"
},
"origin": "201.95.218.50",
"url": "https://httpbin.org/get"
}

DNS: 9.454983ms
Connect: 147.036392ms
```