Veröffentlicht am: 28. April 2026

7 Minuten Lesezeit

CI/CD-Observability im Unternehmensmaßstab aufbauen

Dieser Praxisleitfaden zu GitLab Pipeline Analytics hilft Self-Managed-Nutzern, mit Prometheus und Grafana operationale Insights zu gewinnen.

CI/CD-Optimierung beginnt mit Transparenz. Eine erfolgreiche DevOps-Plattform im Unternehmensmaßstab umfasst das Verständnis von Pipeline-Performance, Job-Ausführungsmustern und quantifizierbaren operationalen Insights – insbesondere für Unternehmen, die GitLab Self-Managed betreiben.

Um GitLab-Kund(inn)en dabei zu helfen, den vollen Nutzen ihrer Plattform auszuschöpfen, haben wir die GitLab CI/CD Observability-Lösung als Teil unseres Platform Excellence-Programms entwickelt. Sie verwandelt rohe Pipeline-Metriken in handlungsrelevante operationale Erkenntnisse.

Ein führendes Finanzdienstleistungsunternehmen hat gemeinsam mit GitLabs Customer Success Architect Transparenz über seine GitLab Self-Managed-Deployments gewonnen. Gemeinsam haben wir eine containerisierte Observability-Lösung implementiert, die den Open-Source-gitlab-ci-pipelines-exporter mit unternehmensgerechter Prometheus- und Grafana-Infrastruktur kombiniert.

In diesem Artikel werden die Herausforderungen beim Pipeline-Management im Unternehmensmaßstab erläutert – und wie GitLab CI/CD Observability diese mit einer praxisnahen End-to-End-Implementierung adressiert.

Die Herausforderung: CI/CD-Performance messen

Vor der Implementierung einer Observability-Lösung sollte die Messdimension klar definiert sein:

  • Welche Metriken sind relevant? Pipeline-Dauer, Job-Erfolgsraten, Queue-Zeiten, Runner-Auslastung
  • Wer braucht Transparenz? Entwickler(innen), DevOps-Engineers, Plattformteams, Führungsebene
  • Welche Entscheidungen werden damit getroffen? Infrastrukturinvestitionen, Engpass-Behebung, Kapazitätsplanung

Lösungsarchitektur: Ein vollständiges Dashboard-Set für Observability

Nach dem Deployment stellt der Observability-Stack ein Set von Grafana-Dashboards bereit, das Echtzeit- und historische Transparenz über die CI/CD-Plattform bietet. Ein typisches Deployment umfasst:

  • Pipeline Overview Dashboard: Eine übergeordnete Ansicht mit Gesamtzahl der Pipeline-Läufe, Erfolgs-/Fehlerquoten über die Zeit (als gestapelte Balken- oder Zeitreihencharts) und Trends bei der durchschnittlichen Pipeline-Dauer. Panels verwenden farbcodierte Statusindikatoren (Grün für Erfolg, Rot für Fehler, Gelb für Abbruch), damit Plattformteams Verschlechterungen auf einen Blick erkennen.
  • Job Performance Dashboard: Drill-down-Panels mit Verteilungen der einzelnen Job-Dauern (Histogramm), den 10 langsamsten Jobs nach Durchschnittsdauer und Job-Fehler-Heatmaps nach Projekt und Stage. Hier identifizieren Teams konkrete Engpass-Jobs, die sich zu optimieren lohnen.
  • Runner & Infrastructure Dashboard: Kombiniert Node-Exporter-Host-Metriken (CPU, Arbeitsspeicher, Disk) mit Pipeline-Queue-Zeit-Daten, um Infrastruktur-Sättigung mit Pipeline-Wartezeiten zu korrelieren. Nützlich für Kapazitätsplanungsentscheidungen wie die Skalierung von Runner-Pools oder das Upgrade von Instanzgrößen.
  • Deployment Frequency Dashboard: Verfolgt Deployment-Anzahl und -Dauer über die Zeit pro Umgebung, abgestimmt auf DORA-Metriken. Hilft der Engineering-Führungsebene, Lieferdurchsatz und Environment-Drift (Commits hinter main) zu bewerten.

Jedes Dashboard wird automatisch über Grafanas dateibasiertes Provisioning bereitgestellt, sodass es konsistent über alle Umgebungen hinweg deployed wird. Die Dashboards lassen sich über Grafana-Variablen weiter anpassen, um nach Projekt, Ref/Branch oder Zeitraum zu filtern.

Lösungsarchitektur

Die Lösung benötigt zwei Exporter:

  • Pipeline Exporter: Erfasst CI/CD-Metriken über die GitLab API (Pipeline-Dauer, Job-Status, Deployments)
  • Node Exporter: Erfasst Host-Metriken (CPU, Arbeitsspeicher, Disk) für die Infrastruktur-Korrelation

Voraussetzungen:

  • GitLab Self-Managed Version 18.1+
  • Container-Orchestrierungsplattform: Ein Kubernetes-Cluster (empfohlen für Unternehmens-Deployments) oder eine Container-Runtime wie Docker/Podman für kleinere Umgebungen oder Proof-of-Concept-Deployments. Die primäre Deployment-Anleitung unten zielt auf Kubernetes; eine Docker-Compose-Alternative ist im Anhang für lokales Testen und Evaluation verfügbar
  • GitLab Personal Access Token (Scope read_api)

Die vollständige Implementierungsanleitung mit allen Kubernetes-Manifesten folgt direkt im Anschluss.

Kubernetes-Deployment (empfohlen)

Für Unternehmensumgebungen wird jede Komponente als separates Deployment in einem dedizierten Namespace deployed. Dieser Ansatz integriert sich in bestehende Cluster-Infrastruktur, Secrets-Management und Network-Policies.

1. Namespace und Secret erstellen

      kubectl create namespace gitlab-observability

# GitLab-Token-Secret erstellen (siehe Abschnitt Secrets-Management
# für unternehmensgerechte Ansätze mit externen Secret-Operatoren)
kubectl create secret generic gitlab-token \
  --from-literal=token=glpat-xxxxxxxxxxxx \
  -n gitlab-observability

    

2. Pipeline Exporter deployen

      # exporter-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gitlab-ci-pipelines-exporter
  namespace: gitlab-observability
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gitlab-ci-pipelines-exporter
  template:
    metadata:
      labels:
        app: gitlab-ci-pipelines-exporter
    spec:
      containers:
        - name: exporter
          image: mvisonneau/gitlab-ci-pipelines-exporter:latest
          ports:
            - containerPort: 8080
          env:
            - name: GCPE_GITLAB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: gitlab-token
                  key: token
            - name: GCPE_CONFIG
              value: /etc/gcpe/config.yml
          volumeMounts:
            - name: config
              mountPath: /etc/gcpe
      volumes:
        - name: config
          configMap:
            name: gcpe-config
---
apiVersion: v1
kind: Service
metadata:
  name: gitlab-ci-pipelines-exporter
  namespace: gitlab-observability
spec:
  selector:
    app: gitlab-ci-pipelines-exporter
  ports:
    - port: 8080
      targetPort: 8080

    

3. Node Exporter deployen (DaemonSet)

      # node-exporter-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: gitlab-observability
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      containers:
        - name: node-exporter
          image: prom/node-exporter:latest
          ports:
            - containerPort: 9100
---
apiVersion: v1
kind: Service
metadata:
  name: node-exporter
  namespace: gitlab-observability
spec:
  selector:
    app: node-exporter
  ports:
    - port: 9100
      targetPort: 9100

    

4. Prometheus deployen

      # prometheus-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
  namespace: gitlab-observability
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
        - name: prometheus
          image: prom/prometheus:latest
          ports:
            - containerPort: 9090
          volumeMounts:
            - name: config
              mountPath: /etc/prometheus
      volumes:
        - name: config
          configMap:
            name: prometheus-config
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: gitlab-observability
spec:
  selector:
    app: prometheus
  ports:
    - port: 9090
      targetPort: 9090

    

5. Grafana deployen

Das folgende Grafana-Deployment startet mit deaktivierter Authentifizierung (GF_AUTH_ANONYMOUS_ENABLED: true) für den einfachen Einstieg.

Diese Einstellung erlaubt jedem mit Netzwerkzugang, alle Dashboards ohne Anmeldung einzusehen. Für Produktions-Deployments diese Variable entfernen oder auf false setzen und einen geeigneten Authentifizierungs-Provider (LDAP, SAML/SSO oder OAuth) konfigurieren, um den Zugriff auf autorisierte Nutzende zu beschränken.

      # grafana-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  namespace: gitlab-observability
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      containers:
        - name: grafana
          image: grafana/grafana:10.0.0
          ports:
            - containerPort: 3000
          env:
            # Für Produktion ENTFERNEN oder auf 'false' setzen.
            # Bei 'true' können alle Nutzenden mit Netzwerkzugang
            # Dashboards ohne Authentifizierung einsehen.
            - name: GF_AUTH_ANONYMOUS_ENABLED
              value: 'true'
          volumeMounts:
            - name: dashboards-provider
              mountPath: /etc/grafana/provisioning/dashboards
            - name: datasources
              mountPath: /etc/grafana/provisioning/datasources
            - name: dashboards
              mountPath: /var/lib/grafana/dashboards
      volumes:
        - name: dashboards-provider
          configMap:
            name: grafana-dashboards-provider
        - name: datasources
          configMap:
            name: grafana-datasources
        - name: dashboards
          configMap:
            name: grafana-dashboards
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: gitlab-observability
spec:
  selector:
    app: grafana
  ports:
    - port: 3000
      targetPort: 3000

    

6. Network Policy setzen

Den Inter-Pod-Traffic auf die erforderlichen Kommunikationspfade beschränken:

      # network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: observability-policy
  namespace: gitlab-observability
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    # Prometheus scrapt Exporter und Node-Exporter
    - from:
        - podSelector:
            matchLabels:
              app: prometheus
      ports:
        - port: 8080
        - port: 9100
    # Grafana fragt Prometheus ab
    - from:
        - podSelector:
            matchLabels:
              app: grafana
      ports:
        - port: 9090

    

7. Validieren

      kubectl get pods -n gitlab-observability
kubectl port-forward svc/grafana 3000:3000 -n gitlab-observability
curl http://localhost:3000/api/health

    

Konfigurationsreferenz

Exporter-Konfiguration

      # gitlab-ci-pipelines-exporter.yml (ConfigMap: gcpe-config)
log:
  level: info
gitlab:
  url: https://gitlab.your-domain.com
  maximum_requests_per_second: 10
project_defaults:
  pull:
    pipeline:
      jobs:
        enabled: true
wildcards:
  - owner:
      name: your-group-name
      kind: group
    archived: false

    

Prometheus-Konfiguration

      # prometheus.yml (ConfigMap: prometheus-config)
global:
  scrape_interval: 15s
scrape_configs:
  - job_name: 'gitlab-ci-pipelines-exporter'
    static_configs:
      - targets: ['gitlab-ci-pipelines-exporter:8080']
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['node-exporter:9100']

    

Grafana-Datenquellen

      # datasources.yml (ConfigMap: grafana-datasources)
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
# dashboards.yml (ConfigMap: grafana-dashboards-provider)
apiVersion: 1
providers:
  - name: 'default'
    folder: 'GitLab CI/CD'
    type: file
    options:
      path: /var/lib/grafana/dashboards

    

Wichtige Metriken

Pipeline-Exporter-Metriken

MetrikBeschreibung
gitlab_ci_pipeline_duration_secondsPipeline-Ausführungszeit
gitlab_ci_pipeline_statusPipeline-Erfolg/-Fehler nach Projekt
gitlab_ci_pipeline_job_duration_secondsEinzelne Job-Ausführungszeit
gitlab_ci_pipeline_job_statusJob-Erfolgs-/-Fehlerstatus
gitlab_ci_pipeline_job_artifact_size_bytesArtifact-Speicherverbrauch
gitlab_ci_pipeline_coverageCode-Coverage-Prozentsatz
gitlab_ci_environment_deployment_countDeployment-Häufigkeit
gitlab_ci_environment_deployment_duration_secondsDeployment-Ausführungszeit
gitlab_ci_environment_behind_commits_countEnvironment-Drift gegenüber main

Node-Exporter-Metriken

MetrikBeschreibung
node_cpu_seconds_totalCPU-Auslastung
node_memory_MemAvailable_bytesVerfügbarer Arbeitsspeicher
node_filesystem_avail_bytesVerfügbarer Festplattenspeicher
node_load11-Minuten-Lastdurchschnitt

Fehlerbehebung

Grafana-Plugin-Installation in Air-gapped-Umgebungen

Für Offline-Umgebungen Plugins manuell installieren. Beispiel für Kubernetes:

      # Plugin-ZIP in den Grafana-Pod kopieren
kubectl cp grafana-polystat-panel-2.1.16.zip \
  gitlab-observability/grafana-<pod-id>:/tmp/
# Plugin entpacken
kubectl exec -it -n gitlab-observability deploy/grafana -- \
  sh -c "unzip /tmp/grafana-polystat-panel-2.1.16.zip -d /var/lib/grafana/plugins/"
# Grafana-Pod neu starten
kubectl rollout restart deployment/grafana -n gitlab-observability
# Installation prüfen
kubectl exec -it -n gitlab-observability deploy/grafana -- \
  ls -al /var/lib/grafana/plugins/

    

Unternehmensaspekte

Für regulierte Branchen gilt:

  • Token-Sicherheit: GitLab Personal Access Tokens in einem dedizierten Secrets-Manager speichern, nicht hartcodiert in ConfigMaps. Token-Rotation durchsetzen und den Scope auf read_api beschränken.
  • Netzwerksegmentierung: Hinter einem Reverse Proxy mit TLS-Terminierung deployen. In Kubernetes einen Ingress-Controller mit automatisierter Zertifikatsbereitstellung verwenden.
  • Authentifizierung: Grafana mit dem Identity Provider der Organisation konfigurieren (SAML, LDAP oder OAuth/OIDC), um rollenbasierte Zugriffskontrolle auf Dashboards durchzusetzen.

Warum GitLab?

GitLabs API-First-Design ermöglicht individuelle Observability-Lösungen, die native Funktionen wie Value Stream Analytics und DORA-Metriken ergänzen. Die offene Architektur erlaubt es Unternehmen, bewährte Open-Source-Werkzeuge – wie den gitlab-ci-pipelines-exporter – direkt in bestehende Unternehmensinfrastruktur zu integrieren, ohne etablierte Workflows zu unterbrechen.

Mit wachsender Observability-Reife bieten GitLabs eingebaute Observability-Funktionen einen natürlichen nächsten Schritt – tiefere, integrierte Transparenz ohne zusätzliche Werkzeuge. Mehr zu den nativen Plattformfunktionen unter GitLab Observability.

Feedback erwünscht

Dieser Blogbeitrag hat gefallen oder es gibt Fragen oder Feedback? Ein neues Diskussionsthema im GitLab-Community-Forum erstellen und Eindrücke austauschen.

Feedback teilen

Beginne noch heute, schneller zu entwickeln

Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.