692 lines
426 KiB
HTML
692 lines
426 KiB
HTML
<!DOCTYPE html><!-- Minimal inline styling for MathJax --><html lang="en" data-tags="storage" data-blog-type="engineering"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- Temporary: redirect raw Amplify domain to canonical. Remove once CF injects X-Canonical-Host. --><script>
|
||
if (window.location.hostname === 'main.d2372vaejiu5h9.amplifyapp.com') {
|
||
var u = new URL(window.location.href);
|
||
u.hostname = 'www.datadoghq.com';
|
||
window.location.replace(u.toString());
|
||
}
|
||
</script><!-- Preload required fonts --><link rel="preload" href="/fonts/web-fonts/NationalWeb-Book.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="/fonts/web-fonts/NationalWeb-Medium.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="/fonts/web-fonts/NationalWeb-Semibold.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="/fonts/web-fonts/NationalWeb-Bold.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="/fonts/web-fonts/RobotoMono-Regular.ttf" as="font" type="font/ttf" crossorigin><!-- Preconnect to required resources --><link rel="dns-prefetch preconnect" href="https://blog.dd-static.net"><link rel="dns-prefetch preconnect" href="https://www.googletagmanager.com"><link rel="dns-prefetch preconnect" href="https://consent.trustarc.com"><link rel="dns-prefetch preconnect" href="https://browser-intake-datadoghq.com"><link rel="dns-prefetch preconnect" href="https://gk6e3zbyuntvc5dap.a1.typesense.net"><title>Husky: Exactly-once ingestion and multi-tenancy at scale | Datadog</title><meta name="description" content="A closer look at storage routing in Husky, Datadog’s third-generation event storage system."><meta name="robots" content="index, follow"><link rel="canonical" href="https://www.datadoghq.com/blog/engineering/husky-deep-dive/"><meta name="date" content="2023-02-22"><!-- RSS Feed --><link rel="alternate" type="application/rss+xml" title="Datadog | The Monitor blog" href="https://www.datadoghq.com/blog/index.xml"><!-- Hreflang alternates --><link rel="alternate" hreflang="en" href="https://www.datadoghq.com/blog/engineering/husky-deep-dive/"><link rel="alternate" hreflang="x-default" href="https://www.datadoghq.com/blog/engineering/husky-deep-dive/"><!-- Additional head content from child layouts --><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","author":[{"@type":"Person","name":"Daniel Intskirveli"},{"@type":"Person","name":"Cecilia Watt"}],"datePublished":"2023-02-22T00:00:00.000Z","description":"A closer look at storage routing in Husky, Datadog’s third-generation event storage system.","headline":"Husky: Exactly-once ingestion and multi-tenancy at scale","image":"https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png","inLanguage":"en-US","mainEntityOfPage":{"@type":"WebPage","@id":"https://www.datadoghq.com/blog/engineering/husky-deep-dive/"},"publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://blog.dd-static.net/img/dd_logo_n_70x75.png"},"name":"Datadog","sameAs":["https://twitter.com/datadoghq","https://www.instagram.com/datadoghq/","https://en.wikipedia.org/wiki/Datadog","https://www.facebook.com/datadoghq/","https://www.linkedin.com/company/datadog","https://github.com/DataDog","https://www.youtube.com/channel/UCPO2QgTCReBAThZca6MB9jg"],"url":"https://www.datadoghq.com/"},"keywords":"storage"}</script><meta name="keywords" content="storage"><meta name="author" content="Daniel Intskirveli, Cecilia Watt"><!-- Open Graph Tags --><meta property="og:title" content="Husky: Exactly-once ingestion and multi-tenancy at scale | Datadog"><meta property="og:description" content="A closer look at storage routing in Husky, Datadog’s third-generation event storage system."><meta property="og:image" content="https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png"><meta property="og:type" content="article"><meta property="og:url" content="https://www.datadoghq.com/blog/engineering/husky-deep-dive/"><meta property="og:site_name" content="Datadog"><meta property="og:locale" content="en"><!-- Twitter Tags --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Husky: Exactly-once ingestion and multi-tenancy at scale | Datadog"><meta name="twitter:description" content="A closer look at storage routing in Husky, Datadog’s third-generation event storage system."><meta name="twitter:image" content="https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png"><meta name="twitter:url" content="https://www.datadoghq.com/blog/engineering/husky-deep-dive/"><meta name="twitter:site" content="@datadoghq"><meta name="twitter:creator" content="@datadoghq"><!-- Preconnect to required resources --><link rel="preconnect" href="https://www.googletagmanager.com" crossorigin><link rel="preconnect" href="https://webops-gtm.datadoghq.com" crossorigin><link rel="preconnect" href="https://browser-intake-datadoghq.com" crossorigin><!--- Google Tag Manager -->
|
||
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-WDC8G6" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
||
<script>(function(){const gtmContainerId = "GTM-WDC8G6";
|
||
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
||
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
||
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
||
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
||
})(window,document,'script','dataLayer',`${gtmContainerId}`);})();</script>
|
||
<!-- End Google Tag Manager --><link rel="stylesheet" href="/blog/_astro/Base.BdRXlyCZ.css"><link rel="stylesheet" href="/blog/_astro/index.DlKsH7qy.css"><script type="module" src="/blog/_astro/page.Bc5QPW76.js"></script></head> <body> <script type="module">document.querySelectorAll("dialog[id]").forEach(r=>{const e=r;if(e.__dialogInitialized)return;e.__dialogInitialized=!0;const n=e.id,l=e.querySelector(`#${n}-close`),t=document.querySelector("body"),o="overflow-hidden",d=()=>{e.close(),t.classList.remove(o),t.style.overflow=""},a=()=>{e.showModal(),t.classList.add(o)};e.addEventListener("click",i=>{const c=e.firstElementChild?.getBoundingClientRect()||e.getBoundingClientRect();(i.clientX<c.left||i.clientX>c.right||i.clientY<c.top||i.clientY>c.bottom)&&d()}),l&&l.addEventListener("click",()=>{d()}),e.addEventListener("keydown",i=>{i.key==="Escape"&&d()}),e.__openDialog=a,e.__closeDialog=d});document.querySelectorAll("[data-dialog-trigger]").forEach(r=>{const e=r;if(e.__triggerInitialized)return;e.__triggerInitialized=!0;const n=e.dataset.dialogTrigger;if(!n)return;const l=document.getElementById(n);if(!l)return;const t=l.__openDialog;e.addEventListener("click",()=>{t()}),e.addEventListener("keydown",o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),t())})});</script> <div class="absolute top-0"><html><head></head><body><div class="announcement-banner text-center fixed top-0 z-[200] h-[30px] w-full flex items-center justify-center bg-[#632ca6] bg-gradient-to-r from-[#632ca6] to-[#2f80ed] text-center text-white font-semibold font-national text-20"><a class="fw-semibold text-nowrap" href="https://www.datadoghq.com/resources/gartner-magic-quadrant-observability-platforms-2026/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-apm-ww-announcement-corpsite-announcement-gartnermq2026-obsplat"><span class="d-none d-md-block hidden banner-title-desktop tablet:block">Datadog named a Leader in the Gartner® Magic Quadrant™ for Observability Platforms
|
||
</span><span class="d-block d-md-none block tablet:hidden banner-title-mobile">Leader in the Gartner® Magic Quadrant™
|
||
</span></a><script>function getGeotarget(){const o=!1,t={webinars:[{codes:["US","CA"],desktop_title:null,end_date:null,link:null,mobile_title:null,start_date:null,supported_language:"en"},{codes:["UK","US","CA","GB","IE","BE","NL","PL","DK","SE",!1,"LU","IL","FI","GR","LI","CZ","ZA","IL","ES","DE","FR","IT","CH"],desktop_title:"Datadog Detect is back! Register for the virtual mini-conference on Oct 30, 12PM ET",end_date:"2025-10-30",link:"https://www.datadoghq.com/event/datadog-detect-q425/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-security-ww-banner-corpsite",mobile_title:"Join us for Datadog Detect on Oct 30, 12PM ET",start_date:"2025-10-22",supported_language:"en"},{codes:["ES"],desktop_title:"Webinar de Datadog: Crea experiencias digitales impecables con monitorización End-to-End",end_date:"2025-05-06",link:"https://www.datadoghq.com/es/dg/webinars/uxdem-spain-2025/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-dem-emea-livewebinar-202505uxdemsp",mobile_title:"Crea experiencias digitales impecables con monitorización End-to-End",start_date:"2025-04-22",supported_language:"es"},{codes:["JP"],desktop_title:"Datadog ウェビナー: エンドツーエンドの監視によって生み出されるシームレスな DX",end_date:"2025-05-14",link:"https://www.datadoghq.com/ja/dg/webinars/uxdem-japan-2025/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-dem-japan-livewebinar-202505uxdemjp",mobile_title:"ウェビナー: エンドツーエンドの監視によって生み出されるシームレスな DX",start_date:"2025-05-01",supported_language:"ja"},{codes:["SG","NZ","AU","IN","PH","TW","VN","ID","TH","MY"],desktop_title:"Register Now: Create Seamless Digital Experiences with End-to-End Monitoring",end_date:"2025-04-24",link:"https://www.datadoghq.com/dg/webinars/uxdem-anz-2025/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-dem-apac-livewebinar-202504uxdemanz",mobile_title:"Create Seamless Digital Experiences with End-to-End Monitoring",start_date:"2025-04-10",supported_language:"en"},{codes:["MX","AR","CO","PE","VE"],desktop_title:"Webinar de Datadog: Crea experiencias digitales fluidas con el monitoreo punto a punto",end_date:"2025-04-10",link:"https://www.datadoghq.com/es/dg/webinars/uxdem-es-2025/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-dem-latam-livewebinar-202504uxdemes",mobile_title:"Crea experiencias digitales fluidas con el monitoreo punto a punto",start_date:"2025-04-01",supported_language:"es"},{codes:["FR","BE","CH","CA"],desktop_title:"Webinar Datadog: Créez des expériences numériques fluides grâce à la surveillance de bout en bout ",end_date:"2025-04-30",link:"https://www.datadoghq.com/fr/dg/webinars/uxdem-france-2025/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-dem-emea-livewebinar-202504uxdemfr",mobile_title:"Créez des expériences numériques fluides grâce à la surveillance de bout en bout",start_date:"2025-04-16",supported_language:"fr"},{codes:["IT","CH"],desktop_title:"Webinar di Datadog: Creare digital experience impeccabili con il monitoraggio end-to-end",end_date:"2025-04-29",link:"https://www.datadoghq.com/it/dg/webinars/uxdem-italy-2025/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-dem-emea-livewebinar-202504uxdemit",mobile_title:"Creare digital experience impeccabili con il monitoraggio end-to-end",start_date:"2025-04-15",supported_language:"it"},{codes:["KR"],desktop_title:"Datadog 웨비나 | 인프라 & 쿠버네티스 모니터링 쉽게 마스터하기! 2/21 (금) 2PM",end_date:"2025-02-20",link:"https://www.datadoghq.com/ko/dg/webinars/infra-korea-2025/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-infra-korea-corpsite-banner-livewebinar-202502infrakr",mobile_title:"인프라 & 쿠버네티스 모니터링 쉽게 마스터하기! 2/21",start_date:"2025-01-30",supported_language:"ko"},{codes:["BR","PT"],desktop_title:"Webinar da Datadog: Crie experiências digitais perfeitas com monitoramento de ponta a ponta",end_date:"2025-04-09",link:"https://www.datadoghq.com/pt/dg/webinars/uxdem-pt-2025/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-dem-latam-livewebinar-202504uxdempt",mobile_title:"Crie experiências digitais perfeitas com monitoramento de ponta a ponta",start_date:"2025-04-01",supported_language:"pt"},{codes:["DE","AT","CH"],desktop_title:"Datadog-Webinar: Schaffen Sie eine nahtlose digitale Experience mit End-to-End-Monitoring",end_date:"2025-04-09",link:"https://www.datadoghq.com/de/dg/webinars/uxdem-dach-2025/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-dem-emea-livewebinar-202504uxdemdach",mobile_title:"Schaffen Sie eine nahtlose digitale Experience mit End-to-End-Monitoring",start_date:"2025-04-01",supported_language:"de"}]};let e="US";function n(e,t,n){const s=Date.now(),o={value:t,timestamp:s+n};localStorage.setItem(e,JSON.stringify(o))}function s(){const t=window.document.URL.match("(www|docs).datadoghq.com")?"https://www.datadoghq.com/locate":"https://corpsite-staging.datadoghq.com/locate";return fetch(t).then(e=>e.json()).then(t=>{e=t.country,n("country",e,6048e5)}).catch(n("country",e,0))}const i=()=>{try{const n=localStorage.getItem("country"),t=JSON.parse(n);if(Date.now()<t.timestamp)return e=t.value,e;s()}catch{s()}return e};if(t&&!o){i();let n=!1;t.webinars.forEach(t=>{t.codes.includes(e)&&(updateBanner(t),t.lp_link?n=!0:n=!1)})}}getGeotarget();function getLanguage(){const e=window.DD_RUM?.getUser?.().preferred_lang||navigator.language||"en",t=e.split("-");return t[0]}function populateBanner(e){document.querySelector(".banner-title-desktop").innerHTML=e.desktop_title,document.querySelector(".banner-title-mobile").innerHTML=e.mobile_title,document.querySelector(".announcement-banner > a").href=e.link}function updateBanner(e){const t=new Date,s=new Date(e.start_date),o=new Date(e.end_date),n=getLanguage(),{env:i}=document.documentElement.dataset;i!=="live"&&e.hasOwnProperty("test_message")&&e.test_message&&n===e.supported_language&&populateBanner(e),t>=s&&t<=o&&n===e.supported_language&&populateBanner(e)}</script></div><div id="main-nav-wrapper" x-data="{
|
||
mobileOpen: false,
|
||
dropdownOpen: 'none',
|
||
navScrolled: false,
|
||
hasAnnouncementBanner: true,
|
||
handleScroll() {
|
||
this.navScrolled = window.scrollY > 30;
|
||
},
|
||
handleResize() {
|
||
if (window.innerWidth >= 1024) {
|
||
this.mobileOpen = false;
|
||
this.dropdownOpen = 'none';
|
||
}
|
||
},
|
||
checkAnnouncementBanner() {
|
||
const announcementBanner = document.querySelector('.announcement-banner') || document.querySelector('.announcement-banner--large');
|
||
if (announcementBanner) {
|
||
this.hasAnnouncementBanner = true;
|
||
} else {
|
||
this.hasAnnouncementBanner = false;
|
||
}
|
||
}
|
||
}" x-init="checkAnnouncementBanner()" x-on:scroll.window="handleScroll" x-on:resize.window="handleResize"><nav class="main-nav h-[60px] desktop-sm:h-[130px] flex fixed right-0 left-0 items-center bg-white z-[200] font-normal mt-[30px]" :class="[navScrolled ? 'main-nav-scrolled desktop-sm:!h-[65px]' : '', hasAnnouncementBanner ? 'mt-[30px]' : '']" style="box-shadow:0 0 8px 8px rgba(0,0,0,7%)"><div class="container flex relative w-full justify-between desktop-sm:justify-start"><div class="hidden desktop-sm:flex justify-between w-full"><ul x-data="{ mouseOver: 'none' }" class="flex flex-row items-center list-none m-0 grow justify-start basis-0"><li x-on:mouseover="mouseOver = 'product'" x-on:mouseout="mouseOver = 'none'" class="dropdown relative product-dropdown"><a class="dropdown relative block pt-[8.5px] px-2 desktop-lg:px-3 pb-[9.5px] desktop-lg:px-3 text-18 font-semibold font-national uppercase text-[#555] hover:text-[#70f]" href="https://www.datadoghq.com/product/">Product</a><div x-show="mouseOver === 'product'" x-cloak="" class="dropdown-menu product-menu absolute z-40 bg-white min-h-[630px] w-[1300px] p-0 left-[13px] top-[42px] border-t-[3px] border-t-[#632ca6]" style="box-shadow:0 8px 10px rgba(0,0,0,7%)" x-data="{
|
||
openCategory: 'observability',
|
||
timeoutID: null,
|
||
setCategory(category) {
|
||
this.timeoutID = setTimeout(() => {
|
||
this.openCategory = category;
|
||
const productMenu = document.querySelector('.product-menu');
|
||
window.DD_RUM?.onReady(function() {
|
||
if (productMenu.classList.contains('show')) {
|
||
window.DD_RUM.addAction(`Product Category ${category} Hover`)
|
||
}
|
||
})
|
||
}, 160);
|
||
},
|
||
clearCategory() {
|
||
clearTimeout(this.timeoutID);
|
||
}
|
||
}" x-init="
|
||
const menu = document.querySelector('.product-menu');
|
||
var observer = new MutationObserver(function(mutations) {
|
||
mutations.forEach(function(mutation) {
|
||
if (mutation.attributeName === 'class' && !mutation.target.classList.contains('show')) {
|
||
openCategory = 'observability';
|
||
}
|
||
});
|
||
});
|
||
observer.observe(menu, { attributes: true });
|
||
"><div class="grid grid-cols-12"><div class="col-span-4 category-toggle-list-column border-r border-r-[#e2e2e2] p-10"><p class="product-hype px-3 py-7 font-bold font-national text-28 leading-32">The integrated platform for monitoring & security</p><ul class="category-toggle-list pr-5 mb-15"><li><button x-on:mouseover="setCategory('observability')" x-on:mouseout="clearCategory()" class="flex items-center gap-2 w-full font-bold font-national text-22 leading-24 text-left px-3 py-2.5 align-middle hover:text-[#70f] hover:[&_svg]:fill-[#70f] hover:bg-black/5 rounded h-12" :class="openCategory === 'observability' ? 'text-[#632ca6] [&_svg]:fill-[#632ca6]' : ''">
|
||
<svg class="w-[22px] h-auto" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" width="192" height="192">
|
||
<path d="M96,136a40,40,0,1,1,40-40A40.045,40.045,0,0,1,96,136Zm0-64a24,24,0,1,0,24,24A24.028,24.028,0,0,0,96,72Zm0,92C35.749,164,4.16,102.208,2.845,99.578L1.056,96l1.789-3.578C4.16,89.792,35.749,28,96,28s91.84,61.792,93.155,64.422L190.944,96l-1.789,3.578C187.84,102.208,156.252,164,96,164ZM19.165,96C26.457,108.305,53.3,148,96,148s69.544-39.7,76.836-52C165.551,83.708,138.706,44,96,44S26.457,83.7,19.165,96Z"></path>
|
||
</svg>
|
||
Observability</button></li><li><button x-on:mouseover="setCategory('security')" x-on:mouseout="clearCategory()" class="flex items-center gap-2 w-full font-bold font-national text-22 leading-24 text-left px-3 py-2.5 align-middle hover:text-[#70f] hover:[&_svg]:fill-[#70f] hover:bg-black/5 rounded h-12" :class="openCategory === 'security' ? 'text-[#632ca6] [&_svg]:fill-[#632ca6]' : ''">
|
||
<svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>security-platform</title>
|
||
<path d="M16 0.793l-12 6.938v9.604c0.007 4.42 2.392 8.281 5.944 10.372l0.056 0.031 6 3.468 6-3.469c3.608-2.122 5.993-5.983 6-10.402v-9.605zM6.667 10.811l8 4.625v4.42l-8-4.625zM7.997 8.5l6.669-3.856v7.711zM6.723 18.343l7.944 4.593v4.42l-3.333-1.926c-2.521-1.484-4.269-4.050-4.607-7.044l-0.004-0.043zM25.333 17.335c-0.005 3.439-1.86 6.443-4.623 8.070l-0.044 0.024-3.333 1.927v-22.712l8 4.625z"></path>
|
||
</svg>
|
||
Security</button></li><li><button x-on:mouseover="setCategory('digital-experience')" x-on:mouseout="clearCategory()" class="flex items-center gap-2 w-full font-bold font-national text-22 leading-24 text-left px-3 py-2.5 align-middle hover:text-[#70f] hover:[&_svg]:fill-[#70f] hover:bg-black/5 rounded h-12" :class="openCategory === 'digital-experience' ? 'text-[#632ca6] [&_svg]:fill-[#632ca6]' : ''">
|
||
<svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>rum</title>
|
||
<path d="M8.728 32h-8.728v-14.544h8.728v14.544zM2.912 29.088h2.912v-8.728h-2.912v8.728zM18.908 29.088h-7.269v-2.912h4.364v-14.544h-10.187v2.912h-2.905v-5.816h16.003v20.361zM32 20.361h-10.18v-2.912h7.276v-14.544h-20.367v2.912h-2.912v-5.816h26.184v20.361z"></path>
|
||
</svg>
|
||
Digital Experience</button></li><li><button x-on:mouseover="setCategory('software-delivery')" x-on:mouseout="clearCategory()" class="flex items-center gap-2 w-full font-bold font-national text-22 leading-24 text-left px-3 py-2.5 align-middle hover:text-[#70f] hover:[&_svg]:fill-[#70f] hover:bg-black/5 rounded h-12" :class="openCategory === 'software-delivery' ? 'text-[#632ca6] [&_svg]:fill-[#632ca6]' : ''">
|
||
<svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>ci</title>
|
||
<path d="M30.667 22.625v0.087c-0.006 4.392-3.565 7.95-7.956 7.955h-0.085c-3.937-0.005-7.205-2.864-7.845-6.62l-0.007-0.047h-3.107l4.333-4.333 4.333 4.333h-2.833c0.6 2.315 2.669 3.998 5.131 4h0.087c2.916-0.009 5.278-2.373 5.282-5.29v-0.085c-0.003-2.921-2.369-5.288-5.29-5.292h-13.42c-4.393-0.004-7.954-3.565-7.957-7.958v-0.087c0.006-4.392 3.565-7.95 7.956-7.955h0.085c4.393 0.004 7.954 3.564 7.958 7.956v2.044h-2.667v-2.043c-0.004-2.921-2.371-5.287-5.291-5.29h-0.087c-2.919 0.005-5.285 2.371-5.288 5.29v0.085c0.003 2.921 2.369 5.288 5.29 5.292h13.42c4.393 0.004 7.954 3.565 7.957 7.958v0z"></path>
|
||
</svg>
|
||
Software Delivery</button></li><li><button x-on:mouseover="setCategory('service-management')" x-on:mouseout="clearCategory()" class="flex items-center gap-2 w-full font-bold font-national text-22 leading-24 text-left px-3 py-2.5 align-middle hover:text-[#70f] hover:[&_svg]:fill-[#70f] hover:bg-black/5 rounded h-12" :class="openCategory === 'service-management' ? 'text-[#632ca6] [&_svg]:fill-[#632ca6]' : ''">
|
||
<svg class="w-[22px] h-auto" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" width="192" height="192">
|
||
<path d="M88,188.38V91.38l84-48.5v96.99l-84,48.51Zm16-87.76v60.04l52-30.02v-60.04l-52,30.02Zm-50-28.87v97l16-9.24V80.99l52-30.02,16-9.24V23.25L54,71.75ZM20,52.12v97l16-9.24V61.36l52-30.02,16-9.24V3.62L20,52.12Z"></path>
|
||
</svg>
|
||
Service Management</button></li><li><button x-on:mouseover="setCategory('ai')" x-on:mouseout="clearCategory()" class="flex items-center gap-2 w-full font-bold font-national text-22 leading-24 text-left px-3 py-2.5 align-middle hover:text-[#70f] hover:[&_svg]:fill-[#70f] hover:bg-black/5 rounded h-12" :class="openCategory === 'ai' ? 'text-[#632ca6] [&_svg]:fill-[#632ca6]' : ''">
|
||
<svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" fill="" viewBox="0 0 192 192" style="enable-background:new 0 0 192 192;" xml:space="preserve"><g id="Layer_7"><g><linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="89.0192" y1="122.732" x2="142.9808" y2="29.268"><stop offset="0" style="stop-color:#5500FF"></stop><stop offset="0.1715" style="stop-color:#4D09FF"></stop><stop offset="0.4511" style="stop-color:#3821FF"></stop><stop offset="0.802" style="stop-color:#1649FF"></stop><stop offset="1" style="stop-color:#0062FF"></stop></linearGradient><path class="st5" d="M120,16h-8c0,30.88-25.12,56-56,56v8c30.88,0,56,25.12,56,56h8c0-30.88,25.12-56,56-56v-8 C145.12,72,120,46.88,120,16z"></path><linearGradient id="SVGID_00000049207151058930698180000011839073544639225000_" gradientUnits="userSpaceOnUse" x1="35.4115" y1="168.7311" x2="68.5885" y2="111.267"><stop offset="0" style="stop-color:#5500FF"></stop><stop offset="0.1715" style="stop-color:#4D09FF"></stop><stop offset="0.4511" style="stop-color:#3821FF"></stop><stop offset="0.802" style="stop-color:#1649FF"></stop><stop offset="1" style="stop-color:#0062FF"></stop></linearGradient><path d="M56,104h-4c0,0,0,0,0,0c0,0,0,0,0,0h-4 c0,17.64-14.35,32-32,32v8c17.65,0,32,14.36,32,32h8c0-17.64,14.35-32,32-32v-8C70.35,136,56,121.64,56,104z"></path></g></g></svg>AI</button></li><li><button x-on:mouseover="setCategory('platform')" x-on:mouseout="clearCategory()" class="flex items-center gap-2 w-full font-bold font-national text-22 leading-24 text-left px-3 py-2.5 align-middle hover:text-[#70f] hover:[&_svg]:fill-[#70f] hover:bg-black/5 rounded h-12" :class="openCategory === 'platform' ? 'text-[#632ca6] [&_svg]:fill-[#632ca6]' : ''">
|
||
<svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>dashboard</title>
|
||
<path d="M32 24.876v1.79h-32v-21.333h1.988v19.543h30.012zM26.009 10.679l3.976 12.432h-25.982v-8.006l6.999-7.981 8.987 7.981 6.020-4.426z"></path>
|
||
</svg>
|
||
Platform Capabilities</button></li></ul><a href="https://www.datadoghq.com/pricing/" class="pricing-link group flex items-center gap-[5px] font-bold font-national text-[#632ca6] uppercase ml-3 text-16 absolute bottom-10 hover:text-[#70f]">View pricing<svg class="w-2 h-auto -tw-mb-px fill-[#632ca6] group-hover:fill-[#70f]" version="1.1" xmlns="http://www.w3.org/2000/svg" width="683" height="1024" viewBox="0 0 683 1024">
|
||
<title></title>
|
||
<g id="icomoon-ignore">
|
||
</g>
|
||
<path d="M391.327 512.001l-366.327-366.327 120.679-120.679 487.007 487.006-487.007 487.005-120.679-120.678 366.327-366.327z"></path>
|
||
</svg></a></div><div class="col-span-8"><div class="product-category h-full flex flex-col p-10 pl-[25px]" id="observability-detail" x-show="openCategory === 'observability'" x-cloak=""><div class="category-description p-7 rounded flex mb-10 text-white [background:var(--cta-bg)]" style="--cta-bg:linear-gradient(90deg, #8000FF 0%, #FF0080 100%)"><div class="category-description-main flex gap-5 flex-1 min-w-0 items-center"><svg class="w-12 h-auto fill-white shrink-0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" width="192" height="192">
|
||
<path d="M96,136a40,40,0,1,1,40-40A40.045,40.045,0,0,1,96,136Zm0-64a24,24,0,1,0,24,24A24.028,24.028,0,0,0,96,72Zm0,92C35.749,164,4.16,102.208,2.845,99.578L1.056,96l1.789-3.578C4.16,89.792,35.749,28,96,28s91.84,61.792,93.155,64.422L190.944,96l-1.789,3.578C187.84,102.208,156.252,164,96,164ZM19.165,96C26.457,108.305,53.3,148,96,148s69.544-39.7,76.836-52C165.551,83.708,138.706,44,96,44S26.457,83.7,19.165,96Z"></path>
|
||
</svg><div class="info"><p class="category-header font-bold font-national text-28 leading-24 pb-[5px]">Observability</p><p class="category-tagline text-18 leading-22 m-0 font-medium">End-to-end, simplified visibility into your stack’s health & performance</p></div></div></div><div class="category-details flex justify-between gap-5"><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Infrastructure</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/infrastructure-monitoring/" data-dd-action-name="infrastructure_monitoring in observability">Infrastructure Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/metrics/" data-dd-action-name="metrics in observability">Metrics</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/network-monitoring/" data-dd-action-name="network_monitoring in observability">Network Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/container-monitoring/" data-dd-action-name="container_monitoring in observability">Container Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/kubernetes-autoscaling/" data-dd-action-name="kubernetes_autoscaling in observability">Kubernetes Autoscaling</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/serverless-monitoring/" data-dd-action-name="serverless in observability">Serverless</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/cloud-cost-management/" data-dd-action-name="cloud_cost_management in observability">Cloud Cost Management</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/cloudcraft/" data-dd-action-name="cloudcraft in observability">Cloudcraft</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/storage-management/" data-dd-action-name="storage_management in observability">Storage Management</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/gpu-monitoring/" data-dd-action-name="gpu_monitoring in observability">GPU Monitoring</a></li></ul></div><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Applications</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/apm/" data-dd-action-name="application_performance_monitoring in observability">Application Performance Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/universal-service-monitoring/" data-dd-action-name="universal_service_monitoring in observability">Universal Service Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/code-profiling/" data-dd-action-name="continuous_profiler in observability">Continuous Profiler</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/dynamic-instrumentation/" data-dd-action-name="dynamic_instrumentation in observability">Dynamic Instrumentation</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/products/ai/agent-observability/" data-dd-action-name="agent_observability in observability">Agent Observability</a></li></ul><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Data</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/database-monitoring/" data-dd-action-name="database_monitoring in observability">Database Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/products/observability/data-observability/" data-dd-action-name="data_observability in observability">Data Observability</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/data-streams-monitoring/" data-dd-action-name="data_streams_monitoring in observability">Data Streams Monitoring</a></li></ul></div><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Logs</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/log-management/" data-dd-action-name="log_management in observability">Log Management</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/sensitive-data-scanner/" data-dd-action-name="sensitive_data_scanner in observability">Sensitive Data Scanner</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/audit-trail/" data-dd-action-name="audit_trail in observability">Audit Trail</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/observability-pipelines/" data-dd-action-name="observability_pipelines in observability">Observability Pipelines</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/error-tracking/" data-dd-action-name="error_tracking in observability">Error Tracking</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/byoc-logs/" data-dd-action-name="byoc_logs in observability">BYOC Log Management</a></li></ul></div></div></div><div class="product-category h-full flex flex-col p-10 pl-[25px]" id="infra-detail" x-show="openCategory === 'infra'" x-cloak=""><div class="category-description p-7 rounded flex mb-10 text-white [background:var(--cta-bg)]" style="--cta-bg:linear-gradient(90deg, %!s(<nil>) 0%, %!s(<nil>) 100%)"><div class="category-description-main flex gap-5 flex-1 min-w-0 items-center"><svg class="w-12 h-auto fill-white shrink-0" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>host-map</title>
|
||
<path d="M14.214 13.103l-7.107 4.103-7.107-4.103v-8.206l7.107-4.103 7.107 4.103zM32 4.897v8.206l-7.107 4.103-7.107-4.103v-8.206l7.107-4.103zM29.333 6.436l-4.44-2.563-4.44 2.563v5.127l4.44 2.563 4.44-2.563zM9.037 19.98v8.040l6.963 4.020 6.962-4.020v-8.040l-6.963-4.020z"></path>
|
||
</svg><div class="info"><p class="category-header font-bold font-national text-28 leading-24 pb-[5px]">Infrastructure</p><p class="category-tagline text-18 leading-22 m-0 font-medium"></p></div></div></div><div class="category-details flex justify-between gap-5"></div></div><div class="product-category h-full flex flex-col p-10 pl-[25px]" id="apps-detail" x-show="openCategory === 'apps'" x-cloak=""><div class="category-description p-7 rounded flex mb-10 text-white [background:var(--cta-bg)]" style="--cta-bg:linear-gradient(90deg, %!s(<nil>) 0%, %!s(<nil>) 100%)"><div class="category-description-main flex gap-5 flex-1 min-w-0 items-center"><svg class="w-12 h-auto fill-white shrink-0" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>apm</title>
|
||
<path d="M0 2.667h32v3.81h-32v-3.81zM0 10.286h6v3.81h-6v-3.81zM10 10.286h22v3.81h-22v-3.81zM10 17.905h12v3.81h-12v-3.81zM26 17.905h6v3.81h-6v-3.81zM16 25.524h6v3.81h-6v-3.81z"></path>
|
||
</svg><div class="info"><p class="category-header font-bold font-national text-28 leading-24 pb-[5px]">Applications</p><p class="category-tagline text-18 leading-22 m-0 font-medium"></p></div></div></div><div class="category-details flex justify-between gap-5"></div></div><div class="product-category h-full flex flex-col p-10 pl-[25px]" id="data-detail" x-show="openCategory === 'data'" x-cloak=""><div class="category-description p-7 rounded flex mb-10 text-white [background:var(--cta-bg)]" style="--cta-bg:linear-gradient(90deg, %!s(<nil>) 0%, %!s(<nil>) 100%)"><div class="category-description-main flex gap-5 flex-1 min-w-0 items-center"><svg class="w-12 h-auto fill-white shrink-0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" width="192" height="192">
|
||
<path d="M96,8C50.393,8,16,25.2,16,48v96c0,22.8,34.393,40,80,40s80-17.2,80-40V48C176,25.2,141.607,8,96,8ZM48.337,32.683C60.936,27.083,77.863,24,96,24c39.068,0,64,14.214,64,24,0,4.969-6.26,10.838-16.337,15.317C131.064,68.917,114.138,72,96,72,56.932,72,32,57.786,32,48,32,43.031,38.26,37.162,48.337,32.683Zm95.326,126.633C131.064,164.916,114.137,168,96,168c-39.068,0-64-14.215-64-24V120.577C46.356,130.075,69.242,136,96,136s49.644-5.925,64-15.423V144C160,148.969,153.74,154.838,143.663,159.316Zm0-48C131.064,116.916,114.137,120,96,120c-39.068,0-64-14.215-64-24V72.577C46.356,82.075,69.242,88,96,88s49.644-5.925,64-15.423V96C160,100.969,153.74,106.838,143.663,111.316ZM96,95.86a151.433,151.433,0,0,0,16-.83v16.1c-5.14.48-10.49.73-16,.73Zm47.66-8.69c.12-.05.23-.1.34-.15v17.27a113.137,113.137,0,0,1-16,4.47V92.34A90.144,90.144,0,0,0,143.66,87.17ZM96,144a151.433,151.433,0,0,0,16-.83v16.1c-5.14.48-10.49.73-16,.73Zm47.66-8.69c.12-.05.23-.1.34-.15v17.27a113.137,113.137,0,0,1-16,4.47v-16.42A90.144,90.144,0,0,0,143.66,135.312Z"></path>
|
||
</svg><div class="info"><p class="category-header font-bold font-national text-28 leading-24 pb-[5px]">Data</p><p class="category-tagline text-18 leading-22 m-0 font-medium"></p></div></div></div><div class="category-details flex justify-between gap-5"></div></div><div class="product-category h-full flex flex-col p-10 pl-[25px]" id="Logs-detail" x-show="openCategory === 'Logs'" x-cloak=""><div class="category-description p-7 rounded flex mb-10 text-white [background:var(--cta-bg)]" style="--cta-bg:linear-gradient(90deg, %!s(<nil>) 0%, %!s(<nil>) 100%)"><div class="category-description-main flex gap-5 flex-1 min-w-0 items-center"><svg class="w-12 h-auto fill-white shrink-0" width="48" height="48" viewBox="0 0 48 48" fill="" xmlns="http://www.w3.org/2000/svg">
|
||
<g id="Logs">
|
||
<path id="Vector" d="M28.1375 9.81131C21.6141 10.8028 16.3957 15.6567 14.7773 22.1801C13.4723 27.085 14.7773 31.678 17.0742 35.2269L9.87276 42.4283C8.56785 43.7333 8.56785 45.7163 9.87276 47.0212C11.1777 48.3262 13.1608 48.3262 14.4658 47.0212L21.6161 39.8198C25.2176 42.1167 29.809 43.4213 34.6629 42.1167C40.8728 40.4472 45.7792 34.9153 46.7707 28.3917C48.0737 17.6397 38.9403 8.50641 28.1375 9.81131ZM30.4344 37.5219C24.2245 37.5219 19.0063 32.3035 19.0063 26.0938C19.0063 19.9364 24.2247 14.7165 30.4344 14.7165C36.6441 14.7165 41.8625 19.9349 41.8625 26.0938C41.8638 32.3035 36.6439 37.5219 30.434 37.5219H30.4344ZM23.9106 6.52341H14.1518V0H23.9106V6.52341ZM36.9574 6.52341H27.1985V0H36.9574V6.52341ZM11.8553 32.617H1.10498V26.0936H10.8638C10.8638 28.39 11.1773 30.6865 11.8553 32.617ZM15.7702 13.0468C14.1518 15.0297 12.8483 17.3262 11.8568 19.5702H1.10498V13.0468H15.7702ZM10.8638 6.52341H1.10498V0H10.8638V6.52341ZM35.3404 29.3812H25.8951C25.8951 29.3812 25.5295 28.3897 25.5295 27.7627C25.3495 24.2183 28.5039 21.2393 32.0529 21.2393C33.3578 21.2393 34.3498 21.5528 35.3408 22.1783L35.3404 29.3812Z"></path>
|
||
</g>
|
||
</svg><div class="info"><p class="category-header font-bold font-national text-28 leading-24 pb-[5px]">Logs</p><p class="category-tagline text-18 leading-22 m-0 font-medium"></p></div></div></div><div class="category-details flex justify-between gap-5"></div></div><div class="product-category h-full flex flex-col p-10 pl-[25px]" id="security-detail" x-show="openCategory === 'security'" x-cloak=""><a class="category-description category-description-cta group p-7 rounded flex justify-between items-end mb-10 text-white no-underline [background:var(--cta-bg)] transition-[outline-color,box-shadow,background] duration-200 ease-in-out hover:[background:var(--cta-bg-hover,var(--cta-bg))] hover:outline hover:outline-2 hover:outline-[#8BD0FF] hover:outline-offset-[-1px] hover:shadow-[0_4px_16px_rgba(0,0,0,0.2)]" href="https://www.datadoghq.com/products/security/" data-dd-action-name="Category Banner security" style="--cta-bg:linear-gradient(90deg, #0060FF 0%, #0032A0 100%);--cta-bg-hover:linear-gradient(90deg, #0060FF 0%, #0032A0 50%, #001B58 100%)"><div class="category-description-main flex gap-5 flex-1 min-w-0 items-center"><svg class="w-12 h-auto fill-white shrink-0" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>security-platform</title>
|
||
<path d="M16 0.793l-12 6.938v9.604c0.007 4.42 2.392 8.281 5.944 10.372l0.056 0.031 6 3.468 6-3.469c3.608-2.122 5.993-5.983 6-10.402v-9.605zM6.667 10.811l8 4.625v4.42l-8-4.625zM7.997 8.5l6.669-3.856v7.711zM6.723 18.343l7.944 4.593v4.42l-3.333-1.926c-2.521-1.484-4.269-4.050-4.607-7.044l-0.004-0.043zM25.333 17.335c-0.005 3.439-1.86 6.443-4.623 8.070l-0.044 0.024-3.333 1.927v-22.712l8 4.625z"></path>
|
||
</svg><div class="info"><p class="category-header font-bold font-national text-28 leading-24 pb-[5px]">Security</p><p class="category-tagline text-18 leading-22 m-0 font-medium">Outpace AI-powered attacks with unified security and observability</p></div></div><span class="category-cta inline-flex items-center gap-2 transition-[gap] duration-200 ease-in-out group-hover:gap-3 pb-1.5 text-18 leading-18 font-bold font-national uppercase tracking-1 whitespace-nowrap text-white"><span class="category-cta-label">Learn more</span><svg class="w-2 h-auto fill-white" version="1.1" xmlns="http://www.w3.org/2000/svg" width="683" height="1024" viewBox="0 0 683 1024">
|
||
<title></title>
|
||
<g id="icomoon-ignore">
|
||
</g>
|
||
<path d="M391.327 512.001l-366.327-366.327 120.679-120.679 487.007 487.006-487.007 487.005-120.679-120.678 366.327-366.327z"></path>
|
||
</svg></span></a><div class="category-details flex justify-between gap-5"><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Code Security</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/code-security/" data-dd-action-name="code_security in security">Code Security</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/software-composition-analysis/" data-dd-action-name="software_composition_analysis in security">Software Composition Analysis</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/sast/" data-dd-action-name="sast in security">Static Code Analysis (SAST)</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/iast/" data-dd-action-name="iast in security">Runtime Code Analysis (IAST)</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/iac-security" data-dd-action-name="iac_security in security">IaC Security</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/secret-scanning/" data-dd-action-name="secret_scanning in security">Secret Scanning</a></li></ul></div><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Cloud Security</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/cloud-security/" data-dd-action-name="cloud_security in security">Cloud Security</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/cloud-security/#posture-management" data-dd-action-name="cloud_security_posture_management in security">Cloud Security Posture Management</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/cloud-security/#entitlement-management" data-dd-action-name="identity_and_entitlement_management in security">Cloud Infrastructure Entitlement Management</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/cloud-security/#vulnerability-management" data-dd-action-name="vulnerability_management in security">Vulnerability Management</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/cloud-security/#compliance" data-dd-action-name="compliance in security">Compliance</a></li></ul></div><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Threat Management</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/cloud-siem/" data-dd-action-name="cloud_siem in security">Cloud SIEM</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/workload-protection/" data-dd-action-name="workload_protection in security">Workload Protection</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/app-and-api-protection/" data-dd-action-name="app_and_api_protection in security">App and API Protection</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/sensitive-data-scanner/" data-dd-action-name="sensitive_data_scanner in security">Sensitive Data Scanner</a></li></ul><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Security Labs</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://securitylabs.datadoghq.com/" data-dd-action-name="security_labs_research in security">Security Labs Research</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://opensource.datadoghq.com/" data-dd-action-name="open_source_projects in security">Open Source Projects</a></li></ul></div></div></div><div class="product-category h-full flex flex-col p-10 pl-[25px]" id="digital-experience-detail" x-show="openCategory === 'digital-experience'" x-cloak=""><div class="category-description p-7 rounded flex mb-10 text-white [background:var(--cta-bg)]" style="--cta-bg:linear-gradient(90deg, #00B765 0%, #00BBED 100%)"><div class="category-description-main flex gap-5 flex-1 min-w-0 items-center"><svg class="w-12 h-auto fill-white shrink-0" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>rum</title>
|
||
<path d="M8.728 32h-8.728v-14.544h8.728v14.544zM2.912 29.088h2.912v-8.728h-2.912v8.728zM18.908 29.088h-7.269v-2.912h4.364v-14.544h-10.187v2.912h-2.905v-5.816h16.003v20.361zM32 20.361h-10.18v-2.912h7.276v-14.544h-20.367v2.912h-2.912v-5.816h26.184v20.361z"></path>
|
||
</svg><div class="info"><p class="category-header font-bold font-national text-28 leading-24 pb-[5px]">Digital Experience</p><p class="category-tagline text-18 leading-22 m-0 font-medium">Optimize front-end performance and enhance user experiences</p></div></div></div><div class="category-details flex justify-between gap-5"><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Digital Experience</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/real-user-monitoring/" data-dd-action-name="browser_real_user_monitoring in digital_experience">Browser Real User Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/real-user-monitoring/mobile-rum/" data-dd-action-name="mobile_real_user_monitoring in digital_experience">Mobile Real User Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/product-analytics/" data-dd-action-name="product_analytics in digital_experience">Product Analytics</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/experiments/" data-dd-action-name="experiments in digital_experience">Experiments</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/real-user-monitoring/session-replay/" data-dd-action-name="session_replay in digital_experience">Session Replay</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/synthetic-monitoring/" data-dd-action-name="synthetic_monitoring in digital_experience">Synthetic Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/mobile-app-testing/" data-dd-action-name="mobile_app_testing in digital_experience">Mobile App Testing</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/error-tracking/" data-dd-action-name="error_tracking in digital_experience">Error Tracking</a></li></ul></div><div class="product-subcategory w-1/3 related pl-2 border-l border-l-[#e2e2e2]"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Related Products</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/continuous-testing/" data-dd-action-name="continuous_testing in digital_experience">Continuous Testing</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/dashboards/" data-dd-action-name="dashboards in digital_experience">Dashboards</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/apm/" data-dd-action-name="application_performance_monitoring in digital_experience">Application Performance Monitoring</a></li></ul></div></div></div><div class="product-category h-full flex flex-col p-10 pl-[25px]" id="software-delivery-detail" x-show="openCategory === 'software-delivery'" x-cloak=""><div class="category-description p-7 rounded flex mb-10 text-white [background:var(--cta-bg)]" style="--cta-bg:linear-gradient(90deg, #6300D4 0%, #9C43FE 100%)"><div class="category-description-main flex gap-5 flex-1 min-w-0 items-center"><svg class="w-12 h-auto fill-white shrink-0" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>ci</title>
|
||
<path d="M30.667 22.625v0.087c-0.006 4.392-3.565 7.95-7.956 7.955h-0.085c-3.937-0.005-7.205-2.864-7.845-6.62l-0.007-0.047h-3.107l4.333-4.333 4.333 4.333h-2.833c0.6 2.315 2.669 3.998 5.131 4h0.087c2.916-0.009 5.278-2.373 5.282-5.29v-0.085c-0.003-2.921-2.369-5.288-5.29-5.292h-13.42c-4.393-0.004-7.954-3.565-7.957-7.958v-0.087c0.006-4.392 3.565-7.95 7.956-7.955h0.085c4.393 0.004 7.954 3.564 7.958 7.956v2.044h-2.667v-2.043c-0.004-2.921-2.371-5.287-5.291-5.29h-0.087c-2.919 0.005-5.285 2.371-5.288 5.29v0.085c0.003 2.921 2.369 5.288 5.29 5.292h13.42c4.393 0.004 7.954 3.565 7.957 7.958v0z"></path>
|
||
</svg><div class="info"><p class="category-header font-bold font-national text-28 leading-24 pb-[5px]">Software Delivery</p><p class="category-tagline text-18 leading-22 m-0 font-medium">Build, test, secure and ship quality code faster</p></div></div></div><div class="category-details flex justify-between gap-5"><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Software Delivery</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/internal-developer-portal/" data-dd-action-name="internal_developer_portal in software_delivery">Internal Developer Portal</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ci-cd-monitoring/" data-dd-action-name="ci_visibility in software_delivery">CI Visibility</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/test-optimization/" data-dd-action-name="test_optimization in software_delivery">Test Optimization</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/continuous-testing/" data-dd-action-name="continuous_testing in software_delivery">Continuous Testing</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/ides/" data-dd-action-name="ide_plugins in software_delivery">IDE Plugins</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/dora-metrics/" data-dd-action-name="dora_metrics in software_delivery">DORA Metrics</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/feature-flags/" data-dd-action-name="feature_flags in software_delivery">Feature Flags</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/code-coverage/" data-dd-action-name="code_coverage in software_delivery">Code Coverage</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/software-delivery/ai-impact/" data-dd-action-name="ai_impact in software_delivery">AI Impact</a></li></ul></div><div class="product-subcategory w-1/3 related pl-2 border-l border-l-[#e2e2e2]"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Related Products</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/software-composition-analysis/" data-dd-action-name="software_composition_analysis in software_delivery">Software Composition Analysis</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/apm/" data-dd-action-name="application_performance_monitoring in software_delivery">Application Performance Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/synthetic-monitoring/" data-dd-action-name="synthetic_monitoring in software_delivery">Synthetic Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/real-user-monitoring/" data-dd-action-name="browser_real_user_monitoring in software_delivery">Browser Real User Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/workflow-automation/" data-dd-action-name="workflow_automation in software_delivery">Workflow Automation</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/integrations/" data-dd-action-name="integrations in software_delivery">Integrations</a></li></ul></div></div></div><div class="product-category h-full flex flex-col p-10 pl-[25px]" id="service-management-detail" x-show="openCategory === 'service-management'" x-cloak=""><div class="category-description p-7 rounded flex mb-10 text-white [background:var(--cta-bg)]" style="--cta-bg:linear-gradient(90deg, #FF0080 0%, #FF5E00 100%)"><div class="category-description-main flex gap-5 flex-1 min-w-0 items-center"><svg class="w-12 h-auto fill-white shrink-0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" width="192" height="192">
|
||
<path d="M88,188.38V91.38l84-48.5v96.99l-84,48.51Zm16-87.76v60.04l52-30.02v-60.04l-52,30.02Zm-50-28.87v97l16-9.24V80.99l52-30.02,16-9.24V23.25L54,71.75ZM20,52.12v97l16-9.24V61.36l52-30.02,16-9.24V3.62L20,52.12Z"></path>
|
||
</svg><div class="info"><p class="category-header font-bold font-national text-28 leading-24 pb-[5px]">Service Management</p><p class="category-tagline text-18 leading-22 m-0 font-medium">Integrated, streamlined workflows for faster time-to-resolution</p></div></div></div><div class="category-details flex justify-between gap-5"><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Service Management</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/incident-response/" data-dd-action-name="incident_response in service_management">Incident Response</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/software-catalog/" data-dd-action-name="software_catalog in service_management">Software Catalog</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/service-level-objectives/" data-dd-action-name="service_level_objectives in service_management">Service Level Objectives</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/case-management/" data-dd-action-name="case_management in service_management">Case Management</a></li></ul></div><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Actions</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/workflow-automation/" data-dd-action-name="workflow_automation in service_management">Workflow Automation</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/app-builder/" data-dd-action-name="app_builder in service_management">App Builder</a></li></ul></div><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Agentic & Embedded</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/bits-investigation/" data-dd-action-name="bits_investigation in service_management">Bits Investigation</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/watchdog/" data-dd-action-name="watchdog in service_management">Watchdog</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/event-management/" data-dd-action-name="event_management in service_management">Event Management</a></li></ul></div></div></div><div class="product-category h-full flex flex-col p-10 pl-[25px]" id="ai-detail" x-show="openCategory === 'ai'" x-cloak=""><div class="category-description p-7 rounded flex mb-10 text-white [background:var(--cta-bg)]" style="--cta-bg:linear-gradient(90deg, #0060FF 0%, #8000FF 100%)"><div class="category-description-main flex gap-5 flex-1 min-w-0 items-center"><svg class="w-12 h-auto fill-white shrink-0" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" fill="" viewBox="0 0 192 192" style="enable-background:new 0 0 192 192;" xml:space="preserve"><g id="Layer_7"><g><linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="89.0192" y1="122.732" x2="142.9808" y2="29.268"><stop offset="0" style="stop-color:#5500FF"></stop><stop offset="0.1715" style="stop-color:#4D09FF"></stop><stop offset="0.4511" style="stop-color:#3821FF"></stop><stop offset="0.802" style="stop-color:#1649FF"></stop><stop offset="1" style="stop-color:#0062FF"></stop></linearGradient><path class="st5" d="M120,16h-8c0,30.88-25.12,56-56,56v8c30.88,0,56,25.12,56,56h8c0-30.88,25.12-56,56-56v-8 C145.12,72,120,46.88,120,16z"></path><linearGradient id="SVGID_00000049207151058930698180000011839073544639225000_" gradientUnits="userSpaceOnUse" x1="35.4115" y1="168.7311" x2="68.5885" y2="111.267"><stop offset="0" style="stop-color:#5500FF"></stop><stop offset="0.1715" style="stop-color:#4D09FF"></stop><stop offset="0.4511" style="stop-color:#3821FF"></stop><stop offset="0.802" style="stop-color:#1649FF"></stop><stop offset="1" style="stop-color:#0062FF"></stop></linearGradient><path d="M56,104h-4c0,0,0,0,0,0c0,0,0,0,0,0h-4 c0,17.64-14.35,32-32,32v8c17.65,0,32,14.36,32,32h8c0-17.64,14.35-32,32-32v-8C70.35,136,56,121.64,56,104z"></path></g></g></svg><div class="info"><p class="category-header font-bold font-national text-28 leading-24 pb-[5px]">AI</p><p class="category-tagline text-18 leading-22 m-0 font-medium">Monitor and improve model performance. Pinpoint root causes and detect anomalies</p></div></div></div><div class="category-details flex justify-between gap-5"><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">AI Observability</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/products/ai/agent-observability/" data-dd-action-name="agent_observability in ai">Agent Observability</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/gpu-monitoring/" data-dd-action-name="gpu_monitoring in ai">GPU Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/integrations/#cat-aiml" data-dd-action-name="ai_integrations in ai">AI Integrations</a></li></ul></div><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Agentic & Embedded</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/bits-ai-agents/" data-dd-action-name="bits_ai_agents in ai">Bits AI Agents</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/bits-chat/" data-dd-action-name="bits_chat in ai">Bits Chat</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/bits-agent-builder/" data-dd-action-name="bits_agent_builder in ai">Bits Agent Builder</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/bits-code/" data-dd-action-name="bits_code in ai">Bits Code</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/bits-investigation/" data-dd-action-name="bits_investigation in ai">Bits Investigation</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/bits-security-analyst/" data-dd-action-name="bits_security_analyst in ai">Bits Security Analyst</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/mcp-server/" data-dd-action-name="mcp_server in ai">MCP Server</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/mcp-server/" data-dd-action-name="pup_cli in ai">Pup CLI</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/agent-directory/" data-dd-action-name="agent_directory in ai">Agent Directory</a></li></ul></div><div class="product-subcategory w-1/3 related pl-2 border-l border-l-[#e2e2e2]"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Related Products</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/incident-response/" data-dd-action-name="incident_response in ai">Incident Response</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/workflow-automation/" data-dd-action-name="workflow_automation in ai">Workflow Automation</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/apm/" data-dd-action-name="application_performance_monitoring in ai">Application Performance Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/universal-service-monitoring/" data-dd-action-name="universal_service_monitoring in ai">Universal Service Monitoring</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/log-management/" data-dd-action-name="log_management in ai">Log Management</a></li></ul></div></div></div><div class="product-category h-full flex flex-col p-10 pl-[25px]" id="platform-detail" x-show="openCategory === 'platform'" x-cloak=""><div class="category-description p-7 rounded flex mb-10 text-white [background:var(--cta-bg)]" style="--cta-bg:linear-gradient(90deg, #8000FF 0%, #4300B0 100%)"><div class="category-description-main flex gap-5 flex-1 min-w-0 items-center"><svg class="w-12 h-auto fill-white shrink-0" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>dashboard</title>
|
||
<path d="M32 24.876v1.79h-32v-21.333h1.988v19.543h30.012zM26.009 10.679l3.976 12.432h-25.982v-8.006l6.999-7.981 8.987 7.981 6.020-4.426z"></path>
|
||
</svg><div class="info"><p class="category-header font-bold font-national text-28 leading-24 pb-[5px]">Platform Capabilities</p><p class="category-tagline text-18 leading-22 m-0 font-medium">Built-in features & integrations that power the Datadog platform</p></div></div></div><div class="category-details flex justify-between gap-5"><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Built-in Features</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/bits-ai-agents/" data-dd-action-name="bits_ai_agents in platform_capabilities">Bits AI Agents</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/bits-agent-builder/" data-dd-action-name="bits_agent_builder in platform_capabilities">Bits Agent Builder</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/bits-chat/" data-dd-action-name="bits_chat in platform_capabilities">Bits Chat</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/metrics/" data-dd-action-name="metrics in platform_capabilities">Metrics</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/watchdog/" data-dd-action-name="watchdog in platform_capabilities">Watchdog</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/alerts/" data-dd-action-name="alerts in platform_capabilities">Alerts</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/dashboards/" data-dd-action-name="dashboards in platform_capabilities">Dashboards</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://docs.datadoghq.com/notebooks/" data-dd-action-name="notebooks in platform_capabilities">Notebooks</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://docs.datadoghq.com/service_management/mobile/?tab=ios" data-dd-action-name="mobile_app in platform_capabilities">Mobile App</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/fleet-automation/" data-dd-action-name="fleet_automation in platform_capabilities">Fleet Automation</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/governance-console/" data-dd-action-name="governance_console in platform_capabilities">Governance Console</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://docs.datadoghq.com/account_management/rbac/?tab=datadogapplication" data-dd-action-name="access_control in platform_capabilities">Access Control</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/dora-metrics/" data-dd-action-name="dora_metrics in platform_capabilities">DORA Metrics</a></li></ul></div><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Workflows & Collaboration</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/incident-response/" data-dd-action-name="incident_response in platform_capabilities">Incident Response</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/case-management/" data-dd-action-name="case_management in platform_capabilities">Case Management</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/event-management/" data-dd-action-name="event_management in platform_capabilities">Event Management</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/workflow-automation/" data-dd-action-name="workflow_automation in platform_capabilities">Workflow Automation</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/app-builder/" data-dd-action-name="app_builder in platform_capabilities">App Builder</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/cloudcraft/" data-dd-action-name="cloudcraft in platform_capabilities">Cloudcraft</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://docs.datadoghq.com/account_management/teams/" data-dd-action-name="teams in platform_capabilities">Teams</a></li></ul></div><div class="product-subcategory w-1/3"><p class="subcategory-header font-bold font-national uppercase text-16 leading-18 p-3">Extensibility</p><ul class="product-list"><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/solutions/opentelemetry/" data-dd-action-name="opentelemetry in platform_capabilities">OpenTelemetry</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/integrations/" data-dd-action-name="integrations in platform_capabilities">Integrations</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/platform/ides/" data-dd-action-name="ide_plugins in platform_capabilities">IDE Plugins</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/mcp-server/" data-dd-action-name="mcp_server in platform_capabilities">MCP Server</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/mcp-server/" data-dd-action-name="pup_cli in platform_capabilities">Pup CLI</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/product/ai/agent-directory/" data-dd-action-name="agent_directory in platform_capabilities">Agent Directory</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://docs.datadoghq.com/api/" data-dd-action-name="api in platform_capabilities">API</a></li><li><a class="block p-3 text-18 leading-18 text-wrap capitalize hover:text-[#70f] hover:bg-black/5 rounded" href="https://www.datadoghq.com/marketplacepartners/" data-dd-action-name="marketplace in platform_capabilities">Marketplace</a></li></ul></div></div></div></div></div></div></li><li><a class="customers-menu block pt-[8.5px] px-2 desktop-lg:px-3 pb-[9.5px] desktop-lg:px-3 text-18 font-semibold font-national uppercase text-[#555] hover:text-[#70f]" href="https://www.datadoghq.com/customers/"><span>Customers</span></a></li><li><a class="pricing-menu block pt-[8.5px] px-2 desktop-lg:px-3 pb-[9.5px] desktop-lg:px-3 text-18 font-semibold font-national uppercase text-[#555] hover:text-[#70f]" href="https://www.datadoghq.com/pricing/"><span>Pricing</span></a></li><li x-on:mouseover="mouseOver = 'solutions'" x-on:mouseout="mouseOver = 'none'" class="dropdown relative solutions-dropdown"><a class="dropdown relative block pt-[8.5px] px-2 desktop-lg:px-3 pb-[9.5px] desktop-lg:px-3 text-18 font-semibold font-national uppercase text-[#555] hover:text-[#70f]" href="https://www.datadoghq.com/">Solutions</a><ul x-show="mouseOver === 'solutions'" x-cloak="" class="dropdown-menu solutions-menu absolute z-40 bg-white w-[820px] p-5 left-[9px] top-[42px] border-t-[3px] border-t-[#632ca6]" style="box-shadow:0 8px 10px rgba(0,0,0,7%)"><div class="grid grid-cols-3 gap-[30px]"><div><p class="font-semibold font-national text-black text-14 leading-18 tablet:text-16 tablet:leading-20 uppercase mb-0 py-2 px-[11px]">Industry</p><ul class="list-none mt-0"><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/financial-services/" data-dd-action-name="financial_services in Solutions"><span class="inline-flex">Financial Services</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/manufacturing-logistics/" data-dd-action-name="manufacturing_and_logistics in Solutions"><span class="inline-flex">Manufacturing & Logistics</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/healthcare/" data-dd-action-name="healthcare_and_life_sciences in Solutions"><span class="inline-flex">Healthcare/Life Sciences</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/retail-ecommerce/" data-dd-action-name="retail_and_ecommerce in Solutions"><span class="inline-flex">Retail/E-Commerce</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/government/" data-dd-action-name="government in Solutions"><span class="inline-flex">Government</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/education/" data-dd-action-name="education in Solutions"><span class="inline-flex">Education</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/media-entertainment/" data-dd-action-name="media_and_entertainment in Solutions"><span class="inline-flex">Media & Entertainment</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/technology/" data-dd-action-name="technology in Solutions"><span class="inline-flex">Technology</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/gaming/" data-dd-action-name="gaming in Solutions"><span class="inline-flex">Gaming</span></a></li></ul></div><div><p class="font-semibold font-national text-black text-14 leading-18 tablet:text-16 tablet:leading-20 uppercase mb-0 py-2 px-[11px]">Technology</p><ul class="list-none mt-0"><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/aws/" data-dd-action-name="amazon_web_services_monitoring in Solutions"><span class="inline-flex">Amazon Web Services Monitoring</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/azure/" data-dd-action-name="azure_monitoring in Solutions"><span class="inline-flex">Azure Monitoring</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/googlecloud/" data-dd-action-name="google_cloud_monitoring in Solutions"><span class="inline-flex">Google Cloud Monitoring</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/oci-monitoring/" data-dd-action-name="oci_monitoring in Solutions"><span class="inline-flex">Oracle Cloud Monitoring</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/kubernetes/" data-dd-action-name="kubernetes_monitoring in Solutions"><span class="inline-flex">Kubernetes Monitoring</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/openshift/" data-dd-action-name="red_hat_openshift in Solutions"><span class="inline-flex">Red Hat OpenShift</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/pivotal-platform/" data-dd-action-name="pivotal_platform in Solutions"><span class="inline-flex">Pivotal Platform</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/openai/" data-dd-action-name="openai in Solutions"><span class="inline-flex">OpenAI</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/sap-monitoring/" data-dd-action-name="sap_monitoring in Solutions"><span class="inline-flex">SAP Monitoring</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/opentelemetry/" data-dd-action-name="opentelemetry in Solutions"><span class="inline-flex">OpenTelemetry</span></a></li></ul></div><div><p class="font-semibold font-national text-black text-14 leading-18 tablet:text-16 tablet:leading-20 uppercase mb-0 py-2 px-[11px]">Use Case</p><ul class="list-none mt-0"><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/application-security/" data-dd-action-name="application_security in Solutions"><span class="inline-flex">Application Security</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/cloud-migration/" data-dd-action-name="cloud_migration in Solutions"><span class="inline-flex">Cloud Migration</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/monitoring-consolidation/" data-dd-action-name="monitoring_consolidation in Solutions"><span class="inline-flex">Monitoring Consolidation</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/unified-commerce-monitoring/" data-dd-action-name="unified_commerce_monitoring in Solutions"><span class="inline-flex">Unified Commerce Monitoring</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/soar/" data-dd-action-name="soar in Solutions"><span class="inline-flex">SOAR</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/devops/" data-dd-action-name="devops in Solutions"><span class="inline-flex">DevOps</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/finops/" data-dd-action-name="finops in Solutions"><span class="inline-flex">FinOps</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/shift-left-testing/" data-dd-action-name="shift_left_testing in Solutions"><span class="inline-flex">Shift-Left Testing</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/digital-experience-monitoring/" data-dd-action-name="digital_experience_monitoring in Solutions"><span class="inline-flex">Digital Experience Monitoring</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/security-analytics/" data-dd-action-name="security_analytics in Solutions"><span class="inline-flex">Security Analytics</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/security/cis-benchmarks/aws/" data-dd-action-name="compliance_for_cis_benchmarks in Solutions"><span class="inline-flex">Compliance for CIS Benchmarks</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/hybrid-cloud-monitoring/" data-dd-action-name="hybrid_cloud_monitoring in Solutions"><span class="inline-flex">Hybrid Cloud Monitoring</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/iot-monitoring/" data-dd-action-name="iot_monitoring in Solutions"><span class="inline-flex">Edge Device Monitoring</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/real-time-business-intelligence/" data-dd-action-name="real_time_bi in Solutions"><span class="inline-flex">Real-Time BI</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/on-premises-monitoring/" data-dd-action-name="on_premises_monitoring in Solutions"><span class="inline-flex">On-Premises Monitoring</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/log-analysis-and-correlation/" data-dd-action-name="log_analysis_and_correlation in Solutions"><span class="inline-flex">Log Analysis & Correlation</span></a></li><li><a class="block whitespace-nowrap capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18" href="https://www.datadoghq.com/solutions/cnapp/" data-dd-action-name="cnapp in Solutions"><span class="inline-flex">CNAPP</span></a></li></ul></div></div></ul></li><li><a class="docs-menu block pt-[8.5px] px-2 desktop-lg:px-3 pb-[9.5px] desktop-lg:px-3 text-18 font-semibold font-national uppercase text-[#555] hover:text-[#70f]" href="https://docs.datadoghq.com/"><span>Docs</span></a></li></ul><div><a href="https://www.datadoghq.com/" class="js-logo-download hidden desktop-sm:flex flex-col items-center justify-center relative"><img height="75" class="bits-logo-lg max-w-full transition-all h-[75px]" :class="navScrolled ? '!h-[50px]' : ''" src="https://corp.dd-static.net/img/dd_logo_n_70x75.png?ch=Width,DPR&fit=max&auto=format&w=70&h=75" srcset="https://corp.dd-static.net/img/dd_logo_n_70x75.png?ch=Width,DPR&fit=max&auto=format&w=70&h=75 1x, https://corp.dd-static.net/img/dd_logo_n_70x75.png?ch=Width,DPR&fit=max&auto=format&w=70&h=75&dpr=2 2x" alt="DataDog">
|
||
<img class="datadog-text-logo-lg w-[93px] mt-[5px] h-auto max-w-full block" :class="navScrolled ? 'hidden' : ''" height="14" src="https://corp.dd-static.net/img/dd-logo-n-200.png?ch=Width,DPR&fit=max&auto=format&h=14&auto=format&w=807" srcset="https://corp.dd-static.net/img/dd-logo-n-200.png?ch=Width,DPR&fit=max&auto=format&h=14&auto=format&w=807 1x, https://corp.dd-static.net/img/dd-logo-n-200.png?ch=Width,DPR&fit=max&auto=format&h=14&auto=format&w=807&dpr=2 2x" alt="DataDog"></a></div><ul x-data="{ mouseOver: 'none' }" class="flex flex-row items-center list-none m-0 justify-end grow basis-0"><li x-on:mouseover="mouseOver = 'about'" x-on:mouseout="mouseOver = 'none'" class="dropdown relative"><a href="https://www.datadoghq.com/about/leadership/" class="dropdown block pt-[8.5px] px-2 desktop-lg:px-3 pb-[9.5px] desktop-lg:px-3 font-semibold font-national text-18 uppercase text-[#555] hover:text-[#70f]">About</a><ul x-show="mouseOver === 'about'" x-cloak="" class="dropdown-menu absolute z-40 bg-white p-5 left-[9px] top-[42px] border-t-[3px] border-t-[#632ca6]" style="box-shadow:0 8px 10px rgba(0,0,0,7%)" aria-labelledby="dropdownMenuButton"><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://www.datadoghq.com/about/contact/"><span>Contact</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://www.datadoghq.com/partner/network/"><span>Partners</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://www.datadoghq.com/about/latest-news/press-releases/"><span>Newsroom</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://www.datadoghq.com/events-webinars/"><span>Events & Webinars</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://www.datadoghq.com/about/leadership/"><span>Leadership</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://careers.datadoghq.com/"><span>Careers</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://www.datadoghq.com/about/analyst/"><span>Analyst Reports</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://investors.datadoghq.com/"><span>Investor Relations</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://www.datadoghq.com/esg-report/"><span>ESG Report</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://www.datadoghq.com/trust/"><span>Trust Hub</span></a></li></ul></li><li x-on:mouseover="mouseOver = 'blog'" x-on:mouseout="mouseOver = 'none'" class="dropdown relative"><a href="https://www.datadoghq.com/blog/" class="dropdown block pt-[8.5px] px-2 desktop-lg:px-3 pb-[9.5px] desktop-lg:px-3 font-semibold font-national text-18 uppercase text-[#555] hover:text-[#70f]">Blog</a><ul x-show="mouseOver === 'blog'" x-cloak="" class="dropdown-menu absolute z-40 bg-white p-5 left-[9px] top-[42px] border-t-[3px] border-t-[#632ca6]" style="box-shadow:0 8px 10px rgba(0,0,0,7%)" aria-labelledby="dropdownMenuButton"><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://www.datadoghq.com/blog/"><span>The Monitor</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://www.datadoghq.com/blog/engineering/"><span>Engineering</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://www.datadoghq.com/blog/ai/"><span>AI</span></a></li><li><a class="block capitalize px-[11px] py-[7px] hover:text-[#70f] hover:bg-black/5 rounded text-18 text-nowrap" href="https://securitylabs.datadoghq.com/"><span>Security Labs</span></a></li></ul></li><li class="final"><a class="font-semibold font-national block pt-[8.5px] px-2 desktop-lg:px-3 pb-[9.5px] desktop-lg:px-3 text-18 uppercase text-[#555] hover:text-[#70f] transition-all" href="https://app.datadoghq.com/" data-event-category="Signup" data-event-action="Step 1 Top Right Initiated" data-event-label=" {{url path}}" style="position:relative"><span>Login</span></a></li><li class="final"><a class="font-semibold font-national sign-up-trigger btn btn-gradient js-cta-topRight pt-[8.5px] px-7 pb-[9.5px] block text-18 text-[#555] uppercase border-none border-0 border-[transparent] bg-white rounded min-w-[120px] ml-2.5 hover:text-white transition-all" href="https://www.datadoghq.com/" data-event-category="Signup" data-event-action="Step 1 Top Right Initiated" data-event-label=" {{url path}}" style="position:relative"><span class="hidden desktop-sm:block">GET STARTED FREE</span>
|
||
<span class="block desktop-sm:hidden">Free Trial</span></a></li></ul></div><div class="flex desktop-sm:hidden items-center justify-center"><a href="https://www.datadoghq.com/"><img src="https://corp.dd-static.net/img/datadog_rbg_n_2x.png?format=png" class="bits-logo-mobile d-inline-block" alt="Datadog Logo" width="157" height="40"></a></div><button x-on:click="mobileOpen = !mobileOpen" type="button" class="navbar-toggler flex flex-col gap-1 desktop-sm:hidden relative my-3 px-2.5 py-[9px] border border-[transparent]" data-bs-toggle="" data-bs-target="#collapseExample" aria-expanded="false" aria-controls="collapseExample">
|
||
<span class="visually-hidden sr-only">Toggle navigation</span>
|
||
<span class="icon-bar transition-all block w-[22px] h-0.5 bg-[#555]" :class="mobileOpen ? 'rotate-45 translate-x-1.5 translate-y-1.5' : ''"></span>
|
||
<span class="icon-bar transition-all block w-[22px] h-0.5 bg-[#555]" :class="mobileOpen ? 'opacity-0' : 'opacity-100'"></span>
|
||
<span class="icon-bar transition-all block w-[22px] h-0.5 bg-[#555]" :class="mobileOpen ? '-rotate-45 translate-x-1.5 -translate-y-1.5' : ''"></span></button></div></nav><div x-show="mobileOpen" x-cloak="" @click="mobileOpen = false" id="mobile-nav-bg" class="desktop-sm:hidden transition-all fixed top-0 left-0 w-full h-full bg-black z-50" :class="mobileOpen ? 'opacity-25' : 'opacity-0'"></div><div x-cloak="" id="mobile-nav" class="desktop-sm:hidden transition-all w-[400px] pt-[90px] bg-white fixed top-0 overflow-y-auto h-full z-60 pb-5 font-normal" :class="mobileOpen ? 'right-0' : 'right-[-500px]'"><ul><li x-on:click="dropdownOpen === 'product' ? dropdownOpen = 'none' : dropdownOpen = 'product'" class="border-b border-b-[#c7c7c7] text-18 dropdown"><a href="#" data-astro-reload="" :class="dropdownOpen === 'product' ? 'text-[#632ca6]' : 'text-[#555]'" class="dropdown-toggle block font-semibold font-national uppercase text-[#555] hover:text-[#632ca6] whitespace-nowrap" data-bs-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="true" data-dd-action-name="Product Dropdown on Mobile"><div class="nav-menu-item ml-5 py-3 pl-[14px]">Product
|
||
<span class="caret absolute right-[22px] inline-flex h-[25px]"><svg viewBox="0 0 17.78 10.51" width="18px" class="inline-block transition-all" :class="dropdownOpen === 'product' ? 'rotate-180' : 'rotate-0'">
|
||
<polyline class="dropdown-arrow fill-none stroke-[#555]" style="stroke-width: 2px;" points="16.92 1.14 8.92 9.14 0.92 1.14"></polyline>
|
||
</svg></span></div></a><ul x-cloak="" x-show="dropdownOpen === 'product'" class="dropdown-menu" id="product-mobile-menu"><li><p class="mobile-product-category sticky top-0 bg-white flex items-center gap-2 pt-[13px] pb-[5px] pl-[19px] font-bold font-national text-22 leading-24 ml-5"><svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>host-map</title>
|
||
<path d="M14.214 13.103l-7.107 4.103-7.107-4.103v-8.206l7.107-4.103 7.107 4.103zM32 4.897v8.206l-7.107 4.103-7.107-4.103v-8.206l7.107-4.103zM29.333 6.436l-4.44-2.563-4.44 2.563v5.127l4.44 2.563 4.44-2.563zM9.037 19.98v8.040l6.963 4.020 6.962-4.020v-8.040l-6.963-4.020z"></path>
|
||
</svg>
|
||
Infrastructure</p><ul class="mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/product/infrastructure-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Infrastructure Monitoring</a></li><li><a href="https://www.datadoghq.com/product/metrics/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Metrics</a></li><li><a href="https://www.datadoghq.com/product/container-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Container Monitoring</a></li><li><a href="https://www.datadoghq.com/product/kubernetes-autoscaling/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Kubernetes Autoscaling</a></li><li><a href="https://www.datadoghq.com/product/network-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Network Monitoring</a></li><li><a href="https://www.datadoghq.com/product/serverless-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Serverless</a></li><li><a href="https://www.datadoghq.com/product/cloud-cost-management/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Cloud Cost Management</a></li><li><a href="https://www.datadoghq.com/product/cloudcraft/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Cloudcraft</a></li><li><a href="https://www.datadoghq.com/product/storage-management/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Storage Management</a></li><li><a href="https://www.datadoghq.com/product/gpu-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">GPU Monitoring</a></li></ul></li><li><p class="mobile-product-category sticky top-0 bg-white flex items-center gap-2 pt-[13px] pb-[5px] pl-[19px] font-bold font-national text-22 leading-24 ml-5"><svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>apm</title>
|
||
<path d="M0 2.667h32v3.81h-32v-3.81zM0 10.286h6v3.81h-6v-3.81zM10 10.286h22v3.81h-22v-3.81zM10 17.905h12v3.81h-12v-3.81zM26 17.905h6v3.81h-6v-3.81zM16 25.524h6v3.81h-6v-3.81z"></path>
|
||
</svg>
|
||
Applications</p><ul class="mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/product/apm/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Application Performance Monitoring</a></li><li><a href="https://www.datadoghq.com/product/universal-service-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Universal Service Monitoring</a></li><li><a href="https://www.datadoghq.com/product/code-profiling/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Continuous Profiler</a></li><li><a href="https://www.datadoghq.com/product/dynamic-instrumentation/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Dynamic Instrumentation</a></li><li><a href="https://www.datadoghq.com/products/ai/agent-observability/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Agent Observability</a></li></ul></li><li><p class="mobile-product-category sticky top-0 bg-white flex items-center gap-2 pt-[13px] pb-[5px] pl-[19px] font-bold font-national text-22 leading-24 ml-5"><svg class="w-[22px] h-auto" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" width="192" height="192">
|
||
<path d="M96,8C50.393,8,16,25.2,16,48v96c0,22.8,34.393,40,80,40s80-17.2,80-40V48C176,25.2,141.607,8,96,8ZM48.337,32.683C60.936,27.083,77.863,24,96,24c39.068,0,64,14.214,64,24,0,4.969-6.26,10.838-16.337,15.317C131.064,68.917,114.138,72,96,72,56.932,72,32,57.786,32,48,32,43.031,38.26,37.162,48.337,32.683Zm95.326,126.633C131.064,164.916,114.137,168,96,168c-39.068,0-64-14.215-64-24V120.577C46.356,130.075,69.242,136,96,136s49.644-5.925,64-15.423V144C160,148.969,153.74,154.838,143.663,159.316Zm0-48C131.064,116.916,114.137,120,96,120c-39.068,0-64-14.215-64-24V72.577C46.356,82.075,69.242,88,96,88s49.644-5.925,64-15.423V96C160,100.969,153.74,106.838,143.663,111.316ZM96,95.86a151.433,151.433,0,0,0,16-.83v16.1c-5.14.48-10.49.73-16,.73Zm47.66-8.69c.12-.05.23-.1.34-.15v17.27a113.137,113.137,0,0,1-16,4.47V92.34A90.144,90.144,0,0,0,143.66,87.17ZM96,144a151.433,151.433,0,0,0,16-.83v16.1c-5.14.48-10.49.73-16,.73Zm47.66-8.69c.12-.05.23-.1.34-.15v17.27a113.137,113.137,0,0,1-16,4.47v-16.42A90.144,90.144,0,0,0,143.66,135.312Z"></path>
|
||
</svg>
|
||
Data</p><ul class="mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/product/database-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Database Monitoring</a></li><li><a href="https://www.datadoghq.com/products/observability/data-observability/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Data Observability</a></li><li><a href="https://www.datadoghq.com/product/data-streams-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Data Streams Monitoring</a></li></ul></li><li><p class="mobile-product-category sticky top-0 bg-white flex items-center gap-2 pt-[13px] pb-[5px] pl-[19px] font-bold font-national text-22 leading-24 ml-5"><svg class="w-[22px] h-auto" width="48" height="48" viewBox="0 0 48 48" fill="" xmlns="http://www.w3.org/2000/svg">
|
||
<g id="Logs">
|
||
<path id="Vector" d="M28.1375 9.81131C21.6141 10.8028 16.3957 15.6567 14.7773 22.1801C13.4723 27.085 14.7773 31.678 17.0742 35.2269L9.87276 42.4283C8.56785 43.7333 8.56785 45.7163 9.87276 47.0212C11.1777 48.3262 13.1608 48.3262 14.4658 47.0212L21.6161 39.8198C25.2176 42.1167 29.809 43.4213 34.6629 42.1167C40.8728 40.4472 45.7792 34.9153 46.7707 28.3917C48.0737 17.6397 38.9403 8.50641 28.1375 9.81131ZM30.4344 37.5219C24.2245 37.5219 19.0063 32.3035 19.0063 26.0938C19.0063 19.9364 24.2247 14.7165 30.4344 14.7165C36.6441 14.7165 41.8625 19.9349 41.8625 26.0938C41.8638 32.3035 36.6439 37.5219 30.434 37.5219H30.4344ZM23.9106 6.52341H14.1518V0H23.9106V6.52341ZM36.9574 6.52341H27.1985V0H36.9574V6.52341ZM11.8553 32.617H1.10498V26.0936H10.8638C10.8638 28.39 11.1773 30.6865 11.8553 32.617ZM15.7702 13.0468C14.1518 15.0297 12.8483 17.3262 11.8568 19.5702H1.10498V13.0468H15.7702ZM10.8638 6.52341H1.10498V0H10.8638V6.52341ZM35.3404 29.3812H25.8951C25.8951 29.3812 25.5295 28.3897 25.5295 27.7627C25.3495 24.2183 28.5039 21.2393 32.0529 21.2393C33.3578 21.2393 34.3498 21.5528 35.3408 22.1783L35.3404 29.3812Z"></path>
|
||
</g>
|
||
</svg>
|
||
Logs</p><ul class="mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/product/log-management/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Log Management</a></li><li><a href="https://www.datadoghq.com/product/sensitive-data-scanner/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Sensitive Data Scanner</a></li><li><a href="https://www.datadoghq.com/product/audit-trail/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Audit Trail</a></li><li><a href="https://www.datadoghq.com/product/observability-pipelines/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Observability Pipelines</a></li></ul></li><li><p class="mobile-product-category sticky top-0 bg-white flex items-center gap-2 pt-[13px] pb-[5px] pl-[19px] font-bold font-national text-22 leading-24 ml-5"><svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>security-platform</title>
|
||
<path d="M16 0.793l-12 6.938v9.604c0.007 4.42 2.392 8.281 5.944 10.372l0.056 0.031 6 3.468 6-3.469c3.608-2.122 5.993-5.983 6-10.402v-9.605zM6.667 10.811l8 4.625v4.42l-8-4.625zM7.997 8.5l6.669-3.856v7.711zM6.723 18.343l7.944 4.593v4.42l-3.333-1.926c-2.521-1.484-4.269-4.050-4.607-7.044l-0.004-0.043zM25.333 17.335c-0.005 3.439-1.86 6.443-4.623 8.070l-0.044 0.024-3.333 1.927v-22.712l8 4.625z"></path>
|
||
</svg>
|
||
Security</p><ul class="mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/products/security/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Overview</a></li><li><a href="https://www.datadoghq.com/product/code-security/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Code Security</a></li><li><a href="https://www.datadoghq.com/product/software-composition-analysis/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Software Composition Analysis</a></li><li><a href="https://www.datadoghq.com/product/sast/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Static Code Analysis (SAST)</a></li><li><a href="https://www.datadoghq.com/product/iast/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Runtime Code Analysis (IAST)</a></li><li><a href="https://www.datadoghq.com/product/iac-security" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">IaC Security</a></li><li><a href="https://www.datadoghq.com/product/cloud-security/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Cloud Security</a></li><li><a href="https://www.datadoghq.com/product/cloud-security/#posture-management" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Cloud Security Posture Management</a></li><li><a href="https://www.datadoghq.com/product/cloud-security/#entitlement-management" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Cloud Infrastructure Entitlement Management</a></li><li><a href="https://www.datadoghq.com/product/cloud-security/#vulnerability-management" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Vulnerability Management</a></li><li><a href="https://www.datadoghq.com/product/cloud-security/#compliance" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Compliance</a></li><li><a href="https://www.datadoghq.com/product/cloud-siem/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Cloud SIEM</a></li><li><a href="https://www.datadoghq.com/product/workload-protection/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Workload Protection</a></li><li><a href="https://www.datadoghq.com/product/app-and-api-protection/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">App and API Protection</a></li><li><a href="https://www.datadoghq.com/product/sensitive-data-scanner/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Sensitive Data Scanner</a></li><li><a href="https://securitylabs.datadoghq.com/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Security Labs Research</a></li><li><a href="https://opensource.datadoghq.com/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Open Source Projects</a></li><li><a href="https://www.datadoghq.com/product/secret-scanning/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Secret Scanning</a></li></ul></li><li><p class="mobile-product-category sticky top-0 bg-white flex items-center gap-2 pt-[13px] pb-[5px] pl-[19px] font-bold font-national text-22 leading-24 ml-5"><svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>rum</title>
|
||
<path d="M8.728 32h-8.728v-14.544h8.728v14.544zM2.912 29.088h2.912v-8.728h-2.912v8.728zM18.908 29.088h-7.269v-2.912h4.364v-14.544h-10.187v2.912h-2.905v-5.816h16.003v20.361zM32 20.361h-10.18v-2.912h7.276v-14.544h-20.367v2.912h-2.912v-5.816h26.184v20.361z"></path>
|
||
</svg>
|
||
Digital Experience</p><ul class="mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/product/real-user-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Browser Real User Monitoring</a></li><li><a href="https://www.datadoghq.com/product/real-user-monitoring/mobile-rum/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Mobile Real User Monitoring</a></li><li><a href="https://www.datadoghq.com/product/product-analytics/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Product Analytics</a></li><li><a href="https://www.datadoghq.com/product/experiments/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Experiments</a></li><li><a href="https://www.datadoghq.com/product/real-user-monitoring/session-replay/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Session Replay</a></li><li><a href="https://www.datadoghq.com/product/synthetic-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Synthetic Monitoring</a></li><li><a href="https://www.datadoghq.com/product/mobile-app-testing/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Mobile App Testing</a></li><li><a href="https://www.datadoghq.com/product/error-tracking/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Error Tracking</a></li><li><a href="https://www.datadoghq.com/product/byoc-logs/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">BYOC Log Management</a></li></ul></li><li><p class="mobile-product-category sticky top-0 bg-white flex items-center gap-2 pt-[13px] pb-[5px] pl-[19px] font-bold font-national text-22 leading-24 ml-5"><svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>ci</title>
|
||
<path d="M30.667 22.625v0.087c-0.006 4.392-3.565 7.95-7.956 7.955h-0.085c-3.937-0.005-7.205-2.864-7.845-6.62l-0.007-0.047h-3.107l4.333-4.333 4.333 4.333h-2.833c0.6 2.315 2.669 3.998 5.131 4h0.087c2.916-0.009 5.278-2.373 5.282-5.29v-0.085c-0.003-2.921-2.369-5.288-5.29-5.292h-13.42c-4.393-0.004-7.954-3.565-7.957-7.958v-0.087c0.006-4.392 3.565-7.95 7.956-7.955h0.085c4.393 0.004 7.954 3.564 7.958 7.956v2.044h-2.667v-2.043c-0.004-2.921-2.371-5.287-5.291-5.29h-0.087c-2.919 0.005-5.285 2.371-5.288 5.29v0.085c0.003 2.921 2.369 5.288 5.29 5.292h13.42c4.393 0.004 7.954 3.565 7.957 7.958v0z"></path>
|
||
</svg>
|
||
Software Delivery</p><ul class="mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/product/internal-developer-portal/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Internal Developer Portal</a></li><li><a href="https://www.datadoghq.com/product/ci-cd-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">CI Visibility</a></li><li><a href="https://www.datadoghq.com/product/test-optimization/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Test Optimization</a></li><li><a href="https://www.datadoghq.com/product/continuous-testing/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Continuous Testing</a></li><li><a href="https://www.datadoghq.com/product/platform/ides/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">IDE Plugins</a></li><li><a href="https://www.datadoghq.com/product/feature-flags/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Feature Flags</a></li><li><a href="https://www.datadoghq.com/product/code-coverage/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Code Coverage</a></li><li><a href="https://www.datadoghq.com/product/software-delivery/ai-impact/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">AI Impact</a></li></ul></li><li><p class="mobile-product-category sticky top-0 bg-white flex items-center gap-2 pt-[13px] pb-[5px] pl-[19px] font-bold font-national text-22 leading-24 ml-5"><svg class="w-[22px] h-auto" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" width="192" height="192">
|
||
<path d="M88,188.38V91.38l84-48.5v96.99l-84,48.51Zm16-87.76v60.04l52-30.02v-60.04l-52,30.02Zm-50-28.87v97l16-9.24V80.99l52-30.02,16-9.24V23.25L54,71.75ZM20,52.12v97l16-9.24V61.36l52-30.02,16-9.24V3.62L20,52.12Z"></path>
|
||
</svg>
|
||
Service Management</p><ul class="mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/product/event-management/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Event Management</a></li><li><a href="https://www.datadoghq.com/product/software-catalog/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Software Catalog</a></li><li><a href="https://www.datadoghq.com/product/service-level-objectives/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Service Level Objectives</a></li><li><a href="https://www.datadoghq.com/product/incident-response/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Incident Response</a></li><li><a href="https://www.datadoghq.com/product/case-management/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Case Management</a></li><li><a href="https://www.datadoghq.com/product/workflow-automation/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Workflow Automation</a></li><li><a href="https://www.datadoghq.com/product/app-builder/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">App Builder</a></li><li><a href="https://www.datadoghq.com/product/ai/bits-investigation/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Bits Investigation</a></li><li><a href="https://www.datadoghq.com/product/platform/watchdog/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Watchdog</a></li></ul></li><li><p class="mobile-product-category sticky top-0 bg-white flex items-center gap-2 pt-[13px] pb-[5px] pl-[19px] font-bold font-national text-22 leading-24 ml-5"><svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" fill="" viewBox="0 0 192 192" style="enable-background:new 0 0 192 192;" xml:space="preserve"><g id="Layer_7"><g><linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="89.0192" y1="122.732" x2="142.9808" y2="29.268"><stop offset="0" style="stop-color:#5500FF"></stop><stop offset="0.1715" style="stop-color:#4D09FF"></stop><stop offset="0.4511" style="stop-color:#3821FF"></stop><stop offset="0.802" style="stop-color:#1649FF"></stop><stop offset="1" style="stop-color:#0062FF"></stop></linearGradient><path class="st5" d="M120,16h-8c0,30.88-25.12,56-56,56v8c30.88,0,56,25.12,56,56h8c0-30.88,25.12-56,56-56v-8 C145.12,72,120,46.88,120,16z"></path><linearGradient id="SVGID_00000049207151058930698180000011839073544639225000_" gradientUnits="userSpaceOnUse" x1="35.4115" y1="168.7311" x2="68.5885" y2="111.267"><stop offset="0" style="stop-color:#5500FF"></stop><stop offset="0.1715" style="stop-color:#4D09FF"></stop><stop offset="0.4511" style="stop-color:#3821FF"></stop><stop offset="0.802" style="stop-color:#1649FF"></stop><stop offset="1" style="stop-color:#0062FF"></stop></linearGradient><path d="M56,104h-4c0,0,0,0,0,0c0,0,0,0,0,0h-4 c0,17.64-14.35,32-32,32v8c17.65,0,32,14.36,32,32h8c0-17.64,14.35-32,32-32v-8C70.35,136,56,121.64,56,104z"></path></g></g></svg>AI</p><ul class="mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/products/ai/agent-observability/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Agent Observability</a></li><li><a href="https://www.datadoghq.com/product/gpu-monitoring/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">GPU Monitoring</a></li><li><a href="https://www.datadoghq.com/product/platform/integrations/#cat-aiml" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">AI Integrations</a></li><li><a href="https://www.datadoghq.com/product/ai/bits-ai-agents/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Bits AI Agents</a></li><li><a href="https://www.datadoghq.com/product/ai/bits-chat/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Bits Chat</a></li><li><a href="https://www.datadoghq.com/product/ai/bits-agent-builder/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Bits Agent Builder</a></li><li><a href="https://www.datadoghq.com/product/ai/bits-code/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Bits Code</a></li><li><a href="https://www.datadoghq.com/product/ai/bits-investigation/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Bits Investigation</a></li><li><a href="https://www.datadoghq.com/product/ai/bits-security-analyst/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Bits Security Analyst</a></li><li><a href="https://www.datadoghq.com/product/ai/mcp-server/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">MCP Server</a></li><li><a href="https://www.datadoghq.com/product/ai/mcp-server/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Pup CLI</a></li><li><a href="https://www.datadoghq.com/product/ai/agent-directory/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Agent Directory</a></li></ul></li><li><p class="mobile-product-category sticky top-0 bg-white flex items-center gap-2 pt-[13px] pb-[5px] pl-[19px] font-bold font-national text-22 leading-24 ml-5"><svg class="w-[22px] h-auto" version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||
<title>dashboard</title>
|
||
<path d="M32 24.876v1.79h-32v-21.333h1.988v19.543h30.012zM26.009 10.679l3.976 12.432h-25.982v-8.006l6.999-7.981 8.987 7.981 6.020-4.426z"></path>
|
||
</svg>
|
||
Platform Capabilities</p><ul class="mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/product/ai/bits-ai-agents/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Bits AI Agents</a></li><li><a href="https://www.datadoghq.com/product/metrics/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Metrics</a></li><li><a href="https://www.datadoghq.com/product/platform/watchdog/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Watchdog</a></li><li><a href="https://www.datadoghq.com/product/platform/alerts/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Alerts</a></li><li><a href="https://www.datadoghq.com/product/platform/dashboards/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Dashboards</a></li><li><a href="https://docs.datadoghq.com/notebooks/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Notebooks</a></li><li><a href="https://docs.datadoghq.com/service_management/mobile/?tab=ios" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Mobile App</a></li><li><a href="https://www.datadoghq.com/product/fleet-automation/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Fleet Automation</a></li><li><a href="https://www.datadoghq.com/product/governance-console/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Governance Console</a></li><li><a href="https://docs.datadoghq.com/account_management/rbac/?tab=datadogapplication" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Access Control</a></li><li><a href="https://www.datadoghq.com/product/incident-response/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Incident Response</a></li><li><a href="https://www.datadoghq.com/product/case-management/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Case Management</a></li><li><a href="https://www.datadoghq.com/product/event-management/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Event Management</a></li><li><a href="https://www.datadoghq.com/product/workflow-automation/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Workflow Automation</a></li><li><a href="https://www.datadoghq.com/product/app-builder/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">App Builder</a></li><li><a href="https://www.datadoghq.com/product/cloudcraft/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Cloudcraft</a></li><li><a href="https://docs.datadoghq.com/account_management/teams/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Teams</a></li><li><a href="https://www.datadoghq.com/solutions/opentelemetry/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">OpenTelemetry</a></li><li><a href="https://www.datadoghq.com/product/platform/integrations/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Integrations</a></li><li><a href="https://www.datadoghq.com/product/platform/ides/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">IDE Plugins</a></li><li><a href="https://www.datadoghq.com/product/ai/mcp-server/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">MCP Server</a></li><li><a href="https://www.datadoghq.com/product/ai/mcp-server/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Pup CLI</a></li><li><a href="https://www.datadoghq.com/product/ai/agent-directory/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Agent Directory</a></li><li><a href="https://docs.datadoghq.com/api/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">API</a></li><li><a href="https://www.datadoghq.com/marketplacepartners/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">Marketplace</a></li><li><a href="https://www.datadoghq.com/product/platform/dora-metrics/" class="block pt-[9px] pb-2 pl-[70px] hover:text-[#632ca6]">DORA Metrics</a></li></ul></li></ul></li><li class="border-b border-b-[#c7c7c7] text-18"><a href="https://www.datadoghq.com/customers/" class="block font-semibold font-national uppercase text-[#555] hover:text-[#632ca6]"><div class="nav-menu-item ml-5 py-3 pl-[14px]">Customers</div></a></li><li class="border-b border-b-[#c7c7c7] text-18"><a href="https://www.datadoghq.com/pricing/" class="block font-semibold font-national uppercase text-[#555] hover:text-[#632ca6]"><div class="nav-menu-item ml-5 py-3 pl-[14px]">Pricing</div></a></li><li x-on:click="dropdownOpen === 'solutions' ? dropdownOpen = 'none' : dropdownOpen = 'solutions'" class="border-b border-b-[#c7c7c7] text-18 dropdown"><a href="#" data-astro-reload="" :class="dropdownOpen === 'solutions' ? 'text-[#632ca6]' : 'text-[#555]'" class="dropdown-toggle block font-semibold font-national uppercase text-[#555] hover:text-[#632ca6] whitespace-nowrap" data-bs-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="true" data-dd-action-name="Solutions Dropdown on Mobile"><div class="nav-menu-item ml-5 py-3 pl-[14px]">Solutions
|
||
<span class="caret absolute right-[22px] inline-flex h-[25px]"><svg viewBox="0 0 17.78 10.51" width="18px" class="inline-block transition-all" :class="dropdownOpen === 'solutions' ? 'rotate-180' : 'rotate-0'">
|
||
<polyline class="dropdown-arrow fill-none stroke-[#555]" style="stroke-width: 2px;" points="16.92 1.14 8.92 9.14 0.92 1.14"></polyline>
|
||
</svg></span></div></a><ul x-cloak="" x-show="dropdownOpen === 'solutions'" class="dropdown-menu mb-[5px] pb-2.5" id="solutions-mobile-menu"><p class="pl-15 py-2.5 font-semibold font-national text-16 leading-18 uppercase sticky top-0 bg-white">Industry</p><li><a href="https://www.datadoghq.com/solutions/financial-services/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Financial Services</div></a></li><li><a href="https://www.datadoghq.com/solutions/manufacturing-logistics/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Manufacturing & Logistics</div></a></li><li><a href="https://www.datadoghq.com/solutions/healthcare/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Healthcare/Life Sciences</div></a></li><li><a href="https://www.datadoghq.com/solutions/retail-ecommerce/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Retail/E-Commerce</div></a></li><li><a href="https://www.datadoghq.com/solutions/government/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Government</div></a></li><li><a href="https://www.datadoghq.com/solutions/education/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Education</div></a></li><li><a href="https://www.datadoghq.com/solutions/media-entertainment/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Media & Entertainment</div></a></li><li><a href="https://www.datadoghq.com/solutions/technology/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Technology</div></a></li><li><a href="https://www.datadoghq.com/solutions/gaming/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Gaming</div></a></li><p class="pl-15 py-2.5 font-semibold font-national text-16 leading-18 uppercase sticky top-0 bg-white mt-3">Technology</p><li><a href="https://www.datadoghq.com/solutions/aws/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Amazon Web Services Monitoring</div></a></li><li><a href="https://www.datadoghq.com/solutions/azure/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Azure Monitoring</div></a></li><li><a href="https://www.datadoghq.com/solutions/googlecloud/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Google Cloud Monitoring</div></a></li><li><a href="https://www.datadoghq.com/solutions/oci-monitoring/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Oracle Cloud Monitoring</div></a></li><li><a href="https://www.datadoghq.com/solutions/kubernetes/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Kubernetes Monitoring</div></a></li><li><a href="https://www.datadoghq.com/solutions/openshift/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Red Hat OpenShift</div></a></li><li><a href="https://www.datadoghq.com/solutions/pivotal-platform/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Pivotal Platform</div></a></li><li><a href="https://www.datadoghq.com/solutions/openai/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">OpenAI</div></a></li><li><a href="https://www.datadoghq.com/solutions/sap-monitoring/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">SAP Monitoring</div></a></li><li><a href="https://www.datadoghq.com/solutions/opentelemetry/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">OpenTelemetry</div></a></li><p class="pl-15 py-2.5 font-semibold font-national text-16 leading-18 uppercase sticky top-0 bg-white mt-3">Use Case</p><li><a href="https://www.datadoghq.com/solutions/application-security/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Application Security</div></a></li><li><a href="https://www.datadoghq.com/solutions/cloud-migration/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Cloud Migration</div></a></li><li><a href="https://www.datadoghq.com/solutions/monitoring-consolidation/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Monitoring Consolidation</div></a></li><li><a href="https://www.datadoghq.com/solutions/unified-commerce-monitoring/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Unified Commerce Monitoring</div></a></li><li><a href="https://www.datadoghq.com/solutions/soar/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">SOAR</div></a></li><li><a href="https://www.datadoghq.com/solutions/devops/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">DevOps</div></a></li><li><a href="https://www.datadoghq.com/solutions/finops/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">FinOps</div></a></li><li><a href="https://www.datadoghq.com/solutions/shift-left-testing/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Shift-Left Testing</div></a></li><li><a href="https://www.datadoghq.com/solutions/digital-experience-monitoring/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Digital Experience Monitoring</div></a></li><li><a href="https://www.datadoghq.com/solutions/security-analytics/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Security Analytics</div></a></li><li><a href="https://www.datadoghq.com/solutions/security/cis-benchmarks/aws/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Compliance for CIS Benchmarks</div></a></li><li><a href="https://www.datadoghq.com/solutions/hybrid-cloud-monitoring/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Hybrid Cloud Monitoring</div></a></li><li><a href="https://www.datadoghq.com/solutions/iot-monitoring/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Edge Device Monitoring</div></a></li><li><a href="https://www.datadoghq.com/solutions/real-time-business-intelligence/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Real-Time BI</div></a></li><li><a href="https://www.datadoghq.com/solutions/on-premises-monitoring/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">On-Premises Monitoring</div></a></li><li><a href="https://www.datadoghq.com/solutions/log-analysis-and-correlation/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Log Analysis & Correlation</div></a></li><li><a href="https://www.datadoghq.com/solutions/cnapp/"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">CNAPP</div></a></li></ul></li><li x-on:click="dropdownOpen === 'about' ? dropdownOpen = 'none' : dropdownOpen = 'about'" class="border-b border-b-[#c7c7c7] text-18 dropdown"><a href="#" data-astro-reload="" :class="dropdownOpen === 'about' ? 'text-[#632ca6]' : 'text-[#555]'" class="dropdown-toggle block font-semibold font-national uppercase text-[#555] hover:text-[#632ca6] whitespace-nowrap" data-bs-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="true" data-dd-action-name="About Dropdown on Mobile"><div class="nav-menu-item ml-5 py-3 pl-[14px]">About
|
||
<span class="caret absolute right-[22px] inline-flex h-[25px]"><svg viewBox="0 0 17.78 10.51" width="18px" class="inline-block transition-all" :class="dropdownOpen === 'about' ? 'rotate-180' : 'rotate-0'">
|
||
<polyline class="dropdown-arrow fill-none stroke-[#555]" style="stroke-width: 2px;" points="16.92 1.14 8.92 9.14 0.92 1.14"></polyline>
|
||
</svg></span></div></a><ul x-cloak="" x-show="dropdownOpen === 'about'" class="dropdown-menu mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/about/contact/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Contact</div></a></li><li><a href="https://www.datadoghq.com/partner/network/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Partners</div></a></li><li><a href="https://www.datadoghq.com/about/latest-news/press-releases/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Newsroom</div></a></li><li><a href="https://www.datadoghq.com/events-webinars/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Events & Webinars</div></a></li><li><a href="https://www.datadoghq.com/about/leadership/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Leadership</div></a></li><li><a href="https://careers.datadoghq.com/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Careers</div></a></li><li><a href="https://www.datadoghq.com/about/analyst/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Analyst Reports</div></a></li><li><a href="https://investors.datadoghq.com/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Investor Relations</div></a></li><li><a href="https://www.datadoghq.com/esg-report/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">ESG Report</div></a></li><li><a href="https://www.datadoghq.com/trust/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Trust Hub</div></a></li></ul></li><li x-on:click="dropdownOpen === 'blog' ? dropdownOpen = 'none' : dropdownOpen = 'blog'" class="border-b border-b-[#c7c7c7] text-18 dropdown"><a href="#" data-astro-reload="" :class="dropdownOpen === 'blog' ? 'text-[#632ca6]' : 'text-[#555]'" class="dropdown-toggle block font-semibold font-national uppercase text-[#555] hover:text-[#632ca6] whitespace-nowrap" data-bs-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="true" data-dd-action-name="Blog Dropdown on Mobile"><div class="nav-menu-item ml-5 py-3 pl-[14px]">Blog
|
||
<span class="caret absolute right-[22px] inline-flex h-[25px]"><svg viewBox="0 0 17.78 10.51" width="18px" class="inline-block transition-all" :class="dropdownOpen === 'blog' ? 'rotate-180' : 'rotate-0'">
|
||
<polyline class="dropdown-arrow fill-none stroke-[#555]" style="stroke-width: 2px;" points="16.92 1.14 8.92 9.14 0.92 1.14"></polyline>
|
||
</svg></span></div></a><ul x-cloak="" x-show="dropdownOpen === 'blog'" class="dropdown-menu mb-[5px] pb-2.5"><li><a href="https://www.datadoghq.com/blog/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">The Monitor</div></a></li><li><a href="https://www.datadoghq.com/blog/engineering/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Engineering</div></a></li><li><a href="https://www.datadoghq.com/blog/ai/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">AI</div></a></li><li><a href="https://securitylabs.datadoghq.com/" class="block"><div class="nav-menu-item-children block pt-[9px] pb-2 pl-15 hover:text-[#632ca6]">Security Labs</div></a></li></ul></li><li class="border-b border-b-[#c7c7c7] text-18 final"><a href="https://docs.datadoghq.com/" class="block font-semibold font-national uppercase text-[#555] hover:text-[#632ca6]" aria-label="Docs link"><div class="nav-menu-item ml-5 py-3 pl-[14px]">Docs</div></a></li><li class="border-b border-b-[#c7c7c7] text-18 final"><a href="https://app.datadoghq.com/" class="block font-semibold font-national uppercase text-[#555] hover:text-[#632ca6]" aria-label="Login link"><div class="nav-menu-item ml-5 py-3 pl-[14px]">Login</div></a></li><li class="flex justify-center text-center final"><a href="https://www.datadoghq.com/" class="block font-semibold font-national uppercase btn btn-default btn-info btn-outline outline knockout-around sign-up sign-up sign-up-trigger rounded text-white border-0 w-[89%] mt-5 bg-[transparent] hover:bg-opacity-70 px-5 pt-[11px] pb-3" data-event-category="Signup" data-event-action="Step 1 Top Right Initiated" data-event-label=" {{url path}}" aria-label="Get Started link" style="position:relative"><div class="nav-menu-item py-[5px] pl-0">Get Started</div></a></li></ul><style>.knockout-around:before{top:-1px;left:-1px;right:-1px;bottom:-1px;border-radius:5px;background-image:-webkit-gradient(linear,left top,right top,from(#3023ae),to(#c024b6));background-image:linear-gradient(to right,#3023ae,#c024b6);z-index:-2;content:'';position:absolute}.knockout-around:after{top:0;left:0;bottom:0;right:0;border-radius:3px;z-index:-1;content:'';position:absolute}</style></div><style>.btn-gradient:before{content:'';position:absolute;top:-1px;left:-1px;right:-1px;bottom:-1px;border-radius:5px;background-image:-webkit-gradient(linear,left top,right top,from(#3023ae),to(#c024b6));background-image:linear-gradient(to right,#3023ae,#c024b6);z-index:-2}.btn-gradient:hover{background:linear-gradient(45deg,#c024b6 0%,#3023ae 100%)}.main-nav-scrolled .btn-gradient{background:linear-gradient(45deg,#3023ae 0%,#c024b6 100%);color:#fff}</style></div></body></html></div> <dialog id="signUpModal" class="container my-auto border-0 bg-transparent flex w-full justify-center backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-c75odnku> <div class="relative w-full h-auto overflow-y-auto bg-white rounded-8 overflow-hidden max-w-[542px]" data-astro-cid-c75odnku> <div class="flex items-center py-3 px-5" data-astro-cid-c75odnku> <h3 class="h3 font-normal w-full text-center text-purple-600" data-astro-cid-c75odnku>Get Started with Datadog</h3> <button id="signUpModal-close" class=" transition-default group flex cursor-pointer justify-center items-center w-max" title="Close modal" data-dd-action-name="dialog: button: close" aria-label="Close modal" data-astro-cid-kc6kmszz><span class="sr-only" data-astro-cid-kc6kmszz>Close modal</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" fill xmlns="http://www.w3.org/2000/svg" data-astro-cid-kc6kmszz="true" class="transition-default h-5 w-auto fill-black order-2">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> <iframe title="DD Signup" width="500px" height="auto" frameborder="0" loading="lazy" class="js-signup-frame h-[815px] w-full max-w-[542px]" style="border: none;" sandbox="allow-scripts allow-forms allow-same-origin allow-top-navigation"></iframe> </div> </dialog> <main class="mt-[90px] desktop-sm:mt-[160px]"> <header class="container desktop:py-15 tablet:py-12 py-9"><div class="flex tablet:flex-row flex-col flex-nowrap justify-between desktop:gap-x-10 tablet:gap-6 tablet:gap-y-0 gap-y-9 tablet:grid tablet:grid-cols-12"><div class="flex flex-col flex-nowrap tablet:col-span-9 desktop-lg:col-span-10"><a href="/blog/engineering/" aria-label="Go to Engineering page" class="eyebrow-h1 bg-gradient-to-r hover:text-purple-600 from-purple-600 from-0% to-cyan-400 to-100% text-transparent bg-clip-text block w-max">Engineering</a><div class="mb-2 tablet:mb-3 desktop:mb-4"></div><h1 class="h1">Husky: Exactly-once ingestion and multi-tenancy at scale</h1><div class="desktop:mb-9 tablet:mb-7 mb-5"></div><div class="flex flex-wrap gap-2"><a title="storage" aria-label="storage" data-value="storage" href="/blog/search/?tag=storage" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
hover:text-white bg-grey-200 shadow-100 hover:bg-black active:bg-black rounded py-1 px-2 w-max button-roboto-mono"><span class="block false">storage</span></a></div></div><div id="listen-rail-column" class="tablet:col-span-3 desktop-lg:col-span-2"><div class="flex flex-col border-t border-t-grey-400 pt-1 tablet:pt-1.5 desktop:pt-2"><!-- Published --><div class="flex flex-row justify-between items-center"><p class="p-roboto-mono-small text-grey-700 uppercase">Published</p><time class="p-small font-bold font-national" datetime="2023-02-22"> Feb 22, 2023 </time></div><div class="flex flex-row justify-between items-center border-t border-t-grey-400 pt-1 tablet:pt-1.5 desktop:pt-2 mt-1 tablet:mt-1.5 desktop:mt-2"><p class="p-roboto-mono-small text-grey-700 uppercase">Read time</p><p class="p-small font-bold font-national lining-nums">21m</p></div></div></div></div><div class="desktop:mb-12 tablet:mb-9 mb-7"></div><div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=677&height=344&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=677&height=344&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=677&height=344&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=677&height=344&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=677&height=344&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=677&height=344&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=677&height=344&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=934&height=474&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=934&height=474&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=934&height=474&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=934&height=474&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=934&height=474&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=934&height=474&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=934&height=474&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=1400&height=711&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=1400&height=711&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=1400&height=711&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=1400&height=711&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=1400&height=711&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=1400&height=711&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=1400&height=711&dpr=4 4x"><img loading="eager" fetchpriority="high" class="h-auto rounded tablet:rounded-md desktop:rounded-lg w-full aspect-[380/193] object-cover" id="1776351541-husky-deep-dive-husky-deep-dive" src="https://web-assets.dd-static.net/42588/1776351541-husky-deep-dive-husky-deep-dive.png?format=auto&fit=crop&quality=75&disable=upscale&width=1400&height=711&dpr=1" alt="Husky: Exactly-once ingestion and multi-tenancy at scale" title="Husky: Exactly-once ingestion and multi-tenancy at scale" width="1400" height="711"></picture><script type="module">window.matchMedia("(prefers-reduced-motion: reduce)").matches&&document.querySelectorAll("video").forEach(e=>{e.autoplay=!1,e.controls=!0});</script> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> </div></header><div class="container desktop-sm:grid desktop-sm:grid-cols-12 desktop-sm:gap-10"><!-- Main Content — first in DOM so it streams before the sidebar --><section class="article-content desktop-sm:col-span-9 desktop-sm:col-start-4 desktop-sm:grid desktop-sm:grid-cols-9 desktop-sm:h-fit desktop:text-20 desktop:leading-28 tablet:text-18 tablet:leading-26"><div class="desktop-sm:col-span-6 grid grid-cols-1 mobile-lg:grid-cols-2 desktop-sm:gap-x-10 tablet:gap-x-6 tablet:gap-y-4 gap-y-2"><div class="flex tablet:h-12 gap-4 items-center"><div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=4 4x"><img loading="eager" fetchpriority="high" class="h-auto rounded-full w-12 h-12" id="1776351537-danielintskirveli" src="https://web-assets.dd-static.net/42588/1776351537-danielintskirveli.jpeg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=1" alt="Daniel Intskirveli" title="Daniel Intskirveli" width="48" height></picture> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> </div><div class="flex flex-col"><p class="p-small font-bold font-national">Daniel Intskirveli</p></div></div><div class="flex tablet:h-12 gap-4 items-center"><div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=4 4x"><img loading="eager" fetchpriority="high" class="h-auto rounded-full w-12 h-12" id="1776351257-ceciliawatt" src="https://web-assets.dd-static.net/42588/1776351257-ceciliawatt.jpg?format=auto&fit=bounds&quality=75&disable=upscale&width=48&dpr=1" alt="Cecilia Watt" title="Cecilia Watt" width="48" height></picture> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> </div><div class="flex flex-col"><p class="p-small font-bold font-national">Cecilia Watt</p></div></div></div><div class="desktop-sm:col-span-full desktop-sm:mb-9 tablet:mb-7 mb-5"></div><div class="tablet:col-span-full tablet:grid tablet:grid-cols-12 tablet:gap-x-6 desktop-sm:grid-cols-9 desktop-sm:gap-x-10 markdown-content [&>*:not(.content-image-wrapper)]:tablet:col-span-12 [&>*:not(.content-image-wrapper)]:desktop-sm:col-span-7 [&>.interactive-diagram-component]:tablet:col-span-12 [&>.interactive-diagram-component]:desktop-sm:col-span-8 [&>form-wrapper]:tablet:col-span-12 [&>form-wrapper]:desktop-sm:col-span-8 [&>.expressive-code]:tablet:col-span-12 [&>.expressive-code]:desktop-sm:col-span-8 [&>.table-component]:tablet:col-span-12 [&>.table-component]:desktop-sm:col-span-8 [&>.dato-code-block-wrapper]:tablet:col-span-12 [&>.dato-code-block-wrapper]:desktop-sm:col-span-8 [&>.dast-content]:col-span-full"><div class="dast-content tablet:grid tablet:grid-cols-subgrid [&>*:not(.content-image-wrapper)]:tablet:col-span-12 [&>*:not(.content-image-wrapper)]:desktop-sm:col-span-7 [&>.dato-code-block-wrapper]:desktop-sm:col-span-8 [&>.table-component]:desktop-sm:col-span-8 [&>.iframe-block-wrapper]:desktop-sm:col-span-8" data-astro-cid-twmmywjp> <p>We introduced Husky in a previous blog post (<a href="https://www.datadoghq.com/blog/engineering/introducing-husky/">Introducing Husky, Datadog’s Third-Generation Event Store</a>) as Datadog’s third-generation event store. To recap, Husky is a distributed, time-series oriented, columnar store optimized for streaming ingestion and hybrid analytical and search queries. Husky’s architecture decouples storage and compute so that they can be scaled independently:</p>
|
||
<div class="content-image-wrapper tablet:col-span-12 desktop-sm:col-span-8"> <div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=4 4x"><img loading="lazy" class="h-auto max-w-full tablet:cursor-zoom-in" id="open-popup--1776351549-husky-deep-dive-arch4" src="https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Architecture diagram of Husky." title="Architecture diagram of Husky." width="3530" height="3015"></picture> <figcaption class="mt-4 px-15 p-small italic text-grey-600">Datadog’s third-gen storage system, Husky. Expand to view full detail.</figcaption> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> <dialog-wrapper data-id="dialog-popup--1776351549-husky-deep-dive-arch4" data-trigger-id="open-popup--1776351549-husky-deep-dive-arch4" data-disable-mobile-popup="true" data-astro-cid-d4yttbaw="true"> <dialog id="dialog-popup--1776351549-husky-deep-dive-arch4" class="container h-full content-center bg-transparent backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-d4yttbaw> <span class="relative mx-auto [&>*:first-child]:bg-white block tablet:p-9 desktop-sm:p-12 rounded-3xl bg-white max-h-[calc(100vh-6rem)] overflow-y-auto" data-astro-cid-d4yttbaw> <figure class="content-image-component overflow-scroll max-h-[calc(100vh-12rem)]"> <img loading="lazy" class="w-full h-auto" srcset="https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=4 4x" src="https://web-assets.dd-static.net/42588/1776351549-husky-deep-dive-arch4.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Architecture diagram of Husky." width="1026"> <figcaption class="mt-4 px-9 p-small italic text-grey-600">Datadog’s third-gen storage system, Husky. Expand to view full detail.</figcaption> </figure> <div class="desktop-sm:p-6 absolute top-0 right-0 z-10 p-3" data-astro-cid-d4yttbaw> <button title="Close dialog" aria-label="Close dialog" data-dd-action-name="dialog: icon: close dialog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close dialog</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> </span> </dialog> </dialog-wrapper> <script type="module">class c extends HTMLElement{constructor(){super();const s=this.dataset.id,r=this.dataset.triggerId,e=document.getElementById(s),n=e?.querySelector("button"),o=document.getElementById(r),d=document.querySelector("body");if(!e||!n||!o)return;e.addEventListener("close",()=>{d.style.overflow=""}),e.addEventListener("click",t=>{const i=e.firstElementChild?.getBoundingClientRect()||e.getBoundingClientRect();(t.clientX<i.left||t.clientX>i.right||t.clientY<i.top||t.clientY>i.bottom)&&e.close()}),n.addEventListener("click",()=>{e.close()});let l=this.dataset.disableMobilePopup==="true"&&window.innerWidth<1025;window.addEventListener("resize",()=>{l=this.dataset.disableMobilePopup==="true"&&window.innerWidth<1025}),o.addEventListener("click",()=>{l||(e.showModal(),d.style.overflow="hidden")})}}customElements.define("dialog-wrapper",c);</script> </div> </div>
|
||
<p>Due to the nature of Datadog’s product, Husky’s storage engine is almost completely optimized around serving large scan and aggregation queries. While it can perform point lookups and run needle-in-the-haystack search queries, it’s not designed to perform point lookups at high volume and with low latency. This design posed a challenge on the ingestion side: how can we guarantee that data is ingested into Husky exactly once, ensuring that there are never duplicate events? At the same time, Datadog is a massive-scale, multi-tenant platform. Our solution would have to work with our existing multi-tenant ingestion pipelines while keeping ingestion latency reasonable and without blowing up costs. It turns out that these challenges are more related than they first appear. In this post, we describe how we overcome these problems to create auto-scaling, multi-tenant data ingestion pipelines that guarantee exactly once ingestion of every event into Husky’s storage engine.</p>
|
||
<h2 id="routing-to-storage-shards"><a href="#routing-to-storage-shards">Routing to storage shards</a></h2>
|
||
<p>As we described in our previous blog post, when we migrated from our first- to second-generation storage system, we did away with clustering—we replaced large, clustered deployments of a search system with many individual and isolated single-node containers. An important aspect of this migration was minimizing the number of unique tenants and indexes that an individual storage node was exposed to.</p>
|
||
<p>We accomplished this with the help of an upstream router service called Shard Router, which introduces a concept of <strong>locality</strong> into our Kafka pipelines. We introduce locality by deterministically mapping events to groups of partitions we call shards by their ID and timestamp. Without locality, events would be routed randomly.</p>
|
||
<div class="content-image-wrapper tablet:col-span-12 desktop-sm:col-span-8"> <div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=4 4x"><img loading="lazy" class="h-auto max-w-full tablet:cursor-zoom-in" id="open-popup--1776351553-husky-deep-dive-blog_husky_2_230130_1_update" src="https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of how routed events flow to Husky. On the left most side are Shard Routers from which many colored lines flow into a Kafka Topic box with partitions and shards. Sorted colored lines then flow into Event Store Writer Workers on the right." title="Diagram of how routed events flow to Husky. On the left most side are Shard Routers from which many colored lines flow into a Kafka Topic box with partitions and shards. Sorted colored lines then flow into Event Store Writer Workers on the right." width="3388" height="2230"></picture> <figcaption class="mt-4 px-15 p-small italic text-grey-600">Today, Shard Router publishes traffic to specific partitions corresponding to a shard placement allocated for some tenant data stream. Pictured here is an overview of how routed events flow to Husky’s event store Writer workers.</figcaption> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> <dialog-wrapper data-id="dialog-popup--1776351553-husky-deep-dive-blog_husky_2_230130_1_update" data-trigger-id="open-popup--1776351553-husky-deep-dive-blog_husky_2_230130_1_update" data-disable-mobile-popup="true" data-astro-cid-d4yttbaw="true"> <dialog id="dialog-popup--1776351553-husky-deep-dive-blog_husky_2_230130_1_update" class="container h-full content-center bg-transparent backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-d4yttbaw> <span class="relative mx-auto [&>*:first-child]:bg-white block tablet:p-9 desktop-sm:p-12 rounded-3xl bg-white max-h-[calc(100vh-6rem)] overflow-y-auto" data-astro-cid-d4yttbaw> <figure class="content-image-component overflow-scroll max-h-[calc(100vh-12rem)]"> <img loading="lazy" class="w-full h-auto" srcset="https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=4 4x" src="https://web-assets.dd-static.net/42588/1776351553-husky-deep-dive-blog_husky_2_230130_1_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of how routed events flow to Husky. On the left most side are Shard Routers from which many colored lines flow into a Kafka Topic box with partitions and shards. Sorted colored lines then flow into Event Store Writer Workers on the right." width="1026"> <figcaption class="mt-4 px-9 p-small italic text-grey-600">Today, Shard Router publishes traffic to specific partitions corresponding to a shard placement allocated for some tenant data stream. Pictured here is an overview of how routed events flow to Husky’s event store Writer workers.</figcaption> </figure> <div class="desktop-sm:p-6 absolute top-0 right-0 z-10 p-3" data-astro-cid-d4yttbaw> <button title="Close dialog" aria-label="Close dialog" data-dd-action-name="dialog: icon: close dialog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close dialog</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> </span> </dialog> </dialog-wrapper> </div> </div>
|
||
<p>Shard router splits the incoming stream of events into shards for each tenant<sup class="footnote-ref"><a href="#fn-1" id="fnref-1">1</a></sup>. In many routing systems, individual tenants are mapped to a specific shard. By contrast, in our setup, we allocate a list of shards to each tenant, and then deterministically choose a shard from that list for each of a tenant’s events. Essentially: we try to partition each tenant onto a minimum number of shards required, while still trying to keep each shard load-balanced. Downstream workers consume events from one or more shards, and are responsible for exactly-once ingestion into Husky’s storage engine<sup class="footnote-ref"><a href="#fn-2" id="fnref-2">2</a></sup>.</p>
|
||
<p>Locality benefits us in a number of ways:</p>
|
||
<ul><li><p><strong>Ease of deduplication</strong>. Events are routed to shards deterministically. Specifically, an event with a given timestamp and ID is <em>always</em> routed to the exact same shard, regardless of when or how often it is ingested. This means that we only need to perform deduplication within a shard. (Additionally, each worker has a smaller set of event IDs than it would otherwise—since these IDs can fit in memory, we can more efficiently perform deduplication.)</p></li><li><p><strong>Lower storage costs and better performance</strong>. Each shard receives traffic for a (relatively) small subset of tenants. This is important because our storage systems isolate—down to the file level— tenants from each other, using logical namespaces that have non-trivial overhead. Thus, limiting the cardinality of the set of tenants concurrently processed by a worker results in large cost and performance improvements. For example, Husky isolates each tenant’s data into a dedicated table, and we never mix data from different tables in the same file. As a result of this, there is an almost-linear relationship between the number of tenants processed by a Husky Writer node and the number of output files uploaded to blob storage. Since we pay for every file created, having more files leads to increased costs—and introduces more work for the Husky Compactor service.</p></li></ul>
|
||
<p>Of course, introducing deterministic data locality into our Kafka topics wasn’t easy. We needed to ensure that a given event ID would always be routed to the same shard, while still accommodating the unpredictable nature of our customer workloads.</p>
|
||
<p>A few of the most challenging problems we had to grapple with were:</p>
|
||
<ul><li><p><strong>Handling assignment changes</strong>. The set of shards that a tenant’s events are routed to may need to change over time—often due to changes in the tenant’s volume of traffic, or changes in the total number of shards available. It’s common for individual tenants to suddenly increase their volume (temporarily or persistently) by one to two orders of magnitude in a short period of time. The set of shards can be changed as a result of a scaling action (adding more shards for a tenant) or a rebalancing action (use different shards for a tenant to balance traffic better).</p></li><li><p><strong>Consensus between distributed Shard Router nodes</strong>. Specifically, every Shard Router node must always make the same decision about which shard to route a given event to, or we risk introducing duplicate data into the system.</p></li><li><p><strong>Load balancing</strong>. Each shard should receive a roughly-equal slice of input traffic, so that the ingestion nodes are load balanced.</p></li></ul>
|
||
<h3 id="handling-assignment-changes-with-time-bounded-shard-placements"><a href="#handling-assignment-changes-with-time-bounded-shard-placements">Handling assignment changes with time-bounded Shard Placements</a></h3>
|
||
<p>Given a list of shards and a unique event ID, we can easily come up with a scheme to deterministically map that ID to a particular shard in a cheap and stateless manner:</p>
|
||
<div class="dato-code-block-wrapper" data-astro-cid-twmmywjp> <div class="expressive-code"><link rel="stylesheet" href="/blog/_astro/ec.cd55k.css"><script type="module" src="/blog/_astro/ec.0vx5m.js"></script><figure class="frame"><figcaption class="header"></figcaption><pre data-language="text"><code><div class="ec-line"><div class="gutter"><div class="ln" aria-hidden="true">1</div></div><div class="code"><span style="--0:#000000">S = shards[hash(event_id) % num_shards]</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="S = shards[hash(event_id) % num_shards]"><div></div></button></div></figure></div> </div>
|
||
<p>As long as each Shard Router knows the set of shards assigned for each tenant, it’s fairly easy to implement consistent and deterministic routing. However, we mentioned earlier how the set of shards that a tenant is assigned to could change over time—because the tenant started emitting ten times as much data, for example. The simple modulo-based algorithm above would break our deterministic routing every time there is a change to the number of shards assigned to a given tenant.</p>
|
||
<p>For this reason, we introduce the concept of <strong>time-bounded Shard Placements</strong>. When we assign a tenant to a set of shards, we make sure that the assignment is only valid for a specific range of time: usually just a few minutes, which is enough to effectively react to environmental updates that might change the ideal set of shards for a tenant. To guarantee deterministic routing, Shard Placements are immutable once they are allocated.</p>
|
||
<div class="content-image-wrapper tablet:col-span-12 desktop-sm:col-span-8"> <div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=4 4x"><img loading="lazy" class="h-auto max-w-full tablet:cursor-zoom-in" id="open-popup--1776351557-husky-deep-dive-blog_husky_2_230130_2_update" src="https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of Shard Placements over time." title="Diagram of Shard Placements over time." width="3388" height="1436"></picture> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> <dialog-wrapper data-id="dialog-popup--1776351557-husky-deep-dive-blog_husky_2_230130_2_update" data-trigger-id="open-popup--1776351557-husky-deep-dive-blog_husky_2_230130_2_update" data-disable-mobile-popup="true" data-astro-cid-d4yttbaw="true"> <dialog id="dialog-popup--1776351557-husky-deep-dive-blog_husky_2_230130_2_update" class="container h-full content-center bg-transparent backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-d4yttbaw> <span class="relative mx-auto [&>*:first-child]:bg-white block tablet:p-9 desktop-sm:p-12 rounded-3xl bg-white max-h-[calc(100vh-6rem)] overflow-y-auto" data-astro-cid-d4yttbaw> <figure class="content-image-component overflow-scroll max-h-[calc(100vh-12rem)]"> <img loading="lazy" class="w-full h-auto" srcset="https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=4 4x" src="https://web-assets.dd-static.net/42588/1776351557-husky-deep-dive-blog_husky_2_230130_2_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of Shard Placements over time." width="1026"> </figure> <div class="desktop-sm:p-6 absolute top-0 right-0 z-10 p-3" data-astro-cid-d4yttbaw> <button title="Close dialog" aria-label="Close dialog" data-dd-action-name="dialog: icon: close dialog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close dialog</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> </span> </dialog> </dialog-wrapper> </div> </div>
|
||
<p>As long as each Shard Router has this history of Shard Placements, it can deterministically route events by first looking up a placement corresponding to an event’s timestamp, and then choosing a shard using the hash modulo approach we mentioned earlier. Each new placement can differ from the last, allowing us to vary the number of shards a tenant is assigned to over time.</p>
|
||
<h3 id="establishing-consensus-with-the-sharding-allocator"><a href="#establishing-consensus-with-the-sharding-allocator">Establishing consensus with the Sharding Allocator</a></h3>
|
||
<p>To ensure all Shard Router nodes have a consistent view of allocated Shard Placements, we use a central service called the <strong>Sharding Allocator</strong>. Sharding Allocator implements a simple interface that, given a tenant ID and a timestamp, fetches a placement. This service always returns a placement: if one doesn’t exist already, it is created. More importantly, Sharding Allocator also guarantees that it will always return the <em>exact same placement</em> for any given tuple of tenant ID and timestamp. To accomplish this, Sharding Allocator leverages FoundationDB’s strong transactional guarantees to check for the existence of a placement (and, if it doesn’t already exist, create it) in one atomic transaction.</p>
|
||
<div class="content-image-wrapper tablet:col-span-12 desktop-sm:col-span-8"> <div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=4 4x"><img loading="lazy" class="h-auto max-w-full tablet:cursor-zoom-in" id="open-popup--1776351562-husky-deep-dive-blog_husky_2_230130_3_update" src="https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram showing the Shard Router sending a GetPlacement message, and the Shard Allocator sending back a Placement message. The Shard Allocator then communicates with Foundation DB to automatically find the requested placement, or create a new one if one doesn’t exist." title="Diagram showing the Shard Router sending a GetPlacement message, and the Shard Allocator sending back a Placement message. The Shard Allocator then communicates with Foundation DB to automatically find the requested placement, or create a new one if one doesn’t exist." width="3388" height="910"></picture> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> <dialog-wrapper data-id="dialog-popup--1776351562-husky-deep-dive-blog_husky_2_230130_3_update" data-trigger-id="open-popup--1776351562-husky-deep-dive-blog_husky_2_230130_3_update" data-disable-mobile-popup="true" data-astro-cid-d4yttbaw="true"> <dialog id="dialog-popup--1776351562-husky-deep-dive-blog_husky_2_230130_3_update" class="container h-full content-center bg-transparent backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-d4yttbaw> <span class="relative mx-auto [&>*:first-child]:bg-white block tablet:p-9 desktop-sm:p-12 rounded-3xl bg-white max-h-[calc(100vh-6rem)] overflow-y-auto" data-astro-cid-d4yttbaw> <figure class="content-image-component overflow-scroll max-h-[calc(100vh-12rem)]"> <img loading="lazy" class="w-full h-auto" srcset="https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=4 4x" src="https://web-assets.dd-static.net/42588/1776351562-husky-deep-dive-blog_husky_2_230130_3_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram showing the Shard Router sending a GetPlacement message, and the Shard Allocator sending back a Placement message. The Shard Allocator then communicates with Foundation DB to automatically find the requested placement, or create a new one if one doesn’t exist." width="1026"> </figure> <div class="desktop-sm:p-6 absolute top-0 right-0 z-10 p-3" data-astro-cid-d4yttbaw> <button title="Close dialog" aria-label="Close dialog" data-dd-action-name="dialog: icon: close dialog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close dialog</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> </span> </dialog> </dialog-wrapper> </div> </div>
|
||
<p>To summarize, Shard Placements are:</p>
|
||
<ul><li><p>Created for fixed intervals of time.</p></li><li><p>Immutable and can never overlap.</p></li><li><p>Consistent. A given tuple of tenant ID and timestamp will always map to the same Shard placement.</p></li></ul>
|
||
<p>Sharding Allocator is critical to all data ingestion, so it must be highly available and performant, in addition to being strongly consistent. To satisfy these requirements, Sharding Allocator is itself sharded into multiple isolated deployments, each backed by its own dedicated FoundationDB cluster. We also leverage the fact that placement data is immutable and relatively small, so it can be cached in memory on the Shard Router node to reduce superfluous calls.</p>
|
||
<h3 id="choosing-a-number-of-shards-for-each-tenant"><a href="#choosing-a-number-of-shards-for-each-tenant">Choosing a number of shards for each tenant</a></h3>
|
||
<p>How do we choose a number of shards to assign for a tenant’s traffic? The ideal number of shards for a placement depends on the volume of traffic from a particular tenant’s data stream.</p>
|
||
<p>So, if we knew the traffic patterns of each tenant in real time, we could make adjustments to a tenant’s shard counts in response to changes in traffic volume.</p>
|
||
<p>As Shard Router does its work of routing messages to the right downstream shards (groups of partitions), it also continuously publishes throughput data (in the form of Datadog metrics) for each tenant—and if metrics are unavailable, we can keep running by referencing the existing shard count. In our experience, the total number of bytes ingested is a much better predictor of ingestion cost than the number of events, as events can vary dramatically in size. Hence, the “cost” metric that we publish is based primarily on the total number of bytes emitted by the tenant.</p>
|
||
<p>The aptly-named Autosharder service periodically fetches those metrics and adjusts configured shard counts on a tenant-by-tenant basis to better fit observed traffic volume. An updated shard count takes effect when the next Shard Placement is allocated. The shard count for each tenant is stored alongside other tenant metadata that is needed on the write path.</p>
|
||
<div class="content-image-wrapper tablet:col-span-12 desktop-sm:col-span-8"> <div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=4 4x"><img loading="lazy" class="h-auto max-w-full tablet:cursor-zoom-in" id="open-popup--1776351566-husky-deep-dive-chart1" src="https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Graph of configured shard count for a tenant vs traffic volume." title="Graph of configured shard count for a tenant vs traffic volume." width="1600" height="469"></picture> <figcaption class="mt-4 px-15 p-small italic text-grey-600">A graph of the configured shard count for a tenant vs. their traffic volume demonstrating an example of the Autosharder increasing the shard count in response to a burst in traffic. The purple line shows the tenants increasing their data volume, and the blue line shows the autosharder subsequently reacting to increase the tenant’s shard count. The Autosharder also down-shards, but this is done over a longer period of time.</figcaption> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> <dialog-wrapper data-id="dialog-popup--1776351566-husky-deep-dive-chart1" data-trigger-id="open-popup--1776351566-husky-deep-dive-chart1" data-disable-mobile-popup="true" data-astro-cid-d4yttbaw="true"> <dialog id="dialog-popup--1776351566-husky-deep-dive-chart1" class="container h-full content-center bg-transparent backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-d4yttbaw> <span class="relative mx-auto [&>*:first-child]:bg-white block tablet:p-9 desktop-sm:p-12 rounded-3xl bg-white max-h-[calc(100vh-6rem)] overflow-y-auto" data-astro-cid-d4yttbaw> <figure class="content-image-component overflow-scroll max-h-[calc(100vh-12rem)]"> <img loading="lazy" class="w-full h-auto" srcset="https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=4 4x" src="https://web-assets.dd-static.net/42588/1776351566-husky-deep-dive-chart1.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Graph of configured shard count for a tenant vs traffic volume." width="1026"> <figcaption class="mt-4 px-9 p-small italic text-grey-600">A graph of the configured shard count for a tenant vs. their traffic volume demonstrating an example of the Autosharder increasing the shard count in response to a burst in traffic. The purple line shows the tenants increasing their data volume, and the blue line shows the autosharder subsequently reacting to increase the tenant’s shard count. The Autosharder also down-shards, but this is done over a longer period of time.</figcaption> </figure> <div class="desktop-sm:p-6 absolute top-0 right-0 z-10 p-3" data-astro-cid-d4yttbaw> <button title="Close dialog" aria-label="Close dialog" data-dd-action-name="dialog: icon: close dialog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close dialog</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> </span> </dialog> </dialog-wrapper> </div> </div>
|
||
<h3 id="how-does-the-sharding-allocator-choose-shards"><a href="#how-does-the-sharding-allocator-choose-shards">How does the Sharding Allocator choose shards?</a></h3>
|
||
<p>Sharding Allocator’s job when creating a new placement is basically to choose <em>n</em> shards from <em>k</em> possible ones, where <em>n</em> is the tenant’s shard count (as decided by the Autosharder) and <em>k</em> is derived from the number of partitions in the topics currently being used.</p>
|
||
<p>Sharding Allocator has a few constraints that it must keep in mind:</p>
|
||
<ul><li><p>Sharding Allocator must be fast, reliable and have minimal dependencies.</p></li><li><p>We want to minimize shard changes between consecutive placements for the same tenant. For example, if the Shard Router asks for five shards for one interval and six for the next, the ideal placement would reuse the same five shards as the previous placement and add one shard. The same requirement applies when there are changes to the total number of shards – ideally, if we’ve chosen five shards from 100, we should later choose the same five shards when there are 101 shards to choose from.</p></li><li><p>It is sometimes useful to exclude shards. We should be able to skip shards that have been marked as excluded—for example to help a lagging consumer catch up.</p></li></ul>
|
||
<p>This sounds like a great application for a consistent hash function. Fortunately, a number of performant consistent hashing algorithms exist for this use-case. Using one might look something like this:</p>
|
||
<p><code>H(key, numBuckets) = bucket</code></p>
|
||
<p>We allocate Shard Placements by tenant, so our key is the tenant ID. Applying a hash function in the following way can give us the first of n shards.</p>
|
||
<p><code>H(tenant_id, totalShards) = tenantShard</code></p>
|
||
<p>To choose our <em>n</em> shards, we add the subsequent <em>n-1</em> shards, skipping the list of excluded shards, to get our final list of shards. The resulting placement should adhere to all of our previously described constraints:</p>
|
||
<ul><li><p>Changes in the total number of shards do not result in major changes for Shard Placements.</p></li><li><p>Changes in the tenant’s shard count do not result in major changes for Shard Placements.</p></li><li><p>When a shard is excluded, it only results in one relocated shard for placements that contain the newly excluded shard.</p></li></ul>
|
||
<div class="content-image-wrapper tablet:col-span-12 desktop-sm:col-span-8"> <div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=4 4x"><img loading="lazy" class="h-auto max-w-full tablet:cursor-zoom-in" id="open-popup--1776351570-husky-deep-dive-blog_husky_2_230412_4a" src="https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of getshards placements." title="Diagram of getshards placements." width="3388" height="1254"></picture> <figcaption class="mt-4 px-15 p-small italic text-grey-600">A few examples of how shards are placed in a ring using the hash of the tenant ID (and balancing salt) and a shard count.</figcaption> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> <dialog-wrapper data-id="dialog-popup--1776351570-husky-deep-dive-blog_husky_2_230412_4a" data-trigger-id="open-popup--1776351570-husky-deep-dive-blog_husky_2_230412_4a" data-disable-mobile-popup="true" data-astro-cid-d4yttbaw="true"> <dialog id="dialog-popup--1776351570-husky-deep-dive-blog_husky_2_230412_4a" class="container h-full content-center bg-transparent backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-d4yttbaw> <span class="relative mx-auto [&>*:first-child]:bg-white block tablet:p-9 desktop-sm:p-12 rounded-3xl bg-white max-h-[calc(100vh-6rem)] overflow-y-auto" data-astro-cid-d4yttbaw> <figure class="content-image-component overflow-scroll max-h-[calc(100vh-12rem)]"> <img loading="lazy" class="w-full h-auto" srcset="https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=4 4x" src="https://web-assets.dd-static.net/42588/1776351570-husky-deep-dive-blog_husky_2_230412_4a.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of getshards placements." width="1026"> <figcaption class="mt-4 px-9 p-small italic text-grey-600">A few examples of how shards are placed in a ring using the hash of the tenant ID (and balancing salt) and a shard count.</figcaption> </figure> <div class="desktop-sm:p-6 absolute top-0 right-0 z-10 p-3" data-astro-cid-d4yttbaw> <button title="Close dialog" aria-label="Close dialog" data-dd-action-name="dialog: icon: close dialog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close dialog</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> </span> </dialog> </dialog-wrapper> </div> </div>
|
||
<p><strong>1.a)</strong> Tenant “123”, with shard count 3, is hashed to an initial shard ID of 2. Since the shard count is 3, they are assigned shards 2, 3, and 4.</p>
|
||
<p><strong>1.b)</strong> Tenant “456” has the same initial shard ID as tenant “123”, but has a shard count of 4. Since the shard count is 4, the tenant is assigned shards 2, 3, 4, and 5.</p>
|
||
<p><strong>1.c)</strong> If the consecutive shards would go beyond the maximum number of shards (as defined by the topic partition count), they simply wrap around to the beginning. Here, tenant ’789’ with shard count 2 has an initial shard ID of 7. 7 is also the highest shard—so we wrap around, and the tenant is assigned shards 7 and 0.</p>
|
||
<div class="content-image-wrapper tablet:col-span-12 desktop-sm:col-span-8"> <div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=4 4x"><img loading="lazy" class="h-auto max-w-full tablet:cursor-zoom-in" id="open-popup--1776351574-husky-deep-dive-blog_husky_2_230412_4b" src="https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of getshards placements." title="Diagram of getshards placements." width="3388" height="1127"></picture> <figcaption class="mt-4 px-15 p-small italic text-grey-600">If we failover to a topic with more partitions (so we have more shards), our consistent hashing function ensures there are minimal changes in subsequent shard placements. Compare these examples (with a total shard count of 10) to the previous example, where the shard count is 8.</figcaption> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> <dialog-wrapper data-id="dialog-popup--1776351574-husky-deep-dive-blog_husky_2_230412_4b" data-trigger-id="open-popup--1776351574-husky-deep-dive-blog_husky_2_230412_4b" data-disable-mobile-popup="true" data-astro-cid-d4yttbaw="true"> <dialog id="dialog-popup--1776351574-husky-deep-dive-blog_husky_2_230412_4b" class="container h-full content-center bg-transparent backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-d4yttbaw> <span class="relative mx-auto [&>*:first-child]:bg-white block tablet:p-9 desktop-sm:p-12 rounded-3xl bg-white max-h-[calc(100vh-6rem)] overflow-y-auto" data-astro-cid-d4yttbaw> <figure class="content-image-component overflow-scroll max-h-[calc(100vh-12rem)]"> <img loading="lazy" class="w-full h-auto" srcset="https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=4 4x" src="https://web-assets.dd-static.net/42588/1776351574-husky-deep-dive-blog_husky_2_230412_4b.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of getshards placements." width="1026"> <figcaption class="mt-4 px-9 p-small italic text-grey-600">If we failover to a topic with more partitions (so we have more shards), our consistent hashing function ensures there are minimal changes in subsequent shard placements. Compare these examples (with a total shard count of 10) to the previous example, where the shard count is 8.</figcaption> </figure> <div class="desktop-sm:p-6 absolute top-0 right-0 z-10 p-3" data-astro-cid-d4yttbaw> <button title="Close dialog" aria-label="Close dialog" data-dd-action-name="dialog: icon: close dialog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close dialog</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> </span> </dialog> </dialog-wrapper> </div> </div>
|
||
<p><strong>2.a)</strong> and <strong>2.b)</strong> The assigned shards are identical, since the hashing function has ensured that the initial shard ID didn’t change, and the salts remained the same.</p>
|
||
<p><strong>2.c)</strong> Here, the assigned shards changes from <code>[7,0]</code> to <code>[7,8]</code> since we no longer need to wrap around to accomodate these shards.</p>
|
||
<div class="content-image-wrapper tablet:col-span-12 desktop-sm:col-span-8"> <div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=4 4x"><img loading="lazy" class="h-auto max-w-full tablet:cursor-zoom-in" id="open-popup--1776351578-husky-deep-dive-blog_husky_2_230412_4c" src="https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of getshards placements." title="Diagram of getshards placements." width="3388" height="1429"></picture> <figcaption class="mt-4 px-15 p-small italic text-grey-600">We can also configure shard exclusions. When assigning shards, excluded shards are simply skipped over. Consider the same examples as above, except with excluded_shards = `[3,7]`.</figcaption> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> <dialog-wrapper data-id="dialog-popup--1776351578-husky-deep-dive-blog_husky_2_230412_4c" data-trigger-id="open-popup--1776351578-husky-deep-dive-blog_husky_2_230412_4c" data-disable-mobile-popup="true" data-astro-cid-d4yttbaw="true"> <dialog id="dialog-popup--1776351578-husky-deep-dive-blog_husky_2_230412_4c" class="container h-full content-center bg-transparent backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-d4yttbaw> <span class="relative mx-auto [&>*:first-child]:bg-white block tablet:p-9 desktop-sm:p-12 rounded-3xl bg-white max-h-[calc(100vh-6rem)] overflow-y-auto" data-astro-cid-d4yttbaw> <figure class="content-image-component overflow-scroll max-h-[calc(100vh-12rem)]"> <img loading="lazy" class="w-full h-auto" srcset="https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=4 4x" src="https://web-assets.dd-static.net/42588/1776351578-husky-deep-dive-blog_husky_2_230412_4c.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of getshards placements." width="1026"> <figcaption class="mt-4 px-9 p-small italic text-grey-600">We can also configure shard exclusions. When assigning shards, excluded shards are simply skipped over. Consider the same examples as above, except with excluded_shards = `[3,7]`.</figcaption> </figure> <div class="desktop-sm:p-6 absolute top-0 right-0 z-10 p-3" data-astro-cid-d4yttbaw> <button title="Close dialog" aria-label="Close dialog" data-dd-action-name="dialog: icon: close dialog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close dialog</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> </span> </dialog> </dialog-wrapper> </div> </div>
|
||
<p><strong>3.a)</strong> The assigned shards for tenant “123” would have been <code>[2,3,4]</code> but—since shard 3 is excluded—the tenant is assigned shards <code>[2,4,5]</code>.</p>
|
||
<p><strong>3.b)</strong> Similarly, <code>[2,3,4,5]</code> becomes <code>[2,4,5,6]</code>.</p>
|
||
<p><strong>3.c)</strong> And finally, since shard 7 is excluded, tenant “789” is assigned shards 8 and 9 instead of 7 and 8.</p>
|
||
<h3 id="load-balancing-with-the-sharding-balancer"><a href="#load-balancing-with-the-sharding-balancer">Load Balancing with the Sharding Balancer</a></h3>
|
||
<p>Sharding Allocator’s consistent hashing scheme outlined above has one flaw: although hashing algorithms typically yield uniform distributions over keys, this is not sufficient to ensure that the total volume of traffic routed to each shard is roughly equal. Hotspots can occur randomly—even relatively small hotspots can result in large amounts of consumer lag for a given shard if the hotspot is long-lived.</p>
|
||
<p>Additionally, the hash function gives us our first shard for a tenant, but we’ve opted simply to use neighboring shards to choose the rest of a tenant’s shards. This means Shard Placements for different tenants can easily overlap, creating imbalances.</p>
|
||
<p>To alleviate these issues, we periodically run a balancing algorithm that shifts tenant Shard Placements around, until all shards are roughly balanced. Unfortunately, a consequence of using the tenant ID as the key for the hash function is that we are left without the ability to change the index of the first shard for a tenant. To address this, we introduce a salt value that is calculated for each tenant ID and is used as part of the hash function key. Changing this salt value allows us to offset the shards chosen for a placement, even if everything else remains the same.</p>
|
||
<div class="math-display mt-3 mb-3 overflow-x-auto" data-astro-cid-twmmywjp> <mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="49.719ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 21975.7 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43B" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 219 683Q260 681 355 681Q389 681 418 681T463 682T483 682Q499 682 499 672Q499 670 497 658Q492 641 487 638H485Q483 638 480 638T473 638T464 637T455 637Q416 636 405 634T387 623Q384 619 355 500Q348 474 340 442T328 395L324 380Q324 378 469 378H614L615 381Q615 384 646 504Q674 619 674 627T617 637Q594 637 587 639T580 648Q580 650 582 660Q586 677 588 679T604 682Q609 682 646 681T740 680Q802 680 835 681T871 682Q888 682 888 672Q888 645 876 638H874Q872 638 869 638T862 638T853 637T844 637Q805 636 794 634T776 623Q773 618 704 340T634 58Q634 51 638 51Q646 48 692 46H723Q729 38 729 37T726 19Q722 6 716 0H701Q664 2 567 2Q533 2 504 2T458 2T437 1Q420 1 420 10Q420 15 423 24Q428 43 433 45Q437 46 448 46H454Q481 46 514 49Q520 50 522 50T528 55T534 64T540 82T547 110T558 153Q565 181 569 198Q602 330 602 331T457 332H312L279 197Q245 63 245 58Q245 51 253 49T303 46H334Q340 38 340 37T337 19Q333 6 327 0H312Q275 2 178 2Q144 2 115 2T69 2T48 1Q31 1 31 10Q31 12 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z"></path></g><g data-mml-node="mo" transform="translate(888,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mtext" transform="translate(1277,0)"><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z"></path><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(389,0)"></path><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(833,0)"></path><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1389,0)"></path><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1889,0)"></path><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(2445,0)"></path><path data-c="5C" d="M56 731Q56 740 62 745T75 750Q85 750 92 740Q96 733 270 255T444 -231Q444 -239 438 -244T424 -250Q414 -250 407 -240Q404 -236 230 242T56 731Z" transform="translate(2834,0)"></path><path data-c="5F" d="M0 -62V-25H499V-62H0Z" transform="translate(3334,0)"></path><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(3834,0)"></path><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(4112,0)"></path></g><g data-mml-node="mo" transform="translate(6167.2,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mtext" transform="translate(7167.4,0)"><path data-c="1D42C" d="M38 315Q38 339 45 360T70 404T127 440T223 453Q273 453 320 436L338 445L357 453H366Q380 453 383 447T386 403V387V355Q386 331 383 326T365 321H355H349Q333 321 329 324T324 341Q317 406 224 406H216Q123 406 123 353Q123 334 143 321T188 304T244 294T285 286Q305 281 325 273T373 237T412 172Q414 162 414 142Q414 -6 230 -6Q154 -6 117 22L68 -6H58Q44 -6 41 0T38 42V73Q38 85 38 101T37 122Q37 144 42 148T68 153H75Q87 153 91 151T97 147T103 132Q131 46 220 46H230Q257 46 265 47Q330 58 330 108Q330 127 316 142Q300 156 284 162Q271 168 212 178T122 202Q38 243 38 315Z"></path><path data-c="1D41A" d="M64 349Q64 399 107 426T255 453Q346 453 402 423T473 341Q478 327 478 310T479 196V77Q493 63 529 62Q549 62 553 57T558 31Q558 9 552 5T514 0H497H481Q375 0 367 56L356 46Q300 -6 210 -6Q130 -6 81 30T32 121Q32 188 111 226T332 272H350V292Q350 313 348 327T337 361T306 391T248 402T194 399H189Q204 376 204 354Q204 327 187 306T134 284Q97 284 81 305T64 349ZM164 121Q164 89 186 67T238 45Q274 45 307 63T346 108L350 117V226H347Q248 218 206 189T164 121Z" transform="translate(454,0)"></path><path data-c="1D425" d="M43 686L134 690Q225 694 226 694H232V62H301V0H292Q274 3 170 3Q67 3 49 0H40V62H109V332Q109 387 109 453T110 534Q110 593 108 605T94 620Q80 624 53 624H40V686H43Z" transform="translate(1013,0)"></path><path data-c="1D42D" d="M272 49Q320 49 320 136V145V177H382V143Q382 106 380 99Q374 62 349 36T285 -2L272 -5H247Q173 -5 134 27Q109 46 102 74T94 160Q94 171 94 199T95 245V382H21V433H25Q58 433 90 456Q121 479 140 523T162 621V635H224V444H363V382H224V239V207V149Q224 98 228 81T249 55Q261 49 272 49Z" transform="translate(1332,0)"></path></g><g data-mml-node="mo" transform="translate(8946.4,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mi" transform="translate(9391.1,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g><g data-mml-node="mi" transform="translate(9752.1,0)"><path data-c="1D45C" d="M201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120Z"></path></g><g data-mml-node="mi" transform="translate(10237.1,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g><g data-mml-node="mi" transform="translate(10598.1,0)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="mi" transform="translate(11127.1,0)"><path data-c="1D459" d="M117 59Q117 26 142 26Q179 26 205 131Q211 151 215 152Q217 153 225 153H229Q238 153 241 153T246 151T248 144Q247 138 245 128T234 90T214 43T183 6T137 -11Q101 -11 70 11T38 85Q38 97 39 102L104 360Q167 615 167 623Q167 626 166 628T162 632T157 634T149 635T141 636T132 637T122 637Q112 637 109 637T101 638T95 641T94 647Q94 649 96 661Q101 680 107 682T179 688Q194 689 213 690T243 693T254 694Q266 694 266 686Q266 675 193 386T118 83Q118 81 118 75T117 65V59Z"></path></g><g data-mml-node="mi" transform="translate(11425.1,0)"><path data-c="1D446" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mi" transform="translate(12070.1,0)"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z"></path></g><g data-mml-node="mi" transform="translate(12646.1,0)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="mi" transform="translate(13175.1,0)"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(13626.1,0)"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path></g><g data-mml-node="mi" transform="translate(14146.1,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g><g data-mml-node="mo" transform="translate(14615.1,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(15281.9,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mi" transform="translate(16337.7,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g><g data-mml-node="mi" transform="translate(16698.7,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="mi" transform="translate(17164.7,0)"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(17764.7,0)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="mi" transform="translate(18293.7,0)"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(18893.7,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g><g data-mml-node="mi" transform="translate(19254.7,0)"><path data-c="1D446" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mi" transform="translate(19899.7,0)"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z"></path></g><g data-mml-node="mi" transform="translate(20475.7,0)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g><g data-mml-node="mi" transform="translate(21004.7,0)"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(21455.7,0)"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path></g></g></g></svg></mjx-container> </div>
|
||
<p>If we persist this salt value and use it whenever allocating a Shard Placement, we can shift future Shard Placements of a tenant by modifying the salt.</p>
|
||
<p>Now that we’ve established how we can salt our key to shift Shard Placements, we need to come up with an actual algorithm that can correct unbalanced shards by shifting placements around.</p>
|
||
<p>First, let’s define what “unbalanced” means. In simple terms, it just means that some shards are receiving a lot more traffic (with regards to our cost function) than others. In mathematical terms, we can use the formula for population variance and apply it to observed values of the same per-shard throughput metric that is used by the Autosharder to tweak shard counts:</p>
|
||
<div class="math-display mt-3 mb-3 overflow-x-auto" data-astro-cid-twmmywjp> <mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -1.552ex;" xmlns="http://www.w3.org/2000/svg" width="22.775ex" height="5.421ex" role="img" focusable="false" viewBox="0 -1710 10066.4 2396"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mi"><path data-c="1D70E" d="M184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278Z"></path></g><g data-mml-node="mn" transform="translate(604,413) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g><g data-mml-node="mo" transform="translate(1285.3,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="msubsup" transform="translate(2341.1,0)"><g data-mml-node="mo"><path data-c="2211" d="M60 948Q63 950 665 950H1267L1325 815Q1384 677 1388 669H1348L1341 683Q1320 724 1285 761Q1235 809 1174 838T1033 881T882 898T699 902H574H543H251L259 891Q722 258 724 252Q725 250 724 246Q721 243 460 -56L196 -356Q196 -357 407 -357Q459 -357 548 -357T676 -358Q812 -358 896 -353T1063 -332T1204 -283T1307 -196Q1328 -170 1348 -124H1388Q1388 -125 1381 -145T1356 -210T1325 -294L1267 -449L666 -450Q64 -450 61 -448Q55 -446 55 -439Q55 -437 57 -433L590 177Q590 178 557 222T452 366T322 544L56 909L55 924Q55 945 60 948Z"></path></g><g data-mml-node="mi" transform="translate(1477,677.1) scale(0.707)"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g><g data-mml-node="TeXAtom" transform="translate(1477,-485.4) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(345,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mn" transform="translate(1123,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g></g></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(5182.4,0)"><g data-mml-node="mfrac"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(220,710)"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(389,0)"><g data-mml-node="mi"><path data-c="1D44B" d="M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z"></path></g><g data-mml-node="mi" transform="translate(861,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1766.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mover" transform="translate(2766.4,0)"><g data-mml-node="mi"><path data-c="1D44B" d="M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z"></path></g><g data-mml-node="mo" transform="translate(0,615)"><svg width="852" height="237" x="0" y="148" viewBox="213 148 852 237"><path data-c="2013" d="M0 248V285H499V248H0Z" transform="scale(2.556,1)"></path></svg></g></g><g data-mml-node="msup" transform="translate(3618.4,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mn" transform="translate(422,363) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(1998,-686)"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g></g><rect width="4643.9" height="60" x="120" y="220"></rect></g></g></g></g></svg></mjx-container> </div>
|
||
<p><span class="math-inline"><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="5.002ex" height="1.902ex" role="img" focusable="false" viewBox="0 -683 2210.7 840.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D44B" d="M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z"></path></g><g data-mml-node="mi" transform="translate(861,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1432.7,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g></g></g></svg></mjx-container></span> the observed traffic volume/cost sent to the i<sup>th</sup> shard,</p>
|
||
<p><span class="math-inline"><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="4.316ex" height="2.448ex" role="img" focusable="false" viewBox="0 -1000 1907.8 1082"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D44B" d="M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z"></path></g><g data-mml-node="mo" transform="translate(0,615)"><svg width="852" height="237" x="0" y="148" viewBox="213 148 852 237"><path data-c="2013" d="M0 248V285H499V248H0Z" transform="scale(2.556,1)"></path></svg></g></g><g data-mml-node="mo" transform="translate(1129.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g></g></g></svg></mjx-container></span> the mean of the observed traffic volume across all shards,</p>
|
||
<p><span class="math-inline"><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="4.398ex" height="1.731ex" role="img" focusable="false" viewBox="0 -683 1943.8 765"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></g><g data-mml-node="mo" transform="translate(1165.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g></g></g></svg></mjx-container></span> the total number of shards</p>
|
||
<p>Population variance is a commonly used measure for determining how spread out population data is. In our case, it works well as a metric for how unbalanced our shards are.</p>
|
||
<p>Having defined what it means for traffic across shards to be unbalanced, we can come up with a balancing strategy:</p>
|
||
<ol><li><p>Calculate population variance. If it is above a threshold, proceed to step 2.</p></li><li><p>Pick the list of tenants whose current Shard Placements include the shard with the maximum observed throughput.</p></li><li><p>Simulate moving those tenants to some shards with the lowest observed throughput, and recalculate the population variance each time. Choose and apply the move that yields the lowest simulated variance.</p></li><li><p>Repeat steps 1-3 as needed, or as many times as allowed—the balancer is configured with a maximum number of moves it can make on each run to minimize placement moves.</p></li></ol>
|
||
<p>The balancer is tuned to make the most impact with the fewest actual changes. This is not only to minimize routing changes, but also because we’ve observed that this works best – especially in the case of massively multi-tenant clusters, where significant imbalances rarely occur, or are limited to one or two outliers.</p>
|
||
<div class="content-image-wrapper tablet:col-span-12 desktop-sm:col-span-8"> <div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=4 4x"><img loading="lazy" class="h-auto max-w-full tablet:cursor-zoom-in" id="open-popup--1776351583-husky-deep-dive-chart2" src="https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Graph showing message rate per shard becoming more uniform over time." title="Graph showing message rate per shard becoming more uniform over time." width="1600" height="469"></picture> <figcaption class="mt-4 px-15 p-small italic text-grey-600">An example of the balancer at work, with message rate per shard becoming far more uniform after its changes.</figcaption> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> <dialog-wrapper data-id="dialog-popup--1776351583-husky-deep-dive-chart2" data-trigger-id="open-popup--1776351583-husky-deep-dive-chart2" data-disable-mobile-popup="true" data-astro-cid-d4yttbaw="true"> <dialog id="dialog-popup--1776351583-husky-deep-dive-chart2" class="container h-full content-center bg-transparent backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-d4yttbaw> <span class="relative mx-auto [&>*:first-child]:bg-white block tablet:p-9 desktop-sm:p-12 rounded-3xl bg-white max-h-[calc(100vh-6rem)] overflow-y-auto" data-astro-cid-d4yttbaw> <figure class="content-image-component overflow-scroll max-h-[calc(100vh-12rem)]"> <img loading="lazy" class="w-full h-auto" srcset="https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=4 4x" src="https://web-assets.dd-static.net/42588/1776351583-husky-deep-dive-chart2.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Graph showing message rate per shard becoming more uniform over time." width="1026"> <figcaption class="mt-4 px-9 p-small italic text-grey-600">An example of the balancer at work, with message rate per shard becoming far more uniform after its changes.</figcaption> </figure> <div class="desktop-sm:p-6 absolute top-0 right-0 z-10 p-3" data-astro-cid-d4yttbaw> <button title="Close dialog" aria-label="Close dialog" data-dd-action-name="dialog: icon: close dialog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close dialog</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> </span> </dialog> </dialog-wrapper> </div> </div>
|
||
<h2 id="accommodating-bursts-in-traffic"><a href="#accommodating-bursts-in-traffic">Accommodating bursts in traffic</a></h2>
|
||
<p>Shard Placements are immutable, have a fixed set of shards, and apply to a specific tenant and range of time. Therefore, it is possible for a tenant with a small number of allocated shards to sharply increase its traffic during the range of time for which the placement applies. A sufficiently massive influx of traffic to a small number of shards has the potential to overload the associated workers, leading to ingestion lag.</p>
|
||
<p>Typically, a couple of automated mechanisms can mitigate the impact of bursts in traffic:</p>
|
||
<ul><li><p><strong>(Auto) upscale</strong></p></li></ul>
|
||
<p>Shards are sized to be small enough so that each writer is generally assigned several shards at once. The impact of processing an influx of traffic will manifest itself in increased values of vital metrics like CPU usage. The <a href="https://github.com/DataDog/watermarkpodautoscaler" target="_blank" rel="noopener noreferrer">Watermark Pod Autoscaler</a> observes these metrics and quickly upscales when observed values cross a threshold. Increasing the number of workers decreases the number of shards assigned to each, which in turn increases the maximum potential throughput of each shard. In other words, if a Writer was previously assigned ten shards, and is suddenly only assigned five, it can now process approximately twice as many events per second from each remaining assigned shard.</p>
|
||
<ul><li><p><strong>Shard Exclusions</strong></p></li></ul>
|
||
<p>Shards that are overloaded due to a large spike in traffic can be temporarily excluded. Excluding a shard means that it won’t be included in future Shard Placements, so that eventually, new traffic won’t be routed to it. In extreme situations, this can allow the shard to recover from a large backlog.</p>
|
||
<h2 id="husky-writers"><a href="#husky-writers">Husky Writers</a></h2>
|
||
<div class="content-image-wrapper tablet:col-span-12 desktop-sm:col-span-8"> <div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=4 4x"><img loading="lazy" class="h-auto max-w-full tablet:cursor-zoom-in" id="open-popup--1776351587-husky-deep-dive-blog_husky_2_230130_5_update" src="https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram showing communication between Event Store Writers, Metadata Service, Compactors, and Commodity Blob Storage. The Event Store Writers also communicate with Topics Routed by Shard." title="Diagram showing communication between Event Store Writers, Metadata Service, Compactors, and Commodity Blob Storage. The Event Store Writers also communicate with Topics Routed by Shard." width="3388" height="810"></picture> <figcaption class="mt-4 px-15 p-small italic text-grey-600">The components of Husky relevant for ingestion of events.</figcaption> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> <dialog-wrapper data-id="dialog-popup--1776351587-husky-deep-dive-blog_husky_2_230130_5_update" data-trigger-id="open-popup--1776351587-husky-deep-dive-blog_husky_2_230130_5_update" data-disable-mobile-popup="true" data-astro-cid-d4yttbaw="true"> <dialog id="dialog-popup--1776351587-husky-deep-dive-blog_husky_2_230130_5_update" class="container h-full content-center bg-transparent backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-d4yttbaw> <span class="relative mx-auto [&>*:first-child]:bg-white block tablet:p-9 desktop-sm:p-12 rounded-3xl bg-white max-h-[calc(100vh-6rem)] overflow-y-auto" data-astro-cid-d4yttbaw> <figure class="content-image-component overflow-scroll max-h-[calc(100vh-12rem)]"> <img loading="lazy" class="w-full h-auto" srcset="https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=4 4x" src="https://web-assets.dd-static.net/42588/1776351587-husky-deep-dive-blog_husky_2_230130_5_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram showing communication between Event Store Writers, Metadata Service, Compactors, and Commodity Blob Storage. The Event Store Writers also communicate with Topics Routed by Shard." width="1026"> <figcaption class="mt-4 px-9 p-small italic text-grey-600">The components of Husky relevant for ingestion of events.</figcaption> </figure> <div class="desktop-sm:p-6 absolute top-0 right-0 z-10 p-3" data-astro-cid-d4yttbaw> <button title="Close dialog" aria-label="Close dialog" data-dd-action-name="dialog: icon: close dialog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close dialog</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> </span> </dialog> </dialog-wrapper> </div> </div>
|
||
<p>Until now we’ve discussed the storage routing system upstream of the workers responsible for exactly-once ingestion to a Husky deployment. This system enabled us to abandon all notions of clustering at ingestion time as we moved from our first-generation to our second-generation storage system, and is reused with our third-generation system, Husky. These days, the primary consumer of the Shard Router’s output is a Husky service called the Writers, which we introduced in our previous blog post. The Writers’ primary responsibility is reading events from Kafka, generating Husky columnar format files in blob storage, and committing the presence of those files to FoundationDB.</p>
|
||
<p>Much like their second generation counterparts, Husky Writers consume events from assigned shards. A Writer’s primary task is to persist these events with the goal of making them queryable as quickly as possible without introducing any duplicates.</p>
|
||
<p>There are also a couple of other requirements based on foreseeable issues:</p>
|
||
<ul><li><p>As we learned from the previous system, the Writers nodes themselves should be stateless—and we should be able to auto-scale and spread shard assignments across Writer workers as needed.</p></li><li><p>Minimize number of files uploaded to blob storage. This is important because:</p><ul><li><p>The number of files (objects) created is an important cost dimension of commodity object storage – we need to make sure our costs don’t spiral out of control.</p></li><li><p>We also need to make sure the blob storage bucket can handle our request volume (and avoid getting rate-limited).</p></li><li><p>Having fewer files decreases the amount of work the compactors need to do, and makes queries more efficient.</p></li></ul></li><li><p>We need to minimize disruptions from worker restarts, including from deployments.</p></li></ul>
|
||
<h3 id="stateless-deduplication"><a href="#stateless-deduplication">Stateless deduplication</a></h3>
|
||
<p>The implication of stateless Writers is that the shards that a Writer is assigned can change. This means that other workers can (temporarily) receive events from the same shard, which can result in duplicate events across workers—in addition to the duplicate events within a single shard. So how do we perform deduplication?</p>
|
||
<p>Here are a couple of naive solutions that won’t work:</p>
|
||
<ul><li><p>Simply querying Husky for the event ID to see if it has already been written would be massively inefficient. Husky is optimized for search and aggregation, but not low-latency point lookups, and especially not at the high throughput that our data ingestion pipelines operate at.</p></li><li><p>We can’t simply store all seen IDs in memory because they will not fit in memory. Besides, this doesn’t help us handle restarts or reconcile duplicates/conflicts that will invariably occur when two writers temporarily process the same shard during deployments and node restarts.</p></li></ul>
|
||
<p>We need some sort of persistent store<sup class="footnote-ref"><a href="#fn-3" id="fnref-3">3</a></sup> for event IDs from which we can retrieve and look up IDs efficiently. Two obvious candidates:</p>
|
||
<ul><li><p>Use an embedded local key-value store like RocksDB. This would certainly be efficient, but it would also ruin the stateless nature of the Writer nodes.</p></li><li><p>Use a remote key-value store like Redis or Cassandra. This could work well, but it adds an additional dependency and could make it difficult to allow deduplication over large time windows, such as months or years.</p></li></ul>
|
||
<p>Both of these solutions suffer another problem: they split consistency and correctness between two sources of truth. Husky is designed with a single source of truth – the Metadata store (backed by FoundationDB). An event exists if it has been committed there, and does not if it hasn’t. Using an additional store adds the complexity of reconciling disagreements between two systems: What if we were able to commit event IDs to Cassandra, but we failed to commit the event data itself to the Metadata store?</p>
|
||
<h4 id="storing-ids-in-husky"><a href="#storing-ids-in-husky">Storing IDs in Husky</a></h4>
|
||
<p>We opted for a hybrid approach to storing IDs: we persist the event IDs in Husky itself, but we store them in separate Husky tables from the raw event data. This solves our two biggest problems in one fell swoop:</p>
|
||
<ol><li><p>IDs and event data are committed to the Metadata Service at the same time (and in the same FoundationDB transaction). As a result, it is not possible for there to be a discrepancy between committed IDs and committed data.</p></li><li><p>Event data is stored in regular tables. ID data is stored in ID tables, which are unique per shard ID and partition files by time. This ensures that the Husky Writers can page in huge swathes of IDs for the shards that they’re consuming from blob storage using a very limited number of IO operations.</p></li></ol>
|
||
<p>For fast lookups, event IDs are also stored in memory, and we lazily page in intervals of event IDs from Husky as needed. When the in-memory structure gets too large, we purge unneeded intervals with the help of an LRU (least recently used) cache.</p>
|
||
<p>This is an elegant solution for several reasons:</p>
|
||
<ul><li><p>Metadata remains our single source of truth. We commit tenant event data and event IDs in the same atomic transaction: thus, we can guarantee consistency between the event data itself and the event IDs once they’ve been committed to the Metadata store.</p></li><li><p>Husky is designed to store vast amounts of data for long periods of time, so we can store all event IDs for as long as we need.</p></li><li><p>The event ID tables are just regular Husky tables, so the Compactors automatically optimize them for reads (page in by the Writers), just like they do for all the other “regular” event data tables. In addition, these ID tables can have time-to-live configuration, just like any other table in Husky, and automatically expire after a configurable amount of time.</p></li></ul>
|
||
<p>When a worker is restarted (or receives a new shard assignment), it must page in many intervals of event IDs, as it has none in memory. In practice, since observability data tends to arrive roughly ordered in time, the page-in rate is several orders of magnitude lower than a Writer’s actual rate of ingestion. Regardless, the Writers can page in IDs at a rate ~2 orders of magnitude higher than they can process incoming events.</p>
|
||
<h4 id="conflict-detection"><a href="#conflict-detection">Conflict detection</a></h4>
|
||
<p>What happens when a shard is reassigned to another worker? Does it break deduplication because both workers have diverging sets of event IDs for the same shard and interval of time? What if something goes wrong and a shard assignment ping-pongs between multiple different Writers?</p>
|
||
<p>Once again, we leverage FoundationDB’s strong transactional guarantees to achieve distributed consensus in the critical path. Husky’s Metadata Service is backed by FoundationDB, so we leverage its strong transactional guarantees to implement a conflict detection scheme based on optimistic concurrency – we simply version updates to the event IDs tables and reject out-of-order updates. The worker is notified of the conflict and triggers a reconciliation process – the contents of the local ID cache are discarded and consumer progress is reset to the latest committed fragment.</p>
|
||
<div class="content-image-wrapper tablet:col-span-12 desktop-sm:col-span-8"> <div class="content-image-component"> <!-- Render an image with optional popup functionality and caption --> <figure class> <picture><source media="(max-width: 767px)" srcset="https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=767&dpr=4 4x"><source media="(min-width: 768px) and (max-width: 1024px)" srcset="https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1024&dpr=4 4x"><source media="(min-width: 1025px)" srcset="https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=4 4x"><img loading="lazy" class="h-auto max-w-full tablet:cursor-zoom-in" id="open-popup--1776351591-husky-deep-dive-blog_husky_2_230130_6_update" src="https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of Kafka Topic on the left, with a flow going to Worker B assigned shards." title="Diagram of Kafka Topic on the left, with a flow going to Worker B assigned shards." width="3389" height="2431"></picture> </figure> <!-- TODO: Update src with widths related to dialog size constraints + make img src dynamic (to avoid load unless requested via click) --> <dialog-wrapper data-id="dialog-popup--1776351591-husky-deep-dive-blog_husky_2_230130_6_update" data-trigger-id="open-popup--1776351591-husky-deep-dive-blog_husky_2_230130_6_update" data-disable-mobile-popup="true" data-astro-cid-d4yttbaw="true"> <dialog id="dialog-popup--1776351591-husky-deep-dive-blog_husky_2_230130_6_update" class="container h-full content-center bg-transparent backdrop:bg-black/70 backdrop:backdrop-blur-[2px]" data-astro-cid-d4yttbaw> <span class="relative mx-auto [&>*:first-child]:bg-white block tablet:p-9 desktop-sm:p-12 rounded-3xl bg-white max-h-[calc(100vh-6rem)] overflow-y-auto" data-astro-cid-d4yttbaw> <figure class="content-image-component overflow-scroll max-h-[calc(100vh-12rem)]"> <img loading="lazy" class="w-full h-auto" srcset="https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1 1x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2 2x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3 3x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1026&dpr=4 4x" src="https://web-assets.dd-static.net/42588/1776351591-husky-deep-dive-blog_husky_2_230130_6_update.png?format=auto&fit=bounds&quality=75&disable=upscale&width=1400&dpr=1" alt="Diagram of Kafka Topic on the left, with a flow going to Worker B assigned shards." width="1026"> </figure> <div class="desktop-sm:p-6 absolute top-0 right-0 z-10 p-3" data-astro-cid-d4yttbaw> <button title="Close dialog" aria-label="Close dialog" data-dd-action-name="dialog: icon: close dialog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close dialog</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> </span> </dialog> </dialog-wrapper> </div> </div>
|
||
<h2 id="whats-next"><a href="#whats-next">What’s next?</a></h2>
|
||
<p>Here we reviewed how immutable yet dynamic upstream routing combined with a FoundationDB-powered conflict resolution mechanism make it possible for us to ingest and de-duplicate vast multi-tenant streams of data into Husky while maintaining that every piece of the ingestion path is stateless, scalable, and performant. Future posts in this series will cover interesting technical details of Husky’s compaction system and the query path.</p>
|
||
<section class="footnotes" aria-label="Footnotes"><ol>
|
||
<li id="fn-1"><p>Abstracting topic partitions into shards allows us to scale Kafka resources independently of shards, as well as to introduce some redundancy. Multiple partitions across multiple topics across multiple clusters can map to the same shard. This enables us to tolerate degraded performance and failures of brokers, entire topics, or even entire Kafka clusters with some clever client-side load-balancing as Shard Router publishes events. <a href="#fnref-1" class="footnote-backref" aria-label="Back to reference 1">↩</a></p></li>
|
||
<li id="fn-2"><p>While it may seem trite to care about exactly once ingestion for an Observability system, it’s actually an incredibly important property for us to maintain. Introducing a single duplicate event into the system is sufficient to cause false positive or false negative monitor evaluations for our customers, which we consider unacceptable. Upstream services can introduce duplicate events in a number of ways during normal operation—retries, service restarts, network blips, etc. Last but not least, exactly-once processing is crucial for accurate usage reporting for billing and cost attribution. <a href="#fnref-2" class="footnote-backref" aria-label="Back to reference 2">↩</a></p></li>
|
||
<li id="fn-3"><p>Another way some database systems handle de-duplication is by writing the duplicates, filtering at query time, and finally pruning at compaction time. With Husky, we can get away with not doing this because a) the majority of the data is not updated, so entire files are rarely re-written; and b) the write volume is much higher than the query volume. <a href="#fnref-3" class="footnote-backref" aria-label="Back to reference 3">↩</a></p></li>
|
||
</ol></section> </div></div><div class="desktop-sm:col-span-full desktop-sm:mb-12 mb-9"></div><div class="print:hidden"><ul class="inline-flex gap-2"> <li> <a href="https://twitter.com/intent/tweet?url=https://www.datadoghq.com/blog/engineering/husky-deep-dive/" aria-label="Share on X" target="_blank" rel="noopener noreferrer" class="group" data-dd-action-name="share: link: x"> <svg aria-hidden="true" focusable="false" width="36" height="36" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg" class="[&>g>rect]:fill-grey-500 [&_path]:!fill-white w-7 h-7 tablet:w-8 tablet:h-8 desktop-sm:w-9 desktop-sm:h-9 group-hover:[&>g>rect]:fill-black">
|
||
<g id="_atom_social-icons">
|
||
<rect width="36" height="36" rx="18" fill=""></rect>
|
||
<path id="Vector" d="M19.5222 16.5277L25.4785 9H24.0671L18.8952 15.5362L14.7644 9H10L16.2466 18.8839L10 26.7778H11.4115L16.8732 19.8753L21.2356 26.7778H26L19.5222 16.5277ZM17.5889 18.9709L16.956 17.9867L11.9201 10.1553H14.0882L18.1522 16.4755L18.7851 17.4597L24.0677 25.675H21.8997L17.5889 18.9709Z" fill=""></path>
|
||
</g>
|
||
</svg> </a> </li><li> <a href="https://www.reddit.com/submit?url=https://www.datadoghq.com/blog/engineering/husky-deep-dive/" aria-label="Share on Reddit" target="_blank" rel="noopener noreferrer" class="group" data-dd-action-name="share: link: reddit"> <svg aria-hidden="true" focusable="false" width="36" height="36" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg" class="[&>g>rect]:fill-grey-500 [&_path]:!fill-white w-7 h-7 tablet:w-8 tablet:h-8 desktop-sm:w-9 desktop-sm:h-9 group-hover:[&>g>rect]:fill-[#FF4500]">
|
||
<g id="_atom_social-icons">
|
||
<rect width="36" height="36" rx="18" fill=""></rect>
|
||
<path id="Vector" d="M15.7419 20.129C15.1613 20.129 14.7097 19.6774 14.7097 19.0968C14.7097 18.5161 15.1613 18.0645 15.7419 18.0645C16.3226 18.0645 16.7742 18.5161 16.7742 19.0968C16.7742 19.6129 16.2581 20.129 15.7419 20.129ZM20.129 21.4194C19.6774 21.871 18.6452 22 18 22C17.3548 22 16.3226 21.8065 15.871 21.4194C15.7419 21.2903 15.6129 21.2903 15.4839 21.4194C15.3548 21.5484 15.3548 21.6774 15.4839 21.8065C16.1935 22.5161 17.5484 22.5806 18 22.5806C18.3871 22.5806 19.8065 22.5161 20.5161 21.8065C20.6452 21.6774 20.6452 21.5484 20.5161 21.4194C20.3871 21.3548 20.1935 21.3548 20.129 21.4194ZM20.2581 18C19.6774 18 19.2258 18.4516 19.2258 19.0323C19.2258 19.6129 19.6774 20.0645 20.2581 20.0645C20.8387 20.0645 21.2903 19.6129 21.2903 19.0323C21.3548 18.4516 20.9032 18 20.2581 18ZM28 18C28 23.4839 23.4839 28 18 28C12.5161 28 8 23.4839 8 18C8 12.5161 12.5161 8 18 8C23.4839 8 28 12.5161 28 18ZM24.6452 18C24.6452 17.2258 24 16.5806 23.2258 16.5806C22.8387 16.5806 22.5161 16.7742 22.2581 16.9677C21.2903 16.2581 19.871 15.8065 18.3871 15.7419L19.0323 12.6452L21.2258 13.0968C21.2258 13.6774 21.7419 14.0645 22.3226 14.0645C22.9032 14.0645 23.2903 13.5484 23.2903 12.9677C23.2903 12.3871 22.7742 11.9355 22.1935 11.9355C21.8065 11.9355 21.4839 12.129 21.2903 12.5161L18.8387 12C18.7742 12 18.7097 12 18.6452 12.0645C18.5806 12.129 18.5161 12.1935 18.5161 12.2581L17.8065 15.7419C16.2581 15.8065 14.8387 16.2581 13.871 16.9677C13.2903 16.3871 12.3871 16.4516 11.8065 17.0323C11.2258 17.6129 11.2903 18.5161 11.871 19.0968C12 19.2258 12.0645 19.2903 12.2581 19.3548C12.2581 19.5484 12.1935 19.6129 12.1935 19.8065C12.1935 22 14.7742 23.871 18 23.871C21.2258 23.871 23.8065 22.0645 23.8065 19.8065C23.8065 19.6129 23.8065 19.5484 23.7419 19.3548C24.3226 19.0968 24.6452 18.5806 24.6452 18Z" fill=""></path>
|
||
</g>
|
||
</svg> </a> </li><li> <a href="https://www.linkedin.com/shareArticle?url=https://www.datadoghq.com/blog/engineering/husky-deep-dive/" aria-label="Share on LinkedIn" target="_blank" rel="noopener noreferrer" class="group" data-dd-action-name="share: link: linkedin"> <svg aria-hidden="true" focusable="false" width="36" height="36" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg" class="[&>g>rect]:fill-grey-500 [&_path]:!fill-white w-7 h-7 tablet:w-8 tablet:h-8 desktop-sm:w-9 desktop-sm:h-9 group-hover:[&>g>rect]:fill-[#0A66C2]">
|
||
<g id="_atom_social-icons">
|
||
<rect width="36" height="36" rx="18" fill=""></rect>
|
||
<g id="Group">
|
||
<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M24.9355 9H11C9.90323 9 9 9.90323 9 11V25C9 26.0968 9.90323 27 11 27H25C26.0968 27 27 26.0968 27 25V11.0645C27 9.90323 26.0968 9 24.9355 9ZM14.4194 24.5484H11.7097V15.8387H14.4194V24.5484ZM13.0645 14.7419C12.1613 14.7419 11.5161 14.0323 11.5161 13.1935C11.5161 12.2903 12.2258 11.5806 13.0645 11.5806C13.9032 11.5806 14.6129 12.2903 14.6129 13.1935C14.6129 14.0968 13.9032 14.7419 13.0645 14.7419ZM24.4839 24.5484H21.7742V19.9677C21.7742 18.7419 21.3226 17.9677 20.2903 17.9677C19.1935 17.9677 18.6774 18.6774 18.6774 19.9677V24.5484H16.0968V15.8387H18.6774V17C18.6774 17 19.4516 15.5806 21.3226 15.5806C23.1935 15.5806 24.4839 16.6774 24.4839 19V24.5484Z" fill=""></path>
|
||
</g>
|
||
</g>
|
||
</svg> </a> </li> </ul></div></section><!-- Sidebar — second in DOM; CSS Grid places it visually left on desktop --><div class="desktop-sm:col-span-3 desktop-sm:col-start-1 desktop-sm:row-start-1 hidden desktop-sm:flex flex-col justify-between desktop-sm:pr-10 print:hidden"><aside class="aside-toc desktop-sm:block desktop-sm:sticky desktop-sm:top-[115px] hidden font-national-book "> <nav class="toc "> <div> <ul class="flex flex-col gap-1"> <li class=" pt-4 border-t border-t-grey-400 text-grey-400 hover:text-purple-700 active:text-purple-800 hover:border-t-purple-700"> <a href="/blog/engineering/introducing-husky/" data-dd-action-name="toc-series: link: Introducing Husky, Datadog’s third-generation event store" class="flex flex-col gap-1"> <span class="h5 uppercase">Part 1</span> <p class="font-bold font-national text-16 leading-20">Introducing Husky, Datadog’s third-generation event store</p> </a> </li> <li class="mt-6 flex flex-col gap-1 pt-4 border-t border-t-purple-600"> <span class="h5 uppercase">Part 2</span> <p class="font-bold font-national text-16 leading-20">Husky: Exactly-once ingestion and multi-tenancy at scale</p> </li> <ul class="flex flex-col gap-1">
|
||
<li class="leading-20 group">
|
||
<a href="#routing-to-storage-shards" data-dd-action-name="toc: heading: Routing to storage shards" class="inline-block font-national font-normal border-l-2 hover:text-purple-700 border-grey-300 desktop-sm:pl-3 hover:border-purple-300 [.active>&]:border-purple-600 active:border-purple-600 [.active>&]:text-purple-600 group-has-[.active]:text-purple-600 group-has-[.active]:border-purple-600 active:text-purple-800 [.active>&]:font-bold group-has-[.active]:font-bold group-has-[.active]:hover:border-purple-700 group-has-[.active]:hover:text-purple-700 [.active]:hover:border-purple-700 [.active>&]:hover:text-purple-700 [.active]:active:border-purple-800 [.active>&]:active:text-purple-800">
|
||
Routing to storage shards
|
||
</a>
|
||
<ul class="flex-col gap-1 font-normal pl-9 my-1 hidden [.active_&]:flex has-[.active]:flex has-[.active]:font-bold"><li class="leading-4 hover:text-purple-300"><a href="#handling-assignment-changes-with-time-bounded-shard-placements" data-dd-action-name="toc: heading: Handling assignment changes with time-bounded Shard Placements" class="inline-block font-national font-normal border-l-2 [.active]:font-bold hover:text-purple-700 border-grey-300 desktop-sm:pl-3 hover:border-purple-300 [.active>&]:border-purple-600 active:border-purple-600 [.active>&]:text-purple-600 active:text-purple-800 [.active>&]:font-bold [.active]:hover:border-purple-700 [.active>&]:hover:text-purple-700 [.active]:active:border-purple-800 [.active>&]:active:text-purple-8000">Handling assignment changes with time-bounded Shard Placements</a></li><li class="leading-4 hover:text-purple-300"><a href="#establishing-consensus-with-the-sharding-allocator" data-dd-action-name="toc: heading: Establishing consensus with the Sharding Allocator" class="inline-block font-national font-normal border-l-2 [.active]:font-bold hover:text-purple-700 border-grey-300 desktop-sm:pl-3 hover:border-purple-300 [.active>&]:border-purple-600 active:border-purple-600 [.active>&]:text-purple-600 active:text-purple-800 [.active>&]:font-bold [.active]:hover:border-purple-700 [.active>&]:hover:text-purple-700 [.active]:active:border-purple-800 [.active>&]:active:text-purple-8000">Establishing consensus with the Sharding Allocator</a></li><li class="leading-4 hover:text-purple-300"><a href="#choosing-a-number-of-shards-for-each-tenant" data-dd-action-name="toc: heading: Choosing a number of shards for each tenant" class="inline-block font-national font-normal border-l-2 [.active]:font-bold hover:text-purple-700 border-grey-300 desktop-sm:pl-3 hover:border-purple-300 [.active>&]:border-purple-600 active:border-purple-600 [.active>&]:text-purple-600 active:text-purple-800 [.active>&]:font-bold [.active]:hover:border-purple-700 [.active>&]:hover:text-purple-700 [.active]:active:border-purple-800 [.active>&]:active:text-purple-8000">Choosing a number of shards for each tenant</a></li><li class="leading-4 hover:text-purple-300"><a href="#how-does-the-sharding-allocator-choose-shards" data-dd-action-name="toc: heading: How does the Sharding Allocator choose shards?" class="inline-block font-national font-normal border-l-2 [.active]:font-bold hover:text-purple-700 border-grey-300 desktop-sm:pl-3 hover:border-purple-300 [.active>&]:border-purple-600 active:border-purple-600 [.active>&]:text-purple-600 active:text-purple-800 [.active>&]:font-bold [.active]:hover:border-purple-700 [.active>&]:hover:text-purple-700 [.active]:active:border-purple-800 [.active>&]:active:text-purple-8000">How does the Sharding Allocator choose shards?</a></li><li class="leading-4 hover:text-purple-300"><a href="#load-balancing-with-the-sharding-balancer" data-dd-action-name="toc: heading: Load Balancing with the Sharding Balancer" class="inline-block font-national font-normal border-l-2 [.active]:font-bold hover:text-purple-700 border-grey-300 desktop-sm:pl-3 hover:border-purple-300 [.active>&]:border-purple-600 active:border-purple-600 [.active>&]:text-purple-600 active:text-purple-800 [.active>&]:font-bold [.active]:hover:border-purple-700 [.active>&]:hover:text-purple-700 [.active]:active:border-purple-800 [.active>&]:active:text-purple-8000">Load Balancing with the Sharding Balancer</a></li></ul>
|
||
</li>
|
||
|
||
<li class="leading-20 group">
|
||
<a href="#accommodating-bursts-in-traffic" data-dd-action-name="toc: heading: Accommodating bursts in traffic" class="inline-block font-national font-normal border-l-2 hover:text-purple-700 border-grey-300 desktop-sm:pl-3 hover:border-purple-300 [.active>&]:border-purple-600 active:border-purple-600 [.active>&]:text-purple-600 group-has-[.active]:text-purple-600 group-has-[.active]:border-purple-600 active:text-purple-800 [.active>&]:font-bold group-has-[.active]:font-bold group-has-[.active]:hover:border-purple-700 group-has-[.active]:hover:text-purple-700 [.active]:hover:border-purple-700 [.active>&]:hover:text-purple-700 [.active]:active:border-purple-800 [.active>&]:active:text-purple-800">
|
||
Accommodating bursts in traffic
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="leading-20 group">
|
||
<a href="#husky-writers" data-dd-action-name="toc: heading: Husky Writers" class="inline-block font-national font-normal border-l-2 hover:text-purple-700 border-grey-300 desktop-sm:pl-3 hover:border-purple-300 [.active>&]:border-purple-600 active:border-purple-600 [.active>&]:text-purple-600 group-has-[.active]:text-purple-600 group-has-[.active]:border-purple-600 active:text-purple-800 [.active>&]:font-bold group-has-[.active]:font-bold group-has-[.active]:hover:border-purple-700 group-has-[.active]:hover:text-purple-700 [.active]:hover:border-purple-700 [.active>&]:hover:text-purple-700 [.active]:active:border-purple-800 [.active>&]:active:text-purple-800">
|
||
Husky Writers
|
||
</a>
|
||
<ul class="flex-col gap-1 font-normal pl-9 my-1 hidden [.active_&]:flex has-[.active]:flex has-[.active]:font-bold"><li class="leading-4 hover:text-purple-300"><a href="#stateless-deduplication" data-dd-action-name="toc: heading: Stateless deduplication" class="inline-block font-national font-normal border-l-2 [.active]:font-bold hover:text-purple-700 border-grey-300 desktop-sm:pl-3 hover:border-purple-300 [.active>&]:border-purple-600 active:border-purple-600 [.active>&]:text-purple-600 active:text-purple-800 [.active>&]:font-bold [.active]:hover:border-purple-700 [.active>&]:hover:text-purple-700 [.active]:active:border-purple-800 [.active>&]:active:text-purple-8000">Stateless deduplication</a></li></ul>
|
||
</li>
|
||
|
||
<li class="leading-20 group">
|
||
<a href="#whats-next" data-dd-action-name="toc: heading: What’s next?" class="inline-block font-national font-normal border-l-2 hover:text-purple-700 border-grey-300 desktop-sm:pl-3 hover:border-purple-300 [.active>&]:border-purple-600 active:border-purple-600 [.active>&]:text-purple-600 group-has-[.active]:text-purple-600 group-has-[.active]:border-purple-600 active:text-purple-800 [.active>&]:font-bold group-has-[.active]:font-bold group-has-[.active]:hover:border-purple-700 group-has-[.active]:hover:text-purple-700 [.active]:hover:border-purple-700 [.active>&]:hover:text-purple-700 [.active]:active:border-purple-800 [.active>&]:active:text-purple-800">
|
||
What’s next?
|
||
</a>
|
||
|
||
</li>
|
||
</ul> <li class="mt-6 active:border-t-purple-800 pt-4 border-t border-t-grey-400 text-grey-400 hover:text-purple-700 active:text-purple-800 hover:border-t-purple-700"> <a href="/blog/engineering/husky-storage-compaction/" data-dd-action-name="toc-series: link: Husky: Efficient compaction at Datadog scale" class="flex flex-col gap-1"> <span class="h5 uppercase">Part 3</span> <p class="font-bold font-national text-16 leading-20">Husky: Efficient compaction at Datadog scale</p> </a> </li><li class="mt-6 active:border-t-purple-800 pt-4 border-t border-t-grey-400 text-grey-400 hover:text-purple-700 active:text-purple-800 hover:border-t-purple-700"> <a href="/blog/engineering/husky-query-architecture/" data-dd-action-name="toc-series: link: Inside Husky’s query engine: Real-time access to 100 trillion events" class="flex flex-col gap-1"> <span class="h5 uppercase">Part 4</span> <p class="font-bold font-national text-16 leading-20">Inside Husky’s query engine: Real-time access to 100 trillion events</p> </a> </li> </ul> </div> </nav> <div x-data="{ activeButton: null, cardVisible: true, headerText: 'Did you find this article helpful?' }" x-show="cardVisible" x-transition:leave="transition ease-out duration-500" x-transition:leave-start="opacity-100 transform scale-100" x-transition:leave-end="opacity-0 transform scale-95" class="article-feedback-card w-[-webkit-fill-available] desktop-sm:-ml-8 relative opacity-0 transition-opacity duration-500 ease-in-out mt-12"> <div class="absolute top-3 -right-6"> <button title="Close feedback prompt" aria-label="Close feedback prompt" data-dd-action-name="side-nav: card: close feedback prompt" x-on:click="cardVisible = false" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
"><span class="sr-only">Close feedback prompt</span><svg aria-hidden="true" focusable="false" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 fill-grey-400 hover:fill-purple-300 order-2 transition-default">
|
||
<path d="M7.6029 5.72327L5.71729 7.60889L24.3849 26.2765L26.2705 24.3909L7.6029 5.72327Z"></path>
|
||
<path d="M24.3849 5.7235L5.71729 24.3911L7.6029 26.2767L26.2705 7.60911L24.3849 5.7235Z"></path>
|
||
</svg></button> </div> <div class="flex flex-col gap-3 bg-white rounded shadow desktop-sm:p-9 desktop-sm:-mr-10"> <p x-text="headerText" class="p text-purple-neue italic">Did you find this article helpful?</p> <div class="article-feedback-button-container flex gap-4"> <button title="Article thumbs up" aria-label="Article thumbs up" data-dd-action-name="side-nav: card: article thumbs up" x-on:click="activeButton = 0; headerText = 'Thank you for your feedback'" x-bind:class="activeButton === 0 ? 'bg-purple-600 border-purple-600 [&_svg]:fill-white hover:bg-purple-600 cursor-default pointer-events-none' : ''" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
group p-2 rounded border border-grey-400 hover:bg-grey-200 active:bg-grey-400"><span class="sr-only">Article thumbs up</span><svg aria-hidden="true" focusable="false" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-black order-2 transition-default">
|
||
<g clip-path="url(#clip0_1206_6)">
|
||
<path d="M23.05 7.275C22.6625 6.7875 22.0875 6.5 21.475 6.5H14.7875L15.7875 2.4875C15.9375 1.8875 15.8 1.2625 15.425 0.775C15.0375 0.2875 14.4625 0 13.85 0H10.9875C10.2375 0 9.5625 0.4125 9.2125 1.075L6.3875 6.5H1.5V20.5H6H8H18.975C19.9 20.5 20.6875 19.875 20.9125 18.9875L23.4125 8.9875C23.5625 8.3875 23.425 7.7625 23.05 7.275ZM6 18.5H3.5V8.5H6V18.5ZM21.475 8.5L18.975 18.5H8V7.75L10.9875 2H13.85L12.225 8.5H21.475Z" fill=""></path>
|
||
</g>
|
||
<defs>
|
||
<clipPath id="clip0_1206_6">
|
||
<rect width="24" height="24" fill=""></rect>
|
||
</clipPath>
|
||
</defs>
|
||
</svg></button> <button title="Article thumbs down" aria-label="Article thumbs down" data-dd-action-name="side-nav: card: article thumbs down" x-on:click="activeButton = 1; headerText = 'Thank you for your feedback'" x-bind:class="activeButton === 1 ? 'bg-purple-600 border-purple-600 [&_svg]:fill-white hover:bg-purple-600 cursor-default pointer-events-none' : ''" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
group p-2 rounded border border-grey-400 hover:bg-grey-200 active:bg-grey-400"><span class="sr-only">Article thumbs down</span><svg aria-hidden="true" focusable="false" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-black order-2 transition-default">
|
||
<path d="M0.95 16.725C1.3375 17.2125 1.9125 17.5 2.525 17.5H9.2125L8.2125 21.5125C8.0625 22.1125 8.2 22.7375 8.575 23.225C8.9625 23.7125 9.5375 24 10.15 24H13.0125C13.7625 24 14.4375 23.5875 14.7875 22.925L17.6 17.5H22.5V3.5H18H16H5.025C4.1 3.5 3.3125 4.125 3.0875 5.0125L0.5875 15.0125C0.4375 15.6125 0.575 16.2375 0.95 16.725ZM18 5.5H20.5V15.5H18V5.5ZM2.525 15.5L5.025 5.5H16V16.25L13.0125 22H10.15L11.775 15.5H2.525Z" fill=""></path>
|
||
</svg></button> </div> </div> </div> </aside> <script type="module">const o=new IntersectionObserver(e=>{e.forEach(t=>{const n=t.target.getAttribute("id"),r=document.querySelector(`nav.toc li a[href="#${n}"]`);r&&t.isIntersecting&&(document.querySelectorAll("nav.toc li").forEach(c=>{c.classList.remove("active")}),r.parentElement.classList.add("active"))})},{root:null,rootMargin:"0px 0px -33% 0px",threshold:[1]});document.querySelectorAll(".article-content h1, .article-content h2, .article-content h3").forEach(e=>{o.observe(e)});</script><div class="further-reading-card border-2 border-purple-300 rounded-lg desktop-sm:mt-auto desktop-sm:p-9 desktop-sm:-mr-10 desktop-sm:-ml-8"> <p class="h5 uppercase"> Further reading </p> <div class="desktop-sm:mb-2"></div> <p class="h4 text-purple-600">Datadog Platform Datasheet</p> <div class="desktop-sm:mb-4"></div> <picture class> <source srcset="https://web-assets.dd-static.net/42588/1777497550-thumbnail-datadog-platform-datasheet_updated.png?format=auto&fit=bounds&quality=90&disable=upscale&width=276&dpr=1 1x, https://web-assets.dd-static.net/42588/1777497550-thumbnail-datadog-platform-datasheet_updated.png?format=auto&fit=bounds&quality=90&disable=upscale&width=276&dpr=1.5 1.5x, https://web-assets.dd-static.net/42588/1777497550-thumbnail-datadog-platform-datasheet_updated.png?format=auto&fit=bounds&quality=90&disable=upscale&width=276&dpr=2 2x, https://web-assets.dd-static.net/42588/1777497550-thumbnail-datadog-platform-datasheet_updated.png?format=auto&fit=bounds&quality=90&disable=upscale&width=276&dpr=2.5 2.5x, https://web-assets.dd-static.net/42588/1777497550-thumbnail-datadog-platform-datasheet_updated.png?format=auto&fit=bounds&quality=90&disable=upscale&width=276&dpr=3 3x, https://web-assets.dd-static.net/42588/1777497550-thumbnail-datadog-platform-datasheet_updated.png?format=auto&fit=bounds&quality=90&disable=upscale&width=276&dpr=3.5 3.5x, https://web-assets.dd-static.net/42588/1777497550-thumbnail-datadog-platform-datasheet_updated.png?format=auto&fit=bounds&quality=90&disable=upscale&width=276&dpr=4 4x"> <img src="https://web-assets.dd-static.net/42588/1777497550-thumbnail-datadog-platform-datasheet_updated.png?format=auto&fit=bounds&quality=90&disable=upscale&width=276&dpr=1" alt="Datadog Platform Datasheet" loading="lazy" fetchpriority="low" class="w-full"> </picture> <div class="desktop-sm:mb-4"></div> <p class="p-small">Learn about the key components, capabilities, and features of the Datadog platform.</p> <div class="desktop-sm:mb-6"></div> <a title="Download to learn more" aria-label="Download to learn more" href="https://www.datadoghq.com/resources/datadog-datasheet/?utm_source=inbound&utm_medium=corpsite-display&utm_campaign=dg-coreplatform-ww-blog-toc-datasheet-datadog" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
text-white bg-purple-neue hover:bg-purple-secondary active:bg-purple-neue rounded py-1.5 px-3 w-fit button-roboto-mono"><span class="block false">Download to learn more</span></a> </div></div></div><div class="print:hidden"><div class="desktop:mb-[120px] tablet:mb-24 mb-[72px]"></div><!-- Related Posts (client-side, fetched from Typesense) --><div id="related-posts" data-tags="["storage"]" data-current-id="/blog/engineering/husky-deep-dive/" data-lang="en" data-path-to-home="/blog/"></div> <script type="module" src="/blog/_astro/RelatedPosts.astro_astro_type_script_index_0_lang.jg5bITdA.js"></script><!-- Related Jobs --><div id="related-jobs-section" data-tags="["storage"]" data-related-job-ids="[]"> <div id="related-jobs-sentinel" class="h-px" aria-hidden="true"></div> <div id="related-jobs-content" class="hidden"> <div class="desktop-sm:mb-[76px] tablet:mb-15 mb-12"></div> <section class="container"> <h2 class="h1">Related jobs at Datadog</h2> <div class="desktop-sm:mb-4 tablet:mb-3 mb-2"></div> <h3 class="subheader3">We're always looking for talented people to collaborate with</h3> <div class="desktop-sm:mb-12 tablet:mb-9 mb-7"></div> <p class="p-small font-bold font-national uppercase">Featured positions</p> <div class="desktop-sm:mb-6 tablet:mb-5 mb-3"></div> <div id="related-jobs-table"> <table class="table job-listing w-full"> <tbody> </tbody> </table> </div> <div class="desktop-sm:mt-9 tablet:mb-7 mb-5"></div> <div class="flex flex-col"> <div id="total-jobs-count" class="hidden"> <p class="subheader3">
|
||
We have <span class="text-purple-neue" id="jobs-count"></span> positions
|
||
</p> <div class="desktop-sm:mb-6 tablet:mb-5 mb-3"></div> </div> <div id="view-all-button-container"> <button title="View all" aria-label="View all" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
|
||
text-purple-600 hover:bg-purple-200 active:bg-purple-400 rounded py-1.5 px-2.5 tablet:py-2 tablet:px-4 desktop-sm:py-2.5 desktop-sm:px-6 w-fit border-2 border-purple-60 button-text"><span class="block false">View all</span></button> </div> </div> </section> </div> </div> <script type="module" src="/blog/_astro/RelatedJobs.astro_astro_type_script_index_0_lang.Duc5wx_Q.js"></script><div class="desktop:mb-[76px] tablet:mb-[68px] mb-12"></div><div class="bg-gradient-to-r from-purple-600 from-0% to-purple-800 to-100%"> <div class="flex flex-col tablet:flex-row justify-between tablet:items-center gap-4 tablet:gap-0 py-7 px-4.5 tablet:py-9 tablet:px-[45px] desktop-sm:p-12 desktop-lg:px-14 desktop-lg:max-w-screen-desktop-lg mx-auto"> <h2 class="text-white font-bold font-national tracking-[-0.24px] tablet:tracking-[-0.28px] desktop-sm:tracking-[-0.34px] text-24 leading-24 tablet:text-28 tablet:leading-28 desktop-sm:text-34 desktop-sm:leading-34"> Start monitoring your metrics in minutes </h2> <button title="find out how" aria-label="find out how" class="flex items-center gap-1 tablet:gap-1.5 desktop-sm:gap-2 h-fit group
|
||
signup-trigger
|
||
bg-white text-purple-600 hover:bg-purple-200 active:bg-purple-400 rounded py-2 px-4 tablet:py-2.5 tablet:px-6 desktop-sm:py-3 desktop-sm:px-[26px] w-fit button-text"><span class="block false">find out how</span></button> </div> </div></div> </main> <div><html><head></head><body><footer x-data="{
|
||
openSection: 'resources',
|
||
desktop: true,
|
||
reactOnResize() {
|
||
if (window.innerWidth >= 992) {
|
||
this.desktop = true;
|
||
} else {
|
||
this.desktop = false;
|
||
}
|
||
}
|
||
}" x-init="reactOnResize()" @resize.window.throttle.200ms="reactOnResize()" class="bg-black"><div class="py-[30px] tablet:py-9 desktop-sm:pt-[50px] desktop-sm:pb-4"><div class="container desktop-sm:pb-[30px]"><div class="row grid grid-cols-12"><div class="order-1 col-span-12 px-[15px] desktop-sm:col-span-3"><a href="#" target="_blank" class="flex w-full items-center justify-center text-center rounded mb-5 px-4 py-[13px] bg-none border border-solid border-white text-white whitespace-nowrap desktop-sm:px-6 desktop-sm:py-4 desktop-sm:w-[165px] desktop-sm:mb-10 hover:bg-white hover:border-white hover:text-purple-600 focus:bg-white focus:border-white focus:text-purple-600 active:bg-white active:border-white active:text-purple-600 signup-trigger" data-event-category="Signup" data-event-action="Step 1 Footer Initiated" data-event-label="url path"><span class="uppercase font-semibold font-national text-[16px] leading-[16px] tracking-normal desktop-sm:text-[18px] desktop-sm:leading-[18px]">Free Trial</span></a><p class="download-app my-0 pb-2.5 text-center font-semibold font-national text-[#88838C] text-[16px] leading-[20px] desktop-sm:text-start">Download mobile app</p><div class="flex justify-center desktop-sm:justify-start desktop-sm:items-end"><a href="https://apps.apple.com/app/datadog/id1391380318" aria-label="Apple Store Link"><span class="inline-block mr-2.5 desktop-sm:hidden"><svg class="<nil>" width="135" height="40" viewBox="0 0 135 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<rect x="0.5" y="0.5" width="134" height="39" rx="4.5" fill="#110617" stroke="#979797"></rect>
|
||
<path d="M27.8389 19.3013C27.8496 18.4666 28.072 17.6483 28.4851 16.9223C28.8983 16.1964 29.4889 15.5864 30.202 15.1492C29.749 14.5041 29.1514 13.9731 28.4566 13.5986C27.7619 13.224 26.9891 13.0162 26.1997 12.9916C24.5157 12.8153 22.8832 13.9964 22.0251 13.9964C21.1504 13.9964 19.8292 13.0091 18.4064 13.0383C17.4862 13.0679 16.5893 13.3348 15.8033 13.8128C15.0172 14.2909 14.3687 14.9638 13.921 15.7661C11.9815 19.1145 13.4282 24.0356 15.286 26.7422C16.2155 28.0676 17.3018 29.548 18.7232 29.4955C20.1142 29.438 20.6337 28.611 22.3127 28.611C23.9761 28.611 24.4635 29.4955 25.9138 29.4621C27.4063 29.438 28.3467 28.1309 29.2436 26.793C29.9115 25.8486 30.4254 24.8049 30.7663 23.7005C29.8992 23.3347 29.1592 22.7226 28.6386 21.9403C28.118 21.158 27.8399 20.2402 27.8389 19.3013Z" fill="white"></path>
|
||
<path d="M25.0994 11.2113C25.9132 10.2371 26.3142 8.98494 26.2171 7.7207C24.9738 7.85092 23.8253 8.44348 23.0005 9.38031C22.5972 9.83798 22.2884 10.3704 22.0916 10.9472C21.8948 11.524 21.8139 12.1337 21.8536 12.7417C22.4754 12.7481 23.0907 12.6137 23.6529 12.3486C24.2151 12.0835 24.7097 11.6946 25.0994 11.2113Z" fill="white"></path>
|
||
<path d="M49.4215 26.1397H44.6748L43.5349 29.4961H41.5244L46.0204 17.0781H48.1093L52.6052 29.4961H50.5604L49.4215 26.1397ZM45.1664 24.5908H48.929L47.0742 19.1436H47.0223L45.1664 24.5908Z" fill="white"></path>
|
||
<path d="M62.315 24.9695C62.315 27.7829 60.8049 29.5905 58.5261 29.5905C57.9488 29.6207 57.3747 29.4881 56.8695 29.2079C56.3643 28.9278 55.9484 28.5114 55.6694 28.0065H55.6263V32.4909H53.7627V20.4421H55.5666V21.948H55.6009C55.8927 21.4455 56.3156 21.0313 56.8246 20.7495C57.3337 20.4676 57.9098 20.3287 58.4918 20.3474C60.796 20.3474 62.315 22.1638 62.315 24.9695ZM60.3995 24.9695C60.3995 23.1365 59.4495 21.9314 58.0002 21.9314C56.5763 21.9314 55.6185 23.1618 55.6185 24.9695C55.6185 26.7937 56.5763 28.0154 58.0002 28.0154C59.4495 28.0154 60.3995 26.8191 60.3995 24.9695Z" fill="white"></path>
|
||
<path d="M72.3081 24.9694C72.3081 27.7829 70.7981 29.5905 68.5192 29.5905C67.942 29.6206 67.3678 29.488 66.8626 29.2079C66.3574 28.9278 65.9415 28.5114 65.6626 28.0065H65.6195V32.4909H63.7559V20.4421H65.5597V21.948H65.594C65.8858 21.4455 66.3087 21.0313 66.8177 20.7495C67.3268 20.4676 67.903 20.3287 68.4849 20.3474C70.7892 20.3474 72.3081 22.1638 72.3081 24.9694ZM70.3926 24.9694C70.3926 23.1364 69.4427 21.9314 67.9933 21.9314C66.5694 21.9314 65.6117 23.1618 65.6117 24.9694C65.6117 26.7937 66.5694 28.0153 67.9933 28.0153C69.4427 28.0153 70.3926 26.8191 70.3926 24.9694H70.3926Z" fill="white"></path>
|
||
<path d="M78.9126 26.0362C79.0507 27.2676 80.2503 28.0762 81.8897 28.0762C83.4605 28.0762 84.5906 27.2676 84.5906 26.1572C84.5906 25.1934 83.909 24.6162 82.2951 24.2207L80.6812 23.833C78.3946 23.2822 77.333 22.2158 77.333 20.4854C77.333 18.3428 79.2054 16.8711 81.8642 16.8711C84.4956 16.8711 86.2995 18.3428 86.3602 20.4854H84.4789C84.3663 19.2461 83.339 18.4981 81.8378 18.4981C80.3365 18.4981 79.3092 19.2549 79.3092 20.3565C79.3092 21.2344 79.9653 21.751 81.5704 22.1465L82.9424 22.4824C85.4974 23.0849 86.559 24.1084 86.559 25.9248C86.559 28.248 84.7032 29.7031 81.7516 29.7031C78.9899 29.7031 77.1253 28.2822 77.0049 26.0361L78.9126 26.0362Z" fill="white"></path>
|
||
<path d="M90.5802 18.2998V20.4424H92.3067V21.9141H90.5802V26.9053C90.5802 27.6807 90.9259 28.042 91.6849 28.042C91.8898 28.0384 92.0945 28.0241 92.2979 27.999V29.4619C91.9567 29.5255 91.6099 29.5543 91.2628 29.5478C89.4246 29.5478 88.7078 28.8593 88.7078 27.1035V21.9141H87.3877V20.4424H88.7078V18.2998H90.5802Z" fill="white"></path>
|
||
<path d="M93.3066 24.9697C93.3066 22.1211 94.9891 20.3311 97.6126 20.3311C100.245 20.3311 101.92 22.1211 101.92 24.9697C101.92 27.8262 100.254 29.6084 97.6126 29.6084C94.9724 29.6084 93.3066 27.8262 93.3066 24.9697ZM100.021 24.9697C100.021 23.0156 99.1227 21.8623 97.6126 21.8623C96.1025 21.8623 95.2055 23.0244 95.2055 24.9697C95.2055 26.9316 96.1025 28.0762 97.6126 28.0762C99.1227 28.0762 100.021 26.9316 100.021 24.9697H100.021Z" fill="white"></path>
|
||
<path d="M103.457 20.442H105.234V21.983H105.278C105.398 21.5017 105.681 21.0764 106.078 20.7785C106.476 20.4806 106.964 20.3284 107.461 20.3473C107.676 20.3465 107.89 20.3698 108.1 20.4166V22.1549C107.829 22.0723 107.546 22.0343 107.263 22.0426C106.992 22.0316 106.722 22.0792 106.471 22.1821C106.221 22.285 105.996 22.4408 105.811 22.6386C105.627 22.8365 105.487 23.0719 105.403 23.3286C105.318 23.5852 105.29 23.8571 105.321 24.1256V29.4957H103.457L103.457 20.442Z" fill="white"></path>
|
||
<path d="M116.692 26.8369C116.441 28.4805 114.836 29.6084 112.782 29.6084C110.141 29.6084 108.502 27.8437 108.502 25.0127C108.502 22.1729 110.15 20.3311 112.704 20.3311C115.216 20.3311 116.796 22.0518 116.796 24.7969V25.4336H110.383V25.5459C110.354 25.8791 110.395 26.2148 110.506 26.5306C110.616 26.8464 110.793 27.1352 111.024 27.3778C111.255 27.6203 111.535 27.8111 111.846 27.9374C112.156 28.0637 112.49 28.1226 112.826 28.1103C113.266 28.1515 113.708 28.0498 114.086 27.8203C114.463 27.5909 114.757 27.246 114.922 26.8369L116.692 26.8369ZM110.392 24.1348H114.931C114.948 23.8352 114.902 23.5354 114.797 23.2541C114.692 22.9729 114.53 22.7164 114.321 22.5006C114.112 22.2849 113.86 22.1145 113.582 22.0003C113.304 21.8861 113.005 21.8305 112.704 21.8369C112.401 21.8351 112.1 21.8933 111.819 22.008C111.538 22.1227 111.283 22.2918 111.068 22.5054C110.853 22.7191 110.683 22.973 110.567 23.2527C110.451 23.5323 110.391 23.8321 110.392 24.1348V24.1348Z" fill="white"></path>
|
||
<path d="M44.9328 8.73138C45.3235 8.70342 45.7156 8.76228 46.0807 8.90371C46.4458 9.04515 46.7749 9.26563 47.0443 9.54925C47.3136 9.83288 47.5165 10.1726 47.6382 10.5438C47.76 10.9151 47.7976 11.3087 47.7483 11.6962C47.7483 13.6025 46.7151 14.6982 44.9328 14.6982H42.7715V8.73138H44.9328ZM43.7008 13.8544H44.829C45.1082 13.871 45.3876 13.8254 45.6468 13.7208C45.9061 13.6161 46.1387 13.4552 46.3277 13.2496C46.5168 13.0441 46.6574 12.7991 46.7395 12.5324C46.8216 12.2658 46.8431 11.9843 46.8023 11.7084C46.8401 11.4335 46.8165 11.1538 46.7331 10.8891C46.6498 10.6244 46.5088 10.3814 46.3202 10.1775C46.1316 9.97358 45.9001 9.81378 45.6423 9.70954C45.3845 9.6053 45.1068 9.55922 44.829 9.57459H43.7008V13.8544Z" fill="white"></path>
|
||
<path d="M48.7982 12.4448C48.7698 12.1489 48.8037 11.8503 48.8978 11.5682C48.9919 11.2862 49.1441 11.0268 49.3446 10.8068C49.5451 10.5868 49.7895 10.4111 50.0621 10.2908C50.3347 10.1705 50.6296 10.1084 50.9277 10.1084C51.2258 10.1084 51.5206 10.1705 51.7932 10.2908C52.0658 10.4111 52.3102 10.5868 52.5107 10.8068C52.7112 11.0268 52.8634 11.2862 52.9575 11.5682C53.0516 11.8503 53.0855 12.1489 53.0572 12.4448C53.0861 12.741 53.0525 13.04 52.9587 13.3225C52.8648 13.605 52.7127 13.8648 52.5122 14.0853C52.3116 14.3057 52.067 14.4818 51.7942 14.6023C51.5213 14.7229 51.2261 14.7851 50.9277 14.7851C50.6292 14.7851 50.334 14.7229 50.0612 14.6023C49.7883 14.4818 49.5437 14.3057 49.3431 14.0853C49.1426 13.8648 48.9905 13.605 48.8966 13.3225C48.8028 13.04 48.7692 12.741 48.7982 12.4448ZM52.1405 12.4448C52.1405 11.4687 51.7008 10.8979 50.9291 10.8979C50.1545 10.8979 49.7187 11.4687 49.7187 12.4448C49.7187 13.4287 50.1545 13.9951 50.9291 13.9951C51.7008 13.9951 52.1405 13.4248 52.1405 12.4448H52.1405Z" fill="white"></path>
|
||
<path d="M58.7181 14.6982H57.7937L56.8604 11.3818H56.7899L55.8605 14.6982H54.9449L53.7002 10.1953H54.6041L55.413 13.6313H55.4796L56.408 10.1953H57.2629L58.1913 13.6313H58.2618L59.0668 10.1953H59.9579L58.7181 14.6982Z" fill="white"></path>
|
||
<path d="M61.0049 10.1949H61.8628V10.9102H61.9293C62.0423 10.6533 62.2329 10.4379 62.4744 10.2941C62.716 10.1503 62.9965 10.0852 63.2769 10.1079C63.4966 10.0915 63.7172 10.1245 63.9224 10.2046C64.1275 10.2847 64.312 10.4098 64.4621 10.5707C64.6122 10.7315 64.7241 10.924 64.7895 11.1338C64.8549 11.3436 64.8721 11.5654 64.8398 11.7827V14.6977H63.9487V12.0059C63.9487 11.2823 63.6333 10.9224 62.9743 10.9224C62.8251 10.9155 62.6762 10.9408 62.5377 10.9966C62.3993 11.0525 62.2746 11.1375 62.1722 11.2459C62.0698 11.3543 61.9921 11.4834 61.9444 11.6246C61.8967 11.7657 61.8802 11.9154 61.896 12.0635V14.6978H61.0049L61.0049 10.1949Z" fill="white"></path>
|
||
<path d="M66.2598 8.4375H67.1509V14.6982H66.2598V8.4375Z" fill="white"></path>
|
||
<path d="M68.3899 12.4449C68.3616 12.1489 68.3955 11.8503 68.4897 11.5683C68.5838 11.2862 68.736 11.0268 68.9365 10.8068C69.137 10.5869 69.3815 10.4111 69.6541 10.2908C69.9267 10.1705 70.2216 10.1084 70.5197 10.1084C70.8178 10.1084 71.1126 10.1705 71.3853 10.2908C71.6579 10.4111 71.9023 10.5869 72.1028 10.8068C72.3034 11.0268 72.4556 11.2862 72.5497 11.5683C72.6438 11.8503 72.6778 12.1489 72.6494 12.4449C72.6783 12.7411 72.6447 13.0401 72.5508 13.3226C72.457 13.6051 72.3048 13.8649 72.1043 14.0853C71.9037 14.3058 71.6591 14.4819 71.3862 14.6024C71.1133 14.7229 70.8181 14.7852 70.5197 14.7852C70.2212 14.7852 69.926 14.7229 69.6531 14.6024C69.3802 14.4819 69.1356 14.3058 68.9351 14.0853C68.7345 13.8649 68.5824 13.6051 68.4885 13.3226C68.3946 13.0401 68.361 12.7411 68.3899 12.4449ZM71.7323 12.4449C71.7323 11.4688 71.2926 10.898 70.5209 10.898C69.7463 10.898 69.3105 11.4688 69.3105 12.4449C69.3105 13.4288 69.7463 13.9952 70.5209 13.9952C71.2926 13.9952 71.7323 13.4248 71.7323 12.4449H71.7323Z" fill="white"></path>
|
||
<path d="M73.5879 13.4248C73.5879 12.6142 74.1931 12.147 75.2674 12.0806L76.4906 12.0102V11.6216C76.4906 11.146 76.1752 10.8774 75.5661 10.8774C75.0686 10.8774 74.7239 11.0596 74.625 11.3779H73.7622C73.8533 10.6045 74.5829 10.1084 75.6072 10.1084C76.7393 10.1084 77.3778 10.6704 77.3778 11.6216V14.6982H76.5199V14.0654H76.4494C76.3063 14.2924 76.1053 14.4775 75.867 14.6017C75.6288 14.7259 75.3617 14.7848 75.0931 14.7724C74.9035 14.7921 74.7119 14.7719 74.5307 14.7132C74.3494 14.6545 74.1825 14.5586 74.0407 14.4316C73.8988 14.3047 73.7853 14.1495 73.7073 13.9761C73.6293 13.8026 73.5886 13.6149 73.5879 13.4248ZM76.4906 13.04V12.6636L75.3879 12.7339C74.766 12.7754 74.4839 12.9863 74.4839 13.3833C74.4839 13.7886 74.8365 14.0244 75.3213 14.0244C75.4633 14.0387 75.6068 14.0244 75.7432 13.9823C75.8796 13.9403 76.0061 13.8712 76.1152 13.7794C76.2243 13.6876 76.3137 13.5748 76.3782 13.4477C76.4427 13.3207 76.4809 13.1821 76.4906 13.04Z" fill="white"></path>
|
||
<path d="M78.5488 12.4448C78.5488 11.022 79.2823 10.1206 80.4232 10.1206C80.7054 10.1077 80.9855 10.1751 81.2307 10.315C81.4759 10.4548 81.6761 10.6615 81.808 10.9106H81.8746V8.4375H82.7657V14.6982H81.9118V13.9868H81.8413C81.6993 14.2343 81.4921 14.4383 81.2421 14.5768C80.9922 14.7153 80.709 14.783 80.4232 14.7724C79.2745 14.7725 78.5488 13.8711 78.5488 12.4448ZM79.4694 12.4448C79.4694 13.3999 79.9209 13.9746 80.6759 13.9746C81.427 13.9746 81.8912 13.3916 81.8912 12.4487C81.8912 11.5103 81.4221 10.919 80.6759 10.919C79.9257 10.919 79.4694 11.4976 79.4694 12.4448H79.4694Z" fill="white"></path>
|
||
<path d="M86.4525 12.4448C86.4241 12.1489 86.458 11.8503 86.5521 11.5682C86.6462 11.2862 86.7984 11.0268 86.9989 10.8068C87.1994 10.5868 87.4438 10.4111 87.7164 10.2908C87.989 10.1705 88.2838 10.1084 88.582 10.1084C88.8801 10.1084 89.1749 10.1705 89.4475 10.2908C89.7201 10.4111 89.9645 10.5868 90.165 10.8068C90.3655 11.0268 90.5177 11.2862 90.6118 11.5682C90.7059 11.8503 90.7398 12.1489 90.7114 12.4448C90.7404 12.741 90.7068 13.04 90.613 13.3225C90.5191 13.605 90.367 13.8648 90.1665 14.0853C89.9659 14.3057 89.7213 14.4818 89.4485 14.6023C89.1756 14.7229 88.8804 14.7851 88.582 14.7851C88.2835 14.7851 87.9883 14.7229 87.7154 14.6023C87.4426 14.4818 87.198 14.3057 86.9974 14.0853C86.7969 13.8648 86.6448 13.605 86.5509 13.3225C86.4571 13.04 86.4235 12.741 86.4525 12.4448ZM89.7948 12.4448C89.7948 11.4687 89.3551 10.8979 88.5834 10.8979C87.8088 10.8979 87.373 11.4687 87.373 12.4448C87.373 13.4287 87.8088 13.9951 88.5834 13.9951C89.3551 13.9951 89.7948 13.4248 89.7948 12.4448Z" fill="white"></path>
|
||
<path d="M91.9072 10.1949H92.7651V10.9102H92.8317C92.9447 10.6533 93.1352 10.4379 93.3768 10.2941C93.6183 10.1503 93.8988 10.0852 94.1792 10.1079C94.3989 10.0915 94.6196 10.1245 94.8247 10.2046C95.0299 10.2847 95.2144 10.4098 95.3645 10.5707C95.5146 10.7315 95.6265 10.924 95.6919 11.1338C95.7572 11.3436 95.7744 11.5654 95.7422 11.7827V14.6977H94.851V12.0059C94.851 11.2823 94.5357 10.9224 93.8766 10.9224C93.7274 10.9155 93.5785 10.9408 93.4401 10.9966C93.3016 11.0525 93.1769 11.1375 93.0745 11.2459C92.9721 11.3543 92.8944 11.4834 92.8467 11.6246C92.7991 11.7657 92.7826 11.9154 92.7984 12.0635V14.6978H91.9072V10.1949Z" fill="white"></path>
|
||
<path d="M100.778 9.07422V10.2158H101.756V10.9644H100.778V13.2798C100.778 13.7515 100.973 13.958 101.416 13.958C101.53 13.9576 101.643 13.9508 101.756 13.9375V14.6777C101.596 14.7063 101.434 14.7215 101.272 14.7231C100.28 14.7231 99.8858 14.3755 99.8858 13.5073V10.9643H99.1689V10.2158H99.8858V9.07422H100.778Z" fill="white"></path>
|
||
<path d="M102.974 8.4375H103.857V10.919H103.927C104.046 10.6596 104.242 10.443 104.488 10.2987C104.734 10.1543 105.019 10.0893 105.304 10.1123C105.523 10.1004 105.741 10.1368 105.944 10.2189C106.147 10.3009 106.329 10.4266 106.478 10.5869C106.626 10.7473 106.738 10.9383 106.804 11.1465C106.87 11.3546 106.889 11.5747 106.859 11.791V14.6982H105.967V12.0103C105.967 11.291 105.631 10.9268 105.002 10.9268C104.849 10.9142 104.695 10.9352 104.55 10.9883C104.406 11.0413 104.275 11.1252 104.167 11.2339C104.059 11.3426 103.976 11.4737 103.923 11.6178C103.871 11.7619 103.851 11.9157 103.865 12.0683V14.6982H102.974L102.974 8.4375Z" fill="white"></path>
|
||
<path d="M112.056 13.4825C111.935 13.894 111.673 14.25 111.315 14.4882C110.957 14.7263 110.527 14.8315 110.099 14.7852C109.802 14.7931 109.506 14.7362 109.233 14.6187C108.96 14.5012 108.715 14.3258 108.517 14.1046C108.318 13.8835 108.171 13.6219 108.084 13.3381C107.997 13.0543 107.973 12.755 108.013 12.461C107.974 12.1661 107.998 11.8662 108.085 11.5815C108.172 11.2969 108.319 11.0341 108.516 10.811C108.714 10.5879 108.957 10.4098 109.229 10.2886C109.502 10.1674 109.797 10.1059 110.095 10.1085C111.352 10.1085 112.11 10.9645 112.11 12.3785V12.6886H108.921V12.7384C108.907 12.9036 108.928 13.0699 108.982 13.2267C109.037 13.3834 109.123 13.5271 109.236 13.6486C109.35 13.7701 109.487 13.8666 109.64 13.932C109.793 13.9974 109.958 14.0302 110.124 14.0284C110.337 14.0539 110.553 14.0156 110.744 13.9184C110.936 13.8212 111.094 13.6694 111.198 13.4825L112.056 13.4825ZM108.921 12.0313H111.202C111.213 11.8802 111.193 11.7284 111.142 11.5857C111.09 11.443 111.01 11.3125 110.905 11.2026C110.801 11.0928 110.674 11.006 110.534 10.9478C110.393 10.8896 110.242 10.8613 110.09 10.8648C109.936 10.8629 109.783 10.8917 109.641 10.9497C109.498 11.0076 109.368 11.0935 109.259 11.2022C109.15 11.3109 109.064 11.4403 109.006 11.5827C108.948 11.7251 108.919 11.8776 108.921 12.0313H108.921Z" fill="white"></path>
|
||
</svg>
|
||
</span><span class="hidden mr-5 desktop-sm:inline-block"><svg class="<nil>" width="26" height="31" viewBox="0 0 26 31" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M20.8866 16.3001C20.9017 15.1253 21.2147 13.9734 21.7962 12.9516C22.3778 11.9297 23.2091 11.0712 24.2129 10.4559C23.5752 9.54776 22.734 8.80043 21.7561 8.27322C20.7782 7.74602 19.6904 7.45346 18.5793 7.4188C16.209 7.1707 13.9112 8.83315 12.7033 8.83315C11.4721 8.83315 9.61244 7.44343 7.60989 7.48452C6.31458 7.52625 5.05221 7.90186 3.94575 8.57475C2.8393 9.24765 1.92651 10.1949 1.29632 11.3242C-1.43354 16.0372 0.602689 22.9639 3.21767 26.7736C4.52599 28.6391 6.05506 30.723 8.0558 30.6491C10.0136 30.5681 10.7449 29.4041 13.1082 29.4041C15.4495 29.4041 16.1355 30.6491 18.1769 30.6021C20.2778 30.5681 21.6014 28.7283 22.8638 26.8451C23.8039 25.5159 24.5272 24.0468 25.0071 22.4922C23.7865 21.9774 22.745 21.1158 22.0122 20.0146C21.2795 18.9135 20.888 17.6216 20.8866 16.3001Z" fill="white"></path>
|
||
<path d="M17.0298 4.91325C18.1753 3.542 18.7396 1.77948 18.603 0C16.8529 0.183293 15.2364 1.01735 14.0754 2.336C13.5078 2.98019 13.0731 3.72962 12.7961 4.54146C12.5191 5.3533 12.4052 6.21162 12.4611 7.06735C13.3364 7.07634 14.2024 6.88714 14.9938 6.51402C15.7851 6.14089 16.4813 5.59356 17.0298 4.91325Z" fill="white"></path>
|
||
</svg>
|
||
</span></a><a href="https://play.google.com/store/apps/details?id=com.datadog.app" aria-label="Google Play Store Link"><span class="inline-block desktop-sm:hidden"><svg class="<nil>" width="135" height="40" viewBox="0 0 135 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<rect x="0.5" y="0.5" width="134" height="39" rx="4.5" fill="#110617" stroke="#979797"></rect>
|
||
<path d="M47.4196 10.24C47.436 10.6067 47.3781 10.973 47.2492 11.3167C47.1203 11.6604 46.9231 11.9745 46.6696 12.24C46.3855 12.5333 46.0427 12.7633 45.6636 12.9149C45.2845 13.0666 44.8776 13.1364 44.4696 13.12C44.0593 13.1291 43.6514 13.054 43.2713 12.8992C42.8912 12.7444 42.5468 12.5132 42.2596 12.22C41.9633 11.9325 41.7296 11.5869 41.573 11.2049C41.4164 10.8229 41.3404 10.4127 41.3496 9.99997C41.339 9.58557 41.4144 9.17346 41.571 8.78964C41.7276 8.40583 41.9621 8.05864 42.2596 7.76997C42.7051 7.33466 43.2693 7.04071 43.8814 6.92506C44.4934 6.80942 45.126 6.87723 45.6996 7.11997C46.0602 7.26821 46.3819 7.49746 46.6396 7.78997L46.1096 8.31997C45.911 8.08075 45.6594 7.89111 45.3747 7.76613C45.09 7.64114 44.7801 7.58425 44.4696 7.59997C44.1573 7.59844 43.8478 7.66 43.5598 7.78096C43.2718 7.90193 43.0112 8.0798 42.7937 8.30391C42.5761 8.52803 42.406 8.79378 42.2936 9.08522C42.1812 9.37666 42.1288 9.6878 42.1396 9.99997C42.1331 10.4661 42.2647 10.9237 42.518 11.3151C42.7712 11.7065 43.1347 12.0142 43.5626 12.1992C43.9904 12.3843 44.4635 12.4385 44.9222 12.355C45.3808 12.2715 45.8044 12.054 46.1396 11.73C46.448 11.396 46.6286 10.964 46.6496 10.51H44.4696V9.78997H47.3796C47.402 9.93903 47.4153 10.0893 47.4196 10.24Z" fill="white" stroke="white" stroke-width="0.2" stroke-miterlimit="10"></path>
|
||
<path d="M51.9995 7.74H49.2995V9.64H51.7595V10.36H49.2995V12.26H51.9995V13H48.5195V7H51.9995V7.74Z" fill="white" stroke="white" stroke-width="0.2" stroke-miterlimit="10"></path>
|
||
<path d="M55.2801 13H54.5101V7.74H52.8301V7H57.0001V7.74H55.2801V13Z" fill="white" stroke="white" stroke-width="0.2" stroke-miterlimit="10"></path>
|
||
<path d="M59.9395 13V7H60.7095V13H59.9395Z" fill="white" stroke="white" stroke-width="0.2" stroke-miterlimit="10"></path>
|
||
<path d="M64.1297 13H63.3597V7.74H61.6797V7H65.7997V7.74H64.1297V13Z" fill="white" stroke="white" stroke-width="0.2" stroke-miterlimit="10"></path>
|
||
<path d="M73.6097 12.2201C73.3208 12.5092 72.9779 12.7385 72.6004 12.895C72.2229 13.0514 71.8183 13.1319 71.4097 13.1319C71.001 13.1319 70.5964 13.0514 70.2189 12.895C69.8414 12.7385 69.4985 12.5092 69.2097 12.2201C68.9188 11.9301 68.6906 11.5834 68.5392 11.2015C68.3879 10.8196 68.3165 10.4107 68.3297 10.0001C68.3165 9.58957 68.3879 9.18068 68.5392 8.79881C68.6906 8.41694 68.9188 8.07022 69.2097 7.78014C69.4923 7.48294 69.8341 7.24838 70.2131 7.09162C70.592 6.93487 70.9997 6.85941 71.4097 6.87014C71.8191 6.86367 72.2254 6.94106 72.6038 7.09756C72.9821 7.25407 73.3245 7.48636 73.6097 7.78014C73.8972 8.07263 74.1232 8.41978 74.2744 8.80107C74.4255 9.18237 74.4987 9.59008 74.4897 10.0001C74.5028 10.4107 74.4314 10.8196 74.2801 11.2015C74.1287 11.5834 73.9005 11.9301 73.6097 12.2201ZM69.7797 11.7201C69.9927 11.936 70.2465 12.1074 70.5263 12.2244C70.8061 12.3414 71.1064 12.4017 71.4097 12.4017C71.7129 12.4017 72.0132 12.3414 72.293 12.2244C72.5728 12.1074 72.8266 11.936 73.0397 11.7201C73.2612 11.4932 73.4347 11.2239 73.5498 10.9284C73.6649 10.6328 73.7193 10.3171 73.7097 10.0001C73.7141 9.6803 73.6534 9.36289 73.5313 9.06721C73.4093 8.77154 73.2284 8.50376 72.9997 8.28014C72.7866 8.06427 72.5328 7.89286 72.253 7.77586C71.9732 7.65887 71.6729 7.59862 71.3697 7.59862C71.0664 7.59862 70.7661 7.65887 70.4863 7.77586C70.2065 7.89286 69.9527 8.06427 69.7397 8.28014C69.5253 8.51038 69.3592 8.78115 69.251 9.07653C69.1428 9.37191 69.0947 9.68593 69.1097 10.0001C69.1 10.3171 69.1544 10.6328 69.2695 10.9284C69.3846 11.2239 69.5581 11.4932 69.7797 11.7201Z" fill="white" stroke="white" stroke-width="0.2" stroke-miterlimit="10"></path>
|
||
<path d="M75.5801 13V7H76.5101L79.4301 11.67V10.51V7H80.2001V13H79.4001L76.3501 8.11V9.26V13H75.5801Z" fill="white" stroke="white" stroke-width="0.2" stroke-miterlimit="10"></path>
|
||
<path d="M68.1401 21.7499C67.2976 21.7519 66.4745 22.0037 65.7751 22.4734C65.0756 22.9432 64.5312 23.6098 64.2106 24.3889C63.89 25.1681 63.8076 26.0248 63.9739 26.8508C64.1402 27.6768 64.5477 28.4349 65.1449 29.0292C65.7421 29.6236 66.5021 30.0276 67.3288 30.19C68.1556 30.3524 69.0119 30.2661 69.7896 29.9418C70.5672 29.6175 71.2313 29.07 71.6977 28.3683C72.1642 27.6667 72.4121 26.8425 72.4101 25.9999C72.4183 25.4379 72.3132 24.8799 72.1013 24.3593C71.8893 23.8386 71.5748 23.366 71.1764 22.9694C70.7779 22.5729 70.3038 22.2606 69.7822 22.051C69.2606 21.8415 68.7021 21.7391 68.1401 21.7499ZM68.1401 28.5799C67.6237 28.616 67.1083 28.496 66.6611 28.2353C66.2138 27.9747 65.8553 27.5855 65.6321 27.1184C65.409 26.6512 65.3315 26.1278 65.4098 25.6161C65.4881 25.1043 65.7185 24.628 66.0711 24.249C66.4237 23.8699 66.8821 23.6057 67.3869 23.4907C67.8916 23.3757 68.4193 23.4152 68.9013 23.604C69.3833 23.7929 69.7973 24.1223 70.0896 24.5496C70.3819 24.9769 70.5388 25.4822 70.5401 25.9999C70.5562 26.3279 70.5065 26.6559 70.3938 26.9643C70.2812 27.2728 70.1079 27.5556 69.8842 27.7961C69.6606 28.0366 69.391 28.2298 69.0914 28.3644C68.7919 28.499 68.4684 28.5723 68.1401 28.5799ZM58.8201 21.7499C57.9776 21.7519 57.1545 22.0037 56.4551 22.4734C55.7556 22.9432 55.2112 23.6098 54.8906 24.3889C54.57 25.1681 54.4876 26.0248 54.6539 26.8508C54.8202 27.6768 55.2277 28.4349 55.8249 29.0292C56.4221 29.6236 57.1821 30.0276 58.0088 30.19C58.8356 30.3524 59.6919 30.2661 60.4696 29.9418C61.2472 29.6175 61.9113 29.07 62.3777 28.3683C62.8442 27.6667 63.0921 26.8425 63.0901 25.9999C63.0983 25.4379 62.9932 24.8799 62.7813 24.3593C62.5693 23.8386 62.2548 23.366 61.8564 22.9694C61.4579 22.5729 60.9838 22.2606 60.4622 22.051C59.9406 21.8415 59.3821 21.7391 58.8201 21.7499ZM58.8201 28.5799C58.3037 28.616 57.7883 28.496 57.3411 28.2353C56.8938 27.9747 56.5353 27.5855 56.3121 27.1184C56.089 26.6512 56.0115 26.1278 56.0898 25.6161C56.1681 25.1043 56.3985 24.628 56.7511 24.249C57.1037 23.8699 57.5621 23.6057 58.0669 23.4907C58.5716 23.3757 59.0993 23.4152 59.5813 23.604C60.0633 23.7929 60.4773 24.1223 60.7696 24.5496C61.0619 24.9769 61.2188 25.4822 61.2201 25.9999C61.2362 26.3279 61.1865 26.6559 61.0738 26.9643C60.9612 27.2728 60.7879 27.5556 60.5642 27.7961C60.3406 28.0366 60.071 28.2298 59.7714 28.3644C59.4719 28.499 59.1484 28.5723 58.8201 28.5799ZM47.7401 23.0599V24.8599H52.0601C51.9924 25.7077 51.6399 26.5077 51.0601 27.1299C50.6268 27.5714 50.1056 27.9171 49.5302 28.1444C48.9549 28.3718 48.3382 28.4759 47.7201 28.4499C46.4471 28.4499 45.2262 27.9442 44.326 27.044C43.4258 26.1439 42.9201 24.923 42.9201 23.6499C42.9201 22.3769 43.4258 21.156 44.326 20.2558C45.2262 19.3556 46.4471 18.8499 47.7201 18.8499C48.9405 18.8318 50.119 19.2952 51.0001 20.1399L52.2701 18.8699C51.6741 18.2804 50.9664 17.8158 50.1886 17.5033C49.4107 17.1908 48.5783 17.0366 47.7401 17.0499C46.8511 17.0153 45.9643 17.1605 45.1327 17.4769C44.3012 17.7932 43.5421 18.2742 42.9009 18.8909C42.2596 19.5077 41.7495 20.2475 41.4011 21.0661C41.0527 21.8847 40.873 22.7652 40.873 23.6549C40.873 24.5446 41.0527 25.4251 41.4011 26.2437C41.7495 27.0623 42.2596 27.8022 42.9009 28.4189C43.5421 29.0357 44.3012 29.5166 45.1327 29.833C45.9643 30.1493 46.8511 30.2945 47.7401 30.2599C48.5955 30.2941 49.4485 30.1469 50.243 29.8281C51.0375 29.5092 51.7556 29.0259 52.3501 28.4099C53.4002 27.2563 53.9598 25.7391 53.9101 24.1799C53.9137 23.8046 53.8836 23.4298 53.8201 23.0599H47.7401ZM93.0501 24.4599C92.7893 23.6927 92.3016 23.0227 91.6516 22.5388C91.0016 22.0548 90.2199 21.7797 89.4101 21.7499C88.8631 21.7489 88.3217 21.86 87.8193 22.0765C87.317 22.2929 86.8644 22.6101 86.4895 23.0085C86.1146 23.4068 85.8254 23.8778 85.6397 24.3923C85.4541 24.9068 85.3759 25.454 85.4101 25.9999C85.4016 26.9128 85.6885 27.8039 86.2282 28.5402C86.7679 29.2765 87.5313 29.8184 88.4044 30.0851C89.2774 30.3517 90.2134 30.3288 91.0723 30.0196C91.9313 29.7105 92.6672 29.1318 93.1701 28.3699L91.7201 27.3699C91.5039 27.7302 91.1974 28.0277 90.8307 28.2329C90.4641 28.4382 90.0502 28.544 89.6301 28.5399C89.1967 28.5578 88.768 28.4442 88.4003 28.214C88.0327 27.9837 87.7432 27.6477 87.5701 27.2499L93.2601 24.8999L93.0501 24.4599ZM87.2501 25.8799C87.2298 25.5698 87.2718 25.2588 87.3736 24.9651C87.4753 24.6715 87.6348 24.4012 87.8426 24.1701C88.0504 23.939 88.3023 23.7518 88.5835 23.6195C88.8647 23.4873 89.1696 23.4126 89.4801 23.3999C89.8012 23.3794 90.1213 23.4537 90.4005 23.6138C90.6796 23.7738 90.9056 24.0124 91.0501 24.2999L87.2501 25.8799ZM82.6301 29.9999H84.5001V17.4999H82.6301V29.9999ZM79.5701 22.6999H79.5001C79.2162 22.3909 78.8694 22.1462 78.483 21.9823C78.0966 21.8185 77.6796 21.7392 77.2601 21.7499C76.1673 21.8029 75.1367 22.2743 74.3821 23.0665C73.6274 23.8587 73.2064 24.9108 73.2064 26.0049C73.2064 27.099 73.6274 28.1512 74.3821 28.9433C75.1367 29.7355 76.1673 30.2069 77.2601 30.2599C77.6841 30.2684 78.1047 30.1832 78.4919 30.0103C78.8791 29.8375 79.2234 29.5812 79.5001 29.2599H79.5701V29.8699C79.5701 31.4999 78.7001 32.3699 77.3001 32.3699C76.8324 32.3596 76.3783 32.2106 75.9955 31.9418C75.6127 31.6729 75.3185 31.2964 75.1501 30.8599L73.5301 31.5299C73.8296 32.2822 74.3504 32.9258 75.0235 33.3758C75.6966 33.8257 76.4905 34.0608 77.3001 34.0499C79.4901 34.0499 81.3001 32.7599 81.3001 29.6199V21.9999H79.5701V22.6999ZM77.4201 28.5799C76.7649 28.5391 76.1499 28.25 75.7004 27.7716C75.2509 27.2932 75.0006 26.6614 75.0006 26.0049C75.0006 25.3485 75.2509 24.7167 75.7004 24.2383C76.1499 23.7598 76.7649 23.4708 77.4201 23.4299C77.7403 23.4437 78.0545 23.5218 78.344 23.6596C78.6334 23.7973 78.8922 23.9918 79.1049 24.2316C79.3176 24.4714 79.4799 24.7515 79.5822 25.0553C79.6844 25.3591 79.7245 25.6803 79.7001 25.9999C79.7274 26.3206 79.6893 26.6435 79.5883 26.9491C79.4872 27.2546 79.3252 27.5365 79.1121 27.7777C78.8989 28.0189 78.6391 28.2143 78.3483 28.3522C78.0575 28.4901 77.7417 28.5676 77.4201 28.5799ZM101.81 17.4999H97.3301V29.9999H99.2001V25.2599H101.81C102.343 25.2982 102.878 25.2263 103.382 25.0486C103.886 24.871 104.348 24.5915 104.739 24.2274C105.13 23.8634 105.442 23.4227 105.655 22.9328C105.869 22.4428 105.979 21.9142 105.979 21.3799C105.979 20.8456 105.869 20.317 105.655 19.8271C105.442 19.3372 105.13 18.8965 104.739 18.5324C104.348 18.1684 103.886 17.8888 103.382 17.7112C102.878 17.5336 102.343 17.4616 101.81 17.4999ZM101.81 23.4999H99.2001V19.2399H101.85C102.418 19.2399 102.962 19.4654 103.363 19.8667C103.765 20.268 103.99 20.8124 103.99 21.3799C103.99 21.9475 103.765 22.4918 103.363 22.8931C102.962 23.2945 102.418 23.5199 101.85 23.5199L101.81 23.4999ZM113.35 21.7099C112.669 21.6679 111.991 21.8265 111.399 22.1659C110.807 22.5054 110.328 23.0109 110.02 23.6199L111.67 24.3099C111.837 24.0093 112.087 23.7634 112.39 23.6019C112.694 23.4405 113.038 23.3703 113.38 23.3999C113.617 23.3722 113.858 23.392 114.088 23.4582C114.317 23.5245 114.531 23.6358 114.718 23.7856C114.904 23.9355 115.058 24.1209 115.172 24.3311C115.286 24.5413 115.356 24.7721 115.38 25.0099V25.1299C114.779 24.8138 114.109 24.6491 113.43 24.6499C111.65 24.6499 109.83 25.6499 109.83 27.4699C109.848 27.8568 109.943 28.2361 110.11 28.5855C110.277 28.9348 110.513 29.247 110.803 29.5035C111.093 29.7601 111.432 29.9557 111.799 30.0787C112.166 30.2018 112.554 30.2498 112.94 30.2199C113.409 30.2459 113.877 30.1466 114.295 29.9322C114.714 29.7178 115.067 29.3961 115.32 28.9999H115.38V29.9999H117.18V25.1899C117.18 22.9999 115.52 21.7299 113.39 21.7299L113.35 21.7099ZM113.12 28.5599C112.51 28.5599 111.66 28.2499 111.66 27.4999C111.66 26.4999 112.72 26.1599 113.66 26.1599C114.254 26.1453 114.841 26.2903 115.36 26.5799C115.297 27.123 115.04 27.6249 114.635 27.9926C114.231 28.3604 113.707 28.569 113.16 28.5799L113.12 28.5599ZM123.74 21.9999L121.6 27.4199H121.54L119.32 21.9999H117.32L120.65 29.5799L118.75 33.7899H120.75L125.82 21.9999H123.74ZM106.94 29.9999H108.8V17.4999H106.94V29.9999Z" fill="white"></path>
|
||
<path d="M10.4402 7.5407C10.1214 7.93476 9.96415 8.43514 10.0002 8.9407V31.0607C9.96615 31.5711 10.1351 32.0742 10.4702 32.4607L10.5402 32.5407L22.9002 20.1507V19.8507L10.5102 7.4707L10.4402 7.5407Z" fill="url(#paint0_linear)"></path>
|
||
<path d="M27.0004 24.2807L22.9004 20.1507V19.8507L27.0004 15.7207L27.0904 15.7807L32.0004 18.5607C33.4004 19.3507 33.4004 20.6507 32.0004 21.4507L27.1104 24.2307L27.0004 24.2807Z" fill="url(#paint1_linear)"></path>
|
||
<path d="M27.1195 24.23L22.8995 20L10.4395 32.46C10.722 32.7115 11.0837 32.8562 11.4618 32.869C11.8399 32.8818 12.2105 32.7619 12.5095 32.53L27.1195 24.23Z" fill="url(#paint2_linear)"></path>
|
||
<path d="M27.1195 15.7805L12.5095 7.48046C12.2125 7.24537 11.8421 7.12251 11.4635 7.13349C11.0849 7.14446 10.7223 7.28857 10.4395 7.54046L22.8995 20.0005L27.1195 15.7805Z" fill="url(#paint3_linear)"></path>
|
||
<path opacity="0.2" d="M26.9995 24.1299L12.5095 32.3799C12.2214 32.5973 11.8703 32.7149 11.5095 32.7149C11.1486 32.7149 10.7975 32.5973 10.5095 32.3799L10.4395 32.4499L10.5095 32.5299C10.7975 32.7473 11.1486 32.8649 11.5095 32.8649C11.8703 32.8649 12.2214 32.7473 12.5095 32.5299L27.1195 24.2299L26.9995 24.1299Z" fill="black"></path>
|
||
<path opacity="0.12" d="M10.4399 32.3202C10.1187 31.9235 9.96126 31.4191 9.99988 30.9102V31.0602C9.96585 31.5705 10.1348 32.0737 10.4699 32.4602L10.5399 32.3902L10.4399 32.3202Z" fill="black"></path>
|
||
<path opacity="0.12" d="M32 21.3L27 24.13L27.09 24.23L32 21.44C32.2898 21.3174 32.5413 21.119 32.7278 20.8656C32.9143 20.6122 33.0291 20.3132 33.06 20C32.9975 20.2846 32.869 20.5505 32.6849 20.7763C32.5007 21.0021 32.2662 21.1815 32 21.3Z" fill="black"></path>
|
||
<path opacity="0.25" d="M12.51 7.61998L32 18.7C32.2662 18.8185 32.5007 18.9979 32.6849 19.2237C32.869 19.4495 32.9975 19.7154 33.06 20C33.0291 19.6868 32.9143 19.3878 32.7278 19.1344C32.5413 18.881 32.2898 18.6825 32 18.56L12.51 7.47998C11.12 6.67998 10 7.33998 10 8.93998V9.08998C10 7.48998 11.12 6.82998 12.51 7.61998Z" fill="white"></path>
|
||
<defs>
|
||
<linearGradient id="paint0_linear" x1="21.8002" y1="8.7107" x2="5.02018" y2="25.4907" gradientUnits="userSpaceOnUse">
|
||
<stop stop-color="#00A0FF"></stop>
|
||
<stop offset="0.01" stop-color="#00A1FF"></stop>
|
||
<stop offset="0.26" stop-color="#00BEFF"></stop>
|
||
<stop offset="0.51" stop-color="#00D2FF"></stop>
|
||
<stop offset="0.76" stop-color="#00DFFF"></stop>
|
||
<stop offset="1" stop-color="#00E3FF"></stop>
|
||
</linearGradient>
|
||
<linearGradient id="paint1_linear" x1="33.8304" y1="20.0007" x2="9.64039" y2="20.0007" gradientUnits="userSpaceOnUse">
|
||
<stop stop-color="#FFE000"></stop>
|
||
<stop offset="0.41" stop-color="#FFBD00"></stop>
|
||
<stop offset="0.78" stop-color="#FFA500"></stop>
|
||
<stop offset="1" stop-color="#FF9C00"></stop>
|
||
</linearGradient>
|
||
<linearGradient id="paint2_linear" x1="24.8295" y1="22.3" x2="2.06945" y2="45.05" gradientUnits="userSpaceOnUse">
|
||
<stop stop-color="#FF3A44"></stop>
|
||
<stop offset="1" stop-color="#C31162"></stop>
|
||
</linearGradient>
|
||
<linearGradient id="paint3_linear" x1="7.29945" y1="0.180458" x2="17.4595" y2="10.3405" gradientUnits="userSpaceOnUse">
|
||
<stop stop-color="#32A071"></stop>
|
||
<stop offset="0.07" stop-color="#2DA771"></stop>
|
||
<stop offset="0.48" stop-color="#15CF74"></stop>
|
||
<stop offset="0.8" stop-color="#06E775"></stop>
|
||
<stop offset="1" stop-color="#00F076"></stop>
|
||
</linearGradient>
|
||
</defs>
|
||
</svg>
|
||
</span><span class="hidden desktop-sm:inline-block"><svg class="<nil>" width="25" height="27" viewBox="0 0 25 27" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M17.8452 17.8161L13.4478 13.4082L0.463867 26.3921C0.758323 26.6542 1.13522 26.805 1.52921 26.8183C1.92319 26.8317 2.30942 26.7067 2.62091 26.4651L17.8452 17.8161Z" fill="url(#paint0_linear4)"></path>
|
||
<path d="M0.463776 0.424506C0.131609 0.835131 -0.0322666 1.35655 0.00527509 1.88337V24.9335C-0.0301817 25.4653 0.145841 25.9897 0.495038 26.3924L0.567982 26.4757L13.4477 13.5647V13.2521L0.53672 0.351562L0.463776 0.424506Z" fill="url(#paint1_linear3)"></path>
|
||
<path d="M17.7197 17.8682L13.4473 13.5645V13.2519L17.7197 8.94824L17.8135 9.01076L22.9299 11.9077C24.3888 12.7309 24.3888 14.0855 22.9299 14.9192L17.8343 17.8161L17.7197 17.8682Z" fill="url(#paint2_linear3)"></path>
|
||
<path d="M17.8452 9.01127L2.62091 0.362264C2.31145 0.117293 1.92552 -0.0107306 1.531 0.000704822C1.13648 0.0121402 0.758621 0.162302 0.463867 0.424787L13.4478 13.4087L17.8452 9.01127Z" fill="url(#paint3_linear3)"></path>
|
||
<defs>
|
||
<linearGradient id="paint0_linear4" x1="15.459" y1="15.8049" x2="-8.25809" y2="39.5115" gradientUnits="userSpaceOnUse">
|
||
<stop stop-color="#FF3A44"></stop>
|
||
<stop offset="1" stop-color="#C31162"></stop>
|
||
</linearGradient>
|
||
<linearGradient id="paint1_linear3" x1="12.3015" y1="1.6437" x2="-5.18413" y2="19.1293" gradientUnits="userSpaceOnUse">
|
||
<stop stop-color="#00A0FF"></stop>
|
||
<stop offset="0.01" stop-color="#00A1FF"></stop>
|
||
<stop offset="0.26" stop-color="#00BEFF"></stop>
|
||
<stop offset="0.51" stop-color="#00D2FF"></stop>
|
||
<stop offset="0.76" stop-color="#00DFFF"></stop>
|
||
<stop offset="1" stop-color="#00E3FF"></stop>
|
||
</linearGradient>
|
||
<linearGradient id="paint2_linear3" x1="24.8369" y1="13.4082" x2="-0.370305" y2="13.4082" gradientUnits="userSpaceOnUse">
|
||
<stop stop-color="#FFE000"></stop>
|
||
<stop offset="0.41" stop-color="#FFBD00"></stop>
|
||
<stop offset="0.78" stop-color="#FFA500"></stop>
|
||
<stop offset="1" stop-color="#FF9C00"></stop>
|
||
</linearGradient>
|
||
<linearGradient id="paint3_linear3" x1="-2.80817" y1="-7.2447" x2="7.77905" y2="3.34252" gradientUnits="userSpaceOnUse">
|
||
<stop stop-color="#32A071"></stop>
|
||
<stop offset="0.07" stop-color="#2DA771"></stop>
|
||
<stop offset="0.48" stop-color="#15CF74"></stop>
|
||
<stop offset="0.8" stop-color="#06E775"></stop>
|
||
<stop offset="1" stop-color="#00F076"></stop>
|
||
</linearGradient>
|
||
</defs>
|
||
</svg></span></a></div><div class="flex pt-10 border-b border-[#88838C] desktop-sm:hidden"></div></div><div class="order-3 col-span-12 px-[15px] pt-3 desktop-sm:order-2 desktop-sm:col-span-4 desktop-sm:pt-0"><p @click="openSection === 'product' ? (openSection = false) : (openSection = 'product')" class="font-bold font-national uppercase text-white text-[18px] leading-[24px] hover:cursor-pointer focus:cursor-pointer desktop-sm:pb-[7px] desktop-sm:text-[16px] desktop-sm:leading-[20px] desktop-sm:hover:cursor-auto desktop-sm:focus:cursor-auto">Product</p><div class="hidden border-b border-[#88838C] desktop-sm:flex"></div><div x-show.important="desktop || openSection === 'product'" class="flex gap-x-7 py-4 desktop-sm:py-2.5"><div class="inline-flex flex-col w-1/2"><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/infrastructure-monitoring/">Infrastructure Monitoring</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/network-monitoring/">Network Monitoring</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/container-monitoring/">Container Monitoring</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/serverless-monitoring/">Serverless</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/cloud-cost-management/">Cloud Cost Management</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/cloudcraft/">Cloudcraft</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/kubernetes-autoscaling/">Kubernetes Autoscaling</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/apm/">Application Performance Monitoring</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/software-catalog/">Software Catalog</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/universal-service-monitoring/">Universal Service Monitoring</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/data-streams-monitoring/">Data Streams Monitoring</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/products/observability/data-observability/">Data Observability</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/database-monitoring/">Database Monitoring</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/code-profiling/">Continuous Profiler</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/dynamic-instrumentation/">Dynamic Instrumentation</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/log-management/">Log Management</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/sensitive-data-scanner/">Sensitive Data Scanner</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/audit-trail/">Audit Trail</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/observability-pipelines/">Observability Pipelines</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/cloud-security/">Cloud Security</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/cloud-security/#posture-management">Cloud Security Posture Management</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/workload-protection/">Workload Protection</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/cloud-security/#entitlement-management">Cloud Infrastructure Entitlement Management</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/cloud-security/#vulnerability-management">Vulnerability Management</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/cloud-security/#compliance">Compliance</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/app-and-api-protection/">App and API Protection</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/software-composition-analysis/">Software Composition Analysis</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/code-security/">Code Security</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/sast/">Static Code Analysis (SAST)</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/iast/">Runtime Code Analysis (IAST)</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/iac-security">IaC Security</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/cloud-siem/">Cloud SIEM</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/real-user-monitoring/">Browser Real User Monitoring</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/real-user-monitoring/mobile-rum/">Mobile Real User Monitoring</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/product-analytics/">Product Analytics</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/experiments/">Experiments</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/real-user-monitoring/session-replay/">Session Replay</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/synthetic-monitoring/">Synthetic Monitoring</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/mobile-app-testing/">Mobile App Testing</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/continuous-testing/">Continuous Testing</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/error-tracking/">Error Tracking</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/byoc-logs/">BYOC Log Management</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/internal-developer-portal/">Internal Developer Portal</a></span></div><div class="inline-flex flex-col w-1/2"><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/ci-cd-monitoring/">CI Visibility</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/test-optimization/">Test Optimization</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/feature-flags/">Feature Flags</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/code-coverage/">Code Coverage</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/software-delivery/ai-impact/">AI Impact</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/service-level-objectives/">Service Level Objectives</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/incident-response/">Incident Response</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/event-management/">Event Management</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/case-management/">Case Management</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/ai/bits-ai-agents/">Bits AI Agents</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/ai/bits-code/">Bits Code</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/ai/bits-investigation/">Bits Investigation</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/ai/bits-security-analyst/">Bits Security Analyst</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/ai/bits-agent-builder/">Bits Agent Builder</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/ai/bits-chat/">Bits Chat</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/ai/mcp-server/">MCP Server</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/ai/mcp-server/">Pup CLI</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/ai/agent-directory/">Agent Directory</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/metrics/">Metrics</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/platform/watchdog/">Watchdog</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/products/ai/agent-observability/">Agent Observability</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/platform/integrations/#cat-aiml">AI Integrations</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/workflow-automation/">Workflow Automation</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/app-builder/">App Builder</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://docs.datadoghq.com/account_management/teams/">Teams</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/platform/dashboards/">Dashboards</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://docs.datadoghq.com/notebooks/">Notebooks</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://docs.datadoghq.com/service_management/mobile/?tab=ios">Mobile App</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/fleet-automation/">Fleet Automation</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/governance-console/">Governance Console</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://docs.datadoghq.com/account_management/rbac/?tab=datadogapplication">Access Control</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/solutions/opentelemetry/">OpenTelemetry</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/platform/alerts/">Alerts</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/platform/integrations/">Integrations</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/platform/ides/">IDE Plugins</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://docs.datadoghq.com/api/">API</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/marketplacepartners/">Marketplace</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://securitylabs.datadoghq.com/">Security Labs Research</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://opensource.datadoghq.com/">Open Source Projects</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/storage-management/">Storage Management</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/gpu-monitoring/">GPU Monitoring</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/platform/dora-metrics/">DORA Metrics</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product/secret-scanning/">Secret Scanning</a></span></div></div><div class="flex pt-3 border-b border-[#88838C] desktop-sm:hidden"></div></div><div class="order-2 col-span-12 px-[15px] pt-3 desktop-sm:order-3 desktop-sm:col-span-2 desktop-sm:pt-0"><p @click="openSection === 'resources' ? (openSection = false) : (openSection = 'resources')" class="font-bold font-national uppercase text-white text-[18px] leading-[24px] hover:cursor-pointer focus:cursor-pointer desktop-sm:pb-[7px] desktop-sm:text-[16px] desktop-sm:leading-[20px] desktop-sm:hover:cursor-auto desktop-sm:focus:cursor-auto">Resources</p><div class="hidden border-b border-[#88838C] desktop-sm:flex"></div><div x-show.important="desktop || openSection === 'resources'" class="flex gap-x-7 py-4 desktop-sm:flex-col desktop-sm:py-2.5"><div class="inline-flex flex-col w-1/2 desktop-sm:w-full"><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/pricing/">Pricing</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://docs.datadoghq.com/">Documentation</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/support/">Support</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/support-services/">Services & Enablement</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/product-preview/">Product Preview Program</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/certification/overview/">Certification</a></span></div><div class="inline-flex flex-col w-1/2 desktop-sm:w-full"><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://opensource.datadoghq.com/">Open Source</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/events-webinars/">Events and Webinars</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/security/">Security</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/privacy/">Privacy Center</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/knowledge-center/">Knowledge Center</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/learn/">Learning Resources</a></span></div></div><div class="flex pt-3 border-b border-[#88838C] desktop-sm:hidden"></div></div><div class="order-4 col-span-12 px-[15px] desktop-sm:col-span-3"><div class="flex flex-col desktop-sm:flex-row desktop-sm:gap-x-7"><div class="flex flex-col basis-3/5 pt-3 desktop-sm:pt-0"><p @click="openSection === 'about' ? (openSection = false) : (openSection = 'about')" class="font-bold font-national uppercase text-white text-[18px] leading-[24px] hover:cursor-pointer focus:cursor-pointer desktop-sm:pb-[7px] desktop-sm:text-[16px] desktop-sm:leading-[20px] desktop-sm:hover:cursor-auto desktop-sm:focus:cursor-auto">About</p><div class="hidden border-b border-[#88838C] desktop-sm:flex"></div><div x-show.important="desktop || openSection === 'about'" class="flex gap-x-7 py-4 desktop-sm:flex-col desktop-sm:py-2.5"><div class="inline-flex flex-col w-1/2 desktop-sm:w-full"><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/about/contact/">Contact Us</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/partner/network/">Partners</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/about/latest-news/press-releases/">Press</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/about/leadership/">Leadership</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://careers.datadoghq.com/">Careers</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/legal/">Legal</a></span></div><div class="inline-flex flex-col w-1/2 desktop-sm:w-full"><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://investors.datadoghq.com/">Investor Relations</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/about/analyst/">Analyst Reports</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/esg-report/">ESG Report</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/vendor-help/">Vendor Help</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/trust/">Trust Hub</a></span></div></div><div class="flex pt-3 border-b border-[#88838C] desktop-sm:hidden"></div></div><div class="flex flex-col basis-2/5 pt-3 desktop-sm:pt-0"><p @click="openSection === 'blog' ? (openSection = false) : (openSection = 'blog')" class="font-bold font-national uppercase text-white text-[18px] leading-[24px] hover:cursor-pointer focus:cursor-pointer desktop-sm:pb-[7px] desktop-sm:text-[16px] desktop-sm:leading-[20px] desktop-sm:hover:cursor-auto desktop-sm:focus:cursor-auto">Blog</p><div class="hidden border-b border-[#88838C] desktop-sm:flex"></div><div x-show.important="desktop || openSection === 'blog'" class="flex gap-x-7 py-4 desktop-sm:flex-col desktop-sm:py-2.5"><div class="inline-flex flex-col w-1/2 desktop-sm:w-full"><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/blog/">The Monitor</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/blog/engineering/">Engineering</a></span></div><div class="inline-flex flex-col w-1/2 desktop-sm:w-full"><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/blog/ai/">AI</a>
|
||
</span><span class="inline-flex py-1.5 desktop-sm:py-1"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://securitylabs.datadoghq.com/">Security Labs</a></span></div></div><div class="flex pt-3 border-b border-[#88838C] desktop-sm:hidden"></div></div></div></div></div></div><div class="hidden border-t border-[#88838C] desktop-sm:flex"></div><div class="container pt-9 desktop-sm:pt-3"><div class="row grid grid-cols-12"><div class="order-3 col-span-12 px-[15px] desktop-sm:order-2 desktop-sm:col-span-2"><div x-data="{ popup_open: false}" class="footer-menu relative flex items-center h-full justify-center desktop-sm:justify-end cursor-pointer w-auto min-w-[120px] max-w-[166px] desktop-sm:w-[166px]"><button type="button" @click="popup_open = !popup_open" @keydown.escape="popup_open = false" :aria-expanded="popup_open" aria-haspopup="listbox" class="flex items-center text-white text-[13px] leading-[18px] [&:lang(ja)]:text-[11px] [&:lang(ko)]:text-[11px] tablet:text-[15px] tablet:leading-[20px] tablet:[&:lang(ja)]:text-[13px] tablet:[&:lang(ko)]:text-[13px] desktop-sm:text-[17px] desktop-sm:leading-[22px] desktop-sm:[&:lang(ja)]:text-[14px] desktop-sm:[&:lang(ko)]:text-[14px] rounded-sm tablet:rounded w-full h-[32px] border border-[#616161] justify-between px-2 py-0.5 hover:bg-[#323232]">
|
||
<span class="flex items-center"><span class="flex items-center mr-2"><svg class="<nil>" width="16px" height="16px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->
|
||
<title>Icon/world</title>
|
||
<desc>Created with Sketch.</desc>
|
||
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||
<path d="M23,18.7142857 L15.1972484,18.7142857 C14.8808707,20.3582799 14.7142857,22.1185995 14.7142857,24 C14.7142857,26.101197 14.9220672,28.0513698 15.3142384,29.8571429 L23,29.8571429 L23,18.7142857 Z M25,18.7142857 L25,29.8571429 L32.6856474,29.8571429 C33.0778185,28.0513698 33.2856,26.101197 33.2856,24 C33.2856,22.1185995 33.119015,20.3582799 32.8026373,18.7142857 L25,18.7142857 Z M23,31.8571429 L15.8410328,31.8571429 C16.6874013,34.5709824 17.9826731,36.9218861 19.6311425,38.9369568 C20.7014808,40.2453264 21.8466701,41.314437 22.9882288,42.1603531 C22.9921555,42.1632629 22.9960793,42.1661678 23,42.1690678 L23,31.8571429 Z M25,31.8571429 L25,42.1689833 C25.0038827,42.1661114 25.0077683,42.1632346 25.0116569,42.1603531 C26.1532156,41.314437 27.298405,40.2453264 28.3687432,38.9369568 C30.0172126,36.9218861 31.3124844,34.5709824 32.1588529,31.8571429 L25,31.8571429 Z M23,16.7142857 L23,5.83093215 C22.9960793,5.83383218 22.9921555,5.83673708 22.9882288,5.83964686 C21.8466701,6.68556302 20.7014808,7.75467359 19.6311425,9.06304321 C17.8680399,11.2182402 16.508965,13.7576013 15.67101,16.7142857 L23,16.7142857 Z M25,16.7142857 L32.3288757,16.7142857 C31.4909207,13.7576013 30.1318458,11.2182402 28.3687432,9.06304321 C27.298405,7.75467359 26.1532156,6.68556302 25.0116569,5.83964686 C25.0077683,5.83676535 25.0038827,5.83388863 25,5.83101669 L25,16.7142857 Z M13.1635581,18.7142857 L5.74490713,18.7142857 C5.25990904,20.3922708 5,22.1657822 5,24 C5,26.043811 5.32270158,28.0122495 5.91993233,29.8571429 L13.2714898,29.8571429 C12.906587,28.0336164 12.7142857,26.0823166 12.7142857,24 C12.7142857,22.1336211 12.8687714,20.3724948 13.1635581,18.7142857 Z M20.4443338,42.6678567 C19.6363334,41.950688 18.8419739,41.130915 18.0831432,40.2033289 C16.1536635,37.8447543 14.6685687,35.0696382 13.7544275,31.8571429 L6.69559884,31.8571429 C9.21247658,37.3914264 14.3062352,41.5058446 20.4443338,42.6678567 Z M20.4443338,5.33214327 C14.0967882,6.53380609 8.86606956,10.8927992 6.44701478,16.7142857 L13.5990681,16.7142857 C14.4953973,13.2582719 16.04017,10.2939789 18.0831432,7.79667107 C18.8419739,6.86908497 19.6363334,6.04931197 20.4443338,5.33214327 Z M34.8363276,18.7142857 C35.1311143,20.3724948 35.2856,22.1336211 35.2856,24 C35.2856,26.0823166 35.0932987,28.0336164 34.7283959,29.8571429 L42.0800677,29.8571429 C42.6772984,28.0122495 43,26.043811 43,24 C43,22.1657822 42.740091,20.3922708 42.2550929,18.7142857 L34.8363276,18.7142857 Z M27.5555209,42.6678842 C33.6936845,41.5059095 38.7875036,37.39147 41.3044012,31.8571429 L34.2454582,31.8571429 C33.3313171,35.0696382 31.8462222,37.8447543 29.9167425,40.2033289 C29.1579022,41.1309269 28.363532,41.950709 27.5555209,42.6678842 Z M27.5555209,5.33211577 C28.363532,6.04929101 29.1579022,6.86907311 29.9167425,7.79667107 C31.9597158,10.2939789 33.5044884,13.2582719 34.4008176,16.7142857 L41.5529852,16.7142857 C39.133912,10.8927548 33.9031319,6.53373958 27.5555209,5.33211577 Z M45,24 C45,35.597999 35.597999,45 24,45 C12.402001,45 3,35.597999 3,24 C3,12.402001 12.402001,3 24,3 C35.597999,3 45,12.402001 45,24 Z" fill="#ffffff" fill-rule="nonzero"></path>
|
||
</g>
|
||
</svg>
|
||
</span><span class="flex items-center mb-0.5 [&:lang(ja)]:break-keep [&:lang(ko)]:break-keep">English
|
||
</span></span><span class="flex items-center transition-transform duration-200" :class="popup_open ? 'rotate-180' : ''"><svg class="<nil>" width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M0.999547 5.41459L5.24219 1.17195L9.48483 5.41459" stroke="white"></path>
|
||
</svg></span></button><div x-show="popup_open" x-cloak="" @click.outside="popup_open = false" class="absolute bottom-[calc(100%_+_8px)] desktop-sm:bottom-[calc(100%_+_4px)] left-0 w-full bg-[#323232] flex flex-col gap-0.5 p-0.5 tablet:gap-1 tablet:p-1 rounded-sm tablet:rounded-md desktop-sm:rounded-lg z-10"><a class="flex flex-col w-full px-2 py-0.5 tablet:px-3 tablet:py-1 desktop-sm:px-4 desktop-sm:py-1.5 text-white no-underline bg-[#323232] rounded-sm tablet:rounded hover:bg-[#616161] transition-colors" href="https://www.datadoghq.com/?lang_pref=en"><div class="text-[13px] leading-[18px] [&:lang(ja)]:text-[11px] [&:lang(ko)]:text-[11px] tablet:text-[15px] tablet:leading-[20px] tablet:[&:lang(ja)]:text-[13px] tablet:[&:lang(ko)]:text-[13px] desktop-sm:text-[17px] desktop-sm:leading-[22px] desktop-sm:[&:lang(ja)]:text-[14px] desktop-sm:[&:lang(ko)]:text-[14px] font-normal mb-1">English</div><div class="text-[12px] leading-[14px] [&:lang(ja)]:text-[9px] [&:lang(ko)]:text-[9px] tablet:text-[13px] tablet:leading-[16px] tablet:[&:lang(ja)]:text-[10px] tablet:[&:lang(ko)]:text-[10px] desktop-sm:text-[14px] desktop-sm:leading-[18px] desktop-sm:[&:lang(ja)]:text-[11px] desktop-sm:[&:lang(ko)]:text-[11px] text-[#c7c7c7] font-normal">English</div></a><a class="flex flex-col w-full px-2 py-0.5 tablet:px-3 tablet:py-1 desktop-sm:px-4 desktop-sm:py-1.5 text-white no-underline bg-[#323232] rounded-sm tablet:rounded hover:bg-[#616161] transition-colors" href="https://www.datadoghq.com/ja/?lang_pref=ja"><div class="text-[13px] leading-[18px] [&:lang(ja)]:text-[11px] [&:lang(ko)]:text-[11px] tablet:text-[15px] tablet:leading-[20px] tablet:[&:lang(ja)]:text-[13px] tablet:[&:lang(ko)]:text-[13px] desktop-sm:text-[17px] desktop-sm:leading-[22px] desktop-sm:[&:lang(ja)]:text-[14px] desktop-sm:[&:lang(ko)]:text-[14px] font-normal mb-1">日本語</div><div class="text-[12px] leading-[14px] [&:lang(ja)]:text-[9px] [&:lang(ko)]:text-[9px] tablet:text-[13px] tablet:leading-[16px] tablet:[&:lang(ja)]:text-[10px] tablet:[&:lang(ko)]:text-[10px] desktop-sm:text-[14px] desktop-sm:leading-[18px] desktop-sm:[&:lang(ja)]:text-[11px] desktop-sm:[&:lang(ko)]:text-[11px] text-[#c7c7c7] font-normal">Japanese</div></a><a class="flex flex-col w-full px-2 py-0.5 tablet:px-3 tablet:py-1 desktop-sm:px-4 desktop-sm:py-1.5 text-white no-underline bg-[#323232] rounded-sm tablet:rounded hover:bg-[#616161] transition-colors" href="https://www.datadoghq.com/ko/?lang_pref=ko"><div class="text-[13px] leading-[18px] [&:lang(ja)]:text-[11px] [&:lang(ko)]:text-[11px] tablet:text-[15px] tablet:leading-[20px] tablet:[&:lang(ja)]:text-[13px] tablet:[&:lang(ko)]:text-[13px] desktop-sm:text-[17px] desktop-sm:leading-[22px] desktop-sm:[&:lang(ja)]:text-[14px] desktop-sm:[&:lang(ko)]:text-[14px] font-normal mb-1">한국어</div><div class="text-[12px] leading-[14px] [&:lang(ja)]:text-[9px] [&:lang(ko)]:text-[9px] tablet:text-[13px] tablet:leading-[16px] tablet:[&:lang(ja)]:text-[10px] tablet:[&:lang(ko)]:text-[10px] desktop-sm:text-[14px] desktop-sm:leading-[18px] desktop-sm:[&:lang(ja)]:text-[11px] desktop-sm:[&:lang(ko)]:text-[11px] text-[#c7c7c7] font-normal">Korean</div></a></div></div></div><div class="order-1 col-span-12 mb-7 px-[15px] desktop-sm:order-3 desktop-sm:col-span-2 desktop-sm:mb-0"><div class="flex h-full justify-center items-center desktop-sm:justify-end"><span class="flex items-center mr-7 desktop-sm:mr-5"><a class="social-link flex items-center text-white" href="https://twitter.com/datadoghq" aria-label="Twitter link"><i class="icon-twitter-x flex text-[17px]"></i>
|
||
</a></span><span class="flex items-center mr-7 desktop-sm:mr-5"><a class="social-link flex items-center text-white" href="https://www.instagram.com/datadoghq/" aria-label="Instagram link"><i class="icon-instagram flex text-[17px]"></i>
|
||
</a></span><span class="flex items-center mr-7 desktop-sm:mr-5"><a class="social-link flex items-center text-white" href="https://www.youtube.com/user/DatadogHQ" aria-label="Youtube link"><i class="icon-youtube-tetra flex text-[17px]"></i>
|
||
</a></span><span class="flex items-center"><a class="social-link flex items-center text-white" href="https://www.linkedin.com/company/datadog" aria-label="LinkedIn link"><i class="icon-linkedin-new flex text-[17px]"></i></a></span></div></div><div class="px-[15px] order-2 desktop-sm:order-1 col-span-12 desktop-sm:col-span-8 mb-7 desktop-sm:mb-0"><div class="flex h-full justify-center items-center desktop-sm:justify-start"><span class="copyright mr-2 text-[#88838C] text-[14px] leading-[18px] desktop-sm:mr-3 desktop-sm:text-[16px] desktop-sm:leading-[20px]">© Datadog 2026
|
||
</span><span class="flex items-center"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/legal/terms/">Terms</a>
|
||
<span class="font-normal text-white"> |
|
||
</span></span><span class="flex items-center"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/legal/privacy/">Privacy</a>
|
||
<span class="font-normal text-white"> |
|
||
</span></span><span class="flex items-center"><a class="inline-block font-normal text-white text-[16px] leading-[16px] hover:cursor-pointer hover:text-[#88838C] focus:cursor-pointer focus:text-[#88838C] active:cursor-pointer active:text-[#88838C]" href="https://www.datadoghq.com/legal/cookies/">Cookies</a></span></div></div></div></div></div></footer></body></html></div> <datadog-logs-rum data-is-prod="true" data-dd-client-token="pub0b466265cd4de08394d4e1979fb79787" data-dd-application-id="c0bd0f01-a704-40c6-a9ef-b130b5bf397e" data-env="production" data-service="websites-blog"></datadog-logs-rum> <script type="module" src="/blog/_astro/DatadogLogsRum.astro_astro_type_script_index_0_lang.CrAKTPh3.js"></script> <script type="module" src="/blog/_astro/Base.astro_astro_type_script_index_0_lang.TdQLbLHm.js"></script> <script type="module" src="/blog/_astro/Base.astro_astro_type_script_index_1_lang.DABIRTca.js"></script> <script src="/assets/ane-popup-banner.js"></script> <script>
|
||
document.addEventListener('alpine:init', () => {
|
||
Alpine.data('searchbar', () => ({
|
||
search(e) {
|
||
let searchbarValue = '';
|
||
if (e.key === 'Enter') {
|
||
searchbarValue = e.target.value;
|
||
} else {
|
||
searchbarValue = (e.target.nextElementSibling || e.target.previousElementSibling)
|
||
?.value;
|
||
}
|
||
const pageLangPrefix =
|
||
document.documentElement.lang === 'en' ? '' : '/' + document.documentElement.lang;
|
||
const pathName = window.location.pathname;
|
||
let blogType = 'The-Monitor';
|
||
if (pathName.includes('engineering')) blogType = 'Engineering';
|
||
else if (pathName.includes('pup-culture')) blogType = 'Pup-Culture';
|
||
else if (pathName.includes('ai')) blogType = 'AI';
|
||
const blogTypeParam = pageLangPrefix === '' ? '?blog-0=' + blogType : '';
|
||
const searchParam =
|
||
searchbarValue ? (blogTypeParam === '' ? '?' : '&') + 's=' + searchbarValue : '';
|
||
window.location.href = pageLangPrefix + '/blog/search/' + blogTypeParam + searchParam;
|
||
},
|
||
}));
|
||
});
|
||
</script> </body></html><script type="module">const k=()=>{const t=document.querySelector(".aside-toc"),e=document.querySelector(".article-feedback-card"),o=document.querySelector(".further-reading-card");if(!e)return;const s=o?.querySelector("img"),u=()=>{t&&o&&(t.style.marginBottom=`${o.offsetHeight+42}px`)};t&&setTimeout(u,100),s&&(s.complete?u():s.addEventListener("load",u));const f=()=>{window.scrollY>=2e3&&e.classList.remove("opacity-0"),window.scrollY<2e3&&e.classList.add("opacity-0")},c=(p,i,w)=>{const g=e.querySelector(".article-feedback-button-container");if(!g)return;g.querySelectorAll("button").forEach(y=>{y.addEventListener("click",()=>{const L={pageURL:p,feedback:y.dataset.ddActionName},S=w===null?[]:JSON.parse(w);S.push(L),i.setItem("datadogBlogFeedback",JSON.stringify(S)),setTimeout(()=>{e.classList.add("opacity-0","transition-opacity","duration-500","ease-out"),e.addEventListener("transitionend",()=>{e.remove()},{once:!0})},2500)})})},a=window.location.pathname,b=window.localStorage,l=b.getItem("datadogBlogFeedback");let m=!1;if(l&&(m=!!JSON.parse(l).filter(p=>p.pageURL===a).length,m)){e?.remove();return}c(a,b,l),window.addEventListener("scroll",f,{passive:!0})};function O(){const n=document.querySelectorAll(".table-component"),t=e=>{e.scrollWidth>e.clientWidth?e.classList.add("has-scrollbar"):e.classList.remove("has-scrollbar")};n.forEach(e=>{const o=e.querySelector(".table-component-box .table-component-box-inner");if(!o)return;t(o),new ResizeObserver(()=>{t(o)}).observe(o)})}let d=!1,r=null,v=null;function h(){d=!0,r&&(r.disconnect(),r=null),clearTimeout(v),v=setTimeout(()=>{d=!1},3e3)}window.addEventListener("wheel",h,{passive:!0});window.addEventListener("touchstart",h,{passive:!0});window.addEventListener("keydown",n=>{["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(n.key)&&h()},{passive:!0});function E(){const n=document.querySelector("[data-dd-secondary-nav]");if(!n)return 0;const t=getComputedStyle(n);if(t.display==="none"||t.visibility==="hidden")return 0;const e=n.getBoundingClientRect();return e.height<1?0:Math.ceil(e.height)}function C(n){if(typeof n=="number"&&!Number.isNaN(n))return n;const t=typeof window<"u"?window.__FIX_HASH_SCROLL_TOP_OFFSET__:void 0;if(typeof t=="number"&&!Number.isNaN(t))return t;let e=100;const o=document.querySelector("main");if(o){const s=parseFloat(getComputedStyle(o).marginTop);Number.isFinite(s)&&s>=0&&(e=s+4)}return e+E()}function T(n={}){const{maxDuration:t=1e4,stableThreshold:e=3,topOffset:o}=n,s=location.hash;if(!s||d)return;const u=decodeURIComponent(s),f=document.querySelector(u);if(!f)return;r&&r.disconnect();let c=null,a=0;const b=performance.now(),l=()=>{if(d)return;const m=C(o),i=f.getBoundingClientRect().top+window.scrollY-m;window.scrollTo({top:i,behavior:"instant"})};r=new ResizeObserver(()=>{if(d){r.disconnect(),r=null;return}if(performance.now()-b>t){r.disconnect(),r=null;return}const i=f.getBoundingClientRect().top+window.scrollY;if(c===null){c=i,l();return}Math.abs(i-c)<1?(a++,a>=e&&(r.disconnect(),r=null)):(c=i,a=0,l())}),r.observe(document.documentElement)}location.hash&&setTimeout(()=>{T()},100);window.addEventListener("hashchange",()=>{d=!1,location.hash&&setTimeout(()=>{T()},100)});k();O();</script> |