Files
nexus/sreweekly/articles/115/05-pull-doesn-t-scale-or-does-it.html
2026-09-12 17:23:01 +08:00

158 lines
74 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><!--1djEv_SVOeSl50q5K3eKc--><html lang="en" data-mantine-color-scheme="light" class="__variable_f367f3 __variable_d0e872" style="--header-height:112px"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/155cae559bbd1a77-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/e4af272ccee01ff0-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" as="image" href="/_next/static/media/github-logo.3b925f14.svg"/><link rel="stylesheet" href="/_next/static/css/0566b04bc4104246.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/12996fad8d583efc.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/afedc5bb723d1741.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-b375e03dd2b40bc6.js"/><script src="/_next/static/chunks/4bd1b696-409494caf8c83275.js" async=""></script><script src="/_next/static/chunks/255-3bcc0ff3c81b3ffa.js" async=""></script><script src="/_next/static/chunks/main-app-95e62da901c4d719.js" async=""></script><script src="/_next/static/chunks/c16f53c3-e2edfe54eba3117f.js" async=""></script><script src="/_next/static/chunks/341-0544a5ed99d6b02e.js" async=""></script><script src="/_next/static/chunks/619-f072ac750404f9da.js" async=""></script><script src="/_next/static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js" async=""></script><script src="/_next/static/chunks/728-dddccccbb8b7ce64.js" async=""></script><script src="/_next/static/chunks/662-48ddd1f95938f105.js" async=""></script><script src="/_next/static/chunks/app/layout-faf6aa14544df6bb.js" async=""></script><link rel="preload" href="https://widget.kapa.ai/kapa-widget.bundle.js" as="script"/><link rel="preload" href="https://www.googletagmanager.com/gtag/js?id=G-80ZM8LGB96" as="script"/><meta name="next-size-adjust" content=""/><title>Pull doesn&#x27;t scale - or does it? | Prometheus</title><meta name="description" content="An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach."/><meta name="keywords" content="prometheus,monitoring,monitoring system,time series,time series database,alerting,metrics,telemetry"/><link rel="canonical" href="https://prometheus.io/blog/2016/07/23/pull-does-not-scale-or-does-it/"/><meta property="og:title" content="Pull doesn&#x27;t scale - or does it? | Prometheus"/><meta property="og:description" content="An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach."/><meta property="og:url" content="https://prometheus.io/blog/2016/07/23/pull-does-not-scale-or-does-it/"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Pull doesn&#x27;t scale - or does it? | Prometheus"/><meta name="twitter:description" content="An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach."/><meta name="twitter:image:type" content="image/png"/><meta name="twitter:image:width" content="1200"/><meta name="twitter:image:height" content="1200"/><meta name="twitter:image" content="https://prometheus.io/twitter-image.png?b370f6418ef38b42"/><link rel="icon" href="/icon.svg?7aa022e51797bcef" type="image/svg+xml" sizes="any"/><script data-mantine-script="true">try {
var _colorScheme = window.localStorage.getItem("mantine-color-scheme-value");
var colorScheme = _colorScheme === "light" || _colorScheme === "dark" || _colorScheme === "auto" ? _colorScheme : "auto";
var computedColorScheme = colorScheme !== "auto" ? colorScheme : window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
document.documentElement.setAttribute("data-mantine-color-scheme", computedColorScheme);
} catch (e) {}
</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><style data-mantine-styles="true">:root{--mantine-color-black: var(--mantine-color-gray-8);--mantine-font-family-headings: var(--font-inter);--mantine-primary-color-filled: var(--mantine-color-prometheusColor-filled);--mantine-primary-color-filled-hover: var(--mantine-color-prometheusColor-filled-hover);--mantine-primary-color-light: var(--mantine-color-prometheusColor-light);--mantine-primary-color-light-hover: var(--mantine-color-prometheusColor-light-hover);--mantine-primary-color-light-color: var(--mantine-color-prometheusColor-light-color);--mantine-primary-color-0: var(--mantine-color-prometheusColor-0);--mantine-primary-color-1: var(--mantine-color-prometheusColor-1);--mantine-primary-color-2: var(--mantine-color-prometheusColor-2);--mantine-primary-color-3: var(--mantine-color-prometheusColor-3);--mantine-primary-color-4: var(--mantine-color-prometheusColor-4);--mantine-primary-color-5: var(--mantine-color-prometheusColor-5);--mantine-primary-color-6: var(--mantine-color-prometheusColor-6);--mantine-primary-color-7: var(--mantine-color-prometheusColor-7);--mantine-primary-color-8: var(--mantine-color-prometheusColor-8);--mantine-primary-color-9: var(--mantine-color-prometheusColor-9);--mantine-color-prometheusColor-0: #ffede6;--mantine-color-prometheusColor-1: #ffdad2;--mantine-color-prometheusColor-2: #f6b5a4;--mantine-color-prometheusColor-3: #f08e74;--mantine-color-prometheusColor-4: #ea6b4b;--mantine-color-prometheusColor-5: #e75630;--mantine-color-prometheusColor-6: #e64a22;--mantine-color-prometheusColor-7: #cc3b16;--mantine-color-prometheusColor-8: #b73311;--mantine-color-prometheusColor-9: #a02709;}:root[data-mantine-color-scheme="dark"]{--mantine-color-anchor: var(--mantine-color-prometheusColor-4);--mantine-color-prometheusColor-text: var(--mantine-color-prometheusColor-4);--mantine-color-prometheusColor-filled: var(--mantine-color-prometheusColor-8);--mantine-color-prometheusColor-filled-hover: var(--mantine-color-prometheusColor-9);--mantine-color-prometheusColor-light: rgba(230, 74, 34, 0.15);--mantine-color-prometheusColor-light-hover: rgba(230, 74, 34, 0.2);--mantine-color-prometheusColor-light-color: var(--mantine-color-prometheusColor-3);--mantine-color-prometheusColor-outline: var(--mantine-color-prometheusColor-4);--mantine-color-prometheusColor-outline-hover: rgba(234, 107, 75, 0.05);}:root[data-mantine-color-scheme="light"]{--mantine-color-text: var(--mantine-color-gray-8);--mantine-color-anchor: var(--mantine-color-prometheusColor-6);--mantine-color-prometheusColor-text: var(--mantine-color-prometheusColor-filled);--mantine-color-prometheusColor-filled: var(--mantine-color-prometheusColor-6);--mantine-color-prometheusColor-filled-hover: var(--mantine-color-prometheusColor-7);--mantine-color-prometheusColor-light: rgba(230, 74, 34, 0.1);--mantine-color-prometheusColor-light-hover: rgba(230, 74, 34, 0.12);--mantine-color-prometheusColor-light-color: var(--mantine-color-prometheusColor-6);--mantine-color-prometheusColor-outline: var(--mantine-color-prometheusColor-6);--mantine-color-prometheusColor-outline-hover: rgba(230, 74, 34, 0.05);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><style data-mantine-styles="inline">:root{--app-shell-header-height:var(--header-height);--app-shell-header-offset:var(--header-height);--app-shell-padding:0px;}</style><div style="--app-shell-transition-duration:200ms;--app-shell-transition-timing-function:ease" class="m_89ab340 mantine-AppShell-root" data-resizing="true"><header style="--app-shell-header-z-index:100" class="m_3b16f56b mantine-AppShell-header right-scroll-bar-position Header_header__MvnS2" data-with-border="true"><div style="height:40px;background-color:#e6522c;color:white;display:flex;align-items:center;justify-content:center;padding:0 16px;font-size:var(--mantine-font-size-sm);font-weight:500"><div style="--group-gap:var(--mantine-spacing-xs);--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><svg xmlns="http://www.w3.org/2000/svg" width="1.1em" height="1.1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-speakerphone " style="flex-shrink:0"><path d="M18 8a3 3 0 0 1 0 6"></path><path d="M10 8v11a1 1 0 0 1 -1 1h-1a1 1 0 0 1 -1 -1v-5"></path><path d="M12 8h0l4.524 -3.77a.9 .9 0 0 1 1.476 .692v12.156a.9 .9 0 0 1 -1.476 .692l-4.524 -3.77h-8a1 1 0 0 1 -1 -1v-4a1 1 0 0 1 1 -1h8"></path></svg><div class="mantine-visible-from-sm"><span>Join <a style="text-decoration:none;color:var(--mantine-color-orange-1);font-size:inherit;font-weight:500" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://promcon.io/2026-munich/" target="_blank"><span>PromCon EU 2026<!-- --> <svg xmlns="http://www.w3.org/2000/svg" width="0.9em" height="0.9em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-external-link " style="margin-bottom:-1.5px"><path d="M12 6h-6a2 2 0 0 0 -2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-6"></path><path d="M11 13l9 -9"></path><path d="M15 4h5v5"></path></svg></span></a>, the Prometheus users conference, on October 7–8, 2026 in Munich.</span></div><div class="mantine-hidden-from-sm"><span><a style="text-decoration:none;color:var(--mantine-color-orange-1);font-size:inherit;font-weight:500" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://promcon.io/2026-munich/" target="_blank"><span>PromCon EU 2026<!-- --> <svg xmlns="http://www.w3.org/2000/svg" width="0.9em" height="0.9em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-external-link " style="margin-bottom:-1.5px"><path d="M12 6h-6a2 2 0 0 0 -2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-6"></path><path d="M11 13l9 -9"></path><path d="M15 4h5v5"></path></svg></span></a> — Oct 7–8, Munich.</span></div></div></div><style data-mantine-styles="inline">.__m__-_R_amqtb_{padding-inline:var(--mantine-spacing-md);}@media(min-width: 36em){.__m__-_R_amqtb_{padding-inline:var(--mantine-spacing-xl);}}</style><div style="--container-size:var(--container-size-xl)" class="m_7485cace mantine-Container-root __m__-_R_amqtb_" data-size="xl"><div class="Header_inner__ggL_E"><a style="text-decoration:none;color:inherit" href="/"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><img alt="Prometheus logo" loading="lazy" width="32" height="32" decoding="async" data-nimg="1" style="color:transparent" src="/_next/static/media/prometheus-logo.7aa022e5.svg"/><p style="color:light-dark(var(--mantine-color-gray-7), var(--mantine-color-gray-0));font-family:var(--font-lato);font-size:calc(1.5625rem * var(--mantine-scale))" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Prometheus</p></div></a><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--group-gap:calc(0.3125rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root mantine-visible-from-sm"><a class="Header_link__qN2Ll" href="/docs/introduction/overview/">Docs</a><a class="Header_link__qN2Ll" href="/download/">Download</a><a class="Header_link__qN2Ll" href="/community/">Community</a><a class="Header_link__qN2Ll" href="/support-training/">Support &amp; Training</a><a class="Header_link__qN2Ll" aria-current="page" href="/blog/">Blog</a></div><div style="--group-gap:var(--mantine-spacing-xs);--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root mantine-visible-from-md"><div style="margin-inline:var(--mantine-spacing-lg);width:calc(13.75rem * var(--mantine-scale))" class="m_46b77525 mantine-InputWrapper-root mantine-TextInput-root mantine-visible-from-lg"><div style="--input-right-section-width:fit-content" class="m_6c018570 mantine-Input-wrapper mantine-TextInput-wrapper" data-variant="default" data-with-right-section="true" data-with-left-section="true"><div data-position="left" class="m_82577fc2 mantine-Input-section mantine-TextInput-section"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-search " style="width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale))"><path d="M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0"></path><path d="M21 21l-6 -6"></path></svg></div><input class="m_8fb7ebe7 mantine-Input-input mantine-TextInput-input" data-variant="default" placeholder="Search / Ask AI" aria-invalid="false" id="mantine-_R_6qqqmqtb_"/><div data-position="right" class="m_82577fc2 mantine-Input-section mantine-TextInput-section"><p style="--text-fz:var(--mantine-font-size-xs);--text-lh:var(--mantine-line-height-xs);border-radius:0.25em;margin-inline:calc(0.3125rem * var(--mantine-scale));padding:calc(0.375rem * var(--mantine-scale));background:light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-7));font-weight:700;line-height:1" class="mantine-focus-auto m_b6d8b162 mantine-Text-root" data-size="xs">Ctrl + K</p></div></div></div><button style="--ai-bg:transparent;--ai-hover:var(--mantine-color-gray-light-hover);--ai-color:var(--mantine-color-gray-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root mantine-hidden-from-lg" data-variant="subtle" type="button"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-search " style="width:calc(1.25rem * var(--mantine-scale));height:calc(1.25rem * var(--mantine-scale));display:block"><path d="M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0"></path><path d="M21 21l-6 -6"></path></svg></span></button><button style="--ai-size:calc(2rem * var(--mantine-scale));--ai-bg:transparent;--ai-hover:var(--mantine-color-gray-light-hover);--ai-color:var(--mantine-color-gray-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" type="button" title="Switch to light theme" aria-label="Switch to light theme"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="none" class="tabler-icon tabler-icon-brightness-filled " style="width:calc(1.25rem * var(--mantine-scale));height:calc(1.25rem * var(--mantine-scale));display:block"><path d="M17 3.34a10 10 0 1 1 -15 8.66l.005 -.324a10 10 0 0 1 14.995 -8.336m-9 1.732a8 8 0 0 0 4.001 14.928l-.001 -16a8 8 0 0 0 -4 1.072"></path></svg></span></button><a style="--ai-bg:transparent;--ai-hover:var(--mantine-color-gray-light-hover);--ai-color:var(--mantine-color-gray-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" href="https://github.com/prometheus" target="_blank"><span class="m_8d3afb97 mantine-ActionIcon-icon"><img alt="GitHub Logo" width="98" height="96" decoding="async" data-nimg="1" class="invertInDarkMode" style="color:transparent;height:20px;width:20px;opacity:0.9;vertical-align:middle" src="/_next/static/media/github-logo.3b925f14.svg"/></span></a></div><button style="--burger-color:var(--mantine-color-gray-5);--burger-size:var(--burger-size-sm)" class="mantine-focus-auto m_fea6bf1a mantine-Burger-root m_87cf2631 mantine-UnstyledButton-root mantine-hidden-from-sm" data-size="sm" type="button" color="gray.5" aria-haspopup="dialog" aria-expanded="false" aria-controls="mantine-_R_eqqmqtb_-dropdown" id="mantine-_R_eqqmqtb_-target"><div class="m_d4fb9cad mantine-Burger-burger" data-reduce-motion="true"></div></button></div></div></div></header><main class="m_8983817 mantine-AppShell-main"><style data-mantine-styles="inline">.__m__-_R_2qqtb_{padding-inline:var(--mantine-spacing-md);}@media(min-width: 36em){.__m__-_R_2qqtb_{padding-inline:var(--mantine-spacing-xl);}}</style><div style="--container-size:var(--container-size-xl);margin-top:var(--mantine-spacing-xl)" class="m_7485cace mantine-Container-root __m__-_R_2qqtb_" data-size="xl"><div class="" data-pagefind-body="true"><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size);margin-top:0rem;margin-bottom:var(--mantine-spacing-xs)" class="m_8a5d1357 mantine-Title-root" data-order="1">Pull doesn&#x27;t scale - or does it?</h1><p style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);margin-bottom:var(--mantine-spacing-xl);color:var(--mantine-color-dimmed)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root" data-size="sm">July 23, 2016<!-- --> by<!-- --> <!-- -->Julius Volz</p><div class="markdown-content"><p>Let&#x27;s talk about a particularly persistent myth. Whenever there is a discussion
about monitoring systems and Prometheus&#x27;s pull-based metrics collection
approach comes up, someone inevitably chimes in about how a pull-based approach
just “fundamentally doesn&#x27;t scale”. The given reasons are often vague or only
apply to systems that are fundamentally different from Prometheus. In fact,
having worked with pull-based monitoring at the largest scales, this claim runs
counter to our own operational experience.</p>
<p>We already have an FAQ entry about
<a style="color:var(--secondary-link-color)" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-inherit="true" data-underline="hover" href="/docs/introduction/faq/#why-do-you-pull-rather-than-push">why Prometheus chooses pull over push</a>,
but it does not focus specifically on scaling aspects. Let&#x27;s have a closer look
at the usual misconceptions around this claim and analyze whether and how they
would apply to Prometheus.</p>
<!-- -->
<h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="2" id="prometheus-is-not-nagios">Prometheus is not Nagios<a class="header-auto-link" href="#prometheus-is-not-nagios"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="0.875em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-link "><path d="M9 15l6 -6"></path><path d="M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464"></path><path d="M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463"></path></svg></a></h2>
<p>When people think of a monitoring system that actively pulls, they often think
of Nagios. Nagios has a reputation of not scaling well, in part due to spawning
subprocesses for active checks that can run arbitrary actions on the Nagios
host in order to determine the health of a certain host or service. This sort
of check architecture indeed does not scale well, as the central Nagios host
quickly gets overwhelmed. As a result, people usually configure checks to only
be executed every couple of minutes, or they run into more serious problems.</p>
<p>However, Prometheus takes a fundamentally different approach altogether.
Instead of executing check scripts, it only collects time series data from a
set of instrumented targets over the network. For each target, the Prometheus
server simply fetches the current state of all metrics of that target over HTTP
(in a highly parallel way, using goroutines) and has no other execution
overhead that would be pull-related. This brings us to the next point:</p>
<h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="2" id="it-doesnt-matter-who-initiates-the-connection">It doesn&#x27;t matter who initiates the connection<a class="header-auto-link" href="#it-doesnt-matter-who-initiates-the-connection"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="0.875em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-link "><path d="M9 15l6 -6"></path><path d="M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464"></path><path d="M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463"></path></svg></a></h2>
<p>For scaling purposes, it doesn&#x27;t matter who initiates the TCP connection over
which metrics are then transferred. Either way you do it, the effort for
establishing a connection is small compared to the metrics payload and other
required work.</p>
<p>But a push-based approach could use UDP and avoid connection establishment
altogether, you say! True, but the TCP/HTTP overhead in Prometheus is still
negligible compared to the other work that the Prometheus server has to do to
ingest data (especially persisting time series data on disk). To put some
numbers behind this: a single big Prometheus server can easily store millions
of time series, with a record of 800,000 incoming samples per second (as
measured with real production metrics data at SoundCloud). Given a 10-seconds
scrape interval and 700 time series per host, this allows you to monitor over
10,000 machines from a single Prometheus server. The scaling bottleneck here
has never been related to pulling metrics, but usually to the speed at which
the Prometheus server can ingest the data into memory and then sustainably
persist and expire data on disk/SSD.</p>
<p>Also, although networks are pretty reliable these days, using a TCP-based pull
approach makes sure that metrics data arrives reliably, or that the monitoring
system at least knows immediately when the metrics transfer fails due to a
broken network.</p>
<h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="2" id="prometheus-is-not-an-event-based-system">Prometheus is not an event-based system<a class="header-auto-link" href="#prometheus-is-not-an-event-based-system"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="0.875em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-link "><path d="M9 15l6 -6"></path><path d="M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464"></path><path d="M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463"></path></svg></a></h2>
<p>Some monitoring systems are event-based. That is, they report each individual
event (an HTTP request, an exception, you name it) to a central monitoring
system immediately as it happens. This central system then either aggregates
the events into metrics (StatsD is the prime example of this) or stores events
individually for later processing (the ELK stack is an example of that). In
such a system, pulling would be problematic indeed: the instrumented service
would have to buffer events between pulls, and the pulls would have to happen
incredibly frequently in order to simulate the same “liveness” of the
push-based approach and not overwhelm event buffers.</p>
<p>However, again, Prometheus is not an event-based monitoring system. You do not
send raw events to Prometheus, nor can it store them. Prometheus is in the
business of collecting aggregated time series data. That means that it&#x27;s only
interested in regularly collecting the current <em>state</em> of a given set of
metrics, not the underlying events that led to the generation of those metrics.
For example, an instrumented service would not send a message about each HTTP
request to Prometheus as it is handled, but would simply count up those
requests in memory. This can happen hundreds of thousands of times per second
without causing any monitoring traffic. Prometheus then simply asks the service
instance every 15 or 30 seconds (or whatever you configure) about the current
counter value and stores that value together with the scrape timestamp as a
sample. Other metric types, such as gauges, histograms, and summaries, are
handled similarly. The resulting monitoring traffic is low, and the pull-based
approach also does not create problems in this case.</p>
<h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="2" id="but-now-my-monitoring-needs-to-know-about-my-service-instances">But now my monitoring needs to know about my service instances!<a class="header-auto-link" href="#but-now-my-monitoring-needs-to-know-about-my-service-instances"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="0.875em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-link "><path d="M9 15l6 -6"></path><path d="M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464"></path><path d="M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463"></path></svg></a></h2>
<p>With a pull-based approach, your monitoring system needs to know which service
instances exist and how to connect to them. Some people are worried about the
extra configuration this requires on the part of the monitoring system and see
this as an operational scalability problem.</p>
<p>We would argue that you cannot escape this configuration effort for
serious monitoring setups in any case: if your monitoring system doesn&#x27;t know
what the world <em>should</em> look like and which monitored service instances
<em>should</em> be there, how would it be able to tell when an instance just never
reports in, is down due to an outage, or really is no longer meant to exist?
This is only acceptable if you never care about the health of individual
instances at all, like when you only run ephemeral workers where it is
sufficient for a large-enough number of them to report in some result. Most
environments are not exclusively like that.</p>
<p>If the monitoring system needs to know the desired state of the world anyway,
then a push-based approach actually requires <em>more</em> configuration in total. Not
only does your monitoring system need to know what service instances should
exist, but your service instances now also need to know how to reach your
monitoring system. A pull approach not only requires less configuration,
it also makes your monitoring setup more flexible. With pull, you can just run
a copy of production monitoring on your laptop to experiment with it. It also
allows you just fetch metrics with some other tool or inspect metrics endpoints
manually. To get high availability, pull allows you to just run two identically
configured Prometheus servers in parallel. And lastly, if you have to move the
endpoint under which your monitoring is reachable, a pull approach does not
require you to reconfigure all of your metrics sources.</p>
<p>On a practical front, Prometheus makes it easy to configure the desired state
of the world with its built-in support for a wide variety of service discovery
mechanisms for cloud providers and container-scheduling systems: Consul,
Marathon, Kubernetes, EC2, DNS-based SD, Azure, Zookeeper Serversets, and more.
Prometheus also allows you to plug in your own custom mechanism if needed.
In a microservice world or any multi-tiered architecture, it is also
fundamentally an advantage if your monitoring system uses the same method to
discover targets to monitor as your service instances use to discover their
backends. This way you can be sure that you are monitoring the same targets
that are serving production traffic and you have only one discovery mechanism
to maintain.</p>
<h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="2" id="accidentally-ddos-ing-your-monitoring">Accidentally DDoS-ing your monitoring<a class="header-auto-link" href="#accidentally-ddos-ing-your-monitoring"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="0.875em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-link "><path d="M9 15l6 -6"></path><path d="M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464"></path><path d="M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463"></path></svg></a></h2>
<p>Whether you pull or push, any time-series database will fall over if you send
it more samples than it can handle. However, in our experience it&#x27;s slightly
more likely for a push-based approach to accidentally bring down your
monitoring. If the control over what metrics get ingested from which instances
is not centralized (in your monitoring system), then you run into the danger of
experimental or rogue jobs suddenly pushing lots of garbage data into your
production monitoring and bringing it down. There are still plenty of ways how
this can happen with a pull-based approach (which only controls where to pull
metrics from, but not the size and nature of the metrics payloads), but the
risk is lower. More importantly, such incidents can be mitigated at a central
point.</p>
<h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="2" id="real-world-proof">Real-world proof<a class="header-auto-link" href="#real-world-proof"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="0.875em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-link "><path d="M9 15l6 -6"></path><path d="M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464"></path><path d="M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463"></path></svg></a></h2>
<p>Besides the fact that Prometheus is already being used to monitor very large
setups in the real world (like using it to <a style="color:var(--secondary-link-color)" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-inherit="true" data-underline="hover" href="https://promcon.io/2016-berlin/talks/scaling-to-a-million-machines-with-prometheus/" target="_blank" rel="noopener"><span>monitor millions of machines at
DigitalOcean<!-- --> <svg xmlns="http://www.w3.org/2000/svg" width="0.9em" height="0.9em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-external-link " style="margin-bottom:-1.5px"><path d="M12 6h-6a2 2 0 0 0 -2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-6"></path><path d="M11 13l9 -9"></path><path d="M15 4h5v5"></path></svg></span></a>),
there are other prominent examples of pull-based monitoring being used
successfully in the largest possible environments. Prometheus was inspired by
Google&#x27;s Borgmon, which was (and partially still is) used within Google to
monitor all its critical production services using a pull-based approach. Any
scaling issues we encountered with Borgmon at Google were not due its pull
approach either. If a pull-based approach scales to a global environment with
many tens of datacenters and millions of machines, you can hardly say that pull
doesn&#x27;t scale.</p>
<h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="2" id="but-there-are-other-problems-with-pull">But there are other problems with pull!<a class="header-auto-link" href="#but-there-are-other-problems-with-pull"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="0.875em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-link "><path d="M9 15l6 -6"></path><path d="M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464"></path><path d="M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463"></path></svg></a></h2>
<p>There are indeed setups that are hard to monitor with a pull-based approach.
A prominent example is when you have many endpoints scattered around the
world which are not directly reachable due to firewalls or complicated
networking setups, and where it&#x27;s infeasible to run a Prometheus server
directly in each of the network segments. This is not quite the environment for
which Prometheus was built, although workarounds are often possible (<a style="color:var(--secondary-link-color)" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-inherit="true" data-underline="hover" href="/docs/practices/pushing/">via the
Pushgateway or restructuring your setup</a>). In any
case, these remaining concerns about pull-based monitoring are usually not
scaling-related, but due to network operation difficulties around opening TCP
connections.</p>
<h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="2" id="all-good-then">All good then?<a class="header-auto-link" href="#all-good-then"><svg xmlns="http://www.w3.org/2000/svg" width="0.875em" height="0.875em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-link "><path d="M9 15l6 -6"></path><path d="M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464"></path><path d="M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463"></path></svg></a></h2>
<p>This article addresses the most common scalability concerns around a pull-based
monitoring approach. With Prometheus and other pull-based systems being used
successfully in very large environments and the pull aspect not posing a
bottleneck in reality, the result should be clear: the “pull doesn&#x27;t scale”
argument is not a real concern. We hope that future debates will focus on
aspects that matter more than this red herring.</p></div></div><!--$--><!--/$--><div style="height:calc(3.125rem * var(--mantine-scale));min-height:calc(3.125rem * var(--mantine-scale))" class=""></div></div></main><footer style="background-color:light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-9))"><style data-mantine-styles="inline">.__m__-_R_eqtb_{padding-inline:var(--mantine-spacing-md);}@media(min-width: 36em){.__m__-_R_eqtb_{padding-inline:var(--mantine-spacing-xl);}}</style><div style="--container-size:var(--container-size-xl);padding-block:var(--mantine-spacing-xl)" class="m_7485cace mantine-Container-root __m__-_R_eqtb_" data-size="xl"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><p style="color:var(--mantine-color-dimmed);font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">© Prometheus Authors 2014-<!-- -->2026<!-- --> | All components are available under the<!-- --> <a class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2 License</a> <!-- -->on<!-- --> <a class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://github.com/prometheus">GitHub</a>.</p><p style="color:var(--mantine-color-dimmed);font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">© <!-- -->2026<!-- --> The Linux Foundation. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our<!-- --> <a class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-inherit="true" data-underline="hover" href="https://www.linuxfoundation.org/trademark-usage" target="_blank">Trademark Usage</a> <!-- -->page.</p></div></div></footer></div><script src="/_next/static/chunks/webpack-b375e03dd2b40bc6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[90533,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"ColorSchemeScript\"]\n3:I[3601,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"MantineProvider\"]\n4:I[253,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"728\",\"static/chunks/728-dddccccbb8b7ce64.js\",\"662\",\"static/chunks/662-48ddd1f95938f105.js\",\"177\",\"static/chunks/app/layout-faf6aa14544df6bb.js\"],\"default\"]\n5:I[75802,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"AppShell\"]\n6:I[93116,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"728\",\"static/chunks/728-dddccccbb8b7ce64.js\",\"662\",\"static/chunks/662-48ddd1f95938f105.js\",\"177\",\"static/chunks/app/layout-faf6aa14544df6bb.js\"],\"Header\"]\n7:I[44190,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"AppShellMain\"]\n8:I[13877,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"Container\"]\n9:I[9766,[],\"\"]\na:I[98924,[],\"\"]\nb:I[69772,[\"545\",\"static/"])</script><script>self.__next_f.push([1,"chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"Space\"]\nc:I[67661,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"Group\"]\nd:I[70305,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"Text\"]\ne:I[77147,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"Anchor\"]\nf:I[68332,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"728\",\"static/chunks/728-dddccccbb8b7ce64.js\",\"662\",\"static/chunks/662-48ddd1f95938f105.js\",\"177\",\"static/chunks/app/layout-faf6aa14544df6bb.js\"],\"GoogleAnalytics\"]\n16:I[57150,[],\"\"]\n:HL[\"/_next/static/media/155cae559bbd1a77-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/e4af272ccee01ff0-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/0566b04bc4104246.css\",\"style\"]\n:HL[\"/_next/static/css/12996fad8d583efc.css\",\"style\"]\n:HL[\"/_next/static/css/afedc5bb723d1741.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"1djEv-SVOeSl50q5K3eKc\",\"p\":\"\",\"c\":[\"\",\"blog\",\"2016\",\"07\",\"23\",\"pull-does-not-scale-or-does-it\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"blog\",{\"children\":[[\"year\",\"2016\",\"d\"],{\"children\":[[\"month\",\"07\",\"d\"],{\"children\":[[\"day\",\"23\",\"d\"],{\"children\":[[\"slug\",\"pull-does-not-scale-or-does-it\",\"d\"],{\"children\":[\"__PAGE__\",{}]}]}]}]}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/0566b04bc4104246.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/12996fad8d583efc.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/afedc5bb723d1741.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"data-mantine-color-scheme\":\"light\",\"className\":\"__variable_f367f3 __variable_d0e872\",\"style\":{\"--header-height\":\"112px\"},\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"$L2\",null,{\"defaultColorScheme\":\"auto\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L3\",null,{\"theme\":{\"colors\":{\"prometheusColor\":[\"#ffede6\",\"#ffdad2\",\"#f6b5a4\",\"#f08e74\",\"#ea6b4b\",\"#e75630\",\"#e64a22\",\"#cc3b16\",\"#b73311\",\"#a02709\"]},\"black\":\"var(--mantine-color-gray-8)\",\"primaryColor\":\"prometheusColor\",\"headings\":{\"fontFamily\":\"var(--font-inter)\",\"sizes\":{\"h1\":{}}}},\"defaultColorScheme\":\"auto\",\"children\":[[\"$\",\"$L4\",null,{}],[\"$\",\"$L5\",null,{\"header\":{\"height\":\"var(--header-height)\"},\"children\":[[\"$\",\"$L6\",null,{\"announcement\":{\"text\":\"Join [PromCon EU 2026](https://promcon.io/2026-munich/), the Prometheus users conference, on October 7–8, 2026 in Munich.\",\"mobileText\":\"[PromCon EU 2026](https://promcon.io/2026-munich/) — Oct 7–8, Munich.\",\"startDate\":\"2026-07-17\",\"endDate\":\"2026-10-08\"}}],[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$L8\",null,{\"size\":\"xl\",\"mt\":\"xl\",\"px\":{\"base\":\"md\",\"xs\":\"xl\"},\"children\":[[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$Lb\",null,{\"h\":50}]]}]}],[\"$\",\"footer\",null,{\"style\":{\"backgroundColor\":\"light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-9))\"},\"children\":[\"$\",\"$L8\",null,{\"size\":\"xl\",\"px\":{\"base\":\"md\",\"xs\":\"xl\"},\"py\":\"xl\",\"children\":[\"$\",\"$Lc\",null,{\"children\":[[\"$\",\"$Ld\",null,{\"c\":\"dimmed\",\"fz\":\"sm\",\"children\":[\"© Prometheus Authors 2014-\",2026,\" | All components are available under the\",\" \",[\"$\",\"$Le\",null,{\"href\":\"http://www.apache.org/licenses/LICENSE-2.0\",\"children\":\"Apache 2 License\"}],\" \",\"on\",\" \",[\"$\",\"$Le\",null,{\"href\":\"https://github.com/prometheus\",\"children\":\"GitHub\"}],\".\"]}],[\"$\",\"$Ld\",null,{\"c\":\"dimmed\",\"fz\":\"sm\",\"children\":[\"© \",2026,\" The Linux Foundation. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our\",\" \",[\"$\",\"$Le\",null,{\"inherit\":true,\"href\":\"https://www.linuxfoundation.org/trademark-usage\",\"target\":\"_blank\",\"children\":\"Trademark Usage\"}],\" \",\"page.\"]}]]}]}]}]]}]]}]}],[\"$\",\"$Lf\",null,{\"gaId\":\"G-80ZM8LGB96\"}]]}]]}],{\"children\":[\"blog\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"year\",\"2016\",\"d\"],[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":\"$L10\",\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"month\",\"07\",\"d\"],\"$L11\",{\"children\":[[\"day\",\"23\",\"d\"],\"$L12\",{\"children\":[[\"slug\",\"pull-does-not-scale-or-does-it\",\"d\"],\"$L13\",{\"children\":[\"__PAGE__\",\"$L14\",{},null,false]},null,false]},null,false]},null,false]},null,false]},null,false]},null,false],\"$L15\",false]],\"m\":\"$undefined\",\"G\":[\"$16\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"18:I[24431,[],\"OutletBoundary\"]\n1a:I[15278,[],\"AsyncMetadataOutlet\"]\n1c:I[24431,[],\"ViewportBoundary\"]\n1e:I[24431,[],\"MetadataBoundary\"]\n1f:\"$Sreact.suspense\"\n10:[\"$\",\"$La\",null,{}]\n11:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n12:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n13:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n14:[\"$\",\"$1\",\"c\",{\"children\":[\"$L17\",null,[\"$\",\"$L18\",null,{\"children\":[\"$L19\",[\"$\",\"$L1a\",null,{\"promise\":\"$@1b\"}]]}]]}]\n15:[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$L1c\",null,{\"children\":\"$L1d\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$L1e\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$1f\",null,{\"fallback\":null,\"children\":\"$L20\"}]}]}]]}]\n"])</script><script>self.__next_f.push([1,"21:I[67623,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"Box\"]\n22:I[74264,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"Title\"]\n17:[\"$\",\"$L21\",null,{\"data-pagefind-body\":true,\"children\":[[\"$\",\"$L22\",null,{\"order\":1,\"mt\":0,\"mb\":\"xs\",\"children\":\"Pull doesn't scale - or does it?\"}],[\"$\",\"$Ld\",null,{\"size\":\"sm\",\"c\":\"dimmed\",\"mb\":\"xl\",\"children\":[\"July 23, 2016\",\" by\",\" \",\"Julius Volz\"]}],\"$L23\"]}]\n"])</script><script>self.__next_f.push([1,"23:[\"$\",\"div\",null,{\"className\":\"markdown-content\",\"children\":\"$L24\"}]\n"])</script><script>self.__next_f.push([1,"25:I[52619,[\"545\",\"static/chunks/c16f53c3-e2edfe54eba3117f.js\",\"341\",\"static/chunks/341-0544a5ed99d6b02e.js\",\"619\",\"static/chunks/619-f072ac750404f9da.js\",\"53\",\"static/chunks/app/blog/%5Byear%5D/%5Bmonth%5D/%5Bday%5D/%5Bslug%5D/page-995789b87aded4b6.js\"],\"\"]\n"])</script><script>self.__next_f.push([1,"24:[[\"$\",\"p\",\"p-0\",{\"children\":\"Let's talk about a particularly persistent myth. Whenever there is a discussion\\nabout monitoring systems and Prometheus's pull-based metrics collection\\napproach comes up, someone inevitably chimes in about how a pull-based approach\\njust “fundamentally doesn't scale”. The given reasons are often vague or only\\napply to systems that are fundamentally different from Prometheus. In fact,\\nhaving worked with pull-based monitoring at the largest scales, this claim runs\\ncounter to our own operational experience.\"}],\"\\n\",[\"$\",\"p\",\"p-1\",{\"children\":[\"We already have an FAQ entry about\\n\",[\"$\",\"$Le\",\"a-0\",{\"inherit\":true,\"c\":\"var(--secondary-link-color)\",\"component\":\"$25\",\"href\":\"/docs/introduction/faq/#why-do-you-pull-rather-than-push\",\"children\":\"why Prometheus chooses pull over push\"}],\",\\nbut it does not focus specifically on scaling aspects. Let's have a closer look\\nat the usual misconceptions around this claim and analyze whether and how they\\nwould apply to Prometheus.\"]}],\"\\n\",\"\\n\",[\"$\",\"$L22\",\"h2-0\",{\"order\":2,\"id\":\"prometheus-is-not-nagios\",\"children\":[\"Prometheus is not Nagios\",[\"$\",\"a\",\"a-0\",{\"className\":\"header-auto-link\",\"href\":\"#prometheus-is-not-nagios\",\"children\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"0.875em\",\"height\":\"0.875em\",\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"tabler-icon tabler-icon-link \",\"children\":[\"$undefined\",[\"$\",\"path\",\"svg-0\",{\"d\":\"M9 15l6 -6\"}],[\"$\",\"path\",\"svg-1\",{\"d\":\"M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464\"}],[\"$\",\"path\",\"svg-2\",{\"d\":\"M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463\"}],\"$undefined\"]}]}]]}],\"\\n\",[\"$\",\"p\",\"p-2\",{\"children\":\"When people think of a monitoring system that actively pulls, they often think\\nof Nagios. Nagios has a reputation of not scaling well, in part due to spawning\\nsubprocesses for active checks that can run arbitrary actions on the Nagios\\nhost in order to determine the health of a certain host or service. This sort\\nof check architecture indeed does not scale well, as the central Nagios host\\nquickly gets overwhelmed. As a result, people usually configure checks to only\\nbe executed every couple of minutes, or they run into more serious problems.\"}],\"\\n\",[\"$\",\"p\",\"p-3\",{\"children\":\"However, Prometheus takes a fundamentally different approach altogether.\\nInstead of executing check scripts, it only collects time series data from a\\nset of instrumented targets over the network. For each target, the Prometheus\\nserver simply fetches the current state of all metrics of that target over HTTP\\n(in a highly parallel way, using goroutines) and has no other execution\\noverhead that would be pull-related. This brings us to the next point:\"}],\"\\n\",[\"$\",\"$L22\",\"h2-1\",{\"order\":2,\"id\":\"it-doesnt-matter-who-initiates-the-connection\",\"children\":[\"It doesn't matter who initiates the connection\",[\"$\",\"a\",\"a-0\",{\"className\":\"header-auto-link\",\"href\":\"#it-doesnt-matter-who-initiates-the-connection\",\"children\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"0.875em\",\"height\":\"0.875em\",\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"tabler-icon tabler-icon-link \",\"children\":[\"$undefined\",[\"$\",\"path\",\"svg-0\",{\"d\":\"M9 15l6 -6\"}],[\"$\",\"path\",\"svg-1\",{\"d\":\"M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464\"}],[\"$\",\"path\",\"svg-2\",{\"d\":\"M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463\"}],\"$undefined\"]}]}]]}],\"\\n\",[\"$\",\"p\",\"p-4\",{\"children\":\"For scaling purposes, it doesn't matter who initiates the TCP connection over\\nwhich metrics are then transferred. Either way you do it, the effort for\\nestablishing a connection is small compared to the metrics payload and other\\nrequired work.\"}],\"\\n\",\"$L26\",\"\\n\",\"$L27\",\"\\n\",\"$L28\",\"\\n\",\"$L29\",\"\\n\",\"$L2a\",\"\\n\",\"$L2b\",\"\\n\",\"$L2c\",\"\\n\",\"$L2d\",\"\\n\",\"$L2e\",\"\\n\",\"$L2f\",\"\\n\",\"$L30\",\"\\n\",\"$L31\",\"\\n\",\"$L32\",\"\\n\",\"$L33\",\"\\n\",\"$L34\",\"\\n\",\"$L35\",\"\\n\",\"$L36\",\"\\n\",\"$L37\"]\n"])</script><script>self.__next_f.push([1,"26:[\"$\",\"p\",\"p-5\",{\"children\":\"But a push-based approach could use UDP and avoid connection establishment\\naltogether, you say! True, but the TCP/HTTP overhead in Prometheus is still\\nnegligible compared to the other work that the Prometheus server has to do to\\ningest data (especially persisting time series data on disk). To put some\\nnumbers behind this: a single big Prometheus server can easily store millions\\nof time series, with a record of 800,000 incoming samples per second (as\\nmeasured with real production metrics data at SoundCloud). Given a 10-seconds\\nscrape interval and 700 time series per host, this allows you to monitor over\\n10,000 machines from a single Prometheus server. The scaling bottleneck here\\nhas never been related to pulling metrics, but usually to the speed at which\\nthe Prometheus server can ingest the data into memory and then sustainably\\npersist and expire data on disk/SSD.\"}]\n"])</script><script>self.__next_f.push([1,"27:[\"$\",\"p\",\"p-6\",{\"children\":\"Also, although networks are pretty reliable these days, using a TCP-based pull\\napproach makes sure that metrics data arrives reliably, or that the monitoring\\nsystem at least knows immediately when the metrics transfer fails due to a\\nbroken network.\"}]\n"])</script><script>self.__next_f.push([1,"28:[\"$\",\"$L22\",\"h2-2\",{\"order\":2,\"id\":\"prometheus-is-not-an-event-based-system\",\"children\":[\"Prometheus is not an event-based system\",[\"$\",\"a\",\"a-0\",{\"className\":\"header-auto-link\",\"href\":\"#prometheus-is-not-an-event-based-system\",\"children\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"0.875em\",\"height\":\"0.875em\",\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"tabler-icon tabler-icon-link \",\"children\":[\"$undefined\",[\"$\",\"path\",\"svg-0\",{\"d\":\"M9 15l6 -6\"}],[\"$\",\"path\",\"svg-1\",{\"d\":\"M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464\"}],[\"$\",\"path\",\"svg-2\",{\"d\":\"M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463\"}],\"$undefined\"]}]}]]}]\n"])</script><script>self.__next_f.push([1,"29:[\"$\",\"p\",\"p-7\",{\"children\":\"Some monitoring systems are event-based. That is, they report each individual\\nevent (an HTTP request, an exception, you name it) to a central monitoring\\nsystem immediately as it happens. This central system then either aggregates\\nthe events into metrics (StatsD is the prime example of this) or stores events\\nindividually for later processing (the ELK stack is an example of that). In\\nsuch a system, pulling would be problematic indeed: the instrumented service\\nwould have to buffer events between pulls, and the pulls would have to happen\\nincredibly frequently in order to simulate the same “liveness” of the\\npush-based approach and not overwhelm event buffers.\"}]\n"])</script><script>self.__next_f.push([1,"2a:[\"$\",\"p\",\"p-8\",{\"children\":[\"However, again, Prometheus is not an event-based monitoring system. You do not\\nsend raw events to Prometheus, nor can it store them. Prometheus is in the\\nbusiness of collecting aggregated time series data. That means that it's only\\ninterested in regularly collecting the current \",[\"$\",\"em\",\"em-0\",{\"children\":\"state\"}],\" of a given set of\\nmetrics, not the underlying events that led to the generation of those metrics.\\nFor example, an instrumented service would not send a message about each HTTP\\nrequest to Prometheus as it is handled, but would simply count up those\\nrequests in memory. This can happen hundreds of thousands of times per second\\nwithout causing any monitoring traffic. Prometheus then simply asks the service\\ninstance every 15 or 30 seconds (or whatever you configure) about the current\\ncounter value and stores that value together with the scrape timestamp as a\\nsample. Other metric types, such as gauges, histograms, and summaries, are\\nhandled similarly. The resulting monitoring traffic is low, and the pull-based\\napproach also does not create problems in this case.\"]}]\n"])</script><script>self.__next_f.push([1,"2b:[\"$\",\"$L22\",\"h2-3\",{\"order\":2,\"id\":\"but-now-my-monitoring-needs-to-know-about-my-service-instances\",\"children\":[\"But now my monitoring needs to know about my service instances!\",[\"$\",\"a\",\"a-0\",{\"className\":\"header-auto-link\",\"href\":\"#but-now-my-monitoring-needs-to-know-about-my-service-instances\",\"children\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"0.875em\",\"height\":\"0.875em\",\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"tabler-icon tabler-icon-link \",\"children\":[\"$undefined\",[\"$\",\"path\",\"svg-0\",{\"d\":\"M9 15l6 -6\"}],[\"$\",\"path\",\"svg-1\",{\"d\":\"M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464\"}],[\"$\",\"path\",\"svg-2\",{\"d\":\"M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463\"}],\"$undefined\"]}]}]]}]\n"])</script><script>self.__next_f.push([1,"2c:[\"$\",\"p\",\"p-9\",{\"children\":\"With a pull-based approach, your monitoring system needs to know which service\\ninstances exist and how to connect to them. Some people are worried about the\\nextra configuration this requires on the part of the monitoring system and see\\nthis as an operational scalability problem.\"}]\n"])</script><script>self.__next_f.push([1,"2d:[\"$\",\"p\",\"p-10\",{\"children\":[\"We would argue that you cannot escape this configuration effort for\\nserious monitoring setups in any case: if your monitoring system doesn't know\\nwhat the world \",[\"$\",\"em\",\"em-0\",{\"children\":\"should\"}],\" look like and which monitored service instances\\n\",[\"$\",\"em\",\"em-1\",{\"children\":\"should\"}],\" be there, how would it be able to tell when an instance just never\\nreports in, is down due to an outage, or really is no longer meant to exist?\\nThis is only acceptable if you never care about the health of individual\\ninstances at all, like when you only run ephemeral workers where it is\\nsufficient for a large-enough number of them to report in some result. Most\\nenvironments are not exclusively like that.\"]}]\n"])</script><script>self.__next_f.push([1,"2e:[\"$\",\"p\",\"p-11\",{\"children\":[\"If the monitoring system needs to know the desired state of the world anyway,\\nthen a push-based approach actually requires \",[\"$\",\"em\",\"em-0\",{\"children\":\"more\"}],\" configuration in total. Not\\nonly does your monitoring system need to know what service instances should\\nexist, but your service instances now also need to know how to reach your\\nmonitoring system. A pull approach not only requires less configuration,\\nit also makes your monitoring setup more flexible. With pull, you can just run\\na copy of production monitoring on your laptop to experiment with it. It also\\nallows you just fetch metrics with some other tool or inspect metrics endpoints\\nmanually. To get high availability, pull allows you to just run two identically\\nconfigured Prometheus servers in parallel. And lastly, if you have to move the\\nendpoint under which your monitoring is reachable, a pull approach does not\\nrequire you to reconfigure all of your metrics sources.\"]}]\n"])</script><script>self.__next_f.push([1,"2f:[\"$\",\"p\",\"p-12\",{\"children\":\"On a practical front, Prometheus makes it easy to configure the desired state\\nof the world with its built-in support for a wide variety of service discovery\\nmechanisms for cloud providers and container-scheduling systems: Consul,\\nMarathon, Kubernetes, EC2, DNS-based SD, Azure, Zookeeper Serversets, and more.\\nPrometheus also allows you to plug in your own custom mechanism if needed.\\nIn a microservice world or any multi-tiered architecture, it is also\\nfundamentally an advantage if your monitoring system uses the same method to\\ndiscover targets to monitor as your service instances use to discover their\\nbackends. This way you can be sure that you are monitoring the same targets\\nthat are serving production traffic and you have only one discovery mechanism\\nto maintain.\"}]\n"])</script><script>self.__next_f.push([1,"30:[\"$\",\"$L22\",\"h2-4\",{\"order\":2,\"id\":\"accidentally-ddos-ing-your-monitoring\",\"children\":[\"Accidentally DDoS-ing your monitoring\",[\"$\",\"a\",\"a-0\",{\"className\":\"header-auto-link\",\"href\":\"#accidentally-ddos-ing-your-monitoring\",\"children\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"0.875em\",\"height\":\"0.875em\",\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"tabler-icon tabler-icon-link \",\"children\":[\"$undefined\",[\"$\",\"path\",\"svg-0\",{\"d\":\"M9 15l6 -6\"}],[\"$\",\"path\",\"svg-1\",{\"d\":\"M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464\"}],[\"$\",\"path\",\"svg-2\",{\"d\":\"M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463\"}],\"$undefined\"]}]}]]}]\n"])</script><script>self.__next_f.push([1,"31:[\"$\",\"p\",\"p-13\",{\"children\":\"Whether you pull or push, any time-series database will fall over if you send\\nit more samples than it can handle. However, in our experience it's slightly\\nmore likely for a push-based approach to accidentally bring down your\\nmonitoring. If the control over what metrics get ingested from which instances\\nis not centralized (in your monitoring system), then you run into the danger of\\nexperimental or rogue jobs suddenly pushing lots of garbage data into your\\nproduction monitoring and bringing it down. There are still plenty of ways how\\nthis can happen with a pull-based approach (which only controls where to pull\\nmetrics from, but not the size and nature of the metrics payloads), but the\\nrisk is lower. More importantly, such incidents can be mitigated at a central\\npoint.\"}]\n"])</script><script>self.__next_f.push([1,"32:[\"$\",\"$L22\",\"h2-5\",{\"order\":2,\"id\":\"real-world-proof\",\"children\":[\"Real-world proof\",[\"$\",\"a\",\"a-0\",{\"className\":\"header-auto-link\",\"href\":\"#real-world-proof\",\"children\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"0.875em\",\"height\":\"0.875em\",\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"tabler-icon tabler-icon-link \",\"children\":[\"$undefined\",[\"$\",\"path\",\"svg-0\",{\"d\":\"M9 15l6 -6\"}],[\"$\",\"path\",\"svg-1\",{\"d\":\"M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464\"}],[\"$\",\"path\",\"svg-2\",{\"d\":\"M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463\"}],\"$undefined\"]}]}]]}]\n"])</script><script>self.__next_f.push([1,"33:[\"$\",\"p\",\"p-14\",{\"children\":[\"Besides the fact that Prometheus is already being used to monitor very large\\nsetups in the real world (like using it to \",[\"$\",\"$Le\",\"a-0\",{\"inherit\":true,\"c\":\"var(--secondary-link-color)\",\"href\":\"https://promcon.io/2016-berlin/talks/scaling-to-a-million-machines-with-prometheus/\",\"target\":\"_blank\",\"rel\":\"noopener\",\"children\":[\"$\",\"span\",null,{\"children\":[\"monitor millions of machines at\\nDigitalOcean\",\" \",[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"0.9em\",\"height\":\"0.9em\",\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"tabler-icon tabler-icon-external-link \",\"style\":{\"marginBottom\":-1.5},\"children\":[\"$undefined\",[\"$\",\"path\",\"svg-0\",{\"d\":\"M12 6h-6a2 2 0 0 0 -2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-6\"}],[\"$\",\"path\",\"svg-1\",{\"d\":\"M11 13l9 -9\"}],[\"$\",\"path\",\"svg-2\",{\"d\":\"M15 4h5v5\"}],\"$undefined\"]}]]}]}],\"),\\nthere are other prominent examples of pull-based monitoring being used\\nsuccessfully in the largest possible environments. Prometheus was inspired by\\nGoogle's Borgmon, which was (and partially still is) used within Google to\\nmonitor all its critical production services using a pull-based approach. Any\\nscaling issues we encountered with Borgmon at Google were not due its pull\\napproach either. If a pull-based approach scales to a global environment with\\nmany tens of datacenters and millions of machines, you can hardly say that pull\\ndoesn't scale.\"]}]\n"])</script><script>self.__next_f.push([1,"34:[\"$\",\"$L22\",\"h2-6\",{\"order\":2,\"id\":\"but-there-are-other-problems-with-pull\",\"children\":[\"But there are other problems with pull!\",[\"$\",\"a\",\"a-0\",{\"className\":\"header-auto-link\",\"href\":\"#but-there-are-other-problems-with-pull\",\"children\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"0.875em\",\"height\":\"0.875em\",\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"tabler-icon tabler-icon-link \",\"children\":[\"$undefined\",[\"$\",\"path\",\"svg-0\",{\"d\":\"M9 15l6 -6\"}],[\"$\",\"path\",\"svg-1\",{\"d\":\"M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464\"}],[\"$\",\"path\",\"svg-2\",{\"d\":\"M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463\"}],\"$undefined\"]}]}]]}]\n"])</script><script>self.__next_f.push([1,"35:[\"$\",\"p\",\"p-15\",{\"children\":[\"There are indeed setups that are hard to monitor with a pull-based approach.\\nA prominent example is when you have many endpoints scattered around the\\nworld which are not directly reachable due to firewalls or complicated\\nnetworking setups, and where it's infeasible to run a Prometheus server\\ndirectly in each of the network segments. This is not quite the environment for\\nwhich Prometheus was built, although workarounds are often possible (\",[\"$\",\"$Le\",\"a-0\",{\"inherit\":true,\"c\":\"var(--secondary-link-color)\",\"component\":\"$25\",\"href\":\"/docs/practices/pushing/\",\"children\":\"via the\\nPushgateway or restructuring your setup\"}],\"). In any\\ncase, these remaining concerns about pull-based monitoring are usually not\\nscaling-related, but due to network operation difficulties around opening TCP\\nconnections.\"]}]\n"])</script><script>self.__next_f.push([1,"36:[\"$\",\"$L22\",\"h2-7\",{\"order\":2,\"id\":\"all-good-then\",\"children\":[\"All good then?\",[\"$\",\"a\",\"a-0\",{\"className\":\"header-auto-link\",\"href\":\"#all-good-then\",\"children\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"0.875em\",\"height\":\"0.875em\",\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"tabler-icon tabler-icon-link \",\"children\":[\"$undefined\",[\"$\",\"path\",\"svg-0\",{\"d\":\"M9 15l6 -6\"}],[\"$\",\"path\",\"svg-1\",{\"d\":\"M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464\"}],[\"$\",\"path\",\"svg-2\",{\"d\":\"M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463\"}],\"$undefined\"]}]}]]}]\n"])</script><script>self.__next_f.push([1,"37:[\"$\",\"p\",\"p-16\",{\"children\":\"This article addresses the most common scalability concerns around a pull-based\\nmonitoring approach. With Prometheus and other pull-based systems being used\\nsuccessfully in very large environments and the pull aspect not posing a\\nbottleneck in reality, the result should be clear: the “pull doesn't scale”\\nargument is not a real concern. We hope that future debates will focus on\\naspects that matter more than this red herring.\"}]\n"])</script><script>self.__next_f.push([1,"1d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n19:null\n"])</script><script>self.__next_f.push([1,"38:I[80622,[],\"IconMark\"]\n"])</script><script>self.__next_f.push([1,"1b:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Pull doesn't scale - or does it? | Prometheus\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"keywords\",\"content\":\"prometheus,monitoring,monitoring system,time series,time series database,alerting,metrics,telemetry\"}],[\"$\",\"link\",\"3\",{\"rel\":\"canonical\",\"href\":\"https://prometheus.io/blog/2016/07/23/pull-does-not-scale-or-does-it/\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:title\",\"content\":\"Pull doesn't scale - or does it? | Prometheus\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:description\",\"content\":\"An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:url\",\"content\":\"https://prometheus.io/blog/2016/07/23/pull-does-not-scale-or-does-it/\"}],[\"$\",\"meta\",\"7\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"8\",{\"name\":\"twitter:title\",\"content\":\"Pull doesn't scale - or does it? | Prometheus\"}],[\"$\",\"meta\",\"9\",{\"name\":\"twitter:description\",\"content\":\"An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.\"}],[\"$\",\"meta\",\"10\",{\"name\":\"twitter:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"11\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"12\",{\"name\":\"twitter:image:height\",\"content\":\"1200\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:image\",\"content\":\"https://prometheus.io/twitter-image.png?b370f6418ef38b42\"}],[\"$\",\"link\",\"14\",{\"rel\":\"icon\",\"href\":\"/icon.svg?7aa022e51797bcef\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$L38\",\"15\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"20:\"$1b:metadata\"\n"])</script><script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"cc28b1a407d64aa69c7eacf5e17ab530","r":1,"spa":2}' crossorigin="anonymous"></script>
</body></html>