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
Rust at Sentry
Search
Armin Ronacher
July 07, 2017
Programming
4
1.1k
Rust at Sentry
An introduction to how we use Rust at Sentry.
Armin Ronacher
July 07, 2017
Tweet
Share
More Decks by Armin Ronacher
See All by Armin Ronacher
The Catch in Rye: Seeding Change and Lessons Learned
mitsuhiko
0
71
Runtime Objects in Rust
mitsuhiko
0
300
Rust at Sentry
mitsuhiko
0
310
Overcoming Variable Payloads to Optimize for Performance
mitsuhiko
0
120
Rust API Design Learnings
mitsuhiko
0
430
The Snowball Effect of Open Source
mitsuhiko
0
290
Mobile Games are Living Organisms, Too
mitsuhiko
0
200
We gave a Mouse an NDK
mitsuhiko
0
730
Debug is the new Release
mitsuhiko
1
560
Other Decks in Programming
See All in Programming
マイグレーションコード自作して File-Based Routing に自動移行!! ~250 ページの歴史的経緯を添えて~
cut0
1
240
Prompt Cachingは本当に効果的なのか検証してみた.pdf
ttnyt8701
0
260
TypeScriptで 負荷テストを書こう 〜k6のシングルバイナリの秘密〜
dora1998
7
2.8k
iOSの隠されたAPIを解明し、開発効率を向上させる方法/iOSDC24
noppefoxwolf
2
120
Modular Monolith Go Server with GraphQL Federation + gRPC
110y
1
550
iOSDC 2024 SMBファイル共有をSwiftで実装する
kishikawakatsumi
1
110
Swift Concurrencyとレースコンディション
objectiveaudio
1
380
複雑さに立ち向かうための ソフトウェア開発入門
shiz
2
580
New Order in Cascade Sorting Order
mugi_uno
3
2.5k
プログラマのための音楽入門
cheebow
4
540
令和トラベルにおけるLLM活用事例:社内ツール開発から得た学びと実践
ippo012
0
110
初めてのiOS関連GitHub ActionsをMarketplaceに公開するまでの実録
konifar
3
200
Featured
See All Featured
Writing Fast Ruby
sferik
623
60k
The Invisible Side of Design
smashingmag
295
50k
Faster Mobile Websites
deanohume
304
30k
5 minutes of I Can Smell Your CMS
philhawksworth
201
19k
How STYLIGHT went responsive
nonsquared
93
5.1k
YesSQL, Process and Tooling at Scale
rocio
167
14k
The Language of Interfaces
destraynor
153
23k
For a Future-Friendly Web
brad_frost
173
9.3k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
22
580
Designing Experiences People Love
moore
138
23k
Imperfection Machines: The Place of Print at Facebook
scottboms
263
13k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3.4k
Transcript
Rust at Sentry Armin @mitsuhiko Ronacher
Hi, I'm Armin ... and I do Open Source, lots
of Python and SaaS Flask Sentry …
… and here is where you can find me twitter.com/@mitsuhiko
github.com/mitsuhiko lucumr.pocoo.org/
800°C 36° 2' 0.4662" N 118° 15' 38.7792" W 795°C
789°C 797°C 793°C 805°C 782°C we show you your crashes
None
None
a bit about us chapter 0
Open Source Project “sentry”
Cloud Hosted “sentry.io”
relatively flexible stack postgres, mysql, cassandra, riak, …
our general tech stack chapter 1
Lots of Python
Simple Stack Python RabbitMQ Postgres Riak Redis
Conservative Approach to Adding New Systems
prefer Internal Modularity over building More Services
how does rust fit?
why is there Rust? chapter 2
a bit of a hobby of mine
turned into sentry-cli (command line client to manage organizations /
build integration)
later reused components for Python modules
now part of our tech stack
how we started chapter 3
why we use Rust for sentry-cli
$ otool -L which sentry-cli /usr/local/bin/sentry-cli: /System/Library/Frameworks/Security.framework/Versions/A/Security /usr/lib/libiconv.2.dylib /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation /usr/lib/libcurl.4.dylib
/usr/lib/libz.1.dylib /usr/lib/libSystem.B.dylib
$ curl -sL https://sentry.io/get-cli/ | bash $ npm install sentry-cli-binary
that and crates.io
rejected alternatives go JavaScript (bundled node) C / C++ Python
/ Ruby
things that work well serialization / deserialization error handling console
UX file size
from client to server chapter 4
None
sourcemap parsing
reused sentry-cli code for server
+20 sec -> < 500ms processing time
debug symbols
proguard
marrying python and rust chapter 5
github.com/mitsuhiko/snaek
from setuptools import setup, find_packages setup( name='example', version='0.0.1', packages=find_packages(), include_package_data=True,
zip_safe=False, platforms='any', install_requires=[ 'snaek', ], snaek_rust_modules=[ ('example._native', 'rust/'), ] )
build rust library expose rust -> cabi snaek to consume
#[repr(C)] pub struct Point { pub x: f32, pub y:
f32, } #[no_mangle] pub unsafe extern "C" fn example_get_origin() -> Point { Point { x: 0.0, y: 0.0 } }
from example._native import lib def get_origin(): point = lib.example_get_origin() return
(point.x, point.y)
things in rust to love chapter 6
#[derive(Serialize, Deserialize, Debug, Default)] pub struct Deploy { #[serde(rename="environment")] pub
env: String, pub name: Option<String>, pub url: Option<String>, #[serde(rename="dateStarted")] pub started: Option<DateTime<UTC>>, #[serde(rename="dateFinished")] pub finished: Option<DateTime<UTC>>, }
/// Lists all deploys for a release pub fn list_deploys(&self,
org: &str, version: &str) -> ApiResult<Vec<Deploy>> { self.get(&format!("/organizations/{}/releases/{}/deploys/", PathArg(org), PathArg(version)))? .convert() }
super flexible (de)serialization layer
crates we use / built chapter 7
if_chain lazy_static error-chain always useful
serde serde_derive serde_json serde_yaml for serialization
console indicatif dialoguer for pretty console UI ours :)
rust-curl openssl-probe HTTP stuff
elementtree XML ours :)
things we don't like chapter 8
compile times :'(
things rust needs chapter 9
“what not to do” guide
incremental compilation
higher level C ABI tools
Questions?