Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rust at Sentry

Rust at Sentry

7 years later. How it worked. Presented at EuroRust 2023.

Avatar for Armin Ronacher

Armin Ronacher

October 14, 2023
Tweet

More Decks by Armin Ronacher

Other Decks in Programming

Transcript

  1. Who am I • Armin Ronacher • @mitsuhiko • https://lucumr.pocoo.org/

    • I love Open Source • Flask, Insta, Jinja2, MiniJinja, …
  2. What’s Sentry • https://sentry.io/ • Error and Crash Monitoring •

    Application Performance Monitoring • Session Replays etc. • Open Source (*) • A Python Shop *: some is BUSL licensed with a 3 year Apache 2 cliff
  3. Why Rust? • Initially personal interest • Was really good

    for redistribution (sentry-cli) • Was really nice to expose to Python • Over time: we quite like it • Predictable at runtime • Tooling is really good
  4. A Company’s Origin Story is a Legend • Memory gets

    foggy over time • Technology choices are less well informed and more incidental • Is Jane Street really successful because of OCaml?
  5. Rust @ Sentry Stats • rust libraries + services: 180kLOC

    • Sentry Python Monolith: 455kLOC • Sentry TypeScript SPA: 612kLOC Third most popular language by LOC
  6. Predictable Runtime Behavior • Feels like Python • No whacky

    memory behavior ◦ (aside from suffering of fragmentation — hi jemallocator) • CPU usage mostly stays predictable • Performs well for a long time
  7. Fits into Python • Great at extension modules • For

    us: cffi + milksnake (do not use!) • Nowadays: PyO3 + maturin
  8. Rust is Outbound • We quite actively contribute to external

    crates in Rust • We rarely do so in Python • Fork and depend on fork works well! • Cargo as tooling changes behavior
  9. Standardized Tooling • One code style • Almost universally embraced

    lints • Rather well established patterns • Jumping between code-bases feels natural • Moving code between crates is trivial • Painless compiler upgrades
  10. Types and Borrow Checker • Modern Rust makes you a

    better programmer • Types for the most part are helpful • Borrow checker is not too annoying any more • Makes you suspicious of a lot of Python code
  11. Shlemiel the Painter • Work gets progressively harder • Classic

    case: cstrings (strcat) • But also OFFSET + LIMIT in SQL Rust has a family of performance issues that are related • Fear of lifetimes cause bad lookups • String assigns become string clones
  12. Shlemiel Paints the Entire Street For Every Dot • Add

    an offset to N tokens, clone entire source for every token
  13. Strings are … not optimal • Maybe we should use

    more Arc<str>? • But Arc<str> is not particularly efficient • String’s extra capacity is odd in public APIs • Similar issue with Vec<u8> (broadcast to N sockets)
  14. WTB

  15. Errors • Still no stack trace on std::error::Error • Errors

    don’t have names (parsing Debug output)
  16. Life Before Main / Registry • We would love a

    supported #[ctor] • Or a way to register startup functions
  17. From Actix to Running our own Show • Started out

    with actix + actix-web • Actor frameworks feel great • Backpressure management is a giant pain and messy • Moved from pre-tokio 1.0 to async/await
  18. How I learned to love the async Bomb • Use

    less async • Use More Channels • Embrace Backpressure • (Cancellations are still hard)
  19. Some Thoughts • Nobody is perfect • Building things is

    hard • Good intentions can still result in bad outcomes • Rust made it this far, let’s work on it together • We all are more nuanced in Person