Generated banner for Observability LLM Obs
Generated logo for Observability LLM Obs

Observability LLM Obs

ElasticOfficialCreated by elastic

  • Skill
  • Tool integration
  • Data and AI
  • Apache-2.0
  • No issues found

From the author

Answer questions about LLM and agentic-application behavior from data already ingested into Elastic: latency and error rate, token and cost utilization, response quality and guardrail events, and agentic call-chain orchestration. Use when the user asks about LLM monitoring, GenAI observability, token spend or AI cost, model latency, prompt or guardrail failures, or how an agent's tool-call chain executed.
— the description by elastic

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured methodology for investigating LLM and agentic application behavior by querying telemetry data already stored in Elastic. It focuses on four key areas: performance (latency and error rates), resource utilization (token and cost metrics), response quality (guardrails and finish reasons), and agentic orchestration (call-chain reconstruction). The skill emphasizes empirical discovery of field names and ingestion paths to ensure accurate analysis, providing a rigorous process for diagnosing bottlenecks and failures in GenAI workflows.

What it does

  • Identifies active LLM ingestion paths including OTel traces and integration metrics.
  • Discovers deployment-specific field names for GenAI attributes to ensure accurate queries.
  • Reports on latency, throughput, and error rates segmented by model or service.
  • Calculates token utilization and reports cost metrics where instrumented.
  • Investigates response quality by analyzing finish reasons, content filters, and guardrail events.
  • Reconstructs agentic call chains using trace hierarchies to identify bottleneck spans.

When to use it

  • When investigating high latency or unexpected error rates in LLM-powered applications.
  • When analyzing token consumption patterns or verifying AI cost utilization.
  • When debugging agentic workflows to understand how tool-call chains are executing.
  • When evaluating response quality, such as identifying blocked prompts or content filter triggers.
  • When correlating LLM performance issues with existing SLOs or alerting rules.

Advantages

  • Provides a consistent, evidence-based approach to GenAI observability.
  • Avoids speculation by requiring empirical discovery of field mappings.
  • Enables deep-dive analysis of complex agentic call chains via trace reconstruction.
  • Maintains strict output discipline to ensure clear, actionable findings.
  • Operates entirely within the Elastic ecosystem without requiring external UI access.

Usage examples

“How many tokens are we consuming per model?”
The agent will identify the correct token attributes, cast them to long integers to avoid mapping conflicts, and return a time-series breakdown of input and output tokens per model.
“Why is our agentic workflow slow?”
The agent will analyze trace data to reconstruct the call chain, identify the span with the highest duration, and pinpoint the specific bottleneck in the multi-step workflow.
“Are our prompts being blocked by guardrails?”
The agent will query for finish-reason attributes or guardrail log events to report the frequency and nature of blocked requests.
“What is our current LLM spend?”
The agent will check for the existence of a cost field; if found, it will report the total spend, otherwise it will report token usage and clarify that cost is not instrumented.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/elastic/observability-llm-obs/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip observability-llm-obs.zip -d .agents/skills

Documentation by elastic

LLM and Agentic Observability

Answer questions about monitoring LLMs and agentic components using data actually ingested into Elastic — nothing else. The four questions this skill answers are LLM performance, cost and token utilization, response quality, and call chaining or agentic workflow orchestration.

A given deployment typically uses one or more ingestion paths: APM/OTLP traces, and/or integration metrics and logs. Which one exists is a discovery result, not an assumption — never assume both are present. For ES|QL syntax, commands, and query patterns, use the elasticsearch-esql skill. For service-level latency and error triage that is not LLM-specific, use the observability-sre-triage skill.

<!-- begin-partial: preamble -->

Environment Configuration

This skill executes Elasticsearch operations through the elastic CLI. If the elastic CLI is not installed, tell the user what it is needed for. Do not guess credentials, call the HTTP API directly, or attempt other workarounds.

This skill references operations in HTTP-shorthand form (e.g., GET /, GET /_cat/indices, GET /{index}/_mapping, GET /{index}/_settings/index.mode, POST /_query). The Operations table at the end of this document maps each shorthand to the equivalent elastic CLI command — always use the CLI rather than calling the HTTP API directly.

<!-- end-partial: preamble -->

Analysis without cluster access

The CLI check above gates querying the cluster — it does not gate analysis. When the user has already supplied the evidence in their question (metric values, counts, status reasons, log lines, alert payloads, configuration), reason from that evidence and deliver the conclusion.

When you genuinely do need data the user has not provided, still say what you would check and how — name the specific query, index, and field that would settle the question — and then ask for CLI setup. An answer that names the check is useful without a cluster; one that only asks for setup is not.

Jobs to be done

  • Discover which LLM ingestion path a deployment actually uses before querying anything

  • Discover the real LLM field names in this deployment, because GenAI attribute naming is not consistent

  • Report LLM latency, throughput, and error rate by model, service, or time

  • Report token utilization, and report cost only when a cost field genuinely exists

  • Investigate response quality: failures, timeouts, finish reasons, content filters, and guardrail events

  • Reconstruct agentic call chains and find the bottleneck span in a multi-step workflow

  • Correlate findings with SLOs and alerting rules defined on LLM-related data

Output discipline

Applies to every response produced under this skill.

  • Commit to the best-supported conclusion. When the evidence points one way, say so. Do not downgrade confidence to sound cautious — hedging on unambiguous evidence is a defect, not humility.

  • State confidence once, in the conclusion. Do not restate it per bullet.

  • Do not speculate past the evidence. If a cause was not observed, it does not go in the answer. Say what is unknown and stop.

  • Report absence as absence. Zero rows means the data is missing or not collected; it never means the underlying condition is healthy. In particular, if no cost field exists, say cost is not instrumented — do not multiply token counts by a guessed per-token price and present the product as a cost figure.

  • Report the numbers actually found. Quote the token counts, latencies, and error rates the query returned. Do not round them into vague characterizations, and do not carry forward a number from an example in this skill.

  • Do not pad. No restating the question, no narrating which queries were run unless the result mattered, no summarizing the summary.

  • End on the finding. No trailing offers such as "want me to dig deeper?". Actionable follow-ups belong in a recommendations list, phrased as recommendations, not as questions.

Where the data lives

Ingestion pathIndex patternsWhat it can answer
OTel / EDOT traces via OTLPtraces-*.otel-*, or the generic traces-*Per-request latency, tokens, models, finish reasons, and call chains
Elastic APM agent tracestraces-apm*, or the generic traces-*Per-request latency and outcome; GenAI attributes if the SDK adds them
APM/OTel metricsmetrics-apm*, metrics-*.otel-*Aggregated service-level rates and latencies
Elastic LLM integration metricsmetrics-<integration>.* (for example metrics-aws_bedrock_agentcore.*)Aggregate token counts, invocations, latency, sometimes cost
Elastic LLM integration logslogs-<integration>.*Prompt/response records, guardrail and content-filter events

Use the generic traces-* pattern to find trace data regardless of whether an Elastic APM agent or OpenTelemetry collected it. Instrumentation can come from EDOT, OpenLLMetry, OpenLIT, or Langtrace exporting to OTLP — all of them land LLM and agent spans in the trace data streams.

Only traces can reconstruct a call chain. trace.id, span.id, and parent.id are the only way to rebuild an agentic call chain. Integration metrics are pre-aggregated and cannot do it — if the question is about orchestration and only integration metrics exist, say the chain cannot be reconstructed from the available data.

Background reading: LLM and agentic AI observability, EDOT LLM use cases, Observability Labs — LLM Observability.

Process: determine what data is available

Run these in order. Do not skip to step 5.

  1. Verify the connection and detect the version. Call GET /. The decision this drives is which query language surface is available: build_flavor: "serverless" means all ES|QL features including TS, TRANGE, and TBUCKET are available. Otherwise use version.number: on Stack, TS is preview in 9.2 and GA in 9.4, and TRANGE is GA in 9.3.0, so treat Stack 9.4 as the floor for the whole time-series path and fall back to FROM with BUCKET(@timestamp, ...) below it. Getting this wrong produces a query that fails to parse.

  2. Determine which ingestion paths exist. The decision is whether this deployment has traces, integration data, or both — and it changes which questions are answerable at all. List data streams with GET /_data_stream/<name> (pass traces-*, metrics-*, logs-*) or resolve patterns with GET /_resolve/index/<pattern>. Look for trace data streams, metrics-apm*, and any metrics-* or logs-* matching a known LLM integration dataset. If neither path has LLM data, say so and stop — do not answer from general knowledge about the model provider.

  3. Discover the real LLM field names. The decision is which exact field paths to write into ES|QL, and it cannot be guessed. Naming differs across instrumentations: gen_ai.* versus llm.* versus integration-specific names, and the semantic conventions themselves have shifted (older instrumentation emits gen_ai.system, newer emits gen_ai.provider.name). Use GET /_field_caps with a field pattern such as *gen_ai*, *llm*, *token*, *cost*, or read GET /<index>/_mapping, then sample a document to confirm the values are populated. Attribute nesting differs by ingestion path — OTel-native trace data streams expose span attributes as attributes.<name> (and often as a bare passthrough <name>), not as span.attributes.<name>. Confirm which form resolves before writing a query. See references/genai-fields.md for the attribute catalog and the resolution rules.

  4. Decide whether a cost field exists. Cost is not part of the OpenTelemetry GenAI specification. Some instrumentations add a custom attribute such as llm.response.cost.usd_estimate, and some integrations expose a cost metric, but many deployments have neither. Look for it explicitly in step 3. If it is absent, the answer to a cost question is that cost is not instrumented — report token counts instead and name the gap.

  5. Choose ONE consistent source per question. When both APM traces and integration metrics exist, pick one and use it for the whole answer. Mixing them double-counts and produces two different numbers for the same quantity, because the integration polls the provider's own accounting while the traces record what the client observed. Route by question type: traces for per-request analysis, call chains, and anything needing a trace hierarchy; integration metrics for aggregate token and cost totals over long windows. State which source the answer came from.

  6. Check alerts and SLOs when relevance is plausible. The decision is whether a degradation is already known and tracked. Find rules with GET kbn:/api/alerting/rules/_find and SLOs with GET kbn:/api/observability/slos, then filter to those targeting LLM-related services or integration metrics — the field names from step 3 tell you which rules are related. Firing alerts, or SLOs in violated or degrading status, are evidence of degraded performance. Note that the SLO API's sli.kql.custom indicator takes KQL rather than ES|QL; that is an API contract, not a recommendation to use KQL elsewhere.

Use cases and query patterns

Write queries with POST /_query. Always bound the time range, add service.name when present, and LIMIT results. Use coarse buckets when only a trend is needed rather than scanning a wide window at fine granularity.

QuestionTraces pathIntegration path
Latency, throughput, error rateFilter on the GenAI operation or model attribute; COUNT(*) per bucket, AVG(span.duration.us), and failures via event.outcome == "failure"Request-rate, latency, and error metrics by model dimension
Tokens and costSUM the input and output token attributes by time, model, or service; add a cost attribute only if one existsToken and cost metrics aggregated by time and model
Response quality and safetyevent.outcome, error.type, and the finish-reason attribute; prompts and responses only if captured and not redactedGuardrail blocks, content-filter events, and policy violations
Call chaining and orchestrationTraces only — group by trace.id, walk parent.id to span.id, aggregate by span name or GenAI operationNot answerable — metrics are pre-aggregated

On the trace path, per-span latency comes from duration (nanoseconds, populated on every OTel-native span) or span.duration.us (microseconds, an APM-compatibility field that is null on many spans — sorting on it can silently drop the slowest step). Confirm which is populated before using it. The slowest child span is the bottleneck. Aggregating by span name or the GenAI operation attribute shows the distribution of step types across a workflow — retrieval, LLM call, tool use.

For integration-specific data streams and field names — OpenAI, Azure OpenAI, Azure AI Foundry, Amazon Bedrock, Bedrock AgentCore, GCP Vertex AI — see references/integrations.md. For longer worked queries including the trace-hierarchy walk and the time-series integration pattern, see references/esql-recipes.md.

Examples

The field paths below are illustrative. Confirm the real paths from step 3 before running anything — this skill's own method is to discover field names first, and the correct nesting depends on the ingestion path.

"How many tokens are we burning per model?" — confirm the token attributes exist and resolve, then sum them by model and time bucket. Report the totals returned:

FROM traces-*
| WHERE @timestamp > NOW() - 24 hours AND attributes.gen_ai.request.model IS NOT NULL
| EVAL in_tok = TO_LONG(attributes.gen_ai.usage.input_tokens),
       out_tok = TO_LONG(attributes.gen_ai.usage.output_tokens)
| STATS input_tokens = SUM(in_tok), output_tokens = SUM(out_tok)
    BY hour = BUCKET(@timestamp, 1 hour), attributes.gen_ai.request.model
| SORT hour
| LIMIT 500

"What is our LLM spend?" — look for a cost field with GET /_field_caps on *cost* before querying. If none exists, report token utilization and state plainly that cost is not instrumented in this deployment; adding a cost attribute at the instrumentation layer, or enabling an integration that reports cost, is the fix. Do not multiply tokens by a price you assumed.

"Which model is slowest, and is it failing?" — latency and error rate in one pass, grouped by model:

FROM traces-*
| WHERE @timestamp > NOW() - 24 hours AND attributes.gen_ai.request.model IS NOT NULL
| STATS request_count = COUNT(*),
        failures = COUNT(*) WHERE event.outcome == "failure",
        avg_duration_us = AVG(span.duration.us)
    BY attributes.gen_ai.request.model
| EVAL error_rate = failures::double / request_count
| SORT avg_duration_us DESC
| LIMIT 100

"Why is our agent slow?" — this needs the trace hierarchy, so it requires trace data. Find the traces containing more than one LLM or tool span, ranked by time spent in those spans, then walk into the worst trace by trace.id to find the bottleneck span. Because the WHERE restricts to LLM spans, the sum below is LLM time, not end-to-end trace duration — name the column so it cannot be misread as wall-clock latency:

FROM traces-*
| WHERE @timestamp > NOW() - 3 hours AND attributes.gen_ai.operation.name IS NOT NULL
| STATS llm_span_count = COUNT(*), llm_duration_us = SUM(span.duration.us) BY trace.id
| WHERE llm_span_count > 1
| SORT llm_duration_us DESC
| LIMIT 50

"Are prompts getting blocked?" — check the finish-reason attribute and error.type on the trace path, or the integration's guardrail log events. A finish reason such as a content filter is a quality signal, not a transport error.

"Is there anything already alerting on this?" — GET kbn:/api/alerting/rules/_find and GET kbn:/api/observability/slos, filtered to the LLM-related services or integration metrics identified in step 2.

Guidelines

  • Answer only from data ingested into Elastic. Do not describe or rely on other vendors' UIs, consoles, or products. If the data is not in Elastic, the answer is that it is not in Elastic.

  • Discover before querying. Confirm the ingestion path (step 2) and the field names (step 3) from GET /_field_caps, GET /<index>/_mapping, or a sample document. Never guess an attribute path.

  • One consistent source per question. Do not blend APM traces and integration metrics in a single answer.

  • Cost is not in the GenAI spec. Treat a cost figure as available only when a cost field is present in the data.

  • Only traces reconstruct chains. If the question is about agentic orchestration and only integration metrics exist, say the chain is not reconstructable rather than approximating it from aggregates.

  • Gate time-series syntax on the version. Use TS with TRANGE and TBUCKET on Serverless or Stack 9.4+; fall back to FROM with BUCKET(@timestamp, ...) below that. Alias the bucket (BY bucket = TBUCKET(1 hour)) and sort on the alias.

  • Expect type conflicts on dynamically mapped attributes. Token attributes are frequently mapped as integer in one backing index and long in another after a rollover, which makes ES|QL refuse the field. Cast with TO_LONG(...) in an EVAL before aggregating.

  • No Kibana UI dependency. Prefer ES|QL and Elasticsearch APIs; use Kibana APIs only for SLOs and alerting. Never instruct the user to open the Kibana UI.

  • For ES|QL syntax and query patterns use the elasticsearch-esql skill; the TS command reference applies on Stack 9.4+ and Serverless, and the FROM command reference applies elsewhere.

Operations

HTTP API (shorthand)elastic CLI command
GET /elastic es info
GET /_data_stream/<name>elastic es indices get-data-stream --name '<name>'
GET /_resolve/index/<pattern>elastic es indices resolve-index --name '<pattern>'
GET /<index>/_mappingelastic es indices get-mapping --index '<index>'
GET /_field_capselastic es field-caps --index '<index>' --fields '<fields>'
POST /_queryelastic es esql query --format tsv --query '<esql>'
GET kbn:/api/alerting/rules/_findelastic kb alerting get-alerting-rules-find --filter '<filter>'
GET kbn:/api/observability/sloselastic kb slo find-slos-op --space-id '<space>' --kql-query '<kql>'

Files

LICENSE

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2026 Elasticsearch BV

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

The author says: Requires the `elastic` CLI (>= 0.2) with `es` and `kb` support, and an Elasticsearch deployment holding LLM telemetry from APM/OTLP traces or an Elastic LLM integration. Base floor is Elasticsearch 8.11+ or Serverless. The time-series path for integration metrics needs `TS` (Stack GA 9.4) and `TRANGE` (Stack GA 9.3); both are GA on Serverless. Below Stack 9.4 fall back to `FROM` with `BUCKET`. SLO and alerting lookups require Kibana. No Kibana UI is required.

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
elastic
Publisher
Elastic (Official)
Source
elastic/agent-skills · skills/observability/llm-obs · commit 09d879d
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced
Also distributed in
elastic/agent-skills

AutoGineer is not affiliated with or endorsed by elastic.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download observability-llm-obs.zip