[Pyroscope] Client Setup: Rust

Rust ํ™˜๊ฒฝ์—์„œ Pyroscope Client๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃฌ๋‹ค.

๊ด€๋ จ ํฌ์ŠคํŠธ
https://blog.naver.com/sssang97/223415589139



์ œํ•œ์‚ฌํ•ญ

Rust์˜ ํ”„๋กœํŒŒ์ผ๋ง์€ ์ฃผ๋กœ pprof-rs๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค.
๊ฑฐ์˜ Linux ํ™˜๊ฒฝ์—์„œ๋งŒ ์ œ๋Œ€๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ชจ๋‹ˆํ„ฐ๋ง์€ ์•„์ง ์ง€์›๋˜๋Š”๊ฒŒ ์—†๋Š” ๋ชจ์–‘์ด๋‹ค.




์„ค์น˜

ํ•„์š”ํ•œ ์ข…์†์„ฑ์€ 2๊ฐ€์ง€๋‹ค.
์„ค์น˜ํ•ด์ค€๋‹ค.

cargo add pyroscope
cargo add pyroscope_pprofrs

์ด์ •๋„๋‹ค.




์ฝ”๋“œ ๊ตฌ์„ฑ

์•„๋ž˜์™€ ๊ฐ™์€ axum ์„œ๋ฒ„ ์ฝ”๋“œ์— pyroscope ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด๊ฒ ๋‹ค.

์ฝ”๋“œ ํ˜•ํƒœ๋Š” ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

fn setup_pyroscope() {
    use pyroscope::PyroscopeAgent;
    use pyroscope_pprofrs::{pprof_backend, PprofConfig};

    // Configure profiling backend
    let pprof_config = PprofConfig::new().sample_rate(100);
    let backend_impl = pprof_backend(pprof_config);

    // Configure Pyroscope Agent
    let agent = PyroscopeAgent::builder("http://localhost:4040", "myapp")
        .backend(backend_impl)
        .build()
        .unwrap();

    agent.start().unwrap();
}

pprof ์ƒ˜ํ”Œ ์ฃผ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๊ณ , pyroscope ์„œ๋ฒ„์™€ ์•ฑ ์ด๋ฆ„์„ ์ •ํ•ด์„œ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  start๋กœ ์‹คํ–‰ํ•œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” nonblock์ด๋ผ์„œ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.


์ด๋ ‡๊ฒŒ




ํ™•์ธ

ํด๋ผ์ด์–ธํŠธ ์ž‘์„ฑ์ด ์ œ๋Œ€๋กœ ๋˜์—ˆ๋‹ค๋ฉด ์‹คํ–‰ ์ดํ›„์— ์•„๋ž˜์™€ ๊ฐ™์ด ํƒญ์ด ์ƒ์„ฑ๋  ๊ฒƒ์ด๋‹ค.

์ง€ํ‘œ๊ฐ€ ํ•˜๋‚˜๋ฟ์ด๋ผ ์ข€ ๋‹จ์ถœํ•œ ํŽธ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  API๋ฅผ ๋ช‡๋ฒˆ ๋‚ ๋ ค๋ณด๋ฉด

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋“ค์ด ์Œ“์ธ๋‹ค.

์ข€ ์ž์„ธํžˆ ๋ณด๋ฉด

tokio:axum์ด ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์Šคํƒ๋•Œ๋ฌธ์— ์ข€ ๋ณด๊ธฐ๊ฐ€ ํž˜๋“  ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ, ์•„๋ฌดํŠผ ๋ณ‘๋ชฉ์œผ๋กœ ์žกํžˆ๋Š” heavy ํ•จ์ˆ˜ ์ž์ฒด๋Š” ์ถ”์ ์ด ๋๋‹ค.

์ด๋ ‡๊ฒŒ ์จ๋จน์œผ๋ฉด ๋œ๋‹ค.



์ฐธ์กฐ
https://grafana.com/docs/pyroscope/latest/configure-client/language-sdks/rust/