۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

ردیابی خطا با Sentry، Python و Django

اگر تا به حال آرزو کرده اید که راه ساده تری برای ردیابی خطاها در برنامه های Python-Django داشته باشید، Sentry می تواند پاسخی به رویاهای شما باشد. بیایید با Sentry در پایتون شروع کنیم.

اگر تا به حال آرزو کرده اید که راه ساده تری برای ردیابی خطاها در برنامه های Python-Django داشته باشید، Sentry می تواند پاسخی به رویاهای شما باشد. بیایید با Sentry در پایتون شروع کنیم.

چند وقت پیش، به شما نشان دادم که چگونه می‌توانید ردیابی را با Sentry به برنامه جاوا اسکریپت اضافه کنید. در این مقاله، ما با استفاده از Sentry در انتهای پشتی برای ردیابی خطاها در پشته برنامه Python-Django آشنا خواهیم شد.

نصب و راه اندازی Python و Django

اولین قدم ایجاد یک برنامه جنگو است. ما قصد داریم از Python 3 استفاده کنیم، بنابراین با نصب پایتون ۳ در سیستم خود شروع کنید. ما همچنین به pip3 نیاز داریم. در دبیان، هر دو را با وارد کردن دستور sudo apt-get install python3 python3-pip نصب می‌کنم. هنگامی که پایتون و pip را نصب کردید، باید پاسخ‌ها را از سوییچ -V دریافت کنید، همانطور که در فهرست ۱ نشان داده شده است.


$python3 -V
Python 3.11.0
$ pip3 -V
pip 22.3.1 from /usr/lib/python3/dist-packages/pip (python 3.11)

بعد، چارچوب جنگو را نصب کنید و بررسی کنید که کار می کند، همانطور که در فهرست ۲ نشان داده شده است.


$ pip3 install Django
…
$ django-admin --version
۴.۱.۳

اکنون می‌توانیم با استفاده از جنگو یک برنامه جدید راه‌اندازی کنیم. دستور django-admin startproject djangosentry را وارد کنید. این یک دایرکتوری برای نگهداری پروژه استارت ما ایجاد می کند. حالا سی دی را وارد پروژه کنید، /djangosentry. جنگو پایگاه داده برنامه را مدیریت می کند، بنابراین ما فقط باید آن را با داده های اولیه مورد نیاز برای اجرای یک نوع جنگو پر کنیم. را وارد کنید، python3 manager.py migrate، جایی که manage.py اسکریپت اصلی جنگو است. پس از تکمیل، یک کاربر با وارد کردن: python3 manager.py createsuperuser اضافه می کنیم. ما به این کاربر برای ورود به سیستم نیاز داریم. (توجه داشته باشید که از شما یک نام کاربری و رمز عبور خواسته می شود – فقط از چیزی استفاده کنید که به خاطر بسپارید.)

ما باید به جنگو بگوییم که به میزبان فعلی اجازه دهد. می توانید آدرس IP خود را با اشاره به مرورگر خود به https://whatsmyip.com پیدا کنید. به djangosentry/setting.py بروید و آدرس IP را که نمونه در آن قرار دارد به آرایه ALLOWED_HOSTS اضافه کنید. چیزی شبیه به: ALLOWED_HOSTS = ['192.168.0.122']. اکنون، می توانید سرور را با تایپ کردن: python3 manager.py runserver 0.0.0.0:8000 راه اندازی کنید.

اگر از http://192.168.0.122:8000 بازدید کنید، صفحه خوش آمدگویی جنگو را در شکل ۱ مشاهده خواهید کرد.

پیشنهاد جاوا ایجاد رکورد را ساده می کند

صفحه خوش آمدگویی جنگو.

شکل ۱. صفحه خوش آمدگویی جنگو.

توجه داشته باشید که یک کنسول مدیریت نیز برای افزودن کاربران و گروه‌ها در  http://192.168.0.122:8000/admin وجود دارد.

Sentry را راه اندازی کنید

اکنون که یک برنامه جنگو در حال اجرا داریم، اجازه دهید Sentry را برای ردیابی خطاها تنظیم کنیم. اولین قدم ایجاد یک حساب Sentry است که در صورت انتخاب گزینه Developer رایگان است. پس از ایجاد حساب و ورود به سیستم، داشبورد Sentry را مشاهده خواهید کرد. منوی سمت چپ ناوبری اصلی Sentry را نشان می دهد. روی پروژه ها کلیک کنید و با دکمه ایجاد پروژه در گوشه سمت راست بالا، پروژه ای ایجاد کنید.

صفحه پیکربندی

شکل ۲. یک پروژه جدید ایجاد کنید.

یک پروژه جنگو را ایجاد و پیکربندی کنید

یک پروژه یک محفظه مرکزی برای اطلاعات ردیابی ما به ما می دهد. پس از زدن Create Project، می‌توانید “Django” را به عنوان نوع انتخاب کنید و نام پیش‌فرض django-python را بپذیرید.

بعد از ایجاد پروژه، گزینه ای برای پیکربندی آن به شما نمایش داده می شود. قطعه کد نشان داده شده در شکل ۳ را کپی کرده و به پروژه خود اضافه کنید.

برای پیکربندی جنگو، قطعه کد را کپی کنید.

شکل ۳. جنگو را پیکربندی کنید.

اکنون که یک برنامه کاربردی و یک پروژه داریم، می توانیم کتابخانه Sentry را اضافه کنیم. به پروژه djangosentry در خط فرمان خود بازگردید و تایپ کنید: pip install --upgrade sentry-sdk. این دستور کتابخانه Sentry را به پروژه شما اضافه می کند.

اکنون، SDK را به فایل djangosentry/settings.py خود وارد کرده و پیکربندی می‌کنیم، که فایل پیکربندی اصلی جنگو است. این فقط چند خط کد است، اما ما به نام منبع داده (DSN) برای پروژه نیاز داریم. ایده اینجا این است که DSN ارتباط بین پروژه جنگو و پروژه را در Sentry ایجاد می کند، بنابراین می توانید فعالیت پروژه را با استفاده از داشبورد پیگیری کنید.

اکنون به فایل djangosentry/djangosentry/settings.py بروید و کدی را که کپی کرده‌اید به پایین فایل اضافه کنید. نتیجه باید شبیه چیزی باشد که در فهرست ۳ می بینید.


import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration

sentry_sdk.init(
    dsn="<THE DSN YOU COPIED>",
    integrations=[
    DjangoIntegration(),

    ],
    traces_sample_rate=1.0,
    send_default_pii=True
)

باور کنید یا نه، پروژه جنگو برای گرفتن داده های خطا آماده است. در واقع، تنظیم traces_sample_rate به Sentry می‌گوید که معیارهای عملکرد را نیز ثبت کند – این مقدار می‌تواند از ۰ تا ۱.۰ باشد. توجه داشته باشید که تنظیم نرخ نمونه خود روی ۱۰۰٪ (یعنی ۱.۰) می تواند به سرعت سهمیه شما را تمام کند. مطمئن شوید که نرخ نمونه خود را پس از جمع آوری داده های عملکرد اولیه تنظیم کنید.

امیدی جدید برای امنیت نرم افزار

گزارش خطا با Sentry

بیایید یک خطای سریع ایجاد کنیم تا ببینیم Sentry کار می کند یا خیر. به فایل settings.py خود برگردید و آدرس IP را از میزبان های مجاز حذف کنید. سپس، برنامه را مجددا راه اندازی کنید و صفحه وب را دوباره بارگیری کنید. یک صفحه خطا مانند شکل ۴ دریافت خواهید کرد.

یک خطا در جنگو

شکل ۴. یک خطا در جنگو.

اگر خروجی کنسول جنگو را بررسی کنید، این خطا را نیز خواهید دید: [۲۰/Nov/2022 11:17:40] "GET / HTTP/1.1" 400 69108. سرور جنگو یک خطای مجوز HTTP 400 را برمی‌گرداند.

اکنون، بیایید به همان گزارش خطا از Sentry نگاه کنیم. به طور پیش‌فرض، آدرس ایمیلی که برای راه‌اندازی حساب Sentry خود استفاده کرده‌اید، در هشدارها مشترک است. برای خطای مجوز HTTP، هشداری مشابه آنچه در شکل ۵ می بینید دریافت خواهید کرد.

هشدار ایمیل ارسالی

شکل ۵. یک هشدار ایمیل از Sentry.

بعد، به داشبورد Sentry نگاهی بیندازید. اگر پروژه python-django را باز کنید، همانطور که در شکل ۶ نشان داده شده است، خطا را در آنجا منعکس می‌کنید.

اولین خطا.

شکل ۶. خطای جنگو در داشبورد Sentry شما.

برای دریافت جزئیات می توانید روی خطای موجود در داشبورد کلیک کنید. تقریباً همه چیزهایی را که سیستم می تواند در مورد آنچه اتفاق افتاده است، از عامل کاربر و مهر زمان گرفته تا اینکه آیا این یک استثنا بوده است (در این مورد، چنین بود) مشاهده خواهید کرد.

پیکربندی محیط

توجه داشته باشید که خطای شکل ۶ به عنوان محیط: تولید. Sentry بدون پیکربندی بیشتر، فرض کرد که خطا از تولید است. برای تنظیم دستی محیط، به فایل djangosentry/settings.py بروید. در فراخوانی تابع sentry_sdk.init()، آرگومانی را اضافه کنید که یک محیط را مشخص می کند، همانطور که در فهرست ۴ نشان داده شده است.


sentry_sdk.init(
    dsn=”https://5a494c21efc04030af81283b5a98b9f0@o1307092.ingest.sentry.io/4504193108672512”,
    	integrations=[
        	DjangoIntegration(),
   	],
   	 traces_sample_rate=1.0,
    	send_default_pii=True,
    	environment="dev" # < ADD THIS
)

اکنون، وقتی خطایی گزارش می‌شود، Sentry آن را به محیط dev اختصاص می‌دهد. می توانید این رشته را از یک متغیر محیطی (به عنوان مثال SENTRY_ENVIRONMENT) تنظیم کنید. در سرور خود، این متغیر را به عنوان production، staging یا qa تنظیم می‌کنید. در دستگاه محلی خود، متغیر را روی dev تنظیم کنید. سپس می توانید از لیست کشویی انتخاب کنید و بر اساس محیط موجود در داشبورد فیلتر کنید.

خطاهای کدنویسی و ردیابی مشکل

به جای خراب کردن برنامه مثال، اجازه دهید ابتدا ورودی ALLOWED_HOSTS را با قرار دادن آدرس IP صحیح در آنجا اصلاح کنیم. سپس، بیایید با اضافه کردن یک مسیر جنگو که یک استثنا ایجاد می کند، یک خطای کدگذاری معمولی ایجاد کنیم. فایل djangosentry/urls.py را باز کرده و آن را طوری تغییر دهید که مسیر /error را در بر گیرد، همانطور که در فهرست ۵ نشان داده شده است.


def trigger_error(request):
    raise Exception("Something has gone seriously wrong and you're coding skills are in question.")

urlpatterns = [
    path('admin/', admin.site.urls),
    path('error/', trigger_error)
]

اکنون، اگر از مسیر localhost:8000/error بازدید کنید، استثنای سفارشی را خواهید دید. متوجه خواهید شد که Sentry به طور پیش فرض خطاهای مشابه را در مشکلات گروه بندی کرده است. استثنای جدید یک ایمیل هشدار را راه‌اندازی کرده است، اما تکرار مکرر همان خطا را ایجاد نمی‌کند. همانطور که در شکل ۷ نشان داده شده است، می توانید همان نوع سازمان را در داشبورد Sentry مشاهده کنید.

کاهش رابط کاربری

به طور پیش‌فرض، خطاهای مشابه (یا رویدادها) به مشکلات گروه‌بندی می‌شوند. این قابل تنظیم است و می توانید چندین رویداد را در یک شماره سازماندهی کنید.

گروه‌بندی خطاها به مشکلات.

شکل ۷. خطاهای گروه بندی شده در مسائل.

نظارت بر عملکرد

اکنون که Sentry را برای ردیابی و گزارش خطاها راه‌اندازی کرده‌اید، می‌توانید آن را به گونه‌ای تنظیم کنید که معیارهای عملکرد را نیز ثبت کند تا به سرعت مشکلات تاخیر و توان عملیاتی را شناسایی کنید.

ردیابی معیارهای عملکرد.

شکل ۸. معیارهای عملکرد در Sentry.

در اینجا، می‌توانید تفکیک عملکرد مسیر خطایی را که قبلاً اضافه کرده‌اید مشاهده کنید. Sentry اخیراً ویژگی جدیدی را برای تشخیص مشکلات رایج عملکرد به پلتفرم نظارت بر عملکرد برنامه خود اضافه کرده است. پرس و جوهای پایگاه داده N+1 برای پروژه های جنگو اولین نوع مشکلی است که Sentry برای ویژگی جدید Performance Issues معرفی کرد. همانطور که در این توییت توضیح داده شد، تیم سازنده جنگو از ویژگی جدید برای شناسایی N+1 استفاده کرد. موضوع در سایت مستندات جنگو. کارلتون گیبسون، همکار جنگو، اظهار داشت: «خوشحال بود که جستجوهای N+1 را در فهرست مسائل Sentry باز می‌کردیم. یک select_related سریع و همه حل شد، زیرا به راحتی می‌توان از جایی که این [N+1 Query] می‌آیند غافل شد. فکر می‌کنم بسیار مفید خواهد بود.”

نتیجه گیری

ما یک تور سریع از برخی از قابلیت‌های Sentry در زمینه برنامه Python-Django انجام داده‌ایم. قدرت بسیار زیادی در زیر کاپوت داشبورد Sentry وجود دارد، اما شاید بهترین چیز این است که به راحتی می توانید از آن برای اضافه کردن ردیابی خطا به یک برنامه استفاده کنید. تنها کاری که باید انجام می‌دادیم این بود که DSN خود را به دست آوریم، یک تغییر کوچک در کد ایجاد کنیم و خطاهایی در سراسر برنامه با پیش‌فرض‌های معقول و قابل تنظیم گزارش می‌شد.