Skip to content

Commit 0e30f3a

Browse files
authored
Merge pull request #20 from coderigo/feature/tls
Add support for TLS
2 parents d6e9292 + 4abaaa6 commit 0e30f3a

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

Dockerfile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
FROM alpine:3.10 AS certs
2+
RUN apk update \
3+
&& apk add ca-certificates
4+
15
FROM golang:1.10 AS builder
26
WORKDIR /go/src/github.com/carlpett/zookeeper_exporter/
37
COPY . .
@@ -6,5 +10,6 @@ RUN make build
610
FROM scratch
711
EXPOSE 9141
812
USER 1000
9-
ENTRYPOINT ["/zookeeper_exporter"]
1013
COPY --from=builder /go/src/github.com/carlpett/zookeeper_exporter/zookeeper_exporter /zookeeper_exporter
14+
COPY --from=certs /etc/ssl/certs /etc/ssl/certs
15+
ENTRYPOINT ["/zookeeper_exporter"]

main.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,29 @@ func init() {
2121
}
2222
logLevel = parsedLevel
2323

24+
if *enableTLS && (*certPath == "" || *certKeyPath == "") {
25+
log.Fatal("-enable-tls requires -cert and -cert-key")
26+
}
27+
28+
if *logJSON {
29+
log.SetFormatter(&log.JSONFormatter{})
30+
} else {
31+
log.SetFormatter(&log.TextFormatter{
32+
DisableColors: true,
33+
FullTimestamp: true,
34+
})
35+
}
36+
2437
prometheus.MustRegister(version.NewCollector("zookeeper_exporter"))
2538
}
2639

2740
var (
2841
logLevel log.Level = log.InfoLevel
42+
logJSON = flag.Bool("log-json", false, "Log output as JSON")
2943
bindAddr = flag.String("bind-addr", ":9141", "bind address for the metrics server")
44+
enableTLS = flag.Bool("enable-tls", false, "Connect to zookeeper using TLS. Requires -cert and -cert-key")
45+
certPath = flag.String("cert", "", "path to certificate including any intermediaries")
46+
certKeyPath = flag.String("cert-key", "", "path to certificate key")
3047
metricsPath = flag.String("metrics-path", "/metrics", "path to metrics endpoint")
3148
zookeeperAddr = flag.String("zookeeper", "localhost:2181", "host:port for zookeeper socket")
3249
rawLevel = flag.String("log-level", "info", "log level")

zookeeper.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"bufio"
55
"bytes"
6+
"crypto/tls"
67
"net"
78
"strconv"
89
"strings"
@@ -190,7 +191,7 @@ const (
190191
func sendZkCommand(fourLetterWord string) (string, bool) {
191192
log.Debugf("Connecting to Zookeeper at %s", *zookeeperAddr)
192193

193-
conn, err := net.Dial("tcp", *zookeeperAddr)
194+
conn, err := zkConnect()
194195
if err != nil {
195196
log.WithFields(log.Fields{"error": err}).Error("Unable to open connection to Zookeeper")
196197
return "", false
@@ -223,3 +224,19 @@ func sendZkCommand(fourLetterWord string) (string, bool) {
223224

224225
return buffer.String(), true
225226
}
227+
228+
func zkConnect() (net.Conn, error) {
229+
if *enableTLS {
230+
log.Debugf("TLS certificate: %s key: %s", *certPath, *certKeyPath)
231+
cert, err := tls.LoadX509KeyPair(*certPath, *certKeyPath)
232+
if err != nil {
233+
log.WithFields(log.Fields{"error": err}).Error("Unable to read TLS cert or key")
234+
return nil, err
235+
}
236+
return tls.Dial("tcp", *zookeeperAddr, &tls.Config{
237+
Certificates: []tls.Certificate{cert},
238+
})
239+
}
240+
241+
return net.Dial("tcp", *zookeeperAddr)
242+
}

0 commit comments

Comments
 (0)