Sentry отслеживает приложения Django и использует уведомления электронной почты и DingTalk.

Python Docker Django
Sentry отслеживает приложения Django и использует уведомления электронной почты и DingTalk.

Sentry – это система отслеживания исключений в программе с открытым исходным кодом. В основном Sentry поддерживает основные языки. Sentry разработан с использованием Django+DRF+Celery+Celery-Beat. Если вы являетесь пользователем Python и хорошо знакомы с этими технологическими стеками, вы Вы можете прочитать соответствующий исходный код, и вы получите много преимуществ.Стоит отметить, что Sentry поддерживает только Python2 во время развертывания, а не Python3.

В этой статье мы будемDockerспособ развертыванияSentry, который также является официально рекомендуемым методом развертывания, и мы напишем простойDjangoприменять, использоватьemail +钉钉 В случае возникновения исключения разработчик может вовремя его получить и обработать.

окрестности

Я здесь vultrДля этого теста был открыт облачный сервер с использованиемCentOS7система.

операция инициализации

установить источник эпел

  1. $ yum install epel-release -y

скопировать код

система обновления

  1. $ yum update -y

скопировать код

Установите некоторые инструменты

  1. $ yum install python-pip vim git -y

скопировать код

Рекомендуется перезагрузить систему

  1. $ reboot

скопировать код

базовая конфигурация

  • ОЗУ

  1. $ free -h

  2.              total        used        free      shared  buff/cache   available

  3. Mem:           3.7G         95M        3.4G        8.4M        168M        3.4G

  4. Swap:            0B          0B          0B

скопировать код
  • CPU

  1. $ cat /proc/cpuinfo | grep processor | wc -l

  2. 2

скопировать код

конфигурация2H4G, Что если вы1GСервер памяти, кажется, мне трудно работать на Tencent Cloud, я чувствую, по крайней мере, все еще нужно2GПучок.

Установить Докер

Документация по установке серии CentOS размещена по адресу: https://docs.docker.com/install/linux/docker-ce/centos/, вы можете прочитать ее, если вам интересно, а некоторые операции я упрощу здесь.

  • установить некоторые пакеты

  1. $ yum install -y yum-utils device-mapper-persistent-data lvm2

скопировать код
  • Добавить источник репозитория докера

  1. $ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

скопировать код
  • установить докер

  1. $ yum install docker-ce -y

скопировать код
  • запустить докер

  1. $ systemctl start docker

скопировать код
  • Автоматический старт

  1. $ systemctl enable docker

скопировать код
  • Посмотреть версию докера

  1. $ docker --version

  2. Docker version 18.03.1-ce, build 9ee9f40

скопировать код
  • управлятьhello -world

  1. $ docker run hello-world

  2. Unable to find image 'hello-world:latest' locally

  3. latest: Pulling from library/hello-world

  4. 9db2ca6ccae0: Pull complete

  5. Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc

  6. Status: Downloaded newer image for hello-world:latest

  7. Hello from Docker!

  8. This message shows that your installation appears to be working correctly.

  9. To generate this message, Docker took the following steps:

  10. 1. The Docker client contacted the Docker daemon.

  11. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

  12.    (amd64)

  13. 3. The Docker daemon created a new container from that image which runs the

  14.    executable that produces the output you are currently reading.

  15. 4. The Docker daemon streamed that output to the Docker client, which sent it

  16.    to your terminal.

  17. To try something more ambitious, you can run an Ubuntu container with:

  18. $ docker run -it ubuntu bash

  19. Share images, automate workflows, and more with a free Docker ID:

  20. https://hub.docker.com/

  21. For more examples and ideas, visit:

  22. https://docs.docker.com/engine/userguide/

скопировать код

Если результат после запуска такой же, как у меня, значит, все в порядке, докер установлен.

Если вы используете домашний сервер, он можетpullПри зеркалировании происходит аномально медленно, поэтому официал обеспечивает внутреннее ускорение образа докера, нажмите меня, чтобы щелкнуть меня, после настройки вы должны не забыть перезапустить службу докера, иначе конфигурация не может быть загружена, команда перезапуска выглядит следующим образом:

                                
  1. $ systemctl restart docker

скопировать код

Установить докер-компоновку

  1. $ curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

  2. $ chmod +x /usr/local/bin/docker-compose

скопировать код

я ношу1.21.2версия, обычно та, которую вы установилиdockerи docker -composeС последней версией проблем нет, проверьтеdocker -composeВерсия

                                    
  1. $ docker -compose -- version

  2. docker -compose version 1.21 .2, build a133471

скопировать код

Установить Сентри

Наконец дошел до решающего шага,Sentry, официальный предоставляет полный комплектdockerметод развертывания для запускаSentry.

  • Скачать проект

  1. $ cd /opt/

  2. $ git clone https://github.com/getsentry/onpremise.git sentry

  3. $ cd sentry

скопировать код
  • Создайте базу данных и каталог конфигурации Sentry

  1. $ mkdir -p data/{sentry,postgres}

скопировать код
  • добавить некоторые зависимости

  1. $ vim requirements.txt

  2. # Add plugins here

  3. sentry-dingding~=0.0.1  # 钉钉通知插件

  4. django-smtp-ssl~=1.0  # 发邮件支持SSL协议

скопировать код
  • Создайте образ Docker

  1. $ docker-compose build

скопировать код
  • сгенерировать ключ

  1. $ docker-compose run --rm web config generate-secret-key

  2. ......

  3. # 最后一行会输出类似如下的秘钥串

  4. kbjodp(id&b0^kbnxijn11&2e6xu&vy1(oini!-zl)pl610n&v

скопировать код

Добавьте указанный выше ключ вdocker-compose.ymlфайлSENTRY_SECRET_KEYв переменной окружения

                                            
  1. $ vim docker -compose. yml

  2. ......

  3. SENTRY_SECRET_KEY : 'kbjodp(id&b0^kbnxijn11&2e6xu&vy1(oini!-zl)pl610n&v'

скопировать код
  • Создайте таблицы базы данных и создайте пользователя-администратора

  1. $ docker-compose run --rm web upgrade

  2. ......

  3. Would you like to create a user account now? [Y/n]: y  # 创建用户

  4. Email: ianshengme@gmail.com  # 邮箱

  5. Password:  # 密码

  6. Repeat for confirmation:  # 确认密码

  7. Should this user be a superuser? [y/N]: y  # 为超级管理员用户

скопировать код
  • запустить службу

  1. $ docker-compose up -d

скопировать код

в состоянии пройтиdocker-compose psПроверьте, какие контейнеры запущены

                                                
  1. $ docker -compose ps

  2.       Name                     Command               State           Ports

  3. ------------------------------------------------------------------------------------

  4. sentry_cron_1         /entrypoint. sh run cron          Up      9000 /tcp

  5. sentry_memcached_1   docker -entrypoint. sh memcached   Up      11211 /tcp

  6. sentry_postgres_1    docker -entrypoint. sh postgres    Up      5432 /tcp

  7. sentry_redis_1       docker -entrypoint. sh redis ...   Up      6379 /tcp

  8. sentry_smtp_1        docker -entrypoint. sh tini  ...   Up      25 /tcp

  9. sentry_web_1         /entrypoint. sh run web           Up      0.0 .0.0:9000 ->9000 /tcp

  10. sentry_worker_1       /entrypoint. sh run worker        Up      9000 /tcp

скопировать код

Вышеуказанные услуги описываются следующим образом:

название описывать
sentry_cron Запланированные задачи, используяcelery-beat
sentry_memcached memcached
sentry_postgres база данных pgsql
sentry_redis Службы, необходимые для запуска celery
sentry_smtp отправить электронное письмо
sentry_web использовать django+drfнабор письмаSentry Web 界面
sentry_worker Рабочий сервис Celery, используемый для запуска асинхронных задач.

После запуска службы она будет прослушивать по умолчанию9000порт, если вы хотите изменить его, вы можетеdocker -compose .ymlвнести изменения в.

Я указал свое доменное имяansheng.meдобавилAзапись, значение записиsentry, указывает на облачный сервер этого часового, так что вы можете пройтиsentry .ansheng .meполучить доступ.

Базовая настройка Sentry

браузер открытhttp://sentry.ansheng.me:9000/, введите адрес электронной почты и пароль для входа

После успешного входа введите соответствующийRootURLи Admin Email, затем нажмитеContinue

Нажмите, чтобы войтиSentryосновной интерфейс

Добавить проект Python

Нажмите в правом верхнем углуAddnew,выберите Project

затем создайте проект

После создания проекта появится пользовательский интерфейс

Тестировать программы Python

В соответствии с приведенными выше шагами, давайте действовать шаг за шагом, я работаю на своем сервере, версия Python выглядит следующим образом:

  1. $ python -V

  2. Python 2.7.5

скопировать код
  • установить ворон

  1. $ pip install raven --upgrade

скопировать код
  • добавить тестовый код

  1. $ vim sentry_python_test.py

  2. from raven import Client

  3. client = Client('http://ce5502f746a4484f9b2c391a54d2d1c4:bca94f6b330a4dd183e68243b2a1b99c@sentry.ansheng.me:9000/2')

  4. try:

  5.    1 / 0

  6. except ZeroDivisionError:

  7.    client.captureException()

скопировать код
  • бегать

  1. $ python sentry_python_test.py

  2. Sentry is attempting to send 1 pending error messages

  3. Waiting up to 10 seconds

  4. Press Ctrl-C to quit

скопировать код

Просмотр исключений

В приведенном выше интерфейсе нажмитеGotit~Takeme to theIssueStream.в проектIssueстраница, страница ошибки

Вы можете видеть, что уже есть исключение. Это исключение — ошибка, которую мы зафиксировали, когда только что протестировали ее. НажмитеZeroDivisionErrorБольшой заголовок, введите ненормальную страницу сведений.

На странице проекта мы видимMESSAGEи EXCEPTIONЭти две части выводят конкретные сведения об ошибке.

Основные шаги такие же, как описано выше, и процесс аналогичен

Добавьте проект Django и монитор

Создано сверхуPythonШаги проекта Sentry добавляют файл с именемcash,Да Djangoоформить проект и поставитьDSNЗаписанное значение

http://9ad8168873a94fb1927e14111b9bca1e:29ea550781e24ca2ba0c0ee4829dfc96@sentry.ansheng.me:9000/3

Создайте проект джанго

Проект django, который я создал на своем компьютере.

  • добавить файл с именемcashвиртуальная среда

  1. $ pyenv virtualenv 3.6.5 cash

скопировать код
  • переключить виртуальную среду

  1. $ pyenv activate cash

скопировать код
  • установить джанго

  1. $ pip install django

скопировать код
  • создать проект

  1. $ cd /tmp

  2. $ django-admin startproject cash

  3. $ cd cash

  4. $ python manage.py migrate

скопировать код
  • Стартовый проект

  1. $ python manage.py runserver 0:9999

  2. Performing system checks...

  3. System check identified no issues (0 silenced).

  4. July 17, 2018 - 03:35:05

  5. Django version 2.0.7, using settings 'cash.settings'

  6. Starting development server at http://0:9999/

  7. Quit the server with CONTROL-C.

скопировать код

порт прослушивания в9999, к которому можно получить доступ через curl для тестирования

                                                                                                                                            
  1. $ curl -I http ://127.0 .0.1 :9999

  2. HTTP /1.1 200 OK

  3. ......

скопировать код

Если статус 200, это означает, что операция прошла успешно.

  • Посмотреть структуру каталогов

  1. ➜  cash tree ./

  2. ./

  3. ├── cash

  4. │   ├── __init__.py

  5. │   ├── settings.py

  6. │   ├── urls.py

  7. │   ├── views.py

  8. │   └── wsgi.py

  9. ├── db.sqlite3

  10. └── manage.py

скопировать код
  • Напишите простое представление

  1. $ vim cash/views.py

  2. from django.http import HttpResponse

  3. def success(request):

  4.    return HttpResponse("OK")

  5. def error(request):

  6.    1 / 0

  7.    return HttpResponse("Not OK")

скопировать код
  • добавить URL

  1. $ vim cash/urls.py

  2. from django.urls import path

  3. from . import views

  4. urlpatterns = [

  5.    path('success', views.success, name='success'),

  6.    path('error', views.error, name='error'),

  7. ]

скопировать код
  • проверка доступа

Получите доступ к API, который может вернуть успех

  1. $ curl http://127.0.0.1:9999/success

  2. OK

скопировать код

Доступ к API, который сообщит об ошибке

  1. $ curl -I http://127.0.0.1:9999/error

  2. HTTP/1.1 500 Internal Server Error

  3. ......

скопировать код

сообщил500ошибка, вывод журнала выглядит следующим образом

                                                                                                                                                
  1. Internal Server Error : /error

  2. Traceback ( most recent call last ):

  3.   File "/Users/shengan/.pyenv/versions/cash/lib/python3.6/site-packages/django/core/handlers/exception.py" , line 35, in inner

  4.    response = get_response (request )

  5.   File "/Users/shengan/.pyenv/versions/cash/lib/python3.6/site-packages/django/core/handlers/base.py" , line 128, in _get_response

  6.    response = self. process_exception_by_middleware( e, request)

  7.   File "/Users/shengan/.pyenv/versions/cash/lib/python3.6/site-packages/django/core/handlers/base.py" , line 126, in _get_response

  8.    response = wrapped_callback (request , *callback_args , **callback_kwargs )

  9.   File "/private/tmp/cash/cash/views.py", line 8 , in error

  10.     1 / 0

  11. ZeroDivisionError : division by zero

  12. [ 17/ Jul/ 2018 03: 50: 55] "HEAD /error HTTP/1.1" 500 60675

скопировать код

Интегрировать Сентри

  • установить ворон

  1. $ pip install raven --upgrade

скопировать код
  • существует INSTALLED_APPSдобавить вraven .contrib .django .raven_compat

  1. INSTALLED_APPS = (

  2.    ......

  3.    'raven.contrib.django.raven_compat',

  4. )

скопировать код
  • Добавить конфигурацию часового в настройках

  1. import os

  2. import raven

  3. RAVEN_CONFIG = {

  4.    'dsn': 'http://9ad8168873a94fb1927e14111b9bca1e:29ea550781e24ca2ba0c0ee4829dfc96@sentry.ansheng.me:9000/3'  # DSN输入我们刚才记录下来的DSN

  5. }

скопировать код
  • После завершения настройки проведем следующий тест

Доступ к неправильному API

  1. $ curl -I http://127.0.0.1:9999/error

скопировать код
  • список исключений

  • Сведения об исключении

Настроить уведомления по электронной почте

Я использую здесь почтовый ящик Netease, конкретная операция выглядит следующим образом

  • Измените файл config.yml, чтобы добавитьMail ServerКонфигурация

  1. $ vim config.yml

  2. mail.backend: 'django_smtp_ssl.SSLEmailBackend'  # Use dummy if you want to disable email entirely

  3. mail.host: 'smtp.163.com'

  4. mail.port: 465

  5. mail.username: 'anshengme@163.com'

  6. mail.password: '14RJg5vzGFWUNKiP'  # 这里的密码,不是登录密码,是"客户端授权密码"

  7. mail.use-tls: false

  8. # The email address to send on behalf of

  9. mail.from: 'anshengme@163.com'

скопировать код
  • восстановить образ

  1. $ docker-compose build

  2. $ docker-compose up -d

скопировать код

После перезапуска вы можетеAdmin==>  邮件Найдите конфигурацию почтового ящика ниже

Затем нажмите ниже向ianshengme@gmail.com发送一份测试邮件, а затем перейдите в свой почтовый ящик, чтобы узнать, получили ли вы электронное письмо

Я могу успешно получить отправленное тестовое письмо здесь Обычно ненормальное уведомление может быть получено после завершения настройки почтового ящика.

  • Подтвердите электронную почту пользователя

оказаться Settings=>Account=>Emails

затем нажмитеResendverification, вы получите письмо с подтверждением

НажмитеConfirmПодтвердите электронный адрес.

  • тест уведомления об исключении

Затем мы обращаемся к неправильному API

  1. $ curl -I http://127.0.0.1:9999/error

  2. HTTP/1.1 500 Internal Server Error

скопировать код
  • Просмотр сообщений о тревогах, полученных почтовым ящиком

По сути, сообщение об ошибке, которое вы получили, аналогично приведенному выше. Я не знаю, почему аватар не отображается, несмотря ни на что, если вы хотите просмотреть сведения об ошибке, нажмитеViewonSentryВы можете открыть сведения об исключении.

Настройка уведомлений DingTalk

Мы все знаем, что своевременность уведомлений по электронной почте слишком низкая, чтобы их можно было доставить немедленно, поэтому мы сосредоточимся на следующем:钉钉机器人групповое уведомление.

  • Создайте группу DingTalk, чтобы добавить собственного робота и получить егоaccess_token

я получил это здесьaccess_tokenДа 4dadfa77dfc3fe3b34e91237665afbef165e745dd93ec191c48bf4843b1ad63c

  • настроить

Найти все интеграции денежного проекта

затем найтиDingDingэтот плагин,启用插件, затем нажмитеConfigure PluginНастроить плагин

Введите то, что вы только что получилиaccess_token, нажмитеSave Changesсохранить изменения

  • Уведомление об исключении теста

Затем мы получаем доступ к следующему API исключений

  1. $ curl -I http://127.0.0.1:9999/error

  2. HTTP/1.1 500 Internal Server Error

  3. ......

скопировать код

На этом этапе ваш робот DingTalk должен отправить следующую ошибку

нажмите вышеhrefВы можете перейти на страницу сведений об ошибке, и на этом эта статья заканчивается.