В последний раз, когда я настроил Loki для сбора журналов и мониторинга в феврале 2019 года — почти год назад, см. Grafana Labs: Loki — Система сбора и мониторинга журналов Пост, когда Локи был в своем бета -состоянии.
Теперь мы столкнулись с исходящими проблемами движения в нашей производственной среде и не можем найти, кто виновен в этом.
Один из способов попытаться поймать его, чтобы собрать статистику о запросах DNS, а затем посмотреть, есть ли корреляция между просьбами выхода и запросами DNS на хостах AWS EC2 с локальным DNSMASQ
Сервисы.
DNSMASQ
Конфигурация описана в DNSMASQ: AWS — «Временный сбой в разрешении имени», журналы, отладка и размер кэша DNSMASQ Сообщение, и в этом мы постараемся понять следующее:
DNSMASQ
записывает все запросы в локальный журнал- Журнал хвоста
Выпускной хвост
который отправляет данные на хост мониторинга с Loki - И, наконец, Графана будет нарисовать графики, основываясь на данных из Локи
Настройка, описанная ниже, является большим доказательством концепции, поскольку сама Локи и ее поддержка в Графане все еще находятся в стадии разработки.
Но теперь функция исследования в Графане поддерживает агрегацию и подсчет функций аналогично Прометеусу — sum ()
, rate ()
, и т.д.
Выпускной хвост
В течение последнего года также добавили несколько новых интересных способностей, которые мы будем использовать в этом посте.
Сначала мы раскрутим обычный Grafana + Loki + Выпускной хвост
Stack, затем добавит журналы, собирающие из нашей производственной среды и, наконец, добавят панель панели Grafana, используя функции New LogQl
Пойдем!
- Локи, старт
- Grafana Start
- Nginx
- Выпускной старт
- Журналы Promtail и DNSMASQ
- LogQl — Агрегация и счетчики локей Локи
- Локи «Ошибка внутреннего сервера»
- Прометей как… Локи? О
- показатель()
- Выпускные конвейеры
- DNS DNS DNS
Локи, старт
Локи начнет с 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 типа этапов:
- Сцены анализа Проанализируйте текущую строку журнала и извлеките из нее данные. Извлеченные данные затем доступны для использования на других этапах.
- Стадии преобразования Преобразование извлеченных данных с предыдущих этапов.
- Стадии действия Возьмите извлеченные данные с предыдущих этапов и сделайте с ними что -то. Действия могут:
- Добавить или изменить существующие этикетки в строку журнала
- Измените временную метку линии журнала
- Измените содержимое строки журнала
- Создайте метрику на основе извлеченных данных
Сцены фильтрации Необязательно применить подмножество этапов или записей сброса на основе какого -либо условия.
Итак, в краткосрочной перспективе — вы можете создать конвейер для данных с этапами множества.
Этапы могут быть:
- Сцены анализа : проанализируется журнал и извлечь данные, чтобы пройти его на следующие этапы
- Стадии преобразования : преобразует данные с предыдущего этапа (ы)
Стадии действия : получает данные с предыдущих этапов и может: 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
мы тут:
- выбрал
DNSMASQ
работа Создайте стадию режима, которая выбирает все строки с запрос [a] нить
- Создать группу режима под названием запрос , где сохранение в результате строка до первого пространства, то есть источника строки: 16 ноября 08:23:33 DNSMASQ [17597]: запрос [a] Backend-db3-master.example.com с 127.0.0.1 и в запрос Группа Regex получит значение: Backend-db3-master.example.com
- Создать
Ярлыки
этап, который прикрепит новый ярлык под названием запрос с 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:
Полезные ссылки
- Графана исследуется
- Использование Локи в Графане
- Logql: Журнал «Язык запросов»
- Метки из журналов
- Loki’s HTTP API
- Настройка выпускного хвоста
- Трубопроводы выпускного хвоста
- Ссылка на регулярное выражение: названные группы и обратные секции
- Grafana Labs: Loki — Распределенная система, этикетки и фильтры
- Labs Grafana: Loki — Использование AWS S3 в качестве хранения данных и DynamoDB для индексов
- Прометея: мониторинг блога RTFM настроен с Ansible — Grafana, Loki и Promtail
Подобные посты
- 03/10/2019 Прометея: мониторинг блога RTFM настроен с Ansible — Grafana, Loki и Promtail
- 02/13/2019 Labs Grafana: Loki — Использование AWS S3 в качестве хранения данных и DynamoDB для индексов
- 02/07/2019 Grafana Labs: Loki — Распределенная система, этикетки и фильтры
Оригинал: «https://dev.to/setevoy/grafana-loki-the-logql-s-prometheus-like-counters-aggregation-functions-and-dnsmasq-s-requests-graphs-4min»