Soporte para Docker
Soporte para Docker
Sección titulada «Soporte para Docker»GalataJ soporta el perfilado de aplicaciones Java ejecutándose en contenedores Docker con descubrimiento automático y registro.
Descripción General
Sección titulada «Descripción General»Los contenedores Docker con el agente se registran automáticamente con el controlador usando descubrimiento basado en push. ¡No se necesita configuración manual!
Configuración
Sección titulada «Configuración»1. Configurar el Agente en Dockerfile
Sección titulada «1. Configurar el Agente en Dockerfile»Agregue el agente a su Dockerfile:
# Copiar JAR del agenteCOPY dist/agent/agent-core-1.0.0-SNAPSHOT.jar /agent/agent.jar
# Configurar agente JavaENV JAVA_TOOL_OPTIONS="-javaagent:/agent/agent.jar=package=com.myapp"
# Opcional: Establecer nombre del proyecto para identificaciónENV GALATAJ_PROJECT=my-service
# Opcional: Establecer host del controlador (si no es localhost)ENV GALATAJ_CONTROLLER_HOST=host.docker.internalENV GALATAJ_CONTROLLER_PORT=98762. Construir Imagen Docker
Sección titulada «2. Construir Imagen Docker»docker build -t my-java-app .3. Iniciar el Controlador
Sección titulada «3. Iniciar el Controlador»Asegúrese de que el controlador esté ejecutándose:
galataj controller startImportante: Si el controlador está en el host y el contenedor necesita conectarse:
- Use
host.docker.internal(Docker Desktop) o - Use la dirección IP del host o
- Ejecute el controlador en una red compartida
4. Ejecutar el Contenedor
Sección titulada «4. Ejecutar el Contenedor»docker run -d \ --name my-service \ -p 8080:8080 \ my-java-appEl agente automáticamente:
- Detecta el entorno Docker
- Se registra con el controlador
- Comienza a enviar métricas
Descubrimiento
Sección titulada «Descubrimiento»Ver JVMs de Docker
Sección titulada «Ver JVMs de Docker»galataj jvmsSalida:
Found 2 JVM(s):
1. my-service ID: def456 Environment: docker App: my-service Container: abc123def456Campos Específicos de Docker
Sección titulada «Campos Específicos de Docker»Las JVMs de Docker muestran:
- Environment:
docker(en lugar delocal) - Container ID: Identificador del contenedor Docker
- App Name: De la variable de entorno
GALATAJ_PROJECT - PID: No disponible (null para Docker)
Adjuntando
Sección titulada «Adjuntando»Adjuntar a JVM de Docker
Sección titulada «Adjuntar a JVM de Docker»Usando ID de JVM:
galataj attach --jvm-id def456Nota: Las JVMs de Docker usan descubrimiento basado en push, por lo que ya están registradas. El comando attach confirma la conexión.
Detección de Entorno
Sección titulada «Detección de Entorno»El agente detecta automáticamente el entorno Docker verificando:
- Existencia del archivo
/.dockerenv /proc/self/cgroupcontiene “docker”- Variable de entorno
DOCKER_HOST - ID del contenedor desde hostname o cgroup
Flujo de Registro
Sección titulada «Flujo de Registro»Cuando un contenedor Docker inicia:
- El agente inicia con la aplicación Java
- Detecta el entorno Docker
- Se registra con el controlador via HTTP POST:
POST http://controller:9877/api/v1/jvms/register
- Envía heartbeat cada 30 segundos
- Envía métricas via TCP en puerto 9876
Payload de Registro
Sección titulada «Payload de Registro»{ "jvmId": "uuid-generated", "environment": "docker", "containerId": "order-service", "appName": "order-service", "labels": { "project": "order-service" }}Heartbeat
Sección titulada «Heartbeat»Los agentes Docker envían heartbeats periódicos:
- Intervalo: Cada 30 segundos
- Endpoint:
POST /api/v1/jvms/{jvmId}/heartbeat - Propósito: Mantener el registro activo, actualizar
lastSeenAt
El controlador elimina JVMs obsoletas después de 60 segundos sin heartbeat.
Configuración de Red del Controlador
Sección titulada «Configuración de Red del Controlador»Docker Desktop (Mac/Windows)
Sección titulada «Docker Desktop (Mac/Windows)»Use host.docker.internal:
ENV GALATAJ_CONTROLLER_HOST=host.docker.internalENV GALATAJ_CONTROLLER_PORT=9876Use la IP del host o red compartida:
Opción 1: IP del Host
ENV GALATAJ_CONTROLLER_HOST=172.17.0.1Opción 2: Red Compartida
# Crear reddocker network create profiler-net
# Ejecutar controlador en la reddocker run -d --network profiler-net --name controller ...
# Ejecutar app en la misma reddocker run -d --network profiler-net ...Docker Compose
Sección titulada «Docker Compose»version: '3.8'services: controller: # Servicio del controlador (si está conteneurizado)
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: bridgeKubernetes
Sección titulada «Kubernetes»GalataJ también funciona en Kubernetes:
- Monte el JAR del agente como ConfigMap o volumen
- Establezca JAVA_TOOL_OPTIONS en el deployment
- Configure el host del controlador al nombre del servicio o IP
- Los agentes se registran automáticamente
Ejemplo de deployment:
apiVersion: apps/v1kind: Deploymentmetadata: name: my-appspec: 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-agentSolución de Problemas
Sección titulada «Solución de Problemas»El Contenedor No Aparece
Sección titulada «El Contenedor No Aparece»Problema: JVM de Docker no está en la lista de jvms
Solución:
- Verifique que el agente esté configurado:
echo $JAVA_TOOL_OPTIONS - Verifique que el controlador sea accesible desde el contenedor
- Verifique los logs del controlador:
logs/profiler-controller.log - Verifique la conectividad de red
Conexión Rechazada
Sección titulada «Conexión Rechazada»Problema: El agente no puede conectarse al controlador
Solución:
- Verifique la configuración de host/puerto del controlador
- Verifique la conectividad de red:
ping controller-host - Pruebe el endpoint HTTP:
curl http://controller:9877/api/v1/status - Verifique las reglas del firewall
JVMs Obsoletas
Sección titulada «JVMs Obsoletas»Problema: Contenedores antiguos todavía en la lista
Solución:
- El controlador los elimina automáticamente después de 60 segundos sin heartbeat
- O elimine manualmente:
galataj detach --jvm-id <id>
Mejores Prácticas
Sección titulada «Mejores Prácticas»- Use nombres de proyecto: Establezca
GALATAJ_PROJECTpara fácil identificación - Redes compartidas: Use redes Docker para mejor aislamiento
- Límites de recursos: Establezca límites apropiados de memoria/CPU
- Health checks: Monitoree el registro del agente en los logs
- Etiquetas: Use etiquetas para filtrado y organización
Próximos Pasos
Sección titulada «Próximos Pasos»- Aprenda sobre la integración con IntelliJ
- Explore los comandos CLI