[{"data":1,"prerenderedAt":3546},["ShallowReactive",2],{"/de-de/blog/how-to-build-ci-cd-observability-at-scale":3,"navigation-de-de":2777,"banner-de-de":3195,"footer-de-de":3204,"blog-post-authors-de-de-Paul Meresanu":3443,"blog-related-posts-de-de-how-to-build-ci-cd-observability-at-scale":3458,"blog-promotions-de-de":3484,"next-steps-de-de":3536},{"id":4,"title":5,"authors":6,"body":8,"category":2757,"date":2758,"description":2759,"extension":2760,"externalUrl":2761,"featured":2762,"heroImage":2763,"meta":2764,"navigation":187,"path":2765,"seo":2766,"slug":2769,"stem":2770,"tags":2771,"template":2775,"updatedDate":2761,"__hash__":2776},"blogPosts/de-de/blog/how-to-build-ci-cd-observability-at-scale.md","CI/CD-Observability im Unternehmensmaßstab aufbauen",[7],"Paul Meresanu",{"type":9,"value":10,"toc":2730},"minimark",[11,15,18,21,24,29,32,55,59,62,88,91,98,101,115,120,138,141,145,148,153,238,242,702,706,942,946,1245,1249,1256,1262,1701,1705,1708,1911,1915,1960,1964,1968,2107,2111,2211,2215,2355,2359,2363,2474,2478,2530,2534,2538,2541,2679,2683,2686,2709,2713,2716,2726],[12,13,14],"p",{},"CI/CD-Optimierung beginnt mit Transparenz. Eine erfolgreiche DevOps-Plattform\nim Unternehmensmaßstab umfasst das Verständnis von Pipeline-Performance,\nJob-Ausführungsmustern und quantifizierbaren operationalen Insights – insbesondere\nfür Unternehmen, die GitLab Self-Managed betreiben.",[12,16,17],{},"Um GitLab-Kund(inn)en dabei zu helfen, den vollen Nutzen ihrer Plattform\nauszuschöpfen, haben wir die GitLab CI/CD Observability-Lösung als Teil unseres\nPlatform Excellence-Programms entwickelt. Sie verwandelt rohe Pipeline-Metriken\nin handlungsrelevante operationale Erkenntnisse.",[12,19,20],{},"Ein führendes Finanzdienstleistungsunternehmen hat gemeinsam mit GitLabs Customer\nSuccess Architect Transparenz über seine GitLab Self-Managed-Deployments\ngewonnen. Gemeinsam haben wir eine containerisierte Observability-Lösung\nimplementiert, die den Open-Source-gitlab-ci-pipelines-exporter mit\nunternehmensgerechter Prometheus- und Grafana-Infrastruktur kombiniert.",[12,22,23],{},"In diesem Artikel werden die Herausforderungen beim Pipeline-Management im\nUnternehmensmaßstab erläutert – und wie GitLab CI/CD Observability diese mit\neiner praxisnahen End-to-End-Implementierung adressiert.",[25,26,28],"h2",{"id":27},"die-herausforderung-cicd-performance-messen","Die Herausforderung: CI/CD-Performance messen",[12,30,31],{},"Vor der Implementierung einer Observability-Lösung sollte die\nMessdimension klar definiert sein:",[33,34,35,43,49],"ul",{},[36,37,38,42],"li",{},[39,40,41],"strong",{},"Welche Metriken sind relevant?"," Pipeline-Dauer, Job-Erfolgsraten,\nQueue-Zeiten, Runner-Auslastung",[36,44,45,48],{},[39,46,47],{},"Wer braucht Transparenz?"," Entwickler(innen), DevOps-Engineers,\nPlattformteams, Führungsebene",[36,50,51,54],{},[39,52,53],{},"Welche Entscheidungen werden damit getroffen?"," Infrastrukturinvestitionen,\nEngpass-Behebung, Kapazitätsplanung",[25,56,58],{"id":57},"lösungsarchitektur-ein-vollständiges-dashboard-set-für-observability","Lösungsarchitektur: Ein vollständiges Dashboard-Set für Observability",[12,60,61],{},"Nach dem Deployment stellt der Observability-Stack ein Set von\nGrafana-Dashboards bereit, das Echtzeit- und historische Transparenz über die\nCI/CD-Plattform bietet. Ein typisches Deployment umfasst:",[33,63,64,70,76,82],{},[36,65,66,69],{},[39,67,68],{},"Pipeline Overview Dashboard:"," Eine übergeordnete Ansicht mit Gesamtzahl\nder Pipeline-Läufe, Erfolgs-/Fehlerquoten über die Zeit (als gestapelte\nBalken- oder Zeitreihencharts) und Trends bei der durchschnittlichen\nPipeline-Dauer. Panels verwenden farbcodierte Statusindikatoren (Grün für\nErfolg, Rot für Fehler, Gelb für Abbruch), damit Plattformteams\nVerschlechterungen auf einen Blick erkennen.",[36,71,72,75],{},[39,73,74],{},"Job Performance Dashboard:"," Drill-down-Panels mit Verteilungen der\neinzelnen Job-Dauern (Histogramm), den 10 langsamsten Jobs nach\nDurchschnittsdauer und Job-Fehler-Heatmaps nach Projekt und Stage. Hier\nidentifizieren Teams konkrete Engpass-Jobs, die sich zu optimieren lohnen.",[36,77,78,81],{},[39,79,80],{},"Runner & Infrastructure Dashboard:"," Kombiniert Node-Exporter-Host-Metriken\n(CPU, Arbeitsspeicher, Disk) mit Pipeline-Queue-Zeit-Daten, um\nInfrastruktur-Sättigung mit Pipeline-Wartezeiten zu korrelieren. Nützlich\nfür Kapazitätsplanungsentscheidungen wie die Skalierung von Runner-Pools oder\ndas Upgrade von Instanzgrößen.",[36,83,84,87],{},[39,85,86],{},"Deployment Frequency Dashboard:"," Verfolgt Deployment-Anzahl und\n-Dauer über die Zeit pro Umgebung, abgestimmt auf DORA-Metriken. Hilft\nder Engineering-Führungsebene, Lieferdurchsatz und Environment-Drift\n(Commits hinter main) zu bewerten.",[12,89,90],{},"Jedes Dashboard wird automatisch über Grafanas dateibasiertes Provisioning\nbereitgestellt, sodass es konsistent über alle Umgebungen hinweg deployed wird.\nDie Dashboards lassen sich über Grafana-Variablen weiter anpassen, um nach\nProjekt, Ref/Branch oder Zeitraum zu filtern.",[12,92,93],{},[94,95],"img",{"alt":96,"src":97},"Lösungsarchitektur","https://res.cloudinary.com/about-gitlab-com/image/upload/v1777382608/Blog/Imported/blog-building-ci-cd-observability-stack-for-gitlab-self-managed/image1.png",[12,99,100],{},"Die Lösung benötigt zwei Exporter:",[33,102,103,109],{},[36,104,105,108],{},[39,106,107],{},"Pipeline Exporter:"," Erfasst CI/CD-Metriken über die GitLab API\n(Pipeline-Dauer, Job-Status, Deployments)",[36,110,111,114],{},[39,112,113],{},"Node Exporter:"," Erfasst Host-Metriken (CPU, Arbeitsspeicher, Disk)\nfür die Infrastruktur-Korrelation",[12,116,117],{},[39,118,119],{},"Voraussetzungen:",[33,121,122,125,131],{},[36,123,124],{},"GitLab Self-Managed Version 18.1+",[36,126,127,130],{},[39,128,129],{},"Container-Orchestrierungsplattform:"," Ein Kubernetes-Cluster (empfohlen\nfür Unternehmens-Deployments) oder eine Container-Runtime wie Docker/Podman\nfür kleinere Umgebungen oder Proof-of-Concept-Deployments. Die primäre\nDeployment-Anleitung unten zielt auf Kubernetes; eine Docker-Compose-Alternative\nist im Anhang für lokales Testen und Evaluation verfügbar",[36,132,133,134,137],{},"GitLab Personal Access Token (Scope ",[39,135,136],{},"read_api",")",[12,139,140],{},"Die vollständige Implementierungsanleitung mit allen Kubernetes-Manifesten\nfolgt direkt im Anschluss.",[25,142,144],{"id":143},"kubernetes-deployment-empfohlen","Kubernetes-Deployment (empfohlen)",[12,146,147],{},"Für Unternehmensumgebungen wird jede Komponente als separates Deployment in\neinem dedizierten Namespace deployed. Dieser Ansatz integriert sich in\nbestehende Cluster-Infrastruktur, Secrets-Management und Network-Policies.",[149,150,152],"h3",{"id":151},"_1-namespace-und-secret-erstellen","1. Namespace und Secret erstellen",[154,155,160],"pre",{"className":156,"code":157,"language":158,"meta":159,"style":159},"language-bash shiki shiki-themes github-light","kubectl create namespace gitlab-observability\n\n# GitLab-Token-Secret erstellen (siehe Abschnitt Secrets-Management\n# für unternehmensgerechte Ansätze mit externen Secret-Operatoren)\nkubectl create secret generic gitlab-token \\\n  --from-literal=token=glpat-xxxxxxxxxxxx \\\n  -n gitlab-observability\n","bash","",[161,162,163,182,189,196,202,222,230],"code",{"__ignoreMap":159},[164,165,168,172,176,179],"span",{"class":166,"line":167},"line",1,[164,169,171],{"class":170},"s7eDp","kubectl",[164,173,175],{"class":174},"sYBdl"," create",[164,177,178],{"class":174}," namespace",[164,180,181],{"class":174}," gitlab-observability\n",[164,183,185],{"class":166,"line":184},2,[164,186,188],{"emptyLinePlaceholder":187},true,"\n",[164,190,192],{"class":166,"line":191},3,[164,193,195],{"class":194},"sAwPA","# GitLab-Token-Secret erstellen (siehe Abschnitt Secrets-Management\n",[164,197,199],{"class":166,"line":198},4,[164,200,201],{"class":194},"# für unternehmensgerechte Ansätze mit externen Secret-Operatoren)\n",[164,203,205,207,209,212,215,218],{"class":166,"line":204},5,[164,206,171],{"class":170},[164,208,175],{"class":174},[164,210,211],{"class":174}," secret",[164,213,214],{"class":174}," generic",[164,216,217],{"class":174}," gitlab-token",[164,219,221],{"class":220},"sYu0t"," \\\n",[164,223,225,228],{"class":166,"line":224},6,[164,226,227],{"class":220},"  --from-literal=token=glpat-xxxxxxxxxxxx",[164,229,221],{"class":220},[164,231,233,236],{"class":166,"line":232},7,[164,234,235],{"class":220},"  -n",[164,237,181],{"class":174},[149,239,241],{"id":240},"_2-pipeline-exporter-deployen","2. Pipeline Exporter deployen",[154,243,247],{"className":244,"code":245,"language":246,"meta":159,"style":159},"language-yaml shiki shiki-themes github-light","# exporter-deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: gitlab-ci-pipelines-exporter\n  namespace: gitlab-observability\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: gitlab-ci-pipelines-exporter\n  template:\n    metadata:\n      labels:\n        app: gitlab-ci-pipelines-exporter\n    spec:\n      containers:\n        - name: exporter\n          image: mvisonneau/gitlab-ci-pipelines-exporter:latest\n          ports:\n            - containerPort: 8080\n          env:\n            - name: GCPE_GITLAB_TOKEN\n              valueFrom:\n                secretKeyRef:\n                  name: gitlab-token\n                  key: token\n            - name: GCPE_CONFIG\n              value: /etc/gcpe/config.yml\n          volumeMounts:\n            - name: config\n              mountPath: /etc/gcpe\n      volumes:\n        - name: config\n          configMap:\n            name: gcpe-config\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: gitlab-ci-pipelines-exporter\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: gitlab-ci-pipelines-exporter\n  ports:\n    - port: 8080\n      targetPort: 8080\n","yaml",[161,248,249,254,267,277,285,295,305,312,323,331,339,349,357,365,373,383,391,399,413,424,432,446,454,466,474,482,493,504,516,527,535,547,558,566,577,585,596,602,612,622,629,638,647,654,661,671,679,692],{"__ignoreMap":159},[164,250,251],{"class":166,"line":167},[164,252,253],{"class":194},"# exporter-deployment.yaml\n",[164,255,256,260,264],{"class":166,"line":184},[164,257,259],{"class":258},"shJU0","apiVersion",[164,261,263],{"class":262},"sgsFI",": ",[164,265,266],{"class":174},"apps/v1\n",[164,268,269,272,274],{"class":166,"line":191},[164,270,271],{"class":258},"kind",[164,273,263],{"class":262},[164,275,276],{"class":174},"Deployment\n",[164,278,279,282],{"class":166,"line":198},[164,280,281],{"class":258},"metadata",[164,283,284],{"class":262},":\n",[164,286,287,290,292],{"class":166,"line":204},[164,288,289],{"class":258},"  name",[164,291,263],{"class":262},[164,293,294],{"class":174},"gitlab-ci-pipelines-exporter\n",[164,296,297,300,302],{"class":166,"line":224},[164,298,299],{"class":258},"  namespace",[164,301,263],{"class":262},[164,303,304],{"class":174},"gitlab-observability\n",[164,306,307,310],{"class":166,"line":232},[164,308,309],{"class":258},"spec",[164,311,284],{"class":262},[164,313,315,318,320],{"class":166,"line":314},8,[164,316,317],{"class":258},"  replicas",[164,319,263],{"class":262},[164,321,322],{"class":220},"1\n",[164,324,326,329],{"class":166,"line":325},9,[164,327,328],{"class":258},"  selector",[164,330,284],{"class":262},[164,332,334,337],{"class":166,"line":333},10,[164,335,336],{"class":258},"    matchLabels",[164,338,284],{"class":262},[164,340,342,345,347],{"class":166,"line":341},11,[164,343,344],{"class":258},"      app",[164,346,263],{"class":262},[164,348,294],{"class":174},[164,350,352,355],{"class":166,"line":351},12,[164,353,354],{"class":258},"  template",[164,356,284],{"class":262},[164,358,360,363],{"class":166,"line":359},13,[164,361,362],{"class":258},"    metadata",[164,364,284],{"class":262},[164,366,368,371],{"class":166,"line":367},14,[164,369,370],{"class":258},"      labels",[164,372,284],{"class":262},[164,374,376,379,381],{"class":166,"line":375},15,[164,377,378],{"class":258},"        app",[164,380,263],{"class":262},[164,382,294],{"class":174},[164,384,386,389],{"class":166,"line":385},16,[164,387,388],{"class":258},"    spec",[164,390,284],{"class":262},[164,392,394,397],{"class":166,"line":393},17,[164,395,396],{"class":258},"      containers",[164,398,284],{"class":262},[164,400,402,405,408,410],{"class":166,"line":401},18,[164,403,404],{"class":262},"        - ",[164,406,407],{"class":258},"name",[164,409,263],{"class":262},[164,411,412],{"class":174},"exporter\n",[164,414,416,419,421],{"class":166,"line":415},19,[164,417,418],{"class":258},"          image",[164,420,263],{"class":262},[164,422,423],{"class":174},"mvisonneau/gitlab-ci-pipelines-exporter:latest\n",[164,425,427,430],{"class":166,"line":426},20,[164,428,429],{"class":258},"          ports",[164,431,284],{"class":262},[164,433,435,438,441,443],{"class":166,"line":434},21,[164,436,437],{"class":262},"            - ",[164,439,440],{"class":258},"containerPort",[164,442,263],{"class":262},[164,444,445],{"class":220},"8080\n",[164,447,449,452],{"class":166,"line":448},22,[164,450,451],{"class":258},"          env",[164,453,284],{"class":262},[164,455,457,459,461,463],{"class":166,"line":456},23,[164,458,437],{"class":262},[164,460,407],{"class":258},[164,462,263],{"class":262},[164,464,465],{"class":174},"GCPE_GITLAB_TOKEN\n",[164,467,469,472],{"class":166,"line":468},24,[164,470,471],{"class":258},"              valueFrom",[164,473,284],{"class":262},[164,475,477,480],{"class":166,"line":476},25,[164,478,479],{"class":258},"                secretKeyRef",[164,481,284],{"class":262},[164,483,485,488,490],{"class":166,"line":484},26,[164,486,487],{"class":258},"                  name",[164,489,263],{"class":262},[164,491,492],{"class":174},"gitlab-token\n",[164,494,496,499,501],{"class":166,"line":495},27,[164,497,498],{"class":258},"                  key",[164,500,263],{"class":262},[164,502,503],{"class":174},"token\n",[164,505,507,509,511,513],{"class":166,"line":506},28,[164,508,437],{"class":262},[164,510,407],{"class":258},[164,512,263],{"class":262},[164,514,515],{"class":174},"GCPE_CONFIG\n",[164,517,519,522,524],{"class":166,"line":518},29,[164,520,521],{"class":258},"              value",[164,523,263],{"class":262},[164,525,526],{"class":174},"/etc/gcpe/config.yml\n",[164,528,530,533],{"class":166,"line":529},30,[164,531,532],{"class":258},"          volumeMounts",[164,534,284],{"class":262},[164,536,538,540,542,544],{"class":166,"line":537},31,[164,539,437],{"class":262},[164,541,407],{"class":258},[164,543,263],{"class":262},[164,545,546],{"class":174},"config\n",[164,548,550,553,555],{"class":166,"line":549},32,[164,551,552],{"class":258},"              mountPath",[164,554,263],{"class":262},[164,556,557],{"class":174},"/etc/gcpe\n",[164,559,561,564],{"class":166,"line":560},33,[164,562,563],{"class":258},"      volumes",[164,565,284],{"class":262},[164,567,569,571,573,575],{"class":166,"line":568},34,[164,570,404],{"class":262},[164,572,407],{"class":258},[164,574,263],{"class":262},[164,576,546],{"class":174},[164,578,580,583],{"class":166,"line":579},35,[164,581,582],{"class":258},"          configMap",[164,584,284],{"class":262},[164,586,588,591,593],{"class":166,"line":587},36,[164,589,590],{"class":258},"            name",[164,592,263],{"class":262},[164,594,595],{"class":174},"gcpe-config\n",[164,597,599],{"class":166,"line":598},37,[164,600,601],{"class":170},"---\n",[164,603,605,607,609],{"class":166,"line":604},38,[164,606,259],{"class":258},[164,608,263],{"class":262},[164,610,611],{"class":174},"v1\n",[164,613,615,617,619],{"class":166,"line":614},39,[164,616,271],{"class":258},[164,618,263],{"class":262},[164,620,621],{"class":174},"Service\n",[164,623,625,627],{"class":166,"line":624},40,[164,626,281],{"class":258},[164,628,284],{"class":262},[164,630,632,634,636],{"class":166,"line":631},41,[164,633,289],{"class":258},[164,635,263],{"class":262},[164,637,294],{"class":174},[164,639,641,643,645],{"class":166,"line":640},42,[164,642,299],{"class":258},[164,644,263],{"class":262},[164,646,304],{"class":174},[164,648,650,652],{"class":166,"line":649},43,[164,651,309],{"class":258},[164,653,284],{"class":262},[164,655,657,659],{"class":166,"line":656},44,[164,658,328],{"class":258},[164,660,284],{"class":262},[164,662,664,667,669],{"class":166,"line":663},45,[164,665,666],{"class":258},"    app",[164,668,263],{"class":262},[164,670,294],{"class":174},[164,672,674,677],{"class":166,"line":673},46,[164,675,676],{"class":258},"  ports",[164,678,284],{"class":262},[164,680,682,685,688,690],{"class":166,"line":681},47,[164,683,684],{"class":262},"    - ",[164,686,687],{"class":258},"port",[164,689,263],{"class":262},[164,691,445],{"class":220},[164,693,695,698,700],{"class":166,"line":694},48,[164,696,697],{"class":258},"      targetPort",[164,699,263],{"class":262},[164,701,445],{"class":220},[149,703,705],{"id":704},"_3-node-exporter-deployen-daemonset","3. Node Exporter deployen (DaemonSet)",[154,707,709],{"className":244,"code":708,"language":246,"meta":159,"style":159},"# node-exporter-daemonset.yaml\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: node-exporter\n  namespace: gitlab-observability\nspec:\n  selector:\n    matchLabels:\n      app: node-exporter\n  template:\n    metadata:\n      labels:\n        app: node-exporter\n    spec:\n      containers:\n        - name: node-exporter\n          image: prom/node-exporter:latest\n          ports:\n            - containerPort: 9100\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: node-exporter\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: node-exporter\n  ports:\n    - port: 9100\n      targetPort: 9100\n",[161,710,711,716,724,733,739,748,756,762,768,774,782,788,794,800,808,814,820,830,839,845,856,860,868,876,882,890,898,904,910,918,924,934],{"__ignoreMap":159},[164,712,713],{"class":166,"line":167},[164,714,715],{"class":194},"# node-exporter-daemonset.yaml\n",[164,717,718,720,722],{"class":166,"line":184},[164,719,259],{"class":258},[164,721,263],{"class":262},[164,723,266],{"class":174},[164,725,726,728,730],{"class":166,"line":191},[164,727,271],{"class":258},[164,729,263],{"class":262},[164,731,732],{"class":174},"DaemonSet\n",[164,734,735,737],{"class":166,"line":198},[164,736,281],{"class":258},[164,738,284],{"class":262},[164,740,741,743,745],{"class":166,"line":204},[164,742,289],{"class":258},[164,744,263],{"class":262},[164,746,747],{"class":174},"node-exporter\n",[164,749,750,752,754],{"class":166,"line":224},[164,751,299],{"class":258},[164,753,263],{"class":262},[164,755,304],{"class":174},[164,757,758,760],{"class":166,"line":232},[164,759,309],{"class":258},[164,761,284],{"class":262},[164,763,764,766],{"class":166,"line":314},[164,765,328],{"class":258},[164,767,284],{"class":262},[164,769,770,772],{"class":166,"line":325},[164,771,336],{"class":258},[164,773,284],{"class":262},[164,775,776,778,780],{"class":166,"line":333},[164,777,344],{"class":258},[164,779,263],{"class":262},[164,781,747],{"class":174},[164,783,784,786],{"class":166,"line":341},[164,785,354],{"class":258},[164,787,284],{"class":262},[164,789,790,792],{"class":166,"line":351},[164,791,362],{"class":258},[164,793,284],{"class":262},[164,795,796,798],{"class":166,"line":359},[164,797,370],{"class":258},[164,799,284],{"class":262},[164,801,802,804,806],{"class":166,"line":367},[164,803,378],{"class":258},[164,805,263],{"class":262},[164,807,747],{"class":174},[164,809,810,812],{"class":166,"line":375},[164,811,388],{"class":258},[164,813,284],{"class":262},[164,815,816,818],{"class":166,"line":385},[164,817,396],{"class":258},[164,819,284],{"class":262},[164,821,822,824,826,828],{"class":166,"line":393},[164,823,404],{"class":262},[164,825,407],{"class":258},[164,827,263],{"class":262},[164,829,747],{"class":174},[164,831,832,834,836],{"class":166,"line":401},[164,833,418],{"class":258},[164,835,263],{"class":262},[164,837,838],{"class":174},"prom/node-exporter:latest\n",[164,840,841,843],{"class":166,"line":415},[164,842,429],{"class":258},[164,844,284],{"class":262},[164,846,847,849,851,853],{"class":166,"line":426},[164,848,437],{"class":262},[164,850,440],{"class":258},[164,852,263],{"class":262},[164,854,855],{"class":220},"9100\n",[164,857,858],{"class":166,"line":434},[164,859,601],{"class":170},[164,861,862,864,866],{"class":166,"line":448},[164,863,259],{"class":258},[164,865,263],{"class":262},[164,867,611],{"class":174},[164,869,870,872,874],{"class":166,"line":456},[164,871,271],{"class":258},[164,873,263],{"class":262},[164,875,621],{"class":174},[164,877,878,880],{"class":166,"line":468},[164,879,281],{"class":258},[164,881,284],{"class":262},[164,883,884,886,888],{"class":166,"line":476},[164,885,289],{"class":258},[164,887,263],{"class":262},[164,889,747],{"class":174},[164,891,892,894,896],{"class":166,"line":484},[164,893,299],{"class":258},[164,895,263],{"class":262},[164,897,304],{"class":174},[164,899,900,902],{"class":166,"line":495},[164,901,309],{"class":258},[164,903,284],{"class":262},[164,905,906,908],{"class":166,"line":506},[164,907,328],{"class":258},[164,909,284],{"class":262},[164,911,912,914,916],{"class":166,"line":518},[164,913,666],{"class":258},[164,915,263],{"class":262},[164,917,747],{"class":174},[164,919,920,922],{"class":166,"line":529},[164,921,676],{"class":258},[164,923,284],{"class":262},[164,925,926,928,930,932],{"class":166,"line":537},[164,927,684],{"class":262},[164,929,687],{"class":258},[164,931,263],{"class":262},[164,933,855],{"class":220},[164,935,936,938,940],{"class":166,"line":549},[164,937,697],{"class":258},[164,939,263],{"class":262},[164,941,855],{"class":220},[149,943,945],{"id":944},"_4-prometheus-deployen","4. Prometheus deployen",[154,947,949],{"className":244,"code":948,"language":246,"meta":159,"style":159},"# prometheus-deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: prometheus\n  namespace: gitlab-observability\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: prometheus\n  template:\n    metadata:\n      labels:\n        app: prometheus\n    spec:\n      containers:\n        - name: prometheus\n          image: prom/prometheus:latest\n          ports:\n            - containerPort: 9090\n          volumeMounts:\n            - name: config\n              mountPath: /etc/prometheus\n      volumes:\n        - name: config\n          configMap:\n            name: prometheus-config\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: prometheus\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: prometheus\n  ports:\n    - port: 9090\n      targetPort: 9090\n",[161,950,951,956,964,972,978,987,995,1001,1009,1015,1021,1029,1035,1041,1047,1055,1061,1067,1077,1086,1092,1103,1109,1119,1128,1134,1144,1150,1159,1163,1171,1179,1185,1193,1201,1207,1213,1221,1227,1237],{"__ignoreMap":159},[164,952,953],{"class":166,"line":167},[164,954,955],{"class":194},"# prometheus-deployment.yaml\n",[164,957,958,960,962],{"class":166,"line":184},[164,959,259],{"class":258},[164,961,263],{"class":262},[164,963,266],{"class":174},[164,965,966,968,970],{"class":166,"line":191},[164,967,271],{"class":258},[164,969,263],{"class":262},[164,971,276],{"class":174},[164,973,974,976],{"class":166,"line":198},[164,975,281],{"class":258},[164,977,284],{"class":262},[164,979,980,982,984],{"class":166,"line":204},[164,981,289],{"class":258},[164,983,263],{"class":262},[164,985,986],{"class":174},"prometheus\n",[164,988,989,991,993],{"class":166,"line":224},[164,990,299],{"class":258},[164,992,263],{"class":262},[164,994,304],{"class":174},[164,996,997,999],{"class":166,"line":232},[164,998,309],{"class":258},[164,1000,284],{"class":262},[164,1002,1003,1005,1007],{"class":166,"line":314},[164,1004,317],{"class":258},[164,1006,263],{"class":262},[164,1008,322],{"class":220},[164,1010,1011,1013],{"class":166,"line":325},[164,1012,328],{"class":258},[164,1014,284],{"class":262},[164,1016,1017,1019],{"class":166,"line":333},[164,1018,336],{"class":258},[164,1020,284],{"class":262},[164,1022,1023,1025,1027],{"class":166,"line":341},[164,1024,344],{"class":258},[164,1026,263],{"class":262},[164,1028,986],{"class":174},[164,1030,1031,1033],{"class":166,"line":351},[164,1032,354],{"class":258},[164,1034,284],{"class":262},[164,1036,1037,1039],{"class":166,"line":359},[164,1038,362],{"class":258},[164,1040,284],{"class":262},[164,1042,1043,1045],{"class":166,"line":367},[164,1044,370],{"class":258},[164,1046,284],{"class":262},[164,1048,1049,1051,1053],{"class":166,"line":375},[164,1050,378],{"class":258},[164,1052,263],{"class":262},[164,1054,986],{"class":174},[164,1056,1057,1059],{"class":166,"line":385},[164,1058,388],{"class":258},[164,1060,284],{"class":262},[164,1062,1063,1065],{"class":166,"line":393},[164,1064,396],{"class":258},[164,1066,284],{"class":262},[164,1068,1069,1071,1073,1075],{"class":166,"line":401},[164,1070,404],{"class":262},[164,1072,407],{"class":258},[164,1074,263],{"class":262},[164,1076,986],{"class":174},[164,1078,1079,1081,1083],{"class":166,"line":415},[164,1080,418],{"class":258},[164,1082,263],{"class":262},[164,1084,1085],{"class":174},"prom/prometheus:latest\n",[164,1087,1088,1090],{"class":166,"line":426},[164,1089,429],{"class":258},[164,1091,284],{"class":262},[164,1093,1094,1096,1098,1100],{"class":166,"line":434},[164,1095,437],{"class":262},[164,1097,440],{"class":258},[164,1099,263],{"class":262},[164,1101,1102],{"class":220},"9090\n",[164,1104,1105,1107],{"class":166,"line":448},[164,1106,532],{"class":258},[164,1108,284],{"class":262},[164,1110,1111,1113,1115,1117],{"class":166,"line":456},[164,1112,437],{"class":262},[164,1114,407],{"class":258},[164,1116,263],{"class":262},[164,1118,546],{"class":174},[164,1120,1121,1123,1125],{"class":166,"line":468},[164,1122,552],{"class":258},[164,1124,263],{"class":262},[164,1126,1127],{"class":174},"/etc/prometheus\n",[164,1129,1130,1132],{"class":166,"line":476},[164,1131,563],{"class":258},[164,1133,284],{"class":262},[164,1135,1136,1138,1140,1142],{"class":166,"line":484},[164,1137,404],{"class":262},[164,1139,407],{"class":258},[164,1141,263],{"class":262},[164,1143,546],{"class":174},[164,1145,1146,1148],{"class":166,"line":495},[164,1147,582],{"class":258},[164,1149,284],{"class":262},[164,1151,1152,1154,1156],{"class":166,"line":506},[164,1153,590],{"class":258},[164,1155,263],{"class":262},[164,1157,1158],{"class":174},"prometheus-config\n",[164,1160,1161],{"class":166,"line":518},[164,1162,601],{"class":170},[164,1164,1165,1167,1169],{"class":166,"line":529},[164,1166,259],{"class":258},[164,1168,263],{"class":262},[164,1170,611],{"class":174},[164,1172,1173,1175,1177],{"class":166,"line":537},[164,1174,271],{"class":258},[164,1176,263],{"class":262},[164,1178,621],{"class":174},[164,1180,1181,1183],{"class":166,"line":549},[164,1182,281],{"class":258},[164,1184,284],{"class":262},[164,1186,1187,1189,1191],{"class":166,"line":560},[164,1188,289],{"class":258},[164,1190,263],{"class":262},[164,1192,986],{"class":174},[164,1194,1195,1197,1199],{"class":166,"line":568},[164,1196,299],{"class":258},[164,1198,263],{"class":262},[164,1200,304],{"class":174},[164,1202,1203,1205],{"class":166,"line":579},[164,1204,309],{"class":258},[164,1206,284],{"class":262},[164,1208,1209,1211],{"class":166,"line":587},[164,1210,328],{"class":258},[164,1212,284],{"class":262},[164,1214,1215,1217,1219],{"class":166,"line":598},[164,1216,666],{"class":258},[164,1218,263],{"class":262},[164,1220,986],{"class":174},[164,1222,1223,1225],{"class":166,"line":604},[164,1224,676],{"class":258},[164,1226,284],{"class":262},[164,1228,1229,1231,1233,1235],{"class":166,"line":614},[164,1230,684],{"class":262},[164,1232,687],{"class":258},[164,1234,263],{"class":262},[164,1236,1102],{"class":220},[164,1238,1239,1241,1243],{"class":166,"line":624},[164,1240,697],{"class":258},[164,1242,263],{"class":262},[164,1244,1102],{"class":220},[149,1246,1248],{"id":1247},"_5-grafana-deployen","5. Grafana deployen",[12,1250,1251,1252,1255],{},"Das folgende Grafana-Deployment startet mit deaktivierter Authentifizierung\n(",[161,1253,1254],{},"GF_AUTH_ANONYMOUS_ENABLED: true",") für den einfachen Einstieg.",[12,1257,1258,1261],{},[39,1259,1260],{},"Diese Einstellung erlaubt jedem mit Netzwerkzugang, alle Dashboards ohne\nAnmeldung einzusehen."," Für Produktions-Deployments diese Variable entfernen\noder auf false setzen und einen geeigneten Authentifizierungs-Provider\n(LDAP, SAML/SSO oder OAuth) konfigurieren, um den Zugriff auf autorisierte\nNutzende zu beschränken.",[154,1263,1265],{"className":244,"code":1264,"language":246,"meta":159,"style":159},"# grafana-deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: grafana\n  namespace: gitlab-observability\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: grafana\n  template:\n    metadata:\n      labels:\n        app: grafana\n    spec:\n      containers:\n        - name: grafana\n          image: grafana/grafana:10.0.0\n          ports:\n            - containerPort: 3000\n          env:\n            # Für Produktion ENTFERNEN oder auf 'false' setzen.\n            # Bei 'true' können alle Nutzenden mit Netzwerkzugang\n            # Dashboards ohne Authentifizierung einsehen.\n            - name: GF_AUTH_ANONYMOUS_ENABLED\n              value: 'true'\n          volumeMounts:\n            - name: dashboards-provider\n              mountPath: /etc/grafana/provisioning/dashboards\n            - name: datasources\n              mountPath: /etc/grafana/provisioning/datasources\n            - name: dashboards\n              mountPath: /var/lib/grafana/dashboards\n      volumes:\n        - name: dashboards-provider\n          configMap:\n            name: grafana-dashboards-provider\n        - name: datasources\n          configMap:\n            name: grafana-datasources\n        - name: dashboards\n          configMap:\n            name: grafana-dashboards\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: grafana\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: grafana\n  ports:\n    - port: 3000\n      targetPort: 3000\n",[161,1266,1267,1272,1280,1288,1294,1303,1311,1317,1325,1331,1337,1345,1351,1357,1363,1371,1377,1383,1393,1402,1408,1419,1425,1430,1435,1440,1451,1460,1466,1477,1486,1497,1506,1517,1526,1532,1542,1548,1557,1567,1573,1582,1592,1598,1607,1611,1619,1627,1633,1642,1651,1658,1665,1674,1681,1692],{"__ignoreMap":159},[164,1268,1269],{"class":166,"line":167},[164,1270,1271],{"class":194},"# grafana-deployment.yaml\n",[164,1273,1274,1276,1278],{"class":166,"line":184},[164,1275,259],{"class":258},[164,1277,263],{"class":262},[164,1279,266],{"class":174},[164,1281,1282,1284,1286],{"class":166,"line":191},[164,1283,271],{"class":258},[164,1285,263],{"class":262},[164,1287,276],{"class":174},[164,1289,1290,1292],{"class":166,"line":198},[164,1291,281],{"class":258},[164,1293,284],{"class":262},[164,1295,1296,1298,1300],{"class":166,"line":204},[164,1297,289],{"class":258},[164,1299,263],{"class":262},[164,1301,1302],{"class":174},"grafana\n",[164,1304,1305,1307,1309],{"class":166,"line":224},[164,1306,299],{"class":258},[164,1308,263],{"class":262},[164,1310,304],{"class":174},[164,1312,1313,1315],{"class":166,"line":232},[164,1314,309],{"class":258},[164,1316,284],{"class":262},[164,1318,1319,1321,1323],{"class":166,"line":314},[164,1320,317],{"class":258},[164,1322,263],{"class":262},[164,1324,322],{"class":220},[164,1326,1327,1329],{"class":166,"line":325},[164,1328,328],{"class":258},[164,1330,284],{"class":262},[164,1332,1333,1335],{"class":166,"line":333},[164,1334,336],{"class":258},[164,1336,284],{"class":262},[164,1338,1339,1341,1343],{"class":166,"line":341},[164,1340,344],{"class":258},[164,1342,263],{"class":262},[164,1344,1302],{"class":174},[164,1346,1347,1349],{"class":166,"line":351},[164,1348,354],{"class":258},[164,1350,284],{"class":262},[164,1352,1353,1355],{"class":166,"line":359},[164,1354,362],{"class":258},[164,1356,284],{"class":262},[164,1358,1359,1361],{"class":166,"line":367},[164,1360,370],{"class":258},[164,1362,284],{"class":262},[164,1364,1365,1367,1369],{"class":166,"line":375},[164,1366,378],{"class":258},[164,1368,263],{"class":262},[164,1370,1302],{"class":174},[164,1372,1373,1375],{"class":166,"line":385},[164,1374,388],{"class":258},[164,1376,284],{"class":262},[164,1378,1379,1381],{"class":166,"line":393},[164,1380,396],{"class":258},[164,1382,284],{"class":262},[164,1384,1385,1387,1389,1391],{"class":166,"line":401},[164,1386,404],{"class":262},[164,1388,407],{"class":258},[164,1390,263],{"class":262},[164,1392,1302],{"class":174},[164,1394,1395,1397,1399],{"class":166,"line":415},[164,1396,418],{"class":258},[164,1398,263],{"class":262},[164,1400,1401],{"class":174},"grafana/grafana:10.0.0\n",[164,1403,1404,1406],{"class":166,"line":426},[164,1405,429],{"class":258},[164,1407,284],{"class":262},[164,1409,1410,1412,1414,1416],{"class":166,"line":434},[164,1411,437],{"class":262},[164,1413,440],{"class":258},[164,1415,263],{"class":262},[164,1417,1418],{"class":220},"3000\n",[164,1420,1421,1423],{"class":166,"line":448},[164,1422,451],{"class":258},[164,1424,284],{"class":262},[164,1426,1427],{"class":166,"line":456},[164,1428,1429],{"class":194},"            # Für Produktion ENTFERNEN oder auf 'false' setzen.\n",[164,1431,1432],{"class":166,"line":468},[164,1433,1434],{"class":194},"            # Bei 'true' können alle Nutzenden mit Netzwerkzugang\n",[164,1436,1437],{"class":166,"line":476},[164,1438,1439],{"class":194},"            # Dashboards ohne Authentifizierung einsehen.\n",[164,1441,1442,1444,1446,1448],{"class":166,"line":484},[164,1443,437],{"class":262},[164,1445,407],{"class":258},[164,1447,263],{"class":262},[164,1449,1450],{"class":174},"GF_AUTH_ANONYMOUS_ENABLED\n",[164,1452,1453,1455,1457],{"class":166,"line":495},[164,1454,521],{"class":258},[164,1456,263],{"class":262},[164,1458,1459],{"class":174},"'true'\n",[164,1461,1462,1464],{"class":166,"line":506},[164,1463,532],{"class":258},[164,1465,284],{"class":262},[164,1467,1468,1470,1472,1474],{"class":166,"line":518},[164,1469,437],{"class":262},[164,1471,407],{"class":258},[164,1473,263],{"class":262},[164,1475,1476],{"class":174},"dashboards-provider\n",[164,1478,1479,1481,1483],{"class":166,"line":529},[164,1480,552],{"class":258},[164,1482,263],{"class":262},[164,1484,1485],{"class":174},"/etc/grafana/provisioning/dashboards\n",[164,1487,1488,1490,1492,1494],{"class":166,"line":537},[164,1489,437],{"class":262},[164,1491,407],{"class":258},[164,1493,263],{"class":262},[164,1495,1496],{"class":174},"datasources\n",[164,1498,1499,1501,1503],{"class":166,"line":549},[164,1500,552],{"class":258},[164,1502,263],{"class":262},[164,1504,1505],{"class":174},"/etc/grafana/provisioning/datasources\n",[164,1507,1508,1510,1512,1514],{"class":166,"line":560},[164,1509,437],{"class":262},[164,1511,407],{"class":258},[164,1513,263],{"class":262},[164,1515,1516],{"class":174},"dashboards\n",[164,1518,1519,1521,1523],{"class":166,"line":568},[164,1520,552],{"class":258},[164,1522,263],{"class":262},[164,1524,1525],{"class":174},"/var/lib/grafana/dashboards\n",[164,1527,1528,1530],{"class":166,"line":579},[164,1529,563],{"class":258},[164,1531,284],{"class":262},[164,1533,1534,1536,1538,1540],{"class":166,"line":587},[164,1535,404],{"class":262},[164,1537,407],{"class":258},[164,1539,263],{"class":262},[164,1541,1476],{"class":174},[164,1543,1544,1546],{"class":166,"line":598},[164,1545,582],{"class":258},[164,1547,284],{"class":262},[164,1549,1550,1552,1554],{"class":166,"line":604},[164,1551,590],{"class":258},[164,1553,263],{"class":262},[164,1555,1556],{"class":174},"grafana-dashboards-provider\n",[164,1558,1559,1561,1563,1565],{"class":166,"line":614},[164,1560,404],{"class":262},[164,1562,407],{"class":258},[164,1564,263],{"class":262},[164,1566,1496],{"class":174},[164,1568,1569,1571],{"class":166,"line":624},[164,1570,582],{"class":258},[164,1572,284],{"class":262},[164,1574,1575,1577,1579],{"class":166,"line":631},[164,1576,590],{"class":258},[164,1578,263],{"class":262},[164,1580,1581],{"class":174},"grafana-datasources\n",[164,1583,1584,1586,1588,1590],{"class":166,"line":640},[164,1585,404],{"class":262},[164,1587,407],{"class":258},[164,1589,263],{"class":262},[164,1591,1516],{"class":174},[164,1593,1594,1596],{"class":166,"line":649},[164,1595,582],{"class":258},[164,1597,284],{"class":262},[164,1599,1600,1602,1604],{"class":166,"line":656},[164,1601,590],{"class":258},[164,1603,263],{"class":262},[164,1605,1606],{"class":174},"grafana-dashboards\n",[164,1608,1609],{"class":166,"line":663},[164,1610,601],{"class":170},[164,1612,1613,1615,1617],{"class":166,"line":673},[164,1614,259],{"class":258},[164,1616,263],{"class":262},[164,1618,611],{"class":174},[164,1620,1621,1623,1625],{"class":166,"line":681},[164,1622,271],{"class":258},[164,1624,263],{"class":262},[164,1626,621],{"class":174},[164,1628,1629,1631],{"class":166,"line":694},[164,1630,281],{"class":258},[164,1632,284],{"class":262},[164,1634,1636,1638,1640],{"class":166,"line":1635},49,[164,1637,289],{"class":258},[164,1639,263],{"class":262},[164,1641,1302],{"class":174},[164,1643,1645,1647,1649],{"class":166,"line":1644},50,[164,1646,299],{"class":258},[164,1648,263],{"class":262},[164,1650,304],{"class":174},[164,1652,1654,1656],{"class":166,"line":1653},51,[164,1655,309],{"class":258},[164,1657,284],{"class":262},[164,1659,1661,1663],{"class":166,"line":1660},52,[164,1662,328],{"class":258},[164,1664,284],{"class":262},[164,1666,1668,1670,1672],{"class":166,"line":1667},53,[164,1669,666],{"class":258},[164,1671,263],{"class":262},[164,1673,1302],{"class":174},[164,1675,1677,1679],{"class":166,"line":1676},54,[164,1678,676],{"class":258},[164,1680,284],{"class":262},[164,1682,1684,1686,1688,1690],{"class":166,"line":1683},55,[164,1685,684],{"class":262},[164,1687,687],{"class":258},[164,1689,263],{"class":262},[164,1691,1418],{"class":220},[164,1693,1695,1697,1699],{"class":166,"line":1694},56,[164,1696,697],{"class":258},[164,1698,263],{"class":262},[164,1700,1418],{"class":220},[149,1702,1704],{"id":1703},"_6-network-policy-setzen","6. Network Policy setzen",[12,1706,1707],{},"Den Inter-Pod-Traffic auf die erforderlichen Kommunikationspfade beschränken:",[154,1709,1711],{"className":244,"code":1710,"language":246,"meta":159,"style":159},"# network-policy.yaml\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: observability-policy\n  namespace: gitlab-observability\nspec:\n  podSelector: {}\n  policyTypes:\n    - Ingress\n  ingress:\n    # Prometheus scrapt Exporter und Node-Exporter\n    - from:\n        - podSelector:\n            matchLabels:\n              app: prometheus\n      ports:\n        - port: 8080\n        - port: 9100\n    # Grafana fragt Prometheus ab\n    - from:\n        - podSelector:\n            matchLabels:\n              app: grafana\n      ports:\n        - port: 9090\n",[161,1712,1713,1718,1727,1736,1742,1751,1759,1765,1773,1780,1787,1794,1799,1808,1817,1824,1833,1840,1850,1860,1865,1873,1881,1887,1895,1901],{"__ignoreMap":159},[164,1714,1715],{"class":166,"line":167},[164,1716,1717],{"class":194},"# network-policy.yaml\n",[164,1719,1720,1722,1724],{"class":166,"line":184},[164,1721,259],{"class":258},[164,1723,263],{"class":262},[164,1725,1726],{"class":174},"networking.k8s.io/v1\n",[164,1728,1729,1731,1733],{"class":166,"line":191},[164,1730,271],{"class":258},[164,1732,263],{"class":262},[164,1734,1735],{"class":174},"NetworkPolicy\n",[164,1737,1738,1740],{"class":166,"line":198},[164,1739,281],{"class":258},[164,1741,284],{"class":262},[164,1743,1744,1746,1748],{"class":166,"line":204},[164,1745,289],{"class":258},[164,1747,263],{"class":262},[164,1749,1750],{"class":174},"observability-policy\n",[164,1752,1753,1755,1757],{"class":166,"line":224},[164,1754,299],{"class":258},[164,1756,263],{"class":262},[164,1758,304],{"class":174},[164,1760,1761,1763],{"class":166,"line":232},[164,1762,309],{"class":258},[164,1764,284],{"class":262},[164,1766,1767,1770],{"class":166,"line":314},[164,1768,1769],{"class":258},"  podSelector",[164,1771,1772],{"class":262},": {}\n",[164,1774,1775,1778],{"class":166,"line":325},[164,1776,1777],{"class":258},"  policyTypes",[164,1779,284],{"class":262},[164,1781,1782,1784],{"class":166,"line":333},[164,1783,684],{"class":262},[164,1785,1786],{"class":174},"Ingress\n",[164,1788,1789,1792],{"class":166,"line":341},[164,1790,1791],{"class":258},"  ingress",[164,1793,284],{"class":262},[164,1795,1796],{"class":166,"line":351},[164,1797,1798],{"class":194},"    # Prometheus scrapt Exporter und Node-Exporter\n",[164,1800,1801,1803,1806],{"class":166,"line":359},[164,1802,684],{"class":262},[164,1804,1805],{"class":258},"from",[164,1807,284],{"class":262},[164,1809,1810,1812,1815],{"class":166,"line":367},[164,1811,404],{"class":262},[164,1813,1814],{"class":258},"podSelector",[164,1816,284],{"class":262},[164,1818,1819,1822],{"class":166,"line":375},[164,1820,1821],{"class":258},"            matchLabels",[164,1823,284],{"class":262},[164,1825,1826,1829,1831],{"class":166,"line":385},[164,1827,1828],{"class":258},"              app",[164,1830,263],{"class":262},[164,1832,986],{"class":174},[164,1834,1835,1838],{"class":166,"line":393},[164,1836,1837],{"class":258},"      ports",[164,1839,284],{"class":262},[164,1841,1842,1844,1846,1848],{"class":166,"line":401},[164,1843,404],{"class":262},[164,1845,687],{"class":258},[164,1847,263],{"class":262},[164,1849,445],{"class":220},[164,1851,1852,1854,1856,1858],{"class":166,"line":415},[164,1853,404],{"class":262},[164,1855,687],{"class":258},[164,1857,263],{"class":262},[164,1859,855],{"class":220},[164,1861,1862],{"class":166,"line":426},[164,1863,1864],{"class":194},"    # Grafana fragt Prometheus ab\n",[164,1866,1867,1869,1871],{"class":166,"line":434},[164,1868,684],{"class":262},[164,1870,1805],{"class":258},[164,1872,284],{"class":262},[164,1874,1875,1877,1879],{"class":166,"line":448},[164,1876,404],{"class":262},[164,1878,1814],{"class":258},[164,1880,284],{"class":262},[164,1882,1883,1885],{"class":166,"line":456},[164,1884,1821],{"class":258},[164,1886,284],{"class":262},[164,1888,1889,1891,1893],{"class":166,"line":468},[164,1890,1828],{"class":258},[164,1892,263],{"class":262},[164,1894,1302],{"class":174},[164,1896,1897,1899],{"class":166,"line":476},[164,1898,1837],{"class":258},[164,1900,284],{"class":262},[164,1902,1903,1905,1907,1909],{"class":166,"line":484},[164,1904,404],{"class":262},[164,1906,687],{"class":258},[164,1908,263],{"class":262},[164,1910,1102],{"class":220},[149,1912,1914],{"id":1913},"_7-validieren","7. Validieren",[154,1916,1918],{"className":156,"code":1917,"language":158,"meta":159,"style":159},"kubectl get pods -n gitlab-observability\nkubectl port-forward svc/grafana 3000:3000 -n gitlab-observability\ncurl http://localhost:3000/api/health\n",[161,1919,1920,1935,1952],{"__ignoreMap":159},[164,1921,1922,1924,1927,1930,1933],{"class":166,"line":167},[164,1923,171],{"class":170},[164,1925,1926],{"class":174}," get",[164,1928,1929],{"class":174}," pods",[164,1931,1932],{"class":220}," -n",[164,1934,181],{"class":174},[164,1936,1937,1939,1942,1945,1948,1950],{"class":166,"line":184},[164,1938,171],{"class":170},[164,1940,1941],{"class":174}," port-forward",[164,1943,1944],{"class":174}," svc/grafana",[164,1946,1947],{"class":174}," 3000:3000",[164,1949,1932],{"class":220},[164,1951,181],{"class":174},[164,1953,1954,1957],{"class":166,"line":191},[164,1955,1956],{"class":170},"curl",[164,1958,1959],{"class":174}," http://localhost:3000/api/health\n",[25,1961,1963],{"id":1962},"konfigurationsreferenz","Konfigurationsreferenz",[149,1965,1967],{"id":1966},"exporter-konfiguration","Exporter-Konfiguration",[154,1969,1971],{"className":244,"code":1970,"language":246,"meta":159,"style":159},"# gitlab-ci-pipelines-exporter.yml (ConfigMap: gcpe-config)\nlog:\n  level: info\ngitlab:\n  url: https://gitlab.your-domain.com\n  maximum_requests_per_second: 10\nproject_defaults:\n  pull:\n    pipeline:\n      jobs:\n        enabled: true\nwildcards:\n  - owner:\n      name: your-group-name\n      kind: group\n    archived: false\n",[161,1972,1973,1978,1985,1995,2002,2012,2022,2029,2036,2043,2050,2060,2067,2077,2087,2097],{"__ignoreMap":159},[164,1974,1975],{"class":166,"line":167},[164,1976,1977],{"class":194},"# gitlab-ci-pipelines-exporter.yml (ConfigMap: gcpe-config)\n",[164,1979,1980,1983],{"class":166,"line":184},[164,1981,1982],{"class":258},"log",[164,1984,284],{"class":262},[164,1986,1987,1990,1992],{"class":166,"line":191},[164,1988,1989],{"class":258},"  level",[164,1991,263],{"class":262},[164,1993,1994],{"class":174},"info\n",[164,1996,1997,2000],{"class":166,"line":198},[164,1998,1999],{"class":258},"gitlab",[164,2001,284],{"class":262},[164,2003,2004,2007,2009],{"class":166,"line":204},[164,2005,2006],{"class":258},"  url",[164,2008,263],{"class":262},[164,2010,2011],{"class":174},"https://gitlab.your-domain.com\n",[164,2013,2014,2017,2019],{"class":166,"line":224},[164,2015,2016],{"class":258},"  maximum_requests_per_second",[164,2018,263],{"class":262},[164,2020,2021],{"class":220},"10\n",[164,2023,2024,2027],{"class":166,"line":232},[164,2025,2026],{"class":258},"project_defaults",[164,2028,284],{"class":262},[164,2030,2031,2034],{"class":166,"line":314},[164,2032,2033],{"class":258},"  pull",[164,2035,284],{"class":262},[164,2037,2038,2041],{"class":166,"line":325},[164,2039,2040],{"class":258},"    pipeline",[164,2042,284],{"class":262},[164,2044,2045,2048],{"class":166,"line":333},[164,2046,2047],{"class":258},"      jobs",[164,2049,284],{"class":262},[164,2051,2052,2055,2057],{"class":166,"line":341},[164,2053,2054],{"class":258},"        enabled",[164,2056,263],{"class":262},[164,2058,2059],{"class":220},"true\n",[164,2061,2062,2065],{"class":166,"line":351},[164,2063,2064],{"class":258},"wildcards",[164,2066,284],{"class":262},[164,2068,2069,2072,2075],{"class":166,"line":359},[164,2070,2071],{"class":262},"  - ",[164,2073,2074],{"class":258},"owner",[164,2076,284],{"class":262},[164,2078,2079,2082,2084],{"class":166,"line":367},[164,2080,2081],{"class":258},"      name",[164,2083,263],{"class":262},[164,2085,2086],{"class":174},"your-group-name\n",[164,2088,2089,2092,2094],{"class":166,"line":375},[164,2090,2091],{"class":258},"      kind",[164,2093,263],{"class":262},[164,2095,2096],{"class":174},"group\n",[164,2098,2099,2102,2104],{"class":166,"line":385},[164,2100,2101],{"class":258},"    archived",[164,2103,263],{"class":262},[164,2105,2106],{"class":220},"false\n",[149,2108,2110],{"id":2109},"prometheus-konfiguration","Prometheus-Konfiguration",[154,2112,2114],{"className":244,"code":2113,"language":246,"meta":159,"style":159},"# prometheus.yml (ConfigMap: prometheus-config)\nglobal:\n  scrape_interval: 15s\nscrape_configs:\n  - job_name: 'gitlab-ci-pipelines-exporter'\n    static_configs:\n      - targets: ['gitlab-ci-pipelines-exporter:8080']\n  - job_name: 'node-exporter'\n    static_configs:\n      - targets: ['node-exporter:9100']\n",[161,2115,2116,2121,2128,2138,2145,2157,2164,2181,2192,2198],{"__ignoreMap":159},[164,2117,2118],{"class":166,"line":167},[164,2119,2120],{"class":194},"# prometheus.yml (ConfigMap: prometheus-config)\n",[164,2122,2123,2126],{"class":166,"line":184},[164,2124,2125],{"class":258},"global",[164,2127,284],{"class":262},[164,2129,2130,2133,2135],{"class":166,"line":191},[164,2131,2132],{"class":258},"  scrape_interval",[164,2134,263],{"class":262},[164,2136,2137],{"class":174},"15s\n",[164,2139,2140,2143],{"class":166,"line":198},[164,2141,2142],{"class":258},"scrape_configs",[164,2144,284],{"class":262},[164,2146,2147,2149,2152,2154],{"class":166,"line":204},[164,2148,2071],{"class":262},[164,2150,2151],{"class":258},"job_name",[164,2153,263],{"class":262},[164,2155,2156],{"class":174},"'gitlab-ci-pipelines-exporter'\n",[164,2158,2159,2162],{"class":166,"line":224},[164,2160,2161],{"class":258},"    static_configs",[164,2163,284],{"class":262},[164,2165,2166,2169,2172,2175,2178],{"class":166,"line":232},[164,2167,2168],{"class":262},"      - ",[164,2170,2171],{"class":258},"targets",[164,2173,2174],{"class":262},": [",[164,2176,2177],{"class":174},"'gitlab-ci-pipelines-exporter:8080'",[164,2179,2180],{"class":262},"]\n",[164,2182,2183,2185,2187,2189],{"class":166,"line":314},[164,2184,2071],{"class":262},[164,2186,2151],{"class":258},[164,2188,263],{"class":262},[164,2190,2191],{"class":174},"'node-exporter'\n",[164,2193,2194,2196],{"class":166,"line":325},[164,2195,2161],{"class":258},[164,2197,284],{"class":262},[164,2199,2200,2202,2204,2206,2209],{"class":166,"line":333},[164,2201,2168],{"class":262},[164,2203,2171],{"class":258},[164,2205,2174],{"class":262},[164,2207,2208],{"class":174},"'node-exporter:9100'",[164,2210,2180],{"class":262},[149,2212,2214],{"id":2213},"grafana-datenquellen","Grafana-Datenquellen",[154,2216,2218],{"className":244,"code":2217,"language":246,"meta":159,"style":159},"# datasources.yml (ConfigMap: grafana-datasources)\napiVersion: 1\ndatasources:\n  - name: Prometheus\n    type: prometheus\n    access: proxy\n    url: http://prometheus:9090\n    isDefault: true\n# dashboards.yml (ConfigMap: grafana-dashboards-provider)\napiVersion: 1\nproviders:\n  - name: 'default'\n    folder: 'GitLab CI/CD'\n    type: file\n    options:\n      path: /var/lib/grafana/dashboards\n",[161,2219,2220,2225,2233,2240,2251,2260,2270,2280,2289,2294,2302,2309,2320,2330,2339,2346],{"__ignoreMap":159},[164,2221,2222],{"class":166,"line":167},[164,2223,2224],{"class":194},"# datasources.yml (ConfigMap: grafana-datasources)\n",[164,2226,2227,2229,2231],{"class":166,"line":184},[164,2228,259],{"class":258},[164,2230,263],{"class":262},[164,2232,322],{"class":220},[164,2234,2235,2238],{"class":166,"line":191},[164,2236,2237],{"class":258},"datasources",[164,2239,284],{"class":262},[164,2241,2242,2244,2246,2248],{"class":166,"line":198},[164,2243,2071],{"class":262},[164,2245,407],{"class":258},[164,2247,263],{"class":262},[164,2249,2250],{"class":174},"Prometheus\n",[164,2252,2253,2256,2258],{"class":166,"line":204},[164,2254,2255],{"class":258},"    type",[164,2257,263],{"class":262},[164,2259,986],{"class":174},[164,2261,2262,2265,2267],{"class":166,"line":224},[164,2263,2264],{"class":258},"    access",[164,2266,263],{"class":262},[164,2268,2269],{"class":174},"proxy\n",[164,2271,2272,2275,2277],{"class":166,"line":232},[164,2273,2274],{"class":258},"    url",[164,2276,263],{"class":262},[164,2278,2279],{"class":174},"http://prometheus:9090\n",[164,2281,2282,2285,2287],{"class":166,"line":314},[164,2283,2284],{"class":258},"    isDefault",[164,2286,263],{"class":262},[164,2288,2059],{"class":220},[164,2290,2291],{"class":166,"line":325},[164,2292,2293],{"class":194},"# dashboards.yml (ConfigMap: grafana-dashboards-provider)\n",[164,2295,2296,2298,2300],{"class":166,"line":333},[164,2297,259],{"class":258},[164,2299,263],{"class":262},[164,2301,322],{"class":220},[164,2303,2304,2307],{"class":166,"line":341},[164,2305,2306],{"class":258},"providers",[164,2308,284],{"class":262},[164,2310,2311,2313,2315,2317],{"class":166,"line":351},[164,2312,2071],{"class":262},[164,2314,407],{"class":258},[164,2316,263],{"class":262},[164,2318,2319],{"class":174},"'default'\n",[164,2321,2322,2325,2327],{"class":166,"line":359},[164,2323,2324],{"class":258},"    folder",[164,2326,263],{"class":262},[164,2328,2329],{"class":174},"'GitLab CI/CD'\n",[164,2331,2332,2334,2336],{"class":166,"line":367},[164,2333,2255],{"class":258},[164,2335,263],{"class":262},[164,2337,2338],{"class":174},"file\n",[164,2340,2341,2344],{"class":166,"line":375},[164,2342,2343],{"class":258},"    options",[164,2345,284],{"class":262},[164,2347,2348,2351,2353],{"class":166,"line":385},[164,2349,2350],{"class":258},"      path",[164,2352,263],{"class":262},[164,2354,1525],{"class":174},[25,2356,2358],{"id":2357},"wichtige-metriken","Wichtige Metriken",[149,2360,2362],{"id":2361},"pipeline-exporter-metriken","Pipeline-Exporter-Metriken",[2364,2365,2366,2380],"table",{},[2367,2368,2369],"thead",{},[2370,2371,2372,2377],"tr",{},[2373,2374,2376],"th",{"align":2375},"left","Metrik",[2373,2378,2379],{"align":2375},"Beschreibung",[2381,2382,2383,2394,2404,2414,2424,2434,2444,2454,2464],"tbody",{},[2370,2384,2385,2391],{},[2386,2387,2388],"td",{"align":2375},[161,2389,2390],{},"gitlab_ci_pipeline_duration_seconds",[2386,2392,2393],{"align":2375},"Pipeline-Ausführungszeit",[2370,2395,2396,2401],{},[2386,2397,2398],{"align":2375},[161,2399,2400],{},"gitlab_ci_pipeline_status",[2386,2402,2403],{"align":2375},"Pipeline-Erfolg/-Fehler nach Projekt",[2370,2405,2406,2411],{},[2386,2407,2408],{"align":2375},[161,2409,2410],{},"gitlab_ci_pipeline_job_duration_seconds",[2386,2412,2413],{"align":2375},"Einzelne Job-Ausführungszeit",[2370,2415,2416,2421],{},[2386,2417,2418],{"align":2375},[161,2419,2420],{},"gitlab_ci_pipeline_job_status",[2386,2422,2423],{"align":2375},"Job-Erfolgs-/-Fehlerstatus",[2370,2425,2426,2431],{},[2386,2427,2428],{"align":2375},[161,2429,2430],{},"gitlab_ci_pipeline_job_artifact_size_bytes",[2386,2432,2433],{"align":2375},"Artifact-Speicherverbrauch",[2370,2435,2436,2441],{},[2386,2437,2438],{"align":2375},[161,2439,2440],{},"gitlab_ci_pipeline_coverage",[2386,2442,2443],{"align":2375},"Code-Coverage-Prozentsatz",[2370,2445,2446,2451],{},[2386,2447,2448],{"align":2375},[161,2449,2450],{},"gitlab_ci_environment_deployment_count",[2386,2452,2453],{"align":2375},"Deployment-Häufigkeit",[2370,2455,2456,2461],{},[2386,2457,2458],{"align":2375},[161,2459,2460],{},"gitlab_ci_environment_deployment_duration_seconds",[2386,2462,2463],{"align":2375},"Deployment-Ausführungszeit",[2370,2465,2466,2471],{},[2386,2467,2468],{"align":2375},[161,2469,2470],{},"gitlab_ci_environment_behind_commits_count",[2386,2472,2473],{"align":2375},"Environment-Drift gegenüber main",[149,2475,2477],{"id":2476},"node-exporter-metriken","Node-Exporter-Metriken",[2364,2479,2480,2488],{},[2367,2481,2482],{},[2370,2483,2484,2486],{},[2373,2485,2376],{"align":2375},[2373,2487,2379],{"align":2375},[2381,2489,2490,2500,2510,2520],{},[2370,2491,2492,2497],{},[2386,2493,2494],{"align":2375},[161,2495,2496],{},"node_cpu_seconds_total",[2386,2498,2499],{"align":2375},"CPU-Auslastung",[2370,2501,2502,2507],{},[2386,2503,2504],{"align":2375},[161,2505,2506],{},"node_memory_MemAvailable_bytes",[2386,2508,2509],{"align":2375},"Verfügbarer Arbeitsspeicher",[2370,2511,2512,2517],{},[2386,2513,2514],{"align":2375},[161,2515,2516],{},"node_filesystem_avail_bytes",[2386,2518,2519],{"align":2375},"Verfügbarer Festplattenspeicher",[2370,2521,2522,2527],{},[2386,2523,2524],{"align":2375},[161,2525,2526],{},"node_load1",[2386,2528,2529],{"align":2375},"1-Minuten-Lastdurchschnitt",[25,2531,2533],{"id":2532},"fehlerbehebung","Fehlerbehebung",[149,2535,2537],{"id":2536},"grafana-plugin-installation-in-air-gapped-umgebungen","Grafana-Plugin-Installation in Air-gapped-Umgebungen",[12,2539,2540],{},"Für Offline-Umgebungen Plugins manuell installieren. Beispiel für Kubernetes:",[154,2542,2544],{"className":156,"code":2543,"language":158,"meta":159,"style":159},"# Plugin-ZIP in den Grafana-Pod kopieren\nkubectl cp grafana-polystat-panel-2.1.16.zip \\\n  gitlab-observability/grafana-\u003Cpod-id>:/tmp/\n# Plugin entpacken\nkubectl exec -it -n gitlab-observability deploy/grafana -- \\\n  sh -c \"unzip /tmp/grafana-polystat-panel-2.1.16.zip -d /var/lib/grafana/plugins/\"\n# Grafana-Pod neu starten\nkubectl rollout restart deployment/grafana -n gitlab-observability\n# Installation prüfen\nkubectl exec -it -n gitlab-observability deploy/grafana -- \\\n  ls -al /var/lib/grafana/plugins/\n",[161,2545,2546,2551,2563,2584,2589,2612,2623,2628,2645,2650,2668],{"__ignoreMap":159},[164,2547,2548],{"class":166,"line":167},[164,2549,2550],{"class":194},"# Plugin-ZIP in den Grafana-Pod kopieren\n",[164,2552,2553,2555,2558,2561],{"class":166,"line":184},[164,2554,171],{"class":170},[164,2556,2557],{"class":174}," cp",[164,2559,2560],{"class":174}," grafana-polystat-panel-2.1.16.zip",[164,2562,221],{"class":220},[164,2564,2565,2568,2572,2575,2578,2581],{"class":166,"line":191},[164,2566,2567],{"class":174},"  gitlab-observability/grafana-",[164,2569,2571],{"class":2570},"sD7c4","\u003C",[164,2573,2574],{"class":174},"pod-i",[164,2576,2577],{"class":262},"d",[164,2579,2580],{"class":2570},">",[164,2582,2583],{"class":174},":/tmp/\n",[164,2585,2586],{"class":166,"line":198},[164,2587,2588],{"class":194},"# Plugin entpacken\n",[164,2590,2591,2593,2596,2599,2601,2604,2607,2610],{"class":166,"line":204},[164,2592,171],{"class":170},[164,2594,2595],{"class":174}," exec",[164,2597,2598],{"class":220}," -it",[164,2600,1932],{"class":220},[164,2602,2603],{"class":174}," gitlab-observability",[164,2605,2606],{"class":174}," deploy/grafana",[164,2608,2609],{"class":220}," --",[164,2611,221],{"class":220},[164,2613,2614,2617,2620],{"class":166,"line":224},[164,2615,2616],{"class":174},"  sh",[164,2618,2619],{"class":220}," -c",[164,2621,2622],{"class":174}," \"unzip /tmp/grafana-polystat-panel-2.1.16.zip -d /var/lib/grafana/plugins/\"\n",[164,2624,2625],{"class":166,"line":232},[164,2626,2627],{"class":194},"# Grafana-Pod neu starten\n",[164,2629,2630,2632,2635,2638,2641,2643],{"class":166,"line":314},[164,2631,171],{"class":170},[164,2633,2634],{"class":174}," rollout",[164,2636,2637],{"class":174}," restart",[164,2639,2640],{"class":174}," deployment/grafana",[164,2642,1932],{"class":220},[164,2644,181],{"class":174},[164,2646,2647],{"class":166,"line":325},[164,2648,2649],{"class":194},"# Installation prüfen\n",[164,2651,2652,2654,2656,2658,2660,2662,2664,2666],{"class":166,"line":333},[164,2653,171],{"class":170},[164,2655,2595],{"class":174},[164,2657,2598],{"class":220},[164,2659,1932],{"class":220},[164,2661,2603],{"class":174},[164,2663,2606],{"class":174},[164,2665,2609],{"class":220},[164,2667,221],{"class":220},[164,2669,2670,2673,2676],{"class":166,"line":341},[164,2671,2672],{"class":174},"  ls",[164,2674,2675],{"class":220}," -al",[164,2677,2678],{"class":174}," /var/lib/grafana/plugins/\n",[25,2680,2682],{"id":2681},"unternehmensaspekte","Unternehmensaspekte",[12,2684,2685],{},"Für regulierte Branchen gilt:",[33,2687,2688,2697,2703],{},[36,2689,2690,2693,2694,2696],{},[39,2691,2692],{},"Token-Sicherheit:"," GitLab Personal Access Tokens in einem dedizierten\nSecrets-Manager speichern, nicht hartcodiert in ConfigMaps. Token-Rotation\ndurchsetzen und den Scope auf ",[39,2695,136],{}," beschränken.",[36,2698,2699,2702],{},[39,2700,2701],{},"Netzwerksegmentierung:"," Hinter einem Reverse Proxy mit TLS-Terminierung\ndeployen. In Kubernetes einen Ingress-Controller mit automatisierter\nZertifikatsbereitstellung verwenden.",[36,2704,2705,2708],{},[39,2706,2707],{},"Authentifizierung:"," Grafana mit dem Identity Provider der Organisation\nkonfigurieren (SAML, LDAP oder OAuth/OIDC), um rollenbasierte\nZugriffskontrolle auf Dashboards durchzusetzen.",[25,2710,2712],{"id":2711},"warum-gitlab","Warum GitLab?",[12,2714,2715],{},"GitLabs API-First-Design ermöglicht individuelle Observability-Lösungen, die\nnative Funktionen wie Value Stream Analytics und DORA-Metriken ergänzen. Die\noffene Architektur erlaubt es Unternehmen, bewährte Open-Source-Werkzeuge –\nwie den gitlab-ci-pipelines-exporter – direkt in bestehende\nUnternehmensinfrastruktur zu integrieren, ohne etablierte Workflows zu\nunterbrechen.",[12,2717,2718,2719,2725],{},"Mit wachsender Observability-Reife bieten GitLabs eingebaute\nObservability-Funktionen einen natürlichen nächsten Schritt – tiefere,\nintegrierte Transparenz ohne zusätzliche Werkzeuge. Mehr zu den nativen\nPlattformfunktionen unter\n",[2720,2721,2724],"a",{"href":2722,"rel":2723},"https://docs.gitlab.com/operations/observability/observability/",[],"GitLab Observability",".",[2727,2728,2729],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":159,"searchDepth":184,"depth":184,"links":2731},[2732,2733,2734,2743,2748,2752,2755,2756],{"id":27,"depth":184,"text":28},{"id":57,"depth":184,"text":58},{"id":143,"depth":184,"text":144,"children":2735},[2736,2737,2738,2739,2740,2741,2742],{"id":151,"depth":191,"text":152},{"id":240,"depth":191,"text":241},{"id":704,"depth":191,"text":705},{"id":944,"depth":191,"text":945},{"id":1247,"depth":191,"text":1248},{"id":1703,"depth":191,"text":1704},{"id":1913,"depth":191,"text":1914},{"id":1962,"depth":184,"text":1963,"children":2744},[2745,2746,2747],{"id":1966,"depth":191,"text":1967},{"id":2109,"depth":191,"text":2110},{"id":2213,"depth":191,"text":2214},{"id":2357,"depth":184,"text":2358,"children":2749},[2750,2751],{"id":2361,"depth":191,"text":2362},{"id":2476,"depth":191,"text":2477},{"id":2532,"depth":184,"text":2533,"children":2753},[2754],{"id":2536,"depth":191,"text":2537},{"id":2681,"depth":184,"text":2682},{"id":2711,"depth":184,"text":2712},"engineering","2026-04-28","Dieser Praxisleitfaden zu GitLab Pipeline Analytics hilft Self-Managed-Nutzern, mit Prometheus und Grafana operationale Insights zu gewinnen.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png",{},"/de-de/blog/how-to-build-ci-cd-observability-at-scale",{"config":2767,"title":5,"description":2768},{"noIndex":2762},"Praxisleitfaden zu GitLab Pipeline Analytics für Self-Managed-Instanzen: Operationale Insights mit Prometheus und Grafana gewinnen.","how-to-build-ci-cd-observability-at-scale","de-de/blog/how-to-build-ci-cd-observability-at-scale",[2772,2773,2774],"CI/CD","product","tutorial","BlogPost","oI4TYwZbSCZ69rb-yrveZRB7RIG55rvyu1MDv_RjElk",{"logo":2778,"freeTrial":2783,"sales":2788,"login":2793,"items":2798,"search":3113,"minimal":3147,"duo":3165,"switchNav":3174,"pricingDeployment":3185},{"config":2779},{"href":2780,"dataGaName":2781,"dataGaLocation":2782},"/de-de/","gitlab logo","header",{"text":2784,"config":2785},"Kostenlose Testversion anfordern",{"href":2786,"dataGaName":2787,"dataGaLocation":2782},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":2789,"config":2790},"Vertrieb kontaktieren",{"href":2791,"dataGaName":2792,"dataGaLocation":2782},"/de-de/sales/","sales",{"text":2794,"config":2795},"Anmelden",{"href":2796,"dataGaName":2797,"dataGaLocation":2782},"https://gitlab.com/users/sign_in/","sign in",[2799,2827,2928,2933,3037,3093],{"text":2800,"config":2801,"menu":2803},"Plattform",{"dataNavLevelOne":2802},"platform",{"type":2804,"columns":2805},"cards",[2806,2812,2820],{"title":2800,"description":2807,"link":2808},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":2809,"config":2810},"Die Plattform erkunden",{"href":2811,"dataGaName":2802,"dataGaLocation":2782},"/de-de/platform/",{"title":2813,"description":2814,"link":2815},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":2816,"config":2817},"Lerne GitLab Duo kennen",{"href":2818,"dataGaName":2819,"dataGaLocation":2782},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":2712,"description":2821,"link":2822},"Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":2823,"config":2824},"Mehr erfahren",{"href":2825,"dataGaName":2826,"dataGaLocation":2782},"/de-de/why-gitlab/","why gitlab",{"text":2828,"left":187,"config":2829,"menu":2831},"Produkt",{"dataNavLevelOne":2830},"solutions",{"type":2832,"link":2833,"columns":2837,"feature":2907},"lists",{"text":2834,"config":2835},"Alle Lösungen anzeigen",{"href":2836,"dataGaName":2830,"dataGaLocation":2782},"/de-de/solutions/",[2838,2862,2885],{"title":2839,"description":2840,"link":2841,"items":2846},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":2842},{"icon":2843,"href":2844,"dataGaName":2845,"dataGaLocation":2782},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[2847,2850,2853,2858],{"text":2772,"config":2848},{"href":2849,"dataGaLocation":2782,"dataGaName":2772},"/de-de/solutions/continuous-integration/",{"text":2813,"config":2851},{"href":2818,"dataGaLocation":2782,"dataGaName":2852},"gitlab duo agent platform - product menu",{"text":2854,"config":2855},"Quellcodeverwaltung",{"href":2856,"dataGaLocation":2782,"dataGaName":2857},"/de-de/solutions/source-code-management/","Source Code Management",{"text":2859,"config":2860},"Automatische Softwarebereitstellung",{"href":2844,"dataGaLocation":2782,"dataGaName":2861},"Automated software delivery",{"title":2863,"description":2864,"link":2865,"items":2870},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":2866},{"href":2867,"dataGaName":2868,"dataGaLocation":2782,"icon":2869},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[2871,2875,2880],{"text":2872,"config":2873},"Anwendungssicherheitstests",{"href":2867,"dataGaName":2874,"dataGaLocation":2782},"Application security testing",{"text":2876,"config":2877},"Sicherheit der Software-Lieferkette",{"href":2878,"dataGaLocation":2782,"dataGaName":2879},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":2881,"config":2882},"Software-Compliance",{"href":2883,"dataGaName":2884,"dataGaLocation":2782},"/de-de/solutions/software-compliance/","software compliance",{"title":2886,"link":2887,"items":2892},"Messung",{"config":2888},{"icon":2889,"href":2890,"dataGaName":2891,"dataGaLocation":2782},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[2893,2897,2902],{"text":2894,"config":2895},"Sichtbarkeit und Messung",{"href":2890,"dataGaLocation":2782,"dataGaName":2896},"Visibility and Measurement",{"text":2898,"config":2899},"Wertstrommanagement",{"href":2900,"dataGaLocation":2782,"dataGaName":2901},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":2903,"config":2904},"Analysen und Einblicke",{"href":2905,"dataGaLocation":2782,"dataGaName":2906},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":2908,"type":2832,"items":2909},"GitLab für",[2910,2916,2922],{"text":2911,"config":2912},"Enterprise",{"icon":2913,"href":2914,"dataGaLocation":2782,"dataGaName":2915},"Building","/de-de/enterprise/","enterprise",{"text":2917,"config":2918},"Kleinunternehmen",{"icon":2919,"href":2920,"dataGaLocation":2782,"dataGaName":2921},"Work","/de-de/small-business/","small business",{"text":2923,"config":2924},"Öffentlicher Sektor",{"icon":2925,"href":2926,"dataGaLocation":2782,"dataGaName":2927},"Organization","/de-de/solutions/public-sector/","public sector",{"text":2929,"config":2930},"Preise",{"href":2931,"dataGaName":2932,"dataGaLocation":2782,"dataNavLevelOne":2932},"/de-de/pricing/","pricing",{"text":2934,"config":2935,"menu":2937},"Ressourcen",{"dataNavLevelOne":2936},"resources",{"type":2832,"link":2938,"columns":2942,"feature":3026},{"text":2939,"config":2940},"Alle Ressourcen anzeigen",{"href":2941,"dataGaName":2936,"dataGaLocation":2782},"/de-de/resources/",[2943,2976,2998],{"title":2944,"items":2945},"Erste Schritte",[2946,2951,2956,2961,2966,2971],{"text":2947,"config":2948},"Installieren",{"href":2949,"dataGaName":2950,"dataGaLocation":2782},"/de-de/install/","install",{"text":2952,"config":2953},"Kurzanleitungen",{"href":2954,"dataGaName":2955,"dataGaLocation":2782},"/de-de/get-started/","quick setup checklists",{"text":2957,"config":2958},"Lernen",{"href":2959,"dataGaLocation":2782,"dataGaName":2960},"https://university.gitlab.com/","learn",{"text":2962,"config":2963},"Produktdokumentation",{"href":2964,"dataGaName":2965,"dataGaLocation":2782},"https://docs.gitlab.com/","product documentation",{"text":2967,"config":2968},"Best-Practice-Videos",{"href":2969,"dataGaName":2970,"dataGaLocation":2782},"/de-de/getting-started-videos/","best practice videos",{"text":2972,"config":2973},"Integrationen",{"href":2974,"dataGaName":2975,"dataGaLocation":2782},"/de-de/integrations/","integrations",{"title":2977,"items":2978},"Entdecken",[2979,2984,2989,2993],{"text":2980,"config":2981},"Kundenerfolge",{"href":2982,"dataGaName":2983,"dataGaLocation":2782},"/de-de/customers/","customer success stories",{"text":2985,"config":2986},"Blog",{"href":2987,"dataGaName":2988,"dataGaLocation":2782},"/de-de/blog/","blog",{"text":2990,"config":2991},"The Source",{"href":2992,"dataGaName":2988,"dataGaLocation":2782},"/de-de/the-source/",{"text":2994,"config":2995},"Remote",{"href":2996,"dataGaName":2997,"dataGaLocation":2782},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":2999,"items":3000},"Vernetzen",[3001,3006,3011,3016,3021],{"text":3002,"config":3003},"GitLab-Services",{"href":3004,"dataGaName":3005,"dataGaLocation":2782},"/de-de/services/","services",{"text":3007,"config":3008},"Community",{"href":3009,"dataGaName":3010,"dataGaLocation":2782},"/community/","community",{"text":3012,"config":3013},"Forum",{"href":3014,"dataGaName":3015,"dataGaLocation":2782},"https://forum.gitlab.com/","forum",{"text":3017,"config":3018},"Veranstaltungen",{"href":3019,"dataGaName":3020,"dataGaLocation":2782},"/events/","events",{"text":3022,"config":3023},"Partner",{"href":3024,"dataGaName":3025,"dataGaLocation":2782},"/de-de/partners/","partners",{"config":3027,"title":3030,"text":3031,"link":3032},{"background":3028,"textColor":3029},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Neues bei GitLab","Über die neuesten Funktionen und Verbesserungen auf dem Laufenden bleiben.",{"text":3033,"config":3034},"Aktuelle Nachrichten",{"href":3035,"dataGaName":3036,"dataGaLocation":2782},"/de-de/whats-new/","whats new",{"text":3038,"config":3039,"menu":3041},"Company",{"dataNavLevelOne":3040},"company",{"type":2832,"columns":3042},[3043],{"items":3044},[3045,3050,3056,3058,3063,3068,3073,3078,3083,3088],{"text":3046,"config":3047},"Über",{"href":3048,"dataGaName":3049,"dataGaLocation":2782},"/de-de/company/","about",{"text":3051,"config":3052,"footerGa":3055},"Karriere",{"href":3053,"dataGaName":3054,"dataGaLocation":2782},"/jobs/","jobs",{"dataGaName":3054},{"text":3017,"config":3057},{"href":3019,"dataGaName":3020,"dataGaLocation":2782},{"text":3059,"config":3060},"Geschäftsführung",{"href":3061,"dataGaName":3062,"dataGaLocation":2782},"/company/team/e-group/","leadership",{"text":3064,"config":3065},"Handbuch",{"href":3066,"dataGaName":3067,"dataGaLocation":2782},"https://handbook.gitlab.com/","handbook",{"text":3069,"config":3070},"Investor Relations",{"href":3071,"dataGaName":3072,"dataGaLocation":2782},"https://ir.gitlab.com/","investor relations",{"text":3074,"config":3075},"Trust Center",{"href":3076,"dataGaName":3077,"dataGaLocation":2782},"/de-de/security/","trust center",{"text":3079,"config":3080},"AI Transparency Center",{"href":3081,"dataGaName":3082,"dataGaLocation":2782},"/de-de/ai-transparency-center/","ai transparency center",{"text":3084,"config":3085},"Newsletter",{"href":3086,"dataGaName":3087,"dataGaLocation":2782},"/company/contact/#contact-forms","newsletter",{"text":3089,"config":3090},"Presse",{"href":3091,"dataGaName":3092,"dataGaLocation":2782},"/press/","press",{"text":3094,"config":3095,"menu":3096},"Kontakt",{"dataNavLevelOne":3040},{"type":2832,"columns":3097},[3098],{"items":3099},[3100,3103,3108],{"text":2789,"config":3101},{"href":2791,"dataGaName":3102,"dataGaLocation":2782},"talk to sales",{"text":3104,"config":3105},"Support-Portal",{"href":3106,"dataGaName":3107,"dataGaLocation":2782},"https://support.gitlab.com","support portal",{"text":3109,"config":3110},"Kundenportal",{"href":3111,"dataGaName":3112,"dataGaLocation":2782},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":3114,"login":3115,"suggestions":3122},"Schließen",{"text":3116,"link":3117},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":3118,"config":3119},"gitlab.com",{"href":2796,"dataGaName":3120,"dataGaLocation":3121},"search login","search",{"text":3123,"default":3124},"Vorschläge",[3125,3127,3132,3134,3139,3144],{"text":2813,"config":3126},{"href":2818,"dataGaName":2813,"dataGaLocation":3121},{"text":3128,"config":3129},"Codevorschläge (KI)",{"href":3130,"dataGaName":3131,"dataGaLocation":3121},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":2772,"config":3133},{"href":2849,"dataGaName":2772,"dataGaLocation":3121},{"text":3135,"config":3136},"GitLab auf AWS",{"href":3137,"dataGaName":3138,"dataGaLocation":3121},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":3140,"config":3141},"GitLab auf Google Cloud",{"href":3142,"dataGaName":3143,"dataGaLocation":3121},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":2712,"config":3145},{"href":2825,"dataGaName":3146,"dataGaLocation":3121},"Why GitLab?",{"freeTrial":3148,"mobileIcon":3153,"desktopIcon":3158,"secondaryButton":3161},{"text":3149,"config":3150},"Kostenlos testen",{"href":3151,"dataGaName":2787,"dataGaLocation":3152},"https://gitlab.com/-/trials/new/","nav",{"altText":3154,"config":3155},"GitLab-Symbol",{"src":3156,"dataGaName":3157,"dataGaLocation":3152},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":3154,"config":3159},{"src":3160,"dataGaName":3157,"dataGaLocation":3152},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":2944,"config":3162},{"href":3163,"dataGaName":3164,"dataGaLocation":3152},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":3166,"mobileIcon":3170,"desktopIcon":3172},{"text":3167,"config":3168},"Mehr über GitLab Duo erfahren",{"href":2818,"dataGaName":3169,"dataGaLocation":3152},"gitlab duo",{"altText":3154,"config":3171},{"src":3156,"dataGaName":3157,"dataGaLocation":3152},{"altText":3154,"config":3173},{"src":3160,"dataGaName":3157,"dataGaLocation":3152},{"button":3175,"mobileIcon":3180,"desktopIcon":3182},{"text":3176,"config":3177},"/Option",{"href":3178,"dataGaName":3179,"dataGaLocation":3152},"#contact","switch",{"altText":3154,"config":3181},{"src":3156,"dataGaName":3157,"dataGaLocation":3152},{"altText":3154,"config":3183},{"src":3184,"dataGaName":3157,"dataGaLocation":3152},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":3186,"mobileIcon":3191,"desktopIcon":3193},{"text":3187,"config":3188},"Zurück zur Preisübersicht",{"href":2931,"dataGaName":3189,"dataGaLocation":3152,"icon":3190},"back to pricing","GoBack",{"altText":3154,"config":3192},{"src":3156,"dataGaName":3157,"dataGaLocation":3152},{"altText":3154,"config":3194},{"src":3160,"dataGaName":3157,"dataGaLocation":3152},{"title":3196,"button":3197,"config":3202},"Sieh dir an, wie agentische KI die Softwarebereitstellung transformiert",{"text":3198,"config":3199},"Jetzt live bei GitLab Transcend am 10. Juni dabei sein",{"href":3200,"dataGaName":3201,"dataGaLocation":2782},"/de-de/events/transcend/virtual/","transcend event",{"layout":3203,"disabled":2762},"release",{"data":3205},{"text":3206,"source":3207,"edit":3213,"contribute":3218,"config":3223,"items":3228,"minimal":3434},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":3208,"config":3209},"Quelltext der Seite anzeigen",{"href":3210,"dataGaName":3211,"dataGaLocation":3212},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":3214,"config":3215},"Diese Seite bearbeiten",{"href":3216,"dataGaName":3217,"dataGaLocation":3212},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":3219,"config":3220},"Beteilige dich",{"href":3221,"dataGaName":3222,"dataGaLocation":3212},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":3224,"facebook":3225,"youtube":3226,"linkedin":3227},"https://x.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[3229,3274,3327,3369,3400],{"title":2929,"links":3230,"subMenu":3245},[3231,3235,3240],{"text":3232,"config":3233},"Tarife anzeigen",{"href":2931,"dataGaName":3234,"dataGaLocation":3212},"view plans",{"text":3236,"config":3237},"Vorteile von Premium",{"href":3238,"dataGaName":3239,"dataGaLocation":3212},"/de-de/pricing/premium/","why premium",{"text":3241,"config":3242},"Vorteile von Ultimate",{"href":3243,"dataGaName":3244,"dataGaLocation":3212},"/de-de/pricing/ultimate/","why ultimate",[3246],{"title":3094,"links":3247},[3248,3250,3252,3254,3259,3264,3269],{"text":2789,"config":3249},{"href":2791,"dataGaName":2792,"dataGaLocation":3212},{"text":3104,"config":3251},{"href":3106,"dataGaName":3107,"dataGaLocation":3212},{"text":3109,"config":3253},{"href":3111,"dataGaName":3112,"dataGaLocation":3212},{"text":3255,"config":3256},"Status",{"href":3257,"dataGaName":3258,"dataGaLocation":3212},"https://status.gitlab.com/","status",{"text":3260,"config":3261},"Nutzungsbedingungen",{"href":3262,"dataGaName":3263,"dataGaLocation":3212},"/terms/","terms of use",{"text":3265,"config":3266},"Datenschutzerklärung",{"href":3267,"dataGaName":3268,"dataGaLocation":3212},"/de-de/privacy/","privacy statement",{"text":3270,"config":3271},"Cookie-Einstellungen",{"dataGaName":3272,"dataGaLocation":3212,"id":3273,"isOneTrustButton":187},"cookie preferences","ot-sdk-btn",{"title":2828,"links":3275,"subMenu":3284},[3276,3280],{"text":3277,"config":3278},"DevSecOps-Plattform",{"href":2811,"dataGaName":3279,"dataGaLocation":3212},"devsecops platform",{"text":3281,"config":3282},"KI-unterstützte Entwicklung",{"href":2818,"dataGaName":3283,"dataGaLocation":3212},"ai-assisted development",[3285],{"title":3286,"links":3287},"Themen",[3288,3292,3297,3302,3307,3312,3317,3322],{"text":2772,"config":3289},{"href":3290,"dataGaName":3291,"dataGaLocation":3212},"/de-de/topics/ci-cd/","cicd",{"text":3293,"config":3294},"GitOps",{"href":3295,"dataGaName":3296,"dataGaLocation":3212},"/de-de/topics/gitops/","gitops",{"text":3298,"config":3299},"DevOps",{"href":3300,"dataGaName":3301,"dataGaLocation":3212},"/de-de/topics/devops/","devops",{"text":3303,"config":3304},"Versionskontrolle",{"href":3305,"dataGaName":3306,"dataGaLocation":3212},"/de-de/topics/version-control/","version control",{"text":3308,"config":3309},"DevSecOps",{"href":3310,"dataGaName":3311,"dataGaLocation":3212},"/de-de/topics/devsecops/","devsecops",{"text":3313,"config":3314},"Cloud-nativ",{"href":3315,"dataGaName":3316,"dataGaLocation":3212},"/de-de/topics/cloud-native/","cloud native",{"text":3318,"config":3319},"KI für das Programmieren",{"href":3320,"dataGaName":3321,"dataGaLocation":3212},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":3323,"config":3324},"Agentische KI",{"href":3325,"dataGaName":3326,"dataGaLocation":3212},"/de-de/topics/agentic-ai/","agentic ai",{"title":3328,"links":3329},"Lösungen",[3330,3333,3335,3340,3344,3347,3350,3353,3355,3357,3359,3364],{"text":2872,"config":3331},{"href":2867,"dataGaName":3332,"dataGaLocation":3212},"Application Security Testing",{"text":2859,"config":3334},{"href":2844,"dataGaName":2845,"dataGaLocation":3212},{"text":3336,"config":3337},"Agile Entwicklung",{"href":3338,"dataGaName":3339,"dataGaLocation":3212},"/de-de/solutions/agile-delivery/","agile delivery",{"text":3341,"config":3342},"SCM",{"href":2856,"dataGaName":3343,"dataGaLocation":3212},"source code management",{"text":2772,"config":3345},{"href":2849,"dataGaName":3346,"dataGaLocation":3212},"continuous integration & delivery",{"text":2898,"config":3348},{"href":2900,"dataGaName":3349,"dataGaLocation":3212},"value stream management",{"text":3293,"config":3351},{"href":3352,"dataGaName":3296,"dataGaLocation":3212},"/de-de/solutions/gitops/",{"text":2911,"config":3354},{"href":2914,"dataGaName":2915,"dataGaLocation":3212},{"text":2917,"config":3356},{"href":2920,"dataGaName":2921,"dataGaLocation":3212},{"text":2923,"config":3358},{"href":2926,"dataGaName":2927,"dataGaLocation":3212},{"text":3360,"config":3361},"Bildungswesen",{"href":3362,"dataGaName":3363,"dataGaLocation":3212},"/de-de/solutions/education/","education",{"text":3365,"config":3366},"Finanzdienstleistungen",{"href":3367,"dataGaName":3368,"dataGaLocation":3212},"/de-de/solutions/finance/","financial services",{"title":2934,"links":3370},[3371,3373,3375,3377,3380,3382,3385,3387,3389,3392,3394,3396,3398],{"text":2947,"config":3372},{"href":2949,"dataGaName":2950,"dataGaLocation":3212},{"text":2952,"config":3374},{"href":2954,"dataGaName":2955,"dataGaLocation":3212},{"text":2957,"config":3376},{"href":2959,"dataGaName":2960,"dataGaLocation":3212},{"text":2962,"config":3378},{"href":2964,"dataGaName":3379,"dataGaLocation":3212},"docs",{"text":2985,"config":3381},{"href":2987,"dataGaName":2988,"dataGaLocation":3212},{"text":3383,"config":3384},"Neuigkeiten",{"href":3035,"dataGaName":3036,"dataGaLocation":3212},{"text":2980,"config":3386},{"href":2982,"dataGaName":2983,"dataGaLocation":3212},{"text":2994,"config":3388},{"href":2996,"dataGaName":2997,"dataGaLocation":3212},{"text":3390,"config":3391},"GitLab Services",{"href":3004,"dataGaName":3005,"dataGaLocation":3212},{"text":3007,"config":3393},{"href":3009,"dataGaName":3010,"dataGaLocation":3212},{"text":3012,"config":3395},{"href":3014,"dataGaName":3015,"dataGaLocation":3212},{"text":3017,"config":3397},{"href":3019,"dataGaName":3020,"dataGaLocation":3212},{"text":3022,"config":3399},{"href":3024,"dataGaName":3025,"dataGaLocation":3212},{"title":3401,"links":3402},"Unternehmen",[3403,3405,3407,3409,3411,3413,3418,3423,3425,3427,3429],{"text":3046,"config":3404},{"href":3048,"dataGaName":3040,"dataGaLocation":3212},{"text":3051,"config":3406},{"href":3053,"dataGaName":3054,"dataGaLocation":3212},{"text":3059,"config":3408},{"href":3061,"dataGaName":3062,"dataGaLocation":3212},{"text":3064,"config":3410},{"href":3066,"dataGaName":3067,"dataGaLocation":3212},{"text":3069,"config":3412},{"href":3071,"dataGaName":3072,"dataGaLocation":3212},{"text":3414,"config":3415},"Nachhaltigkeit",{"href":3416,"dataGaName":3417,"dataGaLocation":3212},"/sustainability/","Sustainability",{"text":3419,"config":3420},"Vielfalt, Inklusion und Zugehörigkeit",{"href":3421,"dataGaName":3422,"dataGaLocation":3212},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":3074,"config":3424},{"href":3076,"dataGaName":3077,"dataGaLocation":3212},{"text":3084,"config":3426},{"href":3086,"dataGaName":3087,"dataGaLocation":3212},{"text":3089,"config":3428},{"href":3091,"dataGaName":3092,"dataGaLocation":3212},{"text":3430,"config":3431},"Transparenzerklärung zu moderner Sklaverei",{"href":3432,"dataGaName":3433,"dataGaLocation":3212},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":3435},[3436,3438,3441],{"text":3260,"config":3437},{"href":3262,"dataGaName":3263,"dataGaLocation":3212},{"text":3439,"config":3440},"Cookies",{"dataGaName":3272,"dataGaLocation":3212,"id":3273,"isOneTrustButton":187},{"text":3265,"config":3442},{"href":3267,"dataGaName":3268,"dataGaLocation":3212},[3444],{"id":3445,"title":7,"body":2761,"config":3446,"content":3449,"description":2761,"extension":3452,"meta":3453,"navigation":187,"path":3454,"seo":3455,"stem":3456,"__hash__":3457},"blogAuthors/en-us/blog/authors/paul-meresanu.yml",{"template":3447,"gitlabHandle":3448},"BlogAuthor","pmeresanu",{"name":7,"role":159,"config":3450},{"headshot":3451},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750267141/qpw5ayteg0sewyh7s8xi.png","yml",{},"/en-us/blog/authors/paul-meresanu",{},"en-us/blog/authors/paul-meresanu","S41feQ9U81y4EVDx5pEECPqpIEiKTCDLBOmNwjLyE1E",[3459,3467,3475],{"title":3460,"description":3461,"heroImage":3462,"category":2757,"date":3463,"authors":3464,"slug":3466,"externalUrl":2761},"5 GitLab-Pipeline-Muster für komplexe Engineering-Herausforderungen","Wie Parent-Child-Pipelines, DAG-Execution, MR-Pipelines und CI/CD Components komplexe Delivery-Probleme lösen – von Monorepos bis zur governed Plattform.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1772721753/frfsm1qfscwrmsyzj1qn.png","2026-04-09",[3465],"Omid Khan","5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"title":3468,"description":3469,"heroImage":3470,"category":2757,"date":3471,"authors":3472,"slug":3474,"externalUrl":2761},"GitLab Container Virtual Registry mit Docker Hardened Images einrichten","Mehrere Registries hinter einem Endpunkt – GitLab Container Virtual Registry mit Docker Hardened Images, Caching und Audit-Trail.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1772111172/mwhgbjawn62kymfwrhle.png","2026-03-12",[3473],"Tim Rizzi","using-gitlab-container-virtual-registry-with-docker-hardened-images",{"title":3476,"description":3477,"heroImage":3478,"category":2757,"date":3479,"authors":3480,"slug":3483,"externalUrl":2761},"Migration von Azure DevOps zu GitLab systematisch planen","Professional Services Migrationsansatz mit mehrstufiger Struktur, 200-300 Projekt-Wellen und systematischem Risikomanagement für Enterprise-Migrationen.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749658924/Blog/Hero%20Images/securitylifecycle-light.png","2025-12-03",[3481,3482],"Evgeny Rudinsky","Michael Leopard","migration-from-azure-devops-to-gitlab",{"promotions":3485},[3486,3500,3511,3523],{"id":3487,"categories":3488,"header":3490,"text":3491,"button":3492,"image":3497},"ai-modernization",[3489],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":3493,"config":3494},"Ermittle deinen KI-Reifegrad",{"href":3495,"dataGaName":3496,"dataGaLocation":2988},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":3498},{"src":3499},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":3501,"categories":3502,"header":3503,"text":3491,"button":3504,"image":3508},"devops-modernization",[2773,3311],"Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":3505,"config":3506},"Ermittle deinen DevOps-Reifegrad",{"href":3507,"dataGaName":3496,"dataGaLocation":2988},"/de-de/assessments/devops-modernization-assessment/",{"config":3509},{"src":3510},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":3512,"categories":3513,"header":3515,"text":3491,"button":3516,"image":3520},"security-modernization",[3514],"security","Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":3517,"config":3518},"Ermittle deinen Sicherheitsreifegrad",{"href":3519,"dataGaName":3496,"dataGaLocation":2988},"/de-de/assessments/security-modernization-assessment/",{"config":3521},{"src":3522},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":3524,"paths":3525,"header":3527,"text":3528,"button":3529,"image":3534},"github-azure-migration",[3483,3526],"integrating-azure-devops-scm-and-gitlab","Ist dein Team bereit für den Umzug von GitHub nach Azure?","GitHub stellt bereits auf Azure um. Finde heraus, was das für dich bedeutet.",{"text":3530,"config":3531},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":3532,"dataGaName":3533,"dataGaLocation":2988},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":3535},{"src":3510},{"header":3537,"blurb":3538,"button":3539,"secondaryButton":3544},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":3540,"config":3541},"Kostenlosen Test starten",{"href":3542,"dataGaName":2787,"dataGaLocation":3543},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":2789,"config":3545},{"href":2791,"dataGaName":2792,"dataGaLocation":3543},1781392669262]