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

Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Neo4j
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDGMarianaLemus7
 

Recently uploaded (20)

Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDG
 

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