Talaria

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

production
storefrontPOST api.stripe.commysqlredisGET cdn.assets
  • POST api.stripe.com1.2k0.4%310 ms
  • mysql8.4k0.1%42 ms
  • redis6.1k0%3 ms
  • GET cdn.assets9401.1%88 ms
This service → peers. A linear list with call count, error rate, and p95 — not a topology graph.

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 traceparent on 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 — TalariaHttpClient records 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 spans

    A 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 Context

    One 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+1

    Most “the database is slow” incidents are the application asking the same question too many times — or once, too late.

Turn tracing on

Opt into enableTracing on an official SDK, then inspect transactions next to the issues they belong to.