[{"data":1,"prerenderedAt":3013},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fruntime\u002Fmetrics":314,"\u002Fdocs\u002Fruntime\u002Fmetrics-surround":3008},[4,38,86,149,176,219,257,273],{"title":5,"path":6,"stem":7,"children":8,"icon":37},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,17,22,27,32],{"title":10,"path":6,"stem":7,"icon":11},"Getting started","i-lucide-flag",{"title":13,"path":14,"stem":15,"icon":16},"Modules overview","\u002Fdocs\u002Fgetting-started\u002Fmodules-overview","1.docs\u002F1.getting-started\u002F2.modules-overview","i-lucide-boxes",{"title":18,"path":19,"stem":20,"icon":21},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F3.installation","i-lucide-download",{"title":23,"path":24,"stem":25,"icon":26},"License configuration","\u002Fdocs\u002Fgetting-started\u002Flicense-configuration","1.docs\u002F1.getting-started\u002F4.license-configuration","i-lucide-key-round",{"title":28,"path":29,"stem":30,"icon":31},"Your first app","\u002Fdocs\u002Fgetting-started\u002Ffirst-app","1.docs\u002F1.getting-started\u002F5.first-app","i-lucide-square-play",{"title":33,"path":34,"stem":35,"icon":36},"Project setup","\u002Fdocs\u002Fgetting-started\u002Fproject-setup","1.docs\u002F1.getting-started\u002F6.project-setup","i-lucide-package",false,{"title":39,"path":40,"stem":41,"children":42,"icon":45},"Core Concepts","\u002Fdocs\u002Fconcepts","1.docs\u002F2.concepts\u002F1.index",[43,46,51,56,61,66,71,76,81],{"title":44,"path":40,"stem":41,"icon":45},"Core concepts","i-lucide-book-open",{"title":47,"path":48,"stem":49,"icon":50},"Architecture","\u002Fdocs\u002Fconcepts\u002Farchitecture","1.docs\u002F2.concepts\u002F2.architecture","i-lucide-layers",{"title":52,"path":53,"stem":54,"icon":55},"Exactly-once semantics","\u002Fdocs\u002Fconcepts\u002Fexactly-once","1.docs\u002F2.concepts\u002F3.exactly-once","i-lucide-shield-check",{"title":57,"path":58,"stem":59,"icon":60},"Lanes and parallelism","\u002Fdocs\u002Fconcepts\u002Flanes-and-parallelism","1.docs\u002F2.concepts\u002F4.lanes-and-parallelism","i-lucide-split",{"title":62,"path":63,"stem":64,"icon":65},"State and thread-safety","\u002Fdocs\u002Fconcepts\u002Fstate-and-thread-safety","1.docs\u002F2.concepts\u002F5.state-and-thread-safety","i-lucide-lock",{"title":67,"path":68,"stem":69,"icon":70},"Event time and watermarks","\u002Fdocs\u002Fconcepts\u002Fevent-time-and-watermarks","1.docs\u002F2.concepts\u002F6.event-time-and-watermarks","i-lucide-clock",{"title":72,"path":73,"stem":74,"icon":75},"The configuration model","\u002Fdocs\u002Fconcepts\u002Fconfiguration-model","1.docs\u002F2.concepts\u002F7.configuration-model","i-lucide-sliders-horizontal",{"title":77,"path":78,"stem":79,"icon":80},"The error-handling model","\u002Fdocs\u002Fconcepts\u002Ferror-handling-model","1.docs\u002F2.concepts\u002F8.error-handling-model","i-lucide-triangle-alert",{"title":82,"path":83,"stem":84,"icon":85},"How StoatFlow differs from Kafka Streams","\u002Fdocs\u002Fconcepts\u002Fhow-stoatflow-differs-from-ks","1.docs\u002F2.concepts\u002F9.how-stoatflow-differs-from-ks","i-lucide-arrow-left-right",{"title":87,"path":88,"stem":89,"children":90,"icon":93},"Building Topologies","\u002Fdocs\u002Fbuilding","1.docs\u002F3.building\u002F1.index",[91,94,99,104,109,114,119,124,129,134,139,144],{"title":92,"path":88,"stem":89,"icon":93},"Building topologies","i-lucide-blocks",{"title":95,"path":96,"stem":97,"icon":98},"Error handling and DLQ","\u002Fdocs\u002Fbuilding\u002Ferror-handling-dlq","1.docs\u002F3.building\u002F10.error-handling-dlq","i-lucide-circle-x",{"title":100,"path":101,"stem":102,"icon":103},"State stores","\u002Fdocs\u002Fbuilding\u002Fstate-stores","1.docs\u002F3.building\u002F11.state-stores","i-lucide-database",{"title":105,"path":106,"stem":107,"icon":108},"Testing topologies","\u002Fdocs\u002Fbuilding\u002Ftesting","1.docs\u002F3.building\u002F12.testing","i-lucide-flask-conical",{"title":110,"path":111,"stem":112,"icon":113},"Sources and sinks","\u002Fdocs\u002Fbuilding\u002Fstreams-builder","1.docs\u002F3.building\u002F2.streams-builder","i-lucide-import",{"title":115,"path":116,"stem":117,"icon":118},"KStream and KTable operations","\u002Fdocs\u002Fbuilding\u002Fkstream-ktable","1.docs\u002F3.building\u002F3.kstream-ktable","i-lucide-waypoints",{"title":120,"path":121,"stem":122,"icon":123},"Aggregations","\u002Fdocs\u002Fbuilding\u002Faggregations","1.docs\u002F3.building\u002F4.aggregations","i-lucide-sigma",{"title":125,"path":126,"stem":127,"icon":128},"Windowing","\u002Fdocs\u002Fbuilding\u002Fwindowing","1.docs\u002F3.building\u002F5.windowing","i-lucide-calendar-clock",{"title":130,"path":131,"stem":132,"icon":133},"Joins","\u002Fdocs\u002Fbuilding\u002Fjoins","1.docs\u002F3.building\u002F6.joins","i-lucide-git-merge",{"title":135,"path":136,"stem":137,"icon":138},"The Processor API","\u002Fdocs\u002Fbuilding\u002Fprocessor-api","1.docs\u002F3.building\u002F7.processor-api","i-lucide-cpu",{"title":140,"path":141,"stem":142,"icon":143},"Scheduled sources","\u002Fdocs\u002Fbuilding\u002Fscheduled-sources","1.docs\u002F3.building\u002F8.scheduled-sources","i-lucide-timer",{"title":145,"path":146,"stem":147,"icon":148},"Serdes and Avro","\u002Fdocs\u002Fbuilding\u002Fserdes","1.docs\u002F3.building\u002F9.serdes","i-lucide-binary",{"title":150,"path":151,"stem":152,"children":153,"icon":75},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F4.configuration\u002F1.index",[154,156,161,166,171],{"title":155,"path":151,"stem":152,"icon":75},"How configuration works",{"title":157,"path":158,"stem":159,"icon":160},"Engine configuration (:core)","\u002Fdocs\u002Fconfiguration\u002Fcore-config","1.docs\u002F4.configuration\u002F2.core-config","i-lucide-settings-2",{"title":162,"path":163,"stem":164,"icon":165},"Runtime configuration (:runtime)","\u002Fdocs\u002Fconfiguration\u002Fruntime-config","1.docs\u002F4.configuration\u002F3.runtime-config","i-lucide-server-cog",{"title":167,"path":168,"stem":169,"icon":170},"Defaults, adaptivity, and presets","\u002Fdocs\u002Fconfiguration\u002Fdefaults-and-presets","1.docs\u002F4.configuration\u002F4.defaults-and-presets","i-lucide-gauge",{"title":172,"path":173,"stem":174,"icon":175},"Kafka client configuration","\u002Fdocs\u002Fconfiguration\u002Fkafka-client-config","1.docs\u002F4.configuration\u002F5.kafka-client-config","i-lucide-plug",{"title":177,"path":178,"stem":179,"children":180,"icon":183},"Running in Production","\u002Fdocs\u002Fruntime","1.docs\u002F5.runtime\u002F1.index",[181,184,189,194,199,204,209,214],{"title":182,"path":178,"stem":179,"icon":183},"The runtime","i-lucide-server",{"title":185,"path":186,"stem":187,"icon":188},"The REST API","\u002Fdocs\u002Fruntime\u002Frest-api","1.docs\u002F5.runtime\u002F2.rest-api","i-lucide-globe",{"title":190,"path":191,"stem":192,"icon":193},"Health checks","\u002Fdocs\u002Fruntime\u002Fhealth-checks","1.docs\u002F5.runtime\u002F3.health-checks","i-lucide-heart-pulse",{"title":195,"path":196,"stem":197,"icon":198},"Metrics","\u002Fdocs\u002Fruntime\u002Fmetrics","1.docs\u002F5.runtime\u002F4.metrics","i-lucide-activity",{"title":200,"path":201,"stem":202,"icon":203},"Pause and resume","\u002Fdocs\u002Fruntime\u002Fpause-unpause","1.docs\u002F5.runtime\u002F5.pause-unpause","i-lucide-pause",{"title":205,"path":206,"stem":207,"icon":208},"Plugins and lifecycle hooks","\u002Fdocs\u002Fruntime\u002Fplugins","1.docs\u002F5.runtime\u002F6.plugins","i-lucide-puzzle",{"title":210,"path":211,"stem":212,"icon":213},"Docker images","\u002Fdocs\u002Fruntime\u002Fdocker","1.docs\u002F5.runtime\u002F7.docker","i-lucide-container",{"title":215,"path":216,"stem":217,"icon":218},"GraalVM native image","\u002Fdocs\u002Fruntime\u002Fnative-image","1.docs\u002F5.runtime\u002F8.native-image","i-lucide-zap",{"title":220,"path":221,"stem":222,"children":223,"icon":226},"Deploying & Operating","\u002Fdocs\u002Foperating","1.docs\u002F6.operating\u002F1.index",[224,227,232,237,242,247,252],{"title":225,"path":221,"stem":222,"icon":226},"Deploying and operating","i-lucide-life-buoy",{"title":228,"path":229,"stem":230,"icon":231},"Running on Kubernetes","\u002Fdocs\u002Foperating\u002Fkubernetes","1.docs\u002F6.operating\u002F2.kubernetes","i-lucide-ship",{"title":233,"path":234,"stem":235,"icon":236},"High availability","\u002Fdocs\u002Foperating\u002Fhigh-availability","1.docs\u002F6.operating\u002F3.high-availability","i-lucide-copy",{"title":238,"path":239,"stem":240,"icon":241},"Liveness and readiness probes","\u002Fdocs\u002Foperating\u002Fprobes","1.docs\u002F6.operating\u002F4.probes","i-lucide-stethoscope",{"title":243,"path":244,"stem":245,"icon":246},"Observability","\u002Fdocs\u002Foperating\u002Fobservability","1.docs\u002F6.operating\u002F5.observability","i-lucide-telescope",{"title":248,"path":249,"stem":250,"icon":251},"Tuning under load","\u002Fdocs\u002Foperating\u002Ftuning","1.docs\u002F6.operating\u002F6.tuning","i-lucide-sliders",{"title":253,"path":254,"stem":255,"icon":256},"Production checklist","\u002Fdocs\u002Foperating\u002Fproduction-checklist","1.docs\u002F6.operating\u002F7.production-checklist","i-lucide-clipboard-check",{"title":258,"path":259,"stem":260,"children":261,"icon":85},"Migrating from Kafka Streams","\u002Fdocs\u002Fmigration","1.docs\u002F7.migration\u002F1.index",[262,263,268],{"title":258,"path":259,"stem":260,"icon":85},{"title":264,"path":265,"stem":266,"icon":267},"Migration without carrying state","\u002Fdocs\u002Fmigration\u002Fwithout-data-migration","1.docs\u002F7.migration\u002F2.without-data-migration","i-lucide-sparkles",{"title":269,"path":270,"stem":271,"icon":272},"Migration carrying state","\u002Fdocs\u002Fmigration\u002Fwith-data-migration","1.docs\u002F7.migration\u002F3.with-data-migration","i-lucide-database-backup",{"title":274,"path":275,"stem":276,"children":277,"icon":279},"Reference","\u002Fdocs\u002Freference","1.docs\u002F8.reference\u002F1.index",[278,280,285,290,295,300,305,309],{"title":274,"path":275,"stem":276,"icon":279},"i-lucide-list",{"title":281,"path":282,"stem":283,"icon":284},"Configuration reference","\u002Fdocs\u002Freference\u002Fconfiguration-reference","1.docs\u002F8.reference\u002F2.configuration-reference","i-lucide-table",{"title":286,"path":287,"stem":288,"icon":289},"REST API reference","\u002Fdocs\u002Freference\u002Frest-api-reference","1.docs\u002F8.reference\u002F3.rest-api-reference","i-lucide-network",{"title":291,"path":292,"stem":293,"icon":294},"Gradle plugin reference","\u002Fdocs\u002Freference\u002Fgradle-plugin-reference","1.docs\u002F8.reference\u002F4.gradle-plugin-reference","i-lucide-box",{"title":296,"path":297,"stem":298,"icon":299},"Maven reference","\u002Fdocs\u002Freference\u002Fmaven-reference","1.docs\u002F8.reference\u002F5.maven-reference","i-simple-icons-apachemaven",{"title":301,"path":302,"stem":303,"icon":304},"Kafka Streams compatibility matrix","\u002Fdocs\u002Freference\u002Fks-compatibility-matrix","1.docs\u002F8.reference\u002F6.ks-compatibility-matrix","i-lucide-table-2",{"title":306,"path":307,"stem":308,"icon":170},"Metrics reference","\u002Fdocs\u002Freference\u002Fmetrics-reference","1.docs\u002F8.reference\u002F7.metrics-reference",{"title":310,"path":311,"stem":312,"icon":313},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","1.docs\u002F8.reference\u002F8.glossary","i-lucide-book-a",{"id":315,"title":195,"body":316,"description":3001,"extension":3002,"meta":3003,"navigation":3004,"pageType":3005,"path":196,"seo":3006,"stem":197,"__hash__":3007},"docs\u002F1.docs\u002F5.runtime\u002F4.metrics.md",{"type":317,"value":318,"toc":2982},"minimark",[319,336,421,426,433,587,590,620,623,690,708,727,731,737,796,819,823,887,890,939,977,999,1003,1015,1020,1173,1206,1210,1217,1528,1548,1567,1571,1576,1662,1677,1681,1690,1846,1861,1865,2027,2042,2046,2052,2130,2134,2274,2277,2287,2521,2525,2554,2689,2709,2722,2726,2740,2781,2793,2797,2800,2859,2862,2941,2945,2978],[320,321,322,323,327,328,331,332,335],"p",{},"The ",[324,325,326],"code",{},":runtime"," module exports metrics in Prometheus text format on ",[324,329,330],{},"GET \u002Fmetrics",". Internally it's a Micrometer ",[324,333,334],{},"PrometheusMeterRegistry"," — the engine reports events to a Micrometer instrumentation callback, the runtime binds JVM and Kafka-client metrics to the same registry, and the handler serves the registry's scrape output. Point your existing Prometheus stack at the endpoint and the StoatFlow meters appear alongside everything else.",[337,338,339],"tldr-panel",{},[340,341,342,357,382,395,415],"ul",{},[343,344,345,349,350,352,353,356],"li",{},[346,347,348],"strong",{},"Endpoint:"," ",[324,351,330],{}," — Prometheus text format (",[324,354,355],{},"text\u002Fplain; version=0.0.4; charset=utf-8",").",[343,358,359,362,363,366,367,370,371,374,375,378,379,356],{},[346,360,361],{},"Naming:"," dotted ",[324,364,365],{},"stoatflow.*"," names; Prometheus rewrites ",[324,368,369],{},"."," to ",[324,372,373],{},"_"," (e.g. ",[324,376,377],{},"stoatflow.barrier.commit.latency"," → ",[324,380,381],{},"stoatflow_barrier_commit_latency",[343,383,384,387,388,391,392,369],{},[346,385,386],{},"Common tag:"," every meter carries ",[324,389,390],{},"application"," (the registry common tag); StoatFlow meters also carry ",[324,393,394],{},"application_id",[343,396,397,349,400,403,404,407,408,411,412,369],{},[346,398,399],{},"Detail level:",[324,401,402],{},"runtime.metrics.recording-level"," — ",[324,405,406],{},"info"," (default), ",[324,409,410],{},"debug",", ",[324,413,414],{},"trace",[343,416,417,420],{},[346,418,419],{},"Always on:"," JVM metrics (memory, GC, threads, classloader, processor) bind by default.",[422,423,425],"h2",{"id":424},"enable-and-scrape","Enable and scrape",[320,427,428,429,432],{},"Metrics are enabled by default and live under ",[324,430,431],{},"runtime.metrics",":",[434,435,440],"pre",{"className":436,"code":437,"language":438,"meta":439,"style":439},"language-yaml shiki shiki-themes vitesse-light","runtime:\n  http:\n    enabled: true\n    port: 8080            # default\n  metrics:\n    enabled: true         # default\n    prefix: stoatflow     # default — prefix on all metric names\n    recording-level: info # info | debug | trace (default: info)\n    bind-jvm-metrics: true # default — JVM memory\u002FGC\u002Fthread binders\n    common-tags:          # extra tags applied to every meter\n      environment: production\n      service: word-count\n","yaml","",[324,441,442,455,463,475,491,499,512,527,541,554,565,576],{"__ignoreMap":439},[443,444,447,451],"span",{"class":445,"line":446},"line",1,[443,448,450],{"class":449},"su6XF","runtime",[443,452,454],{"class":453},"sYZai",":\n",[443,456,458,461],{"class":445,"line":457},2,[443,459,460],{"class":449},"  http",[443,462,454],{"class":453},[443,464,466,469,471],{"class":445,"line":465},3,[443,467,468],{"class":449},"    enabled",[443,470,432],{"class":453},[443,472,474],{"class":473},"sbBg2"," true\n",[443,476,478,481,483,487],{"class":445,"line":477},4,[443,479,480],{"class":449},"    port",[443,482,432],{"class":453},[443,484,486],{"class":485},"s-TwI"," 8080",[443,488,490],{"class":489},"s8zF2","            # default\n",[443,492,494,497],{"class":445,"line":493},5,[443,495,496],{"class":449},"  metrics",[443,498,454],{"class":453},[443,500,502,504,506,509],{"class":445,"line":501},6,[443,503,468],{"class":449},[443,505,432],{"class":453},[443,507,508],{"class":473}," true",[443,510,511],{"class":489},"         # default\n",[443,513,515,518,520,524],{"class":445,"line":514},7,[443,516,517],{"class":449},"    prefix",[443,519,432],{"class":453},[443,521,523],{"class":522},"spphp"," stoatflow",[443,525,526],{"class":489},"     # default — prefix on all metric names\n",[443,528,530,533,535,538],{"class":445,"line":529},8,[443,531,532],{"class":449},"    recording-level",[443,534,432],{"class":453},[443,536,537],{"class":522}," info",[443,539,540],{"class":489}," # info | debug | trace (default: info)\n",[443,542,544,547,549,551],{"class":445,"line":543},9,[443,545,546],{"class":449},"    bind-jvm-metrics",[443,548,432],{"class":453},[443,550,508],{"class":473},[443,552,553],{"class":489}," # default — JVM memory\u002FGC\u002Fthread binders\n",[443,555,557,560,562],{"class":445,"line":556},10,[443,558,559],{"class":449},"    common-tags",[443,561,432],{"class":453},[443,563,564],{"class":489},"          # extra tags applied to every meter\n",[443,566,568,571,573],{"class":445,"line":567},11,[443,569,570],{"class":449},"      environment",[443,572,432],{"class":453},[443,574,575],{"class":522}," production\n",[443,577,579,582,584],{"class":445,"line":578},12,[443,580,581],{"class":449},"      service",[443,583,432],{"class":453},[443,585,586],{"class":522}," word-count\n",[320,588,589],{},"Scrape it from the shell:",[434,591,595],{"className":592,"code":593,"language":594,"meta":439,"style":439},"language-bash shiki shiki-themes vitesse-light","curl -s localhost:8080\u002Fmetrics | head -40\n","bash",[324,596,597],{"__ignoreMap":439},[443,598,599,603,607,610,614,617],{"class":445,"line":446},[443,600,602],{"class":601},"sySUi","curl",[443,604,606],{"class":605},"sEi1f"," -s",[443,608,609],{"class":522}," localhost:8080\u002Fmetrics",[443,611,613],{"class":612},"si04Y"," |",[443,615,616],{"class":601}," head",[443,618,619],{"class":605}," -40\n",[320,621,622],{},"A minimal Prometheus scrape config:",[434,624,626],{"className":436,"code":625,"language":438,"meta":439,"style":439},"scrape_configs:\n  - job_name: stoatflow\n    metrics_path: \u002Fmetrics\n    static_configs:\n      - targets: [\"my-app:8080\"]\n",[324,627,628,635,648,658,665],{"__ignoreMap":439},[443,629,630,633],{"class":445,"line":446},[443,631,632],{"class":449},"scrape_configs",[443,634,454],{"class":453},[443,636,637,640,643,645],{"class":445,"line":457},[443,638,639],{"class":453},"  -",[443,641,642],{"class":449}," job_name",[443,644,432],{"class":453},[443,646,647],{"class":522}," stoatflow\n",[443,649,650,653,655],{"class":445,"line":465},[443,651,652],{"class":449},"    metrics_path",[443,654,432],{"class":453},[443,656,657],{"class":522}," \u002Fmetrics\n",[443,659,660,663],{"class":445,"line":477},[443,661,662],{"class":449},"    static_configs",[443,664,454],{"class":453},[443,666,667,670,673,675,678,682,685,687],{"class":445,"line":493},[443,668,669],{"class":453},"      -",[443,671,672],{"class":449}," targets",[443,674,432],{"class":453},[443,676,677],{"class":453}," [",[443,679,681],{"class":680},"sSP4y","\"",[443,683,684],{"class":522},"my-app:8080",[443,686,681],{"class":680},[443,688,689],{"class":453},"]\n",[320,691,692,693,696,697,700,701,704,705,369],{},"The endpoint returns the standard exposition format, so any Prometheus-compatible collector (Prometheus, Grafana Agent, OpenTelemetry Collector with the Prometheus receiver, the VictoriaMetrics agent) scrapes it without extra translation. On Kubernetes, add ",[324,694,695],{},"prometheus.io\u002Fscrape"," \u002F ",[324,698,699],{},"prometheus.io\u002Fpath"," pod annotations or a ",[324,702,703],{},"ServiceMonitor"," pointing at the HTTP port — see ",[706,707,243],"a",{"href":244},[709,710,712],"callout",{"color":406,"icon":711},"i-lucide-info",[320,713,714,715,718,719,722,723,726],{},"Disabling metrics (",[324,716,717],{},"runtime.metrics.enabled: false",") un-registers the ",[324,720,721],{},"\u002Fmetrics"," endpoint — it returns ",[324,724,725],{},"404"," — and switches the engine to no-op instrumentation, so there's no measurement overhead when metrics are off.",[422,728,730],{"id":729},"recording-levels","Recording levels",[320,732,733,736],{},[324,734,735],{},"recording-level"," controls how much detail the engine reports, mirroring Kafka Streams' levels. A higher level is a superset of the ones below it.",[738,739,740,756],"table",{},[741,742,743],"thead",{},[744,745,746,750,753],"tr",{},[747,748,749],"th",{},"Level",[747,751,752],{},"What it adds",[747,754,755],{},"Use",[757,758,759,772,784],"tbody",{},[744,760,761,766,769],{},[762,763,764],"td",{},[324,765,406],{},[762,767,768],{},"Essential operational meters — throughput, barrier\u002Fcommit latency, watermark progress, restoration, consumer\u002Fproducer, errors.",[762,770,771],{},"Production default.",[744,773,774,778,781],{},[762,775,776],{},[324,777,410],{},[762,779,780],{},"Per-store, per-partition, per-processor detail and dispatch internals. Higher cardinality.",[762,782,783],{},"Targeted troubleshooting.",[744,785,786,790,793],{},[762,787,788],{},[324,789,414],{},[762,791,792],{},"Deepest internals; highest overhead.",[762,794,795],{},"Development only.",[320,797,798,799,411,802,411,805,808,809,812,813,815,816,818],{},"Tags like ",[324,800,801],{},"lane_id",[324,803,804],{},"store_name",[324,806,807],{},"topic",", and ",[324,810,811],{},"partition"," multiply series count. On large topologies, keep production at ",[324,814,406],{}," and switch to ",[324,817,410],{}," only while investigating.",[422,820,822],{"id":821},"naming-and-tags","Naming and tags",[320,824,825,826,829,830,833,834,837,838,837,841,844,845,848,849,852,853,855,856,859,860,863,864,867,868,871,872,875,876,879,880,883,884,886],{},"All StoatFlow meters use a dotted name with the configured prefix (",[324,827,828],{},"stoatflow"," by default). The Prometheus registry rewrites dots to underscores and appends the conventional suffix (",[324,831,832],{},"_total"," for counters; ",[324,835,836],{},"_seconds_count","\u002F",[324,839,840],{},"_seconds_sum",[324,842,843],{},"_seconds_max"," for timers). So ",[324,846,847],{},"stoatflow.barrier.completed.total"," is scraped as ",[324,850,851],{},"stoatflow_barrier_completed_total",", and the timer ",[324,854,377],{}," produces ",[324,857,858],{},"stoatflow_barrier_commit_latency_seconds_*"," series. The latency timers publish client-side percentiles as ",[324,861,862],{},"{quantile=\"0.5|0.95|0.99\"}"," labels on the base ",[324,865,866],{},"_seconds"," name rather than ",[324,869,870],{},"_bucket"," histograms, so use ",[324,873,874],{},"rate(_sum)\u002Frate(_count)"," (or the ",[324,877,878],{},"{quantile=...}"," series) — ",[324,881,882],{},"histogram_quantile()"," over ",[324,885,870],{}," won't match.",[320,888,889],{},"Two application tags are present on StoatFlow meters:",[738,891,892,905],{},[741,893,894],{},[744,895,896,899,902],{},[747,897,898],{},"Tag",[747,900,901],{},"Source",[747,903,904],{},"Notes",[757,906,907,927],{},[744,908,909,913,916],{},[762,910,911],{},[324,912,390],{},[762,914,915],{},"Registry-level common tag",[762,917,918,919,922,923,926],{},"Carries ",[324,920,921],{},"application-id","; applied to ",[346,924,925],{},"every"," meter, including JVM and Kafka-client metrics.",[744,928,929,933,936],{},[762,930,931],{},[324,932,394],{},[762,934,935],{},"Per-meter tag",[762,937,938],{},"Applied by the StoatFlow instrumentation callback.",[320,940,941,942,945,946,411,949,411,952,955,956,411,958,411,960,411,962,411,964,411,967,411,970,411,973,976],{},"Anything you add under ",[324,943,944],{},"common-tags"," (for example ",[324,947,948],{},"environment",[324,950,951],{},"region",[324,953,954],{},"service",") is also applied to every meter — handy for selecting one deployment in a shared Prometheus. Per-meter tags vary by group: ",[324,957,801],{},[324,959,804],{},[324,961,807],{},[324,963,811],{},[324,965,966],{},"error_type",[324,968,969],{},"trigger",[324,971,972],{},"type",[324,974,975],{},"result",", and others are listed with each meter below.",[709,978,979],{"color":406,"icon":711},[320,980,981,982,985,986,411,989,411,992,995,996,369],{},"Lane IDs follow the Kafka Streams task-ID convention ",[324,983,984],{},"{subtopology}_{lane}"," — e.g. ",[324,987,988],{},"0_0",[324,990,991],{},"0_15",[324,993,994],{},"1_7",". Aggregate across a sub-topology in PromQL with a regex matcher: ",[324,997,998],{},"sum(stoatflow_lane_records_processed_total{lane_id=~\"1_.*\"})",[422,1000,1002],{"id":1001},"key-meters","Key meters",[320,1004,1005,1006,378,1008,1010,1011,1014],{},"The dotted names below are the canonical metric IDs the engine emits. Remember the Prometheus rewrite (",[324,1007,369],{},[324,1009,373],{},", plus the type suffix) when writing queries. This is a working set, not the exhaustive list — the full catalogue is on the ",[706,1012,1013],{"href":307},"metrics reference",", and your live scrape stays authoritative for exact tag sets.",[1016,1017,1019],"h3",{"id":1018},"throughput-and-end-to-end-latency","Throughput and end-to-end latency",[738,1021,1022,1040],{},[741,1023,1024],{},[744,1025,1026,1029,1032,1034,1037],{},[747,1027,1028],{},"Metric",[747,1030,1031],{},"Type",[747,1033,749],{},[747,1035,1036],{},"Tags",[747,1038,1039],{},"Meaning",[757,1041,1042,1061,1079,1098,1117,1135,1153],{},[744,1043,1044,1049,1052,1054,1058],{},[762,1045,1046],{},[324,1047,1048],{},"stoatflow.lane.records.processed.total",[762,1050,1051],{},"Counter",[762,1053,406],{},[762,1055,1056],{},[324,1057,801],{},[762,1059,1060],{},"Records processed by a lane.",[744,1062,1063,1068,1070,1072,1076],{},[762,1064,1065],{},[324,1066,1067],{},"stoatflow.lane.bytes.processed.total",[762,1069,1051],{},[762,1071,406],{},[762,1073,1074],{},[324,1075,801],{},[762,1077,1078],{},"Bytes processed by a lane.",[744,1080,1081,1086,1089,1091,1095],{},[762,1082,1083],{},[324,1084,1085],{},"stoatflow.lane.process.latency",[762,1087,1088],{},"Timer",[762,1090,406],{},[762,1092,1093],{},[324,1094,801],{},[762,1096,1097],{},"Per-record processing latency.",[744,1099,1100,1105,1108,1110,1114],{},[762,1101,1102],{},[324,1103,1104],{},"stoatflow.lane.queue.size",[762,1106,1107],{},"Gauge",[762,1109,406],{},[762,1111,1112],{},[324,1113,801],{},[762,1115,1116],{},"Current lane queue depth (backpressure signal).",[744,1118,1119,1124,1126,1128,1132],{},[762,1120,1121],{},[324,1122,1123],{},"stoatflow.lane.queue.capacity",[762,1125,1107],{},[762,1127,406],{},[762,1129,1130],{},[324,1131,801],{},[762,1133,1134],{},"Configured lane queue capacity.",[744,1136,1137,1142,1144,1146,1150],{},[762,1138,1139],{},[324,1140,1141],{},"stoatflow.lane.queue.full.total",[762,1143,1051],{},[762,1145,406],{},[762,1147,1148],{},[324,1149,801],{},[762,1151,1152],{},"Times a lane queue was full (backpressure events).",[744,1154,1155,1160,1162,1164,1167],{},[762,1156,1157],{},[324,1158,1159],{},"stoatflow.e2e.latency",[762,1161,1088],{},[762,1163,406],{},[762,1165,1166],{},"—",[762,1168,1169,1170,356],{},"Per-record end-to-end latency, source timestamp to processing completion (analogous to KS ",[324,1171,1172],{},"record-e2e-latency",[434,1174,1178],{"className":1175,"code":1176,"language":1177,"meta":439,"style":439},"language-promql shiki shiki-themes vitesse-light","# Total processing throughput (records\u002Fsec)\nsum(rate(stoatflow_lane_records_processed_total[1m]))\n\n# Average per-record processing latency (this timer emits _sum\u002F_count\u002F_max, not _bucket)\nsum(rate(stoatflow_lane_process_latency_seconds_sum[5m])) \u002F sum(rate(stoatflow_lane_process_latency_seconds_count[5m]))\n","promql",[324,1179,1180,1185,1190,1196,1201],{"__ignoreMap":439},[443,1181,1182],{"class":445,"line":446},[443,1183,1184],{},"# Total processing throughput (records\u002Fsec)\n",[443,1186,1187],{"class":445,"line":457},[443,1188,1189],{},"sum(rate(stoatflow_lane_records_processed_total[1m]))\n",[443,1191,1192],{"class":445,"line":465},[443,1193,1195],{"emptyLinePlaceholder":1194},true,"\n",[443,1197,1198],{"class":445,"line":477},[443,1199,1200],{},"# Average per-record processing latency (this timer emits _sum\u002F_count\u002F_max, not _bucket)\n",[443,1202,1203],{"class":445,"line":493},[443,1204,1205],{},"sum(rate(stoatflow_lane_process_latency_seconds_sum[5m])) \u002F sum(rate(stoatflow_lane_process_latency_seconds_count[5m]))\n",[1016,1207,1209],{"id":1208},"barrier-commits","Barrier commits",[320,1211,1212,1213,1216],{},"Commit barriers are StoatFlow's exactly-once mechanism (see ",[706,1214,1215],{"href":53},"Exactly-once","). These meters track barrier lifecycle and commit-phase latency. The latency timers publish client-side P50\u002FP95\u002FP99 percentiles.",[738,1218,1219,1233],{},[741,1220,1221],{},[744,1222,1223,1225,1227,1229,1231],{},[747,1224,1028],{},[747,1226,1031],{},[747,1228,749],{},[747,1230,1036],{},[747,1232,1039],{},[757,1234,1235,1251,1266,1284,1300,1316,1332,1350,1366,1382,1398,1417,1433,1449,1480,1496,1512],{},[744,1236,1237,1242,1244,1246,1248],{},[762,1238,1239],{},[324,1240,1241],{},"stoatflow.barrier.initiated.total",[762,1243,1051],{},[762,1245,406],{},[762,1247,1166],{},[762,1249,1250],{},"Barriers initiated.",[744,1252,1253,1257,1259,1261,1263],{},[762,1254,1255],{},[324,1256,847],{},[762,1258,1051],{},[762,1260,406],{},[762,1262,1166],{},[762,1264,1265],{},"Barriers successfully completed.",[744,1267,1268,1273,1275,1277,1281],{},[762,1269,1270],{},[324,1271,1272],{},"stoatflow.barrier.failed.total",[762,1274,1051],{},[762,1276,406],{},[762,1278,1279],{},[324,1280,966],{},[762,1282,1283],{},"Barrier failures, by error type.",[744,1285,1286,1291,1293,1295,1297],{},[762,1287,1288],{},[324,1289,1290],{},"stoatflow.barrier.in.flight",[762,1292,1107],{},[762,1294,406],{},[762,1296,1166],{},[762,1298,1299],{},"Currently pending barriers.",[744,1301,1302,1307,1309,1311,1313],{},[762,1303,1304],{},[324,1305,1306],{},"stoatflow.barrier.latency",[762,1308,1088],{},[762,1310,406],{},[762,1312,1166],{},[762,1314,1315],{},"Initiation to completion.",[744,1317,1318,1323,1325,1327,1329],{},[762,1319,1320],{},[324,1321,1322],{},"stoatflow.barrier.alignment.latency",[762,1324,1088],{},[762,1326,406],{},[762,1328,1166],{},[762,1330,1331],{},"Time for all lanes to receive the barrier.",[744,1333,1334,1338,1340,1342,1344],{},[762,1335,1336],{},[324,1337,377],{},[762,1339,1088],{},[762,1341,406],{},[762,1343,1166],{},[762,1345,1346,1347,369],{},"Commit latency (producer drain + Kafka TX + state flush). Comparable to KS ",[324,1348,1349],{},"commit-latency",[744,1351,1352,1357,1359,1361,1363],{},[762,1353,1354],{},[324,1355,1356],{},"stoatflow.barrier.commit.changelog.latency",[762,1358,1088],{},[762,1360,406],{},[762,1362,1166],{},[762,1364,1365],{},"Aggregate changelog serialization+send latency per commit epoch.",[744,1367,1368,1373,1375,1377,1379],{},[762,1369,1370],{},[324,1371,1372],{},"stoatflow.barrier.commit.state.flush.latency",[762,1374,1088],{},[762,1376,406],{},[762,1378,1166],{},[762,1380,1381],{},"Aggregate state-store flush latency per commit epoch.",[744,1383,1384,1389,1391,1393,1395],{},[762,1385,1386],{},[324,1387,1388],{},"stoatflow.barrier.commit.producer.flush.latency",[762,1390,1088],{},[762,1392,406],{},[762,1394,1166],{},[762,1396,1397],{},"Pre-commit producer flush latency.",[744,1399,1400,1405,1407,1409,1411],{},[762,1401,1402],{},[324,1403,1404],{},"stoatflow.barrier.commit.send.offsets.latency",[762,1406,1088],{},[762,1408,406],{},[762,1410,1166],{},[762,1412,1413,1416],{},[324,1414,1415],{},"sendOffsetsToTransaction"," RPC latency.",[744,1418,1419,1424,1426,1428,1430],{},[762,1420,1421],{},[324,1422,1423],{},"stoatflow.barrier.records.committed.total",[762,1425,1051],{},[762,1427,406],{},[762,1429,1166],{},[762,1431,1432],{},"Records committed across barriers.",[744,1434,1435,1440,1442,1444,1446],{},[762,1436,1437],{},[324,1438,1439],{},"stoatflow.barrier.bytes.committed.total",[762,1441,1051],{},[762,1443,406],{},[762,1445,1166],{},[762,1447,1448],{},"Bytes committed across barriers.",[744,1450,1451,1456,1458,1460,1464],{},[762,1452,1453],{},[324,1454,1455],{},"stoatflow.barrier.trigger.total",[762,1457,1051],{},[762,1459,406],{},[762,1461,1462],{},[324,1463,969],{},[762,1465,1466,1467,411,1470,411,1473,411,1476,1479],{},"Barrier creation count by trigger — ",[324,1468,1469],{},"TIME",[324,1471,1472],{},"RECORD_COUNT",[324,1474,1475],{},"MEMORY_PRESSURE",[324,1477,1478],{},"CACHE_PRESSURE"," (state-cache cap forced an early commit).",[744,1481,1482,1487,1489,1491,1493],{},[762,1483,1484],{},[324,1485,1486],{},"stoatflow.transaction.commit.total",[762,1488,1051],{},[762,1490,406],{},[762,1492,1166],{},[762,1494,1495],{},"Kafka transactions committed.",[744,1497,1498,1503,1505,1507,1509],{},[762,1499,1500],{},[324,1501,1502],{},"stoatflow.transaction.abort.total",[762,1504,1051],{},[762,1506,406],{},[762,1508,1166],{},[762,1510,1511],{},"Kafka transactions aborted.",[744,1513,1514,1519,1521,1523,1525],{},[762,1515,1516],{},[324,1517,1518],{},"stoatflow.transaction.commit.latency",[762,1520,1088],{},[762,1522,406],{},[762,1524,1166],{},[762,1526,1527],{},"Transaction commit latency.",[434,1529,1531],{"className":1175,"code":1530,"language":1177,"meta":439,"style":439},"# Commit rate vs. failure rate\nrate(stoatflow_barrier_completed_total[1m])\nrate(stoatflow_barrier_failed_total[5m])\n",[324,1532,1533,1538,1543],{"__ignoreMap":439},[443,1534,1535],{"class":445,"line":446},[443,1536,1537],{},"# Commit rate vs. failure rate\n",[443,1539,1540],{"class":445,"line":457},[443,1541,1542],{},"rate(stoatflow_barrier_completed_total[1m])\n",[443,1544,1545],{"class":445,"line":465},[443,1546,1547],{},"rate(stoatflow_barrier_failed_total[5m])\n",[709,1549,1550],{"color":406,"icon":711},[320,1551,1552,1553,411,1556,1559,1560,1563,1564,369],{},"The commit cadence and epoch size self-tune within their configured bounds; the scheduling gauges (",[324,1554,1555],{},"stoatflow.barrier.interval.target.ms",[324,1557,1558],{},"stoatflow.barrier.epoch.max.records",", and related) report what the engine is currently doing so you can see the cadence on a dashboard. The bound knobs themselves are documented under ",[706,1561,1562],{"href":249},"Tuning"," and the ",[706,1565,1566],{"href":282},"configuration reference",[1016,1568,1570],{"id":1569},"watermarks","Watermarks",[320,1572,1573,1574,356],{},"Event-time progress for windowing and late-event detection (see ",[706,1575,67],{"href":68},[738,1577,1578,1592],{},[741,1579,1580],{},[744,1581,1582,1584,1586,1588,1590],{},[747,1583,1028],{},[747,1585,1031],{},[747,1587,749],{},[747,1589,1036],{},[747,1591,1039],{},[757,1593,1594,1610,1626,1642],{},[744,1595,1596,1601,1603,1605,1607],{},[762,1597,1598],{},[324,1599,1600],{},"stoatflow.watermark.current",[762,1602,1107],{},[762,1604,406],{},[762,1606,1166],{},[762,1608,1609],{},"Current global watermark (epoch ms).",[744,1611,1612,1617,1619,1621,1623],{},[762,1613,1614],{},[324,1615,1616],{},"stoatflow.watermark.lag.ms",[762,1618,1107],{},[762,1620,406],{},[762,1622,1166],{},[762,1624,1625],{},"Wall-clock time minus watermark (event-time lag).",[744,1627,1628,1633,1635,1637,1639],{},[762,1629,1630],{},[324,1631,1632],{},"stoatflow.watermark.advance.total",[762,1634,1051],{},[762,1636,406],{},[762,1638,1166],{},[762,1640,1641],{},"Watermark advancement events.",[744,1643,1644,1649,1651,1653,1659],{},[762,1645,1646],{},[324,1647,1648],{},"stoatflow.watermark.late.records.total",[762,1650,1051],{},[762,1652,410],{},[762,1654,1655,411,1657],{},[324,1656,807],{},[324,1658,811],{},[762,1660,1661],{},"Records arriving after the watermark.",[434,1663,1665],{"className":1175,"code":1664,"language":1177,"meta":439,"style":439},"# Alert when the watermark stalls while the app is running (RUNNING == 4)\ndelta(stoatflow_watermark_current[5m]) == 0 and stoatflow_client_state == 4\n",[324,1666,1667,1672],{"__ignoreMap":439},[443,1668,1669],{"class":445,"line":446},[443,1670,1671],{},"# Alert when the watermark stalls while the app is running (RUNNING == 4)\n",[443,1673,1674],{"class":445,"line":457},[443,1675,1676],{},"delta(stoatflow_watermark_current[5m]) == 0 and stoatflow_client_state == 4\n",[1016,1678,1680],{"id":1679},"changelog-writes-and-state-restoration","Changelog writes and state restoration",[320,1682,1683,1684,1686,1687,356],{},"Changelog write counters track state durability traffic; restoration meters track recovery progress on startup (see ",[706,1685,100],{"href":101}," and ",[706,1688,1689],{"href":63},"State and thread safety",[738,1691,1692,1706],{},[741,1693,1694],{},[744,1695,1696,1698,1700,1702,1704],{},[747,1697,1028],{},[747,1699,1031],{},[747,1701,749],{},[747,1703,1036],{},[747,1705,1039],{},[757,1707,1708,1726,1744,1760,1776,1792,1810,1828],{},[744,1709,1710,1715,1717,1719,1723],{},[762,1711,1712],{},[324,1713,1714],{},"stoatflow.store.changelog.records.written.total",[762,1716,1051],{},[762,1718,406],{},[762,1720,1721],{},[324,1722,804],{},[762,1724,1725],{},"Changelog records written.",[744,1727,1728,1733,1735,1737,1741],{},[762,1729,1730],{},[324,1731,1732],{},"stoatflow.store.changelog.bytes.written.total",[762,1734,1051],{},[762,1736,406],{},[762,1738,1739],{},[324,1740,804],{},[762,1742,1743],{},"Changelog bytes written.",[744,1745,1746,1751,1753,1755,1757],{},[762,1747,1748],{},[324,1749,1750],{},"stoatflow.restoration.in.progress",[762,1752,1107],{},[762,1754,406],{},[762,1756,1166],{},[762,1758,1759],{},"1 while restoration is running, 0 otherwise.",[744,1761,1762,1767,1769,1771,1773],{},[762,1763,1764],{},[324,1765,1766],{},"stoatflow.restoration.stores.total",[762,1768,1107],{},[762,1770,406],{},[762,1772,1166],{},[762,1774,1775],{},"Total stores to restore.",[744,1777,1778,1783,1785,1787,1789],{},[762,1779,1780],{},[324,1781,1782],{},"stoatflow.restoration.stores.completed",[762,1784,1107],{},[762,1786,406],{},[762,1788,1166],{},[762,1790,1791],{},"Stores that have finished restoring.",[744,1793,1794,1799,1801,1803,1807],{},[762,1795,1796],{},[324,1797,1798],{},"stoatflow.restoration.records.restored.total",[762,1800,1051],{},[762,1802,406],{},[762,1804,1805],{},[324,1806,804],{},[762,1808,1809],{},"Records restored, per store.",[744,1811,1812,1817,1819,1821,1825],{},[762,1813,1814],{},[324,1815,1816],{},"stoatflow.restoration.bytes.restored.total",[762,1818,1051],{},[762,1820,406],{},[762,1822,1823],{},[324,1824,804],{},[762,1826,1827],{},"Bytes restored, per store.",[744,1829,1830,1835,1837,1839,1843],{},[762,1831,1832],{},[324,1833,1834],{},"stoatflow.restoration.duration.seconds",[762,1836,1088],{},[762,1838,406],{},[762,1840,1841],{},[324,1842,804],{},[762,1844,1845],{},"Per-store restoration duration.",[434,1847,1849],{"className":1175,"code":1848,"language":1177,"meta":439,"style":439},"# Restoration progress as a fraction of stores completed\nstoatflow_restoration_stores_completed \u002F stoatflow_restoration_stores_total\n",[324,1850,1851,1856],{"__ignoreMap":439},[443,1852,1853],{"class":445,"line":446},[443,1854,1855],{},"# Restoration progress as a fraction of stores completed\n",[443,1857,1858],{"class":445,"line":457},[443,1859,1860],{},"stoatflow_restoration_stores_completed \u002F stoatflow_restoration_stores_total\n",[1016,1862,1864],{"id":1863},"consumer-producer-and-dispatch","Consumer, producer, and dispatch",[738,1866,1867,1881],{},[741,1868,1869],{},[744,1870,1871,1873,1875,1877,1879],{},[747,1872,1028],{},[747,1874,1031],{},[747,1876,749],{},[747,1878,1036],{},[747,1880,1039],{},[757,1882,1883,1903,1923,1943,1959,1975,1993,2011],{},[744,1884,1885,1890,1892,1894,1900],{},[762,1886,1887],{},[324,1888,1889],{},"stoatflow.consumer.records.consumed.total",[762,1891,1051],{},[762,1893,406],{},[762,1895,1896,411,1898],{},[324,1897,807],{},[324,1899,811],{},[762,1901,1902],{},"Records consumed.",[744,1904,1905,1910,1912,1914,1920],{},[762,1906,1907],{},[324,1908,1909],{},"stoatflow.consumer.bytes.consumed.total",[762,1911,1051],{},[762,1913,406],{},[762,1915,1916,411,1918],{},[324,1917,807],{},[324,1919,811],{},[762,1921,1922],{},"Bytes consumed.",[744,1924,1925,1930,1932,1934,1940],{},[762,1926,1927],{},[324,1928,1929],{},"stoatflow.consumer.lag.records",[762,1931,1107],{},[762,1933,406],{},[762,1935,1936,411,1938],{},[324,1937,807],{},[324,1939,811],{},[762,1941,1942],{},"Consumer lag, in records.",[744,1944,1945,1950,1952,1954,1956],{},[762,1946,1947],{},[324,1948,1949],{},"stoatflow.consumer.poll.latency",[762,1951,1088],{},[762,1953,406],{},[762,1955,1166],{},[762,1957,1958],{},"Consumer poll latency.",[744,1960,1961,1966,1968,1970,1972],{},[762,1962,1963],{},[324,1964,1965],{},"stoatflow.consumer.assigned.partitions",[762,1967,1107],{},[762,1969,406],{},[762,1971,1166],{},[762,1973,1974],{},"Number of assigned partitions.",[744,1976,1977,1982,1984,1986,1990],{},[762,1978,1979],{},[324,1980,1981],{},"stoatflow.producer.records.produced.total",[762,1983,1051],{},[762,1985,406],{},[762,1987,1988],{},[324,1989,807],{},[762,1991,1992],{},"Records produced.",[744,1994,1995,2000,2002,2004,2008],{},[762,1996,1997],{},[324,1998,1999],{},"stoatflow.producer.bytes.produced.total",[762,2001,1051],{},[762,2003,406],{},[762,2005,2006],{},[324,2007,807],{},[762,2009,2010],{},"Bytes produced.",[744,2012,2013,2018,2020,2022,2024],{},[762,2014,2015],{},[324,2016,2017],{},"stoatflow.dispatcher.dispatch.latency",[762,2019,1088],{},[762,2021,406],{},[762,2023,1166],{},[762,2025,2026],{},"Per-batch dispatch latency.",[434,2028,2030],{"className":1175,"code":2029,"language":1177,"meta":439,"style":439},"# Worst-case consumer lag across partitions\nmax(stoatflow_consumer_lag_records)\n",[324,2031,2032,2037],{"__ignoreMap":439},[443,2033,2034],{"class":445,"line":446},[443,2035,2036],{},"# Worst-case consumer lag across partitions\n",[443,2038,2039],{"class":445,"line":457},[443,2040,2041],{},"max(stoatflow_consumer_lag_records)\n",[1016,2043,2045],{"id":2044},"errors","Errors",[320,2047,2048,2049,356],{},"Error classification for alerting (see ",[706,2050,2051],{"href":96},"Error handling",[738,2053,2054,2068],{},[741,2055,2056],{},[744,2057,2058,2060,2062,2064,2066],{},[747,2059,1028],{},[747,2061,1031],{},[747,2063,749],{},[747,2065,1036],{},[747,2067,1039],{},[757,2069,2070,2090,2111],{},[744,2071,2072,2077,2079,2081,2087],{},[762,2073,2074],{},[324,2075,2076],{},"stoatflow.error.total",[762,2078,1051],{},[762,2080,406],{},[762,2082,2083,411,2085],{},[324,2084,966],{},[324,2086,807],{},[762,2088,2089],{},"Errors by type (and topic where applicable).",[744,2091,2092,2097,2099,2101,2108],{},[762,2093,2094],{},[324,2095,2096],{},"stoatflow.error.typed.total",[762,2098,1051],{},[762,2100,406],{},[762,2102,2103,411,2106],{},[324,2104,2105],{},"category",[324,2107,966],{},[762,2109,2110],{},"Categorised errors (e.g. deserialization, processing, production).",[744,2112,2113,2118,2120,2122,2127],{},[762,2114,2115],{},[324,2116,2117],{},"stoatflow.queue.offer.failure.total",[762,2119,1051],{},[762,2121,406],{},[762,2123,2124],{},[324,2125,2126],{},"queue_type",[762,2128,2129],{},"Internal queue offer rejections.",[1016,2131,2133],{"id":2132},"client-state","Client state",[738,2135,2136,2150],{},[741,2137,2138],{},[744,2139,2140,2142,2144,2146,2148],{},[747,2141,1028],{},[747,2143,1031],{},[747,2145,749],{},[747,2147,1036],{},[747,2149,1039],{},[757,2151,2152,2198,2214,2230,2246],{},[744,2153,2154,2159,2161,2163,2165],{},[762,2155,2156],{},[324,2157,2158],{},"stoatflow.client.state",[762,2160,1107],{},[762,2162,406],{},[762,2164,1166],{},[762,2166,2167,2168,411,2171,411,2174,411,2177,411,2180,411,2183,411,2186,411,2189,411,2192,411,2195,369],{},"Application state ordinal: ",[324,2169,2170],{},"CREATED=0",[324,2172,2173],{},"STARTING=1",[324,2175,2176],{},"VALIDATING_STATE=2",[324,2178,2179],{},"RESTORING=3",[324,2181,2182],{},"RUNNING=4",[324,2184,2185],{},"DRAINING=5",[324,2187,2188],{},"PAUSED=6",[324,2190,2191],{},"STOPPING=7",[324,2193,2194],{},"STOPPED=8",[324,2196,2197],{},"ERROR=9",[744,2199,2200,2205,2207,2209,2211],{},[762,2201,2202],{},[324,2203,2204],{},"stoatflow.lanes",[762,2206,1107],{},[762,2208,406],{},[762,2210,1166],{},[762,2212,2213],{},"Configured lane count.",[744,2215,2216,2221,2223,2225,2227],{},[762,2217,2218],{},[324,2219,2220],{},"stoatflow.client.lane.alive",[762,2222,1107],{},[762,2224,406],{},[762,2226,1166],{},[762,2228,2229],{},"Currently running lanes.",[744,2231,2232,2237,2239,2241,2243],{},[762,2233,2234],{},[324,2235,2236],{},"stoatflow.client.uptime.seconds",[762,2238,1107],{},[762,2240,406],{},[762,2242,1166],{},[762,2244,2245],{},"Seconds since the client was created.",[744,2247,2248,2253,2255,2257,2267],{},[762,2249,2250],{},[324,2251,2252],{},"stoatflow.engine.restart.total",[762,2254,1051],{},[762,2256,406],{},[762,2258,2259,411,2262,411,2265],{},[324,2260,2261],{},"disposition",[324,2263,2264],{},"target",[324,2266,969],{},[762,2268,2269,2270,2273],{},"Successful in-place engine restarts (fault recovery via ",[324,2271,2272],{},"REPLACE_THREAD",", HA demote-in-place).",[1016,2275,233],{"id":2276},"high-availability",[320,2278,2279,2280,2283,2284,356],{},"Bound only when ",[706,2281,2282],{"href":234},"hot standby"," is enabled (",[324,2285,2286],{},"ha.mode != off",[738,2288,2289,2303],{},[741,2290,2291],{},[744,2292,2293,2295,2297,2299,2301],{},[747,2294,1028],{},[747,2296,1031],{},[747,2298,749],{},[747,2300,1036],{},[747,2302,1039],{},[757,2304,2305,2328,2347,2363,2379,2395,2415,2436,2452,2483,2503],{},[744,2306,2307,2312,2314,2316,2318],{},[762,2308,2309],{},[324,2310,2311],{},"stoatflow.ha.role",[762,2313,1107],{},[762,2315,406],{},[762,2317,1166],{},[762,2319,2320,2323,2324,2327],{},[324,2321,2322],{},"1"," when this pod is the active, ",[324,2325,2326],{},"0"," when standby.",[744,2329,2330,2335,2337,2339,2341],{},[762,2331,2332],{},[324,2333,2334],{},"stoatflow.ha.standby.replication.lag.records",[762,2336,1107],{},[762,2338,406],{},[762,2340,1166],{},[762,2342,2343,2344,2346],{},"Standby replication lag in records (",[324,2345,2326],{}," when active or caught up).",[744,2348,2349,2354,2356,2358,2360],{},[762,2350,2351],{},[324,2352,2353],{},"stoatflow.ha.standby.replication.lag.ms",[762,2355,1107],{},[762,2357,406],{},[762,2359,1166],{},[762,2361,2362],{},"Standby replication lag in milliseconds.",[744,2364,2365,2370,2372,2374,2376],{},[762,2366,2367],{},[324,2368,2369],{},"stoatflow.ha.peer.freshness.ms",[762,2371,1107],{},[762,2373,406],{},[762,2375,1166],{},[762,2377,2378],{},"Time since the freshest observed peer's last heartbeat.",[744,2380,2381,2386,2388,2390,2392],{},[762,2382,2383],{},[324,2384,2385],{},"stoatflow.ha.peers",[762,2387,1107],{},[762,2389,406],{},[762,2391,1166],{},[762,2393,2394],{},"Number of observed HA peers.",[744,2396,2397,2402,2404,2406,2408],{},[762,2398,2399],{},[324,2400,2401],{},"stoatflow.ha.redundancy.ready.standbys",[762,2403,1107],{},[762,2405,406],{},[762,2407,1166],{},[762,2409,2410,2411,2414],{},"Caught-up (",[324,2412,2413],{},"READY_STANDBY",") standby count, including self.",[744,2416,2417,2422,2424,2426,2428],{},[762,2418,2419],{},[324,2420,2421],{},"stoatflow.ha.redundancy.below.desired",[762,2423,1107],{},[762,2425,406],{},[762,2427,1166],{},[762,2429,2430,2432,2433,369],{},[324,2431,2322],{}," when the active has fewer ready standby spares than ",[324,2434,2435],{},"desired-standbys",[744,2437,2438,2443,2445,2447,2449],{},[762,2439,2440],{},[324,2441,2442],{},"stoatflow.ha.token.epoch",[762,2444,1107],{},[762,2446,406],{},[762,2448,1166],{},[762,2450,2451],{},"Current promotion-token epoch (increments once per election).",[744,2453,2454,2459,2461,2463,2468],{},[762,2455,2456],{},[324,2457,2458],{},"stoatflow.ha.election.outcome",[762,2460,1051],{},[762,2462,406],{},[762,2464,2465],{},[324,2466,2467],{},"outcome",[762,2469,2470,2471,696,2474,696,2477,696,2480,356],{},"Cumulative election outcomes (",[324,2472,2473],{},"won",[324,2475,2476],{},"reclaimed",[324,2478,2479],{},"stood_down_fresh",[324,2481,2482],{},"stood_down_lost",[744,2484,2485,2490,2492,2494,2496],{},[762,2486,2487],{},[324,2488,2489],{},"stoatflow.ha.election.latency.ms",[762,2491,1107],{},[762,2493,406],{},[762,2495,1166],{},[762,2497,2498,2499,2502],{},"Last claim→ACTIVE election latency in ms (",[324,2500,2501],{},"-1"," until the first promotion).",[744,2504,2505,2510,2512,2514,2516],{},[762,2506,2507],{},[324,2508,2509],{},"stoatflow.ha.restart.required",[762,2511,1107],{},[762,2513,406],{},[762,2515,1166],{},[762,2517,2518,2520],{},[324,2519,2322],{}," when this pod requires a restart (e.g. source-topic partition count changed).",[422,2522,2524],{"id":2523},"license-metrics","License metrics",[320,2526,2527,2528,2530,2531,2534,2535,2538,2539,2542,2543,2545,2546,2548,2549,2551,2552,369],{},"When a license is configured, the runtime binds license meters to the same registry (see ",[706,2529,23],{"href":24},"). These use the ",[324,2532,2533],{},"\u003Cprefix>.license"," prefix (default ",[324,2536,2537],{},"stoatflow.license",", tracking ",[324,2540,2541],{},"runtime.metrics.prefix",") and carry the registry common tags (",[324,2544,390],{},", plus your ",[324,2547,944],{},"). They're exported even when ",[324,2550,735],{}," is ",[324,2553,406],{},[738,2555,2556,2568],{},[741,2557,2558],{},[744,2559,2560,2562,2564,2566],{},[747,2561,1028],{},[747,2563,1031],{},[747,2565,1036],{},[747,2567,1039],{},[757,2569,2570,2587,2601,2615,2629,2643,2657,2673],{},[744,2571,2572,2577,2579,2584],{},[762,2573,2574],{},[324,2575,2576],{},"stoatflow.license.valid",[762,2578,1107],{},[762,2580,2581],{},[324,2582,2583],{},"tier",[762,2585,2586],{},"1 when operating under a VALID or GRACE_PERIOD license, else 0.",[744,2588,2589,2594,2596,2598],{},[762,2590,2591],{},[324,2592,2593],{},"stoatflow.license.expiry_timestamp_seconds",[762,2595,1107],{},[762,2597,1166],{},[762,2599,2600],{},"Unix epoch seconds of the entitlement deadline.",[744,2602,2603,2608,2610,2612],{},[762,2604,2605],{},[324,2606,2607],{},"stoatflow.license.days_remaining",[762,2609,1107],{},[762,2611,1166],{},[762,2613,2614],{},"Whole days until expiry; negative within the post-expiry grace window.",[744,2616,2617,2622,2624,2626],{},[762,2618,2619],{},[324,2620,2621],{},"stoatflow.license.grace_remaining_seconds",[762,2623,1107],{},[762,2625,1166],{},[762,2627,2628],{},"Seconds left in the offline-grace budget; 0 when exhausted.",[744,2630,2631,2636,2638,2640],{},[762,2632,2633],{},[324,2634,2635],{},"stoatflow.license.heartbeat_consecutive_failures",[762,2637,1107],{},[762,2639,1166],{},[762,2641,2642],{},"Heartbeat ticks failed since the last success; resets to 0 on success.",[744,2644,2645,2650,2652,2654],{},[762,2646,2647],{},[324,2648,2649],{},"stoatflow.license.heartbeat_last_success_timestamp_seconds",[762,2651,1107],{},[762,2653,1166],{},[762,2655,2656],{},"Unix epoch seconds of the most recent successful heartbeat.",[744,2658,2659,2664,2666,2670],{},[762,2660,2661],{},[324,2662,2663],{},"stoatflow.license.validations_total",[762,2665,1051],{},[762,2667,2668],{},[324,2669,975],{},[762,2671,2672],{},"Cold-start validation outcomes, by result label.",[744,2674,2675,2680,2682,2686],{},[762,2676,2677],{},[324,2678,2679],{},"stoatflow.license.heartbeats_total",[762,2681,1051],{},[762,2683,2684],{},[324,2685,975],{},[762,2687,2688],{},"Heartbeat tick outcomes, by result label.",[434,2690,2692],{"className":1175,"code":2691,"language":1177,"meta":439,"style":439},"# Alert when the license is not valid, or when expiry is within 14 days\nstoatflow_license_valid == 0\nstoatflow_license_days_remaining \u003C 14\n",[324,2693,2694,2699,2704],{"__ignoreMap":439},[443,2695,2696],{"class":445,"line":446},[443,2697,2698],{},"# Alert when the license is not valid, or when expiry is within 14 days\n",[443,2700,2701],{"class":445,"line":457},[443,2702,2703],{},"stoatflow_license_valid == 0\n",[443,2705,2706],{"class":445,"line":465},[443,2707,2708],{},"stoatflow_license_days_remaining \u003C 14\n",[709,2710,2713],{"color":2711,"icon":2712},"warning","i-lucide-shield",[320,2714,2715,2716,2718,2719,369],{},"License meters carry tier and timing detail. Scrape ",[324,2717,721],{}," only from your in-cluster monitoring stack, not through internet-facing ingress. See ",[706,2720,2721],{"href":229},"Kubernetes",[422,2723,2725],{"id":2724},"jvm-and-kafka-client-metrics","JVM and Kafka-client metrics",[320,2727,2728,2729,2732,2733,1686,2736,2739],{},"With ",[324,2730,2731],{},"bind-jvm-metrics: true"," (the default), the runtime binds Micrometer's standard JVM binders to the registry, so the usual ",[324,2734,2735],{},"jvm_*",[324,2737,2738],{},"system_*"," series appear on the same endpoint:",[340,2741,2742,2751,2757,2765,2770],{},[343,2743,2744,696,2747,2750],{},[324,2745,2746],{},"jvm_memory_used_bytes",[324,2748,2749],{},"jvm_memory_max_bytes"," (heap and non-heap)",[343,2752,2753,2756],{},[324,2754,2755],{},"jvm_gc_pause_seconds"," and related GC metrics",[343,2758,2759,411,2762],{},[324,2760,2761],{},"jvm_threads_live_threads",[324,2763,2764],{},"jvm_threads_states_threads",[343,2766,2767],{},[324,2768,2769],{},"jvm_classes_loaded_classes",[343,2771,2772,411,2775,411,2778],{},[324,2773,2774],{},"system_cpu_usage",[324,2776,2777],{},"process_cpu_usage",[324,2779,2780],{},"system_load_average_1m",[320,2782,2783,2784,2786,2787,2789,2790,2792],{},"These carry the registry common tags (",[324,2785,390],{}," + your ",[324,2788,944],{},") but not ",[324,2791,394],{},". Native Kafka client metrics are also surfaced through Micrometer, so producer\u002Fconsumer client internals appear alongside the StoatFlow meters.",[422,2794,2796],{"id":2795},"dashboards-and-alerts","Dashboards and alerts",[320,2798,2799],{},"A starting overview combines throughput, latency, backpressure, and commit health:",[434,2801,2803],{"className":1175,"code":2802,"language":1177,"meta":439,"style":439},"# Throughput\nsum(rate(stoatflow_lane_records_processed_total[1m]))\n\n# Backpressure — total queued vs. capacity\nsum(stoatflow_lane_queue_size) \u002F sum(stoatflow_lane_queue_capacity)\n\n# Commit health\nrate(stoatflow_barrier_completed_total[1m])\nrate(stoatflow_barrier_failed_total[5m])\n\n# Event-time lag\nstoatflow_watermark_lag_ms\n",[324,2804,2805,2810,2814,2818,2823,2828,2832,2837,2841,2845,2849,2854],{"__ignoreMap":439},[443,2806,2807],{"class":445,"line":446},[443,2808,2809],{},"# Throughput\n",[443,2811,2812],{"class":445,"line":457},[443,2813,1189],{},[443,2815,2816],{"class":445,"line":465},[443,2817,1195],{"emptyLinePlaceholder":1194},[443,2819,2820],{"class":445,"line":477},[443,2821,2822],{},"# Backpressure — total queued vs. capacity\n",[443,2824,2825],{"class":445,"line":493},[443,2826,2827],{},"sum(stoatflow_lane_queue_size) \u002F sum(stoatflow_lane_queue_capacity)\n",[443,2829,2830],{"class":445,"line":501},[443,2831,1195],{"emptyLinePlaceholder":1194},[443,2833,2834],{"class":445,"line":514},[443,2835,2836],{},"# Commit health\n",[443,2838,2839],{"class":445,"line":529},[443,2840,1542],{},[443,2842,2843],{"class":445,"line":543},[443,2844,1547],{},[443,2846,2847],{"class":445,"line":556},[443,2848,1195],{"emptyLinePlaceholder":1194},[443,2850,2851],{"class":445,"line":567},[443,2852,2853],{},"# Event-time lag\n",[443,2855,2856],{"class":445,"line":578},[443,2857,2858],{},"stoatflow_watermark_lag_ms\n",[320,2860,2861],{},"Useful alert conditions:",[738,2863,2864,2877],{},[741,2865,2866],{},[744,2867,2868,2871,2874],{},[747,2869,2870],{},"Alert",[747,2872,2873],{},"Condition",[747,2875,2876],{},"Severity",[757,2878,2879,2892,2904,2917,2929],{},[744,2880,2881,2884,2889],{},[762,2882,2883],{},"Barrier failures",[762,2885,2886],{},[324,2887,2888],{},"rate(stoatflow_barrier_failed_total[5m]) > 0",[762,2890,2891],{},"Critical",[744,2893,2894,2897,2902],{},[762,2895,2896],{},"License invalid",[762,2898,2899],{},[324,2900,2901],{},"stoatflow_license_valid == 0",[762,2903,2891],{},[744,2905,2906,2909,2914],{},[762,2907,2908],{},"High consumer lag",[762,2910,2911],{},[324,2912,2913],{},"max(stoatflow_consumer_lag_records) > 100000",[762,2915,2916],{},"Warning",[744,2918,2919,2922,2927],{},[762,2920,2921],{},"Watermark stall",[762,2923,2924],{},[324,2925,2926],{},"delta(stoatflow_watermark_current[5m]) == 0 and stoatflow_client_state == 4",[762,2928,2916],{},[744,2930,2931,2934,2939],{},[762,2932,2933],{},"Backpressure",[762,2935,2936],{},[324,2937,2938],{},"sum(stoatflow_lane_queue_size) > 0.8 * sum(stoatflow_lane_queue_capacity)",[762,2940,2916],{},[422,2942,2944],{"id":2943},"next-steps","Next steps",[340,2946,2947,2957,2964,2971],{},[343,2948,2949,2953,2954,2956],{},[346,2950,2951],{},[706,2952,243],{"href":244}," — wiring ",[324,2955,721],{},", logs, and probes into a monitoring stack.",[343,2958,2959,2963],{},[346,2960,2961],{},[706,2962,190],{"href":191}," — the readiness and liveness signals that complement metrics.",[343,2965,2966,2970],{},[346,2967,2968],{},[706,2969,1562],{"href":249}," — which bound knobs the self-tuning cadence respects.",[343,2972,2973,2977],{},[346,2974,2975],{},[706,2976,185],{"href":186}," — the other operational endpoints on the same HTTP server.",[2979,2980,2981],"style",{},"html pre.shiki code .su6XF, html code.shiki .su6XF{--shiki-default:#998418}html pre.shiki code .sYZai, html code.shiki .sYZai{--shiki-default:#999999}html pre.shiki code .sbBg2, html code.shiki .sbBg2{--shiki-default:#1E754F}html pre.shiki code .s-TwI, html code.shiki .s-TwI{--shiki-default:#2F798A}html pre.shiki code .s8zF2, html code.shiki .s8zF2{--shiki-default:#A0ADA0}html pre.shiki code .spphp, html code.shiki .spphp{--shiki-default:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sySUi, html code.shiki .sySUi{--shiki-default:#59873A}html pre.shiki code .sEi1f, html code.shiki .sEi1f{--shiki-default:#A65E2B}html pre.shiki code .si04Y, html code.shiki .si04Y{--shiki-default:#AB5959}html pre.shiki code .sSP4y, html code.shiki .sSP4y{--shiki-default:#B5695977}",{"title":439,"searchDepth":457,"depth":457,"links":2983},[2984,2985,2986,2987,2997,2998,2999,3000],{"id":424,"depth":457,"text":425},{"id":729,"depth":457,"text":730},{"id":821,"depth":457,"text":822},{"id":1001,"depth":457,"text":1002,"children":2988},[2989,2990,2991,2992,2993,2994,2995,2996],{"id":1018,"depth":465,"text":1019},{"id":1208,"depth":465,"text":1209},{"id":1569,"depth":465,"text":1570},{"id":1679,"depth":465,"text":1680},{"id":1863,"depth":465,"text":1864},{"id":2044,"depth":465,"text":2045},{"id":2132,"depth":465,"text":2133},{"id":2276,"depth":465,"text":233},{"id":2523,"depth":457,"text":2524},{"id":2724,"depth":457,"text":2725},{"id":2795,"depth":457,"text":2796},{"id":2943,"depth":457,"text":2944},"Scrape StoatFlow's Prometheus \u002Fmetrics endpoint — Micrometer integration, the key meters the engine emits, license metrics, and common tags.","md",{},{"icon":198},"how-to",{"title":195,"description":3001},"ZcTxx64mZR3vz0DWPaezhrH-faCk7nB8CaLbby7WnDM",[3009,3011],{"title":190,"path":191,"stem":192,"description":3010,"icon":193,"children":-1},"Liveness and readiness probes on the StoatFlow runtime — the built-in indicators, what flips each, and how they behave during state restoration.",{"title":200,"path":201,"stem":202,"description":3012,"icon":203,"children":-1},"Pause and resume record processing at runtime with POST \u002Fpause and \u002Funpause — for maintenance windows and downstream backpressure, without restarting the instance.",1783713361429]