И продолжаем баловаться с 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]
Вроде пока ОК.
Будем потихоньку поднимать на Стейджинге, и смотреть за поведением.