Skip to main content
skill CX Codex

mimir — Claude Code skill: Mimir metrics storage setup

A skill that walks the agent through running Grafana Mimir for long-term Prometheus and OTLP metrics, multi-tenancy included.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add grafana/skills --skill mimir -a claude-code
Open on GitHub

What mimir does

The skill lays out two paths. First a local Mimir in Docker: a ready demo.yaml with the monolithic all target, filesystem block storage and multitenancy off, plus checks against /ready, /api/v1/labels and Mimir's own metrics endpoint.

Then ingestion. Prometheus and Grafana Alloy both push to http://localhost:9009/api/v1/push, and with multitenancy on every request carries an X-Scope-OrgID header. For Kubernetes there is the mimir-distributed Helm chart at version 6.0.6, followed by a pod and gateway check. Two reference files sit alongside the main skill: references/storage.md for storage backends and references/architecture.md for components, rings and limits.

Know this upfront: production wants an object-storage bucket, filesystem is a dev-only option. With multitenancy enabled the tenant header is mandatory on writes and reads, so a missing X-Scope-OrgID leaves you with silence instead of data. Docker is enough for the quick start; the Helm route also needs a Kubernetes cluster and kubectl.

What it helps with

  • bring up Mimir locally in Docker and confirm readiness
  • point Prometheus remote_write at Mimir
  • enable multitenancy and pass X-Scope-OrgID per tenant
  • deploy the mimir-distributed Helm chart to Kubernetes
  • trace a 429 Too Many Requests response on push

Example prompts for the agent

  • Start Mimir locally from demo.yaml and check that /ready responds
  • Configure remote_write from Prometheus into Mimir for the tenant1 tenant
  • Deploy Mimir to Kubernetes with the mimir-distributed chart and a values.yaml

How to install mimir

1Skills CLI (Vercel)

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

2Manually: put the files in place

~/.claude/skills/mimir/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/mimir/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about mimir

How do I install mimir in Claude Code?

Run npx skills add grafana/skills --skill mimir -a claude-code. The skill ends up at ~/.claude/skills/mimir/SKILL.md.

What does mimir do?

It gives the agent a working recipe for Grafana Mimir: a local config, metric push examples and a Kubernetes deployment path.

What does it need to work?

Docker for the quick start or a Kubernetes cluster for Helm, plus an S3, GCS or Azure bucket for production. On the sending side, Prometheus or Alloy with remote write enabled.

Source text

SKILL.md · Apache-2.0
---
name: mimir
license: Apache-2.0
description: Stand up Grafana Mimir for horizontally scalable, multi-tenant, long-term Prometheus + OTLP metrics storage. Covers monolithic / read-write / microservices deployment, S3 / GCS / Azure / filesystem block storage, Prometheus `remote_write` and OTLP ingestion, multi-tenancy with `X-Scope-OrgID`, ingester replication factor, compactor retention, and per-tenant limits. Use when running Mimir locally or on Kubernetes (Helm `mimir-distributed`), scaling Prometheus past a single node, picking ingest / query / backend split, configuring tenants and ingestion rate, debugging `/ready` 503s or `429 Too Many Requests`, or pointing Grafana at a Mimir datasource — even when the user says "I need long-term Prometheus storage", "scale Prometheus", "multi-tenant metrics backend", "Cortex replacement", "remote_write target", or "store 10M active series" without naming Mimir.
---

# Grafana Mimir

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

Horizontally scalable, multi-tenant, long-term storage for Prometheus + OpenTelemetry metrics.

## Prerequisites

- Docker (for quick start) or a Kubernetes cluster (for Helm)
- An object-storage bucket for production (S3/GCS/Azure) — filesystem only for dev
- Prometheus or Alloy able to remote_write to the Mimir push endpoint

## Common Workflows

### 1. Stand up monolithic Mimir locally

```yaml
# demo.yaml
target: all
multitenancy_enabled: false

blocks_storage:
  backend: filesystem
  bucket_store:
    sync_dir: /tmp/mimir/tsdb-sync
  filesystem:
    dir: /tmp/mimir/data/tsdb
  tsdb:
    dir: /tmp/mimir/tsdb

compactor:
  data_dir: /tmp/mimir/compactor
  sharding_ring:
    kvstore: { store: memberlist }

distributor:
  ring:
    instance_addr: 127.0.0.1
    kvstore: { store: memberlist }

ingester:
  ring:
    instance_addr: 127.0.0.1
    kvstore: { store: memberlist }
    replication_factor: 1

server:
  http_listen_port: 9009
  grpc_listen_port: 9095
  log_level: error
```

```bash
# 1. Run it
docker run --rm -p 9009:9009 -v $(pwd)/demo.yaml:/etc/mimir/demo.yaml \
  grafana/mimir:latest --config.file=/etc/mimir/demo.yaml

# 2. Verify readiness (expect HTTP 200, body: "ready")
curl -sf http://localhost:9009/ready

# 3. Verify it's serving the API
curl -s http://localhost:9009/api/v1/labels | jq '.status'   # → "success"

# 4. Verify self-metrics scrape
curl -s http://localhost:9009/metrics | grep -E '^mimir_(distributor|ingester)_' | head
```

### 2. Send metrics — Prometheus remote_write

```yaml
remote_write:
  - url: http://localhost:9009/api/v1/push
    headers:
      X-Scope-OrgID: tenant1   # required when multitenancy_enabled: true
```

```bash
# Verify samples are landing
curl -s -H 'X-Scope-OrgID: tenant1' \
  'http://localhost:9009/api/v1/query?query=up' | jq '.data.result | length'
# Expect > 0 within ~30s of Prometheus scraping
```

### 3. Send metrics — Grafana Alloy

```alloy
prometheus.remote_write "mimir" {
  endpoint {
    url = "http://mimir:9009/api/v1/push"
    headers = { "X-Scope-OrgID" = "tenant1" }
  }
}
```

### 4. Deploy on Kubernetes (Helm, microservices)

```bash
# 1. Install
helm repo add grafana https://grafana.github.io/helm-charts
helm install mimir grafana/mimir-distributed --version 6.0.6 -f values.yaml

# 2. Verify every pod is Running / Ready
kubectl get pods -n mimir
#   distributor, ingester, querier, query-frontend, store-gateway, compactor, ruler

# 3. Verify the gateway is ready
kubectl port-forward -n mimir svc/mimir-nginx 9009:80 &
curl -sf http://localhost:9009/ready
```

## Multi-tenancy

```yaml
multitenancy_enabled: true
# Every request must include header:  X-Scope-OrgID: <tenant-id>
```

For storage backends (S3 / GCS / Azure / filesystem) see [`references/storage.md`](references/storage.md). For component roles, ring options, limits, and API endpoint dumps see [`references/architecture.md`](references/architecture.md).

## Troubleshooting

- `/ready` returns 503 → ingester still joining ring; check `mimir_ring_members` and ingester logs
- `429 Too Many Requests` on push → bump `limits.ingestion_rate` / `ingestion_burst_size`
- Samples written but query returns empty → confirm `X-Scope-OrgID` matches between write and read
- Query for old data returns nothing → check compactor logs and that store-gateway has synced blocks

## Resources

- [Mimir docs](https://grafana.com/docs/mimir/latest/)
- [Helm chart `mimir-distributed`](https://github.com/grafana/mimir/tree/main/operations/helm/charts/mimir-distributed)
- [Architecture reference](https://grafana.com/docs/mimir/latest/references/architecture/)

© grafana · Apache-2.0 · grafana/skills

Similar skills

All skills for DevOps and infrastructure →

From the same set51

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor