@pyr
View Slide
https://github.com/pyr
● Riemann concepts● In-app events● System metrics● Just enough clojure● Common use casesAgenda
Event stream processor● Process● Analyze● React
{:host “foo1”:service “cpu %”:metric 50.85:state “ok”:description “System CPU gauge”}
Where do events come from● Your app● Collectd● Riemann-health● Logstash
import bernhardc = bernhard.Client()c.send({‘host’: “appserver”,‘service’: “sql query time”,‘metric’: 200})
require ‘riemann/client’c = Riemann::Client.newc << {host: “appserver”,service: “sql query time”,metric: 200}
LoadPlugin write_riemannHost “riemann-host”
Event lifecycle● Enters riemann● Follows streams● Optionally indexed
Looking at events● Queries● Dashboard
require ‘riemann/client’c = Riemann::Client.newc[‘true’]c[‘service = “cpu”’]c[‘tagged “web-servers”’]
Configuration API Features● Percentiles● EWMA● Fixed / Moving event windows● Event coalescing● Many more
Configuration● Configuration is code● Code is in clojure
Clojure
Clojure● Functional Lisp● Immutable● Data first, not objects first● Lazy● Concurrent
Clojure(defn hello [name](println “hello” name)(def a-map {:some-key “some value”})(def an-array [0 1 2 :foo])(def a-set #{:a :b :c})(def a-pattern #”^(.*)[ \t]+=(.*)[ \t]+$”)(def inline-fn #(+ 3 %))(def anon-fn (fn [a b] (+ a b)))
Clojure(defn greeter [greeting](fn [name](println greeting “, “ name)))(let [german-greeting (greeter “Hallo”)](german-greeting “Rich”))
Clojure(let [m {:foo 0 :bar 1}a [3 2 1 0]](conj a 4) ;; => (4 3 2 1 0)(assoc m :baz 2)) ;; => {:foo 0 :bar 1 :baz2}
Clojure(ns my-sql-query-ns(:require [clojure.data.jdbc :as jdbc][clojure.data.jdbc.sql :as sql]))(jdbc/query mysql-db(sql/select * :users));;=> ({:login “root” :uid 0} {:login :daemon :uid 1})
Clojure(def lotsa-ones (repeat 1)) ;; => lazy-seq(take 5 lotsa-ones) ;; => (1 1 1 1 1)(take 2(interleave lotsa-ones (repeat 2))) ;; => (1 2)
Clojure(def requests (atom 0))(swap! requests inc)@request ;; => 1(def user1 (ref 10))(def user2 (ref 50))(dosync(alter user1 + 10)(alter user2 - 10))@user1 ;; => 20@user2 ;; => 40
Clojure(def users{:alice {:balance 10}:bob {:balance 5}})(defn transaction [from to amount](-> users(update-in [from :balance] - amount)(update-in [to :balance] + amount)))
Index(def index(default {:ttl 60 :state “ok”}(update-index (index))))
Streams(let [index (default {:ttl 60 :state “ok”}(update-index (index)))](streamsindex))
Streams(let [index (default {:ttl 60 :state “ok”}(update-index (index)))email (mailer {:from “riemann@production”})](streamsindex(where (state “critical”)email)))
Demo!