- Java 99.2%
- Dockerfile 0.8%
| gradle/wrapper | ||
| src/main | ||
| .gitignore | ||
| build.gradle | ||
| Dockerfile | ||
| gradlew | ||
| gradlew.bat | ||
| README.md | ||
| settings.gradle | ||
dacapo2cbio
Dies ist der Programmcode einer ETL-Strecke, die ich im Rahmen meines Abschlussprojekts an der Unimedizin Mainz erstellt habe. Standortspezifische Dateien und Konfigurationen wie bspw. CI und Proxy sowie Namen wurden entfernt.
Deployment
Konfiguration
Die Konfiguration der Anwendung erfolgt über eine zentrale Konfigurationsdatei: "application.yaml" oder über Umgebungsvariablen.
Umgebungsvariablen werden komplett groß geschrieben und verwenden "_" statt ".". Bei Verwendung einer Engine mit Unterstützung
für Secrets (Bspw. Podman oder Kubernetes) sollte das Bearer-Token als Secret über eine Umgebungsvariable gesetzt werden.
Die wichtigsten Werte werden in der folgenden Tabelle erläutert. Weitere Werte finden sich in der Spring Batch Dokumentation.
Pflicht-Werte sind fett markiert. Für alle weiteren Werte werden bei Nicht-Setzen getestete Standards verwendet,
die unter /src/main/resources/application.yml gesetzt sind.
| Key | Funktion |
|---|---|
| spring.application.name | Name der Instanz |
| logging.level.ROOT | Logging Level der Instanz |
| batch.chunkSize | Größe der chunks (Anzahl der Datensätze, die in einem Batch transferiert werden) |
| dacapo.cert | Pfad des CA-Zertifikats |
| dacapo.api | URL der DaCapo-API |
| dacapo.bearer | Bearer-Token der DaCapo-Api |
| dacapo.since | lädt nur Daten mit Änderung nach diesem Daten. Bei Fehlen Fullload |
Monitoring
| Key | Funktion |
|---|---|
| management.prometheus.metrics.export.pushgateway.enabled | Aktiviert das Senden von Metriken an ein Prometheus-Pushgateway |
| management.prometheus.metrics.export.pushgateway.address | Addresse des Prometheus-Pushgateways |
Run
# with Podman (recommended)
podman run \
--volume /path/to/ca.crt:/config/ca.crt \
--volume ./application.yml:/config/application.yml \
--volume ./projects/:/tmp/ \
dacapo2cbio:latest
# with docker
docker run \
--volume /path/to/ca.crt:/config/ca.crt \
--volume ./application.yml:/config/application.yml \
--volume ./projects/:/tmp/ \
dacapo2cbio:latest
Schedule
Für die geplante regelmäßige Ausführung gibt es mehrere Optionen:
- cron
- systemd-timer
- kubernetes-scheduler
Je nach Engine wird die Nutzung des Kubernetes-Schedulers oder des Systemd-Timers empfohlen.
systemd
Diese Methode setzt das Vorhandensein eines systemd-Service vom Typ oneshot voraus und empfiehlt sich besonders in Kombination mit Podman Qadlet. Ein solcher Service kann aber auch für docker erstellt werden. Eine Anleitung zum Erstellen des Service befindet sich in der Dokumentation für Podman Qadlet und in der Dokumentation für systemd.
Für den Timer muss folgende Datei unter /etc/systemd/system/name_des_service.timer erstellt werden (bei rootless Pfad anpassen).
[Unit]
Description=Beispiel fuer einen dacapo2cbio-Timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
Dieser Timer wird täglich um 2 Uhr ausgeführt. Wurde eine Ausführung verpasst, wird sie nachgeholt.
# neu einlesen des Timers
sudo systemctl daemon-reload
# aktivieren des Timers
sudo systemctl enable --now name_des_service.timer
# deaktivieren des Timers
sudo systemctl disable --now name_des_service
# anzeigen von Status und Logs
systemctl status name_des_service.timer
systemctl status name_des_service
journalctl -xeu name_des_service
cronjob (empfohlen mit Kubernetes)
In Kubernetes kann ein CronJob über die API batch/v1 erstellt werden. Es wird die deklarative Konfiguration über YAML empfohlen.
Eine Beispiel:
apiVersion: batch/v1
kind: CronJob
metadata:
name: "dacapo2cbio"
namespace: "example"
spec:
schedule: "0 2 * * *"
suspend: false
concurrencyPolicy: Forbid
failedJobsHistoryLimit: 5
successfulJobsHistoryLimit: 2
startingDeadlineSeconds: 300
jobTemplate:
spec:
backoffLimit: 0
parallelism: 1
completions: 1
template:
spec:
restartPolicy: Never
containers:
- name: dacapo2cbio
image: dacapo2cbio:latest
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "500Mi"
cpu: "100m"
limits:
memory: "2000Mi"
cpu: "500m"
envFrom:
- secretRef:
name: dacapo-bearer
volumeMounts:
- name: ca
mountPath: /config
subPath: ca.crt
- name: spring-application-config
mountPath: /config
subPath: application.yaml
volumes:
- name: ca
configMap:
name: klinik-ca
- name: spring-application-config
configMap:
name: sap2diz-base