Skip to the page
Conch
DocsGitHub

It looks after itself

Dashboards

Send Conch's numbers and the shape of each turn to Grafana, Honeycomb, Datadog, Langfuse or Prometheus. Never the words of your chats.

Conch can show how it's doing on a dashboard of your own: how many replies it finished and how long they took, the tokens and money they used, the tools it called and the questions it asked, what routines and chat apps did, and how the computer is coping. Settings → Dashboards sets it up. It's off until you turn it on.

Press CtrlK and type grafana, prometheus or dashboards to go straight there.

Send to a service

  1. Choose where: Grafana Cloud, Honeycomb, Datadog, New Relic, Langfuse, Phoenix, On this computer (Grafana, a collector or Jaeger running here), or Another place for any OpenTelemetry endpoint.
  2. Paste what the service shows you. Grafana Cloud's OpenTelemetry page gives a few OTEL_EXPORTER_OTLP_… lines; Langfuse gives two keys; the others give one. Paste the whole thing: Conch reads the address and the key out of it, and if the paste says it belongs to another service, it switches to that one. Paste reads the clipboard in one press, and a paste anywhere on the page lands there too. Type them instead opens each field.
  3. Turn on Send to it.
  4. Press Send a test. Conch sends a real span and its numbers there now, and says Grafana Cloud received it with how long it took, or exactly what went wrong: a key it didn't take, an address with nothing at it.

Choose what goes: Numbers, Each turn as a trace and Events (a short line when a turn, a tool call, a question, a routine run or a task ends, or when Conch fixes something on its own). Events are off at first. Langfuse and Phoenix take traces only.

If you sign in to Conch, a change on this page asks you to Confirm it's you first, with your password or passkey. It doesn't ask again for ten minutes.

The key is kept with Conch's other keys, locked to this computer. It's only ever sent to the service it was pasted for, and never over plain http unless the address is on this computer or your own network.

Each turn as a trace

A turn is drawn as the OpenTelemetry GenAI conventions draw an agent: the agent's span (invoke_agent Juniper), the model at work between tool calls (chat claude-sonnet-4-5), and each tool call (execute_tool Bash), with when it asked you and what you answered. The provider, the model, the tokens and the cost are on the agent's span. Turns of one chat share an id, changed so it can't be traced back to the chat in Conch.

Prometheus

Turn on Answer at /metrics under Prometheus, and Prometheus (or Grafana Alloy) can read Conch's numbers.

  • With its token (the usual): press Make a scrape token. It's shown once, with the scrape config that uses it, to copy into prometheus.yml. Making a new one stops the old one.
  • This computer only: programs on this computer read it without a token, never through a proxy. Use it when Prometheus runs here and nobody else shares the computer.

The page shows when Prometheus last read it. Off, nothing answers at /metrics.

A dashboard, ready made

Copy dashboard or Download gives a Grafana dashboard for these numbers: turns and spending at the top, then how long turns take, tokens by model, tools and the questions they asked, routines and chat apps, and this computer. In Grafana, open Dashboards → New → Import and paste it. It reads from Prometheus, so it works with Grafana Cloud and with a Prometheus of your own. The same file is in the repository at docs/dashboards/conch-grafana.json.

What leaves

What leaves on the same page shows exactly what Conch would send now: every metric by name, with a few of its values, and your last turn as its trace.

By default that's numbers, and the names of providers, models, agents and tools. Never what anyone wrote, a prompt or a reply, what a tool read or wrote, a file's name, an email address, a key, or a chat's id. A label that looks like an address, a path or a key is replaced before it leaves, and each label holds only so many different values, so a dashboard never grows a line per chat.

Under Advanced, Send what's written, too adds the words of messages, replies and tool calls to traces, for people reading their prompts in their own Langfuse or Phoenix. Keys, passwords, addresses and your home folder are taken out first. The security checkup says it's on. Numbers go sets how often numbers are sent, from every 15 seconds to every 5 minutes, and Format chooses Protobuf or JSON.

When it can't send

A service that's down or busy is tried again by itself, a little later each time, and what waits is bounded, so a turn never waits for a dashboard and Conch never fills up its memory. What never arrived is counted (conch.telemetry.dropped). When the service keeps refusing, Repair everything says so in Health, and a key it didn't take is yours to paste again.

From the terminal

On a server without a browser nearby, conch dashboards does the same:

conch dashboards prometheus
conch dashboards send grafana-cloud

conch dashboards test sends a test now, and conch dashboards off stops everything. See the command line.

The numbers

Each one by its OpenTelemetry name, then the name Prometheus gives it, and the labels it may carry.

conch.turnsconch_turns_total · counter · labels: conch.provider, gen_ai.request.model, conch.origin, conch.agent, conch.outcome
Replies the assistant finished, by provider, model, agent, where the turn came from and how it ended.
gen_ai.client.operation.durationgen_ai_client_operation_duration_seconds · histogram · labels: gen_ai.operation.name, gen_ai.provider.name, error.type, conch.provider, gen_ai.request.model, conch.origin
How long each turn took, from the message to the end of the reply (GenAI conventions, operation invoke_agent).
gen_ai.client.token.usagegen_ai_client_token_usage · histogram · labels: gen_ai.operation.name, gen_ai.provider.name, gen_ai.token.type, conch.provider, gen_ai.request.model, conch.origin
Tokens each turn read and wrote (GenAI conventions; gen_ai.token.type is input or output).
conch.tokensconch_tokens_total · counter · labels: conch.provider, gen_ai.request.model, conch.origin, conch.token.type
Tokens, added up: input, output, read from the provider’s cache and written to it.
conch.cost.usdconch_cost_usd_total · counter · labels: conch.provider, gen_ai.request.model, conch.origin, conch.billing
What turns cost in US dollars. On a plan it’s what the work would cost at list price (billing="plan"), which nobody pays.
conch.turn.time_to_first_tokenconch_turn_time_to_first_token_seconds · histogram · labels: conch.provider, gen_ai.request.model, conch.origin
How long until the first word of the reply arrived.
conch.turns.activeconch_turns_active · gauge · labels: conch.state
Turns working right now, and those waiting for someone’s answer.
conch.errorsconch_errors_total · counter · labels: conch.provider, error.type, conch.origin
Turns that failed, by why: a limit, signed out, unavailable, too long…
conch.tool.callsconch_tool_calls_total · counter · labels: gen_ai.tool.name, conch.outcome
Tool calls by tool and how they went: success, error, declined, expired or refused.
gen_ai.execute_tool.durationgen_ai_execute_tool_duration_seconds · histogram · labels: gen_ai.tool.name, gen_ai.tool.type, error.type
How long each tool call took (GenAI conventions).
conch.approvals.askedconch_approvals_asked_total · counter · labels: gen_ai.tool.name
Times the assistant stopped to ask before a step, by tool.
conch.approvals.answeredconch_approvals_answered_total · counter · labels: gen_ai.tool.name, conch.decision
How those questions were answered: allowed, always, denied, or nobody answered in time.
conch.auto.judgementsconch_auto_judgements_total · counter · labels: conch.verdict, conch.risk
Steps Auto judged: went ahead, or asked, and the kind of risk that made it ask.
conch.routine.runsconch_routine_runs_total · counter · labels: conch.outcome, conch.trigger
Routine runs that ended, by how (succeeded, nothing to do, failed, skipped, missed, stopped) and what started them.
conch.tasksconch_tasks_total · counter · labels: conch.task.kind, conch.outcome
Background tasks and helpers that ended, by kind and how.
conch.channel.messagesconch_channel_messages_total · counter · labels: conch.channel, conch.direction
Messages from chat apps (in) and replies sent back (out), by app.
conch.repairsconch_repairs_total · counter · labels: conch.area
Things Conch fixed on its own, by the part of Conch.
conch.health.itemsconch_health_items · gauge · labels: conch.state
What Repair everything found the last time it looked, by state.
conch.providers.readyconch_providers_ready · gauge · labels: conch.provider
Each connected provider: 1 when it’s ready to answer, 0 when it isn’t.
conch.memoriesconch_memories · gauge
Memories Conch keeps.
conch.skillsconch_skills · gauge
Skills Conch has.
system.cpu.utilizationsystem_cpu_utilization_ratio · gauge
How busy the processor is, 0 to 1.
system.memory.utilizationsystem_memory_utilization_ratio · gauge
How much of the memory is in use, 0 to 1.
system.filesystem.utilizationsystem_filesystem_utilization_ratio · gauge
How full the disk Conch keeps its files on is, 0 to 1.
conch.computer.roomconch_computer_room · gauge · labels: conch.state
Whether the computer has room for more work, as Conch’s own admission sees it: 1 for the state it’s in.
process.memory.usageprocess_memory_usage_bytes · gauge
Memory Conch’s own process uses.
nodejs.eventloop.delay.p99nodejs_eventloop_delay_p99_seconds · gauge
How long Conch’s own work waited at worst (the 99th percentile): high means it feels slow.
process.uptimeprocess_uptime_seconds · gauge
How long Conch has been running.
conch.telemetry.exportsconch_telemetry_exports_total · counter · labels: conch.signal, conch.outcome
Sends to your dashboard, by what was sent and whether it arrived.
conch.telemetry.droppedconch_telemetry_dropped_total · counter · labels: conch.signal, conch.reason
Spans, events and numbers that never arrived, and why: the queue was full, the service refused them, or it stayed down.