[{"data":1,"prerenderedAt":1053},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fmigration\u002Freusing-kafka-streams-dashboards":334,"\u002Fdocs\u002Fmigration\u002Freusing-kafka-streams-dashboards-surround":1048},[4,43,91,154,181,224,262,293],{"title":5,"path":6,"stem":7,"children":8,"icon":42},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,17,22,27,32,37],{"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",{"title":38,"path":39,"stem":40,"icon":41},"AI assistants","\u002Fdocs\u002Fgetting-started\u002Fai-assistants","1.docs\u002F1.getting-started\u002F7.ai-assistants","i-lucide-bot",false,{"title":44,"path":45,"stem":46,"children":47,"icon":50},"Core Concepts","\u002Fdocs\u002Fconcepts","1.docs\u002F2.concepts\u002F1.index",[48,51,56,61,66,71,76,81,86],{"title":49,"path":45,"stem":46,"icon":50},"Core concepts","i-lucide-book-open",{"title":52,"path":53,"stem":54,"icon":55},"Architecture","\u002Fdocs\u002Fconcepts\u002Farchitecture","1.docs\u002F2.concepts\u002F2.architecture","i-lucide-layers",{"title":57,"path":58,"stem":59,"icon":60},"Exactly-once semantics","\u002Fdocs\u002Fconcepts\u002Fexactly-once","1.docs\u002F2.concepts\u002F3.exactly-once","i-lucide-shield-check",{"title":62,"path":63,"stem":64,"icon":65},"Lanes and parallelism","\u002Fdocs\u002Fconcepts\u002Flanes-and-parallelism","1.docs\u002F2.concepts\u002F4.lanes-and-parallelism","i-lucide-split",{"title":67,"path":68,"stem":69,"icon":70},"State and thread-safety","\u002Fdocs\u002Fconcepts\u002Fstate-and-thread-safety","1.docs\u002F2.concepts\u002F5.state-and-thread-safety","i-lucide-lock",{"title":72,"path":73,"stem":74,"icon":75},"Event time and watermarks","\u002Fdocs\u002Fconcepts\u002Fevent-time-and-watermarks","1.docs\u002F2.concepts\u002F6.event-time-and-watermarks","i-lucide-clock",{"title":77,"path":78,"stem":79,"icon":80},"The configuration model","\u002Fdocs\u002Fconcepts\u002Fconfiguration-model","1.docs\u002F2.concepts\u002F7.configuration-model","i-lucide-sliders-horizontal",{"title":82,"path":83,"stem":84,"icon":85},"The error-handling model","\u002Fdocs\u002Fconcepts\u002Ferror-handling-model","1.docs\u002F2.concepts\u002F8.error-handling-model","i-lucide-triangle-alert",{"title":87,"path":88,"stem":89,"icon":90},"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":92,"path":93,"stem":94,"children":95,"icon":98},"Building Topologies","\u002Fdocs\u002Fbuilding","1.docs\u002F3.building\u002F1.index",[96,99,104,109,114,119,124,129,134,139,144,149],{"title":97,"path":93,"stem":94,"icon":98},"Building topologies","i-lucide-blocks",{"title":100,"path":101,"stem":102,"icon":103},"Error handling and DLQ","\u002Fdocs\u002Fbuilding\u002Ferror-handling-dlq","1.docs\u002F3.building\u002F10.error-handling-dlq","i-lucide-circle-x",{"title":105,"path":106,"stem":107,"icon":108},"State stores","\u002Fdocs\u002Fbuilding\u002Fstate-stores","1.docs\u002F3.building\u002F11.state-stores","i-lucide-database",{"title":110,"path":111,"stem":112,"icon":113},"Testing topologies","\u002Fdocs\u002Fbuilding\u002Ftesting","1.docs\u002F3.building\u002F12.testing","i-lucide-flask-conical",{"title":115,"path":116,"stem":117,"icon":118},"Sources and sinks","\u002Fdocs\u002Fbuilding\u002Fstreams-builder","1.docs\u002F3.building\u002F2.streams-builder","i-lucide-import",{"title":120,"path":121,"stem":122,"icon":123},"KStream and KTable operations","\u002Fdocs\u002Fbuilding\u002Fkstream-ktable","1.docs\u002F3.building\u002F3.kstream-ktable","i-lucide-waypoints",{"title":125,"path":126,"stem":127,"icon":128},"Aggregations","\u002Fdocs\u002Fbuilding\u002Faggregations","1.docs\u002F3.building\u002F4.aggregations","i-lucide-sigma",{"title":130,"path":131,"stem":132,"icon":133},"Windowing","\u002Fdocs\u002Fbuilding\u002Fwindowing","1.docs\u002F3.building\u002F5.windowing","i-lucide-calendar-clock",{"title":135,"path":136,"stem":137,"icon":138},"Joins","\u002Fdocs\u002Fbuilding\u002Fjoins","1.docs\u002F3.building\u002F6.joins","i-lucide-git-merge",{"title":140,"path":141,"stem":142,"icon":143},"The Processor API","\u002Fdocs\u002Fbuilding\u002Fprocessor-api","1.docs\u002F3.building\u002F7.processor-api","i-lucide-cpu",{"title":145,"path":146,"stem":147,"icon":148},"Scheduled sources","\u002Fdocs\u002Fbuilding\u002Fscheduled-sources","1.docs\u002F3.building\u002F8.scheduled-sources","i-lucide-timer",{"title":150,"path":151,"stem":152,"icon":153},"Serdes and Avro","\u002Fdocs\u002Fbuilding\u002Fserdes","1.docs\u002F3.building\u002F9.serdes","i-lucide-binary",{"title":155,"path":156,"stem":157,"children":158,"icon":80},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F4.configuration\u002F1.index",[159,161,166,171,176],{"title":160,"path":156,"stem":157,"icon":80},"How configuration works",{"title":162,"path":163,"stem":164,"icon":165},"Engine configuration (:core)","\u002Fdocs\u002Fconfiguration\u002Fcore-config","1.docs\u002F4.configuration\u002F2.core-config","i-lucide-settings-2",{"title":167,"path":168,"stem":169,"icon":170},"Runtime configuration (:runtime)","\u002Fdocs\u002Fconfiguration\u002Fruntime-config","1.docs\u002F4.configuration\u002F3.runtime-config","i-lucide-server-cog",{"title":172,"path":173,"stem":174,"icon":175},"Defaults, adaptivity, and presets","\u002Fdocs\u002Fconfiguration\u002Fdefaults-and-presets","1.docs\u002F4.configuration\u002F4.defaults-and-presets","i-lucide-gauge",{"title":177,"path":178,"stem":179,"icon":180},"Kafka client configuration","\u002Fdocs\u002Fconfiguration\u002Fkafka-client-config","1.docs\u002F4.configuration\u002F5.kafka-client-config","i-lucide-plug",{"title":182,"path":183,"stem":184,"children":185,"icon":188},"Running in Production","\u002Fdocs\u002Fruntime","1.docs\u002F5.runtime\u002F1.index",[186,189,194,199,204,209,214,219],{"title":187,"path":183,"stem":184,"icon":188},"The runtime","i-lucide-server",{"title":190,"path":191,"stem":192,"icon":193},"The REST API","\u002Fdocs\u002Fruntime\u002Frest-api","1.docs\u002F5.runtime\u002F2.rest-api","i-lucide-globe",{"title":195,"path":196,"stem":197,"icon":198},"Health checks","\u002Fdocs\u002Fruntime\u002Fhealth-checks","1.docs\u002F5.runtime\u002F3.health-checks","i-lucide-heart-pulse",{"title":200,"path":201,"stem":202,"icon":203},"Metrics","\u002Fdocs\u002Fruntime\u002Fmetrics","1.docs\u002F5.runtime\u002F4.metrics","i-lucide-activity",{"title":205,"path":206,"stem":207,"icon":208},"Pause and resume","\u002Fdocs\u002Fruntime\u002Fpause-unpause","1.docs\u002F5.runtime\u002F5.pause-unpause","i-lucide-pause",{"title":210,"path":211,"stem":212,"icon":213},"Plugins and lifecycle hooks","\u002Fdocs\u002Fruntime\u002Fplugins","1.docs\u002F5.runtime\u002F6.plugins","i-lucide-puzzle",{"title":215,"path":216,"stem":217,"icon":218},"Docker images","\u002Fdocs\u002Fruntime\u002Fdocker","1.docs\u002F5.runtime\u002F7.docker","i-lucide-container",{"title":220,"path":221,"stem":222,"icon":223},"GraalVM native image","\u002Fdocs\u002Fruntime\u002Fnative-image","1.docs\u002F5.runtime\u002F8.native-image","i-lucide-zap",{"title":225,"path":226,"stem":227,"children":228,"icon":231},"Deploying & Operating","\u002Fdocs\u002Foperating","1.docs\u002F6.operating\u002F1.index",[229,232,237,242,247,252,257],{"title":230,"path":226,"stem":227,"icon":231},"Deploying and operating","i-lucide-life-buoy",{"title":233,"path":234,"stem":235,"icon":236},"Running on Kubernetes","\u002Fdocs\u002Foperating\u002Fkubernetes","1.docs\u002F6.operating\u002F2.kubernetes","i-lucide-ship",{"title":238,"path":239,"stem":240,"icon":241},"High availability","\u002Fdocs\u002Foperating\u002Fhigh-availability","1.docs\u002F6.operating\u002F3.high-availability","i-lucide-copy",{"title":243,"path":244,"stem":245,"icon":246},"Liveness and readiness probes","\u002Fdocs\u002Foperating\u002Fprobes","1.docs\u002F6.operating\u002F4.probes","i-lucide-stethoscope",{"title":248,"path":249,"stem":250,"icon":251},"Observability","\u002Fdocs\u002Foperating\u002Fobservability","1.docs\u002F6.operating\u002F5.observability","i-lucide-telescope",{"title":253,"path":254,"stem":255,"icon":256},"Tuning under load","\u002Fdocs\u002Foperating\u002Ftuning","1.docs\u002F6.operating\u002F6.tuning","i-lucide-sliders",{"title":258,"path":259,"stem":260,"icon":261},"Production checklist","\u002Fdocs\u002Foperating\u002Fproduction-checklist","1.docs\u002F6.operating\u002F7.production-checklist","i-lucide-clipboard-check",{"title":263,"path":264,"stem":265,"children":266,"icon":90},"Migrating from Kafka Streams","\u002Fdocs\u002Fmigration","1.docs\u002F7.migration\u002F1.index",[267,268,273,278,283,288],{"title":263,"path":264,"stem":265,"icon":90},{"title":269,"path":270,"stem":271,"icon":272},"Automated port","\u002Fdocs\u002Fmigration\u002Fautomated-port","1.docs\u002F7.migration\u002F2.automated-port","i-lucide-wand-sparkles",{"title":274,"path":275,"stem":276,"icon":277},"Migration without carrying state","\u002Fdocs\u002Fmigration\u002Fwithout-data-migration","1.docs\u002F7.migration\u002F3.without-data-migration","i-lucide-sparkles",{"title":279,"path":280,"stem":281,"icon":282},"Migration carrying state","\u002Fdocs\u002Fmigration\u002Fwith-data-migration","1.docs\u002F7.migration\u002F4.with-data-migration","i-lucide-database-backup",{"title":284,"path":285,"stem":286,"icon":287},"The migration tool","\u002Fdocs\u002Fmigration\u002Fmigration-tool","1.docs\u002F7.migration\u002F5.migration-tool","i-lucide-truck",{"title":289,"path":290,"stem":291,"icon":292},"Reusing your Kafka Streams dashboards","\u002Fdocs\u002Fmigration\u002Freusing-kafka-streams-dashboards","1.docs\u002F7.migration\u002F6.reusing-kafka-streams-dashboards","i-lucide-line-chart",{"title":294,"path":295,"stem":296,"children":297,"icon":299},"Reference","\u002Fdocs\u002Freference","1.docs\u002F8.reference\u002F1.index",[298,300,305,310,315,320,325,329],{"title":294,"path":295,"stem":296,"icon":299},"i-lucide-list",{"title":301,"path":302,"stem":303,"icon":304},"Configuration reference","\u002Fdocs\u002Freference\u002Fconfiguration-reference","1.docs\u002F8.reference\u002F2.configuration-reference","i-lucide-table",{"title":306,"path":307,"stem":308,"icon":309},"REST API reference","\u002Fdocs\u002Freference\u002Frest-api-reference","1.docs\u002F8.reference\u002F3.rest-api-reference","i-lucide-network",{"title":311,"path":312,"stem":313,"icon":314},"Gradle plugin reference","\u002Fdocs\u002Freference\u002Fgradle-plugin-reference","1.docs\u002F8.reference\u002F4.gradle-plugin-reference","i-lucide-box",{"title":316,"path":317,"stem":318,"icon":319},"Maven reference","\u002Fdocs\u002Freference\u002Fmaven-reference","1.docs\u002F8.reference\u002F5.maven-reference","i-simple-icons-apachemaven",{"title":321,"path":322,"stem":323,"icon":324},"Kafka Streams compatibility matrix","\u002Fdocs\u002Freference\u002Fks-compatibility-matrix","1.docs\u002F8.reference\u002F6.ks-compatibility-matrix","i-lucide-table-2",{"title":326,"path":327,"stem":328,"icon":175},"Metrics reference","\u002Fdocs\u002Freference\u002Fmetrics-reference","1.docs\u002F8.reference\u002F7.metrics-reference",{"title":330,"path":331,"stem":332,"icon":333},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","1.docs\u002F8.reference\u002F8.glossary","i-lucide-book-a",{"id":335,"title":289,"body":336,"description":1041,"extension":1042,"meta":1043,"navigation":1044,"pageType":1045,"path":290,"seo":1046,"stem":291,"__hash__":1047},"docs\u002F1.docs\u002F7.migration\u002F6.reusing-kafka-streams-dashboards.md",{"type":337,"value":338,"toc":1029},"minimark",[339,362,440,445,452,569,576,661,670,678,685,738,741,745,755,784,805,810,896,900,903,942,952,956,982,986,1002,1006,1025],[340,341,342,343,347,348,352,353,356,357,361],"p",{},"You arrive from Kafka Streams with an observability estate — Grafana dashboards, Prometheus recording rules, alerts — all built against ",[344,345,346],"strong",{},"Kafka Streams metric names",". By default none of it lights up against StoatFlow: every StoatFlow meter lives under the ",[349,350,351],"code",{},"stoatflow.*"," namespace with StoatFlow-native structure. This page turns on the ",[344,354,355],{},"opt-in Kafka Streams-compatible metrics mode",", which emits KS-named, KS-shaped, KS-unit series ",[358,359,360],"em",{},"derived from"," StoatFlow's own meters — so your existing dashboards work with little or no editing.",[363,364,365],"tldr-panel",{},[366,367,368,380,402,425],"ul",{},[369,370,371,372,375,376,379],"li",{},"Set ",[349,373,374],{},"runtime.metrics.naming: both"," to emit ",[344,377,378],{},"native + KS-named"," series side by side — the recommended migration posture.",[369,381,382,383,386,387,390,391,394,395,390,398,401],{},"Pick the ",[344,384,385],{},"shape"," that matches how you scraped KS: ",[349,388,389],{},"micrometer-binder"," (",[349,392,393],{},"kafka_stream_*",") or ",[349,396,397],{},"jmx-exporter",[349,399,400],{},"kafka_streams_*",").",[369,403,404,405,408,409,412,413,416,417,420,421,424],{},"Two edits cover most dashboards: ",[349,406,407],{},"task-id"," enumerates ",[344,410,411],{},"lanes",", not partitions; there is a ",[344,414,415],{},"single synthetic thread-id",", so ",[349,418,419],{},"alive-stream-threads"," alerts need their threshold set to ",[349,422,423],{},"1",".",[369,426,427,428,431,432,435,436,439],{},"Kafka ",[344,429,430],{},"client"," metrics (",[349,433,434],{},"kafka_consumer_*",", ",[349,437,438],{},"kafka_producer_*",") already match for free — same Micrometer binder.",[441,442,444],"h2",{"id":443},"turn-it-on","Turn it on",[340,446,447,448,451],{},"The mode is a config knob under ",[349,449,450],{},"runtime.metrics",". Zero code changes.",[453,454,459],"pre",{"className":455,"code":456,"language":457,"meta":458,"style":458},"language-yaml shiki shiki-themes vitesse-light","runtime:\n  metrics:\n    enabled: true\n    naming: both               # stoatflow | kafka-streams | both   (default: stoatflow)\n    ks-compat:\n      shape: micrometer-binder # micrometer-binder | jmx-exporter   (default: micrometer-binder)\n      sample-window-ms: 30000  # KS metrics.sample.window.ms parity\n      kafka-version: \"4.1.0\"   # value of the synthetic kafka_version tag (micrometer-binder shape)\n","yaml","",[349,460,461,474,482,495,511,519,533,548],{"__ignoreMap":458},[462,463,466,470],"span",{"class":464,"line":465},"line",1,[462,467,469],{"class":468},"su6XF","runtime",[462,471,473],{"class":472},"sYZai",":\n",[462,475,477,480],{"class":464,"line":476},2,[462,478,479],{"class":468},"  metrics",[462,481,473],{"class":472},[462,483,485,488,491],{"class":464,"line":484},3,[462,486,487],{"class":468},"    enabled",[462,489,490],{"class":472},":",[462,492,494],{"class":493},"sbBg2"," true\n",[462,496,498,501,503,507],{"class":464,"line":497},4,[462,499,500],{"class":468},"    naming",[462,502,490],{"class":472},[462,504,506],{"class":505},"spphp"," both",[462,508,510],{"class":509},"s8zF2","               # stoatflow | kafka-streams | both   (default: stoatflow)\n",[462,512,514,517],{"class":464,"line":513},5,[462,515,516],{"class":468},"    ks-compat",[462,518,473],{"class":472},[462,520,522,525,527,530],{"class":464,"line":521},6,[462,523,524],{"class":468},"      shape",[462,526,490],{"class":472},[462,528,529],{"class":505}," micrometer-binder",[462,531,532],{"class":509}," # micrometer-binder | jmx-exporter   (default: micrometer-binder)\n",[462,534,536,539,541,545],{"class":464,"line":535},7,[462,537,538],{"class":468},"      sample-window-ms",[462,540,490],{"class":472},[462,542,544],{"class":543},"s-TwI"," 30000",[462,546,547],{"class":509},"  # KS metrics.sample.window.ms parity\n",[462,549,551,554,556,560,563,566],{"class":464,"line":550},8,[462,552,553],{"class":468},"      kafka-version",[462,555,490],{"class":472},[462,557,559],{"class":558},"sSP4y"," \"",[462,561,562],{"class":505},"4.1.0",[462,564,565],{"class":558},"\"",[462,567,568],{"class":509},"   # value of the synthetic kafka_version tag (micrometer-binder shape)\n",[340,570,571,572,575],{},"The three ",[349,573,574],{},"naming"," modes:",[577,578,579,599],"table",{},[580,581,582],"thead",{},[583,584,585,590,596],"tr",{},[586,587,588],"th",{},[349,589,574],{},[586,591,592,595],{},[349,593,594],{},"\u002Fmetrics"," contains",[586,597,598],{},"Use it when",[600,601,602,619,641],"tbody",{},[583,603,604,610,616],{},[605,606,607],"td",{},[349,608,609],{},"stoatflow",[605,611,612,613,615],{},"Native ",[349,614,351],{}," only (default — today's behaviour)",[605,617,618],{},"You have no KS dashboards to reuse.",[583,620,621,626,631],{},[605,622,623],{},[349,624,625],{},"both",[605,627,628],{},[344,629,630],{},"Native + KS-named",[605,632,633,636,637,640],{},[344,634,635],{},"Migration default."," Your KS dashboards work ",[358,638,639],{},"and"," your StoatFlow dashboards keep working.",[583,642,643,648,654],{},[605,644,645],{},[349,646,647],{},"kafka-streams",[605,649,650,651,653],{},"KS-named only; the mapped ",[349,652,351],{}," families are hidden",[605,655,656,657,660],{},"A deliberate end state, or when scrape\u002Fingest size matters. Note: StoatFlow's own reference dashboards and support runbooks key on ",[349,658,659],{},"stoatflow_*"," and won't work here.",[340,662,663,664,666,667,669],{},"Start with ",[349,665,625],{},". Move to ",[349,668,647],{}," only once you're sure nothing you own reads the native names.",[441,671,673,674,677],{"id":672},"which-shape-does-your-prometheus-have","Which shape does ",[358,675,676],{},"your"," Prometheus have?",[340,679,680,681,684],{},"\"The KS metric name\" in Prometheus depends on how the KS app was scraped. StoatFlow renders ",[344,682,683],{},"either"," shape:",[577,686,687,700],{},[580,688,689],{},[583,690,691,694,697],{},[586,692,693],{},"Shape",[586,695,696],{},"Example series",[586,698,699],{},"This is what you have if…",[600,701,702,720],{},[583,703,704,708,713],{},[605,705,706],{},[349,707,389],{},[605,709,710],{},[349,711,712],{},"kafka_stream_thread_process_latency_avg",[605,714,715,716,719],{},"Your KS app used Micrometer \u002F Spring Boot's ",[349,717,718],{},"KafkaStreamsMetrics"," binder.",[583,721,722,726,731],{},[605,723,724],{},[349,725,397],{},[605,727,728],{},[349,729,730],{},"kafka_streams_stream_thread_metrics_process_rate",[605,732,733,734,737],{},"You scraped KS JMX via the Prometheus ",[349,735,736],{},"jmx_exporter"," (Strimzi \u002F Confluent-style).",[340,739,740],{},"Look at one panel query in your existing dashboard and match the prefix. (The jmx-exporter shape targets the common default-config output; heavily customised jmx rules files may need panel tweaks.)",[441,742,744],{"id":743},"the-two-edits-that-cover-most-dashboards","The two edits that cover most dashboards",[340,746,747,748,751,752,754],{},"StoatFlow has ",[344,749,750],{},"no stream threads and no tasks"," — it runs one instance with virtual-thread ",[358,753,411],{},". The compat layer synthesises the KS identity tags, with two consequences worth knowing before you read a dashboard:",[756,757,759],"callout",{"color":758,"icon":85},"warning",[340,760,761,766,767,435,770,773,774,390,776,779,780,783],{},[344,762,763,765],{},[349,764,407],{}," is a lane, not a partition."," Sums and aggregations (",[349,768,769],{},"sum(...)",[349,771,772],{},"rate(...)",") match exactly. But a per-task drill-down enumerates ",[344,775,411],{},[349,777,778],{},"0_5"," is lane 5, not partition 5), and the lane count is not the partition count. Panels that break down ",[358,781,782],{},"by task"," show lanes.",[756,785,786],{"color":758,"icon":85},[340,787,788,794,795,798,799,802,803,424],{},[344,789,790,791,424],{},"One synthetic ",[349,792,793],{},"thread-id"," StoatFlow collapses the whole engine into a single ",[349,796,797],{},"\u003Capplication-id>-StreamThread-1",". Per-thread breakdowns become one series, and any alert like ",[349,800,801],{},"kafka_stream_alive_stream_threads \u003C N"," must have its threshold set to ",[344,804,423],{},[806,807,809],"h3",{"id":808},"alert-edit-checklist","Alert-edit checklist",[366,811,814,830,847,859,876],{"className":812},[813],"contains-task-list",[369,815,818,823,824,826,827,829],{"className":816},[817],"task-list-item",[819,820],"input",{"disabled":821,"type":822},true,"checkbox"," ",[349,825,419],{}," alerts → threshold ",[349,828,423],{}," (single synthetic thread).",[369,831,833,823,835,838,839,842,843,846],{"className":832},[817],[819,834],{"disabled":821,"type":822},[349,836,837],{},"failed-stream-threads"," → maps from StoatFlow's engine-restart counter (a ",[349,840,841],{},"replace_thread"," restart ",[358,844,845],{},"is"," the KS thread-replacement recovery event); keep the alert, it fires on real fault storms.",[369,848,850,852,853,855,856,858],{"className":849},[817],[819,851],{"disabled":821,"type":822}," Per-",[349,854,407],{}," \u002F per-",[349,857,793],{}," breakdown panels → read them as per-lane \u002F single-series.",[369,860,862,864,865,868,869,872,873,875],{"className":861},[817],[819,863],{"disabled":821,"type":822}," Thread ",[349,866,867],{},"process-latency"," → StoatFlow measures ",[344,870,871],{},"per record",", KS per iteration-batch, so absolute values are smaller than a real KS app; keep the ",[358,874,385],{},", re-baseline any hard thresholds.",[369,877,879,881,882,435,885,435,888,891,892,895],{"className":878},[817],[819,880],{"disabled":821,"type":822}," Ratios (",[349,883,884],{},"process-ratio",[349,886,887],{},"active-process-ratio",[349,889,890],{},"punctuate-ratio",") are ",[344,893,894],{},"not"," emitted (lane parallelism makes true utilization >1); remove or ignore those panels.",[441,897,899],{"id":898},"what-maps-and-how-well","What maps, and how well",[340,901,902],{},"The full per-metric compatibility table is the canonical mapping in the engine; the tiers are:",[366,904,905,915,933],{},[369,906,907,910,911,914],{},[344,908,909],{},"✅ full"," — same meaning, same math (poll, store ",[349,912,913],{},"range\u002Fall\u002Fflush"," latency, topic consumed\u002Fproduced totals, node e2e latency, …).",[369,916,917,920,921,924,925,928,929,932],{},[344,918,919],{},"⚠️ approximate"," — emitted, semantics differ, documented per row (thread ",[349,922,923],{},"commit-latency"," = barrier commit; ",[349,926,927],{},"dropped-records"," covers null-key + join + late-window drops; per-lane task metrics; store ",[349,930,931],{},"get\u002Fput\u002Fdelete"," latency; RocksDB rows).",[369,934,935,938,939,941],{},[344,936,937],{},"❌ not mappable"," — architecturally absent (no rebalancing, no enforced-processing, no iterator metrics); their absence ",[358,940,845],{}," parity — a Micrometer-instrumented KS app skips the same non-numeric metrics.",[340,943,944,945,435,948,951],{},"State-store panels key on the scope-dependent tag (",[349,946,947],{},"rocksdb-window-state-id",[349,949,950],{},"in-memory-session-state-id",", …); StoatFlow synthesises the correct scope key per store, so those panels populate.",[441,953,955],{"id":954},"one-thing-to-know-the-native-surface-shifts-slightly","One thing to know: the native surface shifts slightly",[340,957,958,959,962,963,966,967,970,971,974,975,977,978,981],{},"With ",[349,960,961],{},"naming != stoatflow"," a compat filter tightens the mapped native timers' ",[349,964,965],{},"stoatflow_*_seconds_max"," to a ~30 s window (fresher than the default 2 min × 3) and adds a p0 quantile to ",[349,968,969],{},"stoatflow.e2e.latency"," (used to approximate ",[349,972,973],{},"record-e2e-latency-min","). This is bounded and arguably an improvement, but it ",[358,976,845],{}," an observable change to a few native ",[349,979,980],{},"_max"," series — expect them to be a little \"twitchier\".",[441,983,985],{"id":984},"sizing","Sizing",[340,987,988,990,991,994,995,998,999,401],{},[349,989,625],{}," mode roughly adds: thread ≈ 25 series; task ≈ 8-10 × lanes (64 lanes ≈ 600 series); store ≈ 10-14 × stores (plus ~44 × stores for RocksDB when ",[349,992,993],{},"statistics-enabled","); topic ≈ 4 × topics; cache ≈ 3 × stores. Lane count dominates. At ",[349,996,997],{},"recording-level: debug"," with many lanes this is thousands of extra series — which is remote-write \u002F ingest cost, not just scrape payload. The recording level gates the sources (see ",[1000,1001,200],"a",{"href":201},[441,1003,1005],{"id":1004},"next-steps","Next steps",[366,1007,1008,1018],{},[369,1009,1010,1014,1015,1017],{},[344,1011,1012],{},[1000,1013,200],{"href":201}," — the native ",[349,1016,351],{}," catalogue and recording levels.",[369,1019,1020,1024],{},[344,1021,1022],{},[1000,1023,248],{"href":249}," — alerting and the Grafana view.",[1026,1027,1028],"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 .spphp, html code.shiki .spphp{--shiki-default:#B56959}html pre.shiki code .s8zF2, html code.shiki .s8zF2{--shiki-default:#A0ADA0}html pre.shiki code .s-TwI, html code.shiki .s-TwI{--shiki-default:#2F798A}html pre.shiki code .sSP4y, html code.shiki .sSP4y{--shiki-default:#B5695977}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);}",{"title":458,"searchDepth":476,"depth":476,"links":1030},[1031,1032,1034,1037,1038,1039,1040],{"id":443,"depth":476,"text":444},{"id":672,"depth":476,"text":1033},"Which shape does your Prometheus have?",{"id":743,"depth":476,"text":744,"children":1035},[1036],{"id":808,"depth":484,"text":809},{"id":898,"depth":476,"text":899},{"id":954,"depth":476,"text":955},{"id":984,"depth":476,"text":985},{"id":1004,"depth":476,"text":1005},"Turn on Kafka Streams-compatible metrics so your existing Grafana dashboards, Prometheus rules, and alerts light up against a StoatFlow app with at most threshold-level edits.","md",{},{"icon":292},"how-to",{"title":289,"description":1041},"M8MEeq23EIYuuGbGxo47mUyxsbMSWa5AcChwpVBMelc",[1049,1051],{"title":284,"path":285,"stem":286,"description":1050,"icon":287,"children":-1},"How to run stoatflow-migration-tool — the offline Kafka Streams changelog translator. Config reference, the plan \u002F translate \u002F seed-offsets \u002F verify commands, the cutover runbook, and the rollback line.",{"title":294,"path":295,"stem":296,"description":1052,"icon":299,"children":-1},"Lookup material for StoatFlow — configuration keys, REST API, the Gradle plugin and Maven build references, the Kafka Streams compatibility matrix, the metrics catalogue, and the glossary.",1786987429792]