Aller au contenu principal

Quiz: Spring Boot Actuator

Testez vos connaissances sur Actuator, les métriques et le monitoring.

30 questions - Cliquez sur chaque question pour révéler la réponse.


Questions 1-15: Actuator Basics​

Question 1: Qu'est-ce que Spring Boot Actuator?

Réponse: Actuator fournit des endpoints pour monitorer et gérer une application Spring Boot en production:

  • Santé de l'application
  • Métriques
  • Informations sur l'environnement
  • Gestion des logs
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Question 2: Comment exposer tous les endpoints Actuator?

Réponse:

management:
endpoints:
web:
exposure:
include: "*"

Par défaut, seuls /health et /info sont exposés.


Question 3: Quels sont les endpoints Actuator principaux?

Réponse:

EndpointDescription
/actuator/healthSanté de l'application
/actuator/infoInformations personnalisées
/actuator/metricsMétriques
/actuator/envPropriétés d'environnement
/actuator/loggersNiveaux de log
/actuator/beansBeans Spring
/actuator/mappingsRoutes HTTP
/actuator/threaddumpThreads actifs
/actuator/heapdumpDump mémoire

Question 4: Comment configurer l'endpoint health?

Réponse:

management:
endpoint:
health:
show-details: always # never, when-authorized, always
show-components: always
health:
db:
enabled: true
diskspace:
enabled: true
threshold: 10MB

Question 5: Comment créer un Health Indicator personnalisé?

Réponse:

@Component
public class ExternalApiHealthIndicator implements HealthIndicator {

private final ExternalApiClient apiClient;

@Override
public Health health() {
try {
boolean isUp = apiClient.ping();
if (isUp) {
return Health.up()
.withDetail("api", "Available")
.withDetail("responseTime", "50ms")
.build();
}
return Health.down()
.withDetail("api", "Unavailable")
.build();
} catch (Exception e) {
return Health.down(e).build();
}
}
}

Question 6: Comment ajouter des informations à /actuator/info?

Réponse:

# application.yml
info:
app:
name: Mon Application
version: 1.0.0
description: API REST
contact:
email: support@example.com

Ou avec un InfoContributor:

@Component
public class CustomInfoContributor implements InfoContributor {

@Override
public void contribute(Info.Builder builder) {
builder.withDetail("uptime", getUptime());
builder.withDetail("activeUsers", getActiveUsers());
}
}

Question 7: Comment sécuriser les endpoints Actuator?

Réponse:

@Configuration
public class SecurityConfig {

@Bean
public SecurityFilterChain actuatorSecurity(HttpSecurity http) throws Exception {
http.securityMatcher("/actuator/**")
.authorizeHttpRequests(auth -> auth
.requestMatchers("/actuator/health").permitAll()
.requestMatchers("/actuator/**").hasRole("ADMIN")
)
.httpBasic(Customizer.withDefaults());

return http.build();
}
}

Question 8: Comment changer le chemin de base d'Actuator?

Réponse:

management:
endpoints:
web:
base-path: /manage # /manage/health au lieu de /actuator/health

Question 9: Comment désactiver un endpoint spécifique?

Réponse:

management:
endpoint:
env:
enabled: false
beans:
enabled: false

Question 10: Comment exposer Actuator sur un port différent?

Réponse:

management:
server:
port: 9090 # Actuator sur le port 9090
address: 127.0.0.1 # Accessible uniquement en local

Question 11: Comment modifier les niveaux de log à chaud?

Réponse:

# Voir les loggers
curl http://localhost:8080/actuator/loggers

# Changer un niveau
curl -X POST http://localhost:8080/actuator/loggers/com.example \
-H "Content-Type: application/json" \
-d '{"configuredLevel": "DEBUG"}'

Question 12: Comment obtenir un thread dump?

Réponse:

curl http://localhost:8080/actuator/threaddump

Utile pour diagnostiquer:

  • Deadlocks
  • Threads bloqués
  • Problèmes de performance

Question 13: Comment obtenir un heap dump?

Réponse:

curl -o heapdump.hprof http://localhost:8080/actuator/heapdump

Analyser avec:

  • Eclipse MAT
  • VisualVM
  • JProfiler

Question 14: Qu'est-ce que l'endpoint /actuator/env?

Réponse: Affiche toutes les propriétés d'environnement:

  • Variables système
  • Variables d'environnement
  • Propriétés application.yml
  • Profils actifs
curl http://localhost:8080/actuator/env/spring.datasource.url

Attention: peut exposer des secrets!


Question 15: Comment cacher les propriétés sensibles?

Réponse:

management:
endpoint:
env:
keys-to-sanitize:
- password
- secret
- key
- token
- credential

Les valeurs sont remplacées par ******.


Questions 16-30: Métriques et Monitoring​

Question 16: Qu'est-ce que Micrometer?

Réponse: Micrometer est une façade de métriques (comme SLF4J pour le logging) qui permet de publier des métriques vers différents systèmes:

  • Prometheus
  • Datadog
  • InfluxDB
  • CloudWatch

Spring Boot Actuator l'utilise par défaut.


Question 17: Comment accéder aux métriques?

Réponse:

# Liste des métriques
curl http://localhost:8080/actuator/metrics

# Métrique spécifique
curl http://localhost:8080/actuator/metrics/jvm.memory.used

# Avec tags
curl http://localhost:8080/actuator/metrics/http.server.requests?tag=uri:/api/users

Question 18: Quelles métriques sont disponibles par défaut?

Réponse:

CatégorieExemples
JVMjvm.memory.used, jvm.gc.pause
HTTPhttp.server.requests
Tomcattomcat.sessions.active
DataSourcehikaricp.connections.active
Cachecache.gets, cache.puts
Systèmesystem.cpu.usage, disk.free

Question 19: Comment créer une métrique personnalisée Counter?

Réponse:

@Service
public class OrderService {

private final Counter ordersCounter;

public OrderService(MeterRegistry registry) {
this.ordersCounter = Counter.builder("orders.created")
.description("Number of orders created")
.tag("type", "online")
.register(registry);
}

public Order createOrder(OrderRequest request) {
Order order = processOrder(request);
ordersCounter.increment();
return order;
}
}

Question 20: Comment créer une métrique Timer?

Réponse:

@Service
public class PaymentService {

private final Timer paymentTimer;

public PaymentService(MeterRegistry registry) {
this.paymentTimer = Timer.builder("payment.processing")
.description("Payment processing time")
.register(registry);
}

public Payment process(PaymentRequest request) {
return paymentTimer.record(() -> {
// Traitement
return doProcess(request);
});
}
}

Question 21: Comment créer une métrique Gauge?

Réponse:

@Component
public class QueueMetrics {

private final BlockingQueue<Task> queue;

public QueueMetrics(MeterRegistry registry, BlockingQueue<Task> queue) {
this.queue = queue;

Gauge.builder("queue.size", queue, BlockingQueue::size)
.description("Current queue size")
.register(registry);
}
}

Question 22: Comment utiliser @Timed pour mesurer les méthodes?

Réponse:

@Configuration
public class MetricsConfig {
@Bean
public TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}
}

@Service
public class UserService {

@Timed(value = "user.find", description = "Time to find user")
public User findById(Long id) {
return userRepository.findById(id).orElseThrow();
}
}

Question 23: Comment configurer Prometheus?

Réponse:

<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: prometheus

Accès: /actuator/prometheus


Question 24: Comment configurer Prometheus pour scraper les métriques?

Réponse:

# prometheus.yml
scrape_configs:
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['app:8080']

Question 25: Comment visualiser les métriques dans Grafana?

Réponse:

  1. Configurer Prometheus comme source de données
  2. Importer un dashboard Spring Boot (ID: 12900)
  3. Ou créer des panels personnalisés:
# Requêtes HTTP par seconde
rate(http_server_requests_seconds_count[5m])

# Temps de réponse moyen
rate(http_server_requests_seconds_sum[5m]) / rate(http_server_requests_seconds_count[5m])

# Utilisation mémoire
jvm_memory_used_bytes{area="heap"}

Question 26: Comment ajouter des tags globaux aux métriques?

Réponse:

@Configuration
public class MetricsConfig {

@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config()
.commonTags("application", "my-app")
.commonTags("environment", "production");
}
}

Question 27: Comment mesurer le temps de démarrage?

Réponse:

@Component
public class StartupMetrics implements ApplicationListener<ApplicationReadyEvent> {

@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
long startupTime = System.currentTimeMillis()
- event.getTimestamp().toEpochMilli();
log.info("Application started in {} ms", startupTime);
}
}

Aussi disponible via Actuator: /actuator/startup


Question 28: Comment implémenter des alertes sur les métriques?

Réponse: Dans Prometheus/Alertmanager:

# alerts.yml
groups:
- name: spring-boot
rules:
- alert: HighErrorRate
expr: rate(http_server_requests_seconds_count{status="500"}[5m]) > 0.1
for: 5m
labels:
severity: critical
annotations:
summary: "High error rate detected"

Question 29: Comment monitorer les connexions à la base de données?

Réponse: Métriques HikariCP automatiques:

# Connexions actives
curl .../actuator/metrics/hikaricp.connections.active

# Connexions en attente
curl .../actuator/metrics/hikaricp.connections.pending

# Temps d'acquisition
curl .../actuator/metrics/hikaricp.connections.acquire

Question 30: Quelles sont les bonnes pratiques de monitoring?

Réponse:

  1. Monitorer les 4 signaux clés (RED): Rate, Errors, Duration
  2. Configurer des alertes pertinentes
  3. Utiliser des dashboards
  4. Centraliser les logs et métriques
  5. Monitorer les dépendances (DB, cache, API externes)
  6. Health checks pour le load balancer
  7. Traces distribuées pour les microservices
  8. Automatiser les runbooks

Score​

ScoreNiveau
27-30Excellent - Actuator maîtrisé
21-26Bien - Quelques révisions
15-20Moyen - Relisez les chapitres
Moins de 15À revoir

Retour au Module 11