[{"data":1,"prerenderedAt":786},["ShallowReactive",2],{"/en-us/blog/prometheus-and-gitlab":3,"navigation-en-us":33,"banner-en-us":432,"footer-en-us":442,"blog-post-authors-en-us-Mark Pundsack":684,"blog-related-posts-en-us-prometheus-and-gitlab":698,"assessment-promotions-en-us":737,"next-steps-en-us":776},{"id":4,"title":5,"authorSlugs":6,"body":8,"categorySlug":9,"config":10,"content":14,"description":8,"extension":22,"isFeatured":12,"meta":23,"navigation":24,"path":25,"publishedDate":20,"seo":26,"stem":30,"tagSlugs":31,"__hash__":32},"blogPosts/en-us/blog/prometheus-and-gitlab.yml","Prometheus And Gitlab",[7],"mark-pundsack",null,"company",{"slug":11,"featured":12,"template":13},"prometheus-and-gitlab",false,"BlogPost",{"title":15,"description":16,"authors":17,"heroImage":19,"date":20,"body":21,"category":9},"Prometheus and GitLab","Completing the application lifecycle with monitoring",[18],"Mark Pundsack","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749677903/Blog/Hero%20Images/data.png","2017-01-05","\n\nA little while ago, we presented a first draft of our vision for monitoring within GitLab. We [value transparency](https://handbook.gitlab.com/handbook/values/), so see below for the recorded video and transcript of the presentation, or view the [slides](https://docs.google.com/presentation/d/12SDArWFfr8fGOZEOqUOwn7NMwfuGKBeS1KLJxtBVyMM/edit?usp=sharing) directly. Please do give us your feedback on any of the linked issues!\n\n\u003C!-- more -->\n\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/NFPGtbQfL1A\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\n## GitLab monitoring vision 0.1\n\nThanks everyone for joining. Just to level set: This call is to go over a first draft of our vision for monitoring within GitLab. A version 0.1 of the vision, if you will. I’m presenting it so Sid and others can ask questions and critique it, and to share more broadly. If you’re looking for a polished presentation about a well-defined product, this is the wrong place. :)\n\nI’ll start by talking about a potential minimum viable product (MVP), and then discuss future directions, and finally open it up to Q&A.\n\nAnd if you want to play along at home, here’s a link to your personalized [buzzword bingo card](http://bit.ly/2hP4xTn) for the presentation.\n\n## Minimum Viable Product (MVP)\n### Use Prometheus to monitor GitLab installation\n\nSo the first step is to add [Prometheus](https://prometheus.io/) to monitor GitLab installations themselves. I won’t go into details here; and I believe [Pablo will be giving a talk about how we’re using it](https://gitlab.com/gitlab-com/marketing/issues/594). But in short, Prometheus is an open source monitoring solution. We’ve been using it internally here, and we’re going to bundle it up with GitLab CE so you can use it to monitor your own instances of GitLab.\n\nMeta issue: [gitlab-com/infrastructure/issues/589](https://gitlab.com/gitlab-com/infrastructure/issues/589)\n\nRelated issues:  \n1. [Expose service metrics via Prometheus](https://gitlab.com/gitlab-org/gitlab-workhorse/issues/61)\n1. [Monitor CI end to end with prometheus](https://gitlab.com/gitlab-com/infrastructure/issues/543)\n1. [Build public monitoring infrastructure](https://gitlab.com/gitlab-com/infrastructure/issues/414)\n1. [Bundle Prometheus with GitLab CE](https://gitlab.com/gitlab-org/omnibus-gitlab/issues/1481)\n1. [Build High Available (Federated) prometheus monitoring solution](https://gitlab.com/gitlab-com/infrastructure/issues/760)\n\nHere’s a couple screenshots I cribbed from some of those issues. Again, I’m not going to go into detail here. These are fairly traditional, if not ugly, dashboards using Prometheus and Grafana.\n\n![Sidekiq stats](https://about.gitlab.com/images/blogimages/monitoring/sidekiq-stats.png){: .shadow}\n\n![CPU Usage](https://about.gitlab.com/images/blogimages/monitoring/cpu-usage.png){: .shadow}\n\n## MVP+3\n\n### Web application monitoring\n\nI kind of tongue-in-cheek called this MVP+3, but after some number of iterations, the next **major** step is to [use Prometheus to monitor end-user applications](https://gitlab.com/gitlab-org/gitlab-ce/issues/23841). Ideally, providing a [New Relic](https://newrelic.com/)-like experience. Maybe it’s more accurate to say [Heroku-like monitoring](https://devcenter.heroku.com/articles/metrics) experience. New Relic does TONS of things we won’t touch for a long time, if ever. I believe there’s always a place for dedicated monitoring solutions that go deep. Our unique value won’t be in the deepness of the monitoring, it’ll be in the integration of monitoring into the rest of the experience. That may not be apparent in the initial release, but will show up later.\n\nMVP focuses on:\n* Limit to applications on Kubernetes\n* Response: Throughput, latency, errors\n* Resource: CPU, Memory, I/O\n\nInitially we’ll focus on Kubernetes because that’s where we’re placing a few bets and installing Prometheus into every permutation of hardware is just too much to tackle. So to keep scope smaller, we’ll focus on Kubernetes.\n\nWe’ll start by measuring throughput, latency (or response time), and error rates. I’m calling this response monitoring, and it’s the highest value we can deliver that works for monitoring any web stack.\n\nBut measuring resources such as CPU, memory, and I/O might be easier for an MVP, so I’m keeping that open. Kubernetes may make some parts of that easier, but others harder. I don’t believe we should do all of this for an MVP, so my preference would be the web response side of things. The thinking goes: if one of the resources are constrained, say memory is entering swap too much, then that will show up as latency in the system. So I’d rather observe the material impact to the user directly. Unfortunately that means you don’t see anything until it’s already an impact. And knowing that latency is bad or error rates are up doesn’t help you debug the situation. That’s where resource monitoring can be useful. But still, as a first step, I want to know how my users are impacted and THEN find a way to debug it, at which point I may very well fire up New Relic to do more powerful analysis.\n\n### Monitoring alert on merge request\n\nSo to show how we’re thinking of integrating monitoring, here’s a merge request, that has already been merged and deployed to production. Because we’ve got monitoring, GitLab noticed that memory usage increased right after the deploy, so we get a message right on the merge request.\n\n![Monitoring alert on merge request](https://about.gitlab.com/images/blogimages/monitoring/merge-request__performance--inline-v03.png){: .shadow}\n\nLet’s zoom in a little more. We see the alert, plus some summary information, telling you the memory usage increased from 114MB to 127MB, and a little spark line so you can see it graphically. Maybe we’d add a percent increase to make it more concrete. Of course, we’d also send an email notification of this alert, to the author of the actual changes about the impact. That way, this isn’t just an ops problem, the person or people most likely to be able to deal with it know as soon as possible.\nNow let’s click through and see more details.\n\n### Monitoring dashboard\n\nSo now we see something a little more traditional. This is an early mockup of how a monitoring dashboard could appear. Note even in this early stage, we’ve got lines showing when deploys happened, to help identify code changes that impacted performance. Maybe hovering over them would show a list of merge requests that were included in that deploy.\n\n![Monitoring dashboard](https://about.gitlab.com/images/blogimages/monitoring/environments__monitoring.png){: .shadow}\n\nThis dashboard would be available for all of your environments: production, staging, and review apps. Or maybe you’d only want to install it for production environments. I’m not sure yet.\nThe point is that monitoring is an essential part of environments, deployments, and MRs.\n\n### Deployment history\n\nThis is a screenshot cribbed from New Relic, but I could imagine some of this information show up on our deployment history pages.\n\n![Deployment history](https://about.gitlab.com/images/blogimages/monitoring/deploy-history-e747cf6fa6b33dd414e8099294091dca.png){: .shadow}\n\n## Future\n\n### Monitoring++\n* Response monitoring (throughput, latency, errors)\n* Resource monitoring (CPU, memory, IO)\n* [Status monitoring](https://gitlab.com/gitlab-org/gitlab-ce/issues/25555) (e.g. Pingdom, up/down/uptime, bad MR)\n* Application performance monitoring (APM) (stack-aware, endpoint-aware, code-aware, db-aware)\n* End-user experience monitoring (measured at the browser)\n* User metrics/analytics (e.g. clicks, flows, funnels, a/b testing)\n* User-defined / business metrics (signups, conversions, revenue)\n* Integrated deeply, across the developer experience\n\nSo the future holds an infinite set of possibilities, but I’ll talk about a few directions I’d like to consider moving into.\n\nFirst, there’s more to flesh out in response and resource monitoring, covering whatever we don’t ship in the MVP, and going beyond.\n\nThen there’s status monitoring. Think [Pingdom](https://www.pingdom.com/), which tracks whether your app is responding to a certain HTTP request to know if it’s “up” or “down”, and then alerting on that, and reporting uptime. The linked issue describes an MVP that just checks a URL after each deploy to see if your merge request borked the server or not. I have no idea yet what role Prometheus may play here.\n\nThen there’s the broader application performance monitoring, which really is a superset of these other pieces, but I’m breaking it out to differentiate monitoring that usually requires your code to be instrumented with a client library installed in your application; like a Gem file or an npm module. Generally, it’s language, framework, and stack aware, can analyze code paths, and even profile database SQL queries.\n\nThe next level most APM companies go to is end-user experience monitoring; measuring latency at the browser so it includes the entire trip over the interwebs, and including the time to finish asynchronously loading all Javascript and actually rendering the web page. This gives a truer, and often much scarier, view of the performance of your app.\n\nThen there’s user metrics/analytics. Clicks, flows, and funnels.\n\nLastly, we’ve got user-defined or business metrics like signups, conversions, revenue, or really any action that you determine is important for your business success, or just fun to watch.\n\nNow, I’ve pretty much just defined the entirety of several monitoring industries. Obviously we’re unlikely to be best-of-breed in all of these. At least not in the next release or two. So again, the focus really is how we can provide the biggest bang-for-buck, the 20% effort that delivers 80% of the value, and really leverage our unique value, and that’s in our deep integration; making everything easier to use because it’s already there, and more impactful because it’s integrated across the experience. Anyone can show a graph of performance, where you can see that deploy 123 of merge request XYZ caused a problem, but alerting right on the merge request itself, right after deploying it, and emailing the authors of the actual changes about their impact, well, that’s just the tip of the iceberg of how monitoring could permeate the developer experience.\n\n### Deploy monitoring\n* Track status of deploy from start to finish\n* Finer state detail (ready, preparing, waiting, deploying, finished, failed)\n* Aware of rollout across multiple containers/servers\n* Ability to abort a deploy\n\nNow let’s go in a different direction and talk about something I’m calling [deploy monitoring](https://gitlab.com/gitlab-org/gitlab-ce/issues/21413).\nDeploys aren’t just binary pass/fail, and they’re not instantaneous, but we currently kinda treat them as if they’re both. Deploys can take significant time, going through many different states, and across many containers or servers. Being able to track and debug that complexity is pretty important, especially for larger organizations.\n\n### Deployboard\n\nSo here’s an early mockup of how we could integrate this information into our environment view.\n\n![Deployboard](https://about.gitlab.com/images/blogimages/monitoring/environments__deploy-graphic.png){: .shadow}\n\nOn staging, you see that the last deployment finished, but production has a deployment that is ongoing. Each square represents a container, managed by Kubernetes. Hovering over each one shows the server name and it’s current status. Clicking through might show more details about that container. Since this is the environment list, we also see our review apps, but we’ve hidden the deploy status by default since it’s less important for review apps. For any of these environments, you can click through to the monitoring dashboard I already showed.\n\n### Deploy monitoring++\n* Notify authors of MRs that their changes are now live or in staging\n\nNow deploy monitoring is a rich area with lots of opportunities for growth. Here’s an image from someone else’s Deployboard that shows a Slack notification of a staging deploy, and @ mentioning everyone with code in that change.\n\n![Deployboard notification](https://about.gitlab.com/images/blogimages/monitoring/deployboard_notification.png){: .shadow}\n\nHere are some other ideas I want to explore:\n\n* Incremental rollouts (deploy to 10 containers at a time)\n* Canary deploys (deploy 10 containers, then wait for stats or manual tests)\n* Blue/green deploys\n\nFirst is incremental rollouts where you deploy new code in batches. Say if you’ve got 100 containers to roll, you’d deploy 10 containers at a time, in 10 batches, until all 100 are done.\n\nClosely related to that is a canary deploy, where you deploy to a few containers, and then stop while you wait some period of time for performance statistics to prove that there are no problems. Maybe even do some manual tests on those containers, although really that should have been done in staging.\n\nAnd then there’s blue/green deploy, which has a few definitions, but the one I’m using here is where you have all your traffic going to one fleet of containers or servers, call that the blue fleet. Then you start deploying new code to a green fleet, but don’t send any traffic to it. When the green fleet is up and ready, then you cut over the router to suddenly send all traffic to the green fleet and the blue fleet goes idle. You could leave that blue fleet running in case you need to immediately revert. It’s much faster to switch a router over rather than wait for all servers to deploy again. If you’re using physical servers, these fleets may be permanent, meaning you’ve got to have twice the computing capacity at any time. If they’re containers, you can bring down the idle fleet after some time and then just spin it up again when you do the next deploy.\n\nBut again, these are standard deploy strategies that companies already use. Of course we want to support these best practices, but our challenge will be to integrate these closely into GitLab to deliver even more value from the integrated whole. Integrating deploy strategies with monitoring and our knowledge of the codebase, merge requests, and issues. Maybe an alert of a performance problem automatically generates a new issue labeled appropriately and assigned to the right person so it shows up in their todos.\n\n### Feature flags\n* Decouple deployment from delivery\n* In-code flag to execute one path or another based on externally controllable settings\n* Binary switch\n* Incremental (%) rollout\n* Named group (internal, beta)\n\nI’m going to go off on a tangent for a moment and talk about [Feature Flags](http://martinfowler.com/bliki/FeatureToggle.html).\nFeature flags allow developers to decouple deployment from delivery while reducing risk. It’s usually an in-code mechanism, like an if statement, to conditionally execute one path or another based on externally controllable settings such as a simple all-or-nothing binary switch, or a more complex incremental rollout based on percentages, like turning it on for 10% of your users, or involving named groups like company internal, or a \"beta” group.\nWith feature flags, code can be deployed into production while the feature is still turned off.\n\nMy ideal rollout is something like:\n* Dev team that created it ->\n* internal alpha (all employees minus those giving customer-facing demos) ->\n* select beta (~200 people that signed up for this specific feature) ->\n* private beta (~1000 people that signed up for general beta) ->\n* public beta ->\n* 10% rollout ->\n* GA\n\nFeatures can then be rolled out to internal users, beta users, a percentage of production users, and then to everyone in ever-increases spheres.\nThis help facilitate healthy real-world testing, restricting risk to affect only beta customers rather than everyone, for example, so that you get feedback earlier in the development cycle. Validate your ideas quickly.\nIt also helps stay true to the premise of continuous integration which is that everything is checked into master often and deployed right away. This reduces deployment risk.\n\n* Feature Flags as first-class citizens\n* Compare flag states across environments (e.g. staging has X, which is not yet enabled on production)\n\nI'd like to see us work [feature flags into GitLab](https://gitlab.com/gitlab-org/gitlab-ee/issues/779) in a first-class way. To be honest, I really don’t know how to do that. But I know I’d like to visually see, at a glance, which features are in private beta, for example. If a product manager tries to turn a feature on for general availability, they’ll be subtly reminded that they should consider going through private beta first. Companies should be able to set a rollout policy of what percentages things should go through at each stage.\nIf done right, it’ll encourage a good rollout process, and make it trivially easy for users to follow the flow, every time.\n\n![User flags](https://about.gitlab.com/images/blogimages/monitoring/user-flags.png){: .shadow}\n\n### Feature monitoring\nNow to bring this back to monitoring, feature flags are another rollout mechanism, similar to some of the deployment strategies. So we should be able to [monitor these](https://gitlab.com/gitlab-org/gitlab-ce/issues/24254), showing some analysis/graphing on them.\nPerhaps it’s a simple list of features and summary statistics about them indicating if they're performing as expected. Like:\n* Feature X, rolled out to beta, decreased response time by 5%\n* Feature Y, rolled out to 10%, increased conversion by 25%\n\nThe good thing is that since feature flags often run in parallel, so you’ve got some users with the flag and some users without, you can more accurately determine the performance or other impact. You don’t have to rely on point-in-time changes, like looking at memory before and after a deploy.\n\nAnd it’s quite possible to have multiple flags at the same time, all at different rollout stages. With a deploy, which ships everything in master at once, if there’s a problem with one merge request 25 commits ago, you’ve got to rollback the entire stack until that change is gone. But feature flags are decoupled so if there’s a problem in an individual feature, you can just scale it down to zero without affecting any other feature, and without requiring a lengthy deploy process.\n\nAnother side note, since deployment strategies and feature flags are somewhat advanced topics that currently take quite a commitment to implement, most companies only focus on one of these strategies. If you work on feature flags, you’re not likely to bother with canary deploys, for example. But each tool has their sweet spot of value. Memory problems aren’t likely to show up using feature flags since memory is a system resource that’s really hard to pin down to a specific user. But error rates or conversion metrics are great for this. If we do a great job here, maybe people won’t have to be so stingy on their choice of tools.\n\n### Q&A\n\nAnd with that, I’d like to thank you all for listening, and open it up to questions.\n\n","yml",{},true,"/en-us/blog/prometheus-and-gitlab",{"title":15,"description":16,"ogTitle":15,"ogDescription":16,"noIndex":12,"ogImage":19,"ogUrl":27,"ogSiteName":28,"ogType":29,"canonicalUrls":27},"https://about.gitlab.com/blog/prometheus-and-gitlab","https://about.gitlab.com","article","en-us/blog/prometheus-and-gitlab",[],"FmfEBaltcMHFa0-hWs6DHR0JSli8S60e-9dOtMdlKy8",{"data":34},{"logo":35,"freeTrial":40,"sales":45,"login":50,"items":55,"search":362,"minimal":393,"duo":412,"pricingDeployment":422},{"config":36},{"href":37,"dataGaName":38,"dataGaLocation":39},"/","gitlab logo","header",{"text":41,"config":42},"Get free trial",{"href":43,"dataGaName":44,"dataGaLocation":39},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":46,"config":47},"Talk to sales",{"href":48,"dataGaName":49,"dataGaLocation":39},"/sales/","sales",{"text":51,"config":52},"Sign in",{"href":53,"dataGaName":54,"dataGaLocation":39},"https://gitlab.com/users/sign_in/","sign in",[56,83,178,183,284,343],{"text":57,"config":58,"cards":60},"Platform",{"dataNavLevelOne":59},"platform",[61,67,75],{"title":57,"description":62,"link":63},"The intelligent orchestration platform for DevSecOps",{"text":64,"config":65},"Explore our Platform",{"href":66,"dataGaName":59,"dataGaLocation":39},"/platform/",{"title":68,"description":69,"link":70},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":71,"config":72},"Meet GitLab Duo",{"href":73,"dataGaName":74,"dataGaLocation":39},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":76,"description":77,"link":78},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":79,"config":80},"Learn more",{"href":81,"dataGaName":82,"dataGaLocation":39},"/why-gitlab/","why gitlab",{"text":84,"left":24,"config":85,"link":87,"lists":91,"footer":160},"Product",{"dataNavLevelOne":86},"solutions",{"text":88,"config":89},"View all Solutions",{"href":90,"dataGaName":86,"dataGaLocation":39},"/solutions/",[92,116,139],{"title":93,"description":94,"link":95,"items":100},"Automation","CI/CD and automation to accelerate deployment",{"config":96},{"icon":97,"href":98,"dataGaName":99,"dataGaLocation":39},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[101,105,108,112],{"text":102,"config":103},"CI/CD",{"href":104,"dataGaLocation":39,"dataGaName":102},"/solutions/continuous-integration/",{"text":68,"config":106},{"href":73,"dataGaLocation":39,"dataGaName":107},"gitlab duo agent platform - product menu",{"text":109,"config":110},"Source Code Management",{"href":111,"dataGaLocation":39,"dataGaName":109},"/solutions/source-code-management/",{"text":113,"config":114},"Automated Software Delivery",{"href":98,"dataGaLocation":39,"dataGaName":115},"Automated software delivery",{"title":117,"description":118,"link":119,"items":124},"Security","Deliver code faster without compromising security",{"config":120},{"href":121,"dataGaName":122,"dataGaLocation":39,"icon":123},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[125,129,134],{"text":126,"config":127},"Application Security Testing",{"href":121,"dataGaName":128,"dataGaLocation":39},"Application security testing",{"text":130,"config":131},"Software Supply Chain Security",{"href":132,"dataGaLocation":39,"dataGaName":133},"/solutions/supply-chain/","Software supply chain security",{"text":135,"config":136},"Software Compliance",{"href":137,"dataGaName":138,"dataGaLocation":39},"/solutions/software-compliance/","software compliance",{"title":140,"link":141,"items":146},"Measurement",{"config":142},{"icon":143,"href":144,"dataGaName":145,"dataGaLocation":39},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[147,151,155],{"text":148,"config":149},"Visibility & Measurement",{"href":144,"dataGaLocation":39,"dataGaName":150},"Visibility and Measurement",{"text":152,"config":153},"Value Stream Management",{"href":154,"dataGaLocation":39,"dataGaName":152},"/solutions/value-stream-management/",{"text":156,"config":157},"Analytics & Insights",{"href":158,"dataGaLocation":39,"dataGaName":159},"/solutions/analytics-and-insights/","Analytics and insights",{"title":161,"items":162},"GitLab for",[163,168,173],{"text":164,"config":165},"Enterprise",{"href":166,"dataGaLocation":39,"dataGaName":167},"/enterprise/","enterprise",{"text":169,"config":170},"Small Business",{"href":171,"dataGaLocation":39,"dataGaName":172},"/small-business/","small business",{"text":174,"config":175},"Public Sector",{"href":176,"dataGaLocation":39,"dataGaName":177},"/solutions/public-sector/","public sector",{"text":179,"config":180},"Pricing",{"href":181,"dataGaName":182,"dataGaLocation":39,"dataNavLevelOne":182},"/pricing/","pricing",{"text":184,"config":185,"link":187,"lists":191,"feature":271},"Resources",{"dataNavLevelOne":186},"resources",{"text":188,"config":189},"View all resources",{"href":190,"dataGaName":186,"dataGaLocation":39},"/resources/",[192,225,243],{"title":193,"items":194},"Getting started",[195,200,205,210,215,220],{"text":196,"config":197},"Install",{"href":198,"dataGaName":199,"dataGaLocation":39},"/install/","install",{"text":201,"config":202},"Quick start guides",{"href":203,"dataGaName":204,"dataGaLocation":39},"/get-started/","quick setup checklists",{"text":206,"config":207},"Learn",{"href":208,"dataGaLocation":39,"dataGaName":209},"https://university.gitlab.com/","learn",{"text":211,"config":212},"Product documentation",{"href":213,"dataGaName":214,"dataGaLocation":39},"https://docs.gitlab.com/","product documentation",{"text":216,"config":217},"Best practice videos",{"href":218,"dataGaName":219,"dataGaLocation":39},"/getting-started-videos/","best practice videos",{"text":221,"config":222},"Integrations",{"href":223,"dataGaName":224,"dataGaLocation":39},"/integrations/","integrations",{"title":226,"items":227},"Discover",[228,233,238],{"text":229,"config":230},"Customer success stories",{"href":231,"dataGaName":232,"dataGaLocation":39},"/customers/","customer success stories",{"text":234,"config":235},"Blog",{"href":236,"dataGaName":237,"dataGaLocation":39},"/blog/","blog",{"text":239,"config":240},"Remote",{"href":241,"dataGaName":242,"dataGaLocation":39},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":244,"items":245},"Connect",[246,251,256,261,266],{"text":247,"config":248},"GitLab Services",{"href":249,"dataGaName":250,"dataGaLocation":39},"/services/","services",{"text":252,"config":253},"Community",{"href":254,"dataGaName":255,"dataGaLocation":39},"/community/","community",{"text":257,"config":258},"Forum",{"href":259,"dataGaName":260,"dataGaLocation":39},"https://forum.gitlab.com/","forum",{"text":262,"config":263},"Events",{"href":264,"dataGaName":265,"dataGaLocation":39},"/events/","events",{"text":267,"config":268},"Partners",{"href":269,"dataGaName":270,"dataGaLocation":39},"/partners/","partners",{"backgroundColor":272,"textColor":273,"text":274,"image":275,"link":279},"#2f2a6b","#fff","Insights for the future of software development",{"altText":276,"config":277},"the source promo card",{"src":278},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":280,"config":281},"Read the latest",{"href":282,"dataGaName":283,"dataGaLocation":39},"/the-source/","the source",{"text":285,"config":286,"lists":287},"Company",{"dataNavLevelOne":9},[288],{"items":289},[290,295,301,303,308,313,318,323,328,333,338],{"text":291,"config":292},"About",{"href":293,"dataGaName":294,"dataGaLocation":39},"/company/","about",{"text":296,"config":297,"footerGa":300},"Jobs",{"href":298,"dataGaName":299,"dataGaLocation":39},"/jobs/","jobs",{"dataGaName":299},{"text":262,"config":302},{"href":264,"dataGaName":265,"dataGaLocation":39},{"text":304,"config":305},"Leadership",{"href":306,"dataGaName":307,"dataGaLocation":39},"/company/team/e-group/","leadership",{"text":309,"config":310},"Team",{"href":311,"dataGaName":312,"dataGaLocation":39},"/company/team/","team",{"text":314,"config":315},"Handbook",{"href":316,"dataGaName":317,"dataGaLocation":39},"https://handbook.gitlab.com/","handbook",{"text":319,"config":320},"Investor relations",{"href":321,"dataGaName":322,"dataGaLocation":39},"https://ir.gitlab.com/","investor relations",{"text":324,"config":325},"Trust Center",{"href":326,"dataGaName":327,"dataGaLocation":39},"/security/","trust center",{"text":329,"config":330},"AI Transparency Center",{"href":331,"dataGaName":332,"dataGaLocation":39},"/ai-transparency-center/","ai transparency center",{"text":334,"config":335},"Newsletter",{"href":336,"dataGaName":337,"dataGaLocation":39},"/company/contact/#contact-forms","newsletter",{"text":339,"config":340},"Press",{"href":341,"dataGaName":342,"dataGaLocation":39},"/press/","press",{"text":344,"config":345,"lists":346},"Contact us",{"dataNavLevelOne":9},[347],{"items":348},[349,352,357],{"text":46,"config":350},{"href":48,"dataGaName":351,"dataGaLocation":39},"talk to sales",{"text":353,"config":354},"Support portal",{"href":355,"dataGaName":356,"dataGaLocation":39},"https://support.gitlab.com","support portal",{"text":358,"config":359},"Customer portal",{"href":360,"dataGaName":361,"dataGaLocation":39},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":363,"login":364,"suggestions":371},"Close",{"text":365,"link":366},"To search repositories and projects, login to",{"text":367,"config":368},"gitlab.com",{"href":53,"dataGaName":369,"dataGaLocation":370},"search login","search",{"text":372,"default":373},"Suggestions",[374,376,380,382,386,390],{"text":68,"config":375},{"href":73,"dataGaName":68,"dataGaLocation":370},{"text":377,"config":378},"Code Suggestions (AI)",{"href":379,"dataGaName":377,"dataGaLocation":370},"/solutions/code-suggestions/",{"text":102,"config":381},{"href":104,"dataGaName":102,"dataGaLocation":370},{"text":383,"config":384},"GitLab on AWS",{"href":385,"dataGaName":383,"dataGaLocation":370},"/partners/technology-partners/aws/",{"text":387,"config":388},"GitLab on Google Cloud",{"href":389,"dataGaName":387,"dataGaLocation":370},"/partners/technology-partners/google-cloud-platform/",{"text":391,"config":392},"Why GitLab?",{"href":81,"dataGaName":391,"dataGaLocation":370},{"freeTrial":394,"mobileIcon":399,"desktopIcon":404,"secondaryButton":407},{"text":395,"config":396},"Start free trial",{"href":397,"dataGaName":44,"dataGaLocation":398},"https://gitlab.com/-/trials/new/","nav",{"altText":400,"config":401},"Gitlab Icon",{"src":402,"dataGaName":403,"dataGaLocation":398},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":400,"config":405},{"src":406,"dataGaName":403,"dataGaLocation":398},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":408,"config":409},"Get Started",{"href":410,"dataGaName":411,"dataGaLocation":398},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/compare/gitlab-vs-github/","get started",{"freeTrial":413,"mobileIcon":418,"desktopIcon":420},{"text":414,"config":415},"Learn more about GitLab Duo",{"href":416,"dataGaName":417,"dataGaLocation":398},"/gitlab-duo/","gitlab duo",{"altText":400,"config":419},{"src":402,"dataGaName":403,"dataGaLocation":398},{"altText":400,"config":421},{"src":406,"dataGaName":403,"dataGaLocation":398},{"freeTrial":423,"mobileIcon":428,"desktopIcon":430},{"text":424,"config":425},"Back to pricing",{"href":181,"dataGaName":426,"dataGaLocation":398,"icon":427},"back to pricing","GoBack",{"altText":400,"config":429},{"src":402,"dataGaName":403,"dataGaLocation":398},{"altText":400,"config":431},{"src":406,"dataGaName":403,"dataGaLocation":398},{"title":433,"button":434,"config":439},"See how agentic AI transforms software delivery",{"text":435,"config":436},"Watch GitLab Transcend now",{"href":437,"dataGaName":438,"dataGaLocation":39},"/events/transcend/virtual/","transcend event",{"layout":440,"icon":441},"release","AiStar",{"data":443},{"text":444,"source":445,"edit":451,"contribute":456,"config":461,"items":466,"minimal":673},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":446,"config":447},"View page source",{"href":448,"dataGaName":449,"dataGaLocation":450},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":452,"config":453},"Edit this page",{"href":454,"dataGaName":455,"dataGaLocation":450},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":457,"config":458},"Please contribute",{"href":459,"dataGaName":460,"dataGaLocation":450},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":462,"facebook":463,"youtube":464,"linkedin":465},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[467,514,568,612,639],{"title":179,"links":468,"subMenu":483},[469,473,478],{"text":470,"config":471},"View plans",{"href":181,"dataGaName":472,"dataGaLocation":450},"view plans",{"text":474,"config":475},"Why Premium?",{"href":476,"dataGaName":477,"dataGaLocation":450},"/pricing/premium/","why premium",{"text":479,"config":480},"Why Ultimate?",{"href":481,"dataGaName":482,"dataGaLocation":450},"/pricing/ultimate/","why ultimate",[484],{"title":485,"links":486},"Contact Us",[487,490,492,494,499,504,509],{"text":488,"config":489},"Contact sales",{"href":48,"dataGaName":49,"dataGaLocation":450},{"text":353,"config":491},{"href":355,"dataGaName":356,"dataGaLocation":450},{"text":358,"config":493},{"href":360,"dataGaName":361,"dataGaLocation":450},{"text":495,"config":496},"Status",{"href":497,"dataGaName":498,"dataGaLocation":450},"https://status.gitlab.com/","status",{"text":500,"config":501},"Terms of use",{"href":502,"dataGaName":503,"dataGaLocation":450},"/terms/","terms of use",{"text":505,"config":506},"Privacy statement",{"href":507,"dataGaName":508,"dataGaLocation":450},"/privacy/","privacy statement",{"text":510,"config":511},"Cookie preferences",{"dataGaName":512,"dataGaLocation":450,"id":513,"isOneTrustButton":24},"cookie preferences","ot-sdk-btn",{"title":84,"links":515,"subMenu":524},[516,520],{"text":517,"config":518},"DevSecOps platform",{"href":66,"dataGaName":519,"dataGaLocation":450},"devsecops platform",{"text":521,"config":522},"AI-Assisted Development",{"href":416,"dataGaName":523,"dataGaLocation":450},"ai-assisted development",[525],{"title":526,"links":527},"Topics",[528,533,538,543,548,553,558,563],{"text":529,"config":530},"CICD",{"href":531,"dataGaName":532,"dataGaLocation":450},"/topics/ci-cd/","cicd",{"text":534,"config":535},"GitOps",{"href":536,"dataGaName":537,"dataGaLocation":450},"/topics/gitops/","gitops",{"text":539,"config":540},"DevOps",{"href":541,"dataGaName":542,"dataGaLocation":450},"/topics/devops/","devops",{"text":544,"config":545},"Version Control",{"href":546,"dataGaName":547,"dataGaLocation":450},"/topics/version-control/","version control",{"text":549,"config":550},"DevSecOps",{"href":551,"dataGaName":552,"dataGaLocation":450},"/topics/devsecops/","devsecops",{"text":554,"config":555},"Cloud Native",{"href":556,"dataGaName":557,"dataGaLocation":450},"/topics/cloud-native/","cloud native",{"text":559,"config":560},"AI for Coding",{"href":561,"dataGaName":562,"dataGaLocation":450},"/topics/devops/ai-for-coding/","ai for coding",{"text":564,"config":565},"Agentic AI",{"href":566,"dataGaName":567,"dataGaLocation":450},"/topics/agentic-ai/","agentic ai",{"title":569,"links":570},"Solutions",[571,573,575,580,584,587,591,594,596,599,602,607],{"text":126,"config":572},{"href":121,"dataGaName":126,"dataGaLocation":450},{"text":115,"config":574},{"href":98,"dataGaName":99,"dataGaLocation":450},{"text":576,"config":577},"Agile development",{"href":578,"dataGaName":579,"dataGaLocation":450},"/solutions/agile-delivery/","agile delivery",{"text":581,"config":582},"SCM",{"href":111,"dataGaName":583,"dataGaLocation":450},"source code management",{"text":529,"config":585},{"href":104,"dataGaName":586,"dataGaLocation":450},"continuous integration & delivery",{"text":588,"config":589},"Value stream management",{"href":154,"dataGaName":590,"dataGaLocation":450},"value stream management",{"text":534,"config":592},{"href":593,"dataGaName":537,"dataGaLocation":450},"/solutions/gitops/",{"text":164,"config":595},{"href":166,"dataGaName":167,"dataGaLocation":450},{"text":597,"config":598},"Small business",{"href":171,"dataGaName":172,"dataGaLocation":450},{"text":600,"config":601},"Public sector",{"href":176,"dataGaName":177,"dataGaLocation":450},{"text":603,"config":604},"Education",{"href":605,"dataGaName":606,"dataGaLocation":450},"/solutions/education/","education",{"text":608,"config":609},"Financial services",{"href":610,"dataGaName":611,"dataGaLocation":450},"/solutions/finance/","financial services",{"title":184,"links":613},[614,616,618,620,623,625,627,629,631,633,635,637],{"text":196,"config":615},{"href":198,"dataGaName":199,"dataGaLocation":450},{"text":201,"config":617},{"href":203,"dataGaName":204,"dataGaLocation":450},{"text":206,"config":619},{"href":208,"dataGaName":209,"dataGaLocation":450},{"text":211,"config":621},{"href":213,"dataGaName":622,"dataGaLocation":450},"docs",{"text":234,"config":624},{"href":236,"dataGaName":237,"dataGaLocation":450},{"text":229,"config":626},{"href":231,"dataGaName":232,"dataGaLocation":450},{"text":239,"config":628},{"href":241,"dataGaName":242,"dataGaLocation":450},{"text":247,"config":630},{"href":249,"dataGaName":250,"dataGaLocation":450},{"text":252,"config":632},{"href":254,"dataGaName":255,"dataGaLocation":450},{"text":257,"config":634},{"href":259,"dataGaName":260,"dataGaLocation":450},{"text":262,"config":636},{"href":264,"dataGaName":265,"dataGaLocation":450},{"text":267,"config":638},{"href":269,"dataGaName":270,"dataGaLocation":450},{"title":285,"links":640},[641,643,645,647,649,651,653,657,662,664,666,668],{"text":291,"config":642},{"href":293,"dataGaName":9,"dataGaLocation":450},{"text":296,"config":644},{"href":298,"dataGaName":299,"dataGaLocation":450},{"text":304,"config":646},{"href":306,"dataGaName":307,"dataGaLocation":450},{"text":309,"config":648},{"href":311,"dataGaName":312,"dataGaLocation":450},{"text":314,"config":650},{"href":316,"dataGaName":317,"dataGaLocation":450},{"text":319,"config":652},{"href":321,"dataGaName":322,"dataGaLocation":450},{"text":654,"config":655},"Sustainability",{"href":656,"dataGaName":654,"dataGaLocation":450},"/sustainability/",{"text":658,"config":659},"Diversity, inclusion and belonging (DIB)",{"href":660,"dataGaName":661,"dataGaLocation":450},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":324,"config":663},{"href":326,"dataGaName":327,"dataGaLocation":450},{"text":334,"config":665},{"href":336,"dataGaName":337,"dataGaLocation":450},{"text":339,"config":667},{"href":341,"dataGaName":342,"dataGaLocation":450},{"text":669,"config":670},"Modern Slavery Transparency Statement",{"href":671,"dataGaName":672,"dataGaLocation":450},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":674},[675,678,681],{"text":676,"config":677},"Terms",{"href":502,"dataGaName":503,"dataGaLocation":450},{"text":679,"config":680},"Cookies",{"dataGaName":512,"dataGaLocation":450,"id":513,"isOneTrustButton":24},{"text":682,"config":683},"Privacy",{"href":507,"dataGaName":508,"dataGaLocation":450},[685],{"id":686,"title":18,"body":8,"config":687,"content":689,"description":8,"extension":22,"meta":693,"navigation":24,"path":694,"seo":695,"stem":696,"__hash__":697},"blogAuthors/en-us/blog/authors/mark-pundsack.yml",{"template":688},"BlogAuthor",{"name":18,"config":690},{"headshot":691,"ctfId":692},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","markpundsack",{},"/en-us/blog/authors/mark-pundsack",{},"en-us/blog/authors/mark-pundsack","0XkJx2hq2Kagj8C3zTex7xC4ZA-fT8eE1Uo1cML1zhU",[699,712,723],{"content":700,"config":710},{"title":701,"description":702,"authors":703,"heroImage":705,"date":706,"body":707,"category":9,"tags":708,"updatedDate":706},"GitLab names Bill Staples as new CEO","Co-founder Sid Sijbrandij transitions to Executive Chair of the Board.",[704],"Sid Sijbrandij","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665388/Blog/Hero%20Images/Revised2.png","2024-12-05","__This message from Sid Sijbrandij and Bill Staples was shared with GitLab team members earlier today.__ \n\n__Sid:__ On today’s earnings call, I announced that I am stepping down as CEO and will remain Executive Chair of the Board. I also introduced GitLab’s new CEO, [Bill Staples](https://www.linkedin.com/in/williamstaples/). \n\nAs a Board, we routinely do succession planning. This includes conversations with a number of top executives. We’ve been having these conversations in greater earnest since my cancer returned. Through these discussions, we identified someone uniquely qualified to lead GitLab. I want more time to focus on my cancer treatment and health. My treatments are going well, my cancer is not metastatic, and I'm working towards making a full recovery. Stepping down from a role that I love is not easy, but I believe that it is the right decision for GitLab.\n\nI couldn't be more excited to introduce you to Bill Staples, who will be leading GitLab into its next chapter. Bill will be GitLab’s CEO, effective today. He will also join the GitLab Board as a Director. Bill was most recently a public company CEO at New Relic. During his time there, he significantly increased the value of the company by accelerating revenue and driving increased profitability. He also brings decades of experience in leadership roles at Adobe and Microsoft. When I began speaking with Bill, I was immediately drawn to his customer-centric approach and deep product expertise. As I got to know him further, I knew that his shared value system made him the right person for this role, for our team members, for our customers, and for our shareholders. I feel fortunate that GitLab has found someone with a great leadership track record and strong DevOps expertise to lead GitLab into the future.\n\nWe have come so far from the early days when we launched GitLab.com. We have created the DevOps category and are the leader in the Gartner Magic Quadrant for both vision and execution. Millions of people now use GitLab to deliver software faster and more efficiently. We have integrated AI, Security, and Compliance into our platform to offer our enterprise customers the strongest AI-powered DevSecOps solution. We have also built GitLab in collaboration with our contributors. Last quarter, we had an all-time high of an estimated 1,800 code contributions from the wider community. It is incredible that as GitLab grew, our contributor community grew with us. We have done all of this while being a values-driven company, leading in all-remote work, championing transparency through our public handbook and culture, and co-creating with the wider community.\n\nI feel many things today, but more than anything else, I am grateful. I want to thank our customers. Driving results for them has been at the core of GitLab’s values, and I greatly appreciate their trust in us. I want to thank the wider GitLab community for their trust and enthusiasm. Their tens of thousands of contributions have greatly enhanced GitLab and its value for all users. Thank you, GitLab team members. Your contributions are at the core of GitLab’s success and the value we drive for our customers. Thank you, E-Group. You are amazing partners and collaborators in leading GitLab and our team members to achieve our very best. Thank you, GitLab Board. I have appreciated your support throughout my time as CEO and look forward to our ongoing partnership as I continue to serve as Executive Chair. And, thank you, Bill. I am excited for you to lead our next phase of growth. I am here to support you and the company in GitLab’s next chapter!\n\nI couldn't be more thrilled about Bill and what's ahead for GitLab with him at the helm. We have an incredible opportunity in front of us. Software has never mattered more, and GitLab is well-positioned to be the platform that best enables folks to create, secure, and operate it. I look forward to staying part of the company and being actively involved wherever Bill can use me. \n\n__Bill:__ Thanks, Sid, for the warm welcome! I greatly admire you and what you have accomplished. Very few people in the world have built a $10B market-cap technology company, taken it public, and scaled it to $750M in run-rate revenue. You have done incredible things with GitLab, and I’m grateful you will continue to play a meaningful role in the company. I appreciate your trust in me and commit to building upon the successes you and others should rightfully celebrate. \n\nI am so excited about GitLab and the opportunity ahead of us. Over the coming decade, we will see software-driven transformation around the world as AI accelerates and transforms the software revolution already in motion. GitLab and our mission are going to be more important than ever. I look forward to working with this team to scale GitLab well beyond where it is today.\n",[709],"news",{"slug":711,"featured":24,"template":13},"gitlab-names-bill-staples-as-new-ceo",{"content":713,"config":721},{"title":714,"description":715,"authors":716,"heroImage":718,"date":719,"body":720,"category":9},"Our Privacy Policy has been updated","Our updated Privacy Policy clarifies our existing data processing activities.",[717],"GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664472/Blog/Hero%20Images/gitlabflatlogomap.png","2023-06-14","As part of our commitment to keeping our policies current, we made some updates to our [Privacy Policy](/privacy/) on June 14, 2022.  These updates are intended to clarify our existing data processing activities and to provide information on processing that may derive from new features.  Through this update, we continue to provide transparency to our data processing activities, in line with an evolving privacy landscape.  Specifically, these policy updates include the following:\n\n- Clarification about which processing activities apply to each respective GitLab product;\n- Information about when personal data may be collected to verify someone’s identity to enable certain product features;\n- Clarification about what personal data is collected to provide a license and maintain a subscription; \n- Additional information regarding our Service Usage data collection practices, and the inclusion of certain processing activities, such as Event Analytics and Call Recordings;\n- Additional information regarding the purposes for which personal data is collected;\n- Minor updates regarding our legal basis for processing your personal data in the European Union; \n- Updates to our data retention practices for inactive accounts; \n- Clarification about how to delete your personal data at GitLab and how deletion is effectuated for public projects; \n- An additional notice that details our processing and your rights under the California Consumer Privacy Act, including CCPA metrics reporting;\n\nOverall, we believe that these updates will empower our users to make informed decisions about their personal data.  Please visit the complete text of our Privacy Policy and [Cookie Policy](/privacy/cookies/) to learn more about how GitLab processes personal data and your rights and choices regarding such processing.\n",{"slug":722,"featured":12,"template":13},"our-privacy-policy-has-been-updated",{"content":724,"config":735},{"title":725,"description":726,"authors":727,"heroImage":729,"date":730,"body":731,"category":9,"tags":732},"Rate limitations for unauthorized users of the Projects List API","Learn details about upcoming changes for unauthenticated users of the Projects List API.",[728],"Christina Lohr","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664087/Blog/Hero%20Images/tanukicover.jpg","2023-04-10","\n\nStarting on May 22 for self-managed GitLab, and May 8 for GitLab.com, unauthenticated users will be subject to rate limitations when using the Projects List API. This change has been made to ensure the stability and reliability of our platform for all users.\n\n**Note:** Authorized users are not affected by this change.\n\n## What is the the Projects List API?\n\nThe Projects List API provides information about GitLab projects, including name, description, and other metadata. This API is widely used by our community, including researchers, developers, and integrators, to retrieve and analyze information about GitLab projects. We value this usage and aim to support it as much as possible.\n\n## Rate limitation details\n\nIn recent months, we have observed that the frequency and intensity of requests made by unauthenticated, also known as anonymous, users to the Projects List API have increased significantly. This has resulted in an increased load on our servers, which has impacted the performance and stability of our platform for all users. To address this issue, we have decided to introduce rate limitations for unauthenticated users.\n\nAs a consequence of this change, unauthenticated users of the Projects List API will be limited to 400 requests per 10 minutes per unique IP address on GitLab.com. If an unauthenticated user exceeds this limit, the user will receive a \"429 Too Many Requests\" response. On GitLab.com, this limit cannot be changed. Users of self-managed GitLab instances have the same rate limitation set by default, but [admins can change the rate limits](https://docs.gitlab.com/ee/administration/settings/rate_limit_on_projects_api.html#rate-limit-on-projects-api) as they see fit via the UI or the application settings API. They can also set the rate limit to zero, which acts as if there is no rate limitation at all.\n\nWe understand that this change may impact some of our users who rely on the Projects List API, and we apologize for any inconvenience this may cause. We encourage users who need to make more than 400 requests per 10 minutes to the Projects List API to [sign up for a GitLab account](/pricing/), which provides higher rate limits and other benefits, such as access to additional APIs and integrations.\n\nIf you have any questions or concerns about this change, please do not hesitate to [leave feedback in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/404611).\n",[733,734,709],"product","features",{"slug":736,"featured":12,"template":13},"rate-limitation-for-unauthorized-users-projects-list-api",{"promotions":738},[739,753,764],{"id":740,"categories":741,"header":743,"text":744,"button":745,"image":750},"ai-modernization",[742],"ai-ml","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":746,"config":747},"Get your AI maturity score",{"href":748,"dataGaName":749,"dataGaLocation":237},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":751},{"src":752},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":754,"categories":755,"header":756,"text":744,"button":757,"image":761},"devops-modernization",[733,552],"Are you just managing tools or shipping innovation?",{"text":758,"config":759},"Get your DevOps maturity score",{"href":760,"dataGaName":749,"dataGaLocation":237},"/assessments/devops-modernization-assessment/",{"config":762},{"src":763},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":765,"categories":766,"header":768,"text":744,"button":769,"image":773},"security-modernization",[767],"security","Are you trading speed for security?",{"text":770,"config":771},"Get your security maturity score",{"href":772,"dataGaName":749,"dataGaLocation":237},"/assessments/security-modernization-assessment/",{"config":774},{"src":775},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"header":777,"blurb":778,"button":779,"secondaryButton":784},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":780,"config":781},"Get your free trial",{"href":782,"dataGaName":44,"dataGaLocation":783},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":488,"config":785},{"href":48,"dataGaName":49,"dataGaLocation":783},1772652075800]