Skip to content

Surveillance, journaux et alertes

Guide d'apprentissage : ce chapitre ne nécessite aucune compétence en programmation. Des démonstrations interactives vous feront découvrir l'ensemble du corpus de connaissances en exploitation. De la surveillance des alertes à la résolution d'incidents, de la planification de capacité à l'exploitation automatisée, vous maîtriserez toutes les compétences nécessaires à l'exploitation de systèmes en production.

0. Introduction : la mise en production n'est que le début

Beaucoup de débutants pensent : « Le code est déployé en production, la mission est accomplie. »

Grave erreur !

La mise en production n'est que le point de départ de l'exploitation. Comme pour une voiture neuve, l'entretien, les réparations et le ravitaillement constituent la routine.

Les objectifs de l'exploitation sont au nombre de trois :

  1. Stabilité (Stability) : le système ne doit pas tomber en panne, les services doivent rester disponibles
  2. Performance (Performance) : temps de réponse rapide, bonne expérience utilisateur
  3. Sécurité (Security) : les données ne doivent pas fuir, se protéger contre les attaques

1. Système de surveillance (Monitoring)

La surveillance est le « regard » de l'exploitation. Un système sans surveillance, c'est comme un conducteur aveugle : en cas de problème, on ne le sait même pas.

1.1 Les trois niveaux de surveillance

实时监控面板 (Monitoring Dashboard)
运维的"眼睛" - 让系统状态一目了然
CPU 使用率45%
正常
内存使用率62%
正常
磁盘使用率78%
警告
网络带宽34%
正常
磁盘 I/O55%
正常
负载均衡42%
正常
正常 (Normal)
警告 (Warning)
严重 (Critical)

Surveillance de l'infrastructure : les ressources matérielles des serveurs

  • Utilisation CPU
  • Utilisation mémoire
  • Espace disque et E/S
  • Bande passante réseau

Surveillance applicative : l'état de fonctionnement des logiciels

  • QPS (requêtes par seconde)
  • Temps de réponse (latence)
  • Taux d'erreur
  • Appels aux services dépendants

Surveillance métier : la santé de l'activité

  • DAU/MAU (utilisateurs actifs quotidiens/mensuels)
  • Volume de commandes
  • Taux de succès des paiements
  • Taux de rétention des utilisateurs

1.2 Stack d'outils de surveillance

OutilUsageCaractéristiques
PrometheusCollecte et stockage de métriquesBase de données temporelle, adaptée aux données de surveillance
GrafanaTableau de bord de visualisationGraphiques et dashboards puissants
ZabbixSurveillance complèteOutil historique, fonctionnalités exhaustives
DatadogPlateforme de surveillance SaaSSolution tout-en-un, payante

Point clé : la surveillance doit être multicouche, couvrant tous les aspects de l'infrastructure à l'activité, pour éviter les « angles morts ».


2. Système d'alertes (Alerting)

Une fois que la surveillance a détecté un problème, il faut en informer rapidement l'équipe d'exploitation — c'est le rôle des alertes.

2.1 Flux d'alertes

告警流程 (Alerting Flow)
从发现异常到通知运维的自动化流程
1
监控采集
Prometheus 每隔 15s 采集一次指标
2
规则评估
Alertmanager 评估是否满足告警条件
3
告警分组
相似告警合并,避免轰炸
4
静默判断
检查是否在静默时间(如维护窗口)
5
路由分发
根据标签分发到不同接收器
6
发送通知
通过钉钉/邮件/短信通知值班人员
告警级别说明
P0最高优先级,立即处理(如核心服务宕机)
P1高优先级,30分钟内处理(如部分功能异常)
P2中优先级,当天处理(如性能下降)
P3低优先级,本周处理(如资源使用率偏高)

2.2 Conception des niveaux d'alerte

Une graduation raisonnable des alertes permet d'éviter la « fatigue d'alertes » :

NiveauTemps de réponseScénario typiqueCanal de notification
P0Immédiat (sous 5 minutes)Service principal en panne, échec de paiementTéléphone + SMS + DingTalk
P1Sous 30 minutesDysfonctionnement partiel, baisse sévère de performanceSMS + DingTalk + Email
P2Traitement dans la journéeTaux d'utilisation des ressources élevé, erreurs sporadiquesDingTalk + Email
P3Traitement dans la semaineProblèmes non critiques, suggestions d'optimisationEmail

2.3 Consolidation et réduction du bruit des alertes

Problème récurrent : un seul incident peut déclencher des centaines, voire des milliers d'alertes, conduisant à l'insensibilité de l'équipe de garde.

Solutions :

  1. Regroupement des alertes : fusionner les alertes similaires (par ex. consolider plusieurs problèmes d'un même serveur en une seule alerte)
  2. Suppression des alertes : si le problème parent est déjà signalé, ne pas alerter pour les sous-problèmes
  3. Règles de mise en sourdine : suspendre automatiquement les alertes pendant les fenêtres de maintenance
  4. Limitation de fréquence : ne pas notifier à plusieurs reprises la même alerte dans un court intervalle

Point clé : les alertes doivent être « peu nombreuses mais pertinentes », chacune doit mériter un traitement.


3. Gestion des journaux (Logging)

Les journaux sont la « boîte noire » du dépannage.

3.1 Niveaux de journalisation

javascript
console.debug('Informations de débogage détaillées') // Utilisé en développement
console.info('Informations générales') // Enregistrement du flux normal
console.warn('Message d\'avertissement') // Problème potentiel
console.error('Message d\'erreur') // Erreurs nécessitant une attention

3.2 Journaux structurés

Journaux traditionnels (mauvaise pratique) :

2024-01-15 10:23:45 ERROR User john failed to login, attempts=3, ip=192.168.1.100

Journaux structurés (recommandé) :

json
{
  "timestamp": "2024-01-15T10:23:45Z",
  "level": "ERROR",
  "message": "User login failed",
  "user": "john",
  "attempts": 3,
  "ip": "192.168.1.100",
  "service": "auth-service"
}

3.3 Stack de journaux ELK

ELK = Elasticsearch + Logstash + Kibana

  • Logstash : collecte et filtrage des journaux
  • Elasticsearch : stockage et recherche des journaux
  • Kibana : visualisation et interrogation des journaux

Bonnes pratiques :

  • Les informations sensibles (mots de passe, tokens) ne doivent pas figurer dans les journaux
  • Les opérations critiques (connexion, paiement, modification de permissions) doivent être journalisées
  • Les journaux doivent inclure le contexte (ID utilisateur, ID de requête, horodatage)
  • Nettoyer régulièrement les journaux obsolètes pour éviter la saturation des disques

4. Traçage distribué (Tracing)

Dans une architecture de microservices, une requête peut traverser une dizaine de services. Comment tracer son chemin complet ?

Trace ID et Span ID

  • Trace ID : l'identifiant unique de la chaîne complète d'une requête (comme un numéro de suivi de colis)
  • Span ID : l'identifiant d'un appel de service individuel (comme chaque relais)

4.1 Démonstration de traçage distribué

分布式链路追踪 (Distributed Tracing)
一个请求在微服务间流转的完整路径
Trace ID:a1b2c3d4-e5f6-7890-abcd-ef1234567890
总耗时:450ms
调用服务数:6
0ms
45ms
90ms
135ms
180ms
225ms
270ms
315ms
360ms
405ms
450ms
API Gateway
POST /api/order/create
450ms
User Service
验证用户身份
45ms
Product Service
查询商品信息
85ms
Inventory Service
扣减库存
120ms
Payment Service
创建支付订单
95ms
Order Service
保存订单记录
25ms
正常 (≤200ms)
慢调用 (>200ms)
错误
💡 观察要点
  • 点击"性能瓶颈"查看数据库查询慢导致的延迟
  • 点击"错误追踪"查看库存服务异常如何影响整个链路
  • 每个 Span 都有唯一的 Span ID,通过 Trace ID 关联
  • 时间条越长,表示该服务耗时越长

4.2 Standard OpenTelemetry

OpenTelemetry (OTel) est le standard industriel du traçage distribué, fournissant des API et SDK unifiés.

javascript
// Exemple : utiliser OpenTelemetry pour enregistrer un Span
import { trace } from '@opentelemetry/api'

const tracer = trace.getTracer('my-service')

async function processOrder(orderId) {
  // Créer un Span
  const span = tracer.startSpan('processOrder')

  try {
    // Définir des attributs
    span.setAttribute('order.id', orderId)

    // Logique métier...
    await validateOrder(orderId)
    await saveToDatabase(orderId)

    span.setStatus({ code: SpanStatusCode.OK })
  } catch (error) {
    span.recordException(error)
    span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })
  } finally {
    span.end() // Terminer le Span
  }
}

Point clé : le traçage distribué permet de localiser rapidement les goulots d'étranglement et les points de défaillance. C'est un outil incontournable en environnement microservices.


5. Processus de résolution d'incidents

Les incidents en production sont inévitables. L'essentiel est de répondre rapidement et restaurer rapidement.

5.1 Processus de traitement des incidents

故障响应流程 (Incident Response)
专业团队如何处理线上故障
1
故障发现
T+0 分钟
监控系统自动发现异常指标
关键动作:
  • 监控检测到订单服务错误率从 0.1% 飙升到 8.5%
  • Alertmanager 立即触发 P1 告警
  • 值班人员收到钉钉和短信通知
常用工具:
PrometheusGrafanaAlertmanager
2
快速响应
T+3 分钟
值班人员确认故障并启动应急流程
3
故障定位
T+8 分钟
通过日志和追踪系统分析根因
4
故障修复
T+18 分钟
实施临时解决方案恢复服务
5
恢复验证
T+21 分钟
确认服务完全恢复正常
6
故障复盘
T+48 小时
总结经验教训,制定改进计划
🎯 故障处理最佳实践
快速响应
建立 15 分钟响应机制,P0 故障立即电话通知
📢
信息同步
定期向用户和内部同步故障进展,避免猜测
🔍
保留现场
故障现场数据(日志、监控)完整留存,便于分析
📝
blameless 文化
复盘对事不对人,聚焦流程改进而非个人责任

5.2 Outils de dépannage courants

OutilUsageScénario typique
tcpdumpCapture et analyse de paquetsProblèmes réseau, perte de paquets
straceTraçage des appels systèmeProcessus bloqué, problèmes de permissions de fichiers
ArthasDiagnostic JavaPic CPU, fuite mémoire, interblocage
top/htopSurveillance des ressources systèmeForte occupation CPU/mémoire
netstatConsultation des connexions réseauPort occupé, nombre de connexions anormal
lsofConsultation des fichiers ouvertsFichier occupé, disque saturé

Exemple avec Arthas (outil de diagnostic Java open source par Alibaba) :

bash
# Voir les 5 threads consommant le plus de CPU
$ top -H -p 12345

# Voir le temps d'exécution d'une méthode
$ trace com.example.OrderService createOrder

# Voir les champs statiques d'une classe
$ getstatic com.example.Config MAX_CONNECTIONS

# Mise à jour à chaud du code (sans redémarrage)
$ mc /tmp/Test.java
$ redefine /tmp/Test.class

5.3 Rétrospective post-incident (Post-mortem)

Une rétrospective n'est pas une session de recherche de coupables !

Les objectifs de la rétrospective sont :

  1. Reconstituer la chronologie de l'incident
  2. Identifier la cause racine (Root Cause Analysis)
  3. Tirer des leçons
  4. Élaborer des mesures d'amélioration

Méthode des 5 Pourquoi :

Poser la question « pourquoi » au moins 5 fois pour atteindre la cause racine :

  • Pourquoi le service est-il tombé ?
    • Parce qu'il y a eu un dépassement mémoire (OOM)
  • Pourquoi un dépassement mémoire ?
    • Parce que les données en cache étaient trop volumineuses
  • Pourquoi les données en cache étaient-elles trop volumineuses ?
    • Parce qu'aucune durée d'expiration n'était configurée
  • Pourquoi aucune durée d'expiration n'était configurée ?
    • Parce qu'elle a été oubliée lors du développement
  • Cause racine : absence de revue de code et de cas de test

Point clé : instaurer une culture blameless, se concentrer sur l'amélioration des processus plutôt que sur la responsabilité individuelle.


6. Optimisation des performances

6.1 Analyse des goulots d'étranglement

Approche d'optimisation descendante :

Perception utilisateur

Optimisation frontend (réduire les requêtes, CDN, chargement différé)

Optimisation réseau (HTTP/2, compression, connexions persistantes)

Optimisation backend (cache, asynchrone, traitement par lots)

Optimisation de la base de données (index, optimisation des requêtes, sharding)

Optimisation système (paramètres noyau, réglage JVM)

6.2 Optimisation de la base de données

Optimisation des index :

sql
-- Requête lente (sans index)
SELECT * FROM orders WHERE user_id = 12345;

-- 100 fois plus rapide après création de l'index
CREATE INDEX idx_user_id ON orders(user_id);

Optimisation des requêtes :

sql
-- À éviter : SELECT *
SELECT * FROM users WHERE id = 123;

-- Recommandé : ne sélectionner que les colonnes nécessaires
SELECT id, name, email FROM users WHERE id = 123;

-- À éviter : trop de valeurs dans IN
SELECT * FROM orders WHERE user_id IN (1, 2, 3, ..., 10000);

-- Recommandé : utiliser JOIN ou des requêtes par lots
SELECT * FROM orders o JOIN user_ids u ON o.user_id = u.id;

6.3 Optimisation du cache

Architecture de cache multi-niveaux :

Cache du navigateur (CDN)

Cache local (mémoire/Guava)

Cache distribué (Redis/Memcached)

Base de données (MySQL/PostgreSQL)

Stratégies de mise à jour du cache :

StratégieAvantagesInconvénientsCas d'utilisation
Cache-AsideSimple, fiablePremière requête lenteBeaucoup de lectures, peu d'écritures
Write-ThroughBonne cohérence des donnéesÉcriture lenteÉquilibre lecture/écriture
Write-BehindÉcriture extrêmement rapideRisque de perte de donnéesBeaucoup d'écritures, peu de lectures, tolérance à une incohérence temporaire

Point clé : le cache n'est pas une solution miracle. Il faut prendre en compte la cohérence, l'avalanche, la pénétration et autres problèmes (cf. chapitre « Conception du cache système »).


7. Planification de capacité

7.1 Évaluation de la capacité

容量规划计算器 (Capacity Planning)
估算系统需要多少台服务器才能满足需求
📊 业务指标
%
次/秒
💡 通常高峰期流量是平均流量的 2-3 倍,建议预留 50-100% 冗余应对突发流量
📈 容量评估结果
日均总请求量
5,000,000 次/天
高峰期 QPS (目标)
75 次/秒
理论所需服务器
1 台
推荐配置 (含冗余)
2 台
💰 月成本估算 (云服务器)
阿里云 (4核8G)
¥600/月
腾讯云 (4核8G)
¥560/月
AWS (t3.xlarge)
¥1,000/月
🎯 容量规划要点
1️⃣
以峰值为核心
不能按平均流量规划,必须按高峰期流量(通常是平均的 2-3 倍)来准备
2️⃣
预留冗余空间
至少预留 50% 冗余,用于应对突发流量、服务器故障、维护窗口
3️⃣
定期压测验证
每季度进行压力测试,验证实际容量是否满足预估
4️⃣
弹性扩缩容
结合云服务的自动扩缩容,在高峰期自动增加实例
📐 计算公式
日均请求量:DAU × 人均请求次数
平均 QPS:日均请求量 ÷ 86400 秒
高峰 QPS:平均 QPS × 高峰系数 (2-3 倍)
所需服务器:高峰 QPS × 冗余系数 ÷ 单机 QPS

7.2 Tests de charge

Choix des outils :

OutilCaractéristiquesCas d'utilisation
JMeterPuissant, interface graphiqueTests de charge sur API HTTP
wrk/abLéger, en ligne de commandeTests de référence rapides
LocustScripts Python, distribuéScénarios de test de charge complexes
K6Moderne, scripts JSIntégration CI/CD

Exemple avec wrk :

bash
# Installer wrk
$ brew install wrk  # macOS
$ apt install wrk   # Ubuntu

# Test de charge sur une API HTTP (10 threads, 30 secondes)
$ wrk -t10 -c100 -d30s http://example.com/api/users

# Sortie :
# Running 30s test @ http://example.com/api/users
#   10 threads and 100 connections
#   Thread Stats   Avg      Stdev     Max   +/- Stdev
#     Latency    45.32ms   12.45ms 120.50ms   87.56%
#     Req/Sec     2.12k   123.45    3.45k    89.01%
#   632450 requests in 30.00s, 1.23GB read
# Requests/sec:  21081.67

7.3 Mise à l'échelle élastique

Mise à l'échelle automatique à l'ère cloud-native :

yaml
# Kubernetes HPA (Horizontal Pod Autoscaler)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

Lorsque l'utilisation CPU dépasse 70 %, les Pods sont automatiquement mis à l'échelle (maximum 10)

Point clé : anticiper la montée en charge en fonction des prévisions d'activité (par ex. le Double 11) pour ne pas être pris au dépourvu.


8. Exploitation sécurisée

8.1 Contrôle d'accès

Principe du moindre privilège :

  • Les développeurs ne peuvent accéder qu'à l'environnement de développement
  • Les exploitants ne peuvent accéder à la production qu'avec une approbation
  • Les opérations sensibles sur la base de données nécessitent une double confirmation

Bastion (Jump Server) :

Toutes les opérations d'exploitation passent par un bastion, enregistrant un journal complet de toutes les opérations.

8.2 Sauvegarde des données

Règle 3-2-1 de la sauvegarde :

  • 3 copies des données (1 originale + 2 sauvegardes)
  • 2 supports de stockage différents (disque local + stockage cloud)
  • 1 sauvegarde hors site (protection contre les sinistres localisés)

Stratégie de sauvegarde :

TypeFréquenceDurée de rétentionRTORPO
Sauvegarde complèteHebdomadaire1 mois4 heures24 heures
Sauvegarde incrémentaleQuotidienne1 semaine2 heures1 heure
Sauvegarde en temps réelÀ la seconde7 joursMinutesÀ la seconde

RTO (Recovery Time Objective) : objectif de temps de récupération (durée maximale d'interruption du service) RPO (Recovery Point Objective) : objectif de point de récupération (volume maximal de données pouvant être perdues)

8.3 Scan des vulnérabilités

Scans réguliers :

  • Scan de code : SonarQube, ESLint (découverte des vulnérabilités potentielles)
  • Scan des dépendances : npm audit, Snyk (détection des vulnérabilités dans les bibliothèques tierces)
  • Scan des conteneurs : Trivy, Clair (détection des vulnérabilités dans les images)
bash
# Exemple npm audit
$ npm audit

found 3 vulnerabilities (1 moderate, 2 high)

Package         Severity  Vulnerable versions
lodash          high      <4.17.21
express         moderate  4.0.0 - 4.18.2

# Correction automatique
$ npm audit fix

9. Exploitation automatisée (DevOps)

9.1 Pipeline CI/CD

yaml
# Exemple .gitlab-ci.yml
stages:
  - test
  - build
  - deploy

test:
  stage: test
  script:
    - npm install
    - npm test
  tags:
    - docker

build:
  stage: build
  script:
    - docker build -t myapp:$CI_COMMIT_SHA .
    - docker push registry.example.com/myapp:$CI_COMMIT_SHA
  only:
    - main

deploy:
  stage: deploy
  script:
    - kubectl set image deployment/myapp myapp=registry.example.com/myapp:$CI_COMMIT_SHA
  environment:
    name: production
  when: manual # Déploiement déclenché manuellement

9.2 Infrastructure as Code (IaC)

Exemple Terraform (gestion des ressources cloud) :

hcl
# main.tf
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "WebServer"
    Env  = "production"
  }
}

resource "aws_security_group" "web" {
  name = "web-sg"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Avantages :

  • Contrôle de version : toute la configuration est dans Git
  • Reproductible : cohérence des environnements
  • Auditable : historique des modifications clair
  • Réversible : retour rapide à une version antérieure

9.3 Pratiques GitOps

GitOps = Git + IaC + Automatisation

Principe fondamental : le dépôt Git est l'unique source de vérité pour l'infrastructure

Flux de travail :

1. Modifier les fichiers de configuration (push vers Git)

2. Le changement dans le dépôt Git déclenche le CI/CD

3. Exécution automatique de terraform apply / kubectl apply

4. L'infrastructure se met à jour automatiquement

5. La surveillance compare l'état réel à l'état souhaité

Outils : ArgoCD, Flux (déploiement Kubernetes)


10. Résumé et bonnes pratiques

L'exploitation est un vaste domaine, mais son cœur peut se résumer ainsi :

10.1 Modèle de maturité de l'exploitation

NiveauCaractéristiquesPratiques
DébutantRéponse réactive, opérations manuellesTraitement uniquement en cas de problème, déploiement manuel
IntermédiaireAutomatisation, standardisationCI/CD, surveillance et alertes, documentation
AvancéApproche préventive, auto-guérisonPlanification de capacité, exercices d'incidents, mise à l'échelle automatique
ExpertIntelligence, exploitation sans surveillanceAIOps, Chaos Engineering, Serverless

10.2 Une journée d'un ingénieur d'exploitation

09:00 - Consulter les alertes de la nuit, vérifier l'état du système
10:00 - Traiter les problèmes remontés par les utilisateurs
11:00 - Participer à la réunion hebdomadaire R&D, évaluer les risques d'exploitation des nouvelles solutions
14:00 - Optimiser les requêtes lentes, améliorer les performances
15:00 - Revue de code (Code Review)
16:00 - Rédiger la documentation de déploiement, mettre à jour les règles de surveillance
17:00 - Exercice d'incident (Chaos Engineering)
18:00 - Passation de garde

10.3 Parcours d'apprentissage

Phase d'initiation (1 à 3 mois) :

  • Maîtriser les commandes Linux courantes
  • Découvrir les systèmes de surveillance (Prometheus + Grafana)
  • Maîtriser la consultation de journaux (ELK)

Phase intermédiaire (3 à 6 mois) :

  • Approfondir la technologie des conteneurs (Docker + K8s)
  • Maîtriser un outil de diagnostic (Arthas, tcpdump)
  • Pratiquer les pipelines CI/CD

Phase avancée (6 à 12 mois) :

  • Optimisation des performances (base de données, JVM, réseau)
  • Planification de capacité et optimisation des coûts
  • Rétrospective d'incidents et amélioration des processus

Phase experte (plus d'un an) :

  • Conception d'architecture (haute disponibilité, reprise après sinistre)
  • Chaos Engineering (injection proactive de pannes)
  • AIOps (exploitation intelligente)

11. Glossaire

TermeNom completDéfinition
Monitoring-Surveillance, observation en temps réel de l'état de fonctionnement du système.
Alerting-Alertes, notification des personnes concernées en cas d'anomalie.
Logging-Journaux, enregistrement des événements survenus pendant le fonctionnement du système.
Tracing-Traçage distribué, suivi du chemin complet d'une requête dans un système distribué.
QPSQueries Per SecondRequêtes par seconde, mesure du débit du système.
Latency-Latence, temps entre l'envoi d'une requête et l'obtention de la réponse.
RTORecovery Time ObjectiveObjectif de temps de récupération, durée maximale d'interruption du service.
RPORecovery Point ObjectiveObjectif de point de récupération, volume maximal de données pouvant être perdues.
Post-mortem-Rétrospective post-incident, analyse des causes et mesures d'amélioration.
CI/CDContinuous Integration/DeliveryIntégration continue et livraison continue, automatisation des tests et du déploiement.
IaCInfrastructure as CodeInfrastructure as Code, gestion des serveurs, réseaux et autres ressources par du code.
GitOps-Git Ops, le dépôt Git est l'unique source de vérité pour l'infrastructure.
ELKElasticsearch + Logstash + KibanaTriptyque de collecte, stockage et visualisation des journaux.
SLAService Level AgreementAccord de niveau de service, engagement de disponibilité du service (par ex. 99,9 %).
Blameless-Culture sans blâme, la rétrospective se concentre sur l'amélioration des processus et non sur la responsabilité individuelle.

12. Pour aller plus loin