С определённого времени Grafana Loki является многопользовательской системой, если я правильно перевёл Multi-tenancy) Если объяснять это простым языком, то получается следующее: у вас в одном кластере могут храниться данные нескольких владельцев. Например, у вас есть организация А и организация B. Логично что владелец организации B хотел бы чтобы логи его серверов могли видеть только его сотрудники. И функция Multi-tenancy как раз предназначена для этого.

loki  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).

minio tenant id folder

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.

  1. Открываем наш data source на редактирование http://grafana:3000/datasources/edit/loki
  2. Добавляем в Custom HTTP наш Tenant ID (Headers X-Scope-OrgID: A)

X-Scope-OrgID

Или можно также это сделать через 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.