Zum Inhalt springen

Docker-Unterstützung

GalataJ unterstützt das Profilieren von Java-Anwendungen, die in Docker-Containern laufen, mit automatischer Erkennung und Registrierung.

Docker-Container mit dem Agent registrieren sich automatisch beim Controller mittels Push-basierter Erkennung. Keine manuelle Konfiguration erforderlich!

Fügen Sie den Agent zu Ihrem Dockerfile hinzu:

# Agent JAR kopieren
COPY dist/agent/agent-core-1.0.0-SNAPSHOT.jar /agent/agent.jar
# Java-Agent konfigurieren
ENV JAVA_TOOL_OPTIONS="-javaagent:/agent/agent.jar=package=com.myapp"
# Optional: Projektname zur Identifikation setzen
ENV GALATAJ_PROJECT=my-service
# Optional: Controller-Host setzen (falls nicht localhost)
ENV GALATAJ_CONTROLLER_HOST=host.docker.internal
ENV GALATAJ_CONTROLLER_PORT=9876
Terminal-Fenster
docker build -t my-java-app .

Stellen Sie sicher, dass der Controller läuft:

Terminal-Fenster
galataj controller start

Wichtig: Wenn der Controller auf dem Host läuft und der Container sich verbinden muss:

  • Verwenden Sie host.docker.internal (Docker Desktop) oder
  • Verwenden Sie die IP-Adresse des Hosts oder
  • Führen Sie den Controller in einem gemeinsamen Netzwerk aus
Terminal-Fenster
docker run -d \
--name my-service \
-p 8080:8080 \
my-java-app

Der Agent macht automatisch:

  • Erkennt Docker-Umgebung
  • Registriert sich beim Controller
  • Beginnt, Metriken zu senden
Terminal-Fenster
galataj jvms

Ausgabe:

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

Docker-JVMs zeigen:

  • Environment: docker (anstelle von local)
  • Container ID: Docker-Container-Kennung
  • App Name: Aus der GALATAJ_PROJECT Umgebungsvariable
  • PID: Nicht verfügbar (null für Docker)

Mit JVM-ID:

Terminal-Fenster
galataj attach --jvm-id def456

Hinweis: Docker-JVMs verwenden Push-basierte Erkennung, sie sind also bereits registriert. Der Attach-Befehl bestätigt die Verbindung.

Der Agent erkennt automatisch die Docker-Umgebung durch Prüfung von:

  1. Existenz der Datei /.dockerenv
  2. /proc/self/cgroup enthält “docker”
  3. DOCKER_HOST Umgebungsvariable
  4. Container-ID aus Hostname oder cgroup

Wenn ein Docker-Container startet:

  1. Agent startet mit Java-Anwendung
  2. Erkennt Docker-Umgebung
  3. Registriert sich beim Controller via HTTP POST:
    POST http://controller:9877/api/v1/jvms/register
  4. Sendet Heartbeat alle 30 Sekunden
  5. Sendet Metriken via TCP auf Port 9876
{
"jvmId": "uuid-generated",
"environment": "docker",
"containerId": "order-service",
"appName": "order-service",
"labels": {
"project": "order-service"
}
}

Docker-Agents senden periodische Heartbeats:

  • Intervall: Alle 30 Sekunden
  • Endpunkt: POST /api/v1/jvms/{jvmId}/heartbeat
  • Zweck: Registrierung aktiv halten, lastSeenAt aktualisieren

Der Controller entfernt veraltete JVMs nach 60 Sekunden ohne Heartbeat.

Verwenden Sie host.docker.internal:

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

Verwenden Sie die Host-IP oder ein gemeinsames Netzwerk:

Option 1: Host-IP

ENV GALATAJ_CONTROLLER_HOST=172.17.0.1

Option 2: Gemeinsames Netzwerk

Terminal-Fenster
# Netzwerk erstellen
docker network create profiler-net
# Controller im Netzwerk ausführen
docker run -d --network profiler-net --name controller ...
# App im selben Netzwerk ausführen
docker run -d --network profiler-net ...
version: '3.8'
services:
controller:
# Controller-Service (falls containerisiert)
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 funktioniert auch in Kubernetes:

  1. Agent-JAR einbinden als ConfigMap oder Volume
  2. JAVA_TOOL_OPTIONS setzen im Deployment
  3. Controller-Host konfigurieren zu Service-Name oder IP
  4. Agents registrieren sich automatisch

Beispiel-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

Problem: Docker-JVM nicht in der jvms-Liste

Lösung:

  1. Prüfen Sie, ob Agent konfiguriert ist: echo $JAVA_TOOL_OPTIONS
  2. Verifizieren Sie, dass Controller vom Container erreichbar ist
  3. Controller-Logs prüfen: logs/profiler-controller.log
  4. Netzwerkkonnektivität verifizieren

Problem: Agent kann sich nicht mit Controller verbinden

Lösung:

  1. Controller-Host/Port-Konfiguration prüfen
  2. Netzwerkkonnektivität verifizieren: ping controller-host
  3. HTTP-Endpunkt testen: curl http://controller:9877/api/v1/status
  4. Firewall-Regeln prüfen

Problem: Alte Container noch in der Liste

Lösung:

  • Controller entfernt automatisch nach 60 Sekunden ohne Heartbeat
  • Oder manuell entfernen: galataj detach --jvm-id <id>
  1. Projektnamen verwenden: Setzen Sie GALATAJ_PROJECT für einfache Identifikation
  2. Gemeinsame Netzwerke: Verwenden Sie Docker-Netzwerke für bessere Isolation
  3. Ressourcenlimits: Setzen Sie angemessene Speicher-/CPU-Limits
  4. Health-Checks: Überwachen Sie die Agent-Registrierung in Logs
  5. Labels: Verwenden Sie Labels zum Filtern und Organisieren