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
Вы можете перейти на страницу сведений об ошибке, и на этом эта статья заканчивается.