963963Chat Independent coverage of news

Common Mistakes When Evaluating Observability

By James Whitfield · · 1202 words
Common Mistakes When Evaluating Observability

Log Analysis: Periodic jobs should be safe to run twice, because they will be. Log Analysis: You rarely need a new component to fix a boundary problem. Log Analysis: The signal you want is often already logged, just not aggregated.

Queue Design: Periodic jobs should be safe to run twice, because they will be. You rarely need a new component to fix a boundary problem. That applies to queue design as well. In practice, queue design behaves differently: The signal you want is often already logged, just not aggregated.

Cost Controls: Configurations should be reviewable in a diff, not only in a console. The best time to add an index is before the table gets large. That applies to cost controls as well. In practice, cost controls behaves differently: Failures are usually correlated, so plan for the shared dependency.

Release Process: The first thing to settle is the failure mode, not the happy path. Release Process: Measurements taken once are anecdotes; you need a baseline that repeats. Release Process: Costs usually concentrate in a small number of operations, so find those first.

You can often replace a coordination problem with an idempotency key. The same reasoning holds for rate limiting. For rate limiting, the constraint matters more than the feature list. Anything that grows without a bound will eventually hit one. Teams working on rate limiting usually discover this the hard way. Documentation that is not tested tends to describe the previous version.

Rate Limiting: Configurations should be reviewable in a diff, not only in a console. Rate Limiting: The best time to add an index is before the table gets large. Rate Limiting: Failures are usually correlated, so plan for the shared dependency.

The interesting number is not the average, it is the 99th percentile. That applies to release process as well. In practice, release process behaves differently: Adding a cache in front of a slow query is a fix; fixing the query is a cure. Every abstraction you add is a place where behaviour can differ from intent. The same reasoning holds for release process.

Observability: Configurations should be reviewable in a diff, not only in a console. Observability: The best time to add an index is before the table gets large. Observability: Failures are usually correlated, so plan for the shared dependency.

The interesting number is not the average, it is the 99th percentile. The same reasoning holds for crawl budget. For crawl budget, the constraint matters more than the feature list. Adding a cache in front of a slow query is a fix; fixing the query is a cure. Teams working on crawl budget usually discover this the hard way. Every abstraction you add is a place where behaviour can differ from intent.

Observability: Periodic jobs should be safe to run twice, because they will be. Observability: You rarely need a new component to fix a boundary problem. Observability: The signal you want is often already logged, just not aggregated.

For backup strategy, the constraint matters more than the feature list. If a metric has no owner, it will drift until it causes an incident. Teams working on backup strategy usually discover this the hard way. The cheapest optimisation is usually removing work nobody asked for. Aggregating at write time trades flexibility for predictable read cost. This is most visible in backup strategy.

Release Process: You can often replace a coordination problem with an idempotency key. Release Process: Anything that grows without a bound will eventually hit one. Release Process: Documentation that is not tested tends to describe the previous version.

Data Pipelines: Serving static bytes is the cheapest thing you can do at the edge. Data Pipelines: A schema is an interface; changing it is a migration, not an edit. Data Pipelines: Track the denominator as carefully as the numerator.

Teams working on release process usually discover this the hard way. Serving static bytes is the cheapest thing you can do at the edge. A schema is an interface; changing it is a migration, not an edit. This is most visible in release process. Consider release process specifically. Track the denominator as carefully as the numerator.

Teams working on schema markup usually discover this the hard way. The interesting number is not the average, it is the 99th percentile. Adding a cache in front of a slow query is a fix; fixing the query is a cure. This is most visible in schema markup. Consider schema markup specifically. Every abstraction you add is a place where behaviour can differ from intent.

Queue Design: A queue smooths spikes but also hides how far behind you are. Queue Design: Retries without jitter turn a small outage into a large one. Queue Design: Separating the reads from the writes buys room to change either side.

Log Analysis: You can often replace a coordination problem with an idempotency key. Log Analysis: Anything that grows without a bound will eventually hit one. Log Analysis: Documentation that is not tested tends to describe the previous version.

Serving static bytes is the cheapest thing you can do at the edge. That applies to cost controls as well. In practice, cost controls behaves differently: A schema is an interface; changing it is a migration, not an edit. Track the denominator as carefully as the numerator. The same reasoning holds for cost controls.

Serving static bytes is the cheapest thing you can do at the edge. The same reasoning holds for queue design. For queue design, the constraint matters more than the feature list. A schema is an interface; changing it is a migration, not an edit. Teams working on queue design usually discover this the hard way. Track the denominator as carefully as the numerator.

Cost Controls: Periodic jobs should be safe to run twice, because they will be. Cost Controls: You rarely need a new component to fix a boundary problem. Cost Controls: The signal you want is often already logged, just not aggregated.

Rate Limiting: If a metric has no owner, it will drift until it causes an incident. The cheapest optimisation is usually removing work nobody asked for. That applies to rate limiting as well. In practice, rate limiting behaves differently: Aggregating at write time trades flexibility for predictable read cost.

Crawl Budget: Periodic jobs should be safe to run twice, because they will be. Crawl Budget: You rarely need a new component to fix a boundary problem. Crawl Budget: The signal you want is often already logged, just not aggregated.

Communication does not have to follow a script. Partners can discuss boundaries and expectations before an intimate situation, then check in again if circumstances or preferences change. Nonverbal communication can provide context, but gestures or body language may be misread; they should not be treated as a substitute for clear agreement when there is doubt. People who communicate in different ways can agree on accessible ways to express yes, no and pause.

Load Balancing: The interesting number is not the average, it is the 99th percentile. Load Balancing: Adding a cache in front of a slow query is a fix; fixing the query is a cure. Load Balancing: Every abstraction you add is a place where behaviour can differ from intent.

Related reading