Docker Desteği
Docker Desteği
Section titled “Docker Desteği”GalataJ, otomatik keşif ve kayıt ile Docker konteynerlerinde çalışan Java uygulamalarını profillemeyi destekler.
Genel Bakış
Section titled “Genel Bakış”Agent ile birlikte çalışan Docker konteynerleri, push tabanlı keşif kullanarak otomatik olarak controller’a kaydolur. Manuel yapılandırma gerekmez!
Kurulum
Section titled “Kurulum”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'ı kopyalaCOPY dist/agent/agent-core-1.0.0-SNAPSHOT.jar /agent/agent.jar
# Java agent'ı yapılandırENV JAVA_TOOL_OPTIONS="-javaagent:/agent/agent.jar=package=com.myapp"
# İsteğe bağlı: Tanımlama için proje adı ayarlaENV GALATAJ_PROJECT=my-service
# İsteğe bağlı: Controller host'u ayarla (localhost değilse)ENV GALATAJ_CONTROLLER_HOST=host.docker.internalENV GALATAJ_CONTROLLER_PORT=98762. Docker Image Oluşturun
Section titled “2. Docker Image Oluşturun”docker build -t my-java-app .3. Controller’ı Başlatın
Section titled “3. Controller’ı Başlatın”Controller’ın çalıştığından emin olun:
galataj controller startÖnemli: Controller host üzerindeyse ve konteynerin bağlanması gerekiyorsa:
host.docker.internalkullanın (Docker Desktop) veya- Host’un IP adresini kullanın veya
- Controller’ı paylaşımlı bir ağda çalıştırın
4. Konteyneri Çalıştırın
Section titled “4. Konteyneri Çalıştırın”docker run -d \ --name my-service \ -p 8080:8080 \ my-java-appAgent otomatik olarak:
- Docker ortamını algılar
- Controller’a kaydolur
- Metrik göndermeye başlar
Docker JVM’lerini Görüntüle
Section titled “Docker JVM’lerini Görüntüle”galataj jvmsÇıktı:
Found 2 JVM(s):
1. my-service ID: def456 Environment: docker App: my-service Container: abc123def456Docker’a Özgü Alanlar
Section titled “Docker’a Özgü Alanlar”Docker JVM’leri gösterir:
- Environment:
docker(localyerine) - Container ID: Docker konteyner tanımlayıcısı
- App Name:
GALATAJ_PROJECTortam değişkeninden - PID: Mevcut değil (Docker için null)
Bağlanma
Section titled “Bağlanma”Docker JVM’e Bağlanın
Section titled “Docker JVM’e Bağlanın”JVM ID kullanarak:
galataj attach --jvm-id def456Not: Docker JVM’leri push tabanlı keşif kullanır, bu yüzden zaten kayıtlıdırlar. Attach komutu bağlantıyı onaylar.
Ortam Algılama
Section titled “Ortam Algılama”Agent, Docker ortamını şunları kontrol ederek otomatik olarak algılar:
/.dockerenvdosyasının varlığı/proc/self/cgroup“docker” içeriyorDOCKER_HOSTortam değişkeni- Hostname veya cgroup’tan konteyner ID’si
Kayıt Akışı
Section titled “Kayıt Akışı”Bir Docker konteyneri başladığında:
- Agent başlar Java uygulaması ile
- Docker ortamını algılar
- HTTP POST ile controller’a kaydolur:
POST http://controller:9877/api/v1/jvms/register
- Her 30 saniyede heartbeat gönderir
- Port 9876 üzerinden TCP ile metrik gönderir
Kayıt Payload’u
Section titled “Kayıt Payload’u”{ "jvmId": "uuid-generated", "environment": "docker", "containerId": "order-service", "appName": "order-service", "labels": { "project": "order-service" }}Heartbeat
Section titled “Heartbeat”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.
Controller Ağ Yapılandırması
Section titled “Controller Ağ Yapılandırması”Docker Desktop (Mac/Windows)
Section titled “Docker Desktop (Mac/Windows)”host.docker.internal kullanın:
ENV GALATAJ_CONTROLLER_HOST=host.docker.internalENV GALATAJ_CONTROLLER_PORT=9876Host’un IP’sini veya paylaşımlı ağ kullanın:
Seçenek 1: Host IP
ENV GALATAJ_CONTROLLER_HOST=172.17.0.1Seçenek 2: Paylaşımlı Ağ
# Ağ oluşturdocker network create profiler-net
# Controller'ı ağda çalıştırdocker run -d --network profiler-net --name controller ...
# Uygulamayı aynı ağda çalıştırdocker run -d --network profiler-net ...Docker Compose
Section titled “Docker Compose”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: bridgeKubernetes
Section titled “Kubernetes”GalataJ Kubernetes’te de çalışır:
- Agent JAR’ı bağlayın ConfigMap veya volume olarak
- JAVA_TOOL_OPTIONS ayarlayın deployment’ta
- Controller host’u yapılandırın service name veya IP olarak
- Agent’lar otomatik kaydolur
Örnek 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-agentSorun Giderme
Section titled “Sorun Giderme”Konteyner Görünmüyor
Section titled “Konteyner Görünmüyor”Sorun: Docker JVM jvms listesinde yok
Çözüm:
- Agent’ın yapılandırıldığını kontrol edin:
echo $JAVA_TOOL_OPTIONS - Controller’ın konteynerden erişilebilir olduğunu doğrulayın
- Controller loglarını kontrol edin:
logs/profiler-controller.log - Ağ bağlantısını doğrulayın
Bağlantı Reddedildi
Section titled “Bağlantı Reddedildi”Sorun: Agent controller’a bağlanamıyor
Çözüm:
- Controller host/port yapılandırmasını kontrol edin
- Ağ bağlantısını doğrulayın:
ping controller-host - HTTP endpoint’i test edin:
curl http://controller:9877/api/v1/status - Firewall kurallarını kontrol edin
Eski JVM’ler
Section titled “Eski JVM’ler”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>
En İyi Uygulamalar
Section titled “En İyi Uygulamalar”- Proje adları kullanın: Kolay tanımlama için
GALATAJ_PROJECTayarlayın - Paylaşımlı ağlar: Daha iyi izolasyon için Docker ağlarını kullanın
- Kaynak limitleri: Uygun bellek/CPU limitleri ayarlayın
- Health check’ler: Agent kaydını loglarda izleyin
- Etiketler: Filtreleme ve organizasyon için etiketler kullanın
Sonraki Adımlar
Section titled “Sonraki Adımlar”- IntelliJ entegrasyonu hakkında bilgi edinin
- CLI komutlarını keşfedin