1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
// This is an example of using composite units
// It makes successive downloads of the linux source code
// and reports the download speed as well as the download time
package main
import (
"io"
"log"
"net/http"
"github.com/performancecopilot/speed/v4"
)
type sink int
func (s sink) Write(data []byte) (int, error) {
return len(data), nil
}
const url = "https://codeload.github.com/suyash/ulid/zip/master"
func main() {
client, err := speed.NewPCPClient("download")
if err != nil {
log.Fatal(err)
}
downloadSpeed, err := speed.NewPCPSingletonMetric(
float64(0),
"download_speed",
speed.DoubleType,
speed.InstantSemantics,
speed.MegabyteUnit.Time(speed.SecondUnit, -1),
)
if err != nil {
log.Fatal(err)
}
timer, err := speed.NewPCPTimer("download_time", speed.SecondUnit)
if err != nil {
log.Fatal(err)
}
client.MustRegister(timer)
client.MustRegister(downloadSpeed)
client.MustStart()
defer client.MustStop()
for {
timer.Reset()
run(timer, downloadSpeed)
}
}
func run(timer *speed.PCPTimer, downloadSpeed *speed.PCPSingletonMetric) {
res, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
var s sink
err = timer.Start()
if err != nil {
log.Fatal(err)
}
n, err := io.Copy(s, res.Body)
if err != nil {
log.Fatal(err)
}
elapsed, err := timer.Stop()
if err != nil {
log.Fatal(err)
}
downloadSpeed.Set(float64(n) / (1024 * 1024 * float64(elapsed)))
log.Println("downloaded", n, "bytes in", elapsed, "seconds")
}
|