Display RethinkDB cluster statistics in a live graph using Go, Socket.io, and Epoch.
RethinkDBCluster Monitoring
View Slide
Ryan PaulRethinkDBEvangelist@segphault
RethinkDB 1.16• Changefeeds• Cluster admin• System tables
BackendGo and RethinkDB
Watch cluster statsr.Db("rethinkdb").Table("stats").Changes()
"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}}
Watch cluster statsr.Db("rethinkdb").Table("stats").Filter(r.Row.Field("id").AtIndex(0).Eq("cluster")).Changes()
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.WriteChangesfor stats.Next(&change) {server.BroadcastTo("monitor", "stats", change.NewValue)}}()Pass changes to Socket.io
FrontendEpoch and Polymer
EpochA realtime charting library for buildinghigh performance visualizations.
Plot data with Epochfunction 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}]);});
BonusIRC bot for issue notification
Initialize botircConf := 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")})
Attach changefeedtype 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 Issuefor 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)}}}()
Resources• http://rethinkdb.com/blog/realtime-cluster-monitoring/• https://github.com/rethinkdb/rethink-status/tree/go-backend• http://rethinkdb.com/docs/quickstart/Questions?