112 lines
2.3 KiB
Go
112 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
h "github.com/afex/hystrix-go/hystrix"
|
|
y "gopkg.in/yaml.v3"
|
|
)
|
|
|
|
var cmds = map[string]h.CommandConfig{
|
|
"defaults": {
|
|
Timeout: h.DefaultTimeout,
|
|
MaxConcurrentRequests: h.DefaultMaxConcurrent,
|
|
RequestVolumeThreshold: h.DefaultVolumeThreshold,
|
|
SleepWindow: h.DefaultSleepWindow,
|
|
ErrorPercentThreshold: h.DefaultErrorPercentThreshold,
|
|
},
|
|
"robots": {
|
|
Timeout: 100,
|
|
MaxConcurrentRequests: 1,
|
|
RequestVolumeThreshold: 1,
|
|
SleepWindow: 3000,
|
|
ErrorPercentThreshold: 1,
|
|
},
|
|
}
|
|
|
|
func robots() error {
|
|
res, err := http.Get("https://osinet.fr/robots.txt")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if res.StatusCode >= http.StatusBadRequest {
|
|
return fmt.Errorf("HTTP Error response: %s", res.Status)
|
|
}
|
|
b, err := io.ReadAll(res.Body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Printf("%s\n", strings.Replace(string(b[0:20]), "\n", "\t", -1))
|
|
return nil
|
|
}
|
|
|
|
func robotsFB(e error) error {
|
|
ce, ok := e.(h.CircuitError)
|
|
if !ok {
|
|
return fmt.Errorf("unexpected error: %w", e)
|
|
}
|
|
switch ce.Message {
|
|
case "circuit open":
|
|
fmt.Println("FB Short-circuit")
|
|
case "timeout":
|
|
fmt.Println("FB Timeout response")
|
|
default:
|
|
log.Println("FB", e.Error())
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func showCircuitSettings() {
|
|
e := y.NewEncoder(os.Stdout)
|
|
defer e.Close()
|
|
e.SetIndent(2)
|
|
fmt.Println(e.Encode(h.GetCircuitSettings()))
|
|
}
|
|
|
|
func showCircuit(name string) {
|
|
r, created, err := h.GetCircuit(name)
|
|
fmt.Printf("Name: %s, Created it: %t, error: %v\n", r.Name, created, err)
|
|
if err == nil {
|
|
fmt.Printf("IsOpen: %t, AllowRequest: %t", r.IsOpen(), r.AllowRequest())
|
|
}
|
|
}
|
|
|
|
func streamStats() {
|
|
sh := h.NewStreamHandler()
|
|
sh.Start()
|
|
|
|
http.Handle("/", sh)
|
|
|
|
err := http.ListenAndServe(":4000", nil)
|
|
fmt.Printf("L&S: %#v\n", err)
|
|
sh.Stop()
|
|
}
|
|
|
|
func main() {
|
|
h.SetLogger(log.Default())
|
|
h.Configure(cmds)
|
|
// showCircuit("robots")
|
|
// show(h.GetCircuitSettings())
|
|
go streamStats()
|
|
|
|
for i := 0; i < 30; i++ {
|
|
t0 := time.Now()
|
|
err := h.Do("robots", robots, robotsFB)
|
|
d := time.Since(t0)
|
|
if err != nil {
|
|
fmt.Printf("%2d in %v Error: %v\n", i, d, err)
|
|
} else {
|
|
fmt.Printf("%2d in %v OK\n", i, d)
|
|
}
|
|
time.Sleep(1000 * time.Millisecond)
|
|
// if i%10 == 0 {
|
|
// h.Flush()
|
|
// }
|
|
}
|
|
}
|