Sentry – это система отслеживания исключений в программе с открытым исходным кодом. В основном Sentry поддерживает основные языки. Sentry разработан с использованием Django+DRF+Celery+Celery-Beat. Если вы являетесь пользователем Python и хорошо знакомы с этими технологическими стеками, вы Вы можете прочитать соответствующий исходный код, и вы получите много преимуществ.Стоит отметить, что Sentry поддерживает только Python2 во время развертывания, а не Python3.
В этой статье мы будемDockerспособ развертыванияSentry, который также является официально рекомендуемым методом развертывания, и мы напишем простойDjangoприменять, использоватьemail
+钉钉
В случае возникновения исключения разработчик может вовремя его получить и обработать.
окрестности
Я здесь vultrДля этого теста был открыт облачный сервер с использованиемCentOS7система.
операция инициализации
установить источник эпел
$ yum install epel-release -y
скопировать код
система обновления
$ yum update -y
скопировать код
Установите некоторые инструменты
$ yum install python-pip vim git -y
скопировать код
Рекомендуется перезагрузить систему
$ reboot
скопировать код
базовая конфигурация
-
ОЗУ
$ free -h
total used free shared buff/cache available
Mem: 3.7G 95M 3.4G 8.4M 168M 3.4G
Swap: 0B 0B 0B
скопировать код
-
CPU
$ cat /proc/cpuinfo | grep processor | wc -l
2
скопировать код
конфигурация2H4G, Что если вы1GСервер памяти, кажется, мне трудно работать на Tencent Cloud, я чувствую, по крайней мере, все еще нужно2GПучок.
Установить Докер
Документация по установке серии CentOS размещена по адресу: https://docs.docker.com/install/linux/docker-ce/centos/, вы можете прочитать ее, если вам интересно, а некоторые операции я упрощу здесь.
-
установить некоторые пакеты
$ yum install -y yum-utils device-mapper-persistent-data lvm2
скопировать код
-
Добавить источник репозитория докера
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
скопировать код
-
установить докер
$ yum install docker-ce -y
скопировать код
-
запустить докер
$ systemctl start docker
скопировать код
-
Автоматический старт
$ systemctl enable docker
скопировать код
-
Посмотреть версию докера
$ docker --version
Docker version 18.03.1-ce, build 9ee9f40
скопировать код
-
управлять
hello -world
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
скопировать код
Если результат после запуска такой же, как у меня, значит, все в порядке, докер установлен.
Если вы используете домашний сервер, он можетpullПри зеркалировании происходит аномально медленно, поэтому официал обеспечивает внутреннее ускорение образа докера, нажмите меня, чтобы щелкнуть меня, после настройки вы должны не забыть перезапустить службу докера, иначе конфигурация не может быть загружена, команда перезапуска выглядит следующим образом:
-
$ systemctl restart docker
скопировать код
Установить докер-компоновку
$ curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
скопировать код
я ношу1.21.2версия, обычно та, которую вы установилиdockerи docker
-composeС последней версией проблем нет, проверьтеdocker
-composeВерсия
-
$ docker
-compose --
version
-
docker
-compose version 1.21
.2,
build a133471
скопировать код
Установить Сентри
Наконец дошел до решающего шага,Sentry, официальный предоставляет полный комплектdockerметод развертывания для запускаSentry.
-
Скачать проект
$ cd /opt/
$ git clone https://github.com/getsentry/onpremise.git sentry
$ cd sentry
скопировать код
-
Создайте базу данных и каталог конфигурации Sentry
$ mkdir -p data/{sentry,postgres}
скопировать код
-
добавить некоторые зависимости
$ vim requirements.txt
# Add plugins here
sentry-dingding~=0.0.1 # 钉钉通知插件
django-smtp-ssl~=1.0 # 发邮件支持SSL协议
скопировать код
-
Создайте образ Docker
$ docker-compose build
скопировать код
-
сгенерировать ключ
$ docker-compose run --rm web config generate-secret-key
......
# 最后一行会输出类似如下的秘钥串
kbjodp(id&b0^kbnxijn11&2e6xu&vy1(oini!-zl)pl610n&v
скопировать код
Добавьте указанный выше ключ вdocker-compose.ymlфайлSENTRY_SECRET_KEYв переменной окружения
-
$ vim docker
-compose.
yml
-
......
-
SENTRY_SECRET_KEY
: 'kbjodp(id&b0^kbnxijn11&2e6xu&vy1(oini!-zl)pl610n&v'
скопировать код
-
Создайте таблицы базы данных и создайте пользователя-администратора
$ docker-compose run --rm web upgrade
......
Would you like to create a user account now? [Y/n]: y # 创建用户
Email: ianshengme@gmail.com # 邮箱
Password: # 密码
Repeat for confirmation: # 确认密码
Should this user be a superuser? [y/N]: y # 为超级管理员用户
скопировать код
-
запустить службу
$ docker-compose up -d
скопировать код
в состоянии пройтиdocker-compose psПроверьте, какие контейнеры запущены
-
$ docker
-compose ps
-
Name
Command
State
Ports
-
------------------------------------------------------------------------------------
-
sentry_cron_1
/entrypoint.
sh run cron Up
9000
/tcp
-
sentry_memcached_1 docker
-entrypoint.
sh memcached Up
11211
/tcp
-
sentry_postgres_1 docker
-entrypoint.
sh postgres Up
5432
/tcp
-
sentry_redis_1 docker
-entrypoint.
sh redis ... Up
6379
/tcp
-
sentry_smtp_1 docker
-entrypoint.
sh tini ...
Up 25
/tcp
-
sentry_web_1
/entrypoint.
sh run web Up
0.0
.0.0:9000
->9000
/tcp
-
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 выглядит следующим образом:
$ python -V
Python 2.7.5
скопировать код
-
установить ворон
$ pip install raven --upgrade
скопировать код
-
добавить тестовый код
$ vim sentry_python_test.py
from raven import Client
client = Client('http://ce5502f746a4484f9b2c391a54d2d1c4:bca94f6b330a4dd183e68243b2a1b99c@sentry.ansheng.me:9000/2')
try:
1 / 0
except ZeroDivisionError:
client.captureException()
скопировать код
-
бегать
$ python sentry_python_test.py
Sentry is attempting to send 1 pending error messages
Waiting up to 10 seconds
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виртуальная среда
$ pyenv virtualenv 3.6.5 cash
скопировать код
-
переключить виртуальную среду
$ pyenv activate cash
скопировать код
-
установить джанго
$ pip install django
скопировать код
-
создать проект
$ cd /tmp
$ django-admin startproject cash
$ cd cash
$ python manage.py migrate
скопировать код
-
Стартовый проект
$ python manage.py runserver 0:9999
Performing system checks...
System check identified no issues (0 silenced).
July 17, 2018 - 03:35:05
Django version 2.0.7, using settings 'cash.settings'
Starting development server at http://0:9999/
Quit the server with CONTROL-C.
скопировать код
порт прослушивания в9999, к которому можно получить доступ через curl для тестирования
-
$ curl
-I http
://127.0
.0.1
:9999
-
HTTP
/1.1
200
OK
-
......
скопировать код
Если статус 200, это означает, что операция прошла успешно.
-
Посмотреть структуру каталогов
➜ cash tree ./
./
├── cash
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── views.py
│ └── wsgi.py
├── db.sqlite3
└── manage.py
скопировать код
-
Напишите простое представление
$ vim cash/views.py
from django.http import HttpResponse
def success(request):
return HttpResponse("OK")
def error(request):
1 / 0
return HttpResponse("Not OK")
скопировать код
-
добавить URL
$ vim cash/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('success', views.success, name='success'),
path('error', views.error, name='error'),
]
скопировать код
-
проверка доступа
Получите доступ к API, который может вернуть успех
$ curl http://127.0.0.1:9999/success
OK
скопировать код
Доступ к API, который сообщит об ошибке
$ curl -I http://127.0.0.1:9999/error
HTTP/1.1 500 Internal Server Error
......
скопировать код
сообщил500ошибка, вывод журнала выглядит следующим образом
-
Internal
Server
Error
:
/error
-
Traceback
(
most recent call last
):
-
File
"/Users/shengan/.pyenv/versions/cash/lib/python3.6/site-packages/django/core/handlers/exception.py"
, line
35,
in
inner
-
response
= get_response
(request
)
-
File
"/Users/shengan/.pyenv/versions/cash/lib/python3.6/site-packages/django/core/handlers/base.py"
, line
128,
in
_get_response
-
response
=
self.
process_exception_by_middleware(
e,
request)
-
File
"/Users/shengan/.pyenv/versions/cash/lib/python3.6/site-packages/django/core/handlers/base.py"
, line
126,
in
_get_response
-
response
= wrapped_callback
(request
,
*callback_args
,
**callback_kwargs
)
-
File
"/private/tmp/cash/cash/views.py",
line 8
,
in error
-
1
/
0
-
ZeroDivisionError
: division
by zero
-
[
17/
Jul/
2018
03:
50:
55]
"HEAD /error HTTP/1.1"
500
60675
скопировать код
Интегрировать Сентри
-
установить ворон
$ pip install raven --upgrade
скопировать код
-
существует
INSTALLED_APPSдобавить вraven .contrib .django .raven_compat
INSTALLED_APPS = (
......
'raven.contrib.django.raven_compat',
)
скопировать код
-
Добавить конфигурацию часового в настройках
import os
import raven
RAVEN_CONFIG = {
'dsn': 'http://9ad8168873a94fb1927e14111b9bca1e:29ea550781e24ca2ba0c0ee4829dfc96@sentry.ansheng.me:9000/3' # DSN输入我们刚才记录下来的DSN
}
скопировать код
-
После завершения настройки проведем следующий тест
Доступ к неправильному API
$ curl -I http://127.0.0.1:9999/error
скопировать код
-
список исключений
-
Сведения об исключении
Настроить уведомления по электронной почте
Я использую здесь почтовый ящик Netease, конкретная операция выглядит следующим образом
-
Измените файл config.yml, чтобы добавить
Mail ServerКонфигурация
$ vim config.yml
mail.backend: 'django_smtp_ssl.SSLEmailBackend' # Use dummy if you want to disable email entirely
mail.host: 'smtp.163.com'
mail.port: 465
mail.username: 'anshengme@163.com'
mail.password: '14RJg5vzGFWUNKiP' # 这里的密码,不是登录密码,是"客户端授权密码"
mail.use-tls: false
# The email address to send on behalf of
mail.from: 'anshengme@163.com'
скопировать код
-
восстановить образ
$ docker-compose build
$ docker-compose up -d
скопировать код
После перезапуска вы можетеAdmin==> 邮件Найдите конфигурацию почтового ящика ниже
Затем нажмите ниже向ianshengme@gmail.com发送一份测试邮件, а затем перейдите в свой почтовый ящик, чтобы узнать, получили ли вы электронное письмо
Я могу успешно получить отправленное тестовое письмо здесь Обычно ненормальное уведомление может быть получено после завершения настройки почтового ящика.
-
Подтвердите электронную почту пользователя
оказаться Settings=>Account=>Emails
затем нажмитеResendverification, вы получите письмо с подтверждением
НажмитеConfirmПодтвердите электронный адрес.
-
тест уведомления об исключении
Затем мы обращаемся к неправильному API
$ curl -I http://127.0.0.1:9999/error
HTTP/1.1 500 Internal Server Error
скопировать код
-
Просмотр сообщений о тревогах, полученных почтовым ящиком
По сути, сообщение об ошибке, которое вы получили, аналогично приведенному выше. Я не знаю, почему аватар не отображается, несмотря ни на что, если вы хотите просмотреть сведения об ошибке, нажмитеViewonSentryВы можете открыть сведения об исключении.
Настройка уведомлений DingTalk
Мы все знаем, что своевременность уведомлений по электронной почте слишком низкая, чтобы их можно было доставить немедленно, поэтому мы сосредоточимся на следующем:钉钉机器人групповое уведомление.
-
Создайте группу DingTalk, чтобы добавить собственного робота и получить его
access_token
я получил это здесьaccess_tokenДа 4dadfa77dfc3fe3b34e91237665afbef165e745dd93ec191c48bf4843b1ad63c
-
настроить
Найти все интеграции денежного проекта
затем найтиDingDingэтот плагин,启用插件, затем нажмитеConfigure
PluginНастроить плагин
Введите то, что вы только что получилиaccess_token, нажмитеSave
Changesсохранить изменения
-
Уведомление об исключении теста
Затем мы получаем доступ к следующему API исключений
$ curl -I http://127.0.0.1:9999/error
HTTP/1.1 500 Internal Server Error
......
скопировать код
На этом этапе ваш робот DingTalk должен отправить следующую ошибку
нажмите вышеhrefВы можете перейти на страницу сведений об ошибке, и на этом эта статья заканчивается.