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
720
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Berlin 2013 - Riemann Workshop - Pierre-Yves Ritschard
Monitorama
September 20, 2013
More Decks by Monitorama
See All by Monitorama
Monitorama PDX 2017 - Ian Bennett
monitorama
1
640
PDX 2017 - Pedro Andrade
monitorama
0
840
PDX 2017 - Roy Rapoport
monitorama
4
1k
PDX 2017 - Julia Evans
monitorama
0
530
Berlin 2013 - Session - Brad Lhotsky
monitorama
5
770
Berlin 2013 - Session - Alex Petrov
monitorama
6
730
Berlin 2013 - Session - Jeff Weinstein
monitorama
2
670
Berlin 2013 - Session - Oliver Hankeln
monitorama
1
600
Berlin 2013 - Session - David Goodlad
monitorama
0
530
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Documentation Writing (for coders)
carmenintech
77
5.5k
Statistics for Hackers
jakevdp
799
230k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
How to Ace a Technical Interview
jacobian
281
24k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
WENDY [Excerpt]
tessaabrams
11
39k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
220
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
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!