https://youtu.be/LHgBvTdAJME?si=aVI5knuEIYY6e-BG

Descripción

En este post vamos a instalar Grafana MIMIR, una solución de almacenamiento de series temporales que permite gestionar y escalar métricas de manera eficiente. Nosotros lo vamos a instalar usando Docker Compose, aunque su potencia y escalabilidad van mucho más allá. Sin embargo, para el sistema de métricas que queremos montar y el volumen que manejaremos, no nos hará falta una escalabilidad horizontal.

Docker Compose files

.env

MEMCACHED_VERSION=1.6.29-alpine
MINIO_VERSION=RELEASE.2024-08-29T01-40-52Z
MINIO_ROOT_USER=lgtmp
MINIO_ROOT_PASSWORD=76UECVjHkolnClreG6lAKHx3R6vzl
MINIO_PROMETHEUS_AUTH_TYPE=public
MINIO_UPDATE=off
MIMIR_VERSION=2.13.0
MIMIR_S3_ENDPOINT=minio:9000
MIMIR_S3_ACCESS_KEY_ID=lgtmp
MIMIR_S3_SECRET_ACCESS_KEY=76UECVjHkolnClreG6lAKHx3R6vzl
MIMIR_S3_INSECURE=true
LOKI_VERSION=3.0.1
LOKI_S3_ENDPOINT=minio:9000
LOKI_S3_ACCESS_KEY_ID=lgtmp
LOKI_S3_SECRET_ACCESS_KEY=76UECVjHkolnClreG6lAKHx3R6vzl
LOKI_S3_INSECURE=true

MinIO (S3 compatible storage)

services:
  minio:
    image: minio/minio:${MINIO_VERSION:-latest}
    # <https://github.com/qclaogui/codelab-monitoring/blob/main/docker-compose/common/config/agent-flow/modules/docker/README.md>
    entrypoint:
      - sh
      - -euc
      - |
        mkdir -p /data/mimir-blocks /data/mimir-ruler /data/mimir-alertmanager && \\
        mkdir -p /data/loki-data /data/loki-ruler && \\
        mkdir -p /data/tempo-data  && \\
        mkdir -p /data/pyroscope-data && \\
        minio server /data --console-address ':9001'
    env_file:
      - .env
    volumes:
      - ${PWD}/minio:/data
    healthcheck:
      test: ["CMD-SHELL", "mc ready local"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - observability

Memcached

services:
  memcached:
    labels:
      - metrics.agent.grafana.com/scrape=false
    image: memcached:${MEMCACHED_VERSION:-latest}
    networks:
      observability:

Grafana MIMIR

include:
  - ./compose-minio.yml
  - ./compose-memcached.yml
services:
  mimir:
    image: grafana/mimir-alpine:${MIMIR_VERSION:-latest}
    volumes:
      - ${PWD}/config/mimir:/etc/mimir
    depends_on:
      minio:
        condition: service_healthy
    env_file:
      - .env
    command:
      - -config.file=/etc/mimir/monolithic-mode-metrics.yaml
      - -target=all
      - -config.expand-env=true
      - -validation.max-length-label-value=4096000
      # <https://grafana.com/docs/mimir/latest/configure/about-versioning/>
      - -alertmanager.grafana-alertmanager-compatibility-enabled
      - -alertmanager.utf8-strict-mode-enabled
    healthcheck:
      test: [ "CMD", "/usr/bin/wget", "--no-verbose", "--tries=1", "--spider", "<http://localhost:80/ready>" ]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      proxy-network:
      observability:
        aliases:
          - mimir-memberlist

General Docker Compose

name: observability
include:
  - ./compose-mimir.yml

networks:
  proxy-network:
    name: services
    external: true
  observability:
    name: observability

Grafana MIMIR ficheros de configuración

runtime.yaml

# This file can be used to set overrides or other runtime config.
ingester_limits: # limits that each ingester replica enforces
  max_ingestion_rate: 20000
  max_series: 1500000
  max_tenants: 1000
  max_inflight_push_requests: 30000

distributor_limits: # limits that each distributor replica enforces
  max_ingestion_rate: 20000
  max_inflight_push_requests: 30000
  max_inflight_push_requests_bytes: 50000000

overrides:
  anonymous: # limits for anonymous that the whole cluster enforces
    # ingestion_tenant_shard_size: 9
    max_global_series_per_user: 1500000
    max_fetched_series_per_query: 100000
    native_histograms_ingestion_enabled: true
    ruler_max_rules_per_rule_group: 50