Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Rust at Sentry
Armin Ronacher
July 07, 2017
Programming
4
940
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 Snowball Effect of Open Source
mitsuhiko
0
150
Mobile Games are Living Organisms, Too
mitsuhiko
0
81
We gave a Mouse an NDK
mitsuhiko
0
510
Debug is the new Release
mitsuhiko
1
440
A Future Python
mitsuhiko
0
2.3k
Failing in Rust
mitsuhiko
5
790
A Python for Future Generations
mitsuhiko
20
8.7k
My Python is Rusting
mitsuhiko
2
1.5k
Pragmantic SaaS Architecture
mitsuhiko
4
660
Other Decks in Programming
See All in Programming
%q is for Quine
koic
0
400
Jetpack Compose 完全に理解した
mkeeda
1
440
AWSにおける標的型Bot対策
hacomono
0
400
Amazon QuickSightのアップデート -re:Invent 2022の復習&2022年ハイライト-
shogo452
0
210
ペパカレで入社した私が感じた2つのギャップと向き合い方
kosuke_ito
0
160
Excelの助けを借りて楽にシナリオを作ろう
rpa_niiyama
0
260
(新米)エンジニアリングマネージャーのしごと #RSGT2023
murabayashi
9
5.6k
なぜRubyコミュニティにコミットするのか?
luccafort
0
300
LIFFで動く割り勘アプリTATEKAをリリースしてみた話
inoue2002
0
230
10年以上続くプロダクトの フロントエンド刷新プロジェクトのふりかえり
yotahada3
2
320
Glance App Widgetでウィジェットを作ろう / MoT TechTalk #15
mot_techtalk
0
110
OIDC仕様に準拠した Makuake ID連携基盤構築の裏側
ymtdzzz
0
390
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
338
18k
Web Components: a chance to create the future
zenorocha
304
40k
Done Done
chrislema
178
14k
No one is an island. Learnings from fostering a developers community.
thoeni
12
1.5k
GraphQLとの向き合い方2022年版
quramy
20
9.8k
How to name files
jennybc
47
73k
Streamline your AJAX requests with AmplifyJS and jQuery
dougneiner
128
8.8k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
318
19k
4 Signs Your Business is Dying
shpigford
171
20k
Into the Great Unknown - MozCon
thekraken
2
280
Building an army of robots
kneath
301
40k
Navigating Team Friction
lara
176
12k
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?