К основному содержанию
скилл CX Codex

opentelemetry · grafana — скилл для Claude Code: трейсы и метрики в Grafana

Скилл помогает подключить OpenTelemetry к приложению и отправить метрики, логи и трейсы в Grafana Cloud или свой Mimir, Loki, Tempo.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add grafana/skills --skill opentelemetry -a claude-code
Открыть на GitHub

Что делает opentelemetry

Скилл ведёт по всей цепочке: приложение говорит на OTLP, дальше Alloy или прямой экспорт, а на другом конце — Grafana Cloud с хранилищами Mimir для метрик, Loki для логов, Tempo для трейсов и Pyroscope для профилей. Внутри разобраны автоподключение SDK для Go, Java через Grafana JVM agent, Python через opentelemetry-instrument, Node.js и .NET, а также Beyla на eBPF, если код трогать не хочется.

Отдельный блок — авторизация на OTLP-шлюзе Grafana Cloud: числовой instance ID и API-токен с ролями MetricsPublisher, LogsPublisher, TracesPublisher складываются в Basic-заголовок через base64. Настройка идёт переменными окружения OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_PROTOCOL, OTEL_EXPORTER_OTLP_HEADERS и OTEL_RESOURCE_ATTRIBUTES. Есть готовый curl для проверки учётки: правильный ответ — 400 на пустое тело, а 401 или 404 означают, что дело в ID, ролях токена или адресе.

Для Kubernetes скилл описывает Operator с аннотациями instrumentation.opentelemetry.io/inject-java и соседними, для сбора — конфиги Alloy и OTel Collector. Сэмплирование разведено на head и tail: head дешевле, но редкие ошибки может потерять, tail решает после целого трейса и требует процессора tail_sampling в коллекторе. Если трейсы не появляются в Explore, первым делом сверяйте OTEL_EXPORTER_OTLP_PROTOCOL с транспортом: шлюз Grafana Cloud ждёт http/protobuf, локальный Alloy — grpc.

Какие задачи решает

  • подключить OpenTelemetry к сервису и увидеть трейсы в Tempo
  • собрать Basic-заголовок из instance ID и API-токена для OTLP-шлюза
  • перевести сервис с Jaeger, Datadog или New Relic на OTLP
  • выбрать между head- и tail-сэмплированием
  • разобраться, почему спаны не доходят до Explore

Примеры запросов агенту

  • Автоматически подключи OpenTelemetry к моему Java-приложению и отправь трейсы в Grafana Cloud
  • Какие переменные окружения задать для OTLP-эндпоинта Grafana Cloud?
  • Настрой tail sampling в Alloy, чтобы ошибки сохранялись целиком

Как установить opentelemetry

1Через Skills CLI (Vercel)

npx skills add grafana/skills --skill opentelemetry -a claude-code

2Вручную: положить файлы

~/.claude/skills/opentelemetry/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/opentelemetry/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о opentelemetry

Как установить opentelemetry в Claude?

Выполните npx skills add grafana/skills --skill opentelemetry -a claude-code. Скилл появится в ~/.claude/skills/opentelemetry/SKILL.md.

Что делает скилл opentelemetry?

Проводит по инструментированию приложения через OpenTelemetry и отправке метрик, логов и трейсов в Grafana Cloud или в свои Mimir, Loki, Tempo и Pyroscope. Внутри — примеры для Go, Java, Python, Node.js и .NET, конфиги Alloy и OTel Collector, установка Kubernetes Operator.

Почему спаны не показываются в Explore?

Чаще всего протокол не совпадает с транспортом: шлюз Grafana Cloud принимает http/protobuf, а локальный Alloy — grpc. Ещё стоит проверить, что адрес заканчивается на /otlp, а у токена есть нужные роли публикации.

Исходный текст

SKILL.md · Apache-2.0
---
name: opentelemetry
license: Apache-2.0
description: Instrument any app with OpenTelemetry and ship metrics / logs / traces to Grafana Cloud or self-hosted Mimir / Loki / Tempo / Pyroscope. Covers SDK auto-instrumentation for Go, Java (Grafana JVM agent), Python (`opentelemetry-instrument`), Node.js, .NET (`Grafana.OpenTelemetry`), Beyla eBPF for zero-code; Grafana Cloud OTLP gateway + Basic-auth (instanceID + API key, base64); env-var config (`OTEL_EXPORTER_OTLP_*`, `OTEL_RESOURCE_ATTRIBUTES`); Alloy / OTel-Collector pipelines; Kubernetes Operator inject-annotations; and head + tail sampling. Use when instrumenting a service, pointing OTLP at Grafana Cloud, switching from Jaeger / Datadog / New Relic, choosing head- vs tail-sampling, or debugging "spans aren't showing in Explore" — even when the user says "auto-instrument my Java app", "send traces to Grafana", "what env vars do I set", "OTLP endpoint", or "Operator inject" without naming OpenTelemetry.
---

# OpenTelemetry with Grafana

> **Docs**: https://grafana.com/docs/opentelemetry/

Vendor-neutral instrumentation pipeline. Apps speak OTLP → Alloy (or direct) → Grafana Cloud (Mimir / Loki / Tempo / Pyroscope).

## Backends

| Signal | Backend |
|--------|---------|
| Metrics | Grafana Mimir |
| Logs | Grafana Loki |
| Traces | Grafana Tempo |
| Profiles | Grafana Pyroscope |

## Prerequisites

- Grafana Cloud stack OR self-hosted Mimir / Loki / Tempo
- Cloud OTLP endpoint: `https://otlp-gateway-<region>.grafana.net/otlp`
- Basic-auth credentials: numeric instance ID + API token with `MetricsPublisher` + `LogsPublisher` + `TracesPublisher`
- An app to instrument

## Common Workflows

### 1. Authenticate to the Grafana Cloud OTLP endpoint

```bash
# 1. Build the auth header
INSTANCE_ID=123456
API_KEY="glc_eyJ..."
export OTEL_EXPORTER_OTLP_ENDPOINT=https://otlp-gateway-prod-us-east-0.grafana.net/otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic $(echo -n "${INSTANCE_ID}:${API_KEY}" | base64)"
export OTEL_RESOURCE_ATTRIBUTES="service.name=myapp,service.namespace=myteam,deployment.environment=prod"

# 2. Smoke-test creds with a curl POST against the OTLP traces endpoint (empty body)
curl -s -o /dev/null -w "%{http_code}\n" \
  -X POST -H "Content-Type: application/x-protobuf" \
  -H "Authorization: Basic $(echo -n "${INSTANCE_ID}:${API_KEY}" | base64)" \
  "$OTEL_EXPORTER_OTLP_ENDPOINT/v1/traces" --data-binary '\n'
# Expect 400 (malformed payload) — NOT 401 (auth) or 404 (wrong endpoint).
```

### 2. Auto-instrument a Java app + verify

```bash
# 1. Download the Grafana JVM agent (single jar)
curl -sLO https://github.com/grafana/grafana-opentelemetry-java/releases/latest/download/grafana-opentelemetry-java.jar

# 2. Run with the agent + env from step 1
java -javaagent:./grafana-opentelemetry-java.jar -jar myapp.jar

# 3. Generate traffic, then verify in Grafana → Explore → Tempo:
#    TraceQL: { resource.service.name = "myapp" }
#    Expect spans within ~30s. Also verify metrics:
#    PromQL: count by (service_name)({service_name="myapp"})
```

### 3. Auto-instrument a Python app

```bash
pip install "opentelemetry-distro[otlp]"
opentelemetry-bootstrap -a install

# Same env vars as step 1, then:
opentelemetry-instrument python app.py

# Verify the same way — Explore → Traces filter service.name=myapp.
```

### 4. Add Alloy as a buffering / sampling collector

```bash
# Application points at local Alloy (gRPC fastest)
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc

# Alloy environment for forwarding to Cloud
export GRAFANA_CLOUD_OTLP_ENDPOINT=https://otlp-gateway-prod-us-east-0.grafana.net/otlp
export GRAFANA_CLOUD_INSTANCE_ID=$INSTANCE_ID
export GRAFANA_CLOUD_API_KEY=$API_KEY
alloy run /etc/alloy/config.alloy

# Verify Alloy received and forwarded
curl -s http://localhost:12345/metrics | grep otelcol_exporter_sent_spans
```

Full Alloy config + tail-sampling block + OTel Collector YAML + K8s Operator install: [`references/collector-config.md`](references/collector-config.md).

SDK-by-language details (Go full code, Node manual setup, .NET ASP.NET Core, all the env-var quirks): [`references/instrumentation.md`](references/instrumentation.md).

### 5. Kubernetes — auto-inject via the Operator

```yaml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata: { name: my-instrumentation }
spec:
  exporter: { endpoint: http://otelcol:4317 }
  propagators: [tracecontext, baggage]
  java:
    image: us-docker.pkg.dev/grafanalabs-global/docker-grafana-opentelemetry-java-prod/grafana-opentelemetry-java:2.3.0-beta.1
  nodejs: {}
  python: {}
```

Then annotate pods:

```yaml
metadata:
  annotations:
    instrumentation.opentelemetry.io/inject-java: "true"
    # or: inject-nodejs, inject-python, inject-dotnet
```

```bash
# Verify the operator injected the agent
kubectl describe pod <pod> | grep -A2 'opentelemetry-auto-instrumentation'
# Then run the same Grafana Explore checks.
```

## Sampling — when to pick which

```bash
# Head sampling (cheap, decided at start; may lose rare errors)
export OTEL_TRACES_SAMPLER=parentbased_traceidratio
export OTEL_TRACES_SAMPLER_ARG=0.1   # 10%
```

Tail sampling (decides after seeing the whole trace — keep errors + sample the rest) requires an Alloy / OTel-Collector `tail_sampling` processor; full block in [`references/collector-config.md`](references/collector-config.md).

## Key environment variables

| Variable | Example |
|----------|---------|
| `OTEL_EXPORTER_OTLP_ENDPOINT` | `https://otlp-gateway-prod-us-east-0.grafana.net/otlp` |
| `OTEL_EXPORTER_OTLP_PROTOCOL` | `grpc` or `http/protobuf` |
| `OTEL_EXPORTER_OTLP_HEADERS` | `Authorization=Basic <base64>` |
| `OTEL_RESOURCE_ATTRIBUTES` | `service.name=app,service.namespace=team,deployment.environment=prod` |
| `OTEL_SERVICE_NAME` | shorthand for `service.name` |
| `OTEL_TRACES_SAMPLER` / `_ARG` | `parentbased_traceidratio` / `0.1` |

## Troubleshooting

- 401 from OTLP gateway → instance ID is not numeric, or API key missing publisher roles
- 404 → endpoint URL wrong (must end with `/otlp`)
- Spans missing → check `OTEL_EXPORTER_OTLP_PROTOCOL` matches transport (Cloud OTLP gateway = `http/protobuf`, Alloy local = `grpc`)
- Node.js auto-instrumentation broken after bundling → bundlers like `@vercel/ncc` defeat the require hooks
- Python under Gunicorn / uWSGI shows no spans → reinit OTel providers in a post-fork hook

## Resources

- [Grafana OTel docs](https://grafana.com/docs/opentelemetry/)
- [Grafana Cloud OTLP](https://grafana.com/docs/grafana-cloud/send-data/otlp/)
- [Grafana JVM agent](https://github.com/grafana/grafana-opentelemetry-java)
- [Grafana .NET SDK](https://github.com/grafana/grafana-opentelemetry-dotnet)
- [OTel Operator](https://opentelemetry.io/docs/kubernetes/operator/)

© grafana · Apache-2.0 · grafana/skills

Похожие скиллы

Всё по теме «DevOps и инфраструктура» →

Сначала — opentelemetry от других авторов.

opentelemetry codewithmukesh Скилл настраивает трассировку, метрики и логи OpenTelemetry в .NET 10 через единый вызов с OTLP-экспортом. CX Codex +1 2 800установок opentelemetry devops-skills Скилл помогает настроить OpenTelemetry в сервисах: трейсы, метрики и логи в одном формате, без привязки к вендору. CX Codex +1 339установок opentelemetry Claude MPM Team Скилл с паттернами OpenTelemetry: трейсы, метрики, логи, проброс контекста и пайплайны Collector. Пригодится, когда сервис пора инструментировать, а не гадать по логам. CX Codex +1 635установок opentelemetry-net-instrumentation Aaronontheweb Скилл подсказывает, как расставлять трассировку, метрики и логи в .NET-коде по спецификации OpenTelemetry. Пригодится, когда добавляете телеметрию в библиотеку или приложение. CX Codex +1 408установок loki-logging devops-skills Скилл помогает настроить Grafana Loki, Promtail и запросы LogQL прямо в проекте, без похода в документацию. CX Codex +1 330установок groundcover-cli paymog Скилл учит агента дёргать Go-утилиту groundcover: смотреть логи, трейсы, метрики и события k8s, а ещё управлять мониторами и silences. CX Codex +1 8 900установок golang-observability-opentelemetry Claude MPM Team Скилл для инструментирования Go-сервисов: OpenTelemetry для распределённых трейсов, Prometheus для метрик, slog для структурных логов. CX Codex +1 409установок monitor-setup Seth Hobson Слэш-команда, которая разворачивает сбор метрик Prometheus, дашборды Grafana, распределённую трассировку и агрегацию логов. CX Codex ★ 41 729звёзд репо monitoring-observability ahmedasmar Скилл для настройки мониторинга и наблюдаемости: стратегия метрик, алерты, дашборды, SLO и разбор инцидентов. CX Codex +1 493установок

Из того же набора47

dashboarding Скилл собирает и правит JSON дашбордов Grafana и отправляет их в HTTP API. Пригодится, когда панели нужно описать кодом, а не мышкой в UI. CX Codex +1 8 500установок promql Пишет и проверяет запросы PromQL к Prometheus, Mimir и Grafana Cloud Metrics. Помогает, когда p95 считается неверно или запрос тормозит. CX Codex +1 8 000установок loki Скилл loki от Grafana учит агента писать запросы LogQL и настраивать сбор логов в Loki. Внутри — синтаксис селекторов, парсеров и метрик, архитектура и приём логов через Alloy, Promtail и Fluent Bit. CX Codex +1 7 500установок loki-label-analyzer Разбирает схему меток Grafana Loki: где растёт кардинальность, какие метки мешают запросам и что с ними делать. CX Codex +1 6 300установок grafana-oss Скилл помогает агенту провизионить дашборды и датасорсы Grafana OSS из YAML, писать JSON панелей и проверять каждый шаг через API. CX Codex +1 5 600установок prometheus Справочник по PromQL, правилам алертов Prometheus и маршрутизации Alertmanager. Помогает генерировать метрики, алерты и правила записи. CX Codex +1 5 200установок alerting-irm Настраивает Grafana Alerting, IRM и SLO: от правил и маршрутизации до дежурств и эскалаций. Пригодится для YAML- и API-конфигурации. CX Codex +1 5 100установок assistant-mcp Помогает подключить ИИ-агентов к Grafana Cloud через MCP-сервер mcp-grafana. Пригодится для чтения метрик, поиска дашбордов и проверки алертов прямо в кодовой базе. CX Codex +1 5 000установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой