Monitoring avec Prometheus et Grafana
La surveillance des microservices
10-15 min
Monitoring avec Prometheus et Grafana
Dans ce chapitre, nous allons explorer la mise en place d’un système de monitoring complet avec Prometheus et Grafana. Nous verrons comment collecter, stocker et visualiser les métriques de nos microservices.
1. Configuration de Prometheus
Démarrage de Prometheus
docker run -d -p 9090:9090 \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
Configuration de base
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'spring-boot-app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080']
2. Configuration des Applications
Dépendances
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Configuration Actuator
# application.yml
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
endpoint:
health:
show-details: always
metrics:
tags:
application: ${spring.application.name}
distribution:
percentiles-histogram:
http.server.requests: true
sla:
http.server.requests: 10ms, 50ms, 100ms, 200ms, 500ms
3. Métriques Personnalisées
Configuration des métriques
@Configuration
public class MetricsConfig {
@Bean
public MeterRegistry meterRegistry() {
return new SimpleMeterRegistry();
}
@Bean
public TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}
}
Implémentation des métriques
@Service
public class ProductService {
private final MeterRegistry registry;
public ProductService(MeterRegistry registry) {
this.registry = registry;
}
public Product getProduct(Long id) {
return registry.timer("product.get", "id", id.toString())
.record(() -> productClient.getProduct(id));
}
public void recordProductCreation(Product product) {
registry.counter("product.created",
"category", product.getCategory())
.increment();
}
}
4. Alertes avec Prometheus
Configuration des règles
# rules.yml
groups:
- name: spring-boot-app
rules:
- alert: HighErrorRate
expr: rate(http_server_requests_seconds_count{status=~"5.."}[5m]) > 0.1
for: 5m
labels:
severity: critical
annotations:
summary: High error rate detected
description: Error rate is above 10% for 5 minutes
Configuration des alertes
# alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 5m
repeat_interval: 4h
receiver: 'email-notifications'
receivers:
- name: 'email-notifications'
email_configs:
- to: 'alerts@example.com'
from: 'prometheus@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'prometheus'
auth_password: 'secret'
5. Configuration de Grafana
Démarrage de Grafana
docker run -d -p 3000:3000 grafana/grafana
Configuration des datasources
{
"name": "Prometheus",
"type": "prometheus",
"url": "http://prometheus:9090",
"access": "proxy",
"isDefault": true
}
Dashboard de base
{
"dashboard": {
"id": null,
"title": "Spring Boot Application",
"panels": [
{
"title": "Request Rate",
"type": "graph",
"datasource": "Prometheus",
"targets": [
{
"expr": "rate(http_server_requests_seconds_count[5m])",
"legendFormat": "{{method}} {{uri}}"
}
]
}
]
}
}
6. Métriques Avancées
Métriques de performance
@Component
public class PerformanceMetrics {
private final MeterRegistry registry;
public PerformanceMetrics(MeterRegistry registry) {
this.registry = registry;
}
public void recordMethodExecution(String methodName, long duration) {
registry.timer("method.execution", "name", methodName)
.record(duration, TimeUnit.MILLISECONDS);
}
public void recordDatabaseQuery(String queryType, long duration) {
registry.timer("database.query", "type", queryType)
.record(duration, TimeUnit.MILLISECONDS);
}
}
Métriques de ressources
@Component
public class ResourceMetrics {
private final MeterRegistry registry;
public ResourceMetrics(MeterRegistry registry) {
this.registry = registry;
}
public void recordMemoryUsage() {
Runtime runtime = Runtime.getRuntime();
long usedMemory = runtime.totalMemory() - runtime.freeMemory();
registry.gauge("jvm.memory.used",
Tags.of("type", "heap"),
usedMemory);
}
public void recordThreadCount() {
registry.gauge("jvm.threads.count",
Thread.activeCount());
}
}
7. Visualisation Avancée
Dashboard personnalisé
{
"dashboard": {
"panels": [
{
"title": "Service Health",
"type": "stat",
"datasource": "Prometheus",
"targets": [
{
"expr": "up{job=\"spring-boot-app\"}",
"legendFormat": "{{instance}}"
}
]
},
{
"title": "Error Rate",
"type": "graph",
"datasource": "Prometheus",
"targets": [
{
"expr": "rate(http_server_requests_seconds_count{status=~\"5..\"}[5m])",
"legendFormat": "{{instance}}"
}
]
}
]
}
}
Alertes dans Grafana
{
"alert": {
"name": "High Error Rate",
"conditions": [
{
"evaluator": {
"params": [0.1],
"type": "gt"
},
"operator": {
"type": "and"
},
"query": {
"params": ["A", "5m", "now"]
},
"reducer": {
"type": "avg"
},
"type": "query"
}
]
}
}
8. Exercices pratiques
-
Configuration du monitoring
- Configurez Prometheus
- Configurez Grafana
- Testez la collecte des métriques
-
Création de métriques
- Implémentez des métriques personnalisées
- Configurez des alertes
- Testez les notifications
-
Visualisation des données
- Créez des dashboards
- Configurez des alertes dans Grafana
- Analysez les performances
Conclusion
Dans ce chapitre, nous avons exploré :
- La configuration de Prometheus
- La configuration des applications
- Les métriques personnalisées
- Les alertes
- La configuration de Grafana
- Les métriques avancées
- La visualisation des données
Le monitoring permet :
- La surveillance en temps réel
- La détection des problèmes
- L’analyse des performances
- La planification de la capacité
Dans le prochain chapitre, nous explorerons le déploiement sur Kubernetes.
Commentaires
Les commentaires sont alimentés par GitHub Discussions
Connectez-vous avec GitHub pour participer à la discussion