[{"data":1,"prerenderedAt":2405},["ShallowReactive",2],{"/blog/monitoring-your-gitlab-environment-with-the-elk-stack":3,"navigation-en-us":1620,"banner-en-us":2045,"footer-en-us":2055,"blog-post-authors-en-us-Daniel Berman":2300,"blog-related-posts-en-us-monitoring-your-gitlab-environment-with-the-elk-stack":2315,"blog-promotions-en-us":2341,"next-steps-en-us":2395},{"id":4,"title":5,"authors":6,"body":8,"category":1582,"date":1583,"description":1584,"extension":1585,"externalUrl":1586,"faq":1586,"featured":1587,"heroImage":1588,"meta":1589,"navigation":562,"path":1608,"seo":1609,"slug":1614,"stem":1615,"tags":1616,"template":1618,"updatedDate":1586,"__hash__":1619},"blogPosts/en-us/blog/monitoring-your-gitlab-environment-with-the-elk-stack.md","How to set up advanced monitoring for your GitLab environment with Logz.io and the ELK stack",[7],"Daniel Berman",{"type":9,"value":10,"toc":1566},"minimark",[11,45,48,56,61,64,85,90,99,102,105,109,112,281,284,287,299,303,306,314,317,326,330,333,550,553,569,573,576,579,585,587,596,604,608,611,614,647,653,668,671,945,948,966,969,973,976,979,1026,1029,1032,1423,1426,1438,1441,1445,1448,1451,1454,1460,1467,1470,1476,1482,1485,1489,1492,1498,1501,1506,1510,1513,1519,1522,1528,1531,1537,1541,1544,1547,1550,1554,1562],[12,13,14,15,20,21,26,27,32,33,38,39,44],"p",{},"GitLab comes with some built-in monitoring and visualization capabilities, such as ",[16,17,19],"a",{"href":18},"/solutions/value-stream-management/","Cycle Analytics"," and the ",[16,22,25],{"href":23,"rel":24},"https://docs.gitlab.com/user/group/contribution_analytics/",[],"per-project contributors"," and ",[16,28,31],{"href":29,"rel":30},"https://docs.gitlab.com/user/project/repository/#repository-graph",[],"repository"," graphs, as well as ",[16,34,37],{"href":35,"rel":36},"https://docs.gitlab.com/administration/monitoring/prometheus/",[],"integration with Prometheus"," to monitor your GitLab instance at the server level. Cycle Analytics is especially useful as it enables teams to analyze their efficiency. However, if you want to analyze the data by searching and querying, or if you want to visualize the data yourself, you might find it helpful to adopt a more centralized methodology by integrating with the ",[16,40,43],{"href":41,"rel":42},"https://logz.io/learn/complete-guide-elk-stack/",[],"ELK Stack"," (Elasticsearch, Logstash and Kibana).",[12,46,47],{},"ELK provides powerful log aggregation, analysis and visualization capabilities that, used in tandem with GitLab’s extensive logging framework, will give organizations an accurate and comprehensive bird's eye view of the system for monitoring, troubleshooting, and analyzing team activity. Using GitLab’s log data, for example, rich dashboards can be created to monitor not only the system’s general health but also specific team metrics, such as the number of commits, issues opened and closed, and so forth.",[12,49,50,55],{},[16,51,54],{"href":52,"rel":53},"https://logz.io/",[],"Logz.io"," users can benefit from a built-in integration with GitLab and the additional analysis tools provided by the service, but if you’re using your own ELK deployment you’ll be able to set up the described integration as well.",[57,58,60],"h2",{"id":59},"how-to-integrate-gitlab-and-logzio","How to integrate GitLab and Logz.io",[12,62,63],{},"The steps outlined below presume the following:",[65,66,67,82],"ul",{},[68,69,70,71,76,77,81],"li",{},"You have an ",[16,72,75],{"href":73,"rel":74},"https://docs.gitlab.com/omnibus/",[],"Omnibus GitLab"," installation up and running. If you haven't installed GitLab already, visit the ",[16,78,80],{"href":79},"/install/","installation page",".",[68,83,84],{},"You have an ELK Stack up and running (either your own ELK deployment or a Logz.io account). We will be using Filebeat to ship the logs into Elasticsearch, so Logstash is only required if you want to apply advanced parsing to the data.",[86,87,89],"h3",{"id":88},"gitlab-logs","GitLab logs",[12,91,92,93,98],{},"As mentioned above, GitLab has an ",[16,94,97],{"href":95,"rel":96},"https://docs.gitlab.com/administration/logs/",[],"advanced logging framework"," that ships a variety of different system logs.",[12,100,101],{},"Of course, what log data you want to ship is entirely up to you. You can ship all the log data, or you can be a bit more selective. These logs can be pretty verbose, so depending on storage and retention considerations, it’s good practice to first understand what logs you need to monitor in the first place.",[12,103,104],{},"The Filebeat configurations provided below are designed for shipping the following logs.",[86,106,108],{"id":107},"production_jsonlog","production_json.log",[12,110,111],{},"This JSON-formatted log records requests sent by GitLab to the Ruby controllers. Here is a sample log:",[113,114,119],"pre",{"className":115,"code":116,"language":117,"meta":118,"style":118},"language-json shiki shiki-themes github-light","{\"method\":\"GET\",\"path\":\"/-/metrics\",\"format\":\"html\",\"controller\":\n\"MetricsController\",\"action\":\"index\",\"status\":200,\"duration\":1.69,\n\"view\":0.23,\"db\":0.0,\"time\":\"2017-12-26T14:47:49.505Z\",\"params\":{},\n\"remote_ip\":null,\"user_id\":null,\"username\":null}\n","json","",[120,121,122,171,210,249],"code",{"__ignoreMap":118},[123,124,127,131,135,138,142,145,148,150,153,155,158,160,163,165,168],"span",{"class":125,"line":126},"line",1,[123,128,130],{"class":129},"sgsFI","{",[123,132,134],{"class":133},"sYu0t","\"method\"",[123,136,137],{"class":129},":",[123,139,141],{"class":140},"sYBdl","\"GET\"",[123,143,144],{"class":129},",",[123,146,147],{"class":133},"\"path\"",[123,149,137],{"class":129},[123,151,152],{"class":140},"\"/-/metrics\"",[123,154,144],{"class":129},[123,156,157],{"class":133},"\"format\"",[123,159,137],{"class":129},[123,161,162],{"class":140},"\"html\"",[123,164,144],{"class":129},[123,166,167],{"class":133},"\"controller\"",[123,169,170],{"class":129},":\n",[123,172,174,177,179,182,184,187,189,192,194,197,199,202,204,207],{"class":125,"line":173},2,[123,175,176],{"class":140},"\"MetricsController\"",[123,178,144],{"class":129},[123,180,181],{"class":133},"\"action\"",[123,183,137],{"class":129},[123,185,186],{"class":140},"\"index\"",[123,188,144],{"class":129},[123,190,191],{"class":133},"\"status\"",[123,193,137],{"class":129},[123,195,196],{"class":133},"200",[123,198,144],{"class":129},[123,200,201],{"class":133},"\"duration\"",[123,203,137],{"class":129},[123,205,206],{"class":133},"1.69",[123,208,209],{"class":129},",\n",[123,211,213,216,218,221,223,226,228,231,233,236,238,241,243,246],{"class":125,"line":212},3,[123,214,215],{"class":133},"\"view\"",[123,217,137],{"class":129},[123,219,220],{"class":133},"0.23",[123,222,144],{"class":129},[123,224,225],{"class":133},"\"db\"",[123,227,137],{"class":129},[123,229,230],{"class":133},"0.0",[123,232,144],{"class":129},[123,234,235],{"class":133},"\"time\"",[123,237,137],{"class":129},[123,239,240],{"class":140},"\"2017-12-26T14:47:49.505Z\"",[123,242,144],{"class":129},[123,244,245],{"class":133},"\"params\"",[123,247,248],{"class":129},":{},\n",[123,250,252,255,257,260,262,265,267,269,271,274,276,278],{"class":125,"line":251},4,[123,253,254],{"class":133},"\"remote_ip\"",[123,256,137],{"class":129},[123,258,259],{"class":133},"null",[123,261,144],{"class":129},[123,263,264],{"class":133},"\"user_id\"",[123,266,137],{"class":129},[123,268,259],{"class":133},[123,270,144],{"class":129},[123,272,273],{"class":133},"\"username\"",[123,275,137],{"class":129},[123,277,259],{"class":133},[123,279,280],{"class":129},"}\n",[12,282,283],{},"As you can see, the information in the log includes the request method, the controller, the action performed, the request status, duration, remote IP, and more.",[12,285,286],{},"The location of the file will vary according to your installation types. In the case of the Omnibus GitLab packages (recommended installation), the file will reside at:",[113,288,292],{"className":289,"code":290,"language":291,"meta":118,"style":118},"language-shell shiki shiki-themes github-light","/var/log/gitlab/gitlab-rails/production_json.log\n","shell",[120,293,294],{"__ignoreMap":118},[123,295,296],{"class":125,"line":126},[123,297,290],{"class":298},"s7eDp",[86,300,302],{"id":301},"productionlog","production.log",[12,304,305],{},"This is a plain text log file that contains information about all performed requests. It includes the request URL, type, and origin IP as well the parts of code that serviced it. The log also provides details on all SQL requests and how long they took. Here is a sample log:",[113,307,312],{"className":308,"code":310,"language":311,"meta":118},[309],"language-text","Completed 200 OK in 1ms (Views: 0.2ms | ActiveRecord: 3.2ms |\nElasticsearch: 1.5ms)\n","text",[120,313,310],{"__ignoreMap":118},[12,315,316],{},"Again, the location of the file varies. In the case of the GitLab Omnibus packages, the file resides at:",[113,318,320],{"className":289,"code":319,"language":291,"meta":118,"style":118},"/var/log/gitlab/gitlab-rails/production.log\n",[120,321,322],{"__ignoreMap":118},[123,323,324],{"class":125,"line":126},[123,325,319],{"class":298},[86,327,329],{"id":328},"api_jsonlog","api_json.log",[12,331,332],{},"A specific, JSON-formatted, file for logging API requests only.",[113,334,336],{"className":115,"code":335,"language":117,"meta":118,"style":118},"{\"time\":\"2017-12-10T18:30:11.219Z\",\"severity\":\"INFO\",\"duration\":5.22,\n\"db\":0.82,\"view\":10.11,\"status\":200,\"method\":\"POST\",\"path\":\"/api/v4/\ninternal/allowed\",\"params\":{\"action\":\"git-upload-pack\",\"changes\":\"_any\",\"\n\u003Cspan style=\"font-weight: 400;\">project\":\"hello-world\",\"protocol\":\"ssh\",\"env\":\"{}\",\"key_id\":\"[FILTERED]\"\n,\"secret_token\":\"[FILTERED]\"},\"host\":\"127.0.0.1\",\"ip\":\"127.0.0.1\",\"ua\":\"Ruby\"}\u003C/span>\n",[120,337,338,370,414,448,504],{"__ignoreMap":118},[123,339,340,342,344,346,349,351,354,356,359,361,363,365,368],{"class":125,"line":126},[123,341,130],{"class":129},[123,343,235],{"class":133},[123,345,137],{"class":129},[123,347,348],{"class":140},"\"2017-12-10T18:30:11.219Z\"",[123,350,144],{"class":129},[123,352,353],{"class":133},"\"severity\"",[123,355,137],{"class":129},[123,357,358],{"class":140},"\"INFO\"",[123,360,144],{"class":129},[123,362,201],{"class":133},[123,364,137],{"class":129},[123,366,367],{"class":133},"5.22",[123,369,209],{"class":129},[123,371,372,374,376,379,381,383,385,388,390,392,394,396,398,400,402,405,407,409,411],{"class":125,"line":173},[123,373,225],{"class":133},[123,375,137],{"class":129},[123,377,378],{"class":133},"0.82",[123,380,144],{"class":129},[123,382,215],{"class":133},[123,384,137],{"class":129},[123,386,387],{"class":133},"10.11",[123,389,144],{"class":129},[123,391,191],{"class":133},[123,393,137],{"class":129},[123,395,196],{"class":133},[123,397,144],{"class":129},[123,399,134],{"class":133},[123,401,137],{"class":129},[123,403,404],{"class":140},"\"POST\"",[123,406,144],{"class":129},[123,408,147],{"class":133},[123,410,137],{"class":129},[123,412,413],{"class":140},"\"/api/v4/\n",[123,415,416,419,421,423,426,428,430,433,435,438,440,443,445],{"class":125,"line":212},[123,417,418],{"class":140},"internal/allowed\"",[123,420,144],{"class":129},[123,422,245],{"class":133},[123,424,425],{"class":129},":{",[123,427,181],{"class":133},[123,429,137],{"class":129},[123,431,432],{"class":140},"\"git-upload-pack\"",[123,434,144],{"class":129},[123,436,437],{"class":133},"\"changes\"",[123,439,137],{"class":129},[123,441,442],{"class":140},"\"_any\"",[123,444,144],{"class":129},[123,446,447],{"class":133},"\"\n",[123,449,450,453,457,460,463,466,469,471,474,476,479,481,484,486,489,491,494,496,499,501],{"class":125,"line":251},[123,451,452],{"class":133},"\u003Cspan style=\"",[123,454,456],{"class":455},"sB1qb","font-weight",[123,458,459],{"class":129},": ",[123,461,462],{"class":133},"400",[123,464,465],{"class":455},";",[123,467,468],{"class":140},"\">project\"",[123,470,137],{"class":455},[123,472,473],{"class":140},"\"hello-world\"",[123,475,144],{"class":129},[123,477,478],{"class":133},"\"protocol\"",[123,480,137],{"class":129},[123,482,483],{"class":140},"\"ssh\"",[123,485,144],{"class":129},[123,487,488],{"class":133},"\"env\"",[123,490,137],{"class":129},[123,492,493],{"class":140},"\"{}\"",[123,495,144],{"class":129},[123,497,498],{"class":133},"\"key_id\"",[123,500,137],{"class":129},[123,502,503],{"class":140},"\"[FILTERED]\"\n",[123,505,507,509,512,514,517,520,523,525,528,530,533,535,537,539,542,544,547],{"class":125,"line":506},5,[123,508,144],{"class":129},[123,510,511],{"class":133},"\"secret_token\"",[123,513,137],{"class":129},[123,515,516],{"class":140},"\"[FILTERED]\"",[123,518,519],{"class":129},"},",[123,521,522],{"class":133},"\"host\"",[123,524,137],{"class":129},[123,526,527],{"class":140},"\"127.0.0.1\"",[123,529,144],{"class":129},[123,531,532],{"class":133},"\"ip\"",[123,534,137],{"class":129},[123,536,527],{"class":140},[123,538,144],{"class":129},[123,540,541],{"class":133},"\"ua\"",[123,543,137],{"class":129},[123,545,546],{"class":140},"\"Ruby\"",[123,548,549],{"class":129},"}\u003C/span>\n",[12,551,552],{},"Location:",[113,554,556],{"className":289,"code":555,"language":291,"meta":118,"style":118},"\n /var/log/gitlab/gitlab-rails/api_json.log\n\n",[120,557,558,564],{"__ignoreMap":118},[123,559,560],{"class":125,"line":126},[123,561,563],{"emptyLinePlaceholder":562},true,"\n",[123,565,566],{"class":125,"line":173},[123,567,568],{"class":298}," /var/log/gitlab/gitlab-rails/api_json.log\n",[86,570,572],{"id":571},"applicationlog","application.log",[12,574,575],{},"This plain text log file tracks GitLab actions such as adding a new user, creating a new project or group, and so forth. Can act as an audit trail for monitoring user activity.",[12,577,578],{},"Example:",[113,580,583],{"className":581,"code":582,"language":311,"meta":118},[309],"December 24, 2017 15:10: User Created: username=dbirtin email=xxx@gmail.com\nip=xx.xx.xxx.xx confirmed:true\n",[120,584,582],{"__ignoreMap":118},[12,586,552],{},[113,588,590],{"className":289,"code":589,"language":291,"meta":118,"style":118},"/var/log/gitlab/gitlab-rails/application.log\n",[120,591,592],{"__ignoreMap":118},[123,593,594],{"class":125,"line":126},[123,595,589],{"class":298},[12,597,598,599,603],{},"In any case, I recommend reading GitLab’s ",[16,600,602],{"href":95,"rel":601},[],"excellent documentation"," to read up on these log files and the information included in them before commencing.",[86,605,607],{"id":606},"configuring-filebeat","Configuring Filebeat",[12,609,610],{},"Filebeat is a log shipper belonging to the Beats family of shippers. Written in Go and extremely lightweight, Filebeat is the easiest and most cost-efficient way of shipping log files into the ELK Stack.",[12,612,613],{},"If you haven’t already installed Filebeat, here are some instructions (for Debian):",[113,615,617],{"className":289,"code":616,"language":291,"meta":118,"style":118},"curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.1.1-amd64.deb\nsudo dpkg -i filebeat-6.1.1-amd64.deb\n",[120,618,619,633],{"__ignoreMap":118},[123,620,621,624,627,630],{"class":125,"line":126},[123,622,623],{"class":298},"curl",[123,625,626],{"class":133}," -L",[123,628,629],{"class":133}," -O",[123,631,632],{"class":140}," https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.1.1-amd64.deb\n",[123,634,635,638,641,644],{"class":125,"line":173},[123,636,637],{"class":298},"sudo",[123,639,640],{"class":140}," dpkg",[123,642,643],{"class":133}," -i",[123,645,646],{"class":140}," filebeat-6.1.1-amd64.deb\n",[12,648,649,650,137],{},"Open up the Filebeat configuration file at: ",[120,651,652],{},"/etc/filebeat/filebeat.yml",[113,654,656],{"className":289,"code":655,"language":291,"meta":118,"style":118},"sudo vim /etc/filebeat/filebeat.yml\n",[120,657,658],{"__ignoreMap":118},[123,659,660,662,665],{"class":125,"line":126},[123,661,637],{"class":298},[123,663,664],{"class":140}," vim",[123,666,667],{"class":140}," /etc/filebeat/filebeat.yml\n",[12,669,670],{},"The following configuration defines the different GitLab files to track and ship into ELK. I’ve defined a prospector for each log type so I can add custom fields to each. Alternatively, I could have defined one prospector for all of the files.",[113,672,676],{"className":673,"code":674,"language":675,"meta":118,"style":118},"language-yaml shiki shiki-themes github-light","filebeat.prospectors:\n- type: log\n  enabled: true\n  paths:\n    - /var/log/gitlab/gitlab-rails/production_json.log\n  fields:\n    log: production_json\n  json.keys_under_root: true\n- type: log\n  enabled: true\n  paths:\n    - /var/log/gitlab/gitlab-rails/production.log\n  fields:\n    log: production\n- type: log\n  enabled: true\n  paths:\n    - /var/log/gitlab/gitlab-rails/api_json.log\n  fields:\n    log: api_json\n  json.keys_under_root: true\n- type: log\n  enabled: true\n  paths:\n    - /var/log/gitlab/gitlab-rails/application.log\n  fields:\n    log: application\noutput.elasticsearch:\n  # Array of hosts to connect to.\n  hosts: [\"localhost:9200\"]\n\n","yaml",[120,677,678,686,699,709,716,723,731,742,752,763,772,779,786,793,803,814,823,830,838,845,855,864,875,884,891,898,905,915,923,930],{"__ignoreMap":118},[123,679,680,684],{"class":125,"line":126},[123,681,683],{"class":682},"shJU0","filebeat.prospectors",[123,685,170],{"class":129},[123,687,688,691,694,696],{"class":125,"line":173},[123,689,690],{"class":129},"- ",[123,692,693],{"class":682},"type",[123,695,459],{"class":129},[123,697,698],{"class":140},"log\n",[123,700,701,704,706],{"class":125,"line":212},[123,702,703],{"class":682},"  enabled",[123,705,459],{"class":129},[123,707,708],{"class":133},"true\n",[123,710,711,714],{"class":125,"line":251},[123,712,713],{"class":682},"  paths",[123,715,170],{"class":129},[123,717,718,721],{"class":125,"line":506},[123,719,720],{"class":129},"    - ",[123,722,290],{"class":140},[123,724,726,729],{"class":125,"line":725},6,[123,727,728],{"class":682},"  fields",[123,730,170],{"class":129},[123,732,734,737,739],{"class":125,"line":733},7,[123,735,736],{"class":682},"    log",[123,738,459],{"class":129},[123,740,741],{"class":140},"production_json\n",[123,743,745,748,750],{"class":125,"line":744},8,[123,746,747],{"class":682},"  json.keys_under_root",[123,749,459],{"class":129},[123,751,708],{"class":133},[123,753,755,757,759,761],{"class":125,"line":754},9,[123,756,690],{"class":129},[123,758,693],{"class":682},[123,760,459],{"class":129},[123,762,698],{"class":140},[123,764,766,768,770],{"class":125,"line":765},10,[123,767,703],{"class":682},[123,769,459],{"class":129},[123,771,708],{"class":133},[123,773,775,777],{"class":125,"line":774},11,[123,776,713],{"class":682},[123,778,170],{"class":129},[123,780,782,784],{"class":125,"line":781},12,[123,783,720],{"class":129},[123,785,319],{"class":140},[123,787,789,791],{"class":125,"line":788},13,[123,790,728],{"class":682},[123,792,170],{"class":129},[123,794,796,798,800],{"class":125,"line":795},14,[123,797,736],{"class":682},[123,799,459],{"class":129},[123,801,802],{"class":140},"production\n",[123,804,806,808,810,812],{"class":125,"line":805},15,[123,807,690],{"class":129},[123,809,693],{"class":682},[123,811,459],{"class":129},[123,813,698],{"class":140},[123,815,817,819,821],{"class":125,"line":816},16,[123,818,703],{"class":682},[123,820,459],{"class":129},[123,822,708],{"class":133},[123,824,826,828],{"class":125,"line":825},17,[123,827,713],{"class":682},[123,829,170],{"class":129},[123,831,833,835],{"class":125,"line":832},18,[123,834,720],{"class":129},[123,836,837],{"class":140},"/var/log/gitlab/gitlab-rails/api_json.log\n",[123,839,841,843],{"class":125,"line":840},19,[123,842,728],{"class":682},[123,844,170],{"class":129},[123,846,848,850,852],{"class":125,"line":847},20,[123,849,736],{"class":682},[123,851,459],{"class":129},[123,853,854],{"class":140},"api_json\n",[123,856,858,860,862],{"class":125,"line":857},21,[123,859,747],{"class":682},[123,861,459],{"class":129},[123,863,708],{"class":133},[123,865,867,869,871,873],{"class":125,"line":866},22,[123,868,690],{"class":129},[123,870,693],{"class":682},[123,872,459],{"class":129},[123,874,698],{"class":140},[123,876,878,880,882],{"class":125,"line":877},23,[123,879,703],{"class":682},[123,881,459],{"class":129},[123,883,708],{"class":133},[123,885,887,889],{"class":125,"line":886},24,[123,888,713],{"class":682},[123,890,170],{"class":129},[123,892,894,896],{"class":125,"line":893},25,[123,895,720],{"class":129},[123,897,589],{"class":140},[123,899,901,903],{"class":125,"line":900},26,[123,902,728],{"class":682},[123,904,170],{"class":129},[123,906,908,910,912],{"class":125,"line":907},27,[123,909,736],{"class":682},[123,911,459],{"class":129},[123,913,914],{"class":140},"application\n",[123,916,918,921],{"class":125,"line":917},28,[123,919,920],{"class":682},"output.elasticsearch",[123,922,170],{"class":129},[123,924,926],{"class":125,"line":925},29,[123,927,929],{"class":928},"sAwPA","  # Array of hosts to connect to.\n",[123,931,933,936,939,942],{"class":125,"line":932},30,[123,934,935],{"class":682},"  hosts",[123,937,938],{"class":129},": [",[123,940,941],{"class":140},"\"localhost:9200\"",[123,943,944],{"class":129},"]\n",[12,946,947],{},"Start Filebeat with:",[113,949,951],{"className":289,"code":950,"language":291,"meta":118,"style":118},"sudo service filebeat start\n",[120,952,953],{"__ignoreMap":118},[123,954,955,957,960,963],{"class":125,"line":126},[123,956,637],{"class":298},[123,958,959],{"class":140}," service",[123,961,962],{"class":140}," filebeat",[123,964,965],{"class":140}," start\n",[12,967,968],{},"After a while, a new index will be created and you can define a new index pattern (filebeat-*) in Kibana to begin analyzing the data.",[86,970,972],{"id":971},"shipping-to-logzio","Shipping to Logz.io",[12,974,975],{},"If you are using Logz.io, a few small modifications need to be applied to establish the logging pipeline.",[12,977,978],{},"First, you will need to download an SSL certificate to use encryption:",[113,980,982],{"className":289,"code":981,"language":291,"meta":118,"style":118},"wget https://raw.githubusercontent.com/logzio/public-certificates/master/COMODORSADomainValidationSecureServerCA.crt\n\nsudo mkdir -p /etc/pki/tls/certs\n\nsudo cp COMODORSADomainValidationSecureServerCA.crt /etc/pki/tls/certs/\n",[120,983,984,992,996,1009,1013],{"__ignoreMap":118},[123,985,986,989],{"class":125,"line":126},[123,987,988],{"class":298},"wget",[123,990,991],{"class":140}," https://raw.githubusercontent.com/logzio/public-certificates/master/COMODORSADomainValidationSecureServerCA.crt\n",[123,993,994],{"class":125,"line":173},[123,995,563],{"emptyLinePlaceholder":562},[123,997,998,1000,1003,1006],{"class":125,"line":212},[123,999,637],{"class":298},[123,1001,1002],{"class":140}," mkdir",[123,1004,1005],{"class":133}," -p",[123,1007,1008],{"class":140}," /etc/pki/tls/certs\n",[123,1010,1011],{"class":125,"line":251},[123,1012,563],{"emptyLinePlaceholder":562},[123,1014,1015,1017,1020,1023],{"class":125,"line":506},[123,1016,637],{"class":298},[123,1018,1019],{"class":140}," cp",[123,1021,1022],{"class":140}," COMODORSADomainValidationSecureServerCA.crt",[123,1024,1025],{"class":140}," /etc/pki/tls/certs/\n",[12,1027,1028],{},"You can now edit the Filebeat configuration file. If you like, you can make use of the Logz.io Filebeat wizard to generate the FIlebeat YAML file automatically (available in the Filebeat section, under Log Shipping in the UI).",[12,1030,1031],{},"Either way, the configurations should look something like this:",[113,1033,1035],{"className":673,"code":1034,"language":675,"meta":118,"style":118},"filebeat:\n  prospectors:\n    -\n      paths:\n        - /var/log/gitlab/gitlab-rails/production_json.log\n      fields:\n        logzio_codec: json\n        token: \u003CyourToken>\n        type: gitlab-production-json\n      fields_under_root: true\n      encoding: utf-8\n      ignore_older: 3h\n    -\n      paths:\n        - /var/log/gitlab/gitlab-rails/production.log\n      fields:\n        logzio_codec: plain\n        token: \u003CyourToken>\n        type: gitlab-production\n      fields_under_root: true\n      encoding: utf-8\n      ignore_older: 3h\n    -\n      paths:\n        - /var/log/gitlab/gitlab-rails/api_json.log\n      fields:\n        logzio_codec: json\n        token: \u003CyourToken>\n        type: gitlab-api-json\n      fields_under_root: true\n      encoding: utf-8\n      ignore_older: 3h\n    -\n      paths:\n        - /var/log/gitlab/gitlab-rails/application.log\n      fields:\n        logzio_codec: plain\n        token: \u003CyourToken>\n        type: gitlab-application\n      fields_under_root: true\n      encoding: utf-8\n      ignore_older: 3h\n  registry_file: /var/lib/filebeat/registry\noutput:\n  logstash:\n    hosts: [\"listener.logz.io:5015\"]\n    ssl:\n      certificate_authorities: ['/etc/pki/tls/certs/COMODORSADomainValidationSecureServerCA.crt']\n\n",[120,1036,1037,1044,1051,1056,1063,1070,1077,1087,1097,1107,1116,1126,1136,1140,1146,1152,1158,1167,1175,1184,1192,1200,1208,1212,1218,1224,1230,1238,1246,1255,1263,1272,1281,1286,1293,1300,1307,1316,1325,1335,1344,1353,1362,1373,1381,1389,1402,1410],{"__ignoreMap":118},[123,1038,1039,1042],{"class":125,"line":126},[123,1040,1041],{"class":682},"filebeat",[123,1043,170],{"class":129},[123,1045,1046,1049],{"class":125,"line":173},[123,1047,1048],{"class":682},"  prospectors",[123,1050,170],{"class":129},[123,1052,1053],{"class":125,"line":212},[123,1054,1055],{"class":129},"    -\n",[123,1057,1058,1061],{"class":125,"line":251},[123,1059,1060],{"class":682},"      paths",[123,1062,170],{"class":129},[123,1064,1065,1068],{"class":125,"line":506},[123,1066,1067],{"class":129},"        - ",[123,1069,290],{"class":140},[123,1071,1072,1075],{"class":125,"line":725},[123,1073,1074],{"class":682},"      fields",[123,1076,170],{"class":129},[123,1078,1079,1082,1084],{"class":125,"line":733},[123,1080,1081],{"class":682},"        logzio_codec",[123,1083,459],{"class":129},[123,1085,1086],{"class":140},"json\n",[123,1088,1089,1092,1094],{"class":125,"line":744},[123,1090,1091],{"class":682},"        token",[123,1093,459],{"class":129},[123,1095,1096],{"class":140},"\u003CyourToken>\n",[123,1098,1099,1102,1104],{"class":125,"line":754},[123,1100,1101],{"class":682},"        type",[123,1103,459],{"class":129},[123,1105,1106],{"class":140},"gitlab-production-json\n",[123,1108,1109,1112,1114],{"class":125,"line":765},[123,1110,1111],{"class":682},"      fields_under_root",[123,1113,459],{"class":129},[123,1115,708],{"class":133},[123,1117,1118,1121,1123],{"class":125,"line":774},[123,1119,1120],{"class":682},"      encoding",[123,1122,459],{"class":129},[123,1124,1125],{"class":140},"utf-8\n",[123,1127,1128,1131,1133],{"class":125,"line":781},[123,1129,1130],{"class":682},"      ignore_older",[123,1132,459],{"class":129},[123,1134,1135],{"class":140},"3h\n",[123,1137,1138],{"class":125,"line":788},[123,1139,1055],{"class":129},[123,1141,1142,1144],{"class":125,"line":795},[123,1143,1060],{"class":682},[123,1145,170],{"class":129},[123,1147,1148,1150],{"class":125,"line":805},[123,1149,1067],{"class":129},[123,1151,319],{"class":140},[123,1153,1154,1156],{"class":125,"line":816},[123,1155,1074],{"class":682},[123,1157,170],{"class":129},[123,1159,1160,1162,1164],{"class":125,"line":825},[123,1161,1081],{"class":682},[123,1163,459],{"class":129},[123,1165,1166],{"class":140},"plain\n",[123,1168,1169,1171,1173],{"class":125,"line":832},[123,1170,1091],{"class":682},[123,1172,459],{"class":129},[123,1174,1096],{"class":140},[123,1176,1177,1179,1181],{"class":125,"line":840},[123,1178,1101],{"class":682},[123,1180,459],{"class":129},[123,1182,1183],{"class":140},"gitlab-production\n",[123,1185,1186,1188,1190],{"class":125,"line":847},[123,1187,1111],{"class":682},[123,1189,459],{"class":129},[123,1191,708],{"class":133},[123,1193,1194,1196,1198],{"class":125,"line":857},[123,1195,1120],{"class":682},[123,1197,459],{"class":129},[123,1199,1125],{"class":140},[123,1201,1202,1204,1206],{"class":125,"line":866},[123,1203,1130],{"class":682},[123,1205,459],{"class":129},[123,1207,1135],{"class":140},[123,1209,1210],{"class":125,"line":877},[123,1211,1055],{"class":129},[123,1213,1214,1216],{"class":125,"line":886},[123,1215,1060],{"class":682},[123,1217,170],{"class":129},[123,1219,1220,1222],{"class":125,"line":893},[123,1221,1067],{"class":129},[123,1223,837],{"class":140},[123,1225,1226,1228],{"class":125,"line":900},[123,1227,1074],{"class":682},[123,1229,170],{"class":129},[123,1231,1232,1234,1236],{"class":125,"line":907},[123,1233,1081],{"class":682},[123,1235,459],{"class":129},[123,1237,1086],{"class":140},[123,1239,1240,1242,1244],{"class":125,"line":917},[123,1241,1091],{"class":682},[123,1243,459],{"class":129},[123,1245,1096],{"class":140},[123,1247,1248,1250,1252],{"class":125,"line":925},[123,1249,1101],{"class":682},[123,1251,459],{"class":129},[123,1253,1254],{"class":140},"gitlab-api-json\n",[123,1256,1257,1259,1261],{"class":125,"line":932},[123,1258,1111],{"class":682},[123,1260,459],{"class":129},[123,1262,708],{"class":133},[123,1264,1266,1268,1270],{"class":125,"line":1265},31,[123,1267,1120],{"class":682},[123,1269,459],{"class":129},[123,1271,1125],{"class":140},[123,1273,1275,1277,1279],{"class":125,"line":1274},32,[123,1276,1130],{"class":682},[123,1278,459],{"class":129},[123,1280,1135],{"class":140},[123,1282,1284],{"class":125,"line":1283},33,[123,1285,1055],{"class":129},[123,1287,1289,1291],{"class":125,"line":1288},34,[123,1290,1060],{"class":682},[123,1292,170],{"class":129},[123,1294,1296,1298],{"class":125,"line":1295},35,[123,1297,1067],{"class":129},[123,1299,589],{"class":140},[123,1301,1303,1305],{"class":125,"line":1302},36,[123,1304,1074],{"class":682},[123,1306,170],{"class":129},[123,1308,1310,1312,1314],{"class":125,"line":1309},37,[123,1311,1081],{"class":682},[123,1313,459],{"class":129},[123,1315,1166],{"class":140},[123,1317,1319,1321,1323],{"class":125,"line":1318},38,[123,1320,1091],{"class":682},[123,1322,459],{"class":129},[123,1324,1096],{"class":140},[123,1326,1328,1330,1332],{"class":125,"line":1327},39,[123,1329,1101],{"class":682},[123,1331,459],{"class":129},[123,1333,1334],{"class":140},"gitlab-application\n",[123,1336,1338,1340,1342],{"class":125,"line":1337},40,[123,1339,1111],{"class":682},[123,1341,459],{"class":129},[123,1343,708],{"class":133},[123,1345,1347,1349,1351],{"class":125,"line":1346},41,[123,1348,1120],{"class":682},[123,1350,459],{"class":129},[123,1352,1125],{"class":140},[123,1354,1356,1358,1360],{"class":125,"line":1355},42,[123,1357,1130],{"class":682},[123,1359,459],{"class":129},[123,1361,1135],{"class":140},[123,1363,1365,1368,1370],{"class":125,"line":1364},43,[123,1366,1367],{"class":682},"  registry_file",[123,1369,459],{"class":129},[123,1371,1372],{"class":140},"/var/lib/filebeat/registry\n",[123,1374,1376,1379],{"class":125,"line":1375},44,[123,1377,1378],{"class":682},"output",[123,1380,170],{"class":129},[123,1382,1384,1387],{"class":125,"line":1383},45,[123,1385,1386],{"class":682},"  logstash",[123,1388,170],{"class":129},[123,1390,1392,1395,1397,1400],{"class":125,"line":1391},46,[123,1393,1394],{"class":682},"    hosts",[123,1396,938],{"class":129},[123,1398,1399],{"class":140},"\"listener.logz.io:5015\"",[123,1401,944],{"class":129},[123,1403,1405,1408],{"class":125,"line":1404},47,[123,1406,1407],{"class":682},"    ssl",[123,1409,170],{"class":129},[123,1411,1413,1416,1418,1421],{"class":125,"line":1412},48,[123,1414,1415],{"class":682},"      certificate_authorities",[123,1417,938],{"class":129},[123,1419,1420],{"class":140},"'/etc/pki/tls/certs/COMODORSADomainValidationSecureServerCA.crt'",[123,1422,944],{"class":129},[12,1424,1425],{},"The main differences are:",[65,1427,1428,1435],{},[68,1429,1430,1431],{},"Logz.io specific fields added to each prospector. Replace ",[1432,1433,1434],"your-token",{}," with your Logz.io account token (can be found in the Logz.io UI, under Settings).",[68,1436,1437],{},"The output section defines the Logz.io listener and the SSL certificate to use.",[12,1439,1440],{},"Once you start (or restart) Filebeat, the GitLab logs will begin to show up in Logz.io.",[86,1442,1444],{"id":1443},"analyzing-the-gitlab-logs","Analyzing the GitLab logs",[12,1446,1447],{},"Now that your logging pipeline is up and running, it’s time to look into the data with some simple analysis operations in Kibana.",[12,1449,1450],{},"Some of the fields can be used to get some visibility into the logs. Adding, for example, the ‘type’ field (the ‘log’ field in case you are using your own ELK), helps give the logs some context.",[12,1452,1453],{},"We can use Kibana queries to search for specific log data. Say, for example, you want to take a look at failed logins into the system. To do this, we would use this combination of a field-level and free-text search:",[113,1455,1458],{"className":1456,"code":1457,"language":311,"meta":118},[309],"type:gitlab-application AND \"failed\"\n",[120,1459,1457],{"__ignoreMap":118},[12,1461,1462],{},[1463,1464],"img",{"alt":1465,"src":1466},"Analyzing logs","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398719/blog/Content%20Images/monitoring-your-gitlab-environment-with-the-elk-stack/analyzing-logs.png",[12,1468,1469],{},"Another example could be querying Elasticsearch for error responses for GitLab requests:",[113,1471,1474],{"className":1472,"code":1473,"language":311,"meta":118},[309],"type:gitlab-production-json AND status:[400 TO *]\n",[120,1475,1473],{"__ignoreMap":118},[12,1477,1478],{},[1463,1479],{"alt":1480,"src":1481},"GitLab requests","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398721/blog/Content%20Images/monitoring-your-gitlab-environment-with-the-elk-stack/gitlab-requests.png",[12,1483,1484],{},"Using Kibana’s visualization capabilities, you can create a series of simple charts and metric visualizations for giving you a nice overview of your GitLab environment. Here are a few examples.",[86,1486,1488],{"id":1487},"visualizing-commits","Visualizing commits",[12,1490,1491],{},"What organization does not want to monitor its team’s productivity? A simple metric visualization will give you a counter on how many commits were performed by your team:",[12,1493,1494],{},[1463,1495],{"alt":1496,"src":1497},"Fourteen commits","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398719/blog/Content%20Images/monitoring-your-gitlab-environment-with-the-elk-stack/14.png",[12,1499,1500],{},"Likewise, we can create a line chart visualization that gives us an overview over time of the commits, per user:",[12,1502,1503],{},[1463,1504],{"alt":1496,"src":1505},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398722/blog/Content%20Images/monitoring-your-gitlab-environment-with-the-elk-stack/line-chart.png",[86,1507,1509],{"id":1508},"visualizing-issues","Visualizing issues",[12,1511,1512],{},"In a similar fashion, you can use Kibana to keep track of opened and closed issues. A simple data table visualization gives us a breakdown of the issues opened:",[12,1514,1515],{},[1463,1516],{"alt":1517,"src":1518},"Visualize issues","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398723/blog/Content%20Images/monitoring-your-gitlab-environment-with-the-elk-stack/visualize-issues-1.png",[12,1520,1521],{},"A line chart can give us a depiction of how many issues were opened over time:",[12,1523,1524],{},[1463,1525],{"alt":1526,"src":1527},"Line chart","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398721/blog/Content%20Images/monitoring-your-gitlab-environment-with-the-elk-stack/line-1.png",[12,1529,1530],{},"The list goes on. You can monitor projects created, merges, user activity, CI/CD processes, and more. The logs generated by GitLab include a wealth of information that can be tapped into for monitoring, and adding these visualizations into one Kibana dashboard gives you a nice overview of your environment.",[12,1532,1533],{},[1463,1534],{"alt":1535,"src":1536},"End dashboard","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398721/blog/Content%20Images/monitoring-your-gitlab-environment-with-the-elk-stack/end-dashboard.png",[86,1538,1540],{"id":1539},"end-notes","End notes",[12,1542,1543],{},"The ELK Stack offers built-in storage, search and visualization features that complement GitLab’s rich logging capabilities. Using Filebeat, building a logging pipeline for shipping data into ELK is simple. If you want to further process the logs, you might want to consider adding Logstash into your pipeline setup.",[12,1545,1546],{},"Logz.io provides some tools to help you hit the ground running – easy integration steps, as well as the monitoring dashboard above. To install the dashboard, simply search for ‘GitLab’ in ELK Apps and hit the install button.",[12,1548,1549],{},"Enjoy!",[57,1551,1553],{"id":1552},"about-the-guest-author","About the guest author",[12,1555,1556,1557,81],{},"Daniel Berman is Product Evangelist at Logz.io. He is passionate about log analytics, big data, cloud, and family and loves running, Liverpool FC, and writing about disruptive tech stuff. Follow him ",[16,1558,1561],{"href":1559,"rel":1560},"https://twitter.com/proudboffin",[],"@proudboffin",[1563,1564,1565],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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 .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sB1qb, html code.shiki .sB1qb{--shiki-default:#B31D28;--shiki-default-font-style:italic}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":118,"searchDepth":173,"depth":173,"links":1567},[1568,1581],{"id":59,"depth":173,"text":60,"children":1569},[1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580],{"id":88,"depth":212,"text":89},{"id":107,"depth":212,"text":108},{"id":301,"depth":212,"text":302},{"id":328,"depth":212,"text":329},{"id":571,"depth":212,"text":572},{"id":606,"depth":212,"text":607},{"id":971,"depth":212,"text":972},{"id":1443,"depth":212,"text":1444},{"id":1487,"depth":212,"text":1488},{"id":1508,"depth":212,"text":1509},{"id":1539,"depth":212,"text":1540},{"id":1552,"depth":173,"text":1553},"engineering","2018-04-13","ELK, together with GitLab’s logging framework, gives organizations a comprehensive view for monitoring, troubleshooting, and analyzing team activity.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749680160/Blog/Hero%20Images/gitlab-logz-io-cover.png",{"excerpt":1590},{"type":9,"value":1591},[1592],[12,1593,14,1594,20,1596,26,1599,32,1602,38,1605,44],{},[16,1595,19],{"href":18},[16,1597,25],{"href":23,"rel":1598},[],[16,1600,31],{"href":29,"rel":1601},[],[16,1603,37],{"href":35,"rel":1604},[],[16,1606,43],{"href":41,"rel":1607},[],"/en-us/blog/monitoring-your-gitlab-environment-with-the-elk-stack",{"title":1610,"description":1584,"ogTitle":1610,"ogDescription":1584,"noIndex":1587,"ogImage":1588,"ogUrl":1611,"ogSiteName":1612,"ogType":1613,"canonicalUrls":1611},"GitLab monitoring: Setting up Logz.io and ELK stack","https://about.gitlab.com/blog/monitoring-your-gitlab-environment-with-the-elk-stack","https://about.gitlab.com","article","monitoring-your-gitlab-environment-with-the-elk-stack","en-us/blog/monitoring-your-gitlab-environment-with-the-elk-stack",[1617],"integrations","BlogPost","X-TxL3LtVGOQhzSCKWEiza-c0DDnnUnc6MYJFp7LYPk",{"logo":1621,"freeTrial":1626,"sales":1631,"login":1636,"items":1641,"search":1965,"minimal":1996,"duo":2015,"switchNav":2024,"pricingDeployment":2035},{"config":1622},{"href":1623,"dataGaName":1624,"dataGaLocation":1625},"/","gitlab logo","header",{"text":1627,"config":1628},"Get free trial",{"href":1629,"dataGaName":1630,"dataGaLocation":1625},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1632,"config":1633},"Request a demo",{"href":1634,"dataGaName":1635,"dataGaLocation":1625},"/sales/?contact-topic=request-demo","sales",{"text":1637,"config":1638},"Sign in",{"href":1639,"dataGaName":1640,"dataGaLocation":1625},"https://gitlab.com/users/sign_in/","sign in",[1642,1671,1770,1775,1887,1943],{"text":1643,"config":1644,"menu":1646},"Platform",{"dataNavLevelOne":1645},"platform",{"type":1647,"columns":1648},"cards",[1649,1655,1663],{"title":1643,"description":1650,"link":1651},"The intelligent orchestration platform for DevSecOps",{"text":1652,"config":1653},"Explore our Platform",{"href":1654,"dataGaName":1645,"dataGaLocation":1625},"/platform/",{"title":1656,"description":1657,"link":1658},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1659,"config":1660},"Meet GitLab Duo",{"href":1661,"dataGaName":1662,"dataGaLocation":1625},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1664,"description":1665,"link":1666},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1667,"config":1668},"Learn more",{"href":1669,"dataGaName":1670,"dataGaLocation":1625},"/why-gitlab/","why gitlab",{"text":1672,"left":562,"config":1673,"menu":1675},"Product",{"dataNavLevelOne":1674},"solutions",{"type":1676,"link":1677,"columns":1681,"feature":1749},"lists",{"text":1678,"config":1679},"View all Solutions",{"href":1680,"dataGaName":1674,"dataGaLocation":1625},"/solutions/",[1682,1706,1729],{"title":1683,"description":1684,"link":1685,"items":1690},"Automation","CI/CD and automation to accelerate deployment",{"config":1686},{"icon":1687,"href":1688,"dataGaName":1689,"dataGaLocation":1625},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1691,1695,1698,1702],{"text":1692,"config":1693},"CI/CD",{"href":1694,"dataGaLocation":1625,"dataGaName":1692},"/solutions/continuous-integration/",{"text":1656,"config":1696},{"href":1661,"dataGaLocation":1625,"dataGaName":1697},"gitlab duo agent platform - product menu",{"text":1699,"config":1700},"Source Code Management",{"href":1701,"dataGaLocation":1625,"dataGaName":1699},"/solutions/source-code-management/",{"text":1703,"config":1704},"Automated Software Delivery",{"href":1688,"dataGaLocation":1625,"dataGaName":1705},"Automated software delivery",{"title":1707,"description":1708,"link":1709,"items":1714},"Security","Deliver code faster without compromising security",{"config":1710},{"href":1711,"dataGaName":1712,"dataGaLocation":1625,"icon":1713},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1715,1719,1724],{"text":1716,"config":1717},"Application Security Testing",{"href":1711,"dataGaName":1718,"dataGaLocation":1625},"Application security testing",{"text":1720,"config":1721},"Software Supply Chain Security",{"href":1722,"dataGaLocation":1625,"dataGaName":1723},"/solutions/supply-chain/","Software supply chain security",{"text":1725,"config":1726},"Software Compliance",{"href":1727,"dataGaName":1728,"dataGaLocation":1625},"/solutions/software-compliance/","software compliance",{"title":1730,"link":1731,"items":1736},"Measurement",{"config":1732},{"icon":1733,"href":1734,"dataGaName":1735,"dataGaLocation":1625},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1737,1741,1744],{"text":1738,"config":1739},"Visibility & Measurement",{"href":1734,"dataGaLocation":1625,"dataGaName":1740},"Visibility and Measurement",{"text":1742,"config":1743},"Value Stream Management",{"href":18,"dataGaLocation":1625,"dataGaName":1742},{"text":1745,"config":1746},"Analytics & Insights",{"href":1747,"dataGaLocation":1625,"dataGaName":1748},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1750,"type":1676,"items":1751},"GitLab for",[1752,1758,1764],{"text":1753,"config":1754},"Enterprise",{"icon":1755,"href":1756,"dataGaLocation":1625,"dataGaName":1757},"Building","/enterprise/","enterprise",{"text":1759,"config":1760},"Small Business",{"icon":1761,"href":1762,"dataGaLocation":1625,"dataGaName":1763},"Work","/small-business/","small business",{"text":1765,"config":1766},"Public Sector",{"icon":1767,"href":1768,"dataGaLocation":1625,"dataGaName":1769},"Organization","/solutions/public-sector/","public sector",{"text":1771,"config":1772},"Pricing",{"href":1773,"dataGaName":1774,"dataGaLocation":1625,"dataNavLevelOne":1774},"/pricing/","pricing",{"text":1776,"config":1777,"menu":1779},"Resources",{"dataNavLevelOne":1778},"resources",{"type":1676,"link":1780,"columns":1784,"feature":1876},{"text":1781,"config":1782},"View all resources",{"href":1783,"dataGaName":1778,"dataGaLocation":1625},"/resources/",[1785,1816,1843],{"title":1786,"items":1787},"Getting started",[1788,1792,1797,1802,1807,1812],{"text":1789,"config":1790},"Install",{"href":79,"dataGaName":1791,"dataGaLocation":1625},"install",{"text":1793,"config":1794},"Quick start guides",{"href":1795,"dataGaName":1796,"dataGaLocation":1625},"/get-started/","quick setup checklists",{"text":1798,"config":1799},"Learn",{"href":1800,"dataGaLocation":1625,"dataGaName":1801},"https://university.gitlab.com/","learn",{"text":1803,"config":1804},"Product documentation",{"href":1805,"dataGaName":1806,"dataGaLocation":1625},"https://docs.gitlab.com/","product documentation",{"text":1808,"config":1809},"Best practice videos",{"href":1810,"dataGaName":1811,"dataGaLocation":1625},"/getting-started-videos/","best practice videos",{"text":1813,"config":1814},"Integrations",{"href":1815,"dataGaName":1617,"dataGaLocation":1625},"/integrations/",{"title":1817,"items":1818},"Discover",[1819,1824,1829,1834,1838],{"text":1820,"config":1821},"Customer success stories",{"href":1822,"dataGaName":1823,"dataGaLocation":1625},"/customers/","customer success stories",{"text":1825,"config":1826},"Blog",{"href":1827,"dataGaName":1828,"dataGaLocation":1625},"/blog/","blog",{"text":1830,"config":1831},"Demo Hub",{"href":1832,"dataGaName":1833,"dataGaLocation":1625},"/demo-hub/","demo hub",{"text":1835,"config":1836},"The Source",{"href":1837,"dataGaName":1828,"dataGaLocation":1625},"/the-source/",{"text":1839,"config":1840},"Remote",{"href":1841,"dataGaName":1842,"dataGaLocation":1625},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1844,"items":1845},"Connect",[1846,1851,1856,1861,1866,1871],{"text":1847,"config":1848},"GitLab Services",{"href":1849,"dataGaName":1850,"dataGaLocation":1625},"/services/","services",{"text":1852,"config":1853},"Contribute",{"href":1854,"dataGaName":1855,"dataGaLocation":1625},"https://contributors.gitlab.com","contribute",{"text":1857,"config":1858},"Community",{"href":1859,"dataGaName":1860,"dataGaLocation":1625},"/community/","community",{"text":1862,"config":1863},"Forum",{"href":1864,"dataGaName":1865,"dataGaLocation":1625},"https://forum.gitlab.com/","forum",{"text":1867,"config":1868},"Events",{"href":1869,"dataGaName":1870,"dataGaLocation":1625},"/events/","events",{"text":1872,"config":1873},"Partners",{"href":1874,"dataGaName":1875,"dataGaLocation":1625},"/partners/","partners",{"config":1877,"title":1880,"text":1881,"link":1882},{"background":1878,"textColor":1879},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":1883,"config":1884},"Read the latest",{"href":1885,"dataGaName":1886,"dataGaLocation":1625},"/whats-new/","whats new",{"text":1888,"config":1889,"menu":1891},"Company",{"dataNavLevelOne":1890},"company",{"type":1676,"columns":1892},[1893],{"items":1894},[1895,1900,1906,1908,1913,1918,1923,1928,1933,1938],{"text":1896,"config":1897},"About",{"href":1898,"dataGaName":1899,"dataGaLocation":1625},"/company/","about",{"text":1901,"config":1902,"footerGa":1905},"Jobs",{"href":1903,"dataGaName":1904,"dataGaLocation":1625},"/jobs/","jobs",{"dataGaName":1904},{"text":1867,"config":1907},{"href":1869,"dataGaName":1870,"dataGaLocation":1625},{"text":1909,"config":1910},"Leadership",{"href":1911,"dataGaName":1912,"dataGaLocation":1625},"/company/team/e-group/","leadership",{"text":1914,"config":1915},"Handbook",{"href":1916,"dataGaName":1917,"dataGaLocation":1625},"https://handbook.gitlab.com/","handbook",{"text":1919,"config":1920},"Investor relations",{"href":1921,"dataGaName":1922,"dataGaLocation":1625},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1924,"config":1925},"Trust Center",{"href":1926,"dataGaName":1927,"dataGaLocation":1625},"/security/","trust center",{"text":1929,"config":1930},"AI Transparency Center",{"href":1931,"dataGaName":1932,"dataGaLocation":1625},"/ai-transparency-center/","ai transparency center",{"text":1934,"config":1935},"Newsletter",{"href":1936,"dataGaName":1937,"dataGaLocation":1625},"/company/contact/#contact-forms","newsletter",{"text":1939,"config":1940},"Press",{"href":1941,"dataGaName":1942,"dataGaLocation":1625},"/press/","press",{"text":1944,"config":1945,"menu":1946},"Contact us",{"dataNavLevelOne":1890},{"type":1676,"columns":1947},[1948],{"items":1949},[1950,1955,1960],{"text":1951,"config":1952},"Talk to sales",{"href":1953,"dataGaName":1954,"dataGaLocation":1625},"/sales/","talk to sales",{"text":1956,"config":1957},"Support portal",{"href":1958,"dataGaName":1959,"dataGaLocation":1625},"https://support.gitlab.com/hc/en-us","support portal",{"text":1961,"config":1962},"Customer portal",{"href":1963,"dataGaName":1964,"dataGaLocation":1625},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1966,"login":1967,"suggestions":1974},"Close",{"text":1968,"link":1969},"To search repositories and projects, login to",{"text":1970,"config":1971},"gitlab.com",{"href":1639,"dataGaName":1972,"dataGaLocation":1973},"search login","search",{"text":1975,"default":1976},"Suggestions",[1977,1979,1983,1985,1989,1993],{"text":1656,"config":1978},{"href":1661,"dataGaName":1656,"dataGaLocation":1973},{"text":1980,"config":1981},"Code Suggestions (AI)",{"href":1982,"dataGaName":1980,"dataGaLocation":1973},"/solutions/code-suggestions/",{"text":1692,"config":1984},{"href":1694,"dataGaName":1692,"dataGaLocation":1973},{"text":1986,"config":1987},"GitLab on AWS",{"href":1988,"dataGaName":1986,"dataGaLocation":1973},"/partners/technology-partners/aws/",{"text":1990,"config":1991},"GitLab on Google Cloud",{"href":1992,"dataGaName":1990,"dataGaLocation":1973},"/partners/technology-partners/google-cloud-platform/",{"text":1994,"config":1995},"Why GitLab?",{"href":1669,"dataGaName":1994,"dataGaLocation":1973},{"freeTrial":1997,"mobileIcon":2002,"desktopIcon":2007,"secondaryButton":2010},{"text":1998,"config":1999},"Start free trial",{"href":2000,"dataGaName":1630,"dataGaLocation":2001},"https://gitlab.com/-/trials/new/","nav",{"altText":2003,"config":2004},"Gitlab Icon",{"src":2005,"dataGaName":2006,"dataGaLocation":2001},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":2003,"config":2008},{"src":2009,"dataGaName":2006,"dataGaLocation":2001},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":2011,"config":2012},"Get Started",{"href":2013,"dataGaName":2014,"dataGaLocation":2001},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":2016,"mobileIcon":2020,"desktopIcon":2022},{"text":2017,"config":2018},"Learn more about GitLab Duo",{"href":1661,"dataGaName":2019,"dataGaLocation":2001},"gitlab duo",{"altText":2003,"config":2021},{"src":2005,"dataGaName":2006,"dataGaLocation":2001},{"altText":2003,"config":2023},{"src":2009,"dataGaName":2006,"dataGaLocation":2001},{"button":2025,"mobileIcon":2030,"desktopIcon":2032},{"text":2026,"config":2027},"/switch",{"href":2028,"dataGaName":2029,"dataGaLocation":2001},"#contact","switch",{"altText":2003,"config":2031},{"src":2005,"dataGaName":2006,"dataGaLocation":2001},{"altText":2003,"config":2033},{"src":2034,"dataGaName":2006,"dataGaLocation":2001},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2036,"mobileIcon":2041,"desktopIcon":2043},{"text":2037,"config":2038},"Back to pricing",{"href":1773,"dataGaName":2039,"dataGaLocation":2001,"icon":2040},"back to pricing","GoBack",{"altText":2003,"config":2042},{"src":2005,"dataGaName":2006,"dataGaLocation":2001},{"altText":2003,"config":2044},{"src":2009,"dataGaName":2006,"dataGaLocation":2001},{"title":2046,"titleMobile":2047,"button":2048,"config":2053},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1667,"config":2049},{"href":2050,"dataGaName":2051,"dataGaLocation":2052},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":2054,"disabled":1587},"release",{"data":2056},{"text":2057,"source":2058,"edit":2064,"contribute":2069,"config":2074,"items":2079,"minimal":2289},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":2059,"config":2060},"View page source",{"href":2061,"dataGaName":2062,"dataGaLocation":2063},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2065,"config":2066},"Edit this page",{"href":2067,"dataGaName":2068,"dataGaLocation":2063},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2070,"config":2071},"Please contribute",{"href":2072,"dataGaName":2073,"dataGaLocation":2063},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2075,"facebook":2076,"youtube":2077,"linkedin":2078},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2080,2127,2181,2225,2257],{"title":1771,"links":2081,"subMenu":2096},[2082,2086,2091],{"text":2083,"config":2084},"View plans",{"href":1773,"dataGaName":2085,"dataGaLocation":2063},"view plans",{"text":2087,"config":2088},"Why Premium?",{"href":2089,"dataGaName":2090,"dataGaLocation":2063},"/pricing/premium/","why premium",{"text":2092,"config":2093},"Why Ultimate?",{"href":2094,"dataGaName":2095,"dataGaLocation":2063},"/pricing/ultimate/","why ultimate",[2097],{"title":2098,"links":2099},"Contact Us",[2100,2103,2105,2107,2112,2117,2122],{"text":2101,"config":2102},"Contact sales",{"href":1953,"dataGaName":1635,"dataGaLocation":2063},{"text":1956,"config":2104},{"href":1958,"dataGaName":1959,"dataGaLocation":2063},{"text":1961,"config":2106},{"href":1963,"dataGaName":1964,"dataGaLocation":2063},{"text":2108,"config":2109},"Status",{"href":2110,"dataGaName":2111,"dataGaLocation":2063},"https://status.gitlab.com/","status",{"text":2113,"config":2114},"Terms of use",{"href":2115,"dataGaName":2116,"dataGaLocation":2063},"/terms/","terms of use",{"text":2118,"config":2119},"Privacy statement",{"href":2120,"dataGaName":2121,"dataGaLocation":2063},"/privacy/","privacy statement",{"text":2123,"config":2124},"Cookie preferences",{"dataGaName":2125,"dataGaLocation":2063,"id":2126,"isOneTrustButton":562},"cookie preferences","ot-sdk-btn",{"title":1672,"links":2128,"subMenu":2137},[2129,2133],{"text":2130,"config":2131},"DevSecOps platform",{"href":1654,"dataGaName":2132,"dataGaLocation":2063},"devsecops platform",{"text":2134,"config":2135},"AI-Assisted Development",{"href":1661,"dataGaName":2136,"dataGaLocation":2063},"ai-assisted development",[2138],{"title":2139,"links":2140},"Topics",[2141,2146,2151,2156,2161,2166,2171,2176],{"text":2142,"config":2143},"CICD",{"href":2144,"dataGaName":2145,"dataGaLocation":2063},"/topics/ci-cd/","cicd",{"text":2147,"config":2148},"GitOps",{"href":2149,"dataGaName":2150,"dataGaLocation":2063},"/topics/gitops/","gitops",{"text":2152,"config":2153},"DevOps",{"href":2154,"dataGaName":2155,"dataGaLocation":2063},"/topics/devops/","devops",{"text":2157,"config":2158},"Version Control",{"href":2159,"dataGaName":2160,"dataGaLocation":2063},"/topics/version-control/","version control",{"text":2162,"config":2163},"DevSecOps",{"href":2164,"dataGaName":2165,"dataGaLocation":2063},"/topics/devsecops/","devsecops",{"text":2167,"config":2168},"Cloud Native",{"href":2169,"dataGaName":2170,"dataGaLocation":2063},"/topics/cloud-native/","cloud native",{"text":2172,"config":2173},"AI for Coding",{"href":2174,"dataGaName":2175,"dataGaLocation":2063},"/topics/devops/ai-for-coding/","ai for coding",{"text":2177,"config":2178},"Agentic AI",{"href":2179,"dataGaName":2180,"dataGaLocation":2063},"/topics/agentic-ai/","agentic ai",{"title":2182,"links":2183},"Solutions",[2184,2186,2188,2193,2197,2200,2204,2207,2209,2212,2215,2220],{"text":1716,"config":2185},{"href":1711,"dataGaName":1716,"dataGaLocation":2063},{"text":1705,"config":2187},{"href":1688,"dataGaName":1689,"dataGaLocation":2063},{"text":2189,"config":2190},"Agile development",{"href":2191,"dataGaName":2192,"dataGaLocation":2063},"/solutions/agile-delivery/","agile delivery",{"text":2194,"config":2195},"SCM",{"href":1701,"dataGaName":2196,"dataGaLocation":2063},"source code management",{"text":2142,"config":2198},{"href":1694,"dataGaName":2199,"dataGaLocation":2063},"continuous integration & delivery",{"text":2201,"config":2202},"Value stream management",{"href":18,"dataGaName":2203,"dataGaLocation":2063},"value stream management",{"text":2147,"config":2205},{"href":2206,"dataGaName":2150,"dataGaLocation":2063},"/solutions/gitops/",{"text":1753,"config":2208},{"href":1756,"dataGaName":1757,"dataGaLocation":2063},{"text":2210,"config":2211},"Small business",{"href":1762,"dataGaName":1763,"dataGaLocation":2063},{"text":2213,"config":2214},"Public sector",{"href":1768,"dataGaName":1769,"dataGaLocation":2063},{"text":2216,"config":2217},"Education",{"href":2218,"dataGaName":2219,"dataGaLocation":2063},"/solutions/education/","education",{"text":2221,"config":2222},"Financial services",{"href":2223,"dataGaName":2224,"dataGaLocation":2063},"/solutions/finance/","financial services",{"title":1776,"links":2226},[2227,2229,2231,2233,2236,2238,2241,2243,2245,2247,2249,2251,2253,2255],{"text":1789,"config":2228},{"href":79,"dataGaName":1791,"dataGaLocation":2063},{"text":1793,"config":2230},{"href":1795,"dataGaName":1796,"dataGaLocation":2063},{"text":1798,"config":2232},{"href":1800,"dataGaName":1801,"dataGaLocation":2063},{"text":1803,"config":2234},{"href":1805,"dataGaName":2235,"dataGaLocation":2063},"docs",{"text":1825,"config":2237},{"href":1827,"dataGaName":1828,"dataGaLocation":2063},{"text":2239,"config":2240},"What's new",{"href":1885,"dataGaName":1886,"dataGaLocation":2063},{"text":1820,"config":2242},{"href":1822,"dataGaName":1823,"dataGaLocation":2063},{"text":1839,"config":2244},{"href":1841,"dataGaName":1842,"dataGaLocation":2063},{"text":1847,"config":2246},{"href":1849,"dataGaName":1850,"dataGaLocation":2063},{"text":1852,"config":2248},{"href":1854,"dataGaName":1855,"dataGaLocation":2063},{"text":1857,"config":2250},{"href":1859,"dataGaName":1860,"dataGaLocation":2063},{"text":1862,"config":2252},{"href":1864,"dataGaName":1865,"dataGaLocation":2063},{"text":1867,"config":2254},{"href":1869,"dataGaName":1870,"dataGaLocation":2063},{"text":1872,"config":2256},{"href":1874,"dataGaName":1875,"dataGaLocation":2063},{"title":1888,"links":2258},[2259,2261,2263,2265,2267,2269,2273,2278,2280,2282,2284],{"text":1896,"config":2260},{"href":1898,"dataGaName":1890,"dataGaLocation":2063},{"text":1901,"config":2262},{"href":1903,"dataGaName":1904,"dataGaLocation":2063},{"text":1909,"config":2264},{"href":1911,"dataGaName":1912,"dataGaLocation":2063},{"text":1914,"config":2266},{"href":1916,"dataGaName":1917,"dataGaLocation":2063},{"text":1919,"config":2268},{"href":1921,"dataGaName":1922,"dataGaLocation":2063},{"text":2270,"config":2271},"Sustainability",{"href":2272,"dataGaName":2270,"dataGaLocation":2063},"/sustainability/",{"text":2274,"config":2275},"Diversity, inclusion and belonging (DIB)",{"href":2276,"dataGaName":2277,"dataGaLocation":2063},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1924,"config":2279},{"href":1926,"dataGaName":1927,"dataGaLocation":2063},{"text":1934,"config":2281},{"href":1936,"dataGaName":1937,"dataGaLocation":2063},{"text":1939,"config":2283},{"href":1941,"dataGaName":1942,"dataGaLocation":2063},{"text":2285,"config":2286},"Modern Slavery Transparency Statement",{"href":2287,"dataGaName":2288,"dataGaLocation":2063},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2290},[2291,2294,2297],{"text":2292,"config":2293},"Terms",{"href":2115,"dataGaName":2116,"dataGaLocation":2063},{"text":2295,"config":2296},"Cookies",{"dataGaName":2125,"dataGaLocation":2063,"id":2126,"isOneTrustButton":562},{"text":2298,"config":2299},"Privacy",{"href":2120,"dataGaName":2121,"dataGaLocation":2063},[2301],{"id":2302,"title":7,"body":1586,"config":2303,"content":2305,"description":1586,"extension":2309,"meta":2310,"navigation":562,"path":2311,"seo":2312,"stem":2313,"__hash__":2314},"blogAuthors/en-us/blog/authors/daniel-berman.yml",{"template":2304},"BlogAuthor",{"name":7,"config":2306},{"headshot":2307,"ctfId":2308},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Daniel-Berman","yml",{},"/en-us/blog/authors/daniel-berman",{},"en-us/blog/authors/daniel-berman","1vPeK03RE5wwZwtPchLWYDfBE1N6T-jG0YiKgn4CKPU",[2316,2325,2333],{"title":2317,"description":2318,"heroImage":2319,"category":1582,"date":2320,"authors":2321,"slug":2324,"externalUrl":1586},"Confidential AI for GitLab Self-Hosted","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[2322,2323],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":2326,"description":2327,"heroImage":2328,"category":1582,"date":2329,"authors":2330,"slug":2332,"externalUrl":1586},"Green DevOps: Why carbon measurement belongs in your CI/CD pipeline","CI/CD pipelines have a hidden carbon cost. Here's why measuring it matters, and how you can get started with Eco CI and Carmen in GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[2331],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":2334,"description":2335,"heroImage":2336,"category":1582,"date":2337,"authors":2338,"slug":2340,"externalUrl":1586},"How to build CI/CD observability at scale","This practical guide to GitLab pipeline analytics helps self-managed users gain operational insights using Prometheus and Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[2339],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":2342},[2343,2357,2369,2381],{"id":2344,"categories":2345,"header":2347,"text":2348,"button":2349,"image":2354},"ai-modernization",[2346],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":2350,"config":2351},"Get your AI maturity score",{"href":2352,"dataGaName":2353,"dataGaLocation":1828},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":2355},{"src":2356},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2358,"categories":2359,"header":2361,"text":2348,"button":2362,"image":2366},"devops-modernization",[2360,2165],"product","Are you just managing tools or shipping innovation?",{"text":2363,"config":2364},"Get your DevOps maturity score",{"href":2365,"dataGaName":2353,"dataGaLocation":1828},"/assessments/devops-modernization-assessment/",{"config":2367},{"src":2368},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2370,"categories":2371,"header":2373,"text":2348,"button":2374,"image":2378},"security-modernization",[2372],"security","Are you trading speed for security?",{"text":2375,"config":2376},"Get your security maturity score",{"href":2377,"dataGaName":2353,"dataGaLocation":1828},"/assessments/security-modernization-assessment/",{"config":2379},{"src":2380},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2382,"paths":2383,"header":2386,"text":2387,"button":2388,"image":2393},"github-azure-migration",[2384,2385],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":2389,"config":2390},"See how GitLab compares to GitHub",{"href":2391,"dataGaName":2392,"dataGaLocation":1828},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2394},{"src":2368},{"header":2396,"blurb":2397,"button":2398,"secondaryButton":2403},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":2399,"config":2400},"Get your free trial",{"href":2401,"dataGaName":1630,"dataGaLocation":2402},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":2101,"config":2404},{"href":1953,"dataGaName":1635,"dataGaLocation":2402},1786803753345]