[Pyroscope] Client Setup: Python

python ํ™˜๊ฒฝ์—์„œ pyroscope๋ฅผ ๊ตฌ์„ฑํ•ด์„œ ํ”„๋กœํŒŒ์ผ๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

์ผ๋‹จ python์€ ํ”„๋กœํŒŒ์ผ๋ง ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งค์šฐ ์ œํ•œ์ ์ด๋‹ค.
ํ˜„ ์‹œ์ ์—์„œ๋Š” CPU ์‚ฌ์šฉ๋Ÿ‰๋งŒ ์ถ”์ ์ด ๋œ๋‹ค.




์‚ฌ์ „ ๊ตฌ์„ฑ: pyroscope

์—์ด์ „ํŠธ๋ฅผ ๋Œ๋ ค๋ณด๋ ค๋ฉด, ๋‹น์—ฐํžˆ ์„œ๋ฒ„๋ถ€ํ„ฐ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
pyroscope๊ฐ€ ์—†๋‹ค๋ฉด ๋จผ์ € ํ•˜๋‚˜ ๋„์šด๋‹ค.

sudo docker run --name pyroscope -p 4040:4040 grafana/pyroscope:latest

์ด๋ ‡๊ฒŒ ๋“ค์–ด๊ฐ€์ง€๋ฉด ์ž˜ ์‹คํ–‰๋œ ๊ฒƒ์ด๋‹ค.




์„ค์น˜

๋‹จ์ผ ๋ชจ๋“ˆ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

# uv
uv add pyroscope-io

# pip
pip install pyroscope-io

๋Œ€์ถฉ ๋‹ค ๋˜๊ธด ํ•˜๋Š”๋ฐ, arm linux์—์„œ๋Š” ์ง€์›์ด ์ œ๋Œ€๋กœ ์•ˆ๋œ๋‹ค... ์„ค์น˜์กฐ์ฐจ ์•ˆ๋˜๋”๋ผ.




MacOS only

Mac์˜ ๊ฒฝ์šฐ์—๋Š” ์ด์ƒํ•œ ๊ถŒํ•œ ๋ฌธ์ œ๋กœ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ, ๋ญ˜ ๋˜ ์„ธํŒ…์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

brew update
brew install pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init - zsh)"' >> ~/.zshrc
#  Restart your shell
exec "$SHELL"




์‚ฌ์šฉ๋ฒ•

์‚ฌ์šฉ๋ฒ• ์ž์ฒด๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. ํ•จ์ˆ˜ ํ•˜๋‚˜ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์—ฐ๊ฒฐ ์ •๋ณด ๋„ฃ์–ด์ฃผ๋ฉด ๊ทธ๋งŒ์ด๋‹ค.

import time
import pyroscope

pyroscope.configure(
    application_name="testserver",
    server_address="http://localhost:4040",
    tags={
        "env": "development",
    },
    detect_subprocesses=True,
    sample_rate=100,
    oncpu=True,
    gil_only=True,
    enable_logging=True,
)
print("Pyroscope initialized successfully.")

for i in range(1000):
    print(f"Processing item {i}...")
    time.sleep(1)  # Simulate some processing time

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ์ž˜ ์Œ“์ผ ๊ฒƒ์ด๋‹ค.


๊ทผ๋ฐ ๋„ˆ๋ฌด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๋‹จํ•ด์„œ์ธ์ง€, ๋”ฑํžˆ ๋ญ๊ฐ€ ์ฐํžˆ๋Š”๊ฒŒ ์—†๋‹ค.

ํ•œ๋ฒˆ FastAPI์—๋„ ๋„ฃ์–ด๋ณด์ž.

ํ”ผ๋ณด๋‚˜์น˜๋ฅผ ๋น„๋กฏํ•ด์„œ, ์•ฝ๊ฐ„ ํ—ค๋น„ํ•œ ํ•จ์ˆ˜๋“ค์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰๋„ ํ•ด๋ณด์•˜๋‹ค.


๊ทธ๋Ÿฌ๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฐํžˆ๊ธด ํ•œ๋‹ค. main.py์˜ fib ํ•จ์ˆ˜๊ฐ€ ์ €๋งŒํผ ๋จน์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.



์ฐธ์กฐ
https://grafana.com/docs/pyroscope/latest/configure-client/language-sdks/python/
https://medium.com/@maksimlysenko/profiling-fastapi-using-pyroscope-docker-compose-f35801b8a859