[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