Aller au contenu

Support Docker

GalataJ supporte le profilage des applications Java s’exécutant dans des conteneurs Docker avec découverte automatique et enregistrement.

Les conteneurs Docker avec l’agent s’enregistrent automatiquement auprès du contrôleur en utilisant la découverte basée sur le push. Aucune configuration manuelle nécessaire !

Ajoutez l’agent à votre Dockerfile :

# Copier le JAR de l'agent
COPY dist/agent/agent-core-1.0.0-SNAPSHOT.jar /agent/agent.jar
# Configurer l'agent Java
ENV JAVA_TOOL_OPTIONS="-javaagent:/agent/agent.jar=package=com.myapp"
# Optionnel : Définir le nom du projet pour l'identification
ENV GALATAJ_PROJECT=my-service
# Optionnel : Définir l'hôte du contrôleur (si pas localhost)
ENV GALATAJ_CONTROLLER_HOST=host.docker.internal
ENV GALATAJ_CONTROLLER_PORT=9876
Fenêtre de terminal
docker build -t my-java-app .

Assurez-vous que le contrôleur est en cours d’exécution :

Fenêtre de terminal
galataj controller start

Important : Si le contrôleur est sur l’hôte et que le conteneur doit se connecter :

  • Utilisez host.docker.internal (Docker Desktop) ou
  • Utilisez l’adresse IP de l’hôte ou
  • Exécutez le contrôleur dans un réseau partagé
Fenêtre de terminal
docker run -d \
--name my-service \
-p 8080:8080 \
my-java-app

L’agent fait automatiquement :

  • Détecte l’environnement Docker
  • S’enregistre auprès du contrôleur
  • Commence à envoyer des métriques
Fenêtre de terminal
galataj jvms

Sortie :

Found 2 JVM(s):
1. my-service
ID: def456
Environment: docker
App: my-service
Container: abc123def456

Les JVMs Docker affichent :

  • Environment : docker (au lieu de local)
  • Container ID : Identifiant du conteneur Docker
  • App Name : De la variable d’environnement GALATAJ_PROJECT
  • PID : Non disponible (null pour Docker)

En utilisant l’ID de JVM :

Fenêtre de terminal
galataj attach --jvm-id def456

Note : Les JVMs Docker utilisent la découverte basée sur le push, donc elles sont déjà enregistrées. La commande attach confirme la connexion.

L’agent détecte automatiquement l’environnement Docker en vérifiant :

  1. Existence du fichier /.dockerenv
  2. /proc/self/cgroup contient “docker”
  3. Variable d’environnement DOCKER_HOST
  4. ID du conteneur depuis le hostname ou cgroup

Quand un conteneur Docker démarre :

  1. L’agent démarre avec l’application Java
  2. Détecte l’environnement Docker
  3. S’enregistre auprès du contrôleur via HTTP POST :
    POST http://controller:9877/api/v1/jvms/register
  4. Envoie un heartbeat toutes les 30 secondes
  5. Envoie les métriques via TCP sur le port 9876
{
"jvmId": "uuid-generated",
"environment": "docker",
"containerId": "order-service",
"appName": "order-service",
"labels": {
"project": "order-service"
}
}

Les agents Docker envoient des heartbeats périodiques :

  • Intervalle : Toutes les 30 secondes
  • Endpoint : POST /api/v1/jvms/{jvmId}/heartbeat
  • But : Garder l’enregistrement actif, mettre à jour lastSeenAt

Le contrôleur supprime les JVMs obsolètes après 60 secondes sans heartbeat.

Utilisez host.docker.internal :

ENV GALATAJ_CONTROLLER_HOST=host.docker.internal
ENV GALATAJ_CONTROLLER_PORT=9876

Utilisez l’IP de l’hôte ou un réseau partagé :

Option 1 : IP de l’Hôte

ENV GALATAJ_CONTROLLER_HOST=172.17.0.1

Option 2 : Réseau Partagé

Fenêtre de terminal
# Créer le réseau
docker network create profiler-net
# Exécuter le contrôleur dans le réseau
docker run -d --network profiler-net --name controller ...
# Exécuter l'app dans le même réseau
docker run -d --network profiler-net ...
version: '3.8'
services:
controller:
# Service contrôleur (si conteneurisé)
app:
build: .
environment:
- JAVA_TOOL_OPTIONS=-javaagent:/agent/agent.jar=package=com.myapp
- GALATAJ_PROJECT=my-service
- GALATAJ_CONTROLLER_HOST=controller
- GALATAJ_CONTROLLER_PORT=9876
networks:
- profiler-net
networks:
profiler-net:
driver: bridge

GalataJ fonctionne aussi dans Kubernetes :

  1. Montez le JAR de l’agent comme ConfigMap ou volume
  2. Définissez JAVA_TOOL_OPTIONS dans le deployment
  3. Configurez l’hôte du contrôleur vers le nom du service ou IP
  4. Les agents s’enregistrent automatiquement

Exemple de deployment :

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
containers:
- name: app
env:
- name: JAVA_TOOL_OPTIONS
value: "-javaagent:/agent/agent.jar=package=com.myapp"
- name: GALATAJ_CONTROLLER_HOST
value: "profiler-controller.default.svc.cluster.local"
volumeMounts:
- name: agent
mountPath: /agent
volumes:
- name: agent
configMap:
name: profiler-agent

Problème : JVM Docker pas dans la liste jvms

Solution :

  1. Vérifiez que l’agent est configuré : echo $JAVA_TOOL_OPTIONS
  2. Vérifiez que le contrôleur est accessible depuis le conteneur
  3. Vérifiez les logs du contrôleur : logs/profiler-controller.log
  4. Vérifiez la connectivité réseau

Problème : L’agent ne peut pas se connecter au contrôleur

Solution :

  1. Vérifiez la configuration hôte/port du contrôleur
  2. Vérifiez la connectivité réseau : ping controller-host
  3. Testez l’endpoint HTTP : curl http://controller:9877/api/v1/status
  4. Vérifiez les règles du pare-feu

Problème : Anciens conteneurs toujours dans la liste

Solution :

  • Le contrôleur les supprime automatiquement après 60 secondes sans heartbeat
  • Ou supprimez manuellement : galataj detach --jvm-id <id>
  1. Utilisez des noms de projet : Définissez GALATAJ_PROJECT pour une identification facile
  2. Réseaux partagés : Utilisez les réseaux Docker pour une meilleure isolation
  3. Limites de ressources : Définissez des limites mémoire/CPU appropriées
  4. Health checks : Surveillez l’enregistrement de l’agent dans les logs
  5. Labels : Utilisez des labels pour le filtrage et l’organisation