С определённого времени Grafana Loki является многопользовательской системой, если я правильно перевёл Multi-tenancy) Если объяснять это простым языком, то получается следующее: у вас в одном кластере могут храниться данные нескольких владельцев. Например, у вас есть организация А и организация B. Логично что владелец организации B хотел бы чтобы логи его серверов могли видеть только его сотрудники. И функция Multi-tenancy как раз предназначена для этого.
Чтобы получить доступ к логам организации B вам будет необходимо предоставить orgID (Tenant ID)
через X-Scope-OrgID
в HTTP-заголовке. Tenant ID (orgID)
может содержать буквенно-цифровые символы.
По умолчанию Loki запускается в моде multi-tenant и активируется переменной auth_enabled: true
в файле конфигурации Loki. Если auth_enabled
стоит в false
то по сути у вас всего один Tenant
с именем fake
. Т.е. никакого разграничения нет, и логи видят все по умолчанию.
На рисунке ниже я предоставил скрин с двумя Tenant ID
, так они выглядят в хранилище (S3).
Multi-tenancy запросы (Get)
И логичный вопрос возникает в вашей голове: а как собственно получить доступ к тому или иному Tenant ID
. Для примера если вы запустите Loki из примера на github вы по умолчанию получите доступ только к Tenant ID
равным docker
. Но об этом чуть попозже.
Так вот чтобы получить доступ к tenant A
нужно выполнить следующий запрос:
curl --location 'http://loki-gateway:8080/loki/api/v1/labels' --header 'X-Scope-OrgID: A'
Но что делать если вдруг захотелось обратиться сразу к нескольким Tenant ID
? Первым делом в файле конфигурации добавляем multi_tenant_queries_enabled: true
и в запросе указываем несколько id
через |.
curl --location 'http://loki-gateway:8080/loki/api/v1/labels' --header 'X-Scope-OrgID: A|B'
Если же вы выполните запрос без указания Tenant ID
, то вы просто на выходе получите no org id.
Multi-tenancy запросы (Post)
Конечно получить значение — это хорошо, но как быть если их еще нет. Т.е. как записать что-либо в Loki используя Multi-tenancy. Для этого выполним самый обычный Post
используя curl:
curl --location 'http://127.0.0.1:3100/loki/api/v1/push' \
--header 'X-Scope-OrgID: A' \
--header 'Content-Type: application/json' \
--data '{"streams": [{ "stream": { "foo": "bar2" }, "values": [ [ "1690877832000000000", "fizzbuzz" ] ] }]}'
Обратите на первое значение в values. Тут 1690877832000000000 означает время события, указанное в Unix варианте (мс). Собственно можно воспользоваться онлайн конвертером, но не забудьте еще добавить шесть нулей.
Как указать Tenant ID в Grafana
Мы рассмотрели, как передать Tenant ID
в сыром curl запросе, но если вы хотите смотреть логи через Grafana то в data source нужно будет также указать Tenant ID
.
- Открываем наш data source на редактирование http://grafana:3000/datasources/edit/loki
- Добавляем в Custom HTTP наш
Tenant ID
(Headers X-Scope-OrgID: A)
Или можно также это сделать через yaml (httpHeaderValue1):
apiVersion: 1
datasources:
- access: proxy
basicAuth: false
jsonData:
httpHeaderName1: "X-Scope-OrgID"
secureJsonData:
httpHeaderValue1: "A"
editable: true
isDefault: true
name: loki
type: loki
uid: loki
url: http://loki-gateway
version: 1
Заключение
Возможно кто-то не согласиться что это решение можно применять для разграничения прав доступа, но в принципе вы можете создать несколько datasources с разными Tenant ID
и уже раздавать доступ пользователям к этим datasources. Правда разграничение прав на datasources есть только в Grafana Enterprise и Grafana Cloud Pro and Advanced.
Комментарии