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 Ritschard
Search
Monitorama
September 20, 2013
2
590
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
550
PDX 2017 - Pedro Andrade
monitorama
0
610
PDX 2017 - Roy Rapoport
monitorama
4
870
PDX 2017 - Julia Evans
monitorama
0
400
Berlin 2013 - Session - Brad Lhotsky
monitorama
5
650
Berlin 2013 - Session - Alex Petrov
monitorama
6
630
Berlin 2013 - Session - Jeff Weinstein
monitorama
2
570
Berlin 2013 - Session - Oliver Hankeln
monitorama
1
490
Berlin 2013 - Session - David Goodlad
monitorama
0
370
Featured
See All Featured
Debugging Ruby Performance
tmm1
71
11k
What the flash - Photography Introduction
edds
65
11k
Bootstrapping a Software Product
garrettdimon
PRO
304
110k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
20
7.2k
Navigating Team Friction
lara
181
13k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
24
1.8k
A Philosophy of Restraint
colly
200
16k
Clear Off the Table
cherdarchuk
89
320k
Six Lessons from altMBA
skipperchong
24
3.2k
GitHub's CSS Performance
jonrohan
1026
450k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
26
2.1k
Robots, Beer and Maslow
schacon
PRO
157
8.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!