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

loki — скилл для Claude Code, Codex и Cursor

Скилл loki от Grafana учит агента писать запросы LogQL и настраивать сбор логов в Loki. Внутри — синтаксис селекторов, парсеров и метрик, архитектура и приём логов через Alloy, Promtail и Fluent Bit.

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

Что делает loki

Loki индексирует только метки, а не содержимое строк. Поэтому запросы дешевле, чем в системах полнотекстового поиска, но требуют аккуратности: сначала селектор потока, потом фильтры по строкам. Скилл держит эту логику перед агентом.

Что внутри: справочник по LogQL — селекторы потоков, фильтры строк, парсеры json, logfmt, pattern, regexp, unpack, фильтры по меткам, line_format и label_format, drop и keep. Отдельный блок про метрические запросы: rate, count_over_time, bytes_rate, absent_over_time, агрегации с sum by и topk, распаковка числовых значений через unwrap и offset для сравнения с прошлым окном.

Есть готовые примеры: алерт по доле ошибок, поиск медленных запросов, разбор 5xx из nginx, поиск утёкших учётных данных в логах. Плюс конфиги отправки — loki.source.file и loki.process в Alloy, DaemonSet для Kubernetes, HTTP Push API через curl.

Архитектура описана коротко: путь записи от Distributor до объектного хранилища, путь чтения через Query Frontend и Querier, роли Ingester и Compactor. Этого хватает, чтобы агент не путал компоненты при разборе проблем с пайплайном.

Скилл пригодится, если вы уже держите Loki или только выбираете, куда складывать логи. Агенту не придётся угадывать синтаксис LogQL — он возьмёт его из справочника.

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

  • написать запрос LogQL с селектором, парсером и фильтром по метке
  • посчитать долю ошибок по сервисам и собрать из этого алерт
  • настроить отправку логов в Loki через Alloy или Promtail
  • разобрать, почему логи не доходят до хранилища
  • вытащить числовые значения из логов и построить по ним метрику

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

  • Напиши запрос LogQL: доля ответов 5xx по каждому сервису за последние 5 минут
  • Собери конфиг Alloy, который читает /var/log/app/*.log и отправляет их в Loki
  • Разберись, почему в Loki не появляются логи из Kubernetes-подов

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

1Через Skills CLI (Vercel)

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

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

~/.claude/skills/loki/SKILL.md

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

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

Вопросы о loki

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

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

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

Даёт агенту справочник по LogQL и Loki: селекторы, парсеры, метрические запросы, архитектура, приём логов. Агент пишет запросы и конфиги, не выдумывая синтаксис.

С какими платформами работает loki?

Claude, Codex, Cursor, GitHub Copilot, Gemini CLI и OpenCode. Для каждой свой флаг установки, например -a cursor или -a opencode.

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

SKILL.md · Apache-2.0
---
name: loki
license: Apache-2.0
description: >
  Grafana Loki log aggregation and LogQL query language. Covers LogQL syntax (log queries, metric queries,
  label matchers, line filters, parsers: json/logfmt/pattern/regexp/unpack, label filters, line_format),
  Loki architecture, log ingestion via Alloy/Promtail/Fluent Bit, structured metadata, and Logs Drilldown.
  Use when writing LogQL queries, configuring Loki, troubleshooting log pipelines, or analyzing logs.
---

# Grafana Loki - Log Aggregation

> **Docs**: https://grafana.com/docs/loki/latest/

Indexes only metadata (labels), not full log content — dramatically cheaper than full-text search systems.

## LogQL Quick Reference

### Log Stream Selector (required in every query)

```logql
{app="nginx"}                        # exact match
{app!="nginx"}                       # not equal
{app=~"nginx|apache"}               # regex match
{app!~"debug.*"}                     # regex not match
{app="nginx", env="prod"}           # AND (multiple labels)
```

### Line Filters (pipeline stage 1 - put first for performance)

```logql
{app="nginx"} |= "error"            # contains string
{app="nginx"} != "info"             # does not contain
{app="nginx"} |~ "error|warn"       # regex match
{app="nginx"} !~ "health.*check"    # regex not match
{app="nginx"} |= `"status":5`       # backtick avoids escaping
```

### Parsers

```logql
# JSON
{app="api"} | json
{app="api"} | json status="http_status", path="request.path"

# Logfmt
{app="api"} | logfmt
{app="api"} | logfmt --strict
{app="api"} | logfmt --keep-empty

# Pattern (positional, _ discards)
{app="nginx"} | pattern `<ip> - - <_> "<method> <uri> <_>" <status> <bytes>`

# Regexp (named capture groups)
{app="nginx"} | regexp `(?P<method>\w+) (?P<path>\S+) HTTP/(?P<version>\S+)`

# Unpack (unwrap Promtail packed labels)
{app="api"} | unpack
```

### Label Filters (after parsers)

```logql
{app="api"} | json | status >= 500
{app="api"} | json | status == 200 and method != "OPTIONS"
{app="api"} | logfmt | duration > 1s
{app="api"} | json | level =~ "error|warn"
{app="api"} | json | bytes > 20MB
{app="api"} | json | path != "/healthz"
```

### Line Format

```logql
{app="api"} | json | line_format "{{.method}} {{.path}} -> {{.status}} ({{.duration}})"
{app="api"} | logfmt | line_format `{{.level | upper}}: {{.msg}}`
```

### Label Format

```logql
{app="api"} | logfmt | label_format new_name=old_name
{app="api"} | logfmt | label_format severity=level, svc=app
{app="api"} | logfmt | label_format msg=`{{.level}}: {{.message}}`
```

### Drop/Keep Labels

```logql
{app="api"} | json | drop filename, level="debug"
{app="api"} | json | keep level, status, method
```

### Decolorize

```logql
{app="cli-tool"} | decolorize
```

## Metric Queries

### Log Range Aggregations

```logql
# Requests per second
rate({app="nginx"}[5m])

# Total log lines in window
count_over_time({app="nginx"}[1h])

# Bytes per second
bytes_rate({app="nginx"}[5m])

# Total bytes
bytes_over_time({app="nginx"}[1h])

# Returns 1 if no logs in range (for absence alerting)
absent_over_time({app="nginx"}[5m])
```

### Aggregation

```logql
# Error rate by service
sum(rate({env="prod"} |= "error" [5m])) by (app)

# Top 5 most active services
topk(5, sum(rate({env="prod"}[5m])) by (app))

# Total errors across all services
sum(count_over_time({env="prod"} |= "error" [5m]))
```

### Unwrapped Range Aggregations (numeric values from logs)

```logql
# Average request duration from logfmt
avg_over_time({app="api"} | logfmt | unwrap duration [5m])

# 95th percentile latency
quantile_over_time(0.95, {app="api"} | logfmt | unwrap duration [5m]) by (app)

# Sum of bytes from JSON logs
sum_over_time({app="api"} | json | unwrap bytes [5m])

# With conversion (duration string → seconds)
avg_over_time({app="api"} | logfmt | unwrap duration | duration_seconds [5m])
```

### Offset Modifier

```logql
# Compare current rate vs 1 hour ago
rate({app="nginx"}[5m]) / rate({app="nginx"}[5m] offset 1h)
```

## Practical Examples

### Error rate alert query
```logql
sum(rate({env="prod"} |= "error" [5m])) by (service)
/
sum(rate({env="prod"}[5m])) by (service)
> 0.05
```

### Slow requests
```logql
{app="api"} | logfmt | duration > 1s | line_format "SLOW: {{.method}} {{.path}} {{.duration}}"
```

### HTTP 5xx errors with details
```logql
{app="nginx"} | pattern `<ip> - - <_> "<method> <uri> <_>" <status> <bytes>` | status >= 500
```

### Credential leak detection
```logql
{namespace="prod"} |~ `https?://\w+:\w+@`
```

## Sending Logs to Loki

### Via Grafana Alloy

```alloy
loki.source.file "app" {
  targets    = [{__path__ = "/var/log/app/*.log", job = "app"}]
  forward_to = [loki.process.parse.receiver]
}

loki.process "parse" {
  forward_to = [loki.write.cloud.receiver]
  stage.json {
    expressions = { level = "level", msg = "message" }
  }
  stage.labels {
    values = { level = "" }
  }
  stage.drop {
    expression = ".*healthcheck.*"
  }
}

loki.write "cloud" {
  endpoint {
    url = "https://logs-xxx.grafana.net/loki/api/v1/push"
    basic_auth {
      username = sys.env("LOKI_USER")
      password = sys.env("GRAFANA_API_KEY")
    }
  }
  external_labels = { cluster = "prod" }
}
```

### Via Kubernetes (Alloy DaemonSet)

```alloy
discovery.kubernetes "pods" {
  role = "pod"
}

loki.source.kubernetes "pods" {
  targets    = discovery.kubernetes.pods.targets
  forward_to = [loki.write.cloud.receiver]
}
```

### Loki HTTP Push API

```bash
curl -X POST https://logs-xxx.grafana.net/loki/api/v1/push \
  -u "user:apikey" \
  -H 'Content-Type: application/json' \
  -d '{
    "streams": [{
      "stream": { "app": "myapp", "env": "prod" },
      "values": [
        ["1609459200000000000", "log line here"]
      ]
    }]
  }'
```

## Architecture

```
Push path:  Client → Distributor → Ingester (WAL) → Object Storage (chunks)
Read path:  Query → Query Frontend → Querier → Ingester + Store (chunks)
```

**Components:**
- **Distributor**: Validates and hashes incoming log streams
- **Ingester**: Buffers chunks in memory, flushes to object storage
- **Querier**: Executes LogQL queries
- **Query Frontend**: Caches, splits, and parallelizes queries
- **Compactor**: Manages retention and deduplication

## References

- [LogQL Reference](references/logql.md)
- [Configuration](references/configuration.md)
- [Sending Data](references/send-data.md)

© grafana · Apache-2.0 · grafana/skills

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

Всё по теме «DevOps и инфраструктура» →
loki-logging devops-skills Скилл помогает настроить Grafana Loki, Promtail и запросы LogQL прямо в проекте, без похода в документацию. CX Codex +1 330установок logql-generator akin-ozer Пошагово строит запросы LogQL, метрики и правила алертов для Grafana Loki. Пригодится при настройке мониторинга и разборе инцидентов по логам. CX Codex +1 597установок mcp-grafana grafana Даёт агенту доступ к вашему Grafana: искать дашборды, читать панели, гонять PromQL и LogQL. Пригодится, когда разбираете инцидент или правите графики прямо из чата. CX Codex +1 ★ 3 598звёзд репо grafana-dashboards Seth Hobson Скилл помогает создавать Grafana-дашборды для метрик систем и приложений. Подойдёт для мониторинга, SLO и операционных интерфейсов наблюдаемости. CX Codex 13 097установок qdrant-monitoring qdrant Скилл подсказывает, как настроить мониторинг Qdrant и разобраться с зависшим оптимизатором, ростом памяти или медленными запросами. CX Codex +1 1 500установок grafana-dashboard aj-geddes Помогает агенту собирать дашборды Grafana: панели, переменные, алерты и провижининг. Пригодится, когда нужно быстро накидать мониторинг по метрикам. CX Codex +1 494установок

Из того же набора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-label-analyzer Разбирает схему меток Grafana Loki: где растёт кардинальность, какие метки мешают запросам и что с ними делать. CX Codex +1 6 300установок opentelemetry Скилл помогает подключить OpenTelemetry к приложению и отправить метрики, логи и трейсы в Grafana Cloud или свой Mimir, Loki, Tempo. CX Codex +1 6 100установок 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установок

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

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