Build1 distinct publisher3 min readUpdated
A dev.to writeup splits observability into three emitters with almost nothing in common. The split explains why cost estimates, flush windows and missing traces keep surprising teams.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
A writeup published on dev.to argues that the common mental model of observability, an SDK you sprinkle through the code so a dashboard can read it back, is wrong in a specific way: the difference from logging is not in the analysis, it is in the emission [1]. The author's conclusion is that observability is not one system but three mechanically different emitters that happen to share a pipeline: a number in RAM sampled on a timer, an event enriched with an ID and shipped, and an ID in a header propagated hop by hop and reassembled later [2]. That matters operationally because each of the three has its own cost curve and its own way of losing data, and a team that models all three as logging with analysis bolted on will price and debug them wrong.
Start with metrics. When you call increment on a counter, nothing is sent; the number changes in your process memory [3]. Periodically, say every 15 seconds, either a backend scrapes an endpoint your app exposes or a collector ships the current values [4]. That is the whole cost argument: a million requests is one counter reading 1,000,000, not a million records [5], a ratio of a million to one in emitted items [6]. It is also why latency percentiles are not a log-parsing problem. According to the post you could never reconstruct a clean p99 graph from log text, because the histogram was built for it at write time [7].
The same mechanism sets the data loss window. The in-memory counter is disposable by design: each instance flushes on a schedule, on serverless a sidecar collector performs a final flush at shutdown, and the backend sums across instances [8]. Follow that through and the exposure is bounded but real. On a 15 second interval, up to 15 seconds of increments exist only in RAM at any moment, and an instance that dies without flushing takes them with it [9]. That is a different kind of gap from a dropped log line, and it does not appear as an error anywhere.
One caution on the cost claim. The post's arithmetic is about request volume collapsing into a single series; it does not address metric label cardinality [10]. Read "absurdly cheap" as a statement about the counter, not a budget guarantee for however many label combinations you attach to it.
Logs behave the way most people assume everything behaves: an event, written out, shipped, searched. The only upgrade is one automatically injected field, the trace ID [11]. Traces are thinner still. When service A calls service B, the SDK puts the trace ID into the outgoing request: an HTTP header called traceparent, a W3C standard, gRPC metadata, or message headers on a queue [12]. Service B records that it belongs to that trace with a parent span, each service exports its spans independently, and the backend matches parent and child IDs to rebuild the tree [13]. There is no agent watching the network and no distributed coordination [14].
That is where the irreversibility sits. If the trace ID was never propagated at request time, no later analysis can invent it; the structure has to exist when the data is born [15]. The author's framing of OpenTelemetry follows from this: not a tool, a treaty, an agreement across languages, frameworks and vendors on what to emit and what to call it [16].
Worth checking this week: whether your shutdown path actually flushes, and whether trace context survives your queue hop.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
A dev.to post titled "Observability - A Counter in RAM, an ID in a Header, and a Batch Export" says the author's prior model (import an SDK, sprinkle calls, each call fires data to a server, dashboard reads it back; logging with extra steps) is wrong, and that the difference from logging is not in the analysis but in the emission.
The post concludes observability is not one system but three mechanically different emitters that share a pipeline: a number in RAM sampled on a timer; an event enriched with an ID and shipped; an ID in a header propagated hop by hop and reassembled later.
A metric is not a record you write; calling increment or record changes a number in the app's memory, and nothing is sent when the line runs.
Periodically, every 15 seconds for example, either a backend scrapes an endpoint the app exposes or a collector ships the current values out.
Metrics are cheap because a million requests is one counter reading "1,000,000", not a million records.
The post says you could never reconstruct a clean p99 latency graph by parsing log text, because the histogram was built for it at write time.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Single explanatory post, no external corroboration
Every claim traces to one dev.to first-person explainer. The mechanism descriptions are internally consistent and specific (traceparent as a W3C standard, gRPC metadata over HTTP/2, 15-second scrape or ship cadence, backend summation across instances), but nothing in the supplied material corroborates them — no specification text, vendor documentation, benchmark, or second publisher. One derived claim is contested by the source's own reasoning, which further caps evidentiary weight.
No adoption signal in supplied sources
The source is a conceptual explainer. It reports no release, deployment, benchmark, pricing or usage disclosure, names no production system or user count, and provides no dated adoption event, so no adoption observation could be recorded and no adoption level can be scored without inventing facts.
Deflationary framing, consequences left implicit
The post's rhetoric runs against overstatement: distributed tracing is 'just' an ID in a header with no agent and no coordination, and OpenTelemetry is 'not a tool, a treaty.' Claims are mechanism-level and modest relative to what is asserted, so the gap is slightly negative rather than positive. It is only slightly negative because the deflation cuts both ways: the cheapness argument omits label cardinality and the flush-interval exposure is waved off, leaving real operational consequences understated rather than exaggerated.
No disclosed interest or affiliation
The supplied material contains no sponsorship note, vendor affiliation, product pitch, pricing offer, or competitive positioning. The post recommends no tool and names only a standard and a protocol, so any inference about commercial motive from the publishing venue or author handle would be speculation.
Coherent but single-sourced and unverified
Confidence is moderate-low: the account is coherent, specific and free of promotional distortion, which supports the descriptive claims about what the article says, but there is one publisher, zero adoption evidence, no incentive disclosure, and one internally contested derived claim. That combination is enough to characterize the story reliably and not enough to treat its mechanism claims as independently verified.
build
Zero-Instrumentation Go Tracing Works, But You Are Now Maintaining ABI Offsets1 distinct publisher
build
Your meter now runs on someone else's machine: signed receipts, fsync, and failing open1 distinct publisher
build
Flat logs cannot explain an agent run, and adding more of them makes it worse1 distinct publisher
build
Three boxes, seven hops: a container diagram is not an incident map1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 14, 2026