SlideShare une entreprise Scribd logo
1  sur  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!

Contenu connexe

Tendances

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
 

Tendances (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
 

En vedette

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
 

En vedette (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
 

Similaire à 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
 

Similaire à 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
 

Plus de Theo Schlossnagle

Plus de 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?
 

Dernier

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
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
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
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 

Dernier (20)

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
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
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
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 

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!

Notes de l'éditeur

  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