• 4 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 19/02/2020

Surveillez l'activité d'un serveur

Vous avez configuré avec succès Travis pour déployer en continu, beau travail ! Il reste une dernière étape : surveiller que tout se passe bien sur le serveur.

Supervisor relancera Gunicorn si ce dernier doit quitter automatiquement, mais ce n'est pas le seul danger qui guette votre projet ! Un bon SysAdmin regarde l'état de ses serveurs et optimise les requêtes.

Monitorer un serveur, à quoi ça sert ?

Surveiller l'activité d'un serveur ne revient pas simplement à regarder si les composants fonctionnent bien. Il est bon de suivre l'usage de la mémoire vive et de la bande passante pour anticiper les soucis.

Bien sûr, vous pouvez suivre cet usage en temps réel directement dans la console. Tapez top pour l'expérience, vous aurez l'impression d'entrer dans la matrice ! :)

Mais vous n'allez pas rester le nez rivé devant votre console pour surveiller que la mémoire n'est pas saturée. C'est pourquoi il est bon de faire confiance à un service tiers qui va surveiller votre serveur et vous avertir en cas d'incident. Digital Ocean intègre cette fonctionnalité par défaut mais New Relic Infrastructure est également très prisé.

Il existe également un second type d'activité que vous souhaiterez surveiller : votre application Django ! Nous n'avons pas beaucoup parlé de logs, et pourtant il s'agit d'un sujet essentiel ! Ils vous permettent de remonter le temps, de comprendre ce qui a pu se passer. Vous pouvez les utiliser pour indiquer des erreurs mais également un paiement, l'inscription d'un nouvel utilisateur ou une recherche effectuée. Comme pour l'activité de votre ordinateur, vous pouvez utiliser le client de log de Django ou utiliser un service tiers.

Dans la suite de ce chapitre je vous montrerai comment configurer Sentry, un SAAS en source ouverte qui vous permet d'afficher vos logs (et bien d'autres éléments !) d'une bien belle manière.

Mais commençons par nous intéresser au "hardware" !

Activer le monitoring de Digital Ocean

Installez l'agent de Digital Ocean sur votre serveur :

$ curl -sSL https://agent.digitalocean.com/install.sh | sh

Puis allez dans l'interface d'administration de Digital Ocean. Dans votre droplet vous avez déjà accès à bien des informations !

  • CPU, ou processeur en français, est le composant qui exécute les instructions des programmes. Ici vous pouvez visualiser le pourcentage de puissance utilisé.

  • Memory représente la mémoire vive utilisée.

  • Disk I/O  (disk input/output) est la quantité de données lues ou écrites sur le disque dur du serveur par seconde.

  • Disk usage est la quantité de données stockées dans le disque dur du droplet.

  • Bandwidth (bande passante) représente la quantité de données transférée entre le droplet et des ressources externes.

  • Top processes affiche les processus les plus exigeants en terme de mémoire vive (Memory) et de processeur (CPU).

Dans ces graphiques, plus la ligne est proche de 100% plus cela vous indique que vous devriez envisager le plan supérieur.

Le principe du monitoring n'est pas de regarder les données pendant des heures mais plutôt de configurer des alertes pour recevoir les informations adéquates.

Cliquez sur "Monitoring" puis sur "Create alert policy". Comme vous pouvez le constater, vous avez le choix !

En général, nous surveillons les éléments suivants :

  • le CPU et la RAM ne sont pas trop utilisés ;

  • la bande passante actuelle est suffisante ;

  • le nombre de requêtes n'excède pas la capacité du serveur.

Configurer Sentry

Sentry est un tableau de bord qui vous permet de visualiser ce qui se passe dans l'application Django !

Il va bien au-delà des logs, vous fournissant des détails concernant le navigateur de l'utilisateur, l'URL... Et vous pouvez même le relier à GitHub pour suivre l'avancée des issues ! C'est beau, tout simplement.

Créez-vous un compte.

Puis suivez les instructions qui s'affichent à l'écran !

Commencez par choisir Django et créez un nouveau projet. Ensuite, revenez dans la console et installez la librairie Raven.

$ pip install raven

Enfin, mettez à jour le fichier de configuration de production :

settings/production.py

import raven

INSTALLED_APPS += [
    'raven.contrib.django.raven_compat',
]


RAVEN_CONFIG = {
    'dsn': 'https://somethingverylong@sentry.io/216272', # caution replace by your own!!
    # If you are using git, you can also automatically configure the
    # release based on the git info.
    'release': raven.fetch_git_sha(os.path.dirname(os.pardir)),
}

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'root': {
        'level': 'INFO', # WARNING by default. Change this to capture more than warnings.
        'handlers': ['sentry'],
    },
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s '
                      '%(process)d %(thread)d %(message)s'
        },
    },
    'handlers': {
        'sentry': {
            'level': 'INFO', # To capture more than ERROR, change to WARNING, INFO, etc.
            'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
            'tags': {'custom-tag': 'x'},
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'ERROR',
            'handlers': ['console'],
            'propagate': False,
        },
        'raven': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
        'sentry.errors': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
    },
}

Voyons si ça fonctionne !

Nous allons volontairement ajouter une erreur dans notre code :

store/views.py

def index(request):
    MAIS POURQUOI EST-IL SI MECHANT ?
    # ...

Sauvez et relancez le serveur via Supervisor :

$ sudo supervisorctl restart disquaire-gunicorn

Allez sur la page qui liste les albums (/store), puis regardez dans Sentry si un bug a fait son apparition.

Hé oui !

Allez un peu plus loin et ajoutez le premier log de l'application. Nous allons envoyer un événement à Sentry lorsqu'une personne effectue une recherche.

views.py

import logging

# ...
# Get an instance of a logger
logger = logging.getLogger(__name__)

# ...

def search(request):
    #
    logger.info('New search', exc_info=True, extra={
        # Optionally pass a request and we'll grab any information we can
        'request': request,
    })
    return render(request, 'store/search.html', context)

Sauvez et relancez le serveur via Supervisor de nouveau :

$ sudo supervisorctl restart disquaire-gunicorn

Enfin, faites une recherche sur l'application en utilisant le formulaire de recherche. Vous constaterez qu'un nouvel événement "New search" vient de s'afficher dans le tableau de bord de Sentry !

Exemple de certificat de réussite
Exemple de certificat de réussite