Sentry started as (and remains) an open-source project, growing out of an error logging tool built in 2008. That original build nine years ago was Django and Celery (Pythonâs asynchronous task codebase), with PostgreSQL as the database and Redis as the power behind Celery.\r\n\r\n
We displayed a truly shrewd notion of branding even then, giving the project a catchy name that companies the world over remain jealous of to this day: django-db-log. For the longest time, Sentryâs subtitle on GitHub was âA simple Django app, built with love.â A slightly more accurate description probably would have included Starcraft and Soylent alongside love; regardless, this captured what Sentry was all about.\r\n\r\n
#MessageQueue #InMemoryDatabases","rawContent":"Sentry started as (and remains) an open-source project, growing out of an error logging tool built in 2008. That original build nine years ago was @{Django}|tool:994| and @{Celery}|tool:1075| (Pythonâs asynchronous task codebase), with @{PostgreSQL}|tool:1028| as the database and @{Redis}|tool:1031| as the power behind Celery.\r\n\r\nWe displayed a truly shrewd notion of branding even then, giving the project a catchy name that companies the world over remain jealous of to this day: django-db-log. For the longest time, Sentryâs subtitle on GitHub was âA simple Django app, built with love.â A slightly more accurate description probably would have included Starcraft and Soylent alongside love; regardless, this captured what Sentry was all about.\r\n\r\n@{#MessageQueue}|topic:96| @{#InMemoryDatabases}|topic:241|","publishedAt":"2018-09-13T08:40:00Z","commentsCount":0,"private":false,"upvotesCount":21,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":364367,"draft":false,"createdAt":"2018-09-13T08:40:14Z","decisionType":null,"showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:101031322402455108.permissions","typename":"Permissions"},"subjectTools":[],"fromTools":[],"toTools":[],"link":{"type":"id","generated":true,"id":"$StackDecision:101031322402455108.link","typename":"Link"},"company":{"type":"id","generated":false,"id":"Company:101231709547274597","typename":"Company"},"topics":[{"type":"id","generated":true,"id":"StackDecision:101031322402455108.topics.0","typename":"Topic"},{"type":"id","generated":true,"id":"StackDecision:101031322402455108.topics.1","typename":"Topic"}],"stack":null,"services":[{"type":"id","generated":false,"id":"Tool:101231773837565192","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773871944512","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773853533403","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773854768982","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:101232126867692719","typename":"User"},"rootComments":[],"__typename":"StackDecision","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:101031322402455108.answers({\"first\":2})","typename":"StackDecisionConnection"}},"$StackDecision:101031322402455108.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:101031322402455108.link":{"url":"https://stackshare.io/sentry/how-sentry-receives-20-billion-events-per-month-while-preparing-to-handle-twice-that","title":"How Sentry Receives 20 Billion Events Per Month While Preparing to Handle Twice That - Sentry Tech Stack | StackShare","imageUrl":"","__typename":"Link"},"StackDecision:101031322402455108.topics.0":{"name":"MessageQueue","__typename":"Topic"},"StackDecision:101031322402455108.topics.1":{"name":"InMemoryDatabases","__typename":"Topic"},"User:101232126867692719":{"id":"101232126867692719","username":"jtcunning","path":"/jtcunning","imageUrl":"https://img.stackshare.io/user/265010/default_aca380c06539c567ed5bc2f7523ead79ac271e8d.jpg","displayName":"James Cunningham","title":"Operations Engineer","companyName":"Sentry","__typename":"User"},"$StackDecision:101031322402455108.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:101031322402455108.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:101031322402455108.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"$StackProfile:101231778564413057.stackDecisions({\"currentStackOnly\":true,\"first\":5}).edges.0":{"node":{"type":"id","generated":false,"id":"StackDecision:101031322402455108","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:101031322402962743":{"id":"101031322402962743","publicId":"101031322402962743","htmlContent":"
As Sentry runs throughout the day, there are about 50 different offline tasks that we executeâanything from âprocess this event, pretty pleaseâ to âsend all of these cool people some emails.â There are some that we execute once a day and some that execute thousands per second.\n\n
Managing this variety requires a reliably high-throughput message-passing technology. We use Celery's RabbitMQ implementation, and we stumbled upon a great feature called Federation that allows us to partition our task queue across any number of RabbitMQ servers and gives us the confidence that, if any single server gets backlogged, others will pitch in and distribute some of the backlogged tasks to their consumers.\n\n
#MessageQueue","rawContent":"As Sentry runs throughout the day, there are about 50 different offline tasks that we executeâanything from âprocess this event, pretty pleaseâ to âsend all of these cool people some emails.â There are some that we execute once a day and some that execute thousands per second.\r\n\r\nManaging this variety requires a reliably high-throughput message-passing technology. We use @{Celery}|tool:1075|'s @{RabbitMQ}|tool:1061| implementation, and we stumbled upon a great feature called Federation that allows us to partition our task queue across any number of RabbitMQ servers and gives us the confidence that, if any single server gets backlogged, others will pitch in and distribute some of the backlogged tasks to their consumers.\r\n\r\n@{#MessageQueue}|topic:96|","publishedAt":"2018-09-13T08:40:00Z","commentsCount":0,"private":false,"upvotesCount":18,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":1809074,"draft":false,"createdAt":"2018-09-13T08:40:53Z","decisionType":null,"showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:101031322402962743.permissions","typename":"Permissions"},"subjectTools":[],"fromTools":[],"toTools":[],"link":{"type":"id","generated":true,"id":"$StackDecision:101031322402962743.link","typename":"Link"},"company":{"type":"id","generated":false,"id":"Company:101231709547274597","typename":"Company"},"topics":[{"type":"id","generated":true,"id":"StackDecision:101031322402962743.topics.0","typename":"Topic"}],"stack":null,"services":[{"type":"id","generated":false,"id":"Tool:101231773871944512","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773864300849","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:101232126867692719","typename":"User"},"rootComments":[],"__typename":"StackDecision","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:101031322402962743.answers({\"first\":2})","typename":"StackDecisionConnection"}},"$StackDecision:101031322402962743.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:101031322402962743.link":{"url":"https://stackshare.io/sentry/how-sentry-receives-20-billion-events-per-month-while-preparing-to-handle-twice-that","title":"How Sentry Receives 20 Billion Events Per Month While Preparing to Handle Twice That - Sentry Tech Stack | StackShare","imageUrl":"","__typename":"Link"},"StackDecision:101031322402962743.topics.0":{"name":"MessageQueue","__typename":"Topic"},"$StackDecision:101031322402962743.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:101031322402962743.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:101031322402962743.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"$StackProfile:101231778564413057.stackDecisions({\"currentStackOnly\":true,\"first\":5}).edges.1":{"node":{"type":"id","generated":false,"id":"StackDecision:101031322402962743","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:101031322404006635":{"id":"101031322404006635","publicId":"101031322404006635","htmlContent":"
Sentry's event processing pipeline, which is responsible for handling all of the ingested event data that makes it through to our offline task processing, is written primarily in Python. \n\n