blob: 73725a2eb538ecbdd1d1fdb0e8b53b5fb3661c73 [file] [log] [blame]
<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-deployment/04Exporter" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.3">
<title data-rh="true">RocketMQ Promethus Exporter | RocketMQ</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://your-docusaurus-test-site.com/docs/4.x/deployment/04Exporter"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="RocketMQ Promethus Exporter | RocketMQ"><meta data-rh="true" name="description" content="Introduction"><meta data-rh="true" property="og:description" content="Introduction"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://your-docusaurus-test-site.com/docs/4.x/deployment/04Exporter"><link data-rh="true" rel="alternate" href="https://your-docusaurus-test-site.com/zh/docs/4.x/deployment/04Exporter" hreflang="zh"><link data-rh="true" rel="alternate" href="https://your-docusaurus-test-site.com/docs/4.x/deployment/04Exporter" hreflang="en"><link data-rh="true" rel="alternate" href="https://your-docusaurus-test-site.com/docs/4.x/deployment/04Exporter" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://R2IYF7ETH7-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="RocketMQ RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="RocketMQ Atom Feed">
<link rel="search" type="application/opensearchdescription+xml" title="RocketMQ" href="/opensearch.xml">
<script>var _hmt=_hmt||[];!function(){var e=document.createElement("script");e.src="https://hm.baidu.com/hm.js?36428f2b841d08e7405724cbf7f860d2";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)}()</script>
<link rel="preconnect" href="https://www.google-analytics.com">
<script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,ga("create","UA-89603173-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview")</script>
<script async src="https://www.google-analytics.com/analytics.js"></script>
<link rel="alternate" type="application/rss+xml" href="/events/rss.xml" title="RocketMQ RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/events/atom.xml" title="RocketMQ Atom Feed">
<link rel="alternate" type="application/rss+xml" href="/release-notes/rss.xml" title="RocketMQ RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/release-notes/atom.xml" title="RocketMQ Atom Feed">
<link rel="alternate" type="application/rss+xml" href="/news/rss.xml" title="RocketMQ RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/news/atom.xml" title="RocketMQ Atom Feed">
<link rel="stylesheet" href="//g.alicdn.com/mamba/assets/0.0.13/mse-arc-ui.min.css">
<script src="//g.alicdn.com/mamba/assets/0.0.13/mse-arc-ui.min.js"></script><link rel="stylesheet" href="/assets/css/styles.b006b670.css">
<link rel="preload" href="/assets/js/runtime~main.9fb1bb92.js" as="script">
<link rel="preload" href="/assets/js/main.db9ae330.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/Apache_RocketMQ_logo.svg.png" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/Apache_RocketMQ_logo.svg.png" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">Apache RocketMQ</b></a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/apache/rocketmq" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link"><svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true" class="iconLanguage_nlXk"><path fill="currentColor" d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path></svg>English</a><ul class="dropdown__menu"><li><a href="/zh/docs/4.x/deployment/04Exporter" target="_self" rel="noopener noreferrer" class="dropdown__link" lang="zh">简体中文</a></li><li><a href="/docs/4.x/deployment/04Exporter" target="_self" rel="noopener noreferrer" class="dropdown__link dropdown__link--active" lang="en">English</a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Docs</a><ul class="dropdown__menu"><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/docs/">5.0</a></li><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/docs/4.x/">4.x</a></li></ul></div><a class="navbar__item navbar__link" href="/download">Download</a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Blog</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/blog">User Cases</a></li><li><a class="dropdown__link" href="/events">Activity</a></li><li><a class="dropdown__link" href="/release-notes">Change Log</a></li><li><a class="dropdown__link" href="/news">RocketMQ News</a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Community</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/contact">Join Community</a></li><li><a class="dropdown__link" href="/origin">Origin</a></li><li><a class="dropdown__link" href="/team">Teams</a></li><li><a class="dropdown__link" href="/docs/contributionGuide/01how-to-contribute">Contributions</a></li><li><a class="dropdown__link" href="/enterprise">Enterprises</a></li></ul></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/4.x/">Introduction</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/4.x/producer/01concept1">Producer</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/4.x/consumer/01concept2">Consumer</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" aria-expanded="true" href="/docs/4.x/deployment/01deploy">Deployment &amp; Operations</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/4.x/deployment/01deploy">Deployment Method</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/4.x/deployment/02admintool">Admin Tool</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/4.x/deployment/03Dashboard">RocketMQ Dashboard</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/4.x/deployment/04Exporter">RocketMQ Promethus Exporter</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/4.x/bestPractice/01bestpractice">Best Practice</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/4.x/parameterConfiguration/01local">Parameter Configuration</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/4.x/eventbridge/01RocketMQEventBridgeConcepts">RocketMQ EventBridge</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/4.x/mqtt/01RocketMQMQTTOverview">RocketMQ MQTT</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/4.x/streams/01RocketMQ Streams Overview">RocketMQ Streams</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/4.x/connect/01RocketMQ Connect Overview">RocketMQ Connect</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/4.x/contributionGuide/01how-to-contribute">Contribution Guide</a></div></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">Deployment &amp; Operations</span><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">RocketMQ Promethus Exporter</span><meta itemprop="position" content="2"></li></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: 4.x</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><h1>RocketMQ Promethus Exporter</h1><h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2><p><code>Rocketmq-exporter</code> is a system for monitoring all relevant metrics of the RocketMQ broker and client sides, which packages the metric values obtained from the broker side through mqAdmin into 87 caches.</p><div class="theme-admonition theme-admonition-caution alert alert--warning admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_S0QG"><p>In previous versions, there were 87 concurrentHashMaps, but since the Map does not delete expired metrics, once there is a label change, a new metric is generated and the old, unused metric cannot be automatically deleted, which eventually causes a memory overflow. However, using the Cache structure can enable expired deletion, and the expiration time can be configured.</p></div></div><p>The process for <code>Rocketmq-exporter</code> to obtain monitoring metrics is shown in the following figure. The exporter requests data from the MQ cluster through MQAdminExt, and the requested data is standardized into the format required by Prometheus through the MetricService, and then exposed to Promethus through the <code>/metrics</code> interface.
<img loading="lazy" alt="adfljlkvnflkn" src="/assets/images/RocketMQ Prometheus Exporter-1-569c982f31d232cb9ddcafaf2aaf5ee7.jpeg" width="1798" height="1080" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="metric-structure">Metric structure<a href="#metric-structure" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h3><p>The Metric class is located in the <strong><code>org.apache.rocketmq.expoter.model.metrics</code></strong> package, and is essentially a set of entity classes, with each entity class representing a type of metric, for a total of 14 Metric classes. These classes serve as the keys for the 87 caches and are distinguished by different label values.</p><div class="theme-admonition theme-admonition-note alert alert--secondary admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>The entity classes contain three dimensions of labels:broker、consumer、producer</div><div class="admonitionContent_S0QG"><ul><li><p><strong>Metric classes related to the broker </strong>: BrokerRuntimeMetric、BrokerMetric、DLQTopicOffsetMetric、TopicPutNumMetric</p></li><li><p><strong>Consumer-related classes </strong>: ConsumerRuntimeConsumeFailedMsgsMetric 、ConsumerRuntimeConsumeFailedTPSMetric 、ConsumerRuntimeConsumeOKTPSMetric、ConsumerRuntimeConsumeRTMetric、ConsumerRuntimePullRTMetric、ConsumerRuntimePullTPSMetric、ConsumerCountMetric、ConsumerMetric、ConsumerTopicDiffMetric</p></li><li><p><strong>Producer-related metric classes</strong>: ProducerMetric </p></li></ul></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="prometheus-pulls-metrics">Prometheus pulls metrics<a href="#prometheus-pulls-metrics" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h3><p>The <code>RocketMQ-exporter</code> project and <code>Prometheus</code> are equivalent to the server-client relationship, where the RocketMQ-exporter project introduces the Prometheus client package, which specifies the type of information to be obtained in the project&#x27;s MetricFamilySamples class. Prometheus requests metrics from exporter, and exporter returns the information to Prometheus after packaging it into the corresponding type.</p><p>After the rocketmq-exporter project is started, it will collect various metrics from rocketmq into the mfs object. When the browser or Prometheus accesses the corresponding interface, the samples in the mfs object will be generated into the formatted data supported by Prometheus through the service. It mainly includes the following steps:</p><p>The browser accesses ip:5557/metrics to call the metrics method in the RMQMetricsController class, where ip is the IP of the host where the rocketmq-exporter project is running.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">private void metrics(HttpServletResponse response) throws IOException {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> StringWriter writer = new StringWriter();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> metricsService.metrics(writer);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> response.setHeader(&quot;Content-Type&quot;, &quot;text/plain; version=0.0.4; charset=utf-8&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> response.getOutputStream().print(writer.toString());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>By creating a new StringWriter object to collect metric indicators, the metrics in the exporter are collected into the writer object through the metrics method in the MetricsService class, and then the collected indicators are output to the webpage.</p><p>The format of the collected metrics is:</p><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">metric name</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">label name</span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">label value</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token spread operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">metric value</span><span class="token operator" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Example:</p><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rocketmq_group_diff</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">group</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">&quot;rmq_group_test_20220114&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">topic</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">&quot;fusion_console_tst&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">countOfOnlineConsumers</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">&quot;0&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">msgModel</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">&quot;1&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">23.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-5-scheduled-tasks-in-the-metriccollecttask-class">The 5 scheduled tasks in the MetricCollectTask class<a href="#the-5-scheduled-tasks-in-the-metriccollecttask-class" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h3><p>The MetricCollectTask class has five scheduled tasks: collectTopicOffset, collectConsumerOffset, collectBrokerStatsTopic, collectBrokerStats, and collectBrokerRuntimeStats. They are used to collect consumer offset information and Broker state information, etc. Its cron expression is: cron: 15 0/1 * * * ?, which means it will collect once per minute. Its core function is to obtain information from the broker in the cluster through the mqAdminExt object and then add it to the corresponding 87 monitoring indicators, taking collectTopicOffset as an example:</p><ol><li><p>First, initialize the TopicList object and obtain all topic information in the cluster through the mqAdminExt.fetchAllTopicList() method.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">TopicList topicList = null;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">try { </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> topicList = mqAdminExt.fetchAllTopicList();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">} catch (Exception ex) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> log.error(String.format(&quot;collectTopicOffset-exception comes getting topic list from namesrv, address is %s&quot;,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> JSON.toJSONString(mqAdminExt.getNameServerAddressList())));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> return;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li><li><p>Add the topic to the topicSet, and iterate through each topic, checking the topic status through the mqAdminExt.examineTopicStats(topic) function.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Set &lt; String &gt; topicSet = topicList != null ? topicList.getTopicList() : null;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">for (String topic: topicSet) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> TopicStatsTable topicStats = null;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> try {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> topicStats = mqAdminExt.examineTopicStats(topic);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> } catch (Exception ex) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> log.error(String.format(&quot;collectTopicOffset-getting topic(%s) stats error. the namesrv address is %s&quot;,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> topic,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> JSON.toJSONString(mqAdminExt.getNameServerAddressList())));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> continue;}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li><li><p>Initialize the topic status set, the hash table brokerOffsetMap for topic information offset divided by broker, and a hash table brokerUpdateTimestampMap with broker name as the key to store the update timestamp.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Set&lt;Map.Entry&lt;MessageQueue, TopicOffset&gt;&gt; topicStatusEntries = topicStats.getOffsetTable().entrySet();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HashMap&lt;String, Long&gt; brokerOffsetMap = new HashMap&lt;&gt;();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HashMap&lt;String, Long&gt; brokerUpdateTimestampMap = new HashMap&lt;&gt;();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">for (Map.Entry&lt;MessageQueue, TopicOffset&gt; topicStatusEntry : topicStatusEntries) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> MessageQueue q = topicStatusEntry.getKey();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> TopicOffset offset = topicStatusEntry.getValue();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> if (brokerOffsetMap.containsKey(q.getBrokerName())) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> brokerOffsetMap.put(q.getBrokerName(), brokerOffsetMap.get(q.getBrokerName()) + offset.getMaxOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> } else {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> brokerOffsetMap.put(q.getBrokerName(), offset.getMaxOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> if (brokerUpdateTimestampMap.containsKey(q.getBrokerName())) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> if (offset.getLastUpdateTimestamp() &gt; brokerUpdateTimestampMap.get(q.getBrokerName())) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> brokerUpdateTimestampMap.put(q.getBrokerName(), offset.getLastUpdateTimestamp());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> } else {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> brokerUpdateTimestampMap.put(q.getBrokerName(),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> offset.getLastUpdateTimestamp());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li><li><p>Finally, by iterating through each item in the brokerOffsetMap, the metricCollector object is obtained through the metricsService and the addTopicOffsetMetric method in the RMQMetricsCollector class is called to add the corresponding value to one of the caches of the 87 metrics in the RMQMetricsCollector class.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> Set&lt;Map.Entry&lt;String, Long&gt;&gt; brokerOffsetEntries = brokerOffsetMap.entrySet();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> for (Map.Entry&lt;String, Long&gt; brokerOffsetEntry : brokerOffsetEntries) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> metricsService.getCollector().addTopicOffsetMetric(clusterName, brokerOffsetEntry.getKey(), topic,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> brokerUpdateTimestampMap.get(brokerOffsetEntry.getKey()), brokerOffsetEntry.getValue());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> log.info(&quot;topic offset collection task finished....&quot; + (System.currentTimeMillis() - start));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="rocketmq-exporter-collects-metrics-flowchart">Rocketmq-exporter collects metrics flowchart<a href="#rocketmq-exporter-collects-metrics-flowchart" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h3><p><img loading="lazy" alt="adfadffvszfxv" src="/assets/images/RocketMQ Prometheus Exporter - 2-fdd37b4d6c89244c23bac2bf87ff7e26.jpeg" width="899" height="425" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="quick-star">Quick star<a href="#quick-star" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="configure-applicationyml">Configure <code>application.yml</code><a href="#configure-applicationyml" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h3><p>Important configurations in <code>application.yml</code> include:</p><ul><li><p>server.port sets the port that Prometheus listens to for the rocketmq-exporter, with a default value of 5557.</p></li><li><p>rocketmq.config.webTelemetryPath configures the path for Prometheus to obtain metrics, with a default value of /metrics. The default value can be used.</p></li><li><p>rocketmq.config.enableACL If the RocketMQ cluster has enabled ACL verification, it needs to be set to true and the corresponding ak and sk need to be configured in accessKey and secretKey.</p></li><li><p>rocketmq.config.outOfTimeSeconds is used to configure the expiration time of storing metrics and their values. If it exceeds this time and the key in the cache has not undergone a write change, it will be deleted. Generally, it can be configured as 60s (the time interval for Prometheus to obtain metrics should be reasonably configured according to the expiration time, as long as the expiration time is greater than or equal to the time interval for Prometheus to collect metrics).</p></li><li><p>task.<em>.cron configures the time interval for the exporter to pull metrics from the broker through a scheduled task, with a default value of &quot;15 0/1 </em> * * ?&quot; which means it will pull metrics every 15s of every minute.</p></li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="start-exporter-application">Start exporter application<a href="#start-exporter-application" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h3><h3 class="anchor anchorWithStickyNavbar_LWe7" id="start-prometheus-according-to-the-configuration-on-its-official-website">Start Prometheus according to the configuration on its official website<a href="#start-prometheus-according-to-the-configuration-on-its-official-website" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h3><p>Configure Prometheus&#x27;s static_config: -targets to the exporter&#x27;s starting IP and port, such as: localhost:5557.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="access-the-prometheus-page">Access the Prometheus page<a href="#access-the-prometheus-page" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h3><p>If the localhost starts at the default localhost:9090, you can view the collected metric values, as shown in the following figure:</p><p><img loading="lazy" alt="58u580u2341" src="/assets/images/RocketMQ Prometheus Exporter-3-f5d7bc508a5e4f791de91d2835b261b7.jpeg" width="1510" height="431" class="img_ev3q"></p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>For better visualization effects and to observe the trend of metric value changes, Prometheus is better used with Grafana!</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="observability-metrics">Observability metrics<a href="#observability-metrics" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2><p>Observability metrics mainly include two categories: server-side metrics and client-side metrics. Server-side metrics are directly generated by the server, and client-side metrics are generated on the client and obtained by the server through an RPC request to the client. Client-side metrics can be further divided into producer metrics and consumer metrics. All 87 observability metrics and their main meanings are as follows:</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Server metrics</summary><div><div class="collapsibleContent_i85q"><h3 class="anchor anchorWithStickyNavbar_LWe7" id="server--metrics">Server metrics<a href="#server--metrics" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h3><table><thead><tr><th>Metrics name</th><th>Definition</th><th>Corresponds to Broker metric name</th></tr></thead><tbody><tr><td>rocketmq_broker_tps</td><td>Broker-level production TPS</td><td></td></tr><tr><td>rocketmq_broker_qps</td><td>Broker-level consumption QPS</td><td></td></tr><tr><td>rocketmq_broker_commitlog_diff</td><td>Broker group synchronization behind message size from slave node</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_0ms</td><td>Server-side processing time for write request to completion of write(0ms)</td><td>putMessageDistributeTime</td></tr><tr><td>rocketmq_brokeruntime_pmdt_0to10ms</td><td>Server-side processing time for write request to completion of write(0~10ms)</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_10to50ms</td><td>Server-side processing time for write request to completion of write(10~50ms)</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_50to100ms</td><td>Server-side processing time for write request to completion of write(50~100ms)</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_100to200ms</td><td>Server-side processing time for write request to completion of write(100~200ms)</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_200to500ms</td><td>Server-side processing time for write request to completion of write(200~500ms)</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_500to1s</td><td>Server-side processing time for write request to completion of write(500~1000ms)</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_1to2s</td><td>Server-side processing time for write request to completion of write(1~2s)</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_2to3s</td><td>Server-side processing time for write request to completion of write(2~3s)</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_3to4s</td><td>Server-side processing time for write request to completion of write(3~4s)</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_4to5s</td><td>Server-side processing time for write request to completion of write(4~5s)</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_5to10s</td><td>Server-side processing time for write request to completion of write(5~10s)</td><td></td></tr><tr><td>rocketmq_brokeruntime_pmdt_10stomore</td><td>Server-side processing time for write request to completion of write(&gt; 10s)</td><td></td></tr><tr><td>rocketmq_brokeruntime_dispatch_behind_bytes</td><td>The number of bytes of messages that have not been distributed yet (operations such as building indexes)</td><td>dispatchBehindBytes</td></tr><tr><td>rocketmq_brokeruntime_put_message_size_total</td><td>The total sum of the sizes of messages written to the broker</td><td>putMessageSizeTotal</td></tr><tr><td>rocketmq_brokeruntime_put_message_average_size</td><td>The average size of messages written to the broker</td><td>putMessageAverageSize</td></tr><tr><td>rocketmq_brokeruntime_remain_transientstore_buffer_numbs</td><td>The capacity of the queue in the TransientStorePool</td><td>remainTransientStoreBufferNumbs</td></tr><tr><td>rocketmq_brokeruntime_earliest_message_timestamp</td><td>The earliest timestamp of the messages stored by the broker</td><td>earliestMessageTimeStamp</td></tr><tr><td>rocketmq_brokeruntime_putmessage_entire_time_max</td><td>The maximum time it took to write messages to the broker since it started running</td><td>putMessageEntireTimeMax</td></tr><tr><td>rocketmq_brokeruntime_start_accept_sendrequest_time</td><td>The time at which the broker started accepting send requests</td><td>startAcceptSendRequestTimeStamp</td></tr><tr><td>rocketmq_brokeruntime_putmessage_times_total</td><td>The total number of times messages were written to the broker</td><td>putMessageTimesTotal</td></tr><tr><td>rocketmq_brokeruntime_getmessage_entire_time_max</td><td>The maximum time it took to process message pulls since the broker started running</td><td>getMessageEntireTimeMax</td></tr><tr><td>rocketmq_brokeruntime_pagecache_lock_time_mills</td><td></td><td>pageCacheLockTimeMills</td></tr><tr><td>rocketmq_brokeruntime_commitlog_disk_ratio</td><td>The usage ratio of the disk where the commitLog is located</td><td>commitLogDiskRatio</td></tr><tr><td>rocketmq_brokeruntime_dispatch_maxbuffer</td><td>A value that the broker has not calculated and remains at 0</td><td>dispatchMaxBuffer</td></tr><tr><td>rocketmq_brokeruntime_pull_threadpoolqueue_capacity</td><td>The capacity of the thread pool queue for processing pull requests.</td><td>pullThreadPoolQueueCapacity</td></tr><tr><td>rocketmq_brokeruntime_send_threadpoolqueue_capacity</td><td>Capacity of the queue in the thread pool handling pull requests</td><td>sendThreadPoolQueueCapacity</td></tr><tr><td>rocketmq_brokeruntime_query_threadpool_queue_capacity</td><td>Capacity of the queue in the thread pool handling query requests</td><td>queryThreadPoolQueueCapacity</td></tr><tr><td>rocketmq_brokeruntime_pull_threadpoolqueue_size</td><td>Actual size of the queue in the thread pool handling pull requests</td><td>pullThreadPoolQueueSize</td></tr><tr><td>rocketmq_brokeruntime_query_threadpoolqueue_size</td><td>Actual size of the queue in the thread pool handling query requests</td><td>queryThreadPoolQueueSize</td></tr><tr><td>rocketmq_brokeruntime_send_threadpool_queue_size</td><td>Actual size of the queue in the thread pool handling send requests</td><td>sendThreadPoolQueueSize</td></tr><tr><td>rocketmq_brokeruntime_pull_threadpoolqueue_headwait_timemills</td><td>Waiting time for the head task in the queue in the thread pool handling pull requests</td><td>pullThreadPoolQueueHeadWaitTimeMills</td></tr><tr><td>rocketmq_brokeruntime_query_threadpoolqueue_headwait_timemills</td><td>Waiting time for the head task in the queue in the thread pool handling query requests</td><td>queryThreadPoolQueueHeadWaitTimeMills</td></tr><tr><td>rocketmq_brokeruntime_send_threadpoolqueue_headwait_timemills</td><td>Waiting time for the head task in the queue in the thread pool handling send requests</td><td>sendThreadPoolQueueHeadWaitTimeMills</td></tr><tr><td>rocketmq_brokeruntime_msg_gettotal_yesterdaymorning</td><td>Total number of times messages were read up until midnight last night</td><td>msgGetTotalYesterdayMorning</td></tr><tr><td>rocketmq_brokeruntime_msg_puttotal_yesterdaymorning</td><td>Total number of times messages were written up until midnight last night</td><td>msgPutTotalYesterdayMorning</td></tr><tr><td>rocketmq_brokeruntime_msg_gettotal_todaymorning</td><td>Total number of times messages were read up until midnight tonight</td><td>msgGetTotalTodayMorning</td></tr><tr><td>rocketmq_brokeruntime_msg_puttotal_todaymorning</td><td>Total number of times messages were written up until midnight tonight</td><td>putMessageTimesTotal</td></tr><tr><td>rocketmq_brokeruntime_msg_put_total_today_now</td><td>The number of messages written to each broker so far.</td><td>msgPutTotalTodayNow</td></tr><tr><td>rocketmq_brokeruntime_msg_gettotal_today_now</td><td>The number of messages read from each broker so far.</td><td>msgGetTotalTodayNow</td></tr><tr><td>rocketmq_brokeruntime_commitlogdir_capacity_free</td><td>The available space in the directory where the commitLog are stored.</td><td>commitLogDirCapacity</td></tr><tr><td>rocketmq_brokeruntime_commitlogdir_capacity_total</td><td>The total space in the directory where the commit logs are stored.</td><td></td></tr><tr><td>rocketmq_brokeruntime_commitlog_maxoffset</td><td>The maximum offset of the commitLog.</td><td>commitLogMaxOffset</td></tr><tr><td>rocketmq_brokeruntime_commitlog_minoffset</td><td>The minimum offset of the commitLog.</td><td>commitLogMinOffset</td></tr><tr><td>rocketmq_brokeruntime_remain_howmanydata_toflush</td><td></td><td>remainHowManyDataToFlush</td></tr><tr><td>rocketmq_brokeruntime_getfound_tps600</td><td>The average TPS of messages received during getMessage in the past 600 seconds.</td><td>getFoundTps</td></tr><tr><td>rocketmq_brokeruntime_getfound_tps60</td><td>The average TPS of messages received during getMessage in the past 60 seconds.</td><td></td></tr><tr><td>rocketmq_brokeruntime_getfound_tps10</td><td>The average TPS of messages received during getMessage in the past 10 seconds.</td><td></td></tr><tr><td>rocketmq_brokeruntime_gettotal_tps600</td><td>The average TPS of getMessage calls in the past 600 seconds.</td><td>getTotalTps</td></tr><tr><td>rocketmq_brokeruntime_gettotal_tps60</td><td>The average TPS of getMessage calls in the past 60 seconds.</td><td></td></tr><tr><td>rocketmq_brokeruntime_gettotal_tps10</td><td>The average TPS of getMessage calls in the past 10 seconds.</td><td></td></tr><tr><td>rocketmq_brokeruntime_gettransfered_tps600</td><td></td><td>getTransferedTps</td></tr><tr><td>rocketmq_brokeruntime_gettransfered_tps60</td><td></td><td></td></tr><tr><td>rocketmq_brokeruntime_gettransfered_tps10</td><td></td><td></td></tr><tr><td>rocketmq_brokeruntime_getmiss_tps600</td><td>Average TPS for getMessage with no messages obtained in the past 600 seconds</td><td>getMissTps</td></tr><tr><td>rocketmq_brokeruntime_getmiss_tps60</td><td>Average TPS for getMessage with no messages obtained in the past 60 seconds</td><td></td></tr><tr><td>rocketmq_brokeruntime_getmiss_tps10</td><td>Average TPS for getMessage with no messages obtained in the past 10 seconds</td><td></td></tr><tr><td>rocketmq_brokeruntime_put_tps600</td><td>Average TPS for message write operations in the past 600 seconds</td><td>putTps</td></tr><tr><td>rocketmq_brokeruntime_put_tps60</td><td>Average TPS for message write operations in the past 60 seconds</td><td></td></tr><tr><td>rocketmq_brokeruntime_put_tps10</td><td>Average TPS for message write operations in the past 10 seconds</td><td></td></tr></tbody></table></div></div></details><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Producer metrics</summary><div><div class="collapsibleContent_i85q"><h3 class="anchor anchorWithStickyNavbar_LWe7" id="producer-metrics">Producer metrics<a href="#producer-metrics" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h3><table><thead><tr><th>Metrics name</th><th>Definition</th></tr></thead><tbody><tr><td>rocketmq_producer_offset</td><td>The maximum offset of the topic at the current time</td></tr><tr><td>rocketmq_topic_retry_offset</td><td>The maximum offset of the retry topic at the current time</td></tr><tr><td>rocketmq_topic_dlq_offset</td><td>The maximum offset of the dead letter topic at the current time</td></tr><tr><td>rocketmq_producer_tps</td><td>The production TPS of the topic on a Broker group</td></tr><tr><td>rocketmq_producer_message_size</td><td>The TPS of the production message size of the topic on a Broker group</td></tr><tr><td>rocketmq_queue_producer_tps</td><td>Queue-level production TPS</td></tr><tr><td>rocketmq_queue_producer_message_size</td><td>Queue-level production TPS of message size</td></tr></tbody></table></div></div></details><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Consumer metrics</summary><div><div class="collapsibleContent_i85q"><h3 class="anchor anchorWithStickyNavbar_LWe7" id="consumer-metrics">Consumer metrics<a href="#consumer-metrics" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h3><table><thead><tr><th>Metrics name</th><th>Definition</th></tr></thead><tbody><tr><td>rocketmq_group_diff</td><td>Consumer group message accumulation message count</td></tr><tr><td>rocketmq_group_retrydiff</td><td>Consumer group retry queue accumulation message count</td></tr><tr><td>rocketmq_group_dlqdiff</td><td>Consumer group dead letter queue accumulation message count</td></tr><tr><td>rocketmq_group_count</td><td>Number of consumers in the consumer group</td></tr><tr><td>rocketmq_client_consume_fail_msg_count</td><td>Number of times consumers in the consumer group have failed to consume in the past 1 hour</td></tr><tr><td>rocketmq_client_consume_fail_msg_tps</td><td>TPS of consumer consumption failure</td></tr><tr><td>rocketmq_client_consume_ok_msg_tps</td><td>TPS of consumer consumption success</td></tr><tr><td>rocketmq_client_consume_rt</td><td>Time taken for a message to be consumed after it has been pulled</td></tr><tr><td>rocketmq_client_consumer_pull_rt</td><td>Time taken for a client to pull a message</td></tr><tr><td>rocketmq_client_consumer_pull_tps</td><td>Client pull message TPS</td></tr><tr><td>rocketmq_consumer_tps</td><td>Consumption TPS of subscription group on each Broker group</td></tr><tr><td>rocketmq_group_consume_tps</td><td>Current consumption TPS of subscription group (aggregated by broker for rocketmq_consumer_tps)</td></tr><tr><td>rocketmq_consumer_offset</td><td>The current consumption Offset of the subscription group in a broker group</td></tr><tr><td>rocketmq_group_consume_total_offset</td><td>The current consumption Offset of the subscription group (aggregated by broker for rocketmq_consumer_offset)</td></tr><tr><td>rocketmq_consumer_message_size</td><td>The TPS of the subscription group consuming message size in a broker group</td></tr><tr><td>rocketmq_send_back_nums</td><td>The number of times the subscription group in a broker group has failed to consume and written to the retry message</td></tr><tr><td>rocketmq_group_get_latency_by_storetime</td><td>The consumption delay of the consumer group, the difference between the current time and when the exporter gets the message.</td></tr></tbody></table></div></div></details></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/apache/rocketmq-site/tree/new-official-website/docs/04-deployment/04Exporter.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_vwxv"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/4.x/deployment/03Dashboard"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">RocketMQ Dashboard</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/4.x/bestPractice/01bestpractice"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Basic Best Practices</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#introduction" class="table-of-contents__link toc-highlight">Introduction</a><ul><li><a href="#metric-structure" class="table-of-contents__link toc-highlight">Metric structure</a></li><li><a href="#prometheus-pulls-metrics" class="table-of-contents__link toc-highlight">Prometheus pulls metrics</a></li><li><a href="#the-5-scheduled-tasks-in-the-metriccollecttask-class" class="table-of-contents__link toc-highlight">The 5 scheduled tasks in the MetricCollectTask class</a></li><li><a href="#rocketmq-exporter-collects-metrics-flowchart" class="table-of-contents__link toc-highlight">Rocketmq-exporter collects metrics flowchart</a></li></ul></li><li><a href="#quick-star" class="table-of-contents__link toc-highlight">Quick star</a><ul><li><a href="#configure-applicationyml" class="table-of-contents__link toc-highlight">Configure <code>application.yml</code></a></li><li><a href="#start-exporter-application" class="table-of-contents__link toc-highlight">Start exporter application</a></li><li><a href="#start-prometheus-according-to-the-configuration-on-its-official-website" class="table-of-contents__link toc-highlight">Start Prometheus according to the configuration on its official website</a></li><li><a href="#access-the-prometheus-page" class="table-of-contents__link toc-highlight">Access the Prometheus page</a></li></ul></li><li><a href="#observability-metrics" class="table-of-contents__link toc-highlight">Observability metrics</a><ul><li><a href="#server--metrics" class="table-of-contents__link toc-highlight">Server metrics</a></li><li><a href="#producer-metrics" class="table-of-contents__link toc-highlight">Producer metrics</a></li><li><a href="#consumer-metrics" class="table-of-contents__link toc-highlight">Consumer metrics</a></li></ul></li></ul></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Learn</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/domainModel/01main">Introduction</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/quickStart/01quickstart">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/version">Migration from 4.x to 5.0</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://twitter.com/ApacheRocketMQ" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/apache/rocketmq" target="_blank" rel="noopener noreferrer" class="footer__link-item">Github</a></li><li class="footer__item"><a href="https://github.com/apache/rocketmq" target="_blank" rel="noopener noreferrer" class="footer__link-item">Help</a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a class="footer__link-item" href="/release-notes">Changelog</a></li><li class="footer__item"><a href="https://github.com/apache/rocketmq" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/docusaurus" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">Legal</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://www.apache.org/licenses/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Licenses<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.apache.org/security/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Security<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.apache.org/foundation/thanks.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Thanks<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Sponsorship<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="margin-bottom--sm"><a href="https://rocketmq.apache.org/" rel="noopener noreferrer" class="footerLogoLink_BH7S"><img src="/img/Apache_RocketMQ_logo.svg.png" alt="Meta Open Source Logo" class="themedImage_ToTc themedImage--light_HNdA footer__logo"><img src="/img/Apache_RocketMQ_logo.svg.png" alt="Meta Open Source Logo" class="themedImage_ToTc themedImage--dark_i4oU footer__logo"></a></div><div class="footer__copyright">Copyright © 2022 The Apache Software Foundation. Licensed under the Apache License, Version 2.0.</div></div></div></footer></div>
<script src="/assets/js/runtime~main.9fb1bb92.js"></script>
<script src="/assets/js/main.db9ae330.js"></script>
</body>
</html>