-
Notifications
You must be signed in to change notification settings - Fork 441
/
server.go
124 lines (105 loc) · 2.76 KB
/
server.go
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package main
import (
"flag"
"fmt"
"math/rand"
"os"
"os/signal"
"strconv"
"syscall"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/Shopify/toxiproxy/v2"
"github.com/Shopify/toxiproxy/v2/collectors"
)
type cliArguments struct {
host string
port string
config string
seed int64
printVersion bool
proxyMetrics bool
runtimeMetrics bool
}
func parseArguments() cliArguments {
result := cliArguments{}
flag.StringVar(&result.host, "host", "localhost",
"Host for toxiproxy's API to listen on")
flag.StringVar(&result.port, "port", "8474",
"Port for toxiproxy's API to listen on")
flag.StringVar(&result.config, "config", "",
"JSON file containing proxies to create on startup")
flag.Int64Var(&result.seed, "seed", time.Now().UTC().UnixNano(),
"Seed for randomizing toxics with")
flag.BoolVar(&result.runtimeMetrics, "runtime-metrics", false,
`enable runtime-related prometheus metrics (default "false")`)
flag.BoolVar(&result.proxyMetrics, "proxy-metrics", false,
`enable toxiproxy-specific prometheus metrics (default "false")`)
flag.BoolVar(&result.printVersion, "version", false,
`print the version (default "false")`)
flag.Parse()
return result
}
func main() {
// Handle SIGTERM to exit cleanly
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGTERM)
go func() {
<-signals
os.Exit(0)
}()
cli := parseArguments()
run(cli)
}
func run(cli cliArguments) {
if cli.printVersion {
fmt.Printf("toxiproxy-server version %s\n", toxiproxy.Version)
return
}
logger := setupLogger()
log.Logger = logger
rand.Seed(cli.seed)
metrics := toxiproxy.NewMetricsContainer(prometheus.NewRegistry())
server := toxiproxy.NewServer(metrics, logger)
if cli.proxyMetrics {
server.Metrics.ProxyMetrics = collectors.NewProxyMetricCollectors()
}
if cli.runtimeMetrics {
server.Metrics.RuntimeMetrics = collectors.NewRuntimeMetricCollectors()
}
if len(cli.config) > 0 {
server.PopulateConfig(cli.config)
}
server.Listen(cli.host, cli.port)
}
func setupLogger() zerolog.Logger {
zerolog.TimestampFunc = func() time.Time {
return time.Now().UTC()
}
zerolog.CallerMarshalFunc = func(pc uintptr, file string, line int) string {
short := file
for i := len(file) - 1; i > 0; i-- {
if file[i] == '/' {
short = file[i+1:]
break
}
}
file = short
return file + ":" + strconv.Itoa(line)
}
logger := zerolog.New(os.Stdout).With().Caller().Timestamp().Logger()
val, ok := os.LookupEnv("LOG_LEVEL")
if !ok {
return logger
}
lvl, err := zerolog.ParseLevel(val)
if err == nil {
logger = logger.Level(lvl)
} else {
l := &logger
l.Err(err).Msgf("unknown LOG_LEVEL value: \"%s\"", val)
}
return logger
}