Grafana Labs: Loki – подключение S3 для данных и DynamoDB для индексов

Автор: | 02/13/2019
 

И продолжаем баловаться с Loki.

Первая часть — тут>>>, вторая — тут>>>.

Очень пригодилась помощь разработчиков в Slack-комьюнити Grafana — там есть отдельный канал #loki.

Задача сейчас — настроить Loki для использования AWS S3 корзины как persistent storage для данных самих логов, и AWS DynamoDB — для хранения индексов.

При запуске Loki с конфигурацией по умолчанию — данные и индексы хранятся в каталоге /tmp/loki контейнера:

root@ip-172-31-38-97:/home/admin# docker exec -ti admin_loki_1 ls -l /tmp/loki/
total 24
drwxr-xr-x    2 root     root         20480 Feb 11 11:32 chunks
drwxr-xr-x    2 root     root          4096 Feb  7 12:43 index

А описываются настройки хранилища в блоке storage_config:

root@ip-172-31-38-97:/home/admin# docker exec -ti admin_loki_1 cat /etc/loki/local-config.yaml | grep -A 5 storage_config
storage_config:
boltdb:
directory: /tmp/loki/index
filesystem:
directory: /tmp/loki/chunks

Собственно всё, что нам надо — это создать S3 корзину, DynamoDB таблицу, и обновить конфиг Loki для их использования.

AWS S3

Настройка и подключение S3 самые простые — начнём с них.

Создание корзины и пользователя описывать не буду, примеры есть.

Создаём корзину, и обновляем локальный файл настроек Loki на хосте loki.setevoy.org.ua — меняем секцию storage_config:

...
storage_config:
  boltdb:
    directory: /tmp/loki/index

#  filesystem:
#    directory: /tmp/loki/chunks
  aws: 
     s3: s3://AKI***PHA:0/W***WFN@eu-west-1/logger-loki-poc

limits_config:
  enforce_metric_name: false

Не думаю, что так заведётся — но ради интереса глянем:

root@ip-172-31-38-97:/home/admin# docker-compose -f loki-compose.yml up
Creating network "admin_default" with the default driver
Creating admin_loki_1 ... done
Attaching to admin_loki_1
loki_1  | level=info ts=2019-02-11T12:41:36.891679717Z caller=loki.go:122 msg=initialising module=server
loki_1  | level=info ts=2019-02-11T12:41:36.892371631Z caller=gokit.go:36 http=[::]:3100 grpc=[::]:9095 msg="server listening on addresses"
loki_1  | level=info ts=2019-02-11T12:41:36.892882132Z caller=loki.go:122 msg=initialising module=overrides
loki_1  | level=info ts=2019-02-11T12:41:36.893212712Z caller=override.go:33 msg="per-tenant overides disabled"
loki_1  | level=info ts=2019-02-11T12:41:36.893613967Z caller=loki.go:122 msg=initialising module=store
loki_1  | level=error ts=2019-02-11T12:41:36.894199922Z caller=main.go:41 msg="error initialising loki" err="error initialising module: store: error creating object client: mkdir : no such file or directory"
admin_loki_1 exited with code 1

Ну, окей.

Добавляем DynamoDB.

DynamoDB

В документации наконец-то появилось указание по типам полей, см. operations.md.

Создаём таблицу, задаём поле с именем h типа String в качестве Primary key, и добавляем Sort key с именем r и типом Binary: (нет, не спрашивайте — почему такие имена полей…):

Обновляем конфигурацию Loki — приводим файл loki-conf.yml к такому виду:

auth_enabled: false

server:
  http_listen_port: 3100

ingester:
  lifecycler:
    address: 0.0.0.0
    ring:
      store: inmemory
      replication_factor: 1
  chunk_idle_period: 15m

#schema_config:
#  configs:
#  - from: 0
#    store: boltdb
#    object_store: filesystem
#    schema: v9
#    index:
#      prefix: index_
#      period: 168h

schema_config:
  configs:
  - from: 0
    store: aws
    object_store: aws
    schema: v9
    index:
      prefix: loki_index
      period: 0

storage_config:

#  boltdb:
#    directory: /tmp/loki/index

#  filesystem:
#    directory: /tmp/loki/chunks

  aws:
     s3: s3://AKI***PHA:0/W***WFN@eu-west-1/logger-loki-poc
     dynamodbconfig:
       dynamodb: dynamodb://AKI***Y7A:lTH***zg4@eu-west-1

limits_config:
  enforce_metric_name: false

Примечание: кривой парсер SECRET_KEY: вырезает символы 0/ и /, пришлось генерить новый ключ. Issue: https://github.com/grafana/loki/issues/310

Запускаем сервис:

root@ip-172-31-38-97:/home/admin# docker-compose -f loki-compose.yml up -d
Starting admin_loki_1 ... done

Ждём минуту-две, и проверяем Grafana (Split — удобная опция):

Данные пошли.

Правда — корзина пустая… И индексов нет.

И где они?

Пусть поработает пока.

А ещё — сыплет ошибками вида:

loki_1  | level=error ts=2019-02-13T12:05:57.928786555Z caller=flush.go:118 org_id=fake msg=»failed to flush user» err=»NoCredentialProviders: no valid providers in chain. Deprecated.\n\tFor verbose messaging see aws.Config.CredentialsCha
inVerboseErrors»

Это ошибка решилась тем, что для S3 и DynamoDB использовал один и  тот же набор ACCESS/SECRET ключ (для Dynamo генерировался отдельный из-за бага с 0/).

И данные в S3 и DynamoDB появились минут через 15:

S3:

aws s3 ls s3://logger-loki-poc/fake --profile loki-poc --recursive
2019-02-13 14:32:18       1048 fake/45b3cb5abb207032:168e6c9dd3c:168e6c9e4c2:fb4b2bc6
2019-02-13 14:32:18        419 fake/7a257c9eb6a62090:168e6c9f488:168e6c9f48b:a1a29aa7
2019-02-13 14:32:48        688 fake/bf4191474b863420:168e6c9ecc1:168e6ca72f7:deeb5910
2019-02-13 14:33:18        730 fake/bf419e474b8637ed:168e6c9e4c1:168e6cac1ac:824c11f9

Вроде пока ОК.

Будем потихоньку поднимать на Стейджинге, и смотреть за поведением.