Slide 1

Slide 1 text

RethinkDB Cluster Monitoring

Slide 2

Slide 2 text

Ryan Paul RethinkDB Evangelist @segphault

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

RethinkDB 1.16 • Changefeeds • Cluster admin • System tables

Slide 5

Slide 5 text

Backend Go and RethinkDB

Slide 6

Slide 6 text

Watch cluster stats r.Db("rethinkdb").Table("stats").Changes()

Slide 7

Slide 7 text

"new_val": { "id": ["cluster"], "query_engine": { "client_connections": 10, "clients_active": 2, "queries_per_sec": 12.971126524000002, "read_docs_per_sec": 0, "written_docs_per_sec": 7.4114252490000005 } }

Slide 8

Slide 8 text

Watch cluster stats r.Db("rethinkdb").Table("stats"). Filter(r.Row.Field("id").AtIndex(0).Eq("cluster")). Changes()

Slide 9

Slide 9 text

server, _ := socketio.NewServer(nil) stats, _ := r.Db("rethinkdb").Table("stats"). Filter(r.Row.Field("id").AtIndex(0).Eq("cluster")). Changes().Run(conn) go func() { var change r.WriteChanges for stats.Next(&change) { server.BroadcastTo( "monitor", "stats", change.NewValue) } }() Pass changes to Socket.io

Slide 10

Slide 10 text

Frontend Epoch and Polymer

Slide 11

Slide 11 text

Epoch A realtime charting library for building high performance visualizations.

Slide 12

Slide 12 text

Plot data with Epoch function timestamp() { return (new Date).getTime() / 1000; } var chart = $("#chart").epoch({ type: "time.line", axes: ["left", "bottom"], data: [ {label: "Writes", values: [{time: timestamp(), y: 0}]}, {label: "Reads", values: [{time: timestamp(), y: 0}]} ] }); var socket = io.connect(); socket.on("stats", function(data) { cluster.stats = data.query_engine; chart.push([ {time: timestamp(), y: cluster.stats.written_docs_per_sec}, {time: timestamp(), y: cluster.stats.read_docs_per_sec} ]); });

Slide 13

Slide 13 text

Bonus IRC bot for issue notification

Slide 14

Slide 14 text

Initialize bot ircConf := irc.NewConfig("mybot") ircConf.Server = "localhost:6667" bot := irc.Client(ircConf) bot.HandleFunc("connected", func(conn *irc.Conn, line *irc.Line) { log.Println("Connected to IRC server") conn.Join("#mychannel") })

Slide 15

Slide 15 text

Attach changefeed type Issue struct { Description, Type string } issues, _ := r.Db("rethinkdb").Table("current_issues"). Filter(r.Row.Field("critical").Eq(true)). Changes().Field("new_val").Run(db) go func() { var issue Issue for issues.Next(&issue) { if issue.Type != "" { text := strings.Split(issue.Description, "\n")[0] message := fmt.Sprintf("(%s) %s", issue.Type, text) bot.Privmsg("#mychannel", message) } } }()

Slide 16

Slide 16 text

Resources • http://rethinkdb.com/blog/realtime-cluster-monitoring/ • https://github.com/rethinkdb/rethink-status/tree/go-backend • http://rethinkdb.com/docs/quickstart/ Questions?