Identify Kafka topics consuming unnecessary storage with Conduktor Insights. Surface empty, stale, and tiny topics to reduce costs.
Cost control is one of the sections in the Insights dashboard. It helps platform teams identify topics consuming unnecessary storage and make informed cleanup and retention decisions.
The Cost Control section displays three categories of topics that may be wasting storage:
Empty topics - topics with no messages that consume metadata overhead
Stale topics - topics with no writes in a configured time period (default: 7+ days)
Tiny topics - topics with minimal data volume relative to their partition overhead
Each category shows the number of affected topics. Individual topics are listed with idle time in days and partition count.You can switch the view of data on the page between a graphs view and a table view using the “Graphs” toggle found at the top right of the page.Before taking action on any topic, verify it is truly unused by checking consumer groups, producer configurations, ownership and documentation.
Deleting a topic is permanent and cannot be undone. All partition metadata and configuration will be lost.
Topics containing zero messages. These topics have been created but never received data, or have had all messages deleted through retention policies.For each topic: name, idle time in days, and partition count.Empty topics consume cluster resources even without data: metadata storage in ZooKeeper or KRaft, memory for buffers, and often per-partition charges on cloud Kafka services.
Empty topics are common in development and staging environments where topics are created for testing but not cleaned up afterward.
Delete an empty topic
Good candidates for deletion:
topics created for abandoned projects or experiments
temporary topics used for testing or debugging
topics created by mistake with typos in the name
legacy topics from deprecated applications
topics created automatically by frameworks but never used
Reasons to keep empty topics:
topics pre-created for upcoming features or applications
topics serving as placeholders for future data pipelines
topics referenced in consumer group configurations awaiting data
topics used as dead letter queues that only receive messages in error scenarios
1
Verify the topic is unused
Click the topic name to go to the Topics page. Check:
Consumer Groups tab for active consumers or unconsumed data (lag > 0)
Monitoring tab graphs to confirm zero produce activity
Application references in codebases and deployment configs
Dependencies - verify no streaming jobs or external systems depend on the topic
2
Delete from the list
In the Cost Control section, click the … menu next to the topic and select Delete topic.
3
Confirm deletion
Type DELETE to confirm and click the delete button.
Topic deletion can take up to 5 minutes to be reflected in the dashboard. Consumer groups that were subscribed will need to be updated to remove the topic from their subscriptions.
Topics with no write activity for 7+ days and no active consumer groups.For each topic: name, idle time in days, and partition count.Stale topics often indicate abandoned data pipelines from shut down applications, failed producers or cancelled projects. They continue consuming storage through retention policies and add operational overhead.
A topic with no writes may still have active consumers reading historical data. Stale write activity does not necessarily mean the topic is unused or safe to delete.
Evaluate and handle stale topics
Investigation checklist:
Check consumer groups - Are any consumers actively reading from the topic?
Review consumer lag - Is there unconsumed data that applications still need?
Verify business requirements - Is the historical data needed for compliance or analytics?
Contact topic owners - Do the application teams still need this topic?
Check data lineage - Do downstream systems depend on this data?
Topics that are safe to delete:
No active consumer groups subscribed
All consumers show zero lag (all data has been consumed)
Application owners confirm the topic is no longer needed
No compliance requirements for data retention
Historical data has been archived to long-term storage
Topics to keep:
Active consumers are still reading historical data
Data is required for compliance or audit purposes
Topic serves as a source of truth for event sourcing
Downstream analytics or reporting systems depend on the data
Occasional writes expected (seasonal or infrequent events)
Deleting a topic with unconsumed messages will result in permanent data loss for consumers that have not yet processed those messages.
Archive stale topic data before deletion
For topics containing valuable historical data, export and archive the data before deletion.
1
Export the topic data
Navigate to the topic, click the Consume tab, configure the consumer to read from Beginning offset, and export data to a file or external storage.
For large topics, use a dedicated archival tool or Kafka Connect to export data to object storage (S3, Azure Blob Storage) or a data lake.
2
Verify the archive
Confirm all messages were exported successfully, validate the data format and completeness, and store in long-term storage with documentation of location and format.
Maintain a record of archived topics including the archive location, date, original message count and retention period for the archived data.
3
Delete the topic
Follow the deletion steps above.
Reduce retention on stale topics
If a topic might receive future writes but historical data is no longer needed, reduce the retention period instead of deleting.
1
Update retention settings
Navigate to Topics, select the topic, click Configuration, and edit:
retention.ms - Time-based retention (e.g., 86400000 for 1 day)
retention.bytes - Size-based retention per partition (e.g., 1073741824 for 1 GB)
Kafka automatically deletes segments older than the retention period during its next cleanup cycle (typically runs every few minutes based on broker configuration).
2
Monitor cleanup
Monitor the topic size in the Overview tab to verify that old data is being cleaned up as expected.
Topics meeting all of the following: more than 1 partition, less than 10 MB of data OR fewer than 1000 messages, and name does not end with _repartition.For each topic: name, idle time in days, and partition count.Topics with many partitions but little data represent inefficient resource allocation. Cloud Kafka services often charge per partition, and high partition counts increase controller overhead.
A common cause is using default partition counts (often 6-12) for topics that only receive occasional messages, such as configuration topics or low-volume event streams.
Optimize tiny topics
How to evaluate:Keep the topic as-is if it expects significant growth, requires high parallelism, is part of a standardized policy or would require complex migration. Consider optimization if the topic has been tiny for months without growth, has arbitrary partition counts or handles low-frequency data without parallelism requirements.Since Kafka does not support reducing partition count, you have three options:
Consolidate topics
Recreate with fewer partitions
Accept current state
If you have multiple tiny topics serving similar purposes, consolidate them into a single topic with categorization through message headers or keys. This reduces total partition count while maintaining logical separation.Considerations:
Identify candidates from the same application with similar schemas
Design consolidated topic structure with category or type fields
Update producers and consumers accordingly
Topic consolidation changes the partition key distribution and may affect message ordering. Ensure consumers can handle messages from multiple original topics in a single stream.
1
Plan partition count
Determine the optimal partition count:
1 partition - Low-volume topics where ordering is critical
3 partitions - Topics needing some parallelism and broker distribution
Match consumer count - For parallelism requirements
For topics receiving fewer than 1000 messages per day, a single partition is often sufficient unless you have specific parallelism requirements.
2
Archive existing data
If historical data must be preserved, export all messages from the topic using the Consume tab and store in a file or external system.
3
Create the new topic
Navigate to Topics and click Create topic. Use the same topic name with a suffix (for example, topic-name-v2), set the optimized partition count and copy all relevant configurations from the original topic.
Create the new topic with a different name initially to allow for parallel operation during migration.
4
Update applications
Update producer and consumer configurations to use the new topic name. Deploy consumer updates first, then producers, to ensure no messages are lost during the transition.
5
Restore archived data (if needed)
If historical data must be available in the new topic, use producer applications or data migration tools to restore the archived data.
6
Delete the old topic
After verifying the new topic is working correctly, monitor for a grace period (24-48 hours), confirm no applications are producing to the old topic, then delete the tiny topic.
Verify consumer lag on the new topic is being processed normally and no errors are occurring in producer or consumer logs.
For some topics, optimization effort may not justify savings:
System internals (__consumer_offsets has 50 partitions by default)
Framework defaults (Kafka Streams state stores)
Topics where migration risk outweighs storage savings
Prevent cost control issues through governance and automated ownership tracking rather than manual remediation.Use Self-service for ownership and governance - it brings a GitOps approach to topic lifecycle management where applications represent streaming apps or data pipelines and dictate ownership of Kafka resources.Benefits for cost control:
Automatic ownership tracking - topics created through Self-service have clear ownership from creation
Policy enforcement - application instance policies can prevent creation of tiny topics by enforcing minimum data volume or maximum partition count requirements
Naming conventions - policies enforce consistent naming that includes environment and ownership information
Lifecycle management - clear application ownership reduces abandoned topics through better tracking and accountability
Learn about Self-serviceConfigure RBAC - Use role-based access control to enforce naming conventions, limit partition counts and require labeling at topic creation. Learn more about RBACImplement cleanup policies - Document organization-wide policies for retention periods, deletion criteria and approval processes. Schedule regular reviews of cost control reports (weekly for new topics, monthly for trends).
Why does an empty topic show recent activity in monitoring?
Producer health checks, monitoring systems or automated tests may send periodic messages that are immediately consumed and deleted. Kafka’s log cleaner activity can also appear as writes in some monitoring systems.Check the Messages in per second graph over 7+ days to distinguish sustained activity from sporadic checks. Review the Consume tab to see actual message content.
Can I recover a topic after deletion?
No, topic deletion is permanent. All partition data and topic metadata are removed. Consumer group offsets are retained but the topic cannot be recreated with the same history.Always archive important data before deletion. Implement a grace period policy where topics are first marked for deletion (using labels) before actual removal. To recreate a deleted topic, create a new topic with the same name in Console and restore data from archives if available.
How do I identify topics created by internal Kafka processes?
Kafka creates internal topics automatically: __consumer_offsets (consumer group offsets), __transaction_state (transactional state), _schemas (Schema Registry metadata) and topics matching .*-changelog or .*-repartition (Kafka Streams internals).Never delete __consumer_offsets or __transaction_state as this causes cluster-wide failures. Only delete Kafka Streams topics when the application is permanently decommissioned and all instances are shut down.
Why does reducing retention not free up disk space immediately?
Kafka’s log cleanup process runs periodically (default: every 5 minutes). Data is deleted at segment boundaries, not individual messages, and the current active segment is never deleted even if older than retention.Wait 15-30 minutes after reducing retention, then check topic size in the Overview tab.
How do I handle topics with unknown ownership?
Check topic naming patterns, review consumer groups in the Consumer Groups tab, search code repositories and deployment configs for references, and consult internal documentation.If ownership remains unclear, add a scheduled-for-deletion label with a future date (for example, 30 days) and send announcements asking owners to identify themselves. After the grace period expires with no claims, proceed with deletion.Implement a policy requiring application labels at topic creation time. Use RBAC permissions to enforce labeling as a prerequisite for topic creation.
What if a stale topic suddenly receives writes after months of inactivity?
This is normal for seasonal data (holiday sales, tax season), emergency systems (disaster recovery), compliance events (audit logs) or legacy integrations (backup systems).Verify the producer is authorized, add a usage-pattern: seasonal or usage-pattern: emergency label, and document the activity pattern. Do not delete topics showing this pattern without understanding the business requirement.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Conduktor Docs","colors":{"primary":"#09343C","light":"#BCFE68","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/conduktor/089vHQa2MA1IdMUE/logo/light.svg?fit=max\u0026auto=format\u0026n=089vHQa2MA1IdMUE\u0026q=85\u0026s=6435b57bce25a923f123614b7af5a6fb","dark":"https://mintcdn.com/conduktor/089vHQa2MA1IdMUE/logo/dark.svg?fit=max\u0026auto=format\u0026n=089vHQa2MA1IdMUE\u0026q=85\u0026s=22cf4534f017e989f9d2bbc5a9a24247"},"favicon":"https://mintcdn.com/conduktor/rNM3LyXxXzcOon_b/favicon.svg?fit=max\u0026auto=format\u0026n=rNM3LyXxXzcOon_b\u0026q=85\u0026s=7ac4ffcee23263ea654f9cdc131535cf","navbar":{"primary":{"type":"button","label":"Get started","href":"https://conduktor.io/get-started?utm_source=docs\u0026utm_medium=referral\u0026src=docs-navbar"}},"footer":{"socials":{"slack":"https://conduktor.io/slack","github":"https://github.com/conduktor","linkedin":"https://www.linkedin.com/company/conduktor","youtube":"https://www.youtube.com/channel/UCTr4J1unmW5QKJ14M6aPYdQ","x":"https://x.com/getconduktor"},"links":[{"header":"Product","items":[{"label":"Console","href":"https://conduktor.io/console?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Gateway","href":"https://conduktor.io/gateway?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Gateway Community Edition","href":"https://conduktor.io/gateway/passthrough?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Pricing","href":"https://conduktor.io/pricing?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Architecture","href":"https://conduktor.io/architecture?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Demo Center","href":"https://conduktor.io/demo-center?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Product Releases","href":"https://conduktor.io/product-releases?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"}]},{"header":"Resources","items":[{"label":"Kafkademy","href":"https://www.conduktor.io/kafka?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Blog","href":"https://conduktor.io/blog?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Glossary","href":"https://conduktor.io/glossary?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Customer Stories","href":"https://conduktor.io/customer-stories?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Ebooks","href":"https://conduktor.io/resources/hub?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"}]},{"header":"Company","items":[{"label":"About","href":"https://conduktor.io/about?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Careers","href":"https://conduktor.io/careers?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Contact","href":"https://conduktor.io/contact?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Events","href":"https://conduktor.io/events?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"}]},{"header":"Integrations","items":[{"label":"AWS","href":"https://conduktor.io/partners/aws?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Cloudera","href":"https://conduktor.io/partners/cloudera?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Confluent","href":"https://conduktor.io/partners/confluent?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"},{"label":"Snowflake","href":"https://conduktor.io/partners/snowflake?utm_source=docs\u0026utm_medium=referral\u0026src=docs-footer"}]}]},"seo":{"metatags":{"og:image":"https://docs.conduktor.io/images/conduktor-overview.png","og:image:alt":"Conduktor — Kafka operations and governance platform","og:site_name":"Conduktor Docs","og:type":"website","og:locale":"en_US","robots":"index, follow","googlebot":"index, follow","twitter:card":"summary_large_image","twitter:site":"@getconduktor","twitter:image":"https://docs.conduktor.io/images/conduktor-overview.png"}},"integrations":{"gtm":{"tagId":"GTM-N6ZLDDSP"}},"banner":{"content":"Benchmarking the Conduktor Gateway: what a Kafka proxy really costs [Read the benchmark →](https://www.conduktor.io/blog/conduktor-gateway-performance-benchmark?utm_source=docs\u0026utm_medium=referral\u0026utm_campaign=site-banner\u0026src=docs-banner)","dismissible":true},"errors":{"404":{"redirect":false,"title":"Page not found","description":"This page does not exist or has moved.\n\nHead back to the [Conduktor docs home](/) or use the search bar above.\n\nIf you followed a broken link, [let us know](https://support.conduktor.io/hc/en-gb/requests/new?ticket_form_id=17438363566609)."}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"conduktor","hasAudioNarration":false,"actualSubdomain":"conduktor","customDomains":["docs.conduktor.io"],"gitSource":{"type":"github","owner":"conduktor","repo":"conduktor-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae88914bed22c024834dc44","collectionId":"43205d6f-f5b0-40e2-8963-64498c0fcd71","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae88914bed22c024834dc44"},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae912e5cbc55ea6ea2c5688","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"Deploy and configure","count":36},{"language":"default","tag":"Use and maintain","count":30},{"language":"default","tag":"Tutorials","count":23},{"language":"default","tag":"Reference","count":19},{"language":"default","tag":"Get started","count":13},{"language":"default","tag":"Deploy Gateway","count":13},{"language":"default","tag":"Use cases","count":12},{"language":"default","tag":"Gateway","count":11},{"language":"default","tag":"Initial setup","count":11},{"language":"default","tag":"Configure","count":11}]},"assistantConfig":{"enableAskAiButton":true,"enableStarterQuestions":true,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":false,"deflection":{"enabled":false,"email":"support@conduktor.io"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"starterQuestions":[{"_id":"69b313ccbe42b087e0007e7a","deploymentId":"68681972295343c9858c8f5c","questionText":"How do I set up Virtual Clusters to isolate Kafka access?","status":"active","generatedBy":"manual","createdAt":"2026-03-12T19:28:12.021Z","updatedAt":"2026-03-12T19:28:12.021Z","__v":0},{"_id":"69b313c7be42b087e0007e6f","deploymentId":"68681972295343c9858c8f5c","questionText":"How do I enforce data quality rules on Kafka topics?","status":"active","generatedBy":"manual","createdAt":"2026-03-12T19:28:07.485Z","updatedAt":"2026-03-12T19:28:07.485Z","__v":0},{"_id":"68ed239420829a4e927f4f0a","deploymentId":"68681972295343c9858c8f5c","questionText":"How do I encrypt my Kafka data with Conduktor?","status":"active","generatedBy":"manual","createdAt":"2025-10-13T16:06:44.497Z","updatedAt":"2026-03-12T19:28:01.805Z","__v":0}],"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":".mdx-content,[data-mode=custom] .container{max-width:1024px!important;margin-right:auto;margin-left:auto;margin-top:2rem}@media (max-width:768px){.mdx-content,[data-mode=custom] .container{padding:0 .75rem}}#topbar-cta-button>a>span{background-color:#09343c!important;color:#fff}.dark #topbar-cta-button>a>span{background-color:#496e78!important}.img.nav-logo{height:32px}.link-list a{position:relative;transition:all .2s ease;padding-right:20px}.link-list a:hover{color:#09343c;transform:translateX(4px);text-decoration:underline}.dark .link-list a:hover{color:#bcfe68}.link-list a:after{content:\"\";position:absolute;right:0;top:50%;transform:translateY(-50%);width:16px;height:16px;opacity:0;transition:all .2s ease;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 7h10v10'/%3E%3Cpath d='M7 17 17 7'/%3E%3C/svg%3E\");background-size:contain;background-repeat:no-repeat}.link-list a:hover:after{opacity:1}.dark .link-list a:after{background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 7h10v10'/%3E%3Cpath d='M7 17 17 7'/%3E%3C/svg%3E\")}.spacing-sm{margin:10px 0}.spacing-md{margin:20px 0}.spacing-lg{margin:40px 0}.spacing-xl{margin:60px 0}.mt-sm{margin-top:10px}.mt-md{margin-top:20px}.mt-lg{margin-top:40px}.mb-sm{margin-bottom:10px}.mb-md{margin-bottom:20px}.mb-lg{margin-bottom:40px}h1,h2,h3{color:#09343c}.home-section-heading{font-size:1.5rem!important;font-weight:700!important;margin-top:2.5rem!important;margin-bottom:.75rem!important;color:#09343c}.dark .home-section-heading{color:#fff!important}.dark h1,h1{font-size:2.5rem!important;font-weight:700!important;line-height:1.2!important;margin-bottom:.5rem!important;margin-top:3rem!important}#changelog-filters,.eyebrow{display:none!important}.mt-2.text-lg.prose{color:#6e8287!important}.dark .mt-2.text-lg.prose{color:#8faab0!important}.dark h1,.dark h2,.dark h3{color:#fff}table td{padding:16px!important;border-left:1px solid #eeedef}.dark table td,.dark table tr{border-left:1px solid rgb(255,255,255,.05)}table td:last-child{border-right:1px solid #eeedef}.dark table td:last-child{border-right:1px solid rgb(255,255,255,.05)}table tr{border-left:1px solid #eeedef;border-radius:20px}table tr:first-child{border-top:1px solid #eeedef}.dark table tr:first-child{border-top:1px solid rgb(255,255,255,.05)}table tr:last-child{border-bottom:1px solid #eeedef;border-right:1px solid #eeedef}.dark table tr:last-child{border-bottom:1px solid rgb(255,255,255,.05);border-right:1px solid rgb(255,255,255,.05)}table th{min-width:auto!important;border-right:1px solid #eeedef}.dark table th{border-right:1px solid rgb(255,255,255,.05)}table th:last-child{border-right:none}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding:8px 16px;text-align:left;vertical-align:middle}code{white-space:pre-wrap!important;word-wrap:break-word!important;overflow-wrap:break-word!important}.sidebar-group a:has(svg){flex-direction:row-reverse!important}.sidebar-group-header:has(.sidebar-group-icon){width:100%!important;padding-right:.75rem!important}.sidebar-group-header .sidebar-group-icon{order:2!important;margin-left:auto!important}.feature-label .tooltip{text-decoration:none}.feature-label a.link{border-bottom:none}.feature-label+.feature-label{margin-left:.5rem}.card-group .card{transition:transform .3s ease,border-color .4s ease!important;border-radius:16px!important;background:rgba(9,52,60,.03)!important}.card-group .card:hover{transform:translateY(-4px)!important;box-shadow:none!important;border-color:#09343c}.dark .card-group .card{border-color:#09343c;background:#072024!important}.dark .card-group .card:hover{border-color:#bcfe68}.tab-container,.tabs-container,[data-tabs]{display:block!important}.tab-container div,.tab-container li,.tab-container p,.tabs-container div,.tabs-container li,.tabs-container p,[data-tabs] div,[data-tabs] li,[data-tabs] p{font-weight:400}.tab-container b,.tab-container strong,.tabs-container b,.tabs-container strong,[data-tabs] b,[data-tabs] strong{font-weight:700}#table-of-contents-content a,.toc a{border-left:2px solid rgba(0,0,0,.05)!important}#table-of-contents-content .toc-item>a,.toc-item>a{padding-left:calc(var(--toc-padding-left, 1rem) + var(--toc-focus-padding, 0rem))!important}#table-of-contents-content .toc-item[data-depth=\"0\"]>a,.toc-item[data-depth=\"0\"]>a{--toc-padding-left:1rem!important}#table-of-contents-content .toc-item[data-depth=\"1\"]>a,.toc-item[data-depth=\"1\"]>a{--toc-padding-left:2rem!important}#table-of-contents-content .toc-item[data-depth=\"2\"]>a,.toc-item[data-depth=\"2\"]>a{--toc-padding-left:3rem!important}#table-of-contents-content .toc-item[data-depth=\"0\"]>a,.toc-item[data-depth=\"0\"]>a{font-size:.9375rem!important;font-weight:600!important;opacity:1!important;margin-top:.5rem!important;margin-bottom:.25rem!important}#table-of-contents-content .toc-item[data-depth=\"1\"]>a,#table-of-contents-content .toc-item[data-depth=\"2\"]>a,.toc-item[data-depth=\"1\"]>a,.toc-item[data-depth=\"2\"]>a{font-size:.875rem!important;font-weight:400!important;opacity:.8!important;margin-top:.125rem!important;margin-bottom:.125rem!important}.dark #table-of-contents-content .toc-item[data-depth=\"1\"]>a,.dark #table-of-contents-content .toc-item[data-depth=\"2\"]>a,.dark .toc-item[data-depth=\"1\"]>a,.dark .toc-item[data-depth=\"2\"]>a{opacity:.7!important}.dark #table-of-contents-content a,.dark .toc a{border-left-color:rgba(255,255,255,.1)!important}#table-of-contents-content a.text-primary,.toc a.text-primary{border-left-style:solid!important}.dark #table-of-contents-content a.border-primary,.dark #table-of-contents-content a.text-primary,.dark .toc a.border-primary,.dark .toc a.text-primary{border-left-color:#bcfe68!important}#table-of-contents-content a.border-primary,#table-of-contents-content a.text-primary,.toc a.border-primary,.toc a.text-primary{border-left-width:3px!important;border-left-color:#09343c!important}.dh{--dh-ink:#09343C;--dh-text:#3b4f54;--dh-muted:#64777b;--dh-link:#15803D;--dh-surface:#ffffff;--dh-surface-soft:#f4f6f7;--dh-border:#e4e8ea;--dh-border-hover:#09343C;--dh-accent:#BCFE68;--dh-shadow:0 1px 2px rgba(9, 52, 60, 0.04), 0 12px 32px -12px rgba(9, 52, 60, 0.14);--dh-mark-bg:#09343C;--dh-mark-fg:#BCFE68;max-width:1200px;margin:0 auto;padding:0 32px 96px;color:var(--dh-text);line-height:1.6}.dark .dh{--dh-ink:#f1f5f9;--dh-text:#cbd5e1;--dh-muted:#94a3b8;--dh-link:#BCFE68;--dh-surface:#161b22;--dh-surface-soft:rgba(255, 255, 255, 0.05);--dh-border:rgba(255, 255, 255, 0.12);--dh-border-hover:#BCFE68;--dh-shadow:0 1px 2px rgba(0, 0, 0, 0.3), 0 12px 32px -12px rgba(0, 0, 0, 0.6);--dh-mark-bg:#0d3a42}.mdx-content:has(.dh),[data-mode=custom] .container:has(.dh){max-width:100%!important;padding:0!important;margin-top:0!important}.dh-hero{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:64px;align-items:center;padding:72px 0 64px;border-bottom:1px solid var(--dh-border)}.dh .dh-h1{margin:0!important;font-size:clamp(2.2rem,3.6vw,3rem)!important;font-weight:700;line-height:1.08!important;letter-spacing:-.025em;color:var(--dh-ink)}.dh .dh-h1 em{font-style:italic;color:var(--dh-link)}.dh .dh-lead{max-width:56ch;margin:20px 0 0;font-size:1.08rem;color:var(--dh-text)}.dh .dh-hint{margin:24px 0 0;font-size:.85rem;color:var(--dh-muted)}.dh .dh-hint kbd,.dh-products{border:1px solid var(--dh-border)}.dh .dh-hint kbd{display:inline-block;min-width:1.6em;padding:1px 6px;border-radius:5px;background:var(--dh-surface-soft);box-shadow:inset 0 -1px 0 var(--dh-border);color:var(--dh-ink);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.75rem;text-align:center}.dh-products{display:flex;flex-direction:column;padding:6px;border-radius:16px;background:var(--dh-surface);box-shadow:var(--dh-shadow)}.dh .dh-product{display:grid;grid-template-columns:36px minmax(0,1fr) auto;grid-template-areas:\"mark name arrow\" \"mark desc arrow\";column-gap:14px;align-items:center;padding:14px 16px;border-radius:11px;text-decoration:none;transition:background .15s ease}.dh .dh-product+.dh-product,.dh .dh-products-footer,.dh .dh-rows li{border-top:1px solid var(--dh-border)}.dh .dh-product:hover{background:var(--dh-surface-soft)}.dh-product-mark{grid-area:mark;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:9px;background:var(--dh-mark-bg);color:var(--dh-mark-fg)}.dh-product-mark svg{width:18px;height:18px}.dh-product-name{grid-area:name;font-size:1rem;font-weight:600;color:var(--dh-ink)}.dh-product-desc{grid-area:desc;font-size:.85rem;color:var(--dh-muted)}.dh .dh-product::after{content:'→';grid-area:arrow;color:var(--dh-muted);transition:color .15s ease,transform .15s ease}.dh .dh-product:hover::after,.dh .dh-rows a:hover::after{color:var(--dh-link);transform:translateX(2px)}.dh .dh-products-footer{margin-top:2px;padding:12px 16px 10px;font-size:.88rem;font-weight:500;color:var(--dh-link);text-decoration:none}.dh .dh-products-footer:hover{text-decoration:underline;text-underline-offset:3px}.dh-section{margin-top:72px}.dh .dh-audience-title,.dh .dh-h2{font-weight:650;color:var(--dh-ink)}.dh .dh-h2{margin:0 0 20px;font-size:1.35rem;letter-spacing:-.01em}.dh-audiences{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.dh-audience{padding:24px 28px;border:1px solid var(--dh-border);border-radius:14px;background:var(--dh-surface)}.dh .dh-audience-title{margin:0;font-size:1.05rem}.dh .dh-audience-desc{margin:2px 0 16px;font-size:.88rem;color:var(--dh-muted)}.cdk-ri-groups ul,.dh .dh-rows{list-style:none;margin:0;padding:0}.dh .dh-rows li{margin:0;padding:0}.dh .dh-rows li:first-child{border-top:0}.dh .dh-rows li::before,.dh-tile-title::after{content:none}.dh .dh-rows a,.dh-usecase-products{display:flex;align-items:center;font-weight:500}.dh .dh-rows a{justify-content:space-between;padding:10px 0;font-size:.95rem;color:var(--dh-ink);text-decoration:none;border-bottom:0;transition:color .15s ease}.dh .dh-rows a::after{content:'→';color:var(--dh-muted);transition:color .15s ease,transform .15s ease}.dh .dh-rows a:hover,.dh .dh-welcome a{color:var(--dh-link)}.dh .dh-welcome{max-width:72ch;margin:-6px 0 20px;font-size:1rem;color:var(--dh-text)}.dh .dh-welcome strong{color:var(--dh-ink);font-weight:650}.dh .dh-welcome a{font-weight:600;text-decoration:none;border-bottom:0}.dh .dh-welcome a:hover{text-decoration:underline;text-underline-offset:3px}.dh .dh-tile,.dh .dh-usecase{display:flex;flex-direction:column;gap:8px;min-width:0;padding:22px 24px;border:1px solid var(--dh-border);border-radius:14px;background:var(--dh-surface);text-decoration:none;transition:border-color .15s ease,box-shadow .15s ease}.dh .dh-tile:hover,.dh .dh-usecase:hover{border-color:var(--dh-border-hover);box-shadow:var(--dh-shadow)}.dh-usecase-products{gap:6px;font-size:.78rem;color:var(--dh-muted)}.dh-mini-mark{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:5px;background:var(--dh-mark-bg);color:var(--dh-mark-fg)}.dh-mini-mark svg{width:11px;height:11px}.dh-mini-mark--optional{background:0 0;border:1px dashed var(--dh-muted);color:var(--dh-muted)}.dh-usecase-title{margin-top:4px;font-size:1.05rem;font-weight:650;line-height:1.3;color:var(--dh-ink)}.dh-usecase-desc{font-size:.9rem;line-height:1.5;color:var(--dh-muted)}.dh-usecase-features{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto;padding-top:10px}.dh-usecase-features span{padding:2px 9px;border:1px solid var(--dh-border);border-radius:999px;background:var(--dh-surface-soft);color:var(--dh-text);font-size:.75rem;line-height:1.5}.dh-grid{display:grid;gap:14px}.dh-grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}.dh-grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}.dh .dh-tile{gap:4px;padding:18px 20px;border-radius:12px}.dh-tile-title{font-size:.98rem;font-weight:600;color:var(--dh-ink)}.dh .dh-section-lead{max-width:64ch;margin:-8px 0 20px;color:var(--dh-text)}.dh .dh-grid--2 .dh-tile{gap:8px;padding:22px 24px}.dh-tile-desc{font-size:.9rem;line-height:1.5;color:var(--dh-muted)}.dh .dh-grid--2 .dh-snippet,.dh-tile-cta{margin-top:6px}.dh-tile-cta{font-size:.88rem;font-weight:600;color:var(--dh-link)}.dh-tile:hover .dh-tile-cta{text-decoration:underline;text-underline-offset:3px}.dh .dh-snippet{display:block;margin-top:auto;padding:6px 10px;border:0;border-radius:6px;background:var(--dh-surface-soft);color:var(--dh-ink);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;white-space:nowrap!important;overflow:hidden;text-overflow:ellipsis;word-break:normal!important}.dh-help{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);align-items:stretch;overflow:hidden;border:1px solid var(--dh-border);border-radius:16px;background:var(--dh-surface);box-shadow:var(--dh-shadow)}.dh-help-text{display:flex;flex-direction:column;justify-content:center;padding:40px}.dh .dh-help .dh-h2{margin-bottom:12px}.dh .dh-help-lead{max-width:48ch;margin:0 0 24px;color:var(--dh-text)}.dh-help-actions{display:flex;flex-wrap:wrap;gap:10px}.dh .dh-help-photo{display:block;width:100%;height:100%;min-height:280px;margin:0;border-radius:0;object-fit:cover}.dh .dh-btn{display:inline-block;padding:9px 18px;border:1px solid transparent;border-radius:999px;font-size:.92rem;font-weight:600;line-height:1.3;text-decoration:none;transition:background .15s ease,border-color .15s ease}.dh .dh-btn--primary{color:var(--dh-mark-fg)}.dh .dh-btn--primary:hover{background:var(--dh-ink)}.dark .dh .dh-btn--primary:hover,.dh .dh-btn--primary{background:var(--dh-mark-bg)}.dh .dh-btn--secondary{border-color:var(--dh-border);background:var(--dh-surface);color:var(--dh-ink)}.dark .dh .dh-btn--primary:hover,.dh .dh-btn--secondary:hover{border-color:var(--dh-border-hover)}.dh .dh-more{margin:20px 0 0;font-size:.88rem;color:var(--dh-muted)}.dh .dh-more a{color:var(--dh-text);text-decoration:none;border-bottom:1px solid var(--dh-border)}.dh .dh-more a:hover{color:var(--dh-link);border-bottom-color:currentColor}@media (hover:none){.dh .dh-hint{display:none}}@media (max-width:1024px){.dh-grid--3{grid-template-columns:repeat(2,minmax(0,1fr))}.dh-hero{grid-template-columns:1fr;gap:40px;padding-top:104px}}@media (max-width:900px){.dh{padding:0 20px 72px}.dh-help{grid-template-columns:1fr}.dh .dh-help-photo{min-height:220px;max-height:280px}.dh-help-text{padding:28px}}@media (max-width:600px){.dh-audiences,.dh-grid--2,.dh-grid--3{grid-template-columns:1fr}}a.nav-tabs-item[href^=\"https://www.conduktor.io/kafka\"]{margin-left:.625rem;padding-left:1.25rem}a.nav-tabs-item[href^=\"https://www.conduktor.io/kafka\"]::before{content:\"\";position:absolute;left:0;top:50%;transform:translateY(-50%);width:1px;height:16px;background:rgba(9,52,60,.15)}.dark a.nav-tabs-item[href^=\"https://www.conduktor.io/kafka\"]::before{background:rgba(255,255,255,.15)}a.nav-tabs-item[href^=\"https://www.conduktor.io/kafka\"]::after{content:\"\";display:inline-block;width:12px;height:12px;opacity:.55;background-repeat:no-repeat;background-size:contain;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2309343C' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 7h10v10'/%3E%3Cpath d='M7 17 17 7'/%3E%3C/svg%3E\")}.dark a.nav-tabs-item[href^=\"https://www.conduktor.io/kafka\"]::after{background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 7h10v10'/%3E%3Cpath d='M7 17 17 7'/%3E%3C/svg%3E\")}.cdk-release-index{--cdk-ri-fg:#09343c;--cdk-ri-muted:#667;--cdk-ri-border:#e5e7e8;--cdk-ri-bg:#fff;--cdk-ri-hover:#f5f7f8;--cdk-ri-heading:#09343c;--cdk-ri-label:#3e4040;font-size:.8125rem;color:var(--cdk-ri-fg)}.dark .cdk-release-index{--cdk-ri-fg:#e8edee;--cdk-ri-muted:#9aa5a8;--cdk-ri-border:rgba(255, 255, 255, 0.12);--cdk-ri-bg:transparent;--cdk-ri-hover:rgba(255, 255, 255, 0.06);--cdk-ri-heading:#fff;--cdk-ri-label:#c3cbcd}.cdk-ri-details[open]>.cdk-ri-summary,.cdk-ri-group{margin-bottom:.625rem}.cdk-ri-group-head,.cdk-ri-groups a{display:flex;justify-content:space-between;gap:.5rem}.cdk-ri-group-head{align-items:baseline;margin-bottom:.25rem;padding:0 .375rem}.cdk-ri-group-title{margin:0;font-size:.875rem;font-weight:600;color:var(--cdk-ri-heading)}.cdk-ri-groups li{margin:0;padding:0}.cdk-ri-groups a{align-items:center;padding:.1875rem .375rem .1875rem 1.5rem;border-radius:.75rem;color:var(--cdk-ri-fg);text-decoration:none;border:0}.cdk-ri-groups a:hover{background:var(--cdk-ri-hover)}.cdk-ri-version{font-variant-numeric:tabular-nums}.cdk-ri-item{position:relative}.cdk-ri-fold{position:absolute;top:50%;left:.125rem;z-index:1;display:flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;padding:0;background:0 0;border:0;border-radius:.25rem;transform:translateY(-50%);cursor:pointer}.cdk-ri-fold::before{content:\"\";width:.3125rem;height:.3125rem;border-right:1.5px solid var(--cdk-ri-muted);border-bottom:1.5px solid var(--cdk-ri-muted);transform:rotate(-45deg) translate(-.0625rem,-.0625rem);transition:transform .15s ease}.cdk-ri-fold[aria-expanded=true]::before,.cdk-ri-more::before{transform:rotate(45deg) translate(-.0625rem,-.0625rem)}.cdk-ri-fold:hover::before{border-color:var(--cdk-ri-fg)}.cdk-ri-date{font-size:.6875rem;color:var(--cdk-ri-muted);font-variant-numeric:tabular-nums;white-space:nowrap}.cdk-ri-more{flex:none;display:flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;margin:0 -.3125rem 0 0;padding:0;background:0 0;border:0;border-radius:.25rem;cursor:pointer}.cdk-ri-more::before{content:\"\";width:.3125rem;height:.3125rem;border-right:1.5px solid var(--cdk-ri-muted);border-bottom:1.5px solid var(--cdk-ri-muted);transition:transform .15s ease}.cdk-ri-more[aria-expanded=true]::before{transform:rotate(225deg) translate(-.0625rem,-.0625rem)}.cdk-ri-more:hover::before{border-color:var(--cdk-ri-fg)}.cdk-ri-sidebar{margin-top:1rem;padding-top:1rem;border-top:1px solid var(--cdk-ri-border)}.cdk-ri-sidebar .cdk-ri-group-head{padding:0 .75rem 0 1rem}.cdk-ri-sidebar .cdk-ri-groups a{padding:.375rem .75rem .375rem 1.875rem}.cdk-ri-sidebar .cdk-ri-fold{left:.5rem}.cdk-ri-inline{margin:0 0 2rem;padding:1rem 1.125rem;background:var(--cdk-ri-bg);border:1px solid var(--cdk-ri-border);border-radius:.5rem}.cdk-ri-inline .cdk-ri-groups{display:grid;grid-template-columns:repeat(auto-fill,minmax(11rem,1fr));gap:.75rem 1.25rem;max-height:22rem;overflow-y:auto}.cdk-ri-compact{margin-bottom:1.5rem;padding:.5rem .75rem}.cdk-ri-summary{display:flex;align-items:center;gap:.375rem;padding:.125rem 0;font-size:.875rem;font-weight:500;color:var(--cdk-ri-label);cursor:pointer;list-style:none}.cdk-ri-summary::-webkit-details-marker{display:none}.cdk-ri-summary::before{content:\"\";flex:none;width:.4375rem;height:.4375rem;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(-45deg);transition:transform .15s ease}.cdk-ri-details[open]>.cdk-ri-summary::before{transform:rotate(45deg)}.cdk-ri-compact .cdk-ri-groups{max-height:none;overflow:visible}"}],"page":{"pagePath":"guide/insights/cost-control","slug":"/guide/insights/cost-control","pageMetadata":{"title":"Kafka topic cost control","description":"Identify Kafka topics consuming unnecessary storage with Conduktor Insights. Surface empty, stale, and tiny topics to reduce costs.","href":"/guide/insights/cost-control"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Identify Kafka topics consuming unnecessary storage with Conduktor Insights. Surface empty, stale, and tiny topics to reduce costs.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Check,Heading,Info,Note,OptimizedImage,Step,Steps,Tab,Tabs,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Check)_missingMdxReference(`Check`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Cost control is one of the sections in the `,_jsx(_components.a,{href:`/guide/insights`,children:`Insights dashboard`}),`. It helps platform teams identify topics consuming unnecessary storage and make informed cleanup and retention decisions.`]}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/conduktor/lwz09TjZSf6Yem1U/images/insights_cost.png?fit=max\u0026auto=format\u0026n=lwz09TjZSf6Yem1U\u0026q=85\u0026s=9a85356f8599518263acc2b64e9f5e30`,alt:`Cost control dashboard`,\"data-og-width\":`2988`,width:`2988`,\"data-og-height\":`1138`,height:`1138`,\"data-path\":`images/insights_cost.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/conduktor/lwz09TjZSf6Yem1U/images/insights_cost.png?w=280\u0026fit=max\u0026auto=format\u0026n=lwz09TjZSf6Yem1U\u0026q=85\u0026s=8f1a8772e3093093b566ae0dbb1079a8 280w, https://mintcdn.com/conduktor/lwz09TjZSf6Yem1U/images/insights_cost.png?w=560\u0026fit=max\u0026auto=format\u0026n=lwz09TjZSf6Yem1U\u0026q=85\u0026s=7bf84591a5405445a3ded755029f8998 560w, https://mintcdn.com/conduktor/lwz09TjZSf6Yem1U/images/insights_cost.png?w=840\u0026fit=max\u0026auto=format\u0026n=lwz09TjZSf6Yem1U\u0026q=85\u0026s=7c683f1bbe3f27426ebbcb3af2980b87 840w, https://mintcdn.com/conduktor/lwz09TjZSf6Yem1U/images/insights_cost.png?w=1100\u0026fit=max\u0026auto=format\u0026n=lwz09TjZSf6Yem1U\u0026q=85\u0026s=4345bcced97d4e67bd1f8228aa724159 1100w, https://mintcdn.com/conduktor/lwz09TjZSf6Yem1U/images/insights_cost.png?w=1650\u0026fit=max\u0026auto=format\u0026n=lwz09TjZSf6Yem1U\u0026q=85\u0026s=bb11f5cd6d957c07e36b44208faffe69 1650w, https://mintcdn.com/conduktor/lwz09TjZSf6Yem1U/images/insights_cost.png?w=2500\u0026fit=max\u0026auto=format\u0026n=lwz09TjZSf6Yem1U\u0026q=85\u0026s=2502174b201412e7d6a1289a6be90cce 2500w`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Free ebook:`}),` `,_jsx(_components.a,{href:`https://www.conduktor.io/resources/ebooks/where-kafka-costs-hide-a-field-guide?utm_source=docs\u0026utm_medium=referral\u0026src=docs-content`,children:`Where Kafka costs hide: a field guide`}),` Where Kafka spend actually accumulates, and how to find and cut it.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsx(_components.p,{children:`The Cost Control section displays three categories of topics that may be wasting storage:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Empty topics`}),` - topics with no messages that consume metadata overhead`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Stale topics`}),` - topics with no writes in a configured time period (default: 7+ days)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Tiny topics`}),` - topics with minimal data volume relative to their partition overhead`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Each category shows the number of affected topics. Individual topics are listed with idle time in days and partition count.`}),`\n`,_jsx(_components.p,{children:`You can switch the view of data on the page between a graphs view and a table view using the “Graphs” toggle found at the top right of the page.`}),`\n`,_jsx(_components.p,{children:`Before taking action on any topic, verify it is truly unused by checking consumer groups, producer configurations, ownership and documentation.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Deleting a topic is permanent and cannot be undone. All partition metadata and configuration will be lost.`})}),`\n`,_jsx(Heading,{level:`2`,id:`what-the-dashboard-shows`,children:`What the dashboard shows`}),`\n`,_jsx(Heading,{level:`3`,id:`empty-topics`,children:`Empty topics`}),`\n`,_jsx(_components.p,{children:`Topics containing zero messages. These topics have been created but never received data, or have had all messages deleted through retention policies.`}),`\n`,_jsx(_components.p,{children:`For each topic: name, idle time in days, and partition count.`}),`\n`,_jsx(_components.p,{children:`Empty topics consume cluster resources even without data: metadata storage in ZooKeeper or KRaft, memory for buffers, and often per-partition charges on cloud Kafka services.`}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`Empty topics are common in development and staging environments where topics are created for testing but not cleaned up afterward.`})}),`\n`,_jsx(AccordionGroup,{children:_jsxs(Accordion,{title:`Delete an empty topic`,id:`delete-an-empty-topic`,children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Good candidates for deletion:`})}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`topics created for abandoned projects or experiments`}),`\n`,_jsx(_components.li,{children:`temporary topics used for testing or debugging`}),`\n`,_jsx(_components.li,{children:`topics created by mistake with typos in the name`}),`\n`,_jsx(_components.li,{children:`legacy topics from deprecated applications`}),`\n`,_jsx(_components.li,{children:`topics created automatically by frameworks but never used`}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Reasons to keep empty topics:`})}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`topics pre-created for upcoming features or applications`}),`\n`,_jsx(_components.li,{children:`topics serving as placeholders for future data pipelines`}),`\n`,_jsx(_components.li,{children:`topics referenced in consumer group configurations awaiting data`}),`\n`,_jsx(_components.li,{children:`topics used as dead letter queues that only receive messages in error scenarios`}),`\n`]}),_jsxs(Steps,{children:[_jsxs(Step,{title:`Verify the topic is unused`,children:[_jsxs(_components.p,{children:[`Click the topic name to go to the `,_jsx(_components.strong,{children:`Topics`}),` page. Check:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Consumer Groups`}),` tab for active consumers or unconsumed data (lag > 0)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Monitoring`}),` tab graphs to confirm zero produce activity`]}),`\n`,_jsx(_components.li,{children:`Application references in codebases and deployment configs`}),`\n`,_jsx(_components.li,{children:`Dependencies - verify no streaming jobs or external systems depend on the topic`}),`\n`]})]}),_jsx(Step,{title:`Delete from the list`,children:_jsxs(_components.p,{children:[`In the Cost Control section, click the `,_jsx(_components.strong,{children:`…`}),` menu next to the topic and select `,_jsx(_components.strong,{children:`Delete topic`}),`.`]})}),_jsxs(Step,{title:`Confirm deletion`,children:[_jsxs(_components.p,{children:[`Type `,_jsx(_components.strong,{children:`DELETE`}),` to confirm and click the delete button.`]}),_jsx(Check,{children:_jsx(_components.p,{children:`Topic deletion can take up to 5 minutes to be reflected in the dashboard. Consumer groups that were subscribed will need to be updated to remove the topic from their subscriptions.`})})]})]})]})}),`\n`,_jsx(Heading,{level:`3`,id:`stale-topics`,children:`Stale topics`}),`\n`,_jsxs(_components.p,{children:[`Topics with no write activity for `,_jsx(_components.strong,{children:`7+ days`}),` and no active consumer groups.`]}),`\n`,_jsx(_components.p,{children:`For each topic: name, idle time in days, and partition count.`}),`\n`,_jsx(_components.p,{children:`Stale topics often indicate abandoned data pipelines from shut down applications, failed producers or cancelled projects. They continue consuming storage through retention policies and add operational overhead.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`A topic with no writes may still have active consumers reading historical data. Stale write activity does not necessarily mean the topic is unused or safe to delete.`})}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`Evaluate and handle stale topics`,id:`evaluate-and-handle-stale-topics`,children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Investigation checklist:`})}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Check consumer groups`}),` - Are any consumers actively reading from the topic?`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Review consumer lag`}),` - Is there unconsumed data that applications still need?`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Verify business requirements`}),` - Is the historical data needed for compliance or analytics?`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Contact topic owners`}),` - Do the application teams still need this topic?`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Check data lineage`}),` - Do downstream systems depend on this data?`]}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Topics that are safe to delete:`})}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`No active consumer groups subscribed`}),`\n`,_jsx(_components.li,{children:`All consumers show zero lag (all data has been consumed)`}),`\n`,_jsx(_components.li,{children:`Application owners confirm the topic is no longer needed`}),`\n`,_jsx(_components.li,{children:`No compliance requirements for data retention`}),`\n`,_jsx(_components.li,{children:`Historical data has been archived to long-term storage`}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Topics to keep:`})}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Active consumers are still reading historical data`}),`\n`,_jsx(_components.li,{children:`Data is required for compliance or audit purposes`}),`\n`,_jsx(_components.li,{children:`Topic serves as a source of truth for event sourcing`}),`\n`,_jsx(_components.li,{children:`Downstream analytics or reporting systems depend on the data`}),`\n`,_jsx(_components.li,{children:`Occasional writes expected (seasonal or infrequent events)`}),`\n`]}),_jsx(Warning,{children:_jsx(_components.p,{children:`Deleting a topic with unconsumed messages will result in permanent data loss for consumers that have not yet processed those messages.`})})]}),_jsxs(Accordion,{title:`Archive stale topic data before deletion`,id:`archive-stale-topic-data-before-deletion`,children:[_jsx(_components.p,{children:`For topics containing valuable historical data, export and archive the data before deletion.`}),_jsxs(Steps,{children:[_jsxs(Step,{title:`Export the topic data`,children:[_jsxs(_components.p,{children:[`Navigate to the topic, click the `,_jsx(_components.strong,{children:`Consume`}),` tab, configure the consumer to read from `,_jsx(_components.strong,{children:`Beginning`}),` offset, and export data to a file or external storage.`]}),_jsx(Note,{children:_jsx(_components.p,{children:`For large topics, use a dedicated archival tool or Kafka Connect to export data to object storage (S3, Azure Blob Storage) or a data lake.`})})]}),_jsxs(Step,{title:`Verify the archive`,children:[_jsx(_components.p,{children:`Confirm all messages were exported successfully, validate the data format and completeness, and store in long-term storage with documentation of location and format.`}),_jsx(Check,{children:_jsx(_components.p,{children:`Maintain a record of archived topics including the archive location, date, original message count and retention period for the archived data.`})})]}),_jsx(Step,{title:`Delete the topic`,children:_jsx(_components.p,{children:`Follow the deletion steps above.`})})]})]}),_jsxs(Accordion,{title:`Reduce retention on stale topics`,id:`reduce-retention-on-stale-topics`,children:[_jsx(_components.p,{children:`If a topic might receive future writes but historical data is no longer needed, reduce the retention period instead of deleting.`}),_jsxs(Steps,{children:[_jsxs(Step,{title:`Update retention settings`,children:[_jsxs(_components.p,{children:[`Navigate to `,_jsx(_components.strong,{children:`Topics`}),`, select the topic, click `,_jsx(_components.strong,{children:`Configuration`}),`, and edit:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`retention.ms`}),` - Time-based retention (e.g., `,_jsx(_components.code,{children:`86400000`}),` for 1 day)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`retention.bytes`}),` - Size-based retention per partition (e.g., `,_jsx(_components.code,{children:`1073741824`}),` for 1 GB)`]}),`\n`]}),_jsx(Info,{children:_jsx(_components.p,{children:`Kafka automatically deletes segments older than the retention period during its next cleanup cycle (typically runs every few minutes based on broker configuration).`})})]}),_jsx(Step,{title:`Monitor cleanup`,children:_jsxs(_components.p,{children:[`Monitor the topic size in the `,_jsx(_components.strong,{children:`Overview`}),` tab to verify that old data is being cleaned up as expected.`]})})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`tiny-topics`,children:`Tiny topics`}),`\n`,_jsxs(_components.p,{children:[`Topics meeting all of the following: more than 1 partition, less than 10 MB of data OR fewer than 1000 messages, and name does not end with `,_jsx(_components.code,{children:`_repartition`}),`.`]}),`\n`,_jsx(_components.p,{children:`For each topic: name, idle time in days, and partition count.`}),`\n`,_jsx(_components.p,{children:`Topics with many partitions but little data represent inefficient resource allocation. Cloud Kafka services often charge per partition, and high partition counts increase controller overhead.`}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`A common cause is using default partition counts (often 6-12) for topics that only receive occasional messages, such as configuration topics or low-volume event streams.`})}),`\n`,_jsx(AccordionGroup,{children:_jsxs(Accordion,{title:`Optimize tiny topics`,id:`optimize-tiny-topics`,children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`How to evaluate:`})}),_jsx(_components.p,{children:`Keep the topic as-is if it expects significant growth, requires high parallelism, is part of a standardized policy or would require complex migration. Consider optimization if the topic has been tiny for months without growth, has arbitrary partition counts or handles low-frequency data without parallelism requirements.`}),_jsx(_components.p,{children:`Since Kafka does not support reducing partition count, you have three options:`}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Consolidate topics`,id:`consolidate-topics`,children:[_jsx(_components.p,{children:`If you have multiple tiny topics serving similar purposes, consolidate them into a single topic with categorization through message headers or keys. This reduces total partition count while maintaining logical separation.`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Considerations:`})}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Identify candidates from the same application with similar schemas`}),`\n`,_jsx(_components.li,{children:`Design consolidated topic structure with category or type fields`}),`\n`,_jsx(_components.li,{children:`Update producers and consumers accordingly`}),`\n`]}),_jsx(Warning,{children:_jsx(_components.p,{children:`Topic consolidation changes the partition key distribution and may affect message ordering. Ensure consumers can handle messages from multiple original topics in a single stream.`})})]}),_jsx(Tab,{title:`Recreate with fewer partitions`,id:`recreate-with-fewer-partitions`,children:_jsxs(Steps,{children:[_jsxs(Step,{title:`Plan partition count`,children:[_jsx(_components.p,{children:`Determine the optimal partition count:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`1 partition`}),` - Low-volume topics where ordering is critical`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`3 partitions`}),` - Topics needing some parallelism and broker distribution`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Match consumer count`}),` - For parallelism requirements`]}),`\n`]}),_jsx(Info,{children:_jsx(_components.p,{children:`For topics receiving fewer than 1000 messages per day, a single partition is often sufficient unless you have specific parallelism requirements.`})})]}),_jsx(Step,{title:`Archive existing data`,children:_jsx(_components.p,{children:`If historical data must be preserved, export all messages from the topic using the Consume tab and store in a file or external system.`})}),_jsxs(Step,{title:`Create the new topic`,children:[_jsxs(_components.p,{children:[`Navigate to `,_jsx(_components.strong,{children:`Topics`}),` and click `,_jsx(_components.strong,{children:`Create topic`}),`. Use the same topic name with a suffix (for example, `,_jsx(_components.code,{children:`topic-name-v2`}),`), set the optimized partition count and copy all relevant configurations from the original topic.`]}),_jsx(Note,{children:_jsx(_components.p,{children:`Create the new topic with a different name initially to allow for parallel operation during migration.`})})]}),_jsx(Step,{title:`Update applications`,children:_jsx(_components.p,{children:`Update producer and consumer configurations to use the new topic name. Deploy consumer updates first, then producers, to ensure no messages are lost during the transition.`})}),_jsx(Step,{title:`Restore archived data (if needed)`,children:_jsx(_components.p,{children:`If historical data must be available in the new topic, use producer applications or data migration tools to restore the archived data.`})}),_jsxs(Step,{title:`Delete the old topic`,children:[_jsx(_components.p,{children:`After verifying the new topic is working correctly, monitor for a grace period (24-48 hours), confirm no applications are producing to the old topic, then delete the tiny topic.`}),_jsx(Check,{children:_jsx(_components.p,{children:`Verify consumer lag on the new topic is being processed normally and no errors are occurring in producer or consumer logs.`})})]})]})}),_jsxs(Tab,{title:`Accept current state`,id:`accept-current-state`,children:[_jsx(_components.p,{children:`For some topics, optimization effort may not justify savings:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`System internals (`,_jsx(_components.code,{children:`__consumer_offsets`}),` has 50 partitions by default)`]}),`\n`,_jsx(_components.li,{children:`Framework defaults (Kafka Streams state stores)`}),`\n`,_jsx(_components.li,{children:`Topics where migration risk outweighs storage savings`}),`\n`]})]})]})]})}),`\n`,_jsx(Heading,{level:`2`,id:`our-recommendations`,children:`Our recommendations`}),`\n`,_jsx(_components.p,{children:`Prevent cost control issues through governance and automated ownership tracking rather than manual remediation.`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Use Self-service for ownership and governance`}),` - it brings a GitOps approach to topic lifecycle management where applications represent streaming apps or data pipelines and dictate ownership of Kafka resources.`]}),`\n`,_jsx(_components.p,{children:`Benefits for cost control:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Automatic ownership tracking`}),` - topics created through Self-service have clear ownership from creation`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Policy enforcement`}),` - application instance policies can prevent creation of tiny topics by enforcing minimum data volume or maximum partition count requirements`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Naming conventions`}),` - policies enforce consistent naming that includes environment and ownership information`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Lifecycle management`}),` - clear application ownership reduces abandoned topics through better tracking and accountability`]}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.a,{href:`/guide/use-cases/self-service`,children:`Learn about Self-service`})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Configure RBAC`}),` - Use role-based access control to enforce naming conventions, limit partition counts and require labeling at topic creation. `,_jsx(_components.a,{href:`/guide/conduktor-in-production/admin/set-up-rbac`,children:`Learn more about RBAC`})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Implement cleanup policies`}),` - Document organization-wide policies for retention periods, deletion criteria and approval processes. Schedule regular reviews of cost control reports (weekly for new topics, monthly for trends).`]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshoot`,children:`Troubleshoot`}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`Why does an empty topic show recent activity in monitoring?`,id:`why-does-an-empty-topic-show-recent-activity-in-monitoring`,children:[_jsx(_components.p,{children:`Producer health checks, monitoring systems or automated tests may send periodic messages that are immediately consumed and deleted. Kafka’s log cleaner activity can also appear as writes in some monitoring systems.`}),_jsxs(_components.p,{children:[`Check the `,_jsx(_components.strong,{children:`Messages in per second`}),` graph over 7+ days to distinguish sustained activity from sporadic checks. Review the `,_jsx(_components.strong,{children:`Consume`}),` tab to see actual message content.`]})]}),_jsxs(Accordion,{title:`Can I recover a topic after deletion?`,id:`can-i-recover-a-topic-after-deletion`,children:[_jsx(_components.p,{children:`No, topic deletion is permanent. All partition data and topic metadata are removed. Consumer group offsets are retained but the topic cannot be recreated with the same history.`}),_jsx(_components.p,{children:`Always archive important data before deletion. Implement a grace period policy where topics are first marked for deletion (using labels) before actual removal. To recreate a deleted topic, create a new topic with the same name in Console and restore data from archives if available.`})]}),_jsxs(Accordion,{title:`How do I identify topics created by internal Kafka processes?`,id:`how-do-i-identify-topics-created-by-internal-kafka-processes`,children:[_jsxs(_components.p,{children:[`Kafka creates internal topics automatically: `,_jsx(_components.code,{children:`__consumer_offsets`}),` (consumer group offsets), `,_jsx(_components.code,{children:`__transaction_state`}),` (transactional state), `,_jsx(_components.code,{children:`_schemas`}),` (Schema Registry metadata) and topics matching `,_jsx(_components.code,{children:`.*-changelog`}),` or `,_jsx(_components.code,{children:`.*-repartition`}),` (Kafka Streams internals).`]}),_jsxs(_components.p,{children:[`Never delete `,_jsx(_components.code,{children:`__consumer_offsets`}),` or `,_jsx(_components.code,{children:`__transaction_state`}),` as this causes cluster-wide failures. Only delete Kafka Streams topics when the application is permanently decommissioned and all instances are shut down.`]})]}),_jsxs(Accordion,{title:`Why does reducing retention not free up disk space immediately?`,id:`why-does-reducing-retention-not-free-up-disk-space-immediately`,children:[_jsx(_components.p,{children:`Kafka’s log cleanup process runs periodically (default: every 5 minutes). Data is deleted at segment boundaries, not individual messages, and the current active segment is never deleted even if older than retention.`}),_jsxs(_components.p,{children:[`Wait 15-30 minutes after reducing retention, then check topic size in the `,_jsx(_components.strong,{children:`Overview`}),` tab.`]})]}),_jsxs(Accordion,{title:`How do I handle topics with unknown ownership?`,id:`how-do-i-handle-topics-with-unknown-ownership`,children:[_jsxs(_components.p,{children:[`Check topic naming patterns, review consumer groups in the `,_jsx(_components.strong,{children:`Consumer Groups`}),` tab, search code repositories and deployment configs for references, and consult internal documentation.`]}),_jsxs(_components.p,{children:[`If ownership remains unclear, add a `,_jsx(_components.code,{children:`scheduled-for-deletion`}),` label with a future date (for example, 30 days) and send announcements asking owners to identify themselves. After the grace period expires with no claims, proceed with deletion.`]}),_jsxs(_components.p,{children:[`Implement a policy requiring application labels at topic creation time. Use `,_jsx(_components.a,{href:`/guide/conduktor-in-production/admin/set-up-rbac`,children:`RBAC permissions`}),` to enforce labeling as a prerequisite for topic creation.`]})]}),_jsxs(Accordion,{title:`What if a stale topic suddenly receives writes after months of inactivity?`,id:`what-if-a-stale-topic-suddenly-receives-writes-after-months-of-inactivity`,children:[_jsx(_components.p,{children:`This is normal for seasonal data (holiday sales, tax season), emergency systems (disaster recovery), compliance events (audit logs) or legacy integrations (backup systems).`}),_jsxs(_components.p,{children:[`Verify the producer is authorized, add a `,_jsx(_components.code,{children:`usage-pattern: seasonal`}),` or `,_jsx(_components.code,{children:`usage-pattern: emergency`}),` label, and document the activity pattern. Do not delete topics showing this pattern without understanding the business requirement.`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`related-resources`,children:`Related resources`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/guide/insights`,children:`View Insights overview`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/guide/manage-kafka/kafka-resources/topics`,children:`Configure and manage topics`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/guide/monitor-brokers-apps`,children:`Set up monitoring and alerts`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/guide/manage-kafka/kafka-resources/brokers`,children:`Monitor and manage brokers`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/guide/conduktor-in-production/admin/set-up-rbac`,children:`Set up RBAC`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/guide/use-cases/self-service`,children:`Learn about Self-service topic management`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://conduktor.io/roadmap`,children:`Give us feedback or request a feature`})}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Kafka topic cost control","description":"Identify Kafka topics consuming unnecessary storage with Conduktor Insights. Surface empty, stale, and tiny topics to reduce costs.","href":"/guide/insights/cost-control"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Overview","slug":"overview","depth":2,"children":[]},{"title":"What the dashboard shows","slug":"what-the-dashboard-shows","depth":2,"children":[{"title":"Empty topics","slug":"empty-topics","depth":3,"children":[]},{"title":"Stale topics","slug":"stale-topics","depth":3,"children":[]},{"title":"Tiny topics","slug":"tiny-topics","depth":3,"children":[]}]},{"title":"Our recommendations","slug":"our-recommendations","depth":2,"children":[]},{"title":"Troubleshoot","slug":"troubleshoot","depth":2,"children":[]},{"title":"Related resources","slug":"related-resources","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/conduktor/b61a96a49b2e8dff/seo-jsonld.js","/_mintlify/custom/conduktor/78d4ee385e74bdb6/release-index.js"],"subdomain":"conduktor","siteName":"Conduktor Docs","title":"Kafka topic cost control - Conduktor Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-21T12:24:24.900Z","originalFileLocation":"guide/insights/cost-control.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Identify Kafka topics consuming unnecessary storage with Conduktor Insights. Surface empty, stale, and tiny topics to reduce costs.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Conduktor Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"index, follow\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/conduktor/y8gtQ07WBXvYRUx2/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/conduktor/y8gtQ07WBXvYRUx2/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/conduktor/y8gtQ07WBXvYRUx2/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/conduktor/y8gtQ07WBXvYRUx2/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/conduktor/y8gtQ07WBXvYRUx2/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/conduktor/y8gtQ07WBXvYRUx2/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/conduktor/y8gtQ07WBXvYRUx2/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/conduktor/y8gtQ07WBXvYRUx2/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/conduktor/y8gtQ07WBXvYRUx2/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Kafka topic cost control - Conduktor Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Identify Kafka topics consuming unnecessary storage with Conduktor Insights. Surface empty, stale, and tiny topics to reduce costs.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Conduktor Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.conduktor.io/guide/insights/cost-control\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.conduktor.io/images/conduktor-overview.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Kafka topic cost control - Conduktor Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Identify Kafka topics consuming unnecessary storage with Conduktor Insights. Surface empty, stale, and tiny topics to reduce costs.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.conduktor.io/images/conduktor-overview.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/conduktor/y8gtQ07WBXvYRUx2/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Conduktor Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#09343C\">\u003cmeta data-mint-head name=\"og:locale\" content=\"en_US\">\u003cmeta data-mint-head name=\"og:image:alt\" content=\"Conduktor — Kafka operations and governance platform\">\u003cmeta data-mint-head name=\"googlebot\" content=\"index, follow\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.conduktor.io/guide/insights/cost-control\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guide/insights/cost-control.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.conduktor.io/#organization\",\"name\":\"Conduktor Docs\",\"url\":\"https://docs.conduktor.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/conduktor/089vHQa2MA1IdMUE/logo/light.svg?fit=max\u0026auto=format\u0026n=089vHQa2MA1IdMUE\u0026q=85\u0026s=6435b57bce25a923f123614b7af5a6fb\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.conduktor.io#website\",\"name\":\"Conduktor Docs\",\"url\":\"https://docs.conduktor.io\",\"publisher\":{\"@id\":\"https://docs.conduktor.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.conduktor.io/guide/insights/cost-control#webpage\",\"url\":\"https://docs.conduktor.io/guide/insights/cost-control\",\"name\":\"Kafka topic cost control\",\"description\":\"Identify Kafka topics consuming unnecessary storage with Conduktor Insights. Surface empty, stale, and tiny topics to reduce costs.\",\"dateModified\":\"2026-10-21T12:24:24.900Z\",\"isPartOf\":{\"@id\":\"https://docs.conduktor.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.conduktor.io/guide/insights/cost-control#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.conduktor.io/guide/insights/cost-control#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Insights\",\"item\":\"https://docs.conduktor.io/guide/insights\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kafka topic cost control\",\"item\":\"https://docs.conduktor.io/guide/insights/cost-control\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.conduktor.io/guide/insights/cost-control#article\",\"headline\":\"Kafka topic cost control\",\"name\":\"Kafka topic cost control\",\"description\":\"Identify Kafka topics consuming unnecessary storage with Conduktor Insights. Surface empty, stale, and tiny topics to reduce costs.\",\"url\":\"https://docs.conduktor.io/guide/insights/cost-control\",\"mainEntityOfPage\":{\"@id\":\"https://docs.conduktor.io/guide/insights/cost-control#webpage\"},\"image\":\"https://docs.conduktor.io/images/conduktor-overview.png\",\"dateModified\":\"2026-10-21T12:24:24.900Z\",\"publisher\":{\"@id\":\"https://docs.conduktor.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.conduktor.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Conduktor Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Conduktor Docs","nav":{"global":null,"tabs":[{"tab":"Home","pages":[{"title":"Home","href":""}]},{"tab":"Get started","pages":[{"title":"Get started","href":"/guide"}]},{"tab":"Deploy and configure","pages":[{"title":"Deploy and configure","href":"/guide/conduktor-in-production/system-requirements"}]},{"tab":"Use and maintain","groups":[{"group":"Using Conduktor","pages":[{"title":"Kafka management with Conduktor Console","href":"/guide/manage-kafka"}]},{"group":"Insights","pages":[{"title":"Kafka Insights dashboard","sidebarTitle":"Overview","href":"/guide/insights"},{"title":"Kafka configuration risk analysis","description":"Identify Kafka topic configuration risks that impact reliability. Conduktor Insights flags replication, partition, and retention problems before outages.","sidebarTitle":"Risk analysis","href":"/guide/insights/risk-analysis"},{"title":"Kafka topic cost control","href":"/guide/insights/cost-control"},{"title":"Monitor VIP Kafka topics","description":"Identify business-critical Kafka topics in Conduktor Insights VIP Topics. Surface your highest-traffic topics by consumer group count and message volume.","href":"/guide/insights/vip-topics"},{"title":"Governance for VIP","href":"/guide/insights/governance"}]},{"group":"Conduktor MCP","pages":[{"title":"Kafka MCP server for AI assistants","sidebarTitle":"Overview","href":"/guide/conduktor-in-production/automate/mcp"},{"title":"Connect an AI assistant to Conduktor MCP","sidebarTitle":"Connect an AI assistant","href":"/guide/conduktor-in-production/automate/mcp/connect"},{"title":"Conduktor MCP tools reference","sidebarTitle":"Tools reference","href":"/guide/conduktor-in-production/automate/mcp/tools"}]},{"group":"Automate tasks","pages":[{"title":"Conduktor automation — CLI, Terraform, and REST API","sidebarTitle":"Overview","href":"/guide/conduktor-in-production/automate"},{"title":"Conduktor REST API — Console and Gateway automation","sidebarTitle":"REST API","href":"/guide/conduktor-in-production/automate/api-automation"},{"title":"Conduktor CLI — automate Kafka with command line","sidebarTitle":"Automate with CLI","href":"/guide/conduktor-in-production/automate/cli-automation"},{"title":"Kafka Terraform provider — Conduktor","sidebarTitle":"Automate with Terraform","href":"/guide/conduktor-in-production/automate/terraform-automation"},{"title":"Integrate with Backstage","href":"/guide/conduktor-in-production/automate/backstage-integration"}]},{"group":"Manage Kafka resources","pages":[{"title":"Kafka topics — browse, produce, and consume in Console","sidebarTitle":"Kafka topics","href":"/guide/manage-kafka/kafka-resources/topics"},{"title":"Kafka broker monitoring — view cluster health in Console","sidebarTitle":"Kafka brokers","href":"/guide/manage-kafka/kafka-resources/brokers"},{"title":"Kafka consumer group monitoring","sidebarTitle":"Consumer groups","href":"/guide/manage-kafka/kafka-resources/consumer-groups"},{"title":"Kafka Schema Registry management","sidebarTitle":"Schema Registry","href":"/guide/manage-kafka/kafka-resources/schema-registry"},{"title":"Kafka Connect management","sidebarTitle":"Kafka Connect","href":"/guide/manage-kafka/kafka-resources/kafka-connect"},{"title":"Kafka ACLs and service accounts","sidebarTitle":"Service accounts and ACLs","href":"/guide/manage-kafka/kafka-resources/service-accounts-acls"},{"title":"ksqlDB management — Conduktor Console","sidebarTitle":"ksqlDB","href":"/guide/manage-kafka/kafka-resources/ksql-db"},{"title":"Run Flink SQL on Confluent Cloud from Conduktor Console","sidebarTitle":"Flink SQL","href":"/guide/manage-kafka/kafka-resources/flink"}]},{"group":"Monitor systems","pages":[{"title":"Kafka monitoring and observability","sidebarTitle":"Monitor brokers and apps","href":"/guide/monitor-brokers-apps"},{"title":"Kafka alerts and notifications","sidebarTitle":"Alerts and notifications","href":"/guide/monitor-brokers-apps/alerts"}]},{"group":"Manage licenses","pages":[{"title":"Manage your Console license","href":"/guide/conduktor-in-production/manage-licenses/console"},{"title":"Manage your Gateway license","href":"/guide/conduktor-in-production/manage-licenses/gateway"},{"title":"Console Community Edition","href":"/guide/conduktor-in-production/manage-licenses/console-community-edition"},{"title":"Gateway Community Edition","href":"/guide/conduktor-in-production/manage-licenses/gateway-community-edition"}]},{"group":"Govern data","pages":[{"title":"Kafka data masking and PII protection","sidebarTitle":"Data masking","href":"/guide/conduktor-in-production/admin/data-masking"},{"title":"Kafka data validation policies","sidebarTitle":"Gateway data validation","href":"/guide/conduktor-in-production/admin/gateway-policies"}]}]},{"tab":"Use cases","pages":[{"title":"Use cases","href":"/guide/use-cases/kafka-management"}]},{"tab":"Tutorials","pages":[{"title":"Tutorials","href":"/guide/tutorials"}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/guide/reference/feature-labels"}]},{"tab":"Release notes","pages":[{"title":"Release notes","href":"/guide/release-notes"}]},{"tab":"Support","pages":[{"title":"Support","href":"/guide/support"}]},{"tab":"Learn Apache Kafka","href":"https://www.conduktor.io/kafka?utm_source=docs\u0026utm_medium=referral\u0026src=docs-nav"},{"tab":" ","pages":[{"title":" ","href":"/gateway"}]},{"tab":" ","pages":[{"title":" ","href":"/platform"}]}]},"basePath":"","title":"Kafka topic cost control - Conduktor Docs","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":["10e4515597","a74be98ba7"],"chunks":["BannerMarkdown-DHaG7hr_.js","dist-DKZWslLH.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-BIWXJmsZ.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","zoom-image-lightbox-eHyQ0tlO.js","lightbox-handle-r17bVUz3.js"]}