forked from oliver006/redis_exporter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
109 lines (97 loc) · 3.69 KB
/
main.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
package main
import (
"flag"
"net/http"
"os"
"runtime"
"strings"
log "github.com/Sirupsen/logrus"
"github.com/oliver006/redis_exporter/exporter"
"github.com/prometheus/client_golang/prometheus"
)
var (
redisAddr = flag.String("redis.addr", getEnv("REDIS_ADDR", "redis://localhost:6379"), "Address of one or more redis nodes, separated by separator")
redisPassword = flag.String("redis.password", getEnv("REDIS_PASSWORD", ""), "Password for one or more redis nodes, separated by separator")
redisAlias = flag.String("redis.alias", getEnv("REDIS_ALIAS", ""), "Redis instance alias for one or more redis nodes, separated by separator")
namespace = flag.String("namespace", "redis", "Namespace for metrics")
checkKeys = flag.String("check-keys", "", "Comma separated list of keys to export value and length/size")
separator = flag.String("separator", ",", "separator used to split redis.addr, redis.password and redis.alias into several elements.")
listenAddress = flag.String("web.listen-address", ":9121", "Address to listen on for web interface and telemetry.")
metricPath = flag.String("web.telemetry-path", "/metrics", "Path under which to expose metrics.")
isDebug = flag.Bool("debug", false, "Output verbose debug information")
logFormat = flag.String("log-format", "txt", "Log format, valid options are txt and json")
showVersion = flag.Bool("version", false, "Show version information and exit")
// VERSION, BUILD_DATE, GIT_COMMIT are filled in by the build script
VERSION = "<<< filled in by build >>>"
BUILD_DATE = "<<< filled in by build >>>"
COMMIT_SHA1 = "<<< filled in by build >>>"
)
func main() {
flag.Parse()
switch *logFormat {
case "json":
log.SetFormatter(&log.JSONFormatter{})
default:
log.SetFormatter(&log.TextFormatter{})
}
log.Printf("Redis Metrics Exporter %s build date: %s sha1: %s Go: %s\n",
VERSION, BUILD_DATE, COMMIT_SHA1,
runtime.Version(),
)
if *isDebug {
log.SetLevel(log.DebugLevel)
log.Debugln("Enabling debug output")
} else {
log.SetLevel(log.InfoLevel)
}
if *showVersion {
return
}
addrs := strings.Split(*redisAddr, *separator)
passwords := strings.Split(*redisPassword, *separator)
for len(passwords) < len(addrs) {
passwords = append(passwords, passwords[0])
}
aliases := strings.Split(*redisAlias, *separator)
for len(aliases) < len(addrs) {
aliases = append(aliases, aliases[0])
}
exp, err := exporter.NewRedisExporter(
exporter.RedisHost{Addrs: addrs, Passwords: passwords, Aliases: aliases},
*namespace,
*checkKeys)
if err != nil {
log.Fatal(err)
}
prometheus.MustRegister(exp)
buildInfo := prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "redis_exporter_build_info",
Help: "redis exporter build_info",
}, []string{"version", "commit_sha", "build_date", "golang_version"})
prometheus.MustRegister(buildInfo)
buildInfo.WithLabelValues(VERSION, COMMIT_SHA1, BUILD_DATE, runtime.Version()).Set(1)
http.Handle(*metricPath, prometheus.Handler())
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`
<html>
<head><title>Redis Exporter v` + VERSION + `</title></head>
<body>
<h1>Redis Exporter v` + VERSION + `</h1>
<p><a href='` + *metricPath + `'>Metrics</a></p>
</body>
</html>
`))
})
log.Printf("Providing metrics at %s%s", *listenAddress, *metricPath)
log.Printf("Connecting to redis hosts: %#v", addrs)
log.Printf("Using alias: %#v", aliases)
log.Fatal(http.ListenAndServe(*listenAddress, nil))
}
// getEnv gets an environment variable from a given key and if it doesn't exist,
// returns defaultVal given.
func getEnv(key string, defaultVal string) string {
if envVal, ok := os.LookupEnv(key); ok {
return envVal
}
return defaultVal
}