SlideShare a Scribd company logo
1 of 34
Esperwhispering:
Using Esper to Find Problems in Real-time Data




             / Real-time and real(ly) big


                          1
Who am I? @postwait on twitter


       Author of “Scalable Internet Architectures”
       Pearson, ISBN: 067232699X

       Contributor to “Web Operations”
       O’Reilly, ISBN: 1449377440



       Founder of OmniTI, Message Systems, Fontdeck, & Circonus
       I like to tackle problems that are “always on” and “always growing.”




       I am an Engineer
       A practitioner of academic computing.
       IEEE member and Senior ACM member.
       On the Editorial Board of ACM’s Queue magazine.
       On the ACM professions board.


                                     2
What is BigData?




    •   Few agree.

    •   I say it is any data-related problem that
        can’t be solved (well) on one machine.

    •   Never use a distributed system to solve a problem
        that can be easily solved on a single system:

        •   performance

        •   simplicity

        •   debugability




3
Framing the data problem




      •   events... to make it web related, lets say it is web activity

      •   for every user action, we have an event

      •   an event is composed of about 20-30 known attributes
          (say ~400 bytes)

          •   url, referrer, site category,

          •   ip address, ASN, geo location info,

          •   user-perceived performance info (like load time)




4
Framing the volume problem




      •   We see 100 of these per second on a site

          •   Easy problem (more or less)

      •   We run SaaS, so we need to support 2000 customers:

          •   200,000 events/second
              (or 30x = 6,000,000 column appends/second)




5
What do we want?



        •   I want answers, dammit

        •   I would like to know what is slow (or fast) by

            •   ASN

            •   geo location

            •   browser type

        •   I’d also like to know given an event:

            •   is it outside the average +/- 2 x σ

            •   over the last 5 minutes




6
What else do we want?




        •   I want answers now, dammit




7
What else do we want?




        •   I want answers now, dammit


                            defined: not later




7
What is real-time?




       •   The correctness of the answer depends on both the logical
           correctness of the result and temporal proximity of the result and
           the question.

           •   hard real-time: old answers are worthless.

           •   soft real-time: old answers are worth less.




8
Real-time on the Internet



     •   Hard real-time systems on the Internet;
         this sort of thing ain’t my bag, baby!




     •   Someone is just going to get hurt.




9
Soft real-time?




     •   We need soft real-time systems any time we are going to react to a user.

     •   If the answer is either wrong or late, it is less relevant to them.

     •   The problems we look at have temporal constraints ranging from
         5 seconds (counters and statistics) to
         1 second (fraud detection) to
         10 milliseconds (user-action reaction) and
         everywhere in between.




10
Enter CEP




     •   Complex Event Processing...

         •   Queries always running.

         •   Tuples introduced.

         •   Tuples emitted.

     •                    ’s Esper is my hero.




11
Typical (OmniTI) Esper deployment:



     custom Java glue




                         Application
                        Infrastructure
                            Cloud



12
More concretely




     •   node.js listens for web requests and submits data to Esper via AMQP

     •   Esper runs “magic”

     •   The output of that magic is pushed back via AMQP

     •   node.js listens and returns data back over JSONP.




13
What our event really looks like:
{
    '_ls_part': { 'type': 'String' },

    'url_schema': { 'type': 'String' },
    'url_host': { 'type': 'String' },
    'url': { 'type': 'String' },
    'referrer_schema': { 'type': 'String' },
    'referrer_host': { 'type': 'String' },
    'referrer_path': { 'type': 'String' },
    'ip': { 'type': 'String' },
    'method' : { 'type': 'String' },
    'http_version' : { 'type': 'String' },         'asn': { 'type': 'Integer' },
    'browser': { 'type': 'String' },               'asn_orgname': { 'type': 'String' },
    'browser_version': { 'type': 'String' },       'map_id': { 'type': 'String' },
                                                   'geoip_longitude': { 'type': 'Double' },
    'red_time': { 'type': 'Double' },              'geoip_latitude': { 'type': 'Double' },
    'dns_time': { 'type': 'Double' },              'geoip_country_code': { 'type': 'String' },
    'con_time': { 'type': 'Double' },              'geoip_continent_code': { 'type': 'String' },
    'req_start': { 'type': 'Double' },             'geoip_region': { 'type': 'String' },
    'res_start': { 'type': 'Double' },             'geoip_metro_code': { 'type': 'Integer' },
    'res_end': { 'type': 'Double' },               'geoip_country': { 'type': 'String' },
    'dom_time': { 'type': 'Double', },             'geoip_city': { 'type': 'String' },
    'load_time': { 'type': 'Double', },            'geoip_area_code': { 'type': 'Integer' }
                                               }


14
What our event really looks like:
{
    '_ls_part': { 'type': 'String' },
                                                   Client Token
    'url_schema': { 'type': 'String' },
    'url_host': { 'type': 'String' },
    'url': { 'type': 'String' },
    'referrer_schema': { 'type': 'String' },
    'referrer_host': { 'type': 'String' },
    'referrer_path': { 'type': 'String' },
    'ip': { 'type': 'String' },
    'method' : { 'type': 'String' },
    'http_version' : { 'type': 'String' },         'asn': { 'type': 'Integer' },
    'browser': { 'type': 'String' },               'asn_orgname': { 'type': 'String' },
    'browser_version': { 'type': 'String' },       'map_id': { 'type': 'String' },
                                                   'geoip_longitude': { 'type': 'Double' },
    'red_time': { 'type': 'Double' },              'geoip_latitude': { 'type': 'Double' },
    'dns_time': { 'type': 'Double' },              'geoip_country_code': { 'type': 'String' },
    'con_time': { 'type': 'Double' },              'geoip_continent_code': { 'type': 'String' },
    'req_start': { 'type': 'Double' },             'geoip_region': { 'type': 'String' },
    'res_start': { 'type': 'Double' },             'geoip_metro_code': { 'type': 'Integer' },
    'res_end': { 'type': 'Double' },               'geoip_country': { 'type': 'String' },
    'dom_time': { 'type': 'Double', },             'geoip_city': { 'type': 'String' },
    'load_time': { 'type': 'Double', },            'geoip_area_code': { 'type': 'Integer' }
                                               }


14
What our event really looks like:
{
    '_ls_part': { 'type': 'String' },
                                                   Client Token
    'url_schema': { 'type': 'String' },
    'url_host': { 'type': 'String' },
    'url': { 'type': 'String' },
                                                       HTTP Info
    'referrer_schema': { 'type': 'String' },
    'referrer_host': { 'type': 'String' },
    'referrer_path': { 'type': 'String' },
    'ip': { 'type': 'String' },
    'method' : { 'type': 'String' },
    'http_version' : { 'type': 'String' },         'asn': { 'type': 'Integer' },
    'browser': { 'type': 'String' },               'asn_orgname': { 'type': 'String' },
    'browser_version': { 'type': 'String' },       'map_id': { 'type': 'String' },
                                                   'geoip_longitude': { 'type': 'Double' },
    'red_time': { 'type': 'Double' },              'geoip_latitude': { 'type': 'Double' },
    'dns_time': { 'type': 'Double' },              'geoip_country_code': { 'type': 'String' },
    'con_time': { 'type': 'Double' },              'geoip_continent_code': { 'type': 'String' },
    'req_start': { 'type': 'Double' },             'geoip_region': { 'type': 'String' },
    'res_start': { 'type': 'Double' },             'geoip_metro_code': { 'type': 'Integer' },
    'res_end': { 'type': 'Double' },               'geoip_country': { 'type': 'String' },
    'dom_time': { 'type': 'Double', },             'geoip_city': { 'type': 'String' },
    'load_time': { 'type': 'Double', },            'geoip_area_code': { 'type': 'Integer' }
                                               }


14
What our event really looks like:
{
    '_ls_part': { 'type': 'String' },
                                                   Client Token
    'url_schema': { 'type': 'String' },
    'url_host': { 'type': 'String' },
    'url': { 'type': 'String' },
                                                       HTTP Info
    'referrer_schema': { 'type': 'String' },
    'referrer_host': { 'type': 'String' },
    'referrer_path': { 'type': 'String' },
    'ip': { 'type': 'String' },
    'method' : { 'type': 'String' },
    'http_version' : { 'type': 'String' },         'asn': { 'type': 'Integer' },
    'browser': { 'type': 'String' },               'asn_orgname': { 'type': 'String' },
    'browser_version': { 'type': 'String' },       'map_id': { 'type': 'String' },
                                                   'geoip_longitude': { 'type': 'Double' },
    'red_time': { 'type': 'Double' },              'geoip_latitude': { 'type': 'Double' },
    'dns_time': { 'type': 'Double' },              'geoip_country_code': { 'type': 'String' },
    'con_time': { 'type': 'Double' },              'geoip_continent_code': { 'type': 'String' },
    'req_start': { 'type': 'Double' },             'geoip_region': { 'type': 'String' },
    'res_start': { 'type': 'Double' },             'geoip_metro_code': { 'type': 'Integer' },
    'res_end': { 'type': 'Double' },               'geoip_country': { 'type': 'String' },
    'dom_time': { 'type': 'Double', },             'geoip_city': { 'type': 'String' },
    'load_time': { 'type': 'Double', },            'geoip_area_code': { 'type': 'Integer' }
                                               }
             User Perceived Performance Data
14
What our event really looks like:
{
    '_ls_part': { 'type': 'String' },
                                                   Client Token
    'url_schema': { 'type': 'String' },
    'url_host': { 'type': 'String' },
    'url': { 'type': 'String' },
                                                       HTTP Info
    'referrer_schema': { 'type': 'String' },
    'referrer_host': { 'type': 'String' },
    'referrer_path': { 'type': 'String' },
                                                                 User Location
    'ip': { 'type': 'String' },
    'method' : { 'type': 'String' },
    'http_version' : { 'type': 'String' },         'asn': { 'type': 'Integer' },
    'browser': { 'type': 'String' },               'asn_orgname': { 'type': 'String' },
    'browser_version': { 'type': 'String' },       'map_id': { 'type': 'String' },
                                                   'geoip_longitude': { 'type': 'Double' },
    'red_time': { 'type': 'Double' },              'geoip_latitude': { 'type': 'Double' },
    'dns_time': { 'type': 'Double' },              'geoip_country_code': { 'type': 'String' },
    'con_time': { 'type': 'Double' },              'geoip_continent_code': { 'type': 'String' },
    'req_start': { 'type': 'Double' },             'geoip_region': { 'type': 'String' },
    'res_start': { 'type': 'Double' },             'geoip_metro_code': { 'type': 'Integer' },
    'res_end': { 'type': 'Double' },               'geoip_country': { 'type': 'String' },
    'dom_time': { 'type': 'Double', },             'geoip_city': { 'type': 'String' },
    'load_time': { 'type': 'Double', },            'geoip_area_code': { 'type': 'Integer' }
                                               }
             User Perceived Performance Data
14
First steps for simplicity




     •   I want to create a view on 30 minutes of data for a specific client and
         populate that view with those “hit” events:

         create window fl9875309_hit30m.win:time(30 minute) as hit
         insert into fl9875309_hit30m select * from hit(_ls_part='fl9875309')


     •   Some useful thoughts:

         •   data flowing into this window: “istream”

         •   data also flowing out of this window (after 30 minutes): “rstream”

         •   if you are interested in both streams, we call it: “irstream”




15
Asking a question:

     •   EPL, as you can see looks much like SQL... so

         select count(*) from fl9875309_hit30m


     •   SQLers will be very surprised by the result of this...

         •     ideas?

     •   Hint: this query runs forever and emits results as available

     •   Esper defaults to use the istream of events form which it selects

     •   So:

         •     this statement emits a result on each event entering the window

         •     and the return set is the total number of events within the window

     •   We really wanted:

         select irstream count(*) from fl9875309_hit30m



16
Asking a (cooler) question:




     •   I’d like to know the view volume by referring site.. so

         select irstream referrer_host, count(*) as views
         from fl9875309_hit30m
         where referrer_host <> url_host
         group by referrer_host


     •   This outputs on any event entering or leaving the window... but,

         •   it only outputs the group that is being updated by the event(s)
             entering and/or leaving the window...

         •   (perhaps) not so useful




17
Snapshots




     •   Sometimes you want to see the complete state.

     •   Given that we’re asynch, we can decouple the output from the input.

     •   Let’s get the top 10 referrers, every 5 seconds.

         select irstream referrer_host, count(*) as views
         from fl9875309_hit30m
         where referrer_host <> url_host
         group by referrer_host
         output snapshot every 5 seconds
         order by count(*) desc
         limit 10




18
Finding anomalies...



     •   Note: this is very very simplistic.




19
Finding anomalies...



     •   Note: this is very very simplistic.

     •   I’d like to break the dataset out by network (AS)




19
Finding anomalies...



     •   Note: this is very very simplistic.

     •   I’d like to break the dataset out by network (AS)

     •   I’d like to find individual hits whose load_time is
         greater than the average + 3 times the standard deviation




19
Finding anomalies...



     •   Note: this is very very simplistic.

     •   I’d like to break the dataset out by network (AS)

     •   I’d like to find individual hits whose load_time is
         greater than the average + 3 times the standard deviation

     •   I’d like details about the hit’s IP, browser and load_time




19
Finding anomalies...



     •   Note: this is very very simplistic.

     •   I’d like to break the dataset out by network (AS)

     •   I’d like to find individual hits whose load_time is
         greater than the average + 3 times the standard deviation

     •   I’d like details about the hit’s IP, browser and load_time

         select asn_orgname, browser_version, ip, load_time,
                average, stddev, datapoints as sample_size
           from fl9875309_hit30m(load_time is not null)
                  .std:groupwin(asn_orgname)
                  .stat:uni(load_time, ip, browser_version, load_time) as s
          where s.load_time > s.average + 3 * s.stddev




19
Finding anomalies...



     •   Note: this is very very simplistic.

     •   I’d like to break the dataset out by network (AS)

     •   I’d like to find individual hits whose load_time is
         greater than the average + 3 times the standard deviation

     •   I’d like details about the hit’s IP, browser and load_time

         select asn_orgname, browser_version, ip, load_time,
                average, stddev, datapoints as sample_size
           from fl9875309_hit30m(load_time is not null)
                  .std:groupwin(asn_orgname)
                  .stat:uni(load_time, ip, browser_version, load_time) as s
          where s.load_time > s.average + 3 * s.stddev




19
Finding anomalies...



     •   Note: this is very very simplistic.

     •   I’d like to break the dataset out by network (AS)

     •   I’d like to find individual hits whose load_time is
         greater than the average + 3 times the standard deviation

     •   I’d like details about the hit’s IP, browser and load_time

         select asn_orgname, browser_version, ip, load_time,
                average, stddev, datapoints as sample_size
           from fl9875309_hit30m(load_time is not null)
                  .std:groupwin(asn_orgname)
                  .stat:uni(load_time, ip, browser_version, load_time) as s
          where s.load_time > s.average + 3 * s.stddev




19
Finding anomalies...



     •   Note: this is very very simplistic.

     •   I’d like to break the dataset out by network (AS)

     •   I’d like to find individual hits whose load_time is
         greater than the average + 3 times the standard deviation

     •   I’d like details about the hit’s IP, browser and load_time

         select asn_orgname, browser_version, ip, load_time,
                average, stddev, datapoints as sample_size
           from fl9875309_hit30m(load_time is not null)
                  .std:groupwin(asn_orgname)
                  .stat:uni(load_time, ip, browser_version, load_time) as s
          where s.load_time > s.average + 3 * s.stddev




19
Mapping it all out.

     •   Looking at performance: a world’s-eye view
What’s this all mean?



     •   Big data is all relative.

         •   100 records/s at 400 bytes each is... ~3GB/day or ~1TB/year

         •   100,000 records/s is... ~3TB/day or 1PB/year

         •   500,000 records/s is... ~15TB/day or 5PB/year

     •   Which is big data? you choose.

     •   The technology that can act on this in real-time exists and is different
         that the technologies to store it and crunch it.

     •   Don’t think big... think efficient.
Thank You

    • Thanks you

    • Thank you

    • Thanks you

    • Consider attending:
            Surge 2011
            discussing scalability matters,
            because scalability matters


    • Thank you!

More Related Content

What's hot

MongoDB .local Munich 2019: Tips and Tricks++ for Querying and Indexing MongoDB
MongoDB .local Munich 2019: Tips and Tricks++ for Querying and Indexing MongoDBMongoDB .local Munich 2019: Tips and Tricks++ for Querying and Indexing MongoDB
MongoDB .local Munich 2019: Tips and Tricks++ for Querying and Indexing MongoDBMongoDB
 
JWT - To authentication and beyond!
JWT - To authentication and beyond!JWT - To authentication and beyond!
JWT - To authentication and beyond!Luís Cobucci
 
MongoDB .local Munich 2019: New Encryption Capabilities in MongoDB 4.2: A Dee...
MongoDB .local Munich 2019: New Encryption Capabilities in MongoDB 4.2: A Dee...MongoDB .local Munich 2019: New Encryption Capabilities in MongoDB 4.2: A Dee...
MongoDB .local Munich 2019: New Encryption Capabilities in MongoDB 4.2: A Dee...MongoDB
 
Code Tops Comments
Code Tops CommentsCode Tops Comments
Code Tops CommentsMr Giap
 
はじめてのMongoDB
はじめてのMongoDBはじめてのMongoDB
はじめてのMongoDBTakahiro Inoue
 
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...MongoDB
 
MongoDB Performance Debugging
MongoDB Performance DebuggingMongoDB Performance Debugging
MongoDB Performance DebuggingMongoDB
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB
 
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...MongoDB
 
Schema design
Schema designSchema design
Schema designchristkv
 
MongoDB + node.js で作るソーシャルゲーム
MongoDB + node.js で作るソーシャルゲームMongoDB + node.js で作るソーシャルゲーム
MongoDB + node.js で作るソーシャルゲームSuguru Namura
 
MongoDB .local Houston 2019: Using Client Side Encryption in MongoDB 4.2
MongoDB .local Houston 2019: Using Client Side Encryption in MongoDB 4.2MongoDB .local Houston 2019: Using Client Side Encryption in MongoDB 4.2
MongoDB .local Houston 2019: Using Client Side Encryption in MongoDB 4.2MongoDB
 
The State of NoSQL
The State of NoSQLThe State of NoSQL
The State of NoSQLBen Scofield
 
Thoughts on MongoDB Analytics
Thoughts on MongoDB AnalyticsThoughts on MongoDB Analytics
Thoughts on MongoDB Analyticsrogerbodamer
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance TuningPuneet Behl
 
DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks Felipe Prado
 
CouchDB @ red dirt ruby conference
CouchDB @ red dirt ruby conferenceCouchDB @ red dirt ruby conference
CouchDB @ red dirt ruby conferenceleinweber
 

What's hot (20)

MongoDB .local Munich 2019: Tips and Tricks++ for Querying and Indexing MongoDB
MongoDB .local Munich 2019: Tips and Tricks++ for Querying and Indexing MongoDBMongoDB .local Munich 2019: Tips and Tricks++ for Querying and Indexing MongoDB
MongoDB .local Munich 2019: Tips and Tricks++ for Querying and Indexing MongoDB
 
JWT - To authentication and beyond!
JWT - To authentication and beyond!JWT - To authentication and beyond!
JWT - To authentication and beyond!
 
MongoDB .local Munich 2019: New Encryption Capabilities in MongoDB 4.2: A Dee...
MongoDB .local Munich 2019: New Encryption Capabilities in MongoDB 4.2: A Dee...MongoDB .local Munich 2019: New Encryption Capabilities in MongoDB 4.2: A Dee...
MongoDB .local Munich 2019: New Encryption Capabilities in MongoDB 4.2: A Dee...
 
Code Tops Comments
Code Tops CommentsCode Tops Comments
Code Tops Comments
 
はじめてのMongoDB
はじめてのMongoDBはじめてのMongoDB
はじめてのMongoDB
 
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...
 
Postgres demystified
Postgres demystifiedPostgres demystified
Postgres demystified
 
MongoDB Performance Debugging
MongoDB Performance DebuggingMongoDB Performance Debugging
MongoDB Performance Debugging
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
 
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
 
Schema design
Schema designSchema design
Schema design
 
MongoDB + node.js で作るソーシャルゲーム
MongoDB + node.js で作るソーシャルゲームMongoDB + node.js で作るソーシャルゲーム
MongoDB + node.js で作るソーシャルゲーム
 
MongoDB .local Houston 2019: Using Client Side Encryption in MongoDB 4.2
MongoDB .local Houston 2019: Using Client Side Encryption in MongoDB 4.2MongoDB .local Houston 2019: Using Client Side Encryption in MongoDB 4.2
MongoDB .local Houston 2019: Using Client Side Encryption in MongoDB 4.2
 
The State of NoSQL
The State of NoSQLThe State of NoSQL
The State of NoSQL
 
Thoughts on MongoDB Analytics
Thoughts on MongoDB AnalyticsThoughts on MongoDB Analytics
Thoughts on MongoDB Analytics
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance Tuning
 
DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks
 
Ruby and JS quirks
Ruby and JS quirksRuby and JS quirks
Ruby and JS quirks
 
CouchDB @ red dirt ruby conference
CouchDB @ red dirt ruby conferenceCouchDB @ red dirt ruby conference
CouchDB @ red dirt ruby conference
 
Data exchange formats
Data exchange formatsData exchange formats
Data exchange formats
 

Viewers also liked

Solving the "Brooklyn Problem"
Solving the "Brooklyn Problem" Solving the "Brooklyn Problem"
Solving the "Brooklyn Problem" Kellan
 
Applying operations culture to everything
Applying operations culture to everythingApplying operations culture to everything
Applying operations culture to everythingTheo Schlossnagle
 
Velocity 2010: Scalable Internet Architectures
Velocity 2010: Scalable Internet ArchitecturesVelocity 2010: Scalable Internet Architectures
Velocity 2010: Scalable Internet ArchitecturesTheo Schlossnagle
 
Big Bad PostgreSQL @ Percona
Big Bad PostgreSQL @ PerconaBig Bad PostgreSQL @ Percona
Big Bad PostgreSQL @ PerconaTheo Schlossnagle
 
OmniOS Motivation and Design ~ LISA 2012
OmniOS Motivation and Design ~ LISA 2012OmniOS Motivation and Design ~ LISA 2012
OmniOS Motivation and Design ~ LISA 2012Theo Schlossnagle
 
Monitoring is easy, why are we so bad at it presentation
Monitoring is easy, why are we so bad at it  presentationMonitoring is easy, why are we so bad at it  presentation
Monitoring is easy, why are we so bad at it presentationTheo Schlossnagle
 
Scalable Internet Architecture
Scalable Internet ArchitectureScalable Internet Architecture
Scalable Internet ArchitectureTheo Schlossnagle
 
Monitoring and observability
Monitoring and observabilityMonitoring and observability
Monitoring and observabilityTheo Schlossnagle
 
DEBS 2015 Tutorial : Patterns for Realtime Streaming Analytics
DEBS 2015 Tutorial : Patterns for Realtime Streaming AnalyticsDEBS 2015 Tutorial : Patterns for Realtime Streaming Analytics
DEBS 2015 Tutorial : Patterns for Realtime Streaming AnalyticsSriskandarajah Suhothayan
 
Get AMP’ed for AMP!
Get AMP’ed for AMP!Get AMP’ed for AMP!
Get AMP’ed for AMP!Greenlane
 
横手版地方発信のソーシャルメディア
横手版地方発信のソーシャルメディア横手版地方発信のソーシャルメディア
横手版地方発信のソーシャルメディアSkunkWork.Co.,Ltd
 
Import Guide - Cloud for Customer Edge and Starter Edition - Guide v2.6
Import Guide - Cloud for Customer Edge and Starter Edition - Guide v2.6Import Guide - Cloud for Customer Edge and Starter Edition - Guide v2.6
Import Guide - Cloud for Customer Edge and Starter Edition - Guide v2.6Tiziano Menconi
 
Investing 101: How to Prepare for Retirement
Investing 101: How to Prepare for RetirementInvesting 101: How to Prepare for Retirement
Investing 101: How to Prepare for RetirementExperian_US
 
Parecer jurídico normativo 36 2011 CFESS
Parecer jurídico normativo 36 2011 CFESSParecer jurídico normativo 36 2011 CFESS
Parecer jurídico normativo 36 2011 CFESSFILIPE NERI
 
Delivering Vertical Social Apps - Dreamforce - 9/18
Delivering Vertical Social Apps - Dreamforce - 9/18Delivering Vertical Social Apps - Dreamforce - 9/18
Delivering Vertical Social Apps - Dreamforce - 9/18Salesforce Partners
 

Viewers also liked (20)

Solving the "Brooklyn Problem"
Solving the "Brooklyn Problem" Solving the "Brooklyn Problem"
Solving the "Brooklyn Problem"
 
Web Operations Career
Web Operations CareerWeb Operations Career
Web Operations Career
 
Applying operations culture to everything
Applying operations culture to everythingApplying operations culture to everything
Applying operations culture to everything
 
PostgreSQL on Solaris
PostgreSQL on SolarisPostgreSQL on Solaris
PostgreSQL on Solaris
 
Velocity 2010: Scalable Internet Architectures
Velocity 2010: Scalable Internet ArchitecturesVelocity 2010: Scalable Internet Architectures
Velocity 2010: Scalable Internet Architectures
 
Big Bad PostgreSQL @ Percona
Big Bad PostgreSQL @ PerconaBig Bad PostgreSQL @ Percona
Big Bad PostgreSQL @ Percona
 
Omnios and unix
Omnios and unixOmnios and unix
Omnios and unix
 
Craftsmanship
CraftsmanshipCraftsmanship
Craftsmanship
 
OmniOS Motivation and Design ~ LISA 2012
OmniOS Motivation and Design ~ LISA 2012OmniOS Motivation and Design ~ LISA 2012
OmniOS Motivation and Design ~ LISA 2012
 
Monitoring is easy, why are we so bad at it presentation
Monitoring is easy, why are we so bad at it  presentationMonitoring is easy, why are we so bad at it  presentation
Monitoring is easy, why are we so bad at it presentation
 
Project reality
Project realityProject reality
Project reality
 
Scalable Internet Architecture
Scalable Internet ArchitectureScalable Internet Architecture
Scalable Internet Architecture
 
Monitoring and observability
Monitoring and observabilityMonitoring and observability
Monitoring and observability
 
DEBS 2015 Tutorial : Patterns for Realtime Streaming Analytics
DEBS 2015 Tutorial : Patterns for Realtime Streaming AnalyticsDEBS 2015 Tutorial : Patterns for Realtime Streaming Analytics
DEBS 2015 Tutorial : Patterns for Realtime Streaming Analytics
 
Get AMP’ed for AMP!
Get AMP’ed for AMP!Get AMP’ed for AMP!
Get AMP’ed for AMP!
 
横手版地方発信のソーシャルメディア
横手版地方発信のソーシャルメディア横手版地方発信のソーシャルメディア
横手版地方発信のソーシャルメディア
 
Import Guide - Cloud for Customer Edge and Starter Edition - Guide v2.6
Import Guide - Cloud for Customer Edge and Starter Edition - Guide v2.6Import Guide - Cloud for Customer Edge and Starter Edition - Guide v2.6
Import Guide - Cloud for Customer Edge and Starter Edition - Guide v2.6
 
Investing 101: How to Prepare for Retirement
Investing 101: How to Prepare for RetirementInvesting 101: How to Prepare for Retirement
Investing 101: How to Prepare for Retirement
 
Parecer jurídico normativo 36 2011 CFESS
Parecer jurídico normativo 36 2011 CFESSParecer jurídico normativo 36 2011 CFESS
Parecer jurídico normativo 36 2011 CFESS
 
Delivering Vertical Social Apps - Dreamforce - 9/18
Delivering Vertical Social Apps - Dreamforce - 9/18Delivering Vertical Social Apps - Dreamforce - 9/18
Delivering Vertical Social Apps - Dreamforce - 9/18
 

Similar to Esperwhispering

Intravert Server side processing for Cassandra
Intravert Server side processing for CassandraIntravert Server side processing for Cassandra
Intravert Server side processing for CassandraEdward Capriolo
 
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"DataStax Academy
 
How Signpost uses MongoDB for Tracking and Analytics
How Signpost uses MongoDB for Tracking and AnalyticsHow Signpost uses MongoDB for Tracking and Analytics
How Signpost uses MongoDB for Tracking and Analyticsmattinsler
 
Strongly typed web applications by Adel Salakh
 Strongly typed web applications by Adel Salakh   Strongly typed web applications by Adel Salakh
Strongly typed web applications by Adel Salakh OdessaJS Conf
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Fermin Galan
 
Norikra: SQL Stream Processing In Ruby
Norikra: SQL Stream Processing In RubyNorikra: SQL Stream Processing In Ruby
Norikra: SQL Stream Processing In RubySATOSHI TAGOMORI
 
Live Streaming & Server Sent Events
Live Streaming & Server Sent EventsLive Streaming & Server Sent Events
Live Streaming & Server Sent Eventstkramar
 
Operational Intelligence with MongoDB Webinar
Operational Intelligence with MongoDB WebinarOperational Intelligence with MongoDB Webinar
Operational Intelligence with MongoDB WebinarMongoDB
 
Realtime html5 multiplayer_games_with_node_js
Realtime html5 multiplayer_games_with_node_jsRealtime html5 multiplayer_games_with_node_js
Realtime html5 multiplayer_games_with_node_jsMario Gonzalez
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Fermin Galan
 
Symfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worldsSymfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worldsIgnacio Martín
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Fermin Galan
 
Our Data Ourselves, Pydata 2015
Our Data Ourselves, Pydata 2015Our Data Ourselves, Pydata 2015
Our Data Ourselves, Pydata 2015kingsBSD
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Fermin Galan
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Fermin Galan
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Fermin Galan
 
node.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.ionode.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.ioSteven Beeckman
 
OSMC 2013 | Making monitoring simple? by Michael Medin
OSMC 2013 | Making monitoring simple? by Michael MedinOSMC 2013 | Making monitoring simple? by Michael Medin
OSMC 2013 | Making monitoring simple? by Michael MedinNETWAYS
 

Similar to Esperwhispering (20)

Intravert Server side processing for Cassandra
Intravert Server side processing for CassandraIntravert Server side processing for Cassandra
Intravert Server side processing for Cassandra
 
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
NYC* 2013 - "Advanced Data Processing: Beyond Queries and Slices"
 
How Signpost uses MongoDB for Tracking and Analytics
How Signpost uses MongoDB for Tracking and AnalyticsHow Signpost uses MongoDB for Tracking and Analytics
How Signpost uses MongoDB for Tracking and Analytics
 
Consuming GraphQL APIs in C#.pptx
Consuming GraphQL APIs in C#.pptxConsuming GraphQL APIs in C#.pptx
Consuming GraphQL APIs in C#.pptx
 
Strongly typed web applications by Adel Salakh
 Strongly typed web applications by Adel Salakh   Strongly typed web applications by Adel Salakh
Strongly typed web applications by Adel Salakh
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
 
Norikra: SQL Stream Processing In Ruby
Norikra: SQL Stream Processing In RubyNorikra: SQL Stream Processing In Ruby
Norikra: SQL Stream Processing In Ruby
 
Live Streaming & Server Sent Events
Live Streaming & Server Sent EventsLive Streaming & Server Sent Events
Live Streaming & Server Sent Events
 
Operational Intelligence with MongoDB Webinar
Operational Intelligence with MongoDB WebinarOperational Intelligence with MongoDB Webinar
Operational Intelligence with MongoDB Webinar
 
Intro to Ember.JS 2016
Intro to Ember.JS 2016Intro to Ember.JS 2016
Intro to Ember.JS 2016
 
Realtime html5 multiplayer_games_with_node_js
Realtime html5 multiplayer_games_with_node_jsRealtime html5 multiplayer_games_with_node_js
Realtime html5 multiplayer_games_with_node_js
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
 
Symfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worldsSymfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worlds
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
 
Our Data Ourselves, Pydata 2015
Our Data Ourselves, Pydata 2015Our Data Ourselves, Pydata 2015
Our Data Ourselves, Pydata 2015
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
 
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
Orion Context Broker NGSI-v2 Overview for Developers That Already Know NGSI-v...
 
node.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.ionode.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.io
 
OSMC 2013 | Making monitoring simple? by Michael Medin
OSMC 2013 | Making monitoring simple? by Michael MedinOSMC 2013 | Making monitoring simple? by Michael Medin
OSMC 2013 | Making monitoring simple? by Michael Medin
 

More from Theo Schlossnagle

More from Theo Schlossnagle (20)

Adding Simplicity to Complexity
Adding Simplicity to ComplexityAdding Simplicity to Complexity
Adding Simplicity to Complexity
 
Put Some SRE in Your Shipped Software
Put Some SRE in Your Shipped SoftwarePut Some SRE in Your Shipped Software
Put Some SRE in Your Shipped Software
 
Monitoring 101
Monitoring 101Monitoring 101
Monitoring 101
 
Distributed Systems - Like It Or Not
Distributed Systems - Like It Or NotDistributed Systems - Like It Or Not
Distributed Systems - Like It Or Not
 
Applying SRE techniques to micro service design
Applying SRE techniques to micro service designApplying SRE techniques to micro service design
Applying SRE techniques to micro service design
 
SRECon Coherent Performance
SRECon Coherent PerformanceSRECon Coherent Performance
SRECon Coherent Performance
 
Commandments of scale
Commandments of scaleCommandments of scale
Commandments of scale
 
Adaptive availability
Adaptive availabilityAdaptive availability
Adaptive availability
 
Monitoring the #DevOps way
Monitoring the #DevOps wayMonitoring the #DevOps way
Monitoring the #DevOps way
 
Operational Software Design
Operational Software DesignOperational Software Design
Operational Software Design
 
A Coherent Discussion About Performance
A Coherent Discussion About PerformanceA Coherent Discussion About Performance
A Coherent Discussion About Performance
 
The math behind big systems analysis.
The math behind big systems analysis.The math behind big systems analysis.
The math behind big systems analysis.
 
Understanding Slowness
Understanding SlownessUnderstanding Slowness
Understanding Slowness
 
Monitoring and observability
Monitoring and observabilityMonitoring and observability
Monitoring and observability
 
Xtreme Deployment
Xtreme DeploymentXtreme Deployment
Xtreme Deployment
 
Atldevops
AtldevopsAtldevops
Atldevops
 
It's all about telemetry
It's all about telemetryIt's all about telemetry
It's all about telemetry
 
Is this normal?
Is this normal?Is this normal?
Is this normal?
 
Social improvements in monitoring
Social improvements in monitoringSocial improvements in monitoring
Social improvements in monitoring
 
What's in a number?
What's in a number?What's in a number?
What's in a number?
 

Recently uploaded

Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 

Recently uploaded (20)

Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 

Esperwhispering

  • 1. Esperwhispering: Using Esper to Find Problems in Real-time Data / Real-time and real(ly) big 1
  • 2. Who am I? @postwait on twitter Author of “Scalable Internet Architectures” Pearson, ISBN: 067232699X Contributor to “Web Operations” O’Reilly, ISBN: 1449377440 Founder of OmniTI, Message Systems, Fontdeck, & Circonus I like to tackle problems that are “always on” and “always growing.” I am an Engineer A practitioner of academic computing. IEEE member and Senior ACM member. On the Editorial Board of ACM’s Queue magazine. On the ACM professions board. 2
  • 3. What is BigData? • Few agree. • I say it is any data-related problem that can’t be solved (well) on one machine. • Never use a distributed system to solve a problem that can be easily solved on a single system: • performance • simplicity • debugability 3
  • 4. Framing the data problem • events... to make it web related, lets say it is web activity • for every user action, we have an event • an event is composed of about 20-30 known attributes (say ~400 bytes) • url, referrer, site category, • ip address, ASN, geo location info, • user-perceived performance info (like load time) 4
  • 5. Framing the volume problem • We see 100 of these per second on a site • Easy problem (more or less) • We run SaaS, so we need to support 2000 customers: • 200,000 events/second (or 30x = 6,000,000 column appends/second) 5
  • 6. What do we want? • I want answers, dammit • I would like to know what is slow (or fast) by • ASN • geo location • browser type • I’d also like to know given an event: • is it outside the average +/- 2 x σ • over the last 5 minutes 6
  • 7. What else do we want? • I want answers now, dammit 7
  • 8. What else do we want? • I want answers now, dammit defined: not later 7
  • 9. What is real-time? • The correctness of the answer depends on both the logical correctness of the result and temporal proximity of the result and the question. • hard real-time: old answers are worthless. • soft real-time: old answers are worth less. 8
  • 10. Real-time on the Internet • Hard real-time systems on the Internet; this sort of thing ain’t my bag, baby! • Someone is just going to get hurt. 9
  • 11. Soft real-time? • We need soft real-time systems any time we are going to react to a user. • If the answer is either wrong or late, it is less relevant to them. • The problems we look at have temporal constraints ranging from 5 seconds (counters and statistics) to 1 second (fraud detection) to 10 milliseconds (user-action reaction) and everywhere in between. 10
  • 12. Enter CEP • Complex Event Processing... • Queries always running. • Tuples introduced. • Tuples emitted. • ’s Esper is my hero. 11
  • 13. Typical (OmniTI) Esper deployment: custom Java glue Application Infrastructure Cloud 12
  • 14. More concretely • node.js listens for web requests and submits data to Esper via AMQP • Esper runs “magic” • The output of that magic is pushed back via AMQP • node.js listens and returns data back over JSONP. 13
  • 15. What our event really looks like: { '_ls_part': { 'type': 'String' }, 'url_schema': { 'type': 'String' }, 'url_host': { 'type': 'String' }, 'url': { 'type': 'String' }, 'referrer_schema': { 'type': 'String' }, 'referrer_host': { 'type': 'String' }, 'referrer_path': { 'type': 'String' }, 'ip': { 'type': 'String' }, 'method' : { 'type': 'String' }, 'http_version' : { 'type': 'String' }, 'asn': { 'type': 'Integer' }, 'browser': { 'type': 'String' }, 'asn_orgname': { 'type': 'String' }, 'browser_version': { 'type': 'String' }, 'map_id': { 'type': 'String' }, 'geoip_longitude': { 'type': 'Double' }, 'red_time': { 'type': 'Double' }, 'geoip_latitude': { 'type': 'Double' }, 'dns_time': { 'type': 'Double' }, 'geoip_country_code': { 'type': 'String' }, 'con_time': { 'type': 'Double' }, 'geoip_continent_code': { 'type': 'String' }, 'req_start': { 'type': 'Double' }, 'geoip_region': { 'type': 'String' }, 'res_start': { 'type': 'Double' }, 'geoip_metro_code': { 'type': 'Integer' }, 'res_end': { 'type': 'Double' }, 'geoip_country': { 'type': 'String' }, 'dom_time': { 'type': 'Double', }, 'geoip_city': { 'type': 'String' }, 'load_time': { 'type': 'Double', }, 'geoip_area_code': { 'type': 'Integer' } } 14
  • 16. What our event really looks like: { '_ls_part': { 'type': 'String' }, Client Token 'url_schema': { 'type': 'String' }, 'url_host': { 'type': 'String' }, 'url': { 'type': 'String' }, 'referrer_schema': { 'type': 'String' }, 'referrer_host': { 'type': 'String' }, 'referrer_path': { 'type': 'String' }, 'ip': { 'type': 'String' }, 'method' : { 'type': 'String' }, 'http_version' : { 'type': 'String' }, 'asn': { 'type': 'Integer' }, 'browser': { 'type': 'String' }, 'asn_orgname': { 'type': 'String' }, 'browser_version': { 'type': 'String' }, 'map_id': { 'type': 'String' }, 'geoip_longitude': { 'type': 'Double' }, 'red_time': { 'type': 'Double' }, 'geoip_latitude': { 'type': 'Double' }, 'dns_time': { 'type': 'Double' }, 'geoip_country_code': { 'type': 'String' }, 'con_time': { 'type': 'Double' }, 'geoip_continent_code': { 'type': 'String' }, 'req_start': { 'type': 'Double' }, 'geoip_region': { 'type': 'String' }, 'res_start': { 'type': 'Double' }, 'geoip_metro_code': { 'type': 'Integer' }, 'res_end': { 'type': 'Double' }, 'geoip_country': { 'type': 'String' }, 'dom_time': { 'type': 'Double', }, 'geoip_city': { 'type': 'String' }, 'load_time': { 'type': 'Double', }, 'geoip_area_code': { 'type': 'Integer' } } 14
  • 17. What our event really looks like: { '_ls_part': { 'type': 'String' }, Client Token 'url_schema': { 'type': 'String' }, 'url_host': { 'type': 'String' }, 'url': { 'type': 'String' }, HTTP Info 'referrer_schema': { 'type': 'String' }, 'referrer_host': { 'type': 'String' }, 'referrer_path': { 'type': 'String' }, 'ip': { 'type': 'String' }, 'method' : { 'type': 'String' }, 'http_version' : { 'type': 'String' }, 'asn': { 'type': 'Integer' }, 'browser': { 'type': 'String' }, 'asn_orgname': { 'type': 'String' }, 'browser_version': { 'type': 'String' }, 'map_id': { 'type': 'String' }, 'geoip_longitude': { 'type': 'Double' }, 'red_time': { 'type': 'Double' }, 'geoip_latitude': { 'type': 'Double' }, 'dns_time': { 'type': 'Double' }, 'geoip_country_code': { 'type': 'String' }, 'con_time': { 'type': 'Double' }, 'geoip_continent_code': { 'type': 'String' }, 'req_start': { 'type': 'Double' }, 'geoip_region': { 'type': 'String' }, 'res_start': { 'type': 'Double' }, 'geoip_metro_code': { 'type': 'Integer' }, 'res_end': { 'type': 'Double' }, 'geoip_country': { 'type': 'String' }, 'dom_time': { 'type': 'Double', }, 'geoip_city': { 'type': 'String' }, 'load_time': { 'type': 'Double', }, 'geoip_area_code': { 'type': 'Integer' } } 14
  • 18. What our event really looks like: { '_ls_part': { 'type': 'String' }, Client Token 'url_schema': { 'type': 'String' }, 'url_host': { 'type': 'String' }, 'url': { 'type': 'String' }, HTTP Info 'referrer_schema': { 'type': 'String' }, 'referrer_host': { 'type': 'String' }, 'referrer_path': { 'type': 'String' }, 'ip': { 'type': 'String' }, 'method' : { 'type': 'String' }, 'http_version' : { 'type': 'String' }, 'asn': { 'type': 'Integer' }, 'browser': { 'type': 'String' }, 'asn_orgname': { 'type': 'String' }, 'browser_version': { 'type': 'String' }, 'map_id': { 'type': 'String' }, 'geoip_longitude': { 'type': 'Double' }, 'red_time': { 'type': 'Double' }, 'geoip_latitude': { 'type': 'Double' }, 'dns_time': { 'type': 'Double' }, 'geoip_country_code': { 'type': 'String' }, 'con_time': { 'type': 'Double' }, 'geoip_continent_code': { 'type': 'String' }, 'req_start': { 'type': 'Double' }, 'geoip_region': { 'type': 'String' }, 'res_start': { 'type': 'Double' }, 'geoip_metro_code': { 'type': 'Integer' }, 'res_end': { 'type': 'Double' }, 'geoip_country': { 'type': 'String' }, 'dom_time': { 'type': 'Double', }, 'geoip_city': { 'type': 'String' }, 'load_time': { 'type': 'Double', }, 'geoip_area_code': { 'type': 'Integer' } } User Perceived Performance Data 14
  • 19. What our event really looks like: { '_ls_part': { 'type': 'String' }, Client Token 'url_schema': { 'type': 'String' }, 'url_host': { 'type': 'String' }, 'url': { 'type': 'String' }, HTTP Info 'referrer_schema': { 'type': 'String' }, 'referrer_host': { 'type': 'String' }, 'referrer_path': { 'type': 'String' }, User Location 'ip': { 'type': 'String' }, 'method' : { 'type': 'String' }, 'http_version' : { 'type': 'String' }, 'asn': { 'type': 'Integer' }, 'browser': { 'type': 'String' }, 'asn_orgname': { 'type': 'String' }, 'browser_version': { 'type': 'String' }, 'map_id': { 'type': 'String' }, 'geoip_longitude': { 'type': 'Double' }, 'red_time': { 'type': 'Double' }, 'geoip_latitude': { 'type': 'Double' }, 'dns_time': { 'type': 'Double' }, 'geoip_country_code': { 'type': 'String' }, 'con_time': { 'type': 'Double' }, 'geoip_continent_code': { 'type': 'String' }, 'req_start': { 'type': 'Double' }, 'geoip_region': { 'type': 'String' }, 'res_start': { 'type': 'Double' }, 'geoip_metro_code': { 'type': 'Integer' }, 'res_end': { 'type': 'Double' }, 'geoip_country': { 'type': 'String' }, 'dom_time': { 'type': 'Double', }, 'geoip_city': { 'type': 'String' }, 'load_time': { 'type': 'Double', }, 'geoip_area_code': { 'type': 'Integer' } } User Perceived Performance Data 14
  • 20. First steps for simplicity • I want to create a view on 30 minutes of data for a specific client and populate that view with those “hit” events: create window fl9875309_hit30m.win:time(30 minute) as hit insert into fl9875309_hit30m select * from hit(_ls_part='fl9875309') • Some useful thoughts: • data flowing into this window: “istream” • data also flowing out of this window (after 30 minutes): “rstream” • if you are interested in both streams, we call it: “irstream” 15
  • 21. Asking a question: • EPL, as you can see looks much like SQL... so select count(*) from fl9875309_hit30m • SQLers will be very surprised by the result of this... • ideas? • Hint: this query runs forever and emits results as available • Esper defaults to use the istream of events form which it selects • So: • this statement emits a result on each event entering the window • and the return set is the total number of events within the window • We really wanted: select irstream count(*) from fl9875309_hit30m 16
  • 22. Asking a (cooler) question: • I’d like to know the view volume by referring site.. so select irstream referrer_host, count(*) as views from fl9875309_hit30m where referrer_host <> url_host group by referrer_host • This outputs on any event entering or leaving the window... but, • it only outputs the group that is being updated by the event(s) entering and/or leaving the window... • (perhaps) not so useful 17
  • 23. Snapshots • Sometimes you want to see the complete state. • Given that we’re asynch, we can decouple the output from the input. • Let’s get the top 10 referrers, every 5 seconds. select irstream referrer_host, count(*) as views from fl9875309_hit30m where referrer_host <> url_host group by referrer_host output snapshot every 5 seconds order by count(*) desc limit 10 18
  • 24. Finding anomalies... • Note: this is very very simplistic. 19
  • 25. Finding anomalies... • Note: this is very very simplistic. • I’d like to break the dataset out by network (AS) 19
  • 26. Finding anomalies... • Note: this is very very simplistic. • I’d like to break the dataset out by network (AS) • I’d like to find individual hits whose load_time is greater than the average + 3 times the standard deviation 19
  • 27. Finding anomalies... • Note: this is very very simplistic. • I’d like to break the dataset out by network (AS) • I’d like to find individual hits whose load_time is greater than the average + 3 times the standard deviation • I’d like details about the hit’s IP, browser and load_time 19
  • 28. Finding anomalies... • Note: this is very very simplistic. • I’d like to break the dataset out by network (AS) • I’d like to find individual hits whose load_time is greater than the average + 3 times the standard deviation • I’d like details about the hit’s IP, browser and load_time select asn_orgname, browser_version, ip, load_time, average, stddev, datapoints as sample_size from fl9875309_hit30m(load_time is not null) .std:groupwin(asn_orgname) .stat:uni(load_time, ip, browser_version, load_time) as s where s.load_time > s.average + 3 * s.stddev 19
  • 29. Finding anomalies... • Note: this is very very simplistic. • I’d like to break the dataset out by network (AS) • I’d like to find individual hits whose load_time is greater than the average + 3 times the standard deviation • I’d like details about the hit’s IP, browser and load_time select asn_orgname, browser_version, ip, load_time, average, stddev, datapoints as sample_size from fl9875309_hit30m(load_time is not null) .std:groupwin(asn_orgname) .stat:uni(load_time, ip, browser_version, load_time) as s where s.load_time > s.average + 3 * s.stddev 19
  • 30. Finding anomalies... • Note: this is very very simplistic. • I’d like to break the dataset out by network (AS) • I’d like to find individual hits whose load_time is greater than the average + 3 times the standard deviation • I’d like details about the hit’s IP, browser and load_time select asn_orgname, browser_version, ip, load_time, average, stddev, datapoints as sample_size from fl9875309_hit30m(load_time is not null) .std:groupwin(asn_orgname) .stat:uni(load_time, ip, browser_version, load_time) as s where s.load_time > s.average + 3 * s.stddev 19
  • 31. Finding anomalies... • Note: this is very very simplistic. • I’d like to break the dataset out by network (AS) • I’d like to find individual hits whose load_time is greater than the average + 3 times the standard deviation • I’d like details about the hit’s IP, browser and load_time select asn_orgname, browser_version, ip, load_time, average, stddev, datapoints as sample_size from fl9875309_hit30m(load_time is not null) .std:groupwin(asn_orgname) .stat:uni(load_time, ip, browser_version, load_time) as s where s.load_time > s.average + 3 * s.stddev 19
  • 32. Mapping it all out. • Looking at performance: a world’s-eye view
  • 33. What’s this all mean? • Big data is all relative. • 100 records/s at 400 bytes each is... ~3GB/day or ~1TB/year • 100,000 records/s is... ~3TB/day or 1PB/year • 500,000 records/s is... ~15TB/day or 5PB/year • Which is big data? you choose. • The technology that can act on this in real-time exists and is different that the technologies to store it and crunch it. • Don’t think big... think efficient.
  • 34. Thank You • Thanks you • Thank you • Thanks you • Consider attending: Surge 2011 discussing scalability matters, because scalability matters • Thank you!

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n