Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Monitoring and Logging on Doorbell.io
Search
Philip Manavopoulos
June 11, 2014
Programming
510
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Monitoring and Logging on Doorbell.io
Philip Manavopoulos
June 11, 2014
Other Decks in Programming
See All in Programming
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
110
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4.1k
Built Our Own Background Agent at LayerX
layerx
PRO
9
5.1k
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
220
Google Apps Script で Ruby を動かす
kawahara
0
140
プロポーザルを書いてもらう
pvcresin
0
300
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
750
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.9k
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
540
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
100
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
590
Featured
See All Featured
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
410
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Designing for humans not robots
tammielis
254
26k
Odyssey Design
rkendrick25
PRO
2
750
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
200
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Speed Design
sergeychernyshev
33
2k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Side Projects
sachag
455
43k
Transcript
Monitoring(and(Logging(on( Doorbell.io !@manavo
What%is%Doorbell.io
The$Stack LAMP%with: • PHP$5.5,$using$Laravel$4 • Memcache • Beanstalkd$(message$queue) • Mashape$(3rd$party$APIs$like$senDment$analysis)
• Mandrill/Mailgun$(sending/receiving$emails) • Twilio$(sending$SMS)
Logging&and&Monitoring&101 • Knowing(when(the(site(is(unreachable • Logging(uncaught(PHP(and(JS(errors • Finding(breaking(changes(from(libraries • Making(sure(the(Queue(processor(will(always(be( running
Logging&and&Monitoring&101 • Knowing(when(the(site(is(unreachable Pingdom • Logging(uncaught(PHP(and(JS(errors • Finding(breaking(changes(from(libraries Sentry,.New.Relic •
Making(sure(the(Queue(processor(will(always(be( running Supervisor
Case%study%#1:%Queues
Queues%in%Laravel Queue::push( 'SendEmail@send', array('thread_id' => 2) ); OR Queue::push(function($job) use
($id) { Account::delete($id); $job->delete(); });
Queues%in%Doorbell.io%.%New%feedback 1. Queue&closure 2. Closure&loops&through&email&addresses&to&no7fy 3. Send&email 4. Delete&job
Problem(#1:(Dele-ng(the(job(at(the(end // Done with the job, delete it $job->delete(); If#an#error#occurs,#the#job#never#gets#deleted.
There%was%no%maximum%number%of%tries. So#it#runs#again,#and#again,#and#again,#and#again,# and....
Problem(#1(solu-on Quick&fix: 1. Manually)delete)job)from)Queue 2. Stop)using)the)Queue)for)this)specific)problem Long%term*fix: Figure'out'why'the'Queue'processor'failed
Problem(#2 A"good"message:
Problem(#2 A"bad"message: This%means%Greek%in%the%serialized%data...
Which%leads%to... Blocked(Queue Saved&by Because'CPU'usage'was'100%
Moral&of&the&story Moved&the&$job->delete()&call&to&the&top&of&the& func0on,&so&it&won't&keep&retrying&forever Make%sure%you%fix%the%root%cause%of%the%problem,%or% you'll%have%the%same%thing%happening%again
Case%study%#2:%External%services
Case%study%#2:%External%services • Easily(add(func.onality(to(applica.on((sen.ment( analysis,(etc) • They(break,(and(it's(out(of(your(control
Examples • Sen%ment(analysis(failed(occasionally • Incoming(webhooks(from(Mailgun(failed • FogBugz(makes(a(change(to(authen%ca%on
Updated'Stack • Pingdom • New,Relic • Sentry • Supervisor •
Papertrailapp.com • Custom0dashboard
Papertrail
Logging&in&PHP Good$library$to$use:$Monolog h4ps:/ /github.com/Seldaek/monolog
Custom'Dashboard Basic,'but'enough'to'see'threads'with'no'sen3ment.
Moral&of&the&story Logs%hosted%on%a%server%don't%allow%you%to%be%reac5ve
Case%study%#3:%Your%own%bugs,%and% mysteries
Example(#1:(Innocent(looking(commit Saves&making&a&query&to&the&sen3ment&analysis&API
Reality(of(commit Hard%coded%every%new%feedback%thread%to%be% posi5ve,%without%analyzing... Which%leads%to:
Example(#2:(Stuck(queue,(New(Relic(doesn't( report(CPU(100% For$reasons$s)ll$unknown$to$me,$the$queue$got$stuck,$ and$didn't$know$it. This%means: • Not%running%sen-ment%analysis • No%email%no-fica-ons%sent%for%new%feedback% threads%or%replies
Even%worse... People&reported&on&Doorbell&itself&the&bug,&and&I&got& no&no6fica6on...
Report'#1
Report'#2
Solu%on'#1:'Charts Replies'per'day
Solu%on'#1:'Charts Sen$ment'analysis'of'new'threads'per'day'now
Solu%on'#1:'Charts Sen$ment'analysis'of'new'threads'per'day'before'fix
Solu%on'#2:'Extend'Custom'Dashboard
Solu%on'#3:'Email'report'cron Cron%running%every%10%minutes,%le3ng%me%know%if%the% queue%is%not%empty.
Conclusion • It$is$necessary • Good$monitoring/logging$is$possible$on$a$budget • Reac8ve$not$proac8ve • Peace$of$mind
Ques%ons?