In the request · 3 min read · Updated 2026-08-14
External dependencies
Every outbound call is a peer: HTTP hosts, databases, Redis, queues. Watch their error rate and p95 the same way you watch your own routes.
Your application is a client. Payment processors, identity providers, object storage, Redis, and the primary database all sit on the other side of a network you do not own. When p95 moves, the first honest question is whether the time left the process.
The problem
A route named POST /pay that spends 1.2s inside Stripe cannot be fixed with an index. A route that spends 1.2s in Redis under contention cannot be fixed by retrying Stripe. Without a peer view, both incidents look like “checkout is slow.”
What it is
A dependency, here, is an outbound peer inferred from span kind and attributes. client and producer spans aggregate by HTTP method plus host, by db.system.name, or by messaging system. For each peer you get call count, error percentage, and p95.
Dependencies
storefront
- POST api.stripe.com1.2k0.4%310 ms
- mysql8.4k0.1%42 ms
- redis6.1k0%3 ms
- GET cdn.assets9401.1%88 ms
What it gives a team
- A ranked list of “who we wait on” when RED says duration moved.
- Error rate on a peer, so a 15% Stripe failure is visible without opening twenty waterfalls.
- A place to attach traceparent mentally: the client span you see here is the one that should continue into the other service if that service is also instrumented.
How Talaria does it
ClickHouse view span_dep_1h rolls up client/db/producer peers. The dashboard Dependencies page (/projects/:id/performance/dependencies) calls SpansEndpoint.listDependencies.
SDK sources:
- PHP — Guzzle middleware records outbound HTTP and injects
traceparenton allowlisted calls; Redis and queued jobs emit producer/consumer or DB-system spans. - Browser — fetch/XHR become client spans on the pageload (or continuing) trace.
- Dart / Flutter —
TalariaHttpClientrecords outbound HTTP. There is no automatic SQL peer on Flutter.
How to read it
- Sort by p95 when users feel slowness; sort by error % when they feel failure.
- Open a waterfall for the parent route and confirm the client span sits on the critical path.
- A high call count to the same host with low duration is chatty, not necessarily slow — related to N+1 when the peer is a database.
Turn it on
Enable tracing. Outbound instrumentation rides along: Guzzle, fetch, TalariaHttpClient. If a peer never appears, the SDK did not wrap that client (raw curl without a wrapper, or a Dart SQL driver).
What this is not
This is not an interactive topology, not a mesh-wide service map, and not DNS/SMTP/uptime probing. Upstream services that call you do not appear unless they send their own traces into the same project. DNS, TLS handshake, and connection-pool wait are not first-class span types unless the HTTP client surfaces them as part of the client span duration.
Related guides
Signals · 3 min
Transactions, traces, and spansA trace is one request’s path. A span is a timed unit of work. A transaction is the root span Talaria meters.
In the request · 3 min
Distributed tracing with W3C Trace ContextOne trace ID from the browser, through PHP, into the query that failed — carried on a standard header named traceparent.
In the request · 3 min
Slow queries and N+1Most “the database is slow” incidents are the application asking the same question too many times — or once, too late.