{{tag>[loki docker swarm promtail grafana monitoring fluentd fluent-bit prometheus}}

====== loki ======

===== Настройка =====

<code yaml>
auth_enabled: false

server:
  http_listen_port: 3100

common:
  instance_addr: 127.0.0.1
  path_prefix: /loki
  storage:
    filesystem:
      chunks_directory: /loki/chunks
      rules_directory: /loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2020-10-24
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: http://localhost:9093

limits_config:
  retention_period: 720h
  reject_old_samples: true
  reject_old_samples_max_age: 720h
  allow_structured_metadata: true
  max_query_length: 721h
  
ingester:
  lifecycler:
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 1h
  max_chunk_age: 1h
  chunk_target_size: 1048576
  chunk_retain_period: 30s

table_manager:
  retention_deletes_enabled: true
  retention_period: 720h
</code>

  * Менеджер TSDB используется для периодической (раз в 15 минут) сборки индексов TSDB из накопившихся WAL’ов. В случае успеха он ротирует старые TSDB Head и WAL, удаляя их для освобождения диска с памятью и заменяя пустышками, — это предотвращает неограниченный рост менее эффективных блоков и замещает их на свежесобранную TSDB.

===== Индексы =====

  * TSDB — это высокопроизводительные базы данных, которые позволяют запрашивать стримы и чанки по их лейблам. Однако они неизменяемы (immutable) и должны быть собраны до того, как к ним можно будет обращаться.

====== Loki фильтры ======


Взять любые значения и применить к ним фильтр json:

<code>
{stream=~".+", job=~".*", instance=~".*", cluster=""} | json
</code>

эквивалент:

<code>
{stream=~".+"} | json
</code>

В распарсенном json поискать значения парочки ключей:

<code>
{stream=~".+"} | json | http_host=`site.ru` | status > 299
</code>

Вот так я ищу ошибку в monolog:

<code>
{stream=~".+"} | json | message=`error message`
</code>

Найти точно по левой части и что-угодно справа:

<code>
request_uri=~"^/foo(.*)"
</code>

Найти по части совпадения строки:

<code>
{stream=~".+"}|~ "(.*)Find and save image problems(.*)"
</code>

Тоже самое, но сначала распарсить json:

<code>
{stream=~".+"} | json | message=~`(.*)Uncaught PHP Exception Doctrine(.*)`
</code>

OR условие:

<code>
... | json | scheme=`https` | status=~"301|302" [$__auto])))
</code>

Отрицание:

<code>
http_referer !~`(http|https)://yapro.ru(.*)`
</code>

Сформировать строку из разных значений:

<code>
| line_format "➡️ {{.request_method}} {{.request_uri}} with HTTP status: {{.status}} "
</code>



<code>
sum(count_over_time({app="servicefoundry-server"}[24h]))
</code>


<code>
{namespace="truefoundry", app!="grafana"} |= "[UNIQUE-STATIC-LOG] ID=abc123 XYZ"
</code>


<code>
{app="servicefoundry-server"} |= ":3000"
</code>



<code>
{namespace="truefoundry"} |= "non-existent log line"
</code>



<code>
{namespace="truefoundry"} |= "non-existent log line"
</code>



<code>

</code>



<code>
{container_name="nextcloud-cron-1"} | json | line_format `{{.log_raw}}`
</code>



<code>
{container_name="nextcloud-cron-1"} | json | line_format `{{.level}}`
</code>