Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Du Dev à la Prod... et ensuite ?

Du Dev à la Prod... et ensuite ?

On parle souvent de nos pipelines de CI/CD, des rythmes de mise en production… Mais on oublie que dans une démarche DevOps, les développeurs sont également responsables de la vie de leurs applications en production. Dans des architectures microservices de plus en plus distribuées, il devient primordial de connaître le comportement des applications que l’on envoie en production, en intégrant ces considérations dès la phase de développement.

Comment corréler des logs dans un environnement distribué ? Quels indicateurs collecter, comment les visualiser, quand alerter ? Comment tracer les requêtes à travers les différents services ?

Dans cette présentation, je vous parlerai de l’évolution de nos pratiques et outils pour améliorer l’observabilité de nos applications dans un environnement distribué. Nous parlerons de collecte de logs avec Elastic, de métriques avec Prometheus, ainsi que de tracing distribué avec Jaeger… tout ça du point de vue d’un développeur.

Julien Vey

June 14, 2021
Tweet

More Decks by Julien Vey

Other Decks in Programming

Transcript

  1. Complexité logicielle Développement Diversité de languages Diversité de frameworks Architecture

    Diversité de middlewares Nombre de microservices Profondeur d’appel
  2. Complexité logicielle Développement Diversité de languages Diversité de frameworks Architecture

    Diversité de middlewares Nombre de microservices Profondeur d’appel Infrastructure Diversité des Cloud providers Nombre de régions, zones
  3. Complexité logicielle Développement Diversité de languages Diversité de frameworks Architecture

    Diversité de middlewares Nombre de microservices Profondeur d’appel Infrastructure Diversité des Cloud providers Nombre de régions, zones Organisation Documentation, Turnover
  4. Quelqu’un vient vous voir et vous dit : « ça

    ne marche pas », que faites-vous ? Question d’entretien
  5. Quelqu’un vient vous voir et vous dit : « ça

    ne marche pas », que faites-vous ? Question d’entretien Je regarde les logs (4 réponses sur 5)
  6. Quelqu’un vient vous voir et vous dit : « ça

    ne marche pas », que faites-vous ? Question d’entretien Je regarde les logs (4 réponses sur 5) Qu’est-ce qui ne marche pas ?
  7. 1. Centraliser ses logs Serveur / Pod / Lambda Serveur

    / Pod / Lambda Serveur / Pod / Lambda Serveur / Pod / Lambda Serveur / Pod / Lambda Serveur / Pod / Lambda
  8. Différencier les types de logs 2. Enrichir les logs Logs

    d’accès Logs Middlewares Logs applicatifs
  9. Différencier les types de logs 2. Enrichir les logs Logs

    d’accès Logs Middlewares Logs applicatifs Utiliser les bons niveaux de logs Debug, Info, Warning, Error, Fatal
  10. Différencier les types de logs 2. Enrichir les logs Logs

    d’accès Logs Middlewares Logs applicatifs Utiliser les bons niveaux de logs Debug, Info, Warning, Error, Fatal Enrichir avec des métadonnées http.code, pod.name, user_agent.name
  11. A

  12. A x-correlation-id: headers['x-correlation-id'] || uuid.v4() log.info(headers['x-correlation-id'] + 'Running in service

    A') B x-correlation-id: … log.info(headers['x-correlation-id'] + 'Running in service B')
  13. A x-correlation-id: headers['x-correlation-id'] || uuid.v4() log.info(headers['x-correlation-id'] + 'Running in service

    A') B x-correlation-id: … log.info(headers['x-correlation-id'] + 'Running in service B') C x-correlation-id: …
  14. A x-correlation-id: headers['x-correlation-id'] || uuid.v4() log.info(headers['x-correlation-id'] + 'Running in service

    A') B x-correlation-id: … log.info(headers['x-correlation-id'] + 'Running in service B') log.info(headers['x-correlation-id'] + 'Running in service C’) C x-correlation-id: …
  15. L’observabilité par les logs + exhaustifs + comprendre le comportement

    d’une requête + comprendre le comportement d’un « individu » — comprendre les interactions entre composants — parfois difficile de faire le tri — très couteux (collecte, stockage…)
  16. # HELP http_requests_total The total number of HTTP requests .

    # TYPE http_requests_total counte r http_requests_total{method="post",code="200"} 102 7 http_requests_total{method="post",code="400"} 3 # HELP http_request_duration_seconds request duration histogra m # TYPE http_request_duration_seconds histogra m http_request_duration_seconds_bucket{le="0.5"} 0 http_request_duration_seconds_bucket{le="1"} 1 http_request_duration_seconds_bucket{le="2"} 2 http_request_duration_seconds_bucket{le="3"} 3 http_request_duration_seconds_bucket{le="5"} 3 http_request_duration_seconds_bucket{le="+Inf"} 3 http_request_duration_seconds_sum 6 http_request_duration_seconds_count 3 Métriques en format texte
  17. Officielles Golang, Java/Scala, Python, Ruby Communautaires Bash, C, C++, Common

    Lisp, Dart, Elixir, Erlang, Haskell, Lua, .Net, C#, Node.js, Perl, PHP, R, Rust Librairies clientes
  18. Quelles métriques ? Métriques Systèmes CPU, RAM, I/O, Network, Scaling

    Métriques Applicatives Nombre de requêtes, status code Métriques Business Nombre d’auditeurs actifs, Nombre de podcasts téléchargés Durée d’écoute
  19. Quelles métriques ? Métriques Systèmes CPU, RAM, I/O, Network, Scaling

    Métriques Applicatives Nombre de requêtes, status code Métriques Business Nombre d’auditeurs actifs, Nombre de podcasts téléchargés Durée d’écoute Valeur ajoutée - +
  20. Agrégations Prometheus Query Langage Opérations arithmétiques (addition, divisions, modulo, …)

    Comparaisons (égalité, greater or equal, …) Opérations logiques entre métriques (Intersection, union, …) Agrégations (sum, rate, min/max, quantiles, …)
  21. Alerting « Le nombre de requêtes en erreurs sur les

    5 dernières minutes est anormalement élevé » « Le nombre d’auditeurs simultanés sur la dernière heure est en dessous de 50% de la normale »
  22. Métriques & Alertes + dégager des tendances + corréler plusieurs

    métriques entre elles + possibilité de stockage très long terme (Thanos) — comprendre les interactions entre composants — différencier les causes des conséquences (fausses pistes)
  23. « Distributed Request Tracing is a way to trace requests

    across a distributed system boundaries. » Distributed Tracing
  24. Nécessite de modifier le code de toutes les applications pour

    intégrer la gestion du tracing Librairies clientes pour la plupart des langages Instrumentation du code
  25. Tracing + comprendre les interactions entre composants + investiguer des

    problèmes « de fond » — échantillonage — focus sur des requêtes individuelles