И продолжаем баловаться с Loki.
Первая часть — тут>>>, вторая — тут>>>.
Очень пригодилась помощь разработчиков в Slack-комьюнити Grafana — там есть отдельный канал #loki.
Задача сейчас — настроить Loki для использования AWS S3 корзины как persistent storage для данных самих логов, и AWS DynamoDB — для хранения индексов.
При запуске Loki с конфигурацией по умолчанию — данные и индексы хранятся в каталоге /tmp/loki контейнера:
[simterm]
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
[/simterm]
А описываются настройки хранилища в блоке storage_config:
[simterm]
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
[/simterm]
Собственно всё, что нам надо — это создать 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
Не думаю, что так заведётся — но ради интереса глянем:
[simterm]
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
[/simterm]
Ну, окей.
Добавляем 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
Запускаем сервис:
[simterm]
root@ip-172-31-38-97:/home/admin# docker-compose -f loki-compose.yml up -d Starting admin_loki_1 ... done
[/simterm]
Ждём минуту-две, и проверяем 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:
[simterm]
$ 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
[/simterm]
Вроде пока ОК.
Будем потихоньку поднимать на Стейджинге, и смотреть за поведением.


