Why does my Vercel log drain not deliver anything to a Tares daemon running on localhost?
Tares receives Vercel drains only on a publicly reachable ingest endpoint, because Vercel delivers from its cloud and cannot reach a bare localhost daemon. Give the vercel source an ingest URL that Vercel can reach, either on a deployed Tares instance or through a tunnel to your local daemon. Then point the drain at that URL and logs start arriving as events.
How it works
A Vercel log drain is a push. Vercel sends each log entry from its own servers to the endpoint you configure. The vercel source in Tares exposes that endpoint as a stable ingest URL. It is an https URL whose path is /ingest/ followed by the source’s ingest key.
A daemon on localhost listens only on your machine. Vercel’s servers cannot open a connection to it, so the drain has nowhere to deliver. Nothing arrives, and the source stays empty.
The handshake needs the same reachability:
- When you save the drain, Vercel verifies the endpoint with an
x-vercel-verifyheader. - Tares echoes that header back from Vercel’s verification request.
- The verification request must therefore reach Tares too.
Once the drain is live, Tares stores one event per log entry. The project label is the key, taken from the payload’s projectName, else projectId. environment and source are labels. A single drain can carry several projects, and they show up as separate entities. The connector page, Vercel logs, lists every label it provides.
Set it up
- Make Tares reachable from the internet. Run Tares on a deployed instance, or put a tunnel in front of your local daemon so Vercel gets a public https address that forwards to it. A local daemon alone is not enough.
- Create the source. Ask a connected agent: “Use tares to create a vercel source and give me the ingest URL for the log drain.” Or go to Sources, Add source, vercel. There is no required config, and the
project,environmentandsourcelabels are pre-filled. - Check the source definition. It looks like this:
- name: web-logs
connector: vercel
config:
labels:
- { name: project, field: project, primary: true }
- { name: environment, field: environment }
- { name: source, field: source }- Copy the ingest endpoint from the source page. Make sure its host is the public address from step 1, not localhost.
- In Vercel, go to Team Settings, Log Drains, Add Log Drain. Set the endpoint to the ingest URL and the delivery format to JSON.
- If Tares has auth on, add a custom header to the drain: a Bearer Authorization header holding an ingest-scoped API key. It is needed only when Tares has auth on.
- For a local Tares, start it with the command below before you open the tunnel, so the daemon is up when Vercel verifies the endpoint.
tares up- Open Recent events on the source. Entries appear once the drain is saved and traffic flows. Fields shows which projects arrive and how dense each field is. If
projectreads sparse, pick a denser field as the key, or slice bysourceorenvironment.
What you get
- Vercel log entries arrive in Tares as events, one per entry, keyed by
project. - Labels for
environment(production or preview) andsource(lambda, build, edge, static, external or redirect) let you slice the stream.path,host,deploymentandbranchare also provided. - One drain can cover several projects, each as its own entity.
- Your Vercel logs sit next to the rest of your signals, so the checks and triggers you build in Tares can use them. AI SRE shows how those pieces fit together.
When something else fits
- If you only want to try Tares on your laptop and do not want a public address, use a source Tares can pull from or read locally. Polled connectors such as
http_pollanddocker_logsneed no inbound connection. - If your logs reach you through OpenTelemetry instead of a Vercel drain, the
otlpconnector takes them over OTLP, and a local setup can send to it directly.
Related
Still stuck? Get help