Ir al contenido

Soporte para Docker

GalataJ soporta el perfilado de aplicaciones Java ejecutándose en contenedores Docker con descubrimiento automático y registro.

Los contenedores Docker con el agente se registran automáticamente con el controlador usando descubrimiento basado en push. ¡No se necesita configuración manual!

Agregue el agente a su Dockerfile:

# Copiar JAR del agente
COPY dist/agent/agent-core-1.0.0-SNAPSHOT.jar /agent/agent.jar
# Configurar agente Java
ENV JAVA_TOOL_OPTIONS="-javaagent:/agent/agent.jar=package=com.myapp"
# Opcional: Establecer nombre del proyecto para identificación
ENV GALATAJ_PROJECT=my-service
# Opcional: Establecer host del controlador (si no es localhost)
ENV GALATAJ_CONTROLLER_HOST=host.docker.internal
ENV GALATAJ_CONTROLLER_PORT=9876
Ventana de terminal
docker build -t my-java-app .

Asegúrese de que el controlador esté ejecutándose:

Ventana de terminal
galataj controller start

Importante: 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
Ventana de terminal
docker run -d \
--name my-service \
-p 8080:8080 \
my-java-app

El agente automáticamente:

  • Detecta el entorno Docker
  • Se registra con el controlador
  • Comienza a enviar métricas
Ventana de terminal
galataj jvms

Salida:

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

Las JVMs de Docker muestran:

  • Environment: docker (en lugar de local)
  • Container ID: Identificador del contenedor Docker
  • App Name: De la variable de entorno GALATAJ_PROJECT
  • PID: No disponible (null para Docker)

Usando ID de JVM:

Ventana de terminal
galataj attach --jvm-id def456

Nota: Las JVMs de Docker usan descubrimiento basado en push, por lo que ya están registradas. El comando attach confirma la conexión.

El agente detecta automáticamente el entorno Docker verificando:

  1. Existencia del archivo /.dockerenv
  2. /proc/self/cgroup contiene “docker”
  3. Variable de entorno DOCKER_HOST
  4. ID del contenedor desde hostname o cgroup

Cuando un contenedor Docker inicia:

  1. El agente inicia con la aplicación Java
  2. Detecta el entorno Docker
  3. Se registra con el controlador via HTTP POST:
    POST http://controller:9877/api/v1/jvms/register
  4. Envía heartbeat cada 30 segundos
  5. Envía métricas via TCP en puerto 9876
{
"jvmId": "uuid-generated",
"environment": "docker",
"containerId": "order-service",
"appName": "order-service",
"labels": {
"project": "order-service"
}
}

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.

Use host.docker.internal:

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

Use la IP del host o red compartida:

Opción 1: IP del Host

ENV GALATAJ_CONTROLLER_HOST=172.17.0.1

Opción 2: Red Compartida

Ventana de terminal
# Crear red
docker network create profiler-net
# Ejecutar controlador en la red
docker run -d --network profiler-net --name controller ...
# Ejecutar app en la misma red
docker run -d --network profiler-net ...
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: bridge

GalataJ también funciona en Kubernetes:

  1. Monte el JAR del agente como ConfigMap o volumen
  2. Establezca JAVA_TOOL_OPTIONS en el deployment
  3. Configure el host del controlador al nombre del servicio o IP
  4. Los agentes se registran automáticamente

Ejemplo 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

Problema: JVM de Docker no está en la lista de jvms

Solución:

  1. Verifique que el agente esté configurado: echo $JAVA_TOOL_OPTIONS
  2. Verifique que el controlador sea accesible desde el contenedor
  3. Verifique los logs del controlador: logs/profiler-controller.log
  4. Verifique la conectividad de red

Problema: El agente no puede conectarse al controlador

Solución:

  1. Verifique la configuración de host/puerto del controlador
  2. Verifique la conectividad de red: ping controller-host
  3. Pruebe el endpoint HTTP: curl http://controller:9877/api/v1/status
  4. Verifique las reglas del firewall

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>
  1. Use nombres de proyecto: Establezca GALATAJ_PROJECT para fácil identificación
  2. Redes compartidas: Use redes Docker para mejor aislamiento
  3. Límites de recursos: Establezca límites apropiados de memoria/CPU
  4. Health checks: Monitoree el registro del agente en los logs
  5. Etiquetas: Use etiquetas para filtrado y organización