app-observability — скилл для Claude Code: APM, RUM и мониторинг LLM
Ведёт агента по настройке Grafana Cloud: RED-метрики из OTel-трейсов, карты сервисов, браузерный RUM через Faro и наблюдение за вызовами LLM.
npx skills add grafana/skills --skill app-observability -a claude-codeЧто делает app-observability
Скилл описывает три продукта Grafana Cloud на общей связке OTLP и Mimir / Loki / Tempo / Pyroscope. Application Observability строит APM из span-метрик OTel: латентность p50/p95/p99, exemplar к трейсу, переходы от трейсов к логам и профилям. Отдельные разделы — Frontend Observability с Faro Web SDK и AI Observability через OpenLIT с токенами, стоимостью, GPU и evals на галлюцинации и токсичность.
Внутри — пошаговые сценарии с командами проверки: поднять локальный OTLP-приёмник на Grafana Alloy и убедиться, что экспортёр в состоянии healthy, затем направить приложение на localhost:4317 и дождаться span-метрик в Mimir. Для React-фронтенда ставится @grafana/faro-react, добавляется TracingInstrumentation, чтобы связать ошибку в браузере с бэкенд-трейсом. Часть шагов отсылает к файлам в references/: там полные конфиги Alloy, примеры SDK для разных языков и список метрик GenAI.
Заранее нужен стек Grafana Cloud: OTLP-эндпоинт, числовой instance ID и API-ключ с правами MetricsPublisher, LogsPublisher и TracesPublisher. Для APM приложение уже должно быть инструментировано OTel SDK, для фронтенда понадобится Faro app key, для AI — Python 3.10 и новее. Без атрибутов service.namespace и deployment.environment сервис не появится в Service Inventory, а без span.kind на исходящих вызовах карта сервисов останется без рёбер — это первые места, где настройка обычно ломается.
Какие задачи решает
- поднять APM для сервиса из существующих OTel-трейсов
- проверить, что Alloy принимает и пересылает спаны в Grafana Cloud
- инструментировать React-приложение для сбора Core Web Vitals и session replay
- связать ошибку во фронтенде с трейсом на бэкенде
- следить за расходом токенов и стоимостью вызовов LLM
Примеры запросов агенту
- Настрой APM для сервиса
my-apiчерез Alloy и покажи, как проверить спаны в Tempo - Подключи Frontend Observability к React-приложению и добавь
TracingInstrumentation - Выведи метрики расхода токенов по моделям через OpenLIT
Как установить app-observability
1Через Skills CLI (Vercel)
npx skills add grafana/skills --skill app-observability -a claude-code2Вручную: положить файлы
~/.claude/skills/app-observability/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/app-observability/
1Через Skills CLI (Vercel)
npx skills add grafana/skills --skill app-observability -a codex2Вручную: положить файлы
.agents/skills/app-observability/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add grafana/skills --skill app-observability -a cursor2Вручную: положить файлы
.cursor/skills/app-observability/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install grafana/skills app-observability2Вручную: положить файлы
.github/skills/app-observability/SKILL.md1Через Skills CLI (Vercel)
npx skills add grafana/skills --skill app-observability -a gemini-cli2Командой платформы
gemini skills install https://github.com/grafana/skills --path skills/grafana-cloud/app-observabilityВручную: положить файлы
.devin/skills/app-observability/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add grafana/skills --skill app-observability -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о app-observability
Как установить app-observability в Claude Code?
Выполните npx skills add grafana/skills --skill app-observability -a claude-code. Файл скилла окажется по пути ~/.claude/skills/app-observability/SKILL.md.
Что делает app-observability?
Проводит агента по трём сценариям Grafana Cloud: APM и карты сервисов из OTel-трейсов, браузерный RUM через Faro и мониторинг LLM через OpenLIT. Каждый шаг сопровождается командами проверки результата.
Почему сервис не появляется в Service Inventory?
Чаще всего не хватает resource-атрибутов service.namespace или deployment.environment. Пустые рёбра на карте сервисов означают, что у исходящих вызовов не выставлен span.kind.
Исходный текст
SKILL.md · Apache-2.0
---
name: app-observability
license: Apache-2.0
description: Get RED metrics + service maps + frontend RUM + AI/LLM monitoring out of Grafana Cloud — Application Observability (`traces_spanmetrics_*` from OTel traces, p50/p95/p99 latency, exemplar-to-trace, traces-to-logs / profiles), Frontend Observability with the Faro Web SDK (Core Web Vitals, session replay, `pushError`, React + router integration, `TracingInstrumentation` for browser → backend trace correlation), and AI Observability via OpenLIT (token / cost / latency, GPU, hallucination + toxicity evals). Use when standing up APM for a service, wiring an Alloy OTLP receiver + forwarding to Cloud, instrumenting a React frontend for RUM, debugging why service-map edges are missing, monitoring LLM cost drift, or correlating a frontend error to its backend trace — even when the user says "set up APM", "show service map", "monitor browser perf", "session replay", "RUM SDK", or "watch our OpenAI bill" without naming App / Frontend / AI Observability.
---
# Grafana Cloud Application Observability
> **Docs**: https://grafana.com/docs/grafana-cloud/monitor-applications/
Three products that share the same OTLP + Mimir / Loki / Tempo / Pyroscope plumbing:
1. **Application Observability** — APM from OTel spanmetrics
2. **Frontend Observability** — Faro Web SDK, RUM + session replay
3. **AI Observability** — LLM / vector-DB monitoring via OpenLIT
## Prerequisites
- Grafana Cloud stack + OTLP endpoint + numeric instance ID + API key with `MetricsPublisher` + `LogsPublisher` + `TracesPublisher`
- For APM: app instrumented with OTel SDK; for Frontend: a web app + Faro app key; for AI: Python ≥ 3.10
- Grafana Alloy as the local OTLP receiver (recommended)
## Common Workflows
### 1. Stand up APM — Alloy receiver → Grafana Cloud + verify
```bash
# 1. Set Cloud creds + start Alloy with config from references/apm.md
export GRAFANA_CLOUD_OTLP_ENDPOINT=https://otlp-gateway-prod-us-east-0.grafana.net/otlp
export GRAFANA_CLOUD_INSTANCE_ID=123456
export GRAFANA_CLOUD_API_KEY=glc_eyJ...
alloy fmt /etc/alloy/config.alloy # syntax check
alloy run /etc/alloy/config.alloy
# 2. Verify Alloy is receiving + forwarding
curl -s http://localhost:12345/api/v0/web/components \
| jq '.[] | select(.id|test("otelcol\\.exporter\\.otlphttp"))
| {id, health:.health.state}'
# Expect health.state == "healthy"
curl -s http://localhost:12345/metrics \
| grep -E 'otelcol_(receiver_accepted_spans|exporter_sent_spans)'
# 3. Point your app at Alloy (with required attributes!)
export OTEL_SERVICE_NAME="my-api"
export OTEL_RESOURCE_ATTRIBUTES="service.namespace=myteam,deployment.environment=production"
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
# 4. Verify spans landed in Tempo + spanmetrics generated
# Tempo (TraceQL): { resource.service.name = "my-api" }
# Mimir (PromQL): sum by (job) (rate(traces_spanmetrics_calls_total{service_name="my-api"}[5m]))
# Expect > 0 within ~1 minute.
# 5. Verify it's wired to App Observability
# Grafana → Application → Service Inventory: "my-api" should appear with RED metrics
# Click into it → Service Map edges visible (requires span.kind on outbound calls)
```
Full Alloy block + required resource attributes + spanmetric names + correlation links: [`references/apm.md`](references/apm.md).
### 2. Instrument a React frontend with Faro
```bash
# 1. Install
npm install @grafana/faro-react @grafana/faro-web-tracing
```
```javascript
// 2. initializeFaro with TracingInstrumentation + ReactIntegration (see references/faro.md)
// Push a smoketest event so we have a known signal:
faro.api.pushEvent('faro_smoketest', { ts: Date.now().toString() });
```
```bash
# 3. Verify in DevTools Network — POST to /collect returns 202
# (401 → wrong app key; 404 → wrong url region)
# 4. Verify in Grafana Cloud
# - Frontend Observability → your app → Sessions: your session appears
# - LogQL on Loki: {kind="event"} |= "faro_smoketest"
# - With TracingInstrumentation: open the session → the trace ID links to Tempo
```
Full React example, CDN setup, session config: [`references/faro.md`](references/faro.md).
### 3. Add AI / LLM observability
```bash
pip install openlit==1.42.0
```
```python
# At app startup
import openlit
openlit.init(application_name="my-ai-app", environment="production")
# Your existing OpenAI / Anthropic / Cohere calls now emit OTel spans + metrics.
```
```bash
# Env (same OTLP endpoint as APM)
export OTEL_SERVICE_NAME="my-ai-app"
export OTEL_EXPORTER_OTLP_ENDPOINT="https://otlp-gateway-<region>.grafana.net/otlp"
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic $(echo -n $ID:$KEY | base64)"
# Verify after a few LLM calls:
# PromQL: sum by (gen_ai_request_model) (rate(gen_ai_usage_input_tokens_total[5m]))
# Dashboard: Grafana → AI Observability → "GenAI Observability" auto-populates
```
Full OpenLIT install, evals/guards, GenAI metric list, dashboard names: [`references/ai-observability.md`](references/ai-observability.md).
## Full-stack correlation cheat sheet
| Signal | Product | Storage | Query |
|---|---|---|---|
| RED metrics | App Observability | Mimir | PromQL |
| Traces | Tempo | Tempo | TraceQL |
| Logs | Loki | Loki | LogQL |
| Profiles | Pyroscope | Pyroscope | ProfileQL |
| Browser RUM | Frontend Observability | Loki + Tempo | LogQL / TraceQL |
| LLM metrics | AI Observability | Mimir | PromQL |
Correlation keys: `service.name` joins all signals; trace exemplars embed trace IDs in metric points; `traceID` in logs and `traceparent` injected by Faro for FE → BE linking.
## Troubleshooting
- Service missing from Service Inventory → missing `service.namespace` (job label) or `deployment.environment` resource attribute
- Service Map edges missing → `span.kind` not set on outbound calls (must be CLIENT) or inbound (SERVER)
- Faro `/collect` returns 401 → wrong app key; 404 → region in URL doesn't match the Faro app
- No GenAI metrics → confirm OpenLIT version matches OTel semantic-conv version expected by Cloud; verify auth with curl as in workflow #3
## References
- [`references/apm.md`](references/apm.md) — APM essentials: how RED metrics are generated, required OTel resource attributes, Alloy config, correlation links
- [`references/apm-setup.md`](references/apm-setup.md) — deep dive: full per-language OTel SDK setup (Node / Python / Java / Go), span-metrics options, complete Alloy config
- [`references/faro.md`](references/faro.md) — Faro essentials: SDK init, instrumentations, session replay
- [`references/frontend-observability.md`](references/frontend-observability.md) — deep dive: full Faro SDK reference, React/Vue/Angular integration, custom events, source maps
- [`references/ai-observability.md`](references/ai-observability.md) — OpenLIT auto-instrumentation for OpenAI / Anthropic / Bedrock / Vertex AI
## Resources
- [App Observability docs](https://grafana.com/docs/grafana-cloud/monitor-applications/application-observability/)
- [Frontend Observability docs](https://grafana.com/docs/grafana-cloud/monitor-applications/frontend-observability/)
- [Faro Web SDK](https://github.com/grafana/faro-web-sdk)
- [AI Observability docs](https://grafana.com/docs/grafana-cloud/monitor-applications/ai-observability/)
- [OpenLIT](https://openlit.io/)
© grafana · Apache-2.0 · grafana/skills