Установка системы мониторинга для 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

  1. Скачиваем Prometheus

  2. Распаковываем в /opt

    sudo tar xvf ./prometheus-3.0.0.linux-amd64.tar.gz --directory /opt/
  3. Создаём файл конфигурации prometheus.yml

    sudo nano /opt/prometheus-3.0.0.linux-amd64/prometheus.yml
    global:
    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' - это сервер мониторинга.
  4. Создаём юнит для запуска сервиса /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
  5. Создаем пользователя 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/
  6. Переинициализируем systemd-unit, включаем и запускаем сервис. Проверяем статус.

    systemctl daemon-reload
    systemctl enable prometheus.service
    systemctl start prometheus.service
    systemctl status prometheus.service
  7. После входа в веб интерфейс Grafana необходимо зарегистрировать новый Datasource Prometheus с адресом:

    prometheus

Установка и настройка Loki

Loki – это система хранения логов.

  1. Скачиваем Loki

  2. Распаковываем в /opt/

    sudo unzip ./loki-linux-amd64.zip -d /opt/loki
  3. Создаем пользователя, даем права на папку:

    sudo adduser --system --home /opt/loki/ --shell /sbin/nologin --group loki
    sudo chown -R loki.loki /opt/loki/
  4. Создаем файл сервиса /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
  5. Создаем файл /opt/loki/loki-local-config.yaml

    sudo nano /opt/loki/loki-local-config.yaml
    auth_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
  6. Переинициализируем systemd-unit, включаем и запускаем сервис. Проверяем статус.

    sudo systemctl daemon-reload
    sudo systemctl enable loki.service
    sudo systemctl start loki.service
    sudo systemctl status loki.service
  7. После входа в веб интерфейс Grafana необходимо зарегистрировать новый Datasource Loki с адресом:

    loki

Установка и настройка Fluent-bit

Fluent bit – это легковесная служба обработки и пересылки логов с открытым исходным кодом.

  1. Скачиваем Fluent-bit:

  2. Распаковываем во временную папку

    unzip v3.2.1.zip -d temp/

  3. Устанавливаем необходимые пакеты

    sudo apt-get install -y build-essential flex bison libyaml-dev libssl-dev pkg-config cmake
  4. Переходим в папку build

    cd temp/fluent-bit-3.2.1/build/
  5. Запускаем сборку

    cmake ..
    make
  6. Копируем файл bin/fluent-bit в /opt/fluent-bit

    mkdir /opt/fluent-bit
    cp bin/fluent-bit /opt/fluent-bit/
  7. Создаём в папке /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' - это сервер мониторинга.
  8. Создаем файл 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
  9. Создаем юнит для запуска сервиса /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
  10. Переинициализируем 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.

  1. Скачиваем дистрибутив

  2. Распаковываем

    sudo tar xvf node_exporter-1.8.2.linux-amd64.tar.gz --directory /opt/
  3. Создаем файл сервиса

    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
  4. Активируем и запускаем сервис

    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.

  1. Устанавливаем агент

    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

  2. Создаем новый конфиг 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

    activemq settings
  • Пример настроек для Karaf

    camel settings

Работа с Grafana

Подробное описание доступно в инструкции Работа с Grafana.