İçeriğe geç

Docker Desteği

GalataJ, otomatik keşif ve kayıt ile Docker konteynerlerinde çalışan Java uygulamalarını profillemeyi destekler.

Agent ile birlikte çalışan Docker konteynerleri, push tabanlı keşif kullanarak otomatik olarak controller’a kaydolur. Manuel yapılandırma gerekmez!

1. Dockerfile’da Agent’ı Yapılandırın

Section titled “1. Dockerfile’da Agent’ı Yapılandırın”

Agent’ı Dockerfile’ınıza ekleyin:

# Agent JAR'ı kopyala
COPY dist/agent/agent-core-1.0.0-SNAPSHOT.jar /agent/agent.jar
# Java agent'ı yapılandır
ENV JAVA_TOOL_OPTIONS="-javaagent:/agent/agent.jar=package=com.myapp"
# İsteğe bağlı: Tanımlama için proje adı ayarla
ENV GALATAJ_PROJECT=my-service
# İsteğe bağlı: Controller host'u ayarla (localhost değilse)
ENV GALATAJ_CONTROLLER_HOST=host.docker.internal
ENV GALATAJ_CONTROLLER_PORT=9876
Terminal window
docker build -t my-java-app .

Controller’ın çalıştığından emin olun:

Terminal window
galataj controller start

Önemli: Controller host üzerindeyse ve konteynerin bağlanması gerekiyorsa:

  • host.docker.internal kullanın (Docker Desktop) veya
  • Host’un IP adresini kullanın veya
  • Controller’ı paylaşımlı bir ağda çalıştırın
Terminal window
docker run -d \
--name my-service \
-p 8080:8080 \
my-java-app

Agent otomatik olarak:

  • Docker ortamını algılar
  • Controller’a kaydolur
  • Metrik göndermeye başlar
Terminal window
galataj jvms

Çıktı:

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

Docker JVM’leri gösterir:

  • Environment: docker (local yerine)
  • Container ID: Docker konteyner tanımlayıcısı
  • App Name: GALATAJ_PROJECT ortam değişkeninden
  • PID: Mevcut değil (Docker için null)

JVM ID kullanarak:

Terminal window
galataj attach --jvm-id def456

Not: Docker JVM’leri push tabanlı keşif kullanır, bu yüzden zaten kayıtlıdırlar. Attach komutu bağlantıyı onaylar.

Agent, Docker ortamını şunları kontrol ederek otomatik olarak algılar:

  1. /.dockerenv dosyasının varlığı
  2. /proc/self/cgroup “docker” içeriyor
  3. DOCKER_HOST ortam değişkeni
  4. Hostname veya cgroup’tan konteyner ID’si

Bir Docker konteyneri başladığında:

  1. Agent başlar Java uygulaması ile
  2. Docker ortamını algılar
  3. HTTP POST ile controller’a kaydolur:
    POST http://controller:9877/api/v1/jvms/register
  4. Her 30 saniyede heartbeat gönderir
  5. Port 9876 üzerinden TCP ile metrik gönderir
{
"jvmId": "uuid-generated",
"environment": "docker",
"containerId": "order-service",
"appName": "order-service",
"labels": {
"project": "order-service"
}
}

Docker agent’ları periyodik heartbeat gönderir:

  • Aralık: Her 30 saniyede
  • Endpoint: POST /api/v1/jvms/{jvmId}/heartbeat
  • Amaç: Kaydı aktif tutmak, lastSeenAt’i güncellemek

Controller, 60 saniye heartbeat gelmezse eski JVM’leri kaldırır.

host.docker.internal kullanın:

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

Host’un IP’sini veya paylaşımlı ağ kullanın:

Seçenek 1: Host IP

ENV GALATAJ_CONTROLLER_HOST=172.17.0.1

Seçenek 2: Paylaşımlı Ağ

Terminal window
# Ağ oluştur
docker network create profiler-net
# Controller'ı ağda çalıştır
docker run -d --network profiler-net --name controller ...
# Uygulamayı aynı ağda çalıştır
docker run -d --network profiler-net ...
version: '3.8'
services:
controller:
# Controller servisi (konteynerize ise)
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 Kubernetes’te de çalışır:

  1. Agent JAR’ı bağlayın ConfigMap veya volume olarak
  2. JAVA_TOOL_OPTIONS ayarlayın deployment’ta
  3. Controller host’u yapılandırın service name veya IP olarak
  4. Agent’lar otomatik kaydolur

Örnek 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

Sorun: Docker JVM jvms listesinde yok

Çözüm:

  1. Agent’ın yapılandırıldığını kontrol edin: echo $JAVA_TOOL_OPTIONS
  2. Controller’ın konteynerden erişilebilir olduğunu doğrulayın
  3. Controller loglarını kontrol edin: logs/profiler-controller.log
  4. Ağ bağlantısını doğrulayın

Sorun: Agent controller’a bağlanamıyor

Çözüm:

  1. Controller host/port yapılandırmasını kontrol edin
  2. Ağ bağlantısını doğrulayın: ping controller-host
  3. HTTP endpoint’i test edin: curl http://controller:9877/api/v1/status
  4. Firewall kurallarını kontrol edin

Sorun: Eski konteynerler hâlâ listede

Çözüm:

  • Controller 60 saniye heartbeat gelmezse otomatik kaldırır
  • Veya manuel kaldırın: galataj detach --jvm-id <id>
  1. Proje adları kullanın: Kolay tanımlama için GALATAJ_PROJECT ayarlayın
  2. Paylaşımlı ağlar: Daha iyi izolasyon için Docker ağlarını kullanın
  3. Kaynak limitleri: Uygun bellek/CPU limitleri ayarlayın
  4. Health check’ler: Agent kaydını loglarda izleyin
  5. Etiketler: Filtreleme ve organizasyon için etiketler kullanın