| Instrumented Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Discover targets and scrape with bounded concurrency or accept authenticated remote write. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Scraper / Agent. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Unbounded label creates millions of series” to the external caller. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Instrumented Service boundary before extracting or scaling it. |
| Scraper / Agent | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Normalize labels, reject cardinality violations, and append batches to a durable log/WAL. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Instrumented Service from also owning the contract and failure behavior of Service Discovery. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Late sample targets compacted block” to Instrumented Service. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Scraper / Agent boundary before extracting or scaling it. |
| Service Discovery | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Route each fingerprint to one ingest owner and compact head chunks into immutable blocks. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Scraper / Agent from also owning the contract and failure behavior of Remote Write Gateway. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Query scans too many series” to Scraper / Agent. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Service Discovery boundary before extracting or scaling it. |
| Remote Write Gateway | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Query frontend splits time/shards, deduplicates replicas, and caches partial results. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Service Discovery from also owning the contract and failure behavior of Label Guard. | Put protocol, authentication, quotas, and business transitions in one process. Acceptable at low scale, but it couples external traffic risk to domain releases. Here that simpler choice would couple “Replica dedupe hides missing data” to Service Discovery. | Costs another hop, policy distribution, and a high-blast-radius fleet. Introduce it when many clients or services need one protocol and protection boundary. Measure the latency, saturation, lag, or mismatch at the Remote Write Gateway boundary before extracting or scaling it. |
| Label Guard | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Rule evaluators checkpoint durable timestamps and send deduplicated alert state. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Remote Write Gateway from also owning the contract and failure behavior of Durable Sample Log. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Rule evaluation misses interval during failover” to Remote Write Gateway. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Label Guard boundary before extracting or scaling it. |
| Durable Sample Log | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Discover targets and scrape with bounded concurrency or accept authenticated remote write. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Label Guard from also owning the contract and failure behavior of Series Router. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Unbounded label creates millions of series” to Label Guard. | Costs eventual consistency, schema evolution, replay tooling, idempotent consumers, and lag operations. Earn it when bursts or downstream failure must not block acknowledgment. Measure the latency, saturation, lag, or mismatch at the Durable Sample Log boundary before extracting or scaling it. |
| Series Router | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Normalize labels, reject cardinality violations, and append batches to a durable log/WAL. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Durable Sample Log from also owning the contract and failure behavior of TSDB Ingest Node. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Late sample targets compacted block” to Durable Sample Log. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Series Router boundary before extracting or scaling it. |
| TSDB Ingest Node | Owns authoritative versioned state or immutable evidence. In this design it participates in: Route each fingerprint to one ingest owner and compact head chunks into immutable blocks. | Defines the source of truth and commit boundary. It prevents Series Router from also owning the contract and failure behavior of WAL / Head Block. | Let each service persist its own interpretation. That removes one clear commit boundary and makes retries, support, and reconciliation ambiguous. Here that simpler choice would couple “Query scans too many series” to Series Router. | Costs schema migration, replication, backup, and shard ownership. Split storage only when access patterns, retention, or compliance boundaries materially differ. Measure the latency, saturation, lag, or mismatch at the TSDB Ingest Node boundary before extracting or scaling it. |
| WAL / Head Block | Owns authoritative versioned state or immutable evidence. In this design it participates in: Query frontend splits time/shards, deduplicates replicas, and caches partial results. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents TSDB Ingest Node from also owning the contract and failure behavior of Object Block Store. | Let each service persist its own interpretation. That removes one clear commit boundary and makes retries, support, and reconciliation ambiguous. Here that simpler choice would couple “Replica dedupe hides missing data” to TSDB Ingest Node. | Costs schema migration, replication, backup, and shard ownership. Split storage only when access patterns, retention, or compliance boundaries materially differ. Measure the latency, saturation, lag, or mismatch at the WAL / Head Block boundary before extracting or scaling it. |
| Object Block Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Rule evaluators checkpoint durable timestamps and send deduplicated alert state. | Defines the source of truth and commit boundary. It prevents WAL / Head Block from also owning the contract and failure behavior of Compactor. | Let each service persist its own interpretation. That removes one clear commit boundary and makes retries, support, and reconciliation ambiguous. Here that simpler choice would couple “Rule evaluation misses interval during failover” to WAL / Head Block. | Costs schema migration, replication, backup, and shard ownership. Split storage only when access patterns, retention, or compliance boundaries materially differ. Measure the latency, saturation, lag, or mismatch at the Object Block Store boundary before extracting or scaling it. |
| Compactor | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Discover targets and scrape with bounded concurrency or accept authenticated remote write. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Object Block Store from also owning the contract and failure behavior of Query Frontend. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Unbounded label creates millions of series” to Object Block Store. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Compactor boundary before extracting or scaling it. |
| Query Frontend | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Normalize labels, reject cardinality violations, and append batches to a durable log/WAL. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Compactor from also owning the contract and failure behavior of Rule Evaluator. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Late sample targets compacted block” to Compactor. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Query Frontend boundary before extracting or scaling it. |
| Rule Evaluator | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Route each fingerprint to one ingest owner and compact head chunks into immutable blocks. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Query Frontend from also owning the contract and failure behavior of Alert Manager. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Query scans too many series” to Query Frontend. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Rule Evaluator boundary before extracting or scaling it. |
| Alert Manager | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Query frontend splits time/shards, deduplicates replicas, and caches partial results. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Rule Evaluator from also owning the contract and failure behavior of operators and repair tooling. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Replica dedupe hides missing data” to Rule Evaluator. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Alert Manager boundary before extracting or scaling it. |