Date de publication : 18 mai 2026
Temps de lecture : 11 min
Ce guide pratique consacré à l'analyse des pipelines GitLab aide les utilisateurs de GitLab Self-Managed à obtenir des indicateurs opérationnels exploitables grâce à Prometheus et Grafana.

L'optimisation du CI/CD commence par la visibilité. Pour bâtir une plateforme DevOps performante à l'échelle de l'entreprise, il est essentiel de comprendre les performances des pipelines et les schémas d'exécution des jobs, ainsi que de disposer d'indicateurs opérationnels quantifiables, en particulier pour les organisations qui exploitent des instances GitLab Self-Managed.
Afin d'aider les clients GitLab à maximiser leur investissement dans la plateforme, nous avons développé la solution GitLab CI/CD Observability dans le cadre de notre programme Platform Excellence. Celle-ci transforme les indicateurs bruts des pipelines en informations opérationnelles exploitables.
Un acteur majeur du secteur des services financiers s'est associé au Customer Success Architect GitLab pour gagner en visibilité sur son déploiement GitLab Self-Managed. Ensemble, nous avons mis en œuvre une solution d'observabilité conteneurisée combinant l'outil open source gitlab-ci-pipelines-exporter avec une infrastructure Prometheus et Grafana de niveau entreprise.
Dans cet article, vous découvrirez les défis rencontrés par cette organisation dans la gestion de ses pipelines à grande échelle, ainsi que la manière dont la solution GitLab CI/CD Observability y a répondu grâce à une mise en œuvre pratique de bout en bout.
Avant de mettre en place une solution d'observabilité, il est essentiel de définir vos paramètres de mesure :
Une fois déployée, la pile d'observabilité fournit un ensemble de tableaux de bord Grafana avec une visibilité en temps réel et historique sur votre plateforme CI/CD. Un déploiement type comprend les éléments suivants :
Chaque tableau de bord est provisionné automatiquement via le provisionnement par fichier de Grafana, ce qui garantit un déploiement cohérent d'un environnement à l'autre. Les tableaux de bord peuvent être personnalisés davantage grâce aux variables Grafana pour filtrer par projet, branche de référence ou plage temporelle.

La solution nécessite deux exporters :
Prérequis :
Pour les environnements d'entreprise, déployez chaque composant sous forme de déploiement distinct au sein d'un espace de nommage dédié. Cette approche s'intègre à l'infrastructure de cluster existante, à la gestion des secrets et aux politiques réseau.
kubectl create namespace gitlab-observability
# Create the GitLab token secret (see Secrets Management section below
# for enterprise-grade approaches using external secret operators)
kubectl create secret generic gitlab-token \
--from-literal=token=glpat-xxxxxxxxxxxx \
-n gitlab-observability
# 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
# 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
# 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
Le déploiement Grafana ci-dessous démarre avec l'authentification désactivée (GF_AUTH_ANONYMOUS_ENABLED: true) pour faciliter la configuration initiale.
Ce paramètre permet à toute personne ayant accès au réseau de consulter l'ensemble des tableaux de bord sans s'authentifier. Pour les déploiements en production, supprimez cette variable ou définissez-la sur « false » et configurez un fournisseur d'authentification approprié (LDAP, SAML/SSO ou OAuth) afin de restreindre l'accès aux utilisateurs autorisés.
# 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:
# REMOVE or set to 'false' for production.
# When 'true', any user with network access can
# view dashboards without authentication.
- 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
Restreignez le trafic entre pods aux seuls chemins de communication nécessaires :
# network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: observability-policy
namespace: gitlab-observability
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
# Prometheus scrapes exporter and node-exporter
- from:
- podSelector:
matchLabels:
app: prometheus
ports:
- port: 8080
- port: 9100
# Grafana queries Prometheus
- from:
- podSelector:
matchLabels:
app: grafana
ports:
- port: 9090
kubectl get pods -n gitlab-observability
kubectl port-forward svc/grafana 3000:3000 -n gitlab-observability
curl http://localhost:3000/api/health
# 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.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']
# 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
| Indicateur | Description |
|---|---|
gitlab_ci_pipeline_duration_seconds | Durée d'exécution du pipeline |
gitlab_ci_pipeline_status | Réussite/échec du pipeline par projet |
gitlab_ci_pipeline_job_duration_seconds | Durée d'exécution de chaque job |
gitlab_ci_pipeline_job_status | Statut de réussite/d'échec du job |
gitlab_ci_pipeline_job_artifact_size_bytes | Consommation de stockage des artefacts |
gitlab_ci_pipeline_coverage | Pourcentage de couverture de code |
gitlab_ci_environment_deployment_count | Fréquence de déploiement |
gitlab_ci_environment_deployment_duration_seconds | Durée d'exécution du déploiement |
gitlab_ci_environment_behind_commits_count | Dérive de l'environnement par rapport à la branche principale |
| Indicateur | Description |
|---|---|
node_cpu_seconds_total | Utilisation du processeur |
node_memory_MemAvailable_bytes | Mémoire disponible |
node_filesystem_avail_bytes | Espace disque disponible |
node_load1 | Charge moyenne sur 1 minute |
Pour les environnements hors ligne, installez les plugins manuellement. Exemple pour Kubernetes :
# Copy plugin zip into the Grafana pod
kubectl cp grafana-polystat-panel-2.1.16.zip \
gitlab-observability/grafana-<pod-id>:/tmp/
# Extract plugin
kubectl exec -it -n gitlab-observability deploy/grafana -- \
sh -c "unzip /tmp/grafana-polystat-panel-2.1.16.zip -d /var/lib/grafana/plugins/"
# Restart Grafana pod
kubectl rollout restart deployment/grafana -n gitlab-observability
# Verify installation
kubectl exec -it -n gitlab-observability deploy/grafana -- \
ls -al /var/lib/grafana/plugins/
Pour les secteurs réglementés, veillez à respecter les points suivants :
Le design axé sur les API de GitLab permet de créer des solutions d'observabilité personnalisées qui complètent les fonctionnalités natives telles que l'analyse du flux de valeur et les métriques DORA. L'architecture ouverte permet aux organisations d'intégrer des outils open source éprouvés, comme gitlab-ci-pipelines-exporter, directement dans leur infrastructure d'entreprise existante, sans perturber les workflows établis.
À mesure que votre maturité en matière d'observabilité progresse, les fonctionnalités intégrées de GitLab Observability constituent une prochaine étape naturelle, car elles offrent une visibilité plus approfondie et intégrée sans outils supplémentaires. Découvrez les capacités disponibles nativement dans la plateforme pour GitLab Observability.
Cet article de blog vous a plu ? Vous avez des questions ou des retours à nous faire ? Donnez votre avis en créant un nouveau sujet sur le forum de la communauté GitLab.
Faites-nous part de vos commentaires