Annexes, new chapters and typo fixes
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Fred Pauchet 2022-06-01 22:16:48 +02:00
parent 31b8c1dc7d
commit e1c7f7ce46
10 changed files with 133 additions and 43 deletions

63
annexes/grafana.tex Normal file
View File

@ -0,0 +1,63 @@
\chapter{Monitoring Stack}
\section{Visualisation}
\begin{quote}
Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored.
Create, explore, and share beautiful dashboards with your team and foster a data driven culture.
\end{quote}
\section{Métriques}
\begin{quote}
Graphite is an enterprise-ready monitoring tool that runs equally well on cheap hardware or Cloud infrastructure.
Teams use Graphite to track the performance of their websites, applications, business services, and networked servers.
It marked the start of a new generation of monitoring tools, making it easier than ever to store, retrieve, share, and visualize time-series data.
Graphite was originally designed and written by Chris Davis at Orbitz in 2006 as side project that ultimately grew to be their foundational monitoring tool.
In 2008, Orbitz allowed Graphite to be released under the open source Apache 2.0 license.
Numerous large companies have deployed Graphite to production where it helps them to monitor their production e-commerce services and plan for growth.
\end{quote}
Graphite does two things:
\begin{enumerate}
\item
Store numeric time-series data
\item
Render graphs of this data on demand
\end{enumerate}
What Graphite does not do is collect data for you, however there are some tools out there that know how to send data to graphite. Even though it often requires a little code, sending data to Graphite is very simple.
Graphite consists of 3 software components:
\begin{enumerate}
\item
\textbf{carbon} - a Twisted daemon that listens for time-series data
\item
\textbf{whisper} - a simple database library for storing time-series data (similar in design to RRD)
\item
\textbf{graphite webapp} - A Django webapp that renders graphs on-demand using Cairo
\end{enumerate}
Feeding in your data is pretty easy, typically most of the effort is in collecting the data to begin with. As you send datapoints to Carbon, they become immediately available for graphing in the webapp. The webapp offers several ways to create and display graphs including a simple URL API for rendering that makes it easy to embed graphs in other webpages.
\section{Logs}
\begin{quote}
Loki brings together logs from all your applications and infrastructure in a single place.
By using the exact same service discovery and label model as Prometheus, Grafana Logs can systematically guarantee your logs have consistent metadata with your metrics, making it easy to move from one to the other.
\end{quote}
Loki est l'équivalent (développé directement par Grafana) de Prometheus.
Il sera donc toujours nécessaire d'accumuler des logs au travers d'exporters.
\section{Traces}
Unlike other tracing tools, Grafana Traces does not index the traces which makes it possible to store orders of magnitude more trace data for the same cost, and removes the need for sampling.
Stores orders of magnitude more trace data for the same cost, and removes the need for sampling.
Reduces the TCO by an order of magnitude and makes the system overall much easier to use.
Grafana Traces is available as a containerized application, and you can run it on any orchestration engine like Kubernetes, Mesos, etc. The various services can be horizontally scaled depending on the workload on the ingest/query path. You can also use cloud native object storage, such as Google Cloud Storage, Amazon S3, or Azure Blob Storage.

2
annexes/sonar.tex Normal file
View File

@ -0,0 +1,2 @@
\appendix{SonarQube}

View File

@ -0,0 +1,6 @@
\chapter{Intégration continue}
https://circleci.com/pricing/
github actions

View File

@ -560,27 +560,3 @@ Comptez une heure ou deux lorsque vous aurez pris l'habitude.
\section{Ansible}
On peut aussi passer par fabric, ansible, chef ou puppet.
\section{Docker-Compose}
(c/c Ced' - 2020-01-24)
Ça y est, j'ai fait un test sur mon portable avec docker et cookiecutter pour django.
D'abords, après avoir installer docker-compose et les dépendances sous debian, tu dois t'ajouter dans le groupe docker, sinon il faut être root pour utiliser docker. Ensuite, j'ai relancé mon pc car juste relancé un shell n'a pas suffit pour que je puisse utiliser docker avec mon compte.
Bon après c'est facile, un petit virtualenv pour cookiecutter, suivi d'une installation du template django.
Et puis j'ai suivi \url{https://cookiecutter-django.readthedocs.io/en/latest/developing-locally-docker.html}
Alors, il télécharge les images, fait un petit update, installe les dépendances de dev, install les requirement pip \ldots
Du coup, ça prend vite de la place: image.png
L'image de base python passe de 179 à 740 MB. Et là j'en ai pour presque 1,5 GB d'un coup.
Mais par contre, j'ai un python 3.7 direct et postgres 10 sans rien faire ou presque.
La partie ci-dessous a été reprise telle quelle de \href{https://cookiecutter-django.readthedocs.io/en/latest/deployment-with-docker.html}{la
documentation de cookie-cutter-django}.
le serveur de déploiement ne doit avoir qu'un accès en lecture au dépôt source.

View File

@ -0,0 +1,23 @@
\chapter{Docker-Compose}
(c/c Ced' - 2020-01-24)
Ça y est, j'ai fait un test sur mon portable avec docker et cookiecutter pour django.
D'abords, après avoir installer docker-compose et les dépendances sous debian, tu dois t'ajouter dans le groupe docker, sinon il faut être root pour utiliser docker. Ensuite, j'ai relancé mon pc car juste relancé un shell n'a pas suffit pour que je puisse utiliser docker avec mon compte.
Bon après c'est facile, un petit virtualenv pour cookiecutter, suivi d'une installation du template django.
Et puis j'ai suivi \url{https://cookiecutter-django.readthedocs.io/en/latest/developing-locally-docker.html}
Alors, il télécharge les images, fait un petit update, installe les dépendances de dev, install les requirement pip \ldots
Du coup, ça prend vite de la place: image.png
L'image de base python passe de 179 à 740 MB. Et là j'en ai pour presque 1,5 GB d'un coup.
Mais par contre, j'ai un python 3.7 direct et postgres 10 sans rien faire ou presque.
La partie ci-dessous a été reprise telle quelle de \href{https://cookiecutter-django.readthedocs.io/en/latest/deployment-with-docker.html}{la
documentation de cookie-cutter-django}.
le serveur de déploiement ne doit avoir qu'un accès en lecture au dépôt source.

View File

@ -47,10 +47,12 @@ Une application \textit{data-intensive} est généralement composée des blocs f
\subsection{Bases de données}
\subsection{Tâches asynchrones}
\subsection{Mise en cache}
\subsection{Moteurs d'indexation}
\subsection{Tâches asynchrones}
\section{Composants périphériques}
Les composants périphériques gravitent autour du fonctionnement normal de l'application.
@ -58,7 +60,7 @@ Ce sont les "petites mains" qui aident à ce que l'application soit résiliente
Il s'agit des composants comme le proxy inverse ou les distributeurs de charge: ce sont des composants qui sont fortement recommandés, mais pas obligatoires à au bon fonctionnement de l'application.
\begin{quote}
Focusing on resilience often means that a firm can handle events that may cause crises for most organizations in a manner that is routine and mundane.
"Focusing on resilience often means that a firm can handle events that may cause crises for most organizations in a manner that is routine and mundane.
Specific architectural patterns that they implemented included fail fasts (settings aggressive timeouts such that failing components don't make the entire system crawl to a halt), fallbacks (designing each feature to degrade or fall back to a lower quality representation), and feature removal (removing non-critical features when they run slowly from any given page to prevent them from impacting the member experience).
Another astonishing example of the resilience that the netflix team created beyond preserving business continuity during the AWS outage, was that they went over six hours into the AWS outage before declaring a Sev 1 incident, assuming that AWS service would eventually be restored (i.e., "AWS will come back\ldots it usually does, right ?").
Only after six hours into the outage did they activate any business continuity procedures. \cite[p. 282]{devops_handbook}
@ -80,10 +82,6 @@ C'est donc une bonne idée de faire en sorte que des erreurs d'indisponibilité
\hline
Serveurs d'application & & Gunicorn, Uvicorn \\
\hline
Healthcheck & & Supervisord \\
\hline
Télémétrie & & \\
\hline
\end{tabular}
Si nous schématisons l'infrastructure et le chemin parcouru par une requête, nous pourrions arriver à la synthèse suivante :
@ -158,6 +156,8 @@ Au niveau logiciel (la partie mise en subrillance ci-dessus), la requête arrive
\hline
Notifications & & Zabbix, Nagios, Munin \\
\hline
Télémétrie & & \\
\hline
\end{tabular}
\subsection{Supervision des processus}
@ -165,7 +165,7 @@ Au niveau logiciel (la partie mise en subrillance ci-dessus), la requête arrive
https://circus.readthedocs.io/en/latest/, https://uwsgi-docs.readthedocs.io/en/latest/, statsd
\subsection{Journaux}
\subsection{Journaux d'évènements}
La présence de journaux, leur structure et de la définition précise de leurs niveaux est essentielle; ce sont eux qui permettent d'obtenir des informations quant au statut de l'application:
@ -198,8 +198,6 @@ Chaque évènement est associé à un niveau; celui-ci indique sa criticité et
\textbf{FATAL} (ou \textbf{EXCEPTION}): \ldots généralement suivie d'une terminaison du programme - Bind raté d'un socket, etc.
\end{itemize}
\subsection{Flux d'évènements}
La configuration des \emph{loggers} est relativement simple, un peu plus complexe si nous nous penchons dessus, et franchement complète si nous creusons encore.
Il est ainsi possible de définir des formattages, différents gestionnaires (\emph{handlers}) et loggers distincts, en fonction de nos applications.
@ -231,7 +229,7 @@ Pour utiliser nos loggers, il suffit de copier le petit bout de code suivant:
\href{https://docs.djangoproject.com/en/stable/topics/logging/\#examples}{Par
exemples}.
\subsection{Exploitation des journaux, télémétrie}
\subsection{Télémétrie et exploitation des journaux}
Des erreurs sur un environnement de production arriveront, tôt ou tard, et seront sans doute plus compliquée à corriger qu'un morceau de code dans un coin du code.
L'exploitation des journaux permettra de comprendre, analyser, voire corriger, certains incidents.

View File

@ -11,7 +11,16 @@ Que l'utilisateur soit humain, bot automatique ou client Web, la finalité d'un
\begin{itemize}
\item
La résilience consiste à ce que l'application continue à fonctionner \textit{correctement} - c'est-à-dire à ce qu'elle fournisse un service correct au niveau de performance désiré, même quand les choses passent mal.
Cela signifie que ces systèmes ont la capacité d'anticiper certains types d'erreurs, ou en tout cas, de les gérer de manière propre.
Cela signifie que ces systèmes ont la capacité:
\begin{enumerate}
\item
D'anticiper certains types d'erreurs (ou en tout cas, de les gérer de manière propre), par exemple en proposition une solution de repli (\textit{fallback}) \footnote{Lors d'un incident AWS, Netlix proposait des recommandations statiques et ne se basait plus sur des recommandations personnalisées. Ceci leur a permis de tenir six heures avant de décréter être impacté. \cite{devops_handbook}}
\item
De se rendre rapidement indisponibles les composants qui posent problème, de manière à ce que ceux-ci n'entraînent pas tout le système avec eux (\textit{fail fast})
\item
De retirer certaines fonctionnalités non-critiques lorsqu'elles répondent plus lentement ou lorsqu'elles présentent un impact sur le reste de l'application (\textit{feature removal}).
\end{enumerate}
\item
La mise à échelle consiste à autoriser le système à \textit{grandir} - soit par le trafic pouvant être pris en charge, soit par son volume de données, soit par sa complexité.
\item

View File

@ -246,7 +246,11 @@ L'exemple donné dans les guides de style de Google est celui-ci:
\begin{listing}[!ht]
\begin{minted}{python}
def fetch_smalltable_rows(table_handle: smalltable.Table, keys: Sequence[Union[bytes, str]], require_all_keys: bool = False,) -> Mapping[bytes, Tuple[str]]:
def fetch_smalltable_rows(
table_handle: smalltable.Table,
keys: Sequence[Union[bytes, str]],
require_all_keys: bool = False,
) -> Mapping[bytes, Tuple[str]]:
"""Fetches rows from a Smalltable.
Retrieves rows pertaining to the given keys from the Table instance
@ -264,9 +268,11 @@ L'exemple donné dans les guides de style de Google est celui-ci:
fetched. Each row is represented as a tuple of strings. For
example:
{b'Serak': ('Rigel VII', 'Preparer'),
b'Zim': ('Irk', 'Invader'),
b'Lrrr': ('Omicron Persei 8', 'Emperor')}
{
b'Serak': ('Rigel VII', 'Preparer'),
b'Zim': ('Irk', 'Invader'),
b'Lrrr': ('Omicron Persei 8', 'Emperor')
}
Returned keys are always bytes. If a key from the keys argument is
missing from the dictionary, then that row was not found in the

View File

@ -224,6 +224,10 @@ Les tests dacceptance vérifient que lapplication fonctionne comme convenu
\subsection{Tests d'intégration}
Les tests dintégration vérifient que lapplication coopère correctement avec les systèmes
périphériques
Les tests dintégration vérifient que lapplication coopère correctement avec les systèmes périphériques.
\subsection{Tests de charge}
Je me demande si cela ne devrait pas se trouver au niveau des tests d'intégration ?
https://k6.io/open-source

View File

@ -48,11 +48,13 @@
\include{chapters/working-in-isolation.tex}
\include{chapters/python.tex}
\include{chapters/new-project.tex}
\include{chapters/continuous-integration.tex}
\include{parts/deployment.tex}
\include{chapters/infrastructure.tex}
\include{chapters/debian.tex}
\include{chapters/docker-compose.tex}
\include{chapters/heroku.tex}
\include{chapters/kubernetes.tex}
\include{chapters/deployment-tools.tex}
@ -95,7 +97,8 @@
\part{Annexes}
\chapter{Grafana}
\include{annexes/grafana.tex}
\include{annexes/sonar.tex}
\chapter{Fly.io}