Рубрики
Uncategorized

Grafana: Loki-как прометеоподобные счетчики LogQl, функции агрегации и графики запросов DNSMASQ

В последний раз, когда я настроил Loki для сбора журналов и мониторинга в феврале 2019 года — почти вы … Tagged с мониторингом, учебником, DevOps.

В последний раз, когда я настроил Loki для сбора журналов и мониторинга в феврале 2019 года — почти год назад, см. Grafana Labs: Loki — Система сбора и мониторинга журналов Пост, когда Локи был в своем бета -состоянии.

Теперь мы столкнулись с исходящими проблемами движения в нашей производственной среде и не можем найти, кто виновен в этом.

Один из способов попытаться поймать его, чтобы собрать статистику о запросах DNS, а затем посмотреть, есть ли корреляция между просьбами выхода и запросами DNS на хостах AWS EC2 с локальным DNSMASQ Сервисы.

DNSMASQ Конфигурация описана в DNSMASQ: AWS — «Временный сбой в разрешении имени», журналы, отладка и размер кэша DNSMASQ Сообщение, и в этом мы постараемся понять следующее:

  • DNSMASQ записывает все запросы в локальный журнал
  • Журнал хвоста Выпускной хвост который отправляет данные на хост мониторинга с Loki
  • И, наконец, Графана будет нарисовать графики, основываясь на данных из Локи

Настройка, описанная ниже, является большим доказательством концепции, поскольку сама Локи и ее поддержка в Графане все еще находятся в стадии разработки.

Но теперь функция исследования в Графане поддерживает агрегацию и подсчет функций аналогично Прометеусу — sum () , rate () , и т.д.

Выпускной хвост В течение последнего года также добавили несколько новых интересных способностей, которые мы будем использовать в этом посте.

Сначала мы раскрутим обычный Grafana + Loki + Выпускной хвост Stack, затем добавит журналы, собирающие из нашей производственной среды и, наконец, добавят панель панели Grafana, используя функции New LogQl

Пойдем!

Локи, старт

Локи начнет с Docker Compose, создайте loki-stack.yml файл:

version: '2.4'
networks:
  loki:
services:
  loki:
    image: grafana/loki:master-2739551
    ports:
      - "3100:3100"
    networks:
      - loki
    restart: unless-stopped

Запустить его:

root@monitoring-dev:/opt/loki# docker-compose -f loki-stack.yml up

Проверять:

root@monitoring-dev:/home/admin# curl localhost:3100/ready
Ready

Loki API документация Здесь >>> Анкет

Grafana Start

Точно так же повторите с Grafana, используя версию 6.4.4 (см. Все доступные версии в его Хаб -Хаб ):

version: '2.4'
networks:
  loki:
services:
  loki:
    image: grafana/loki:master-2739551
    ports:
      - "3100:3100"
    networks:
      - loki
    restart: unless-stopped
  grafana:
    image: grafana/grafana:6.4.4
    ports:
      - "3000:3000"
    networks:
      - loki
    restart: unless-stopped

Начните, проверьте:

Войдите с Админ: администратор , перейти к DataSources :

Поскольку у нас работает Локи в сети Docker — используйте http://loki Ури здесь:

Nginx

Настройка выполняется в существующей среде мониторинга Dev, поэтому у меня уже есть Nginx.

Конфигурация Локи /etc/nginx/conf.d/dev.loki.example.com.conf Похоже, следующее:

upstream grafana-loki {
    server 127.0.0.1:3000;
}
server {
    listen 80;
    server_name  dev.loki.example.com;
    # Lets Encrypt Webroot                                           
    location ~ /.well-known {
    root /var/www/html;
        allow all;
    }

    location / {

        allow 194.***.***.26/29;
        allow 91.***.***.78/32;
        allow 188.***.***.94/32;
        allow 78.***.***.191/32;
        allow 176.***.***.43/32;
        allow 10.0.10.0/24;
        deny  all;
        return 301 https://dev.loki.example.com$request_uri;
    }       
}
server {
    listen       443 ssl;
    server_name  dev.loki.example.com;
#    access_log  /var/log/nginx/dev.loki.example.com-access.log proxy;
    error_log /var/log/nginx/dev.loki.example.com-error.log warn;
#    auth_basic_user_file /var/www/dev.loki.example.com/.htpasswd;
#    auth_basic "Password-protected Area";
    allow 194.***.***.26/29;
    allow 91.***.***.78/32;
    allow 188.***.***.94/32;
    allow 78.***.***.191/32;
    allow 176.***.***.43/32;
    allow 10.0.10.0/24;
    deny  all;
    ssl_certificate /etc/letsencrypt/live/dev.loki.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dev.loki.example.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/dhparams.pem;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
    ssl_session_timeout 1d;
    ssl_stapling on;
    ssl_stapling_verify on;
    location / {
        proxy_redirect          off;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://grafana-loki$request_uri;
    }
}

Выпускной старт

На данный момент в Grafana Explore нет ничего, поскольку в Локи еще не отправлены журналы.

Создать выпускной хвост S Config — /opt/loki/Promtail.yml :

В Клиент Блок Используйте URL как http:// Локи :

server:
  http_listen_port: 9080
  grpc_listen_port: 0
positions:
  filename: /tmp/positions.yaml
client:
  url: http://loki:3100/loki/api/v1/push
scrape_configs:
  - job_name: messages
    static_configs:
    - targets:
        - localhost
      labels:
        job: all-logs
        env: dev
        host: monitoring-dev
        __path__: /var/log/*.log

Добавьте Выпускной хвост В файл Compose установите там конфигурацию и укажите Команда для Выпускной хвост Чтобы узнать, какой файл конфигурации использовать:

...
  promtail:
    image: grafana/promtail:master-2739551
    networks:
      - loki
    volumes:
      - /opt/loki/promtail.yml:/etc/promtail/promtail.yml
    command: 
      - '-config.file=/etc/promtail/promtail.yml'
    restart: unless-stopped

Проверь это.

Выпускной хвост Вывод:

...
promtail_1  | level=info ts=2019-11-16T09:19:57.935528884Z caller=filetargetmanager.go:257 msg="Adding target" key="{env="dev", host="monitoring-dev", job="all-logs"}"
promtail_1  | ts=2019-11-16T09:19:57.936230518Z caller=log.go:124 component=tailer level=info msg="Seeked /var/log/dpkg.log - &{Offset:0 Whence:0}"
promtail_1  | level=info ts=2019-11-16T09:19:57.936292402Z caller=tailer.go:77 component=tailer msg="start tailing file" path=/var/log/dpkg.log
...

dpkg.log хвоста. хорошо.

И зарегистрируйтесь в Grafana Explore:

Ницца!

Журналы Promtail и DNSMASQ

Теперь давайте перейдем к нашей производству и проверем, сможете ли вы получить доступ к Локи оттуда:

root@bttrm-production-console:/home/admin# curl http://dev.logger.example.com:3100/ready
Ready

Создать Выпускной хвост S Config PROMTAIL-DEV.YML там:

server:
  http_listen_port: 9080
  grpc_listen_port: 0
positions:
  filename: /tmp/positions.yaml
client:
  url: http://dev.loki.example.com:3100/loki/api/v1/push
scrape_configs:
  - job_name: dnsmasq
    static_configs:
    - targets:
        - localhost
      labels:
        job: dnsmasq
        env: production
        host: bttrm-prod-console
        __path__: /var/log/dnsmasq.log

Обратите внимание на то, что конечные точки Локи были изменены с момента моей последней настройки, теперь это /loki/api/v1/push Анкет

См. Документацию API Loki Здесь >>> Анкет

На данный момент — давайте запустим его без Docker Compose — у меня есть полные экспортеры мониторинга, и позже добавит к нему выпускной хвост:

root@bttrm-production-console:/opt/prometheus-client# docker run -ti -v /opt/prometheus-client/promtail-dev.yml:/etc/promtail/promtail.yml grafana/promtail:master-2739551 -config.file=/etc/promtail/promtail.yml
Unable to find image 'grafana/promtail:master-2739551' locally
master-2739551: Pulling from grafana/promtail
...
Status: Downloaded newer image for grafana/promtail:master-2739551
level=warn ts=2019-11-16T09:29:00.668750217Z caller=filetargetmanager.go:98 msg="WARNING!!! entry_parser config is deprecated, please change to pipeline_stages"
level=info ts=2019-11-16T09:29:00.669077956Z caller=server.go:121 http=[::]:9080 grpc=[::]:45421 msg="server listening on addresses"
level=info ts=2019-11-16T09:29:00.66921034Z caller=main.go:65 msg="Starting Promtail" version="(version=, branch=, revision=)"
level=info ts=2019-11-16T09:29:05.669176878Z caller=filetargetmanager.go:257 msg="Adding target" key="{env="production", host="bttrm-prod-console", job="dnsmasq"}"

Э -э …

И почему бревна не хвоста? Должен быть » msg =» string file file «path =/var/log/dnsmasq.log «

А что случилось с Локи?

Какова ошибка «_ , подключающаяся к данным данных: источник данных подключен, но не полученные метки. Убедитесь, что Loki и Promtail настроены правильно _» ошибка?

Ну, можно попытаться воссоздать контейнеры:

root@monitoring-dev:/opt/loki# docker rm loki_grafana_1 loki_promtail_1
loki_grafana_1
loki_promtail_1

Хорошо — это помогло, Локи вернулся.

И журналы не были собраны, потому что я забыл установить /var/log к Выпускной хвост Контейнер — добавьте -v/var/log:/var/log в его запустить Куманд:

root@bttrm-production-console:/home/admin# docker run -ti -v /opt/prometheus-client/promtail-dev.yml:/etc/promtail/promtail.yml -v /var/log:/var/log grafana/promtail:master-2739551 -config.file=/etc/promtail/promtail.yml
level=warn ts=2019-11-16T09:48:02.248719806Z caller=filetargetmanager.go:98 msg="WARNING!!! entry_parser config is deprecated, please change to pipeline_stages"
level=info ts=2019-11-16T09:48:02.249227598Z caller=server.go:121 http=[::]:9080 grpc=[::]:39883 msg="server listening on addresses"
level=info ts=2019-11-16T09:48:02.249381673Z caller=main.go:65 msg="Starting Promtail" version="(version=, branch=, revision=)"
level=info ts=2019-11-16T09:48:07.249262647Z caller=filetargetmanager.go:257 msg="Adding target" key="{env="production", host="bttrm-prod-console"}"
level=info ts=2019-11-16T09:48:07.24943453Z caller=tailer.go:77 component=tailer msg="start tailing file" path=/var/log/dnsmasq.log
ts=2019-11-16T09:48:07.249544341Z caller=log.go:124 component=tailer level=info msg="Seeked /var/log/dnsmasq.log - &{Offset:0 Whence:0}"

Сейчас есть журналы:

LogQl — Агрегация и счетчики локей Локи

Вот самая интересная часть начинается — Logql и функции агрегации/подсчета.

Тем не менее, мне пришлось провести некоторое время, прежде чем сделать это, как документация Графаны и Локи, не ясно обо всех деталях.

Локи «Ошибка внутреннего сервера»

Если попробуйте выполнить запрос, как count_over_time ({job = "dnsmasq"} [5m]) — увидит ошибку внутреннего сервера:

И это вызвано… пробелами!

Исправьте это — добавьте пробелы между брекетами, но теперь Графана просто ничего не может найти:

count_over_time( {job="dnsmasq"}[5m] )

Прометей как… Локи? О

Это было немного странно, но это работает)

Кроме того, это нигде не задокументировано, но я нашел это «решение» в grafana.slack.com сообщество.

В Графане 6.5 Локи должен поддерживать функции нормальным образом, но пока — давайте сделаем что -нибудь странное.

Перейти к DataSources и добавить Прометей — но как Локи Анкет

Или Локи — как Прометея?

В любом случае, выбрать тип Prometheus, но в URL укажите http://loki: 310/loki — с /loki в конце:

И проверить:

Большой!

показатель()

Попробуем назвать что -то вроде rate () + regex, чтобы выбрать имена хостов из DNSMASQ S LOG:

«Оно работает!»

Кстати, Grafana отображает функции и их описания, когда вы начнете печатать их:

Выпускные конвейеры

И одна новая (?) Интересная вещь в Выпускной хвост — Не могу помнить, что это было год назад — Стадии трубопровода Анкет

Документация Здесь >>> Анкет

В своем оригинале:

Трубопровод используется для преобразования одной линии журнала, ее меток и его временной метки. Трубопровод состоит из набора этапы Анкет Есть 4 типа этапов:

  1. Сцены анализа Проанализируйте текущую строку журнала и извлеките из нее данные. Извлеченные данные затем доступны для использования на других этапах.
  2. Стадии преобразования Преобразование извлеченных данных с предыдущих этапов.
  3. Стадии действия Возьмите извлеченные данные с предыдущих этапов и сделайте с ними что -то. Действия могут:
  4. Добавить или изменить существующие этикетки в строку журнала
  5. Измените временную метку линии журнала
  6. Измените содержимое строки журнала
  7. Создайте метрику на основе извлеченных данных

Сцены фильтрации Необязательно применить подмножество этапов или записей сброса на основе какого -либо условия.

Итак, в краткосрочной перспективе — вы можете создать конвейер для данных с этапами множества.

Этапы могут быть:

  1. Сцены анализа : проанализируется журнал и извлечь данные, чтобы пройти его на следующие этапы
  2. Стадии преобразования : преобразует данные с предыдущего этапа (ы)
  3. Стадии действия : получает данные с предыдущих этапов и может: Can:

    • Добавить/удалить этикетки
    • Изменить временную метку
    • Изменить строку журнала
    • Создать метрики) на основе извлеченных данных

Типичные трубопроводы начнутся со стадии анализа (например, regex или json stage) для извлечения данных из строки журнала. Затем будет присутствовать серия этапов действия, чтобы сделать что -то с этими извлеченными данными. Наиболее распространенной стадией действия будет Ярлыки Стадия, чтобы повернуть извлеченные данные в этикетку.

Давайте вернемся к самому началу всей этой истории — чего мы хотим достичь?

Мы хотим получить все запросы на наши DNSMASQ , Извлеките имена хоста и отобразить график — сколько запросов было выполнено для определенного доменного имени.

Таким образом, нам нужно:

  • Возьмите все в запросах
  • Сохраните каждый на этикетке
  • и посчитайте их

Перейти к Выпускной хвост На производстве и добавьте этапы — обновите PROMTAIL-DEV.YML Файл конфигурации:

server:
  http_listen_port: 9080
  grpc_listen_port: 0
positions:
  filename: /tmp/positions.yaml
client:
  url: http://dev.loki.example.com:3100/loki/api/v1/push
scrape_configs:
  - job_name: dnsmasq
    static_configs:
    - targets:
        - localhost
      labels:
        job: dnsmasq
        env: production
        host: bttrm-prod-console
        __path__: /var/log/dnsmasq.log
    pipeline_stages:
    - match:
        selector: '{job="dnsmasq"}'
        stages:
        - regex:
            expression: ".*query\\[A\\] (?P.*\\s)"
        - labels:
            query:

В Pipeline_stages мы тут:

  1. выбрал DNSMASQ работа
  2. Создайте стадию режима, которая выбирает все строки с запрос [a] нить

    1. Создать группу режима под названием запрос , где сохранение в результате строка до первого пространства, то есть источника строки: 16 ноября 08:23:33 DNSMASQ [17597]: запрос [a] Backend-db3-master.example.com с 127.0.0.1 и в запрос Группа Regex получит значение: Backend-db3-master.example.com
  3. Создать Ярлыки этап, который прикрепит новый ярлык под названием запрос с Backend-db3-master.example.com ценность, взятая из запрос Группа режима

Запустить Выпускной хвост :

root@bttrm-production-console:/home/admin# docker run -ti -v /opt/prometheus-client/promtail-dev.yml:/etc/promtail/promtail.yml -v /var/log:/var/log grafana/promtail:master-2739551 -config.file=/etc/promtail/promtail.yml

level=info ts=2019-11-16T11:56:29.760425279Z caller=server.go:121 http=[::]:9080 grpc=[::]:32945 msg="server listening on addresses"

level=info ts=2019-11-16T11:56:29.760565845Z caller=main.go:65 msg="Starting Promtail" version="(version=, branch=, revision=)"

level=info ts=2019-11-16T11:56:34.760567558Z caller=filetargetmanager.go:257 msg="Adding target" key="{env="production", host="bttrm-prod-console", job="dnsmasq"}"

level=info ts=2019-11-16T11:56:34.760752715Z caller=tailer.go:77 component=tailer msg="start tailing file" path=/var/log/dnsmasq.log

ts=2019-11-16T11:56:34.760863031Z caller=log.go:124 component=tailer level=info msg="Seeked /var/log/dnsmasq.log - &{Offset:0 Whence:0}"

Проверьте график Графаны:

И создать запрос, как:

sum (rate( ( {env="production",query=~".*\\..*"} )[5m] )) by (query)

В Query = ~ ".*\\ ..*" Мне пришлось создать «хруст», чтобы избавиться от данных без лейбла запроса, но я думаю, что это должен быть более правильный способ сделать это. На данный момент — я могу оставить эту штуку.

Посмотрим на результат:

Потрясающий!

Хорошо…

И имена хостов, есть от нить…

Почему?

Используйте https://regex101.com , исправить регулярность, результат:

.*query\[A\] (?P[^\s]+)

Обновление выпускной хвост S Config:

...
    pipeline_stages:
    - match:
        selector: '{job="dnsmasq"}'
        stages:
        - regex:
            expression: ".*query\\[A\\] (?P[^\\s]+)"
        - labels:
            query:

DNS DNS DNS

Хорошо, в целом — мы видели, что это сработает. Теперь давайте попробуем создать приборную панель, которая соединит все в хороший график со всеми статистиками запросов DNS.

Нажмите на Добавить запрос :

Добавьте наш запрос:

sum (rate( ( {env="production", query=~".*\\..*"} )[5m] )) by (query)

В Легенда Используйте замену запрос Чтобы отобразить только значение:

Хорошо, неплохо …

Давайте добавим несколько переменных, чтобы сделать возможным выбрать запросы.

Перейти к Настройки панели панели> переменные> Добавить переменную , и…

Шаблонные переменные, все еще не поддерживаемые для Loki:-(

Или я просто не нашел правильного способа выполнить label_values () Для Локи …

Документация Здесь >>> Анкет

Хочу создать переменную со значениями из запрос Метка, чтобы иметь возможность выбрать конкретное доменное имя, но — увы…

Хорошо, пока, может сделать просто простой фильтр — создать переменную с Текстовое поле тип:

И выбрать среду — создать Обычай Тип переменной:

Вернитесь к запросу, обновите его, чтобы использовать эти переменные:

sum (rate( ( {env="$env", query=~"$include"} )[5m] )) by (query)

И протестируйте его с помощью фильтра по домену:

И результатом является панель панели Grafana со статистикой по запросам DNS -HostName:

Полезные ссылки

Подобные посты

Оригинал: «https://dev.to/setevoy/grafana-loki-the-logql-s-prometheus-like-counters-aggregation-functions-and-dnsmasq-s-requests-graphs-4min»