Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Berlin 2013 - Riemann Workshop - Pierre-Yves Ri...
Search
Monitorama
September 20, 2013
2
650
Berlin 2013 - Riemann Workshop - Pierre-Yves Ritschard
Monitorama
September 20, 2013
Tweet
Share
More Decks by Monitorama
See All by Monitorama
Monitorama PDX 2017 - Ian Bennett
monitorama
1
580
PDX 2017 - Pedro Andrade
monitorama
0
740
PDX 2017 - Roy Rapoport
monitorama
4
940
PDX 2017 - Julia Evans
monitorama
0
470
Berlin 2013 - Session - Brad Lhotsky
monitorama
5
710
Berlin 2013 - Session - Alex Petrov
monitorama
6
680
Berlin 2013 - Session - Jeff Weinstein
monitorama
2
620
Berlin 2013 - Session - Oliver Hankeln
monitorama
1
540
Berlin 2013 - Session - David Goodlad
monitorama
0
450
Featured
See All Featured
How to Ace a Technical Interview
jacobian
278
23k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
Fireside Chat
paigeccino
37
3.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Git: the NoSQL Database
bkeepers
PRO
430
65k
Thoughts on Productivity
jonyablonski
69
4.7k
Testing 201, or: Great Expectations
jmmastey
43
7.6k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Transcript
@pyr
https://github.com/pyr
• Riemann concepts • In-app events • System metrics •
Just enough clojure • Common use cases Agenda
Event stream processor • Process • Analyze • React
None
{: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 bernhard c = bernhard.Client() c.send({‘host’: “appserver”, ‘service’: “sql query
time”, ‘metric’: 200})
require ‘riemann/client’ c = Riemann::Client.new c << {host: “appserver”, service:
“sql query time”, metric: 200}
LoadPlugin write_riemann <Plugin write_riemann> <Node “main”> Host “riemann-host” </Node> </Plugin>
Event lifecycle • Enters riemann • Follows streams • Optionally
indexed
Looking at events • Queries • Dashboard
require ‘riemann/client’ c = Riemann::Client.new c[‘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 :baz 2}
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)))]
(streams index))
Streams (let [index (default {:ttl 60 :state “ok”} (update-index (index)))
email (mailer {:from “riemann@production”})] (streams index (where (state “critical”) email) ))
Demo!