incident.ioのテレメトリー(システム監視データ)ツールを使って、組織の監視データ(ログ、メトリクス、トレース、プロファイル、ダッシュボード、Kubernetes、SQLデータベース)を検索できます。 次のような場合に使用:どのエラーが発火したか、いつレイテンシー(応答時間)が変動したか、どのポッドが再起動したか、ダッシュボードが何を表示していたか、データベースに何が保存されているかといった、監視システムから根拠を得て答える必要のある質問に対して。 ただし、インシデント記録に既に答えが記載されている質問や、incident.io自体のデータを検索する場合には使用しません。
Query an organization's observability data — logs, metrics, traces, profiles, dashboards, Kubernetes, SQL databases — with the incident.io telemetry tools. Use when answering a question that needs evidence from its monitoring: what errors fired, when latency moved, which pod restarted, what a dashboard showed, what its databases hold. Not for questions the incident record already answers, and not for querying incident.io's own data.
An organization's observability data lives in datasources it connected — a Loki, a Prometheus, a Honeycomb, a Postgres. Each holds different signals and speaks a different query language. You reach all of them through two sets of tools: the native telemetry tools, and the extension connector tools where there are any. The next section says how to call them; the rest of this skill applies however you call them.
telemetry_guidance_show(path: "data-sources.yaml")
log_query(datasource_id: "…", purpose: "…", expression: "…", time_from: "…", time_to: "…")
The telemetry tools are on the incident.io connection. Each tool's description is the authority on it: what it does, the arguments it takes, and how to read what it returns.
Where the session has no telemetry_guidance_show, say the incident.io connection has no
telemetry tools rather than guessing an answer.
Run queries that do not depend on each other as parallel tool calls, in one turn.
Connector tools are on the incident.io connection, named <connector>__<tool>. If there are
no such tools, there are no connectors.
Read the datasource index, data-sources.yaml, and each file its docs fields list with
telemetry_guidance_show, passing each path exactly as listed. Read each one whole, in one
turn of parallel calls. If your client cuts a result short or saves it to a file, read on
from where it stopped before you query.
Put the window in time_from and time_to as RFC3339: leave them out and the query covers
only the last hour. Convert anything a person expressed as a wall-clock time from the current
date in the conversation, rather than from your own sense of now.
Read the error message, not the error code: the message says what went wrong. An internal error with no detail means the call failed, not that the data is empty. A product error means the organization cannot query telemetry here — say so. A datasource that cannot be reached is a fact about the monitoring, not an answer to the question.
Some sources of telemetry data are made available through a connector rather than a native
telemetry data source. Connectors are not listed in data-sources.yaml.
When picking where a signal lives, consider both the telemetry datasources and the connectors, then query the one that holds it. Native telemetry wins when both hold the same data; do not query both to confirm. Note that some vendors will be available through both native telemetry (e.g. for logs and metrics) and a connector (e.g. for inspecting ingestion configuration). When the native datasource for a signal errors or returns nothing, check the connectors before reporting the signal as unavailable.
Use your judgement to decide whether a connector is appropriate to use to answer a telemetry
query - not all connectors, or tools within a connector, expose telemetry data. E.g. a
connector called production operations with a tool read_service_restart_logs would be
appropriate for a telemetry query, whereas a connector called linear with a tool
fetch_project_updates would not be.
data-sources.yaml, then the connectors, to pick a datasource.
data-sources.yaml lists each one with its ID, type, what it holds and the earliest data
it still keeps — and, under docs, the paths of its query-language reference and its own
guidance. Match the question to a datasource that holds that signal: a metrics source
cannot answer a question about log text. Then check the window you need against that
datasource's earliest timestamp, rather than learning it from a refusal later.memory_recall first, where it is available. It returns expressions already
proven on this account for that datasource — adapt one, or replay it exactly with
from_query_id, rather than writing from scratch.result_id, and the drill-down
tools narrow that stored result without re-querying the source.Queries that do not depend on each other should run together rather than one after another, as Running queries together shows. An incident rarely turns on a single query, and running them in sequence spends an engineer's time for no reason.
Batch different questions, not copies of one query you have not proven yet. A batch returns when its slowest query finishes, so it costs whatever its worst member costs, and a shape that is too broad — or that a source has already turned down once — fails once per copy: slicing one unproven query across a dozen windows is a dozen ways to be told the same no. Run it once, read what came back, and fan out from there.
A datasource serves every query from one shared budget. Queries that each read a lot — a selector the guidance says covers most of the data, a range of hours — slow each other down when they run together, and a batch of them can all time out where each alone would have finished. Your first query against a selector and range runs on its own. Batch queries you have seen come back in a few seconds. Run the expensive ones at most two at a time against one datasource, and one at a time once one of them has timed out.
Different phrases over the same selector and range are the same scan repeated. Ask for them in one query where the language allows it — the query-language reference shows how — rather than one query per phrase.
log_query, metric_query and span_query take expression: a query in the
datasource's own language, run exactly as written. A failed or empty query is yours to fix
and resubmit. The remaining query tools, and connector tools, vary — some take a query you
wrote, others take a plain-English description. Read each tool's description for its contract.
Before your first query against a datasource, read every file its data-sources.yaml
entry lists under docs, as Docs says: the query-language reference under
/telemetry/references/, and the datasource's own guidance under /telemetry/guidance/ —
its real labels, fields, metric names and worked examples. What a query costs and how to
size its range are further down each file, so read it to the end.
Use only names you can source from the guidance, a result, or the incident: a guessed label or metric matches nothing, and nothing warns you that it
could not have matched. When none of those covers the label, label value or metric name
you need, read it off the datasource with telemetry_inspect rather than guessing.
You own query cost, and the datasource will time out or refuse expensive scans. Anchor every filter to real values; a match-anything selector scans the whole estate. In many query languages only some parts of a query decide how much the source reads — an indexed selector and the range — while filters applied after reading make it no cheaper. The query-language reference says which parts those are. When a query times out, narrow those parts rather than fanning out variants of the same expensive scan.
Set purpose to what the query is trying to establish — it is recorded with the query and
shown to the responder beside your expression.
Times are UTC. Times says how to give one a person expressed on a wall clock.
Every result carries the expression it executed, so changing one filter on a query that worked means copying that expression and editing it, not rewriting it from memory.
When the question is who or which — which job wrote these rows, which caller sent the failing requests, which tenant's traffic dominated — count by the field that names the job, caller or tenant over the whole window rather than listing lines. Filter on what you already know — the table, message or resource that was touched, and the window — not on the values you expect the answer to take. A filter built from expected answers can only return those answers.
Empty is a result, not a failure, and two very different things produce it: the data genuinely shows nothing, or your query matched nothing it could have matched.
Do not guess between them. An empty result may carry a diagnostics block saying what the
datasource could establish about which it was — read that first, and follow what the
tool's description says it means. Where there is no diagnostic to read, widen the query: drop
the narrowest filter, or stretch the window, and see whether rows appear. Rows on the wider
query mean your filter was wrong.
When you report an absence, say what you established and how. "No matching errors in the last hour on this datasource" is a finding. "There were no errors" is a claim you have not earned.
A refusal is the other kind of non-answer. The source declined to run your query rather than running it and finding nothing, so what it tells you is about the query: it asked for more than the source will scan, grouped into more series than the source will hold, or reached back past what the source still keeps. Re-running the same shape is the one response that cannot work.
Step down instead of dropping the question, and step down on the axis the refusal names:
data-sources.yaml says which, and an identifier you already have carries the question
across to it.Never narrow what you are asking about to recover from a refusal. A filter drawn from the values you expect the answer to take — a particular event, job or caller — makes the query cheaper by excluding everything else, and if the answer lies outside those values the empty result then looks like an answer. Narrow the window, the stream or the grouping instead. Note the refusal on your way past: a retention wall does not move, and one run should only meet it once.
Say what the data shows and cite the queries that showed it. Where it cannot answer the question, say that plainly — a confident wrong answer costs an engineer more than an honest gap, because they will stop looking.
A query that failed searched nothing. When you split a question across windows or streams and some of them timed out, were refused or did not parse, do not report a total or a zero for the whole: give the figure for what did run, and name the windows or streams it does not cover. If you searched fewer streams than the question asked about, say which ones; a zero there is not a zero for the question.
Describe what you searched from what the queries ran, not from what you meant to run: read each result's time range and selector back before you name them. Never give the requested range as the one you searched when only part of it ran, and never attribute a record to an organisation, service or caller its own fields don't name.
Before you conclude, check that the result holds the value your conclusion turns on. A summary across a family of series does not give you any one series' number, and a total does not give you the split inside it. Where the deciding value is missing, say the result cannot tell you. Do not read it as a yes or a no, and do not let it outweigh a more precise measurement you already hold. Query the one series you need, or report the gap as a gap.
原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。