Level error component activequerytracker msg failed to create directory for logging active queries

How can we monitor bot performance via grafana

  • Knowledge Requirement

  • Introduction

  • Setup

    • Docker compose file
    • Docker compose start
  • Complete docker compose

  • FTMetric

    • Docker helpful commands
  • Prometheus

    • Prometheus config file
    • Example
    • Prometheus Docker compose
    • Troubleshooting
  • Grafana

    • Setup

  1. docker — Basic requires for understand what is docker/docker-compose.

I spent ~2 week for setup freqtrade and dependencies on my personal raspberry PI4.

Above image is the simplified version. How it works is Prometheus will call ftmetric to information and save to internal database. Grafana will fetch data from Prometheus via PromQL and show it as beautiful graph.

I’m using docker-compose as it support run multiple docker containers in single file and very easy to setup.

First you need docker-compose.yml file (more detail here). This file will contain all component (docker container) you need to run full-stack freqtrade-grafana. If you not familar with yml syntax, you might take a look on Wiki. If you don’t know how to start, I provided simple docker-compose.yml

Important config in docker-compose file.

  1. version — This should place on first line in the file (I recommend to use version 3)
version: "3"
  1. services — This will contains each of docker container
services:
  <service_name>:
    image: <image_name>:<image_tag>

Next, on each service you can setup parameters, environment or command to execute, here is impartant config you might need. Below configuration must place in <service_name> in docker-compose.yml

I recommend to use static version to avoid break change.
Static version is version with following format vX.X.X where X is number

  1. image — image name and version to use
  2. restart — what do you need when container is down
  3. ports — expose port from docker container to local machine. This will make you able to call application from local machine
  4. volumes — Normally after docker is stopped, all data in that container will be deleted as well. You can map data from directory/files to either local machine or docker internal volume, and data will stand forever (until you manually delete it)
  5. depends_on — To start current container after depends_on list. Warning: This NOT wait application to fully started, it only wait docker to start
  6. environment — Additional environment variable in containers
  7. healthcheck — Help docker understand when ever application is down or crash
  8. user — Override user (uid) in docker container by add user: "1000" in docker-compose file (not recommend)
  9. extra_hosts — You can add "host.docker.internal:host-gateway" for calling local machine inside docker network

After you have file. You can run follow command in same directory of docker-compose.yml

# create and start and monitor docker-compose logs
docker-compose up
# create start docker-compose in background
docker-compose up -d
# only stop docker containers
docker-compose stop
# stop and delete all data relate to this docker-compose
docker-compose down

This is my simplied docker-compose.yml

Docker: https://github.com/kamontat/fthelper/pkgs/container/ftmetric

I did open ftmetric source on Github today. On repository will decribe more how to configure and use this.

For short descibe. Ftmetric is prometheus exporter. It will call freqtrade rest apis to get information and show as formatted syntax when someone call /metrics endpoint.

This should use for POC only, NOT recommend for production

# show help
docker run --rm -it ghcr.io/kamontat/ftmetric --help
# show all config listed on this script
docker run --rm -it ghcr.io/kamontat/ftmetric --list-config
# quick run
docker run --rm -it -p 8090:8090 ghcr.io/kamontat/ftmetric 
  freqtrade.url=http://localhost:8080 
  freqtrade.username=freqtrader 
  freqtrade.password=verysecretpassword

Prometheus is time-series database. It need target (ftmetric) to pull data from. To config prometheus, you need prometheus config which will configure prometheus settings.

More detailed: https://prometheus.io/docs/prometheus/latest/configuration/configuration/

global:
  scrape_interval: 1m
  scrape_timeout: 5s
scrape_configs:
  - job_name: freqtrade
    static_configs:
      - targets:
        - "ftmetric:8090"
  1. scrape_interval — how many time prometheus wait before pulling new data
  2. scrape_timeout — if target response time above timeout, it will force fail and try again new pulling
  3. scrape_configs — contains targets to pull
    1. job_name — name show in prometheus metric label
    2. targets — pulling url, you can use <service_name> in docker-compose file as hostname if pulling from other docker container OR host.docker.internal if call it local machine (require setup extra_hosts in docker)

Check latest version first

The extra_host will allow you to call server on your server (not in docker) by replacing localhost with host.docker.internal. This might be handy if you run your bot outside docker.

prometheus:
  image: prom/prometheus:v2.28.0
  restart: on-failure
  # be aware that prometheus DOES NOT have builtin authentication
  # ports:
  #   - 9090:9090
  volumes:
    # you can config prometheus via this directory (prometheus.yml)
    - ./prometheus/config:/etc/prometheus/
  command:
    - "--config.file=/etc/prometheus/prometheus.yml"
  extra_hosts:
    - "host.docker.internal:host-gateway"

If you found following logs, It might because you didn’t has permission. You can either add permission to directory that you map from (recommend) or override uesr id in docker-compose

level=error ts=2021-07-06T10:44:08.309Z caller=query_logger.go:109 component=activeQueryTracker msg="Failed to create directory for logging active queries"
level=error ts=2021-07-06T10:44:08.309Z caller=query_logger.go:87 component=activeQueryTracker msg="Error opening query log file" file=data/queries.active err="open data/queries.active: no such file or directory"
panic: Unable to create mmap-ed active query log

Grafana is data visualization. Basically It can be replace freqUI. What Grafana do is query data from datasource and show them as beautiful graph. Default port of grafana is 3000

I already cover how to start/run grafana in docker-compose section. So I assume that you should able to open grafana at <host>:3000. Below is steps you need to setup grafana before it can query data

  1. Add datasource via Configuration

  1. Add Prometheus datasource with following config
    1. url — prometheus:9090 or name of docker-compose <service_name>
  2. (optional) Additional of prometheus, you can add database as well (either postgres or sqlite)
  3. (optional) Import predefined dashboard at 14632

I am trying to setup Prometheus as a service on Linux to monitor external Linux nodes. However I design the systemd service (on my monitor node) seems to fail. My OS is Ubuntu 20.04.3 LTS and I’m runing Prometheus version prometheus-2.31.1.linux-amd64.

My systemd service is setup like this:

    [Unit]
    Description=Prometheus Server
    Wants=network-online.target
    After=network-online.target
    Requires=prometheus.service

    [Service]
    User=usr
    Group=usr
    Type=simple
    ExecStart= /home/usr/Downloads/prometheus-2.31.1.linux-amd64/prometheus --config.file=/home/usr/Downloads/prometheus-2.31.1.linux-amd64/prometheus.yml
    
    
    [Install]
    WantedBy=multi-user.target

When I try to run the service manually I get the following error:

prometheus.service - Prometheus Server
     Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Sun 2022-01-02 18:50:38 CST; 17min ago
   Main PID: 1411 (code=exited, status=2)

Jan 02 18:50:38 monitor prometheus[1411]: ts=2022-01-03T00:50:38.975Z caller=query_logger.go:109 level=error component=activeQueryTracker msg="Failed to create directory for logging active queries"
Jan 02 18:50:38 monitor prometheus[1411]: ts=2022-01-03T00:50:38.975Z caller=query_logger.go:87 level=error component=activeQueryTracker msg="Error opening query log file" file=data/queries.active err="open data/queries.active: no such file or directory"
Jan 02 18:50:38 monitor prometheus[1411]: panic: Unable to create mmap-ed active query log
Jan 02 18:50:38 monitor prometheus[1411]: goroutine 1 [running]:
Jan 02 18:50:38 monitor prometheus[1411]: github.com/prometheus/prometheus/promql.NewActiveQueryTracker({0x2bda6f0, 0x5}, 0x14, {0x34442c0, 0xc0003f2320})
Jan 02 18:50:38 monitor prometheus[1411]:         /app/promql/query_logger.go:117 +0x3d7
Jan 02 18:50:38 monitor prometheus[1411]: main.main()
Jan 02 18:50:38 monitor prometheus[1411]:         /app/cmd/prometheus/main.go:491 +0x6bbf
Jan 02 18:50:38 monitor systemd[1]: prometheus.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Jan 02 18:50:38 monitor systemd[1]: prometheus.service: Failed with result 'exit-code'.

Can anyone help me to understand where I am going wrong? The user has permissions to execute all the files and I have tried adding new user profiles just for the service with little success. Any help on better diagnosing the issue or possible fixes would be greatly appreciated.

TLDR; I agree this is not a prometheus issue, but here is how to reproduce and fix.

We will demonstrate with docker compose, but the above statements of making sure the data volume on the outside needs to match permissions of the user running the service in the container, is spot on. So whatever UID/GID you define, that needs to be set on the mapped volume.

Create Files
/opt/prom/docker-compose.yml

version: '2'
volumes:
  local_volume:
    external: false
services:
  prometheus:
    image: prom/prometheus:v2.20.1
    container_name: prometheus
    volumes:
      - local_volume:/prometheus
      - /opt/prom/prometheus.yml:/opt/prom/prometheus.yml
    ports:
      - 9090:9090
    command:
      - '--config.file=/opt/prom/prometheus.yml'
    logging:
      driver: "json-file"
    user: 9090:9090

/opt/prom/prometheus.yml (with permissions set to 9090:9090)

global:
  scrape_interval: 10s # By default, scrape targets every 10 seconds.
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets:
        - 'prometheus:9090'

change to directory with docker compose file cd /opt/prom

Run docker-compose up -d

the prometheus container fails to start and docker logs prometheus give error we’re all seeing:

$ docker logs prometheus
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:308 msg="No time or size retention was set so using the default time retention" duration=15d
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:343 msg="Starting Prometheus" version="(version=2.20.1, branch=HEAD, revision=983ebb4a513302315a8117932ab832815f85e3d2)"
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:344 build_context="(go=go1.14.6, user=root@7cbd4d1c15e0, date=20200805-17:26:58)"
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:345 host_details="(Linux 3.10.0-1127.13.1.el7.x86_64 #1 SMP Tue Jun 23 15:46:38 UTC 2020 x86_64 5242e61b2ce2 (none))"
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:346 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:347 vm_limits="(soft=unlimited, hard=unlimited)"
level=error ts=2020-08-12T22:09:03.542Z caller=query_logger.go:109 component=activeQueryTracker msg="Failed to create directory for logging active queries"
level=error ts=2020-08-12T22:09:03.542Z caller=query_logger.go:87 component=activeQueryTracker msg="Error opening query log file" file=data/queries.active err="open data/queries.active: no such file or directory"
panic: Unable to create mmap-ed active query log

goroutine 1 [running]:
github.com/prometheus/prometheus/promql.NewActiveQueryTracker(0x2869f4c, 0x5, 0x14, 0x30898a0, 0xc0008f1b60, 0x30898a0)
        /app/promql/query_logger.go:117 +0x4cd
main.main()
        /app/cmd/prometheus/main.go:374 +0x4f08

We created a local_volume for data storage, we can see that with

$ docker volume ls
DRIVER              VOLUME NAME
local               prom_local_volume

we can FIX the permission in the volume
docker run -it --rm --entrypoint=sh -v prom_local_volume:/prometheus --user 0:0 prom/prometheus:v2.20.1 -c "chown -R 9090:9090 /prometheus/."

now start prometheus again: docker-compose up -d

and now the logs show how they should

$ docker logs prometheus
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:308 msg="No time or size retention was set so using the default time retention" duration=15d
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:343 msg="Starting Prometheus" version="(version=2.20.1, branch=HEAD, revision=983ebb4a513302315a8117932ab832815f85e3d2)"
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:344 build_context="(go=go1.14.6, user=root@7cbd4d1c15e0, date=20200805-17:26:58)"
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:345 host_details="(Linux 3.10.0-1127.13.1.el7.x86_64 #1 SMP Tue Jun 23 15:46:38 UTC 2020 x86_64 28fabd353fe7 (none))"
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:346 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:347 vm_limits="(soft=unlimited, hard=unlimited)"
level=error ts=2020-08-12T22:26:58.035Z caller=query_logger.go:109 component=activeQueryTracker msg="Failed to create directory for logging active queries"
level=error ts=2020-08-12T22:26:58.035Z caller=query_logger.go:87 component=activeQueryTracker msg="Error opening query log file" file=data/queries.active err="open data/queries.active: no such file or directory"
panic: Unable to create mmap-ed active query log

goroutine 1 [running]:
github.com/prometheus/prometheus/promql.NewActiveQueryTracker(0x2869f4c, 0x5, 0x14, 0x30898a0, 0xc000763aa0, 0x30898a0)
        /app/promql/query_logger.go:117 +0x4cd
main.main()
        /app/cmd/prometheus/main.go:374 +0x4f08
level=info ts=2020-08-12T22:27:12.270Z caller=main.go:308 msg="No time or size retention was set so using the default time retention" duration=15d
level=info ts=2020-08-12T22:27:12.271Z caller=main.go:343 msg="Starting Prometheus" version="(version=2.20.1, branch=HEAD, revision=983ebb4a513302315a8117932ab832815f85e3d2)"
level=info ts=2020-08-12T22:27:12.271Z caller=main.go:344 build_context="(go=go1.14.6, user=root@7cbd4d1c15e0, date=20200805-17:26:58)"
level=info ts=2020-08-12T22:27:12.271Z caller=main.go:345 host_details="(Linux 3.10.0-1127.13.1.el7.x86_64 #1 SMP Tue Jun 23 15:46:38 UTC 2020 x86_64 28fabd353fe7 (none))"
level=info ts=2020-08-12T22:27:12.271Z caller=main.go:346 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2020-08-12T22:27:12.271Z caller=main.go:347 vm_limits="(soft=unlimited, hard=unlimited)"
level=info ts=2020-08-12T22:27:12.272Z caller=main.go:684 msg="Starting TSDB ..."
level=info ts=2020-08-12T22:27:12.273Z caller=web.go:524 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2020-08-12T22:27:12.286Z caller=head.go:641 component=tsdb msg="Replaying on-disk memory mappable chunks if any"
level=info ts=2020-08-12T22:27:12.286Z caller=head.go:655 component=tsdb msg="On-disk memory mappable chunks replay completed" duration=5.072µs
level=info ts=2020-08-12T22:27:12.286Z caller=head.go:661 component=tsdb msg="Replaying WAL, this may take a while"
level=info ts=2020-08-12T22:27:12.286Z caller=head.go:713 component=tsdb msg="WAL segment loaded" segment=0 maxSegment=0
level=info ts=2020-08-12T22:27:12.286Z caller=head.go:716 component=tsdb msg="WAL replay completed" checkpoint_replay_duration=38.475µs wal_replay_duration=160.427µs total_replay_duration=224.678µs
level=info ts=2020-08-12T22:27:12.287Z caller=main.go:700 fs_type=XFS_SUPER_MAGIC
level=info ts=2020-08-12T22:27:12.287Z caller=main.go:701 msg="TSDB started"
level=info ts=2020-08-12T22:27:12.287Z caller=main.go:805 msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
level=info ts=2020-08-12T22:27:12.289Z caller=main.go:833 msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml
level=info ts=2020-08-12T22:27:12.289Z caller=main.go:652 msg="Server is ready to receive web requests."

the logs still show the first run logs/error message

prometheus is available

$ curl localhost:9090
<a href="/graph">Found</a>.

can get the metrics as well: curl localhost:9090/metrics

The data should be stored off the host in a NFS or docker driver mount of some sort (NetApp Trident Plugin)

Hope this helps,
Peter

Отслеживать состояние сервера и запущенных на нём процессов очень важно чтобы иметь возможность вовремя оптимизировать настройки, исправить ошибки или реагировать на повышенную нагрузку. Существует множество систем мониторинга для Linux различной сложности. В этой статье речь пойдёт про Prometheus.

Эта система мониторинга состоящая из нескольких компонентов, написанных на языке программирования Golang. Основной компонент Prometheus — это база данных для хранения метрик. Ещё есть компоненты *_exporter для сбора данных с различных сервисов и компонент alertmanager для отправки уведомлений. Кроме того, для отображения метрик в удобном виде принято использовать Grafana. Давайте же рассмотрим как выполняется установка и настройка Prometheus на примере Ubuntu 20.04.

1. Установка Prometheus

Вы можете установить Prometheus из официальных репозиториев в Ubuntu. Вы можете посмотреть какие пакеты prometheus доступны можно такой командой:

sudo apt search prometheus

Для установки выполните команду:

sudo apt install prometheus

Однако в репозиториях содержится уже старая версия программы. Если вы хотите самую свежую версию, то придется скачать её из официального сайта. Поскольку программа написана на Golang, то и распространяется она в виде одного исполняемого файла. Поэтому установить её не сложно, достаточно скачать архив, распаковать и скопировать исполняемый файл в папку /usr/local/bin, также надо будет скопировать несколько исполняемых файлов.

Сначала скачайте пакет Prometheus с официальной страницы GitHub. Для Linux нужен пакет с исполняемыми файлами linux-amd64:

Загруженный документ надо распаковать. Для этого можно воспользоваться утилитой tar:

tar xvf ~/Загрузки/prometheus-2.26.0.linux-amd64.tar.gz

Затем скопируйте исполняемые файлы prometheus и promtool в папку /usr/local/bin:

sudo cp ~/Загрузки/prometheus-2.26.0.linux-amd64/prometheus /usr/local/bin

sudo cp ~/Загрузки/prometheus-2.26.0.linux-amd64/promtool /usr/local/bin

Для конфигурационных файлов необходимо создать папку /etc/prometheus:

sudo mkdir /etc/prometheus

Затем скопируйте туда такие папки с конфигурационными файлами:

sudo cp -r ~/Загрузки/prometheus-2.26.0.linux-amd64/consoles /etc/prometheus

sudo cp -r ~/Загрузки/prometheus-2.26.0.linux-amd64/console_libraries /etc/prometheus

В них содержатся файлы для работы веб-интерфейса программы. Кроме того, нужно создать конфигурационный файл /etc/prometheus/prometheus.yml со следующим содержимым:

sudo vi /etc/prometheus/prometheus.yml

global:
  scrape_interval: 15s
scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']

Здесь сказано, что по умолчанию интервал сбора данных составляет 15 секунд, а также добавлена задача по сборку данных с самого Prometheus. Никаких данных о состоянии сервера там не будет, только параметры работы программы.

Для запуска программы понадобится пользователь prometheus:

sudo useradd --no-create-home --shell /bin/false prometheus

Осталось только создать файл systemd службы для удобного запуска prometheus. Для этого выполните команду:

sudo systemctl edit --full --force prometheus.service

[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus
--config.file /etc/prometheus/prometheus.yml
--storage.tsdb.path /var/lib/prometheus/
--web.console.templates=/etc/prometheus/consoles
--web.console.libraries=/etc/prometheus/console_libraries
[Install]
WantedBy=multi-user.target

2. Запуск Prometheus

После этого можно запустить Prometheus и проверить его работу. Для этого выполните:

sudo systemctl start prometheus

Затем для того чтобы убедится что всё запустилось выполните:

sudo systemctl status prometheus

Обратите внимание на строчку Active. Её значение должно быть active (running). Если там что-то другое, значит программа не запустилась, и вы можете посмотреть лог ниже чтобы понять причину.

3. Доступ к веб-интерфейсу

Если программа запущена, вы можете получить доступ к веб-интерфейсу в браузере. Откройте порт 9090 на сервере, куда вы устанавливали Prometheus:

Чтобы убедится, что сбор данных для сервиса prometheus работает откройте меню Status -> Targets. Здесь должна отображаться одна цель prometheus:

Спустя некоторое время можно попытаться построить график из собранных данных. Для этого вернитесь на главную страницу и в строке Expression наберите go_memstats_frees_total. Затем перейдите на вкладку Graph:

Будет отображен график этого показателя. С помощью поля Expression можно смотреть какие метрики уже собираются и просматривать их значения. Метрика go_memstats_frees_total стандартная для каждого экспортера данных и обычно для отображения на графиках не используется.

4. Установка Grafana

Смотреть графики Prometheus в его веб-интерфейсе не удобно и не практично. Там вы можете только убедится, что всё собирается верно. Для просмотра графиков же следует использовать Grafana. Для её установки надо сначала установить несколько компонентов:

sudo apt install -y apt-transport-https
sudo apt install -y software-properties-common

Затем добавьте ключ репозитория в систему:

curl -s https://packages.grafana.com/gpg.key | sudo gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/grafana_key.gpg --import

И добавьте сам репозиторий:

echo "deb https://packages.grafana.com/enterprise/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

После этого обновите список пакетов в репозиториях и установите Grafana:

sudo apt update
sudo apt install grafana

5. Настройка Grafana для Prometheus

По умолчанию Grafana доступна на порту 3000. Логин и пароль при первом входе: admin и admin соответственно. Я не буду расписывать первоначальную настройку. Об этом читайте здесь. Когда войдете в интерфейс программы, откройте Configuration -> Data Sources и нажмите кнопку Add Data Source:

В открывшемся окне выберите тип Data SourcePrometheus:

На шаге настройки подключения необходимо в поле URL ввести адрес сервера, на котором доступен Prometheus и его порт. Если Grafana находится на той же машине, что и Prometheus можно использовать localhost, а порт по умолчанию 9090:

После этого нажмите Save and Test и вы должны увидеть что тест прошёл успешно.

После этого можно переходить к созданию досок.

6. Импорт доски Prometheus в Grafana

Доску для метрик, собираемых по умолчанию сервером Prometheus можно взять здесь. На этой странице вам нужен только идентификатор 3362, который находится под надписью Get this dashboard:

Эта доска специально разработана для экспортера Prometheus и отображает с него данные. Для её добавления в интерфейсе Grafana откройте Dashboards -> Manage -> Import и введите идентификатор доски:

Затем нажмите кнопку Load и на следующей странице введите имя доски и выберите ранее созданный источник данных (Data source). В этом примере он называется Prometheus:

После нажатия на кнопку Import перед вами откроется доска с метриками, её можно уже настроить так, как вам необходимо:

7. Установка Node Exporter

Данные в Prometheus поступают из так называемых экспортёров, программ, которые делают различные метрики доступными по HTTP адресу /metrics. Сервер Prometheus регулярно опрашивает такие экспортёры и собирает с них данные. Экспортеры существуют для различных служб и сервисов, например, для Nginx, MySQL, PHP-FPM, Apache ну и естественно экспортёр общих сведений о сервере. Такой экспортёр называется Node_exporter. Он тоже написан на Golang как и большинство экспортёров для Prometheus. Аналогично основному компоненту его можно установить из официальных репозиториев Ubuntu:

sudo apt install prometheus-node-exporter

Или можно получить последнюю версию из страницы на GitHub. После загрузки распакуйте её:

tar -xvf ~/Загрузки/node_exporter-1.1.2.tar.gz

Затем скопируйте исполняемый файл программы в /usr/local/bin:

cp ~/Загрузки/node_exporter-1.1.2/node_exporter /usr/local/bin

Далее создайте пользователя, от имени которого будете запускать программу:

sudo useradd --no-create-home --shell /bin/false node_exporter

И создайте юнит файл systemd для её запуска:

sudo systemctl edit --full --force node_exporter.service

[Unit]
Description=Prometheus Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target

Шаг 8. Настройка node_exporter

Далее необходимо запустить node_exporter. Для этого выполните такую команду:

sudo systemctl start node_exporter

Затем проверьте состояние сервиса:

sudo systemctl status node_exporter

Как и в случае с Prometheus состояние должно быть active (running):

А в логах вы можете найти на каком порту ожидает подключений этот экспортёр. Именно в этих логах необходимо смотреть работает ли экспортёр хорошо или с ним что то не так.

Ещё один способ убедится что экспортёр возвращает все необходимые метрики открыть URL /metrics на порту, где экспортёр ожидает подключений. Для node_exporter по умолчанию используется порт 9100, о чём и сообщается в логе:

Как видите, кроме стандартных метрик с приставкой go* экспортируются и довольно много метрик начинающихся на node. Значит всё работает.

Шаг 9. Добавление node_exporter в prometheus

Дальше нужно сообщить prometheus что необходимо собирать данные с этого экспортёра. Под каждого экспортёра в конфигурационном файле необходимо создавать подраздел в scrape_configs со следующим содержимым:

  - job_name: 'имя_задачи'
    scrape_interval: интервал_сбора_метрик
    static_configs:
      - targets: ['адрес:порт']

В данном случае полный конфигурационный файл prometheus будет выглядеть вот так:

sudo vi /etc/prometheus/prometheus.yml

global:
  scrape_interval: 15s
  scrape_configs:
    - job_name: 'prometheus'
      scrape_interval: 5s
      static_configs:
        - targets: ['localhost:9090']
    - job_name: 'prometheus_node'
      scrape_interval: 5s
      static_configs:
        - targets: ['localhost:9100']

Для формата yaml отступы имеют очень важное значение, поэтому следите чтобы с ними было всё хорошо. В данном примере node_exporter находится на том же компьютере, что и prometheus поэтому можно указать localhost. Такой экспортёр надо установить на все машины, которые надо отслеживать с помощью программы. Для каждой надо создать свою job. После завершения настройки перезапустите Prometheus:

systemctl restart prometheus

Теперь можно проверить в Prometheus, что данные передаются:

Шаг 10. Импорт доски для Node Exporter

Аналогично метрикам от сервера Prometheus можно выводить в Grafana метрики любого другого экспортёра. Для большинства из них уже созданы шаблоны досок. Доску для node_exporter можно найти здесь. Откройте Dashboards -> Manage -> Import и введите идентификатор доски 1860:

На следующей странице введите название доски и выберите источник данных снова Prometheus:

После нажатия кнопки Import перед вами появится доска, и здесь уже данные намного интереснее, чем на предыдущей:

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

Выводы

В этой небольшой статье мы рассмотрели как выполняется установка Prometheus Grafana в Ubuntu 20.04. Как видите, программа довольно проста в настройке, намного проще по сравнению со связкой Collectd + IfluxDB и возможностей здесь намного больше. А какой системой мониторинга пользуетесь вы? Напишите в комментариях!

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

прометей | level=error ts=2019-08-30T07:06:57.981Z caller=query_logger.go:82 component=activeQueryTracker msg=»Ошибка открытия файла журнала запросов» file=/prometheus/queries.active err=»open /prometheus/queries .active: разрешение запрещено»
прометей | паника: невозможно создать журнал активных запросов с помощью mmap

Prometheus не работает, потому что вы монтируете том в контейнер, вероятно, файл конфигурации.

Пользователь, запускающий Prometheus в контейнере, имеет определенный идентификатор пользователя и идентификатор группы, потому что запускать в контейнере от имени root опасно, поскольку это открывает уязвимости для эскалации.

Некоторые менеджеры контейнеров пытаются смягчить эту проблему, запуская программное обеспечение от имени определенного пользователя в контейнере, а не от root. В случае prom/prometheus это выглядит как 65534 .

Этот UID/GID можно обнаружить, запустив контейнер без монтирования тома, а затем запустив команду ID, чтобы увидеть, под каким UID работает ваш пользователь.

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

Чтобы решить эту проблему, вам нужно установить UID/GID в контейнере:

> echo $UID
1000

Определите в docker-compose:

# docker-compose.yml

 services:
  prometheus:
    image: prom/prometheus
    user: "1000:1000"

Или в Dockerfile:

# Dockerfile

USER 1000:1000

@bohdanlykhitkoexp

Предложение не сработало для меня (несмотря на то, что мой $UID равен 1000). Я также настоятельно рекомендую попробовать root , так как это сработало для меня:

# docker-compose.yml

 services:
  prometheus:
    image: prom/prometheus
    user: root

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

component=activeQueryTracker msg=»Ошибка открытия файла журнала запросов» file=data/queries.active err=»open data/queries.active: разрешение отклонено»
паника: невозможно создать журнал активных запросов с помощью mmap

Я вижу ту же проблему после установки с помощью Helm — кто-нибудь решил это?

в любом случае, чтобы решить это элегантно?

@riverbuilding Я объяснил здесь .

@zimmertr

  1. сообщение об ошибке содержит «/data/prometheus/queries.active»
  2. Я использовал докер с именем Volume prometheusdata и смонтировал его в /data/prometheus

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

и кстати, не является ли какой-то смысл именованного тома, чтобы избежать таких разрешений? как Prometheus оказывается с такими проблемами с разрешениями? Я не очень хорошо понимаю ваше объяснение.

ниже команды не работают:

sudo docker run -p 9390:9090 -v /home/mky/prometheus.yml:/etc/prometheus/prometheus.yml -v prometheusdata:/data/prometheus prom/prometheus —config.file=»/etc/prometheus/ prometheus.yml» —storage.tsdb.path=»/data/prometheus»

sudo docker run -p 9390:9090 -v /home/mky/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus —config.file=»/etc/prometheus/prometheus.yml» —хранилище. tsdb.path=»/данные/прометей»

sudo docker run -p 9390:9090 prom/prometheus —storage.tsdb.path=»/data/prometheus»

ниже работают команды:

sudo docker run -p 9390:9090 выпускной/прометей

sudo docker run -p 9390:9090 -v /home/mky/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus —config.file=»/etc/prometheus/prometheus.yml»

sudo docker run —user root -p 9390:9090 -v /home/mky/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus —config.file=»/etc/prometheus/prometheus.yml» —storage.tsdb.path=»/data/prometheus»

sudo docker run —user root -p 9390:9090 -v /home/mky/prometheus.yml:/etc/prometheus/prometheus.yml -v prometheusdata:/data/prometheus prom/prometheus —config.file=»/ etc/prometheus/prometheus.yml» —storage.tsdb.path=»/data/prometheus»

Та же ошибка!

version: '3.3'

services:

    prometheus:
        image: prom/prometheus:latest
        volumes:
          - /data/prometheus/:/prometheus/
docker-compose -f docker-compose.yml  up
Creating prometheus_prometheus_1 ... done
Attaching to prometheus_prometheus_1
prometheus_1  | level=info ts=2019-12-11T15:28:43.632Z caller=main.go:296 msg="no time or size retention was set so using the default time retention" duration=15d
prometheus_1  | level=info ts=2019-12-11T15:28:43.632Z caller=main.go:332 msg="Starting Prometheus" version="(version=2.14.0, branch=HEAD, revision=edeb7a44cbf745f1d8be4ea6f215e79e651bfe19)"
prometheus_1  | level=info ts=2019-12-11T15:28:43.632Z caller=main.go:333 build_context="(go=go1.13.4, user=root<strong i="10">@df2327081015</strong>, date=20191111-14:27:12)"
prometheus_1  | level=info ts=2019-12-11T15:28:43.632Z caller=main.go:334 host_details="(Linux 3.10.0-957.10.1.el7.x86_64 #1 SMP Mon Mar 18 15:06:45 UTC 2019 x86_64 6dc9f3824d9d (none))"
prometheus_1  | level=info ts=2019-12-11T15:28:43.632Z caller=main.go:335 fd_limits="(soft=1048576, hard=1048576)"
prometheus_1  | level=info ts=2019-12-11T15:28:43.632Z caller=main.go:336 vm_limits="(soft=unlimited, hard=unlimited)"
prometheus_1  | level=error ts=2019-12-11T15:28:43.632Z caller=query_logger.go:85 component=activeQueryTracker msg="Error opening query log file" file=/prometheus/queries.active err="open /prometheus/queries.active: permission denied"
prometheus_1  | panic: Unable to create mmap-ed active query log
prometheus_1  |
prometheus_1  | goroutine 1 [running]:
prometheus_1  | github.com/prometheus/prometheus/promql.NewActiveQueryTracker(0x7ffd3d9c6f02, 0xb, 0x14, 0x2b4f400, 0xc0007379b0, 0x2b4f400)
prometheus_1  |         /app/promql/query_logger.go:115 +0x48c
prometheus_1  | main.main()
prometheus_1  |         /app/cmd/prometheus/main.go:364 +0x5229
prometheus_prometheus_1 exited with code 2

Есть ли более старая версия prometheus, в которой не возникает этой проблемы?

Также я получил ту же ошибку!

Я устанавливаю premetheus через helm и регистрирую ошибки следующим образом.

# kubectl logs -n prometheus prometheus-server-76b7cf695-qlrjx -c prometheus-server
level=info ts=2020-01-07T08:11:42.010Z caller=main.go:332 msg="Starting Prometheus" version="(version=2.13.1, branch=HEAD, revision=6f92ce56053866194ae5937012c1bec40f1dd1d9)"
level=info ts=2020-01-07T08:11:42.010Z caller=main.go:333 build_context="(go=go1.13.1, user=root<strong i="7">@88e419aa1676</strong>, date=20191017-13:15:01)"
level=info ts=2020-01-07T08:11:42.011Z caller=main.go:334 host_details="(Linux 5.0.0-37-generic #40~18.04.1-Ubuntu SMP Thu Nov 14 12:06:39 UTC 2019 x86_64 prometheus-server-76b7cf695-qlrjx (none))"
level=info ts=2020-01-07T08:11:42.011Z caller=main.go:335 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2020-01-07T08:11:42.011Z caller=main.go:336 vm_limits="(soft=unlimited, hard=unlimited)"
level=error ts=2020-01-07T08:11:42.011Z caller=query_logger.go:69 component=activeQueryTracker msg="Failed to read query log file" err=EOF
level=error ts=2020-01-07T08:11:42.011Z caller=query_logger.go:85 component=activeQueryTracker msg="Error opening query log file" file=/data/queries.active err="open /data/queries.active: permission denied"
panic: Unable to create mmap-ed active query log

goroutine 1 [running]:
github.com/prometheus/prometheus/promql.NewActiveQueryTracker(0x7ffe4d8e5964, 0x5, 0x14, 0x29db1e0, 0xc000721e90, 0x29db1e0)
    /app/promql/query_logger.go:115 +0x48c
main.main()
    /app/cmd/prometheus/main.go:364 +0x5229

и моя версия прометея v2.13.1

Здесь та же ошибка

level=info ts=2020-01-07T09:38:21.592Z caller=main.go:332 msg="Starting Prometheus" version="(version=2.13.1, branch=HEAD, revision=6f92ce56053866194ae5937012c1bec40f1dd1d9)"
level=info ts=2020-01-07T09:38:21.592Z caller=main.go:333 build_context="(go=go1.13.1, user=root<strong i="6">@88e419aa1676</strong>, date=20191017-13:15:01)"
level=info ts=2020-01-07T09:38:21.592Z caller=main.go:334 host_details="(Linux 4.15.0-50-generic #54-Ubuntu SMP Mon May 6 18:46:08 UTC 2019 x86_64 prometheus-pythia-cluster-monitoring-prometheus-0 (none))"
level=info ts=2020-01-07T09:38:21.592Z caller=main.go:335 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2020-01-07T09:38:21.592Z caller=main.go:336 vm_limits="(soft=unlimited, hard=unlimited)"
level=error ts=2020-01-07T09:38:21.592Z caller=query_logger.go:85 component=activeQueryTracker msg="Error opening query log file" file=/prometheus/queries.active err="open /prometheus/queries.active: permission denied"
panic: Unable to create mmap-ed active query log
goroutine 1 [running]:
github.com/prometheus/prometheus/promql.NewActiveQueryTracker(0x7ffd90ba6fca, 0xb, 0x14, 0x29db1e0, 0xc00071dc50, 0x29db1e0)
    /app/promql/query_logger.go:115 +0x48c
main.main()
    /app/cmd/prometheus/main.go:364 +0x5229

Также я получил ту же ошибку!

Я устанавливаю premetheus через helm и регистрирую ошибки следующим образом.

# kubectl logs -n prometheus prometheus-server-76b7cf695-qlrjx -c prometheus-server
level=info ts=2020-01-07T08:11:42.010Z caller=main.go:332 msg="Starting Prometheus" version="(version=2.13.1, branch=HEAD, revision=6f92ce56053866194ae5937012c1bec40f1dd1d9)"
level=info ts=2020-01-07T08:11:42.010Z caller=main.go:333 build_context="(go=go1.13.1, user=root<strong i="8">@88e419aa1676</strong>, date=20191017-13:15:01)"
level=info ts=2020-01-07T08:11:42.011Z caller=main.go:334 host_details="(Linux 5.0.0-37-generic #40~18.04.1-Ubuntu SMP Thu Nov 14 12:06:39 UTC 2019 x86_64 prometheus-server-76b7cf695-qlrjx (none))"
level=info ts=2020-01-07T08:11:42.011Z caller=main.go:335 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2020-01-07T08:11:42.011Z caller=main.go:336 vm_limits="(soft=unlimited, hard=unlimited)"
level=error ts=2020-01-07T08:11:42.011Z caller=query_logger.go:69 component=activeQueryTracker msg="Failed to read query log file" err=EOF
level=error ts=2020-01-07T08:11:42.011Z caller=query_logger.go:85 component=activeQueryTracker msg="Error opening query log file" file=/data/queries.active err="open /data/queries.active: permission denied"
panic: Unable to create mmap-ed active query log

goroutine 1 [running]:
github.com/prometheus/prometheus/promql.NewActiveQueryTracker(0x7ffe4d8e5964, 0x5, 0x14, 0x29db1e0, 0xc000721e90, 0x29db1e0)
  /app/promql/query_logger.go:115 +0x48c
main.main()
  /app/cmd/prometheus/main.go:364 +0x5229

и моя версия прометея v2.13.1

я могу решить эту проблему с помощью обходного пути, следуя процедуре detial,

  1. получить стабильные/prometheus values.yaml
# helm show values stable/prometheus > values.yaml
  1. отредактируйте values.yaml и измените разрешение prometheus-server следующим образом:
  ## Security context to be added to server pods
  ##
  securityContext:
    runAsUser: 1000   <- - modify this to 1000, 65534 original
    runAsNonRoot: true
    runAsGroup: 65534
    fsGroup: 2000   <- - modify this to 2000, 65534 original

Подробное обсуждение см.:

https://kubernetes.slack.com/archives/C09NXKJKA/p1575296982050300

  1. установить прометей от руля
# helm install prometheus stable/prometheus --values ./values.yaml

тогда это работало хорошо.

если кто-нибудь установит prometheus через руль, возможно, это будет полезно для вас.

У меня такая же проблема, даже с решением @yechnlin.

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

Чтобы ваш вопрос и все ответы было легче найти, мы предлагаем вам переместить его в наш список рассылки пользователей , в котором вы также можете искать. Если вы предпочитаете более интерактивную помощь, присоединяйтесь к нашему IRC-каналу #prometheus на irc.freenode.net. Имейте в виду, что наш IRC-канал не ведет логов, не доступен для поиска и что люди могут не отвечать быстро, если они заняты или спят. Если вы сомневаетесь, вам следует выбрать список рассылки.

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

После того, как на ваши вопросы будут даны ответы, добавьте короткую строку, указывающую на соответствующие ответы, на случай, если кто-то наткнется здесь через поисковую систему в будущем.

У меня такая же проблема, даже с решением @yechnlin.

извините, забыл что-то, может быть, вам также следует изменить разрешение тома монтирования на хосте.

например, у меня есть локальный постоянный том для сервера prometheus в /data/prometheus, поэтому мне нужно изменить разрешение /data/prometheus,

# chown 1000:1000 -R /data/

  1. в prometheus по умолчанию datadir uid и gid 65534
  2. важный шаг: -v /monitor/prometheus/data:/prometheus: z * *

    * chown -R 65534:65534 /монитор/прометей/данные *

5599 docker run -tid -p 9090:9090 —restart=always -v /monitor/prometheus/config/prometheus:/etc/prometheus :z -v /monitor/prometheus/data:/prometheus: z —name prometheus docker .io/prom/ prometheus:latest «—config.file=/etc/prometheus/prometheus.yml» «—storage.tsdb.path=/prometheus» «—web.console.libraries=/usr/share /prometheus/console_libraries» «—web.console.templates=/usr/share/prometheus/consoles» «—storage.tsdb.retention.time=15d» «—storage.tsdb.min-block-duration=6h » —web.enable-admin-api» «—web.enable-lifecycle»

Просматривая все вышеизложенное, я не вижу никаких доказательств того, что это проблема с самим Prometheus. Соответственно, я собираюсь закрыть его.

Если у вас есть новая информация, указывающая на то, что проблема связана с Prometheus, сообщите нам об этом.

Привет, я столкнулся с той же проблемой сегодня, и я нашел решение для нее.

Ошибка :
level=error ts=2020-03-05T06:17:05.264Z caller=query_logger.go:82 component=activeQueryTracker msg="Error opening query log file" file=data/queries.active err="open data/queries.active: permission denied"

Решение :
Я решил это, используя initContainer, чтобы изменить пользователя/разрешение для Persistent Volume Claim:

spec:
  containers:
    - name: prometheus
      image: docker.io/prom/prometheus:v2.12.0
      volumeMounts:
      - mountPath: "/prometheus/data"
        name: prometheus-data
  initContainers:
  - name: prometheus-data-permission-fix
    image: busybox
    command: ["/bin/chmod","-R","777", "/data"]
    volumeMounts:
    - name: prometheus-data
      mountPath: /data
  volumes:
    - name: prometheus-data
      persistentVolumeClaim:
        claimName: prometheus-pvc

Благодаря этой статье на Medium, которую я использовал для решения проблемы с разрешениями: https://medium.com/faun/digitalocean-kubernetes-and-volume-permissions-820f46598965 .

Это решено в какой-либо из старых версий? Я также попробовал предложение @yechnlin , у меня не сработало.

У меня версия 2.16.0 из репозитория: prom/prometheus.

Также решение initcontainer от @vijay-jindal, я пытаюсь отредактировать развертывание, но vi не сохраняет, в любом случае я могу получить файл развертывания для вашего рабочего сервера prometheus.

Заранее спасибо.

@ maurya-m, vi должен сохранить его. Проверьте интервал и синтаксис yaml. vi не сохранит его в случае таких ошибок. Как только vi сохранит его, перезапустите развертывание и создайте новые модули.

Единственная причина, по которой я думаю, что эта проблема возникает, заключается в отсутствии прав root, и initcontainer был единственным, который мог мне помочь.

  1. в prometheus по умолчанию datadir uid и gid 65534
  2. важный шаг: -v /monitor/prometheus/data:/prometheus: z *# _chown -R 65534:65534 /монитор/прометей/данные_*#5599 docker run -tid -p 9090:9090 —restart=always -v /monitor/prometheus/config/prometheus:/etc/prometheus :z** -v /monitor/prometheus/data:/prometheus: z — имя prometheus docker.io/prom/prometheus:latest «—config.file=/etc/prometheus/prometheus.yml» «—storage.tsdb.path=/prometheus» «—web.console.libraries=/ usr/share/prometheus/console_libraries» «—web.console.templates=/usr/share/prometheus/consoles» «—storage.tsdb.retention.time=15d» «—storage.tsdb.min-block- продолжительность=6h» «—web.enable-admin-api» «—web.enable-lifecycle»

подтвердите, что том данных chown -R 65534:65534 prometheus будет работать.

@bohdanlykhitkoexp

Предложение не сработало для меня (несмотря на то, что мой $UID равен 1000). Я также настоятельно рекомендую попробовать root , так как это сработало для меня:

# docker-compose.yml

 services:
  prometheus:
    image: prom/prometheus
    user: root

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

Это работает для меня. :)

chown -R 65534:65534 prom_data

безопасностьКонтекст:
запустить как пользователь: 0
тома:

добавьте securityContext и установите runAsUser 0, чтобы prometheus работал как никто, а не root. Это причина отказа в разрешении.

Я не уверен, решает ли это проблемы безопасности при работе с правами root или нет, но я решил это, только добавив

      securityContext:
        fsGroup: 0

в пораженный контейнер.

Я предполагаю, что это фактически то же самое, что и работа в качестве корневой группы, поскольку кажется, что она просто добавляет группу 0 к работающему пользователю. Я в Кубе 1.17.
Для амбициозных в версии 1.18 есть альфа-функция для автоматического создания тома при монтировании.

TLDR; Я согласен, что это не проблема прометея, но вот как воспроизвести и исправить.

Мы продемонстрируем с помощью docker compose, но приведенные выше утверждения о том, что внешний объем данных должен соответствовать разрешениям пользователя, запускающего службу в контейнере, точны. Таким образом, какой бы UID/GID вы ни определили, его необходимо установить на отображаемом томе.

Создать файлы
/opt/prom/docker-compose.yml

version: '2'
volumes:
  local_volume:
    external: false
services:
  prometheus:
    image: prom/prometheus:v2.20.1
    container_name: prometheus
    volumes:
      - local_volume:/prometheus
      - /opt/prom/prometheus.yml:/opt/prom/prometheus.yml
    ports:
      - 9090:9090
    command:
      - '--config.file=/opt/prom/prometheus.yml'
    logging:
      driver: "json-file"
    user: 9090:9090

/opt/prom/prometheus.yml (с разрешениями 9090:9090)

global:
  scrape_interval: 10s # By default, scrape targets every 10 seconds.
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets:
        - 'prometheus:9090'

перейти в каталог с файлом компоновки докеров cd /opt/prom

Беги docker-compose up -d

контейнер prometheus не запускается, и docker logs prometheus выдает ошибку, которую мы все видим:

$ docker logs prometheus
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:308 msg="No time or size retention was set so using the default time retention" duration=15d
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:343 msg="Starting Prometheus" version="(version=2.20.1, branch=HEAD, revision=983ebb4a513302315a8117932ab832815f85e3d2)"
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:344 build_context="(go=go1.14.6, user=root<strong i="20">@7cbd4d1c15e0</strong>, date=20200805-17:26:58)"
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:345 host_details="(Linux 3.10.0-1127.13.1.el7.x86_64 #1 SMP Tue Jun 23 15:46:38 UTC 2020 x86_64 5242e61b2ce2 (none))"
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:346 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2020-08-12T22:09:03.541Z caller=main.go:347 vm_limits="(soft=unlimited, hard=unlimited)"
level=error ts=2020-08-12T22:09:03.542Z caller=query_logger.go:109 component=activeQueryTracker msg="Failed to create directory for logging active queries"
level=error ts=2020-08-12T22:09:03.542Z caller=query_logger.go:87 component=activeQueryTracker msg="Error opening query log file" file=data/queries.active err="open data/queries.active: no such file or directory"
panic: Unable to create mmap-ed active query log

goroutine 1 [running]:
github.com/prometheus/prometheus/promql.NewActiveQueryTracker(0x2869f4c, 0x5, 0x14, 0x30898a0, 0xc0008f1b60, 0x30898a0)
        /app/promql/query_logger.go:117 +0x4cd
main.main()
        /app/cmd/prometheus/main.go:374 +0x4f08

Мы создали local_volume для хранения данных, мы можем видеть это с помощью

$ docker volume ls
DRIVER              VOLUME NAME
local               prom_local_volume

мы можем ИСПРАВИТЬ разрешение в томе
docker run -it --rm --entrypoint=sh -v prom_local_volume:/prometheus --user 0:0 prom/prometheus:v2.20.1 -c "chown -R 9090:9090 /prometheus/."

теперь снова запустите prometheus: docker-compose up -d

а теперь логи показывают как надо

$ docker logs prometheus
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:308 msg="No time or size retention was set so using the default time retention" duration=15d
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:343 msg="Starting Prometheus" version="(version=2.20.1, branch=HEAD, revision=983ebb4a513302315a8117932ab832815f85e3d2)"
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:344 build_context="(go=go1.14.6, user=root<strong i="15">@7cbd4d1c15e0</strong>, date=20200805-17:26:58)"
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:345 host_details="(Linux 3.10.0-1127.13.1.el7.x86_64 #1 SMP Tue Jun 23 15:46:38 UTC 2020 x86_64 28fabd353fe7 (none))"
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:346 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2020-08-12T22:26:58.034Z caller=main.go:347 vm_limits="(soft=unlimited, hard=unlimited)"
level=error ts=2020-08-12T22:26:58.035Z caller=query_logger.go:109 component=activeQueryTracker msg="Failed to create directory for logging active queries"
level=error ts=2020-08-12T22:26:58.035Z caller=query_logger.go:87 component=activeQueryTracker msg="Error opening query log file" file=data/queries.active err="open data/queries.active: no such file or directory"
panic: Unable to create mmap-ed active query log

goroutine 1 [running]:
github.com/prometheus/prometheus/promql.NewActiveQueryTracker(0x2869f4c, 0x5, 0x14, 0x30898a0, 0xc000763aa0, 0x30898a0)
        /app/promql/query_logger.go:117 +0x4cd
main.main()
        /app/cmd/prometheus/main.go:374 +0x4f08
level=info ts=2020-08-12T22:27:12.270Z caller=main.go:308 msg="No time or size retention was set so using the default time retention" duration=15d
level=info ts=2020-08-12T22:27:12.271Z caller=main.go:343 msg="Starting Prometheus" version="(version=2.20.1, branch=HEAD, revision=983ebb4a513302315a8117932ab832815f85e3d2)"
level=info ts=2020-08-12T22:27:12.271Z caller=main.go:344 build_context="(go=go1.14.6, user=root<strong i="16">@7cbd4d1c15e0</strong>, date=20200805-17:26:58)"
level=info ts=2020-08-12T22:27:12.271Z caller=main.go:345 host_details="(Linux 3.10.0-1127.13.1.el7.x86_64 #1 SMP Tue Jun 23 15:46:38 UTC 2020 x86_64 28fabd353fe7 (none))"
level=info ts=2020-08-12T22:27:12.271Z caller=main.go:346 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2020-08-12T22:27:12.271Z caller=main.go:347 vm_limits="(soft=unlimited, hard=unlimited)"
level=info ts=2020-08-12T22:27:12.272Z caller=main.go:684 msg="Starting TSDB ..."
level=info ts=2020-08-12T22:27:12.273Z caller=web.go:524 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2020-08-12T22:27:12.286Z caller=head.go:641 component=tsdb msg="Replaying on-disk memory mappable chunks if any"
level=info ts=2020-08-12T22:27:12.286Z caller=head.go:655 component=tsdb msg="On-disk memory mappable chunks replay completed" duration=5.072µs
level=info ts=2020-08-12T22:27:12.286Z caller=head.go:661 component=tsdb msg="Replaying WAL, this may take a while"
level=info ts=2020-08-12T22:27:12.286Z caller=head.go:713 component=tsdb msg="WAL segment loaded" segment=0 maxSegment=0
level=info ts=2020-08-12T22:27:12.286Z caller=head.go:716 component=tsdb msg="WAL replay completed" checkpoint_replay_duration=38.475µs wal_replay_duration=160.427µs total_replay_duration=224.678µs
level=info ts=2020-08-12T22:27:12.287Z caller=main.go:700 fs_type=XFS_SUPER_MAGIC
level=info ts=2020-08-12T22:27:12.287Z caller=main.go:701 msg="TSDB started"
level=info ts=2020-08-12T22:27:12.287Z caller=main.go:805 msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
level=info ts=2020-08-12T22:27:12.289Z caller=main.go:833 msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml
level=info ts=2020-08-12T22:27:12.289Z caller=main.go:652 msg="Server is ready to receive web requests."

журналы по-прежнему показывают журналы первого запуска/сообщение об ошибке

прометей доступен

$ curl localhost:9090
<a href="/graph">Found</a>.

также можно получить метрики: curl localhost:9090/metrics

Данные должны храниться вне хоста в каком-либо монтировании NFS или драйвера докера (плагин NetApp Trident).

Надеюсь это поможет,
Питер

Эта ошибка отказа в разрешении возникает из-за того, что пользователь prometheus не имеет разрешения на запись в точку монтирования тома данных. Запуск контейнера prometheus от имени пользователя root для обхода этой ошибки является самым ленивым и худшим решением. Взяв за основу руководство prometheus с помощью docker , вы можете сделать следующее, чтобы решить эту проблему:

  1. Создайте том данных с docker volume create prometheus-data (имя тома необязательно)
  2. Найдите UID и GID пользователя prometheus, запустив контейнер (без монтирования тома данных) и запустив ps -o uid, gid -p $(pidof prometheus) ( -p — это PID процесса prometheus)
  3. Передайте право собственности на точку монтирования пользователю prometheus с помощью:
    docker run -it --entrypoint=sh --user 0:0 -v prometheus-data:/prometheus prom/prometheus -c "chown -R UID:GID /prometheus/." (замените UID и GID числами, найденными на шаге 2)

Теперь вы сможете смонтировать том данных и запустить контейнер:
docker run -p 9090:9090 -v path/to/prometheus.yml:/etc/prometheus/prometheus.yml -v prometheus-data:/prometheus prom/prometheus

chown -R 65534:65534 prom_data

оно работает …

Я думаю, вам нужно initContainers в вашем файле развертывания Prometheus , как здесь:

  initContainers:
      - name: "init-datapath"
        image: debian:stable
        command: ["chown", "-R", "65534:65534", "/data"]
        command: ["/bin/chmod","-R","777","/data"]
        volumeMounts:
        - name: prometheus-prometheus-db
          mountPath: /data
          subPath: ""

  storage:
    volumeClaimTemplate:
      spec:
        storageClassName: rancher-rbd
        name: prometheus-prometheus-db
        resources:
          requests:
            storage: 10Gi

Была ли эта страница полезной?

0 / 5 — 0 рейтинги

Prometheus v2.12 added active query logging. The basic idea is that there is a mmaped JSON file that contains all of the queries currently running. If prometheus was to crash, that file would therefore be a list of the queries running at the time of the crash. Overall, not a bad idea.

Some friends had recently added prometheus to their development environments. This is wired up to grafana dashboards for their microservices, and prometheus is configured to store 14 days worth of time series data via a persistent volume from the developer desktops. We did this because it is valuable for the developers to be able to see the history of metrics before and after their changes.

Now we have a developer using macos as their primary development platform, and since prometheus 2.12 it hasn’t worked. Specifically this developer is using parallels to provide the docker virtual machine on his mac. You can summarise the startup for prometheus in the dev environment like this:

$ docker run ...stuff...
...snip...
level=error ts=2019-09-15T02:20:23.520Z caller=query_logger.go:94 component=activeQueryTracker msg="Failed to mmap" file=/prometheus-data/data/queries.active Attemptedsize=20001 err="invalid argument"
panic: Unable to create mmap-ed active query log

goroutine 1 [running]:
github.com/prometheus/prometheus/promql.NewActiveQueryTracker(0x7fff9917af38, 0x15, 0x14, 0x2a6b7c0, 0xc00003c7e0, 0x2a6b7c0)
	/app/promql/query_logger.go:112 +0x4d2
main.main()
	/app/cmd/prometheus/main.go:361 +0x52bd

And here’s the underlying problem — because of the way the persistent data is mapped into this container (via parallels sharing in this case), the mmap of the active queries file fails and prometheus fails to start.

In other words, since prometheus 2.12 your prometheus data files have to be stored on a filesystem which supports mmap. Additionally, there is no flag to just disable the active query logger.

So how do we work around this? Well, here’s a horrible workaround — in the data directory that is volume mapped into the container, create a symlink that is to a path that is mmapable inside the docker container, even if that path doesn’t exist outside the container. For example, given that we store the prometheus time series at $CONFIG/prometheus-data:

$ ln -s /tmp/queries.active "$CONFIG/prometheus-data/queries.active"

Note that /tmp/queries.active does not exist on the developer’s mac. Prometheus now starts and its puppies and kittens the whole way down.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Lesta games center ошибка 31
  • Lesta games center cannot recover from an error please reinstall the application
  • Lesta game center is not installed on your computer ошибка 8014
  • Lesta game center cannot recover from an error please reinstall the application from player support
  • Lesta game center cannot recover from an error please reinstall the application 8007

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии