Установка системы мониторинга для Entaxy ION (All-in-one)
Инструкция описывает два сценария установки системы мониторинга:
Установка Grafana
Grafana — это мультиплатформенное веб-приложение для аналитики и интерактивной визуализации с открытым исходным кодом.
Для установки Grafana и включения сервиса выполним следующие команды:
$ sudo apt-get install -y libfontconfig1 musl
$ wget https://dl.grafana.com/oss/release/grafana_11.3.1_amd64.deb
$ sudo dpkg -i grafana_11.3.1_amd64.deb
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable grafana-server
$ sudo /bin/systemctl start grafana-server
Установка и настройка Prometheus
-
Скачиваем Prometheus
-
Распаковываем в /opt
sudo tar xvf ./prometheus-3.0.0.linux-amd64.tar.gz --directory /opt/ -
Создаём файл конфигурации prometheus.yml
sudo nano /opt/prometheus-3.0.0.linux-amd64/prometheus.ymlglobal: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. alerting: alertmanagers: - static_configs: - targets: rule_files: scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - job_name: 'java-entaxy' metrics_path: /metrics static_configs: - targets: ['YYY.YYY.YYY.YY:9191'] - job_name: 'entaxy' metrics_path: /metrics static_configs: - targets: ['YYY.YYY.YYY.YY:9191'] - job_name: 'emdev-pilot-app' metrics_path: /metrics static_configs: - targets: ['YYY.YYY.YYY.YY:9100']В нашем случае 'YYY.YYY.YYY.YY' - это сервер мониторинга. -
Создаём юнит для запуска сервиса /etc/systemd/system/prometheus.service
sudo nano /etc/systemd/system/prometheus.service[Unit] Description=prometheus After=network.target StartLimitIntervalSec=0 [Service] Type=simple User=prometheus Group=prometheus WorkingDirectory=/opt/prometheus-3.0.0.linux-amd64 LimitAS=infinity LimitRSS=infinity LimitCORE=infinity LimitNOFILE=65536 ExecStart=/opt/prometheus-3.0.0.linux-amd64/prometheus Restart=always [Install] WantedBy=multi-user.target -
Создаем пользователя prometheus:
sudo adduser --system --home /opt/prometheus-3.0.0.linux-amd64/ --shell /sbin/nologin --group prometheus sudo chown -R prometheus.prometheus /opt/prometheus-3.0.0.linux-amd64/ -
Переинициализируем systemd-unit, включаем и запускаем сервис. Проверяем статус.
systemctl daemon-reload systemctl enable prometheus.service systemctl start prometheus.service systemctl status prometheus.service -
После входа в веб интерфейс Grafana необходимо зарегистрировать новый Datasource Prometheus с адресом:
Установка и настройка Loki
Loki – это система хранения логов.
-
Скачиваем Loki
-
Распаковываем в /opt/
sudo unzip ./loki-linux-amd64.zip -d /opt/loki -
Создаем пользователя, даем права на папку:
sudo adduser --system --home /opt/loki/ --shell /sbin/nologin --group loki sudo chown -R loki.loki /opt/loki/ -
Создаем файл сервиса /etc/systemd/system/loki.service
sudo nano /etc/systemd/system/loki.service[Unit] Description=loki After=network.target StartLimitIntervalSec=0 [Service] Type=simple User=loki Group=loki WorkingDirectory=/opt/loki LimitAS=infinity LimitRSS=infinity LimitCORE=infinity LimitNOFILE=65536 ExecStart=/opt/loki/loki-linux-amd64 -config.file=/opt/loki/loki-local-config.yaml Restart=always [Install] WantedBy=multi-user.target -
Создаем файл /opt/loki/loki-local-config.yaml
sudo nano /opt/loki/loki-local-config.yamlauth_enabled: false server: http_listen_port: 3100 ingester: lifecycler: address: 127.0.0.1 ring: kvstore: store: inmemory replication_factor: 1 final_sleep: 0s chunk_idle_period: 5m chunk_retain_period: 30s max_transfer_retries: 0 schema_config: configs: - from: 2018-04-15 store: boltdb object_store: filesystem schema: v13 index: prefix: index_ period: 168h storage_config: boltdb: directory: /opt/loki/data/index filesystem: directory: /opt/loki/data/chunks limits_config: # enforce_metric_name: false reject_old_samples: true reject_old_samples_max_age: 168h max_query_lookback: 0s allow_structured_metadata: false #chunk_store_config: # max_look_back_period: 0s table_manager: retention_deletes_enabled: false retention_period: 0s -
Переинициализируем systemd-unit, включаем и запускаем сервис. Проверяем статус.
sudo systemctl daemon-reload sudo systemctl enable loki.service sudo systemctl start loki.service sudo systemctl status loki.service -
После входа в веб интерфейс Grafana необходимо зарегистрировать новый Datasource Loki с адресом:
Установка и настройка Fluent-bit
Fluent bit – это легковесная служба обработки и пересылки логов с открытым исходным кодом.
-
Скачиваем Fluent-bit:
-
Распаковываем во временную папку
unzip v3.2.1.zip -d temp/ -
Устанавливаем необходимые пакеты
sudo apt-get install -y build-essential flex bison libyaml-dev libssl-dev pkg-config cmake -
Переходим в папку build
cd temp/fluent-bit-3.2.1/build/ -
Запускаем сборку
cmake .. make -
Копируем файл bin/fluent-bit в /opt/fluent-bit
mkdir /opt/fluent-bit cp bin/fluent-bit /opt/fluent-bit/ -
Создаём в папке /opt/fluent-bit файл fluentBit.conf
sudo nano /opt/fluent-bit/fluentBit.conf[SERVICE] Flush 5 Daemon Off Log_Level info Parsers_File /opt/fluentbit/parsers.conf [INPUT] Name tail Path /opt/karaf/data/log/artemis.log Refresh_Interval 5 Buffer_Chunk_Size 100k Buffer_Max_Size 1M Tag artemis Key message Multiline On Multiline_Flush 1 Parser_Firstline artemis [INPUT] Name tail Path /opt/karaf/data/log/karaf.log Refresh_Interval 5 Buffer_Chunk_Size 100k Buffer_Max_Size 1M Tag entaxy Key message Multiline On Multiline_Flush 1 Parser_Firstline entaxy [INPUT] Name tail Path /opt/entaxy/data/log/cef-audit.log Buffer_Chunk_Size 100k Buffer_Max_Size 1M Tag cef Key message Parser cef [OUTPUT] Name loki Match cef host YYY.YYY.YYY.YY port 3100 line_format json labels job=karaf-cef-1 label_keys $signature, $name, $severity [OUTPUT] Name loki Match artemis host YYY.YYY.YYY.YY port 3100 line_format json labels job=amq-1 label_keys $log_level [OUTPUT] Name loki Match entaxy host YYY.YYY.YYY.YY port 3100 line_format json labels job=entaxy-1, service=$data['service'], operation=$data['operation'], objectId=$data['objectId'], parameter=$data['parameter'], sender=$data['sender'], receiver=$data['receiver'] label_keys $log_level, $requestВ параметре Path нужно указать путь к логам Artemis, в параметрах host и port нужно соответственно указать адрес и порт сервиса Loki.
В нашем случае 'YYY.YYY.YYY.YY' - это сервер мониторинга. -
Создаем файл parsers.conf в папке /opt/fluent-bit
sudo nano /opt/fluent-bit/parsers.conf[PARSER] Name observability Format json Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%L [PARSER] Name entaxy Format regex Regex ^(?<date>\d{2,4}\-\d{2,4}\-\d{2,4}T\d{2,4}\:\d{2,4}\:\d{2,4}\,\d{1,6}) \| (?<log_level>[^\s]+)[\s]+\| (?<thread>[^\|]+) \| (?<object>[^\s]+)[\s]+\| (?<bundle>\d{2,4} \- [^\s]+ \- [^\s]+) \| (((?<request>\w{8}\-\w{4}\-\w{4}-\w{4}\-\w{12}))#(?<data>[^#]+)#[\s]*?(?<step>.*)| ?(?<message>.*))$ Decode_Field_As json data Time_Key date Time_Format %Y-%m-%dT%H:%M:%S,%L Time_Offset +0300 Time_Keep On [PARSER] Name artemis Format regex Regex ^(?<date>\d{2,4}\-\d{2,4}\-\d{2,4}T\d{2,4}\:\d{2,4}\:\d{2,4}\,\d{1,6}) \| (?<log_level>[^\s]+)[\s]+\| (?<thread>[^\|]+) \| (?<object>[^\s]+)[\s]+\| (?<bundle>\d{2,4} \- [^\s]+ \- [^\s]+) \| ?(?<message>.*)$ Time_Key date Time_Format %Y-%m-%dT%H:%M:%S,%f Time_Offset +0300 [PARSER] Name cef Format regex Regex ^(?<cef>[^\|]+)\|(?<vendor>[^\|]+)\|(?<product>[^\|]+)\|(?<version>[^\|]+)\|(?<signature>[^\|]+)\|(?<name>[^\|]+)\|(?<severity>[^\|]+)\|(?<extension>[^\|]+)$ Time_Offset +0300 -
Создаем юнит для запуска сервиса /etc/systemd/system/fluentbit.service
sudo nano /etc/systemd/system/fluentbit.service[Unit] Description=fluentbit After=network.target StartLimitIntervalSec=0 [Service] Type=simple User=entaxy Group=entaxy WorkingDirectory=/opt/fluent-bit LimitAS=infinity LimitRSS=infinity LimitCORE=infinity LimitNOFILE=65536 ExecStart=/opt/fluent-bit/fluent-bit -c /opt/fluent-bit/fluentBit.conf Restart=always [Install] WantedBy=multi-user.target -
Переинициализируем systemd-unit, включаем и запускаем сервис. Проверяем статус.
sudo systemctl daemon-reload sudo systemctl enable fluentbit.service sudo systemctl start fluentbit.service sudo systemctl status fluentbit.service
Установка и настройка Node Exporter
Node_Exporter – это агент для сбора метрик состояния серверов. Агент работает на стандартном порту – 9100.
-
Скачиваем дистрибутив
-
Распаковываем
sudo tar xvf node_exporter-1.8.2.linux-amd64.tar.gz --directory /opt/ -
Создаем файл сервиса
sudo nano /etc/systemd/system/node_exporter.service[Unit] Description=Node Exporter After=network.target [Service] User=entaxy Group=entaxy Type=simple ExecStart=/opt/node_exporter-1.8.2.linux-amd64/node_exporter [Install] WantedBy=multi-user.target -
Активируем и запускаем сервис
sudo systemctl daemon-reload sudo systemctl enable node_exporter.service sudo systemctl start node_exporter.service sudo systemctl status node_exporter.service
Установка и настройка Telegraf
Telegraf – это агент для сбора java-метрик, jmx-метрик Entaxy ION и ActiveMQ Artemis.
-
Устанавливаем агент
wget -q https://repos.influxdata.com/influxdata-archive_compat.key echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list sudo apt-get update && sudo apt-get install -y telegrafПосле завершения установки переходим к каталогу с конфигурационными файлами Telegraf и удаляем стандартные конфиги telegraf.conf и telegraf.conf.sample
-
Создаем новый конфиг telegraf.conf со следующими параметрами:
sudo nano /etc/telegraf/telegraf.conf[global_tags] [agent] interval = "10s" round_interval = false metric_batch_size = 100000 metric_buffer_limit = 10000 collection_jitter = "0s" flush_interval = "10s" flush_jitter = "0s" precision = "" [[outputs.prometheus_client]] listen = ":9191" path = "/metrics" expiration_interval = "0s" metric_version = 2 [[inputs.jolokia2_agent]] urls = ["http://localhost:8181/hawtio/jolokia"] username = "karaf" password = "karaf" [[inputs.jolokia2_agent.metric]] name = "context" mbean = "org.apache.camel:context=*,type=context,name=*" paths = ["ExchangesCompleted", "ExchangesFailed", "ExchangesInflight", "ExchangesTotal", "MinProcessingTime", "MaxProcessingTime", "MeanProcessingTime", "Redeliveries"] tag_keys = ["name"] [[inputs.jolokia2_agent.metric]] name = "routes" mbean = "org.apache.camel:context=*,type=routes,name=*" paths = ["ExchangesCompleted", "ExchangesFailed", "ExchangesInflight", "ExchangesTotal", "MinProcessingTime", "MaxProcessingTime", "MeanProcessingTime", "Redeliveries", "CamelId"] tag_keys = ["name", "CamelId"] [[inputs.jolokia2_agent.metric]] name = "java_runtime" mbean = "java.lang:type=Runtime" paths = ["Uptime"] [[inputs.jolokia2_agent.metric]] name = "java_memory" mbean = "java.lang:type=Memory" paths = ["HeapMemoryUsage", "NonHeapMemoryUsage", "ObjectPendingFinalizationCount"] [[inputs.jolokia2_agent.metric]] name = "java_garbage_collector" mbean = "java.lang:name=*,type=GarbageCollector" paths = ["CollectionTime", "CollectionCount"] tag_keys = ["name"] [[inputs.jolokia2_agent.metric]] name = "java_last_garbage_collection" mbean = "java.lang:name=*,type=GarbageCollector" paths = ["LastGcInfo"] tag_keys = ["name"] [[inputs.jolokia2_agent.metric]] name = "java_threading" mbean = "java.lang:type=Threading" paths = ["TotalStartedThreadCount", "ThreadCount", "DaemonThreadCount", "PeakThreadCount"] [[inputs.jolokia2_agent.metric]] name = "java_class_loading" mbean = "java.lang:type=ClassLoading" paths = ["LoadedClassCount", "UnloadedClassCount", "TotalLoadedClassCount"] [[inputs.jolokia2_agent.metric]] name = "java_memory_pool" mbean = "java.lang:name=*,type=MemoryPool" paths = ["Usage", "PeakUsage", "CollectionUsage"] tag_keys = ["name"] [[inputs.jolokia2_agent.metric]] name = "java" mbean = "java.lang:type=OperatingSystem" paths = ["OpenFileDescriptorCount", "ProcessCpuLoad", "ProcessCpuTime", "SystemCpuLoad", "SystemLoadAverage"] #artemis [[inputs.jolokia2_agent.metric]] name = "address" mbean = "org.apache.activemq.artemis:broker=*,component=addresses,address=*" paths = ["NumberOfMessages", "MessageCount", "RoutedMessageCount", "UnRoutedMessageCount"] tag_keys = ["address"] [[inputs.jolokia2_agent.metric]] name = "queue" mbean = "org.apache.activemq.artemis:broker=*,component=addresses,address=*,subcomponent=queues,routing-type=*,queue=*" paths = ["AcknowledgeAttempts", "MessageCount", "MessagesAcknowledged", "MessagesAdded", "MessagesExpired", "MessagesKilled", "PersistentSize"] tag_keys = ["queue", "address"] [[inputs.jolokia2_agent.metric]] name = "java_runtime" mbean = "java.lang:type=Runtime" paths = ["Uptime"] [[inputs.jolokia2_agent.metric]] name = "java_memory" mbean = "java.lang:type=Memory" paths = ["HeapMemoryUsage", "NonHeapMemoryUsage", "ObjectPendingFinalizationCount"] [[inputs.jolokia2_agent.metric]] name = "java_garbage_collector" mbean = "java.lang:name=*,type=GarbageCollector" paths = ["CollectionTime", "CollectionCount"] tag_keys = ["name"] [[inputs.jolokia2_agent.metric]] name = "java_last_garbage_collection" mbean = "java.lang:name=*,type=GarbageCollector" paths = ["LastGcInfo"] tag_keys = ["name"] [[inputs.jolokia2_agent.metric]] name = "java_threading" mbean = "java.lang:type=Threading" paths = ["TotalStartedThreadCount", "ThreadCount", "DaemonThreadCount", "PeakThreadCount"] [[inputs.jolokia2_agent.metric]] name = "java_class_loading" mbean = "java.lang:type=ClassLoading" paths = ["LoadedClassCount", "UnloadedClassCount", "TotalLoadedClassCount"] [[inputs.jolokia2_agent.metric]] name = "java_memory_pool" mbean = "java.lang:name=*,type=MemoryPool" paths = ["Usage", "PeakUsage", "CollectionUsage"] tag_keys = ["name"] [[inputs.jolokia2_agent.metric]] name = "java" mbean = "java.lang:type=OperatingSystem" paths = ["OpenFileDescriptorCount", "ProcessCpuLoad", "ProcessCpuTime", "SystemCpuLoad", "SystemLoadAverage"] [[processors.regex]] namepass = ["address", "queue", "context", "routes"] [[processors.regex.tags]] key = "address" pattern = "\"(.*)\"" replacement = "${1}" [[processors.regex.tags]] key = "queue" pattern = "\"(.*)\"" replacement = "${1}" [[processors.regex.tags]] key = "name" pattern = "\"(.*)\"" replacement = "${1}"Путь к метрикам сообщений, который указан в секции «address», должен соответствовать настройкам имени конкретной установки Artemis
После отключения политики и настройки доступов включаем и запускаем сервис. Проверяем статус.
sudo systemctl enable telegraf.service sudo systemctl start telegraf.service sudo systemctl status telegraf.serviceТеперь агент отправляет все метрики на страницу /metrics по портам: 9191 для Entaxy ION и 9090 для ActiveMQ Artemis.
Дополнительные действия с дашбордами Grafana
После импорта дашбордов Grafana, необходимо сделать дополнительные действия.
Нужно зайти в настройки дашборда и проверить, что правильно указан Data source и имя job’ы соответствует заданной в prometheus.yml (см. раздел Установка и настройка Prometheus).
Также нужно указать значение в поле Custom all value.
-
Пример настроек для Artemis
-
Пример настроек для Karaf
Работа с Grafana
Подробное описание доступно в инструкции Работа с Grafana.