Самый мощный инструмент мониторинга производительности: Grafana+Prometheus+Exporters.
Самый мощный инструмент мониторинга производительности: Grafana+Prometheus+Exporters.

1 Логика мониторинга

Самая популярная логика мониторинга:

Только с помощью инструментов тестирования и мониторинга мы можем выполнить анализ производительности и выявить узкие места.

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

2 Логика отображения данных JMeter+InfluxDB+Grafana

Во время стресс-тестирования JMeter используйте консоль JMeter для просмотра результатов:

Или установите плагин, чтобы увидеть результаты:

Или JMeter генерирует HTML:

Инструмент стресса учитывает только три кривые: TPS (T определяется целью теста), время отклика и частоту ошибок. Коэффициент ошибок — это просто кривая, помогающая устранять проблемы. Когда проблем нет, мы смотрим только на TPS и время отклика.

2.1 Дефекты традиционных решений

  1. Сопоставление результатов отнимает много времени
  2. Используйте плагины для просмотра кривых в графическом интерфейсе, что непрактично при высоком уровне параллелизма.
  3. Когда продолжительность сцены относительно велика,Сгенерировать HTML, используя,Возможно чрезмерное потребление памяти. Есть много сгенерированных изображений, на которые не обращают внимания.
  4. Просмотреть сгенерированные результаты после их сохранения затруднительно, и приходится искать их один за другим.

2.2 Решение

Используйте Backend Listener JMeter для отправки данных в InfluxDB или Graphite в режиме реального времени. Серверный прослушиватель Graphite поддерживается в JMeter версии 2.13, а внутренний прослушиватель InfluxdDB поддерживается в JMeter 3.3. Оба отправляют данные асинхронно для просмотра.

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

3 Структура JMeter+InfluxDB+Grafana

Пока JMeter передает нагрузку на сервер, он также подсчитывает TPS, время отклика, количество потоков, частоту ошибок и другую информацию.

По умолчанию он выводится на консоль каждые 30 секунд (можно контролировать параметр jmeter.properties #summariser.interval=30).

После настройки Backend Listener статистические результаты асинхронно отправляются в InfluxDB. Наконец настройте в Grafana:

  • InfluxDBданныеисточник
  • Шаблон отображения JMeter

Вы можете просматривать результаты теста JMeter в режиме реального времени, и данные, которые вы видите, такие же, как данные консоли.

4 Логика передачи данных и отображения

4.1 Конфигурация внутреннего прослушивателя в JMeter

Позвольте мне объяснить внутренний прослушиватель InfluxDB. Просто добавьте его в скрипт:

Сначала настройте URL-адрес influxdb, приложение и другую информацию. Конфигурацию приложения можно рассматривать как имя сцены.

4.2 Как JMeter отправляет данные в InfluxDB

Ключевой исходный код:

Язык кода:javascript
копировать
private void addMetrics(String transaction, SamplerMetric metric) {
  // FOR ALL STATUS
  addMetric(transaction, metric.getTotal(), metric.getSentBytes(), metric.getReceivedBytes(), TAG_ALL, metric.getAllMean(), metric.getAllMinTime(),
          metric.getAllMaxTime(), allPercentiles.values(), metric::getAllPercentile);
  // FOR OK STATUS
  addMetric(transaction, metric.getSuccesses(), null, null, TAG_OK, metric.getOkMean(), metric.getOkMinTime(),
          metric.getOkMaxTime(), okPercentiles.values(), metric::getOkPercentile);
  // FOR KO STATUS
  addMetric(transaction, metric.getFailures(), null, null, TAG_KO, metric.getKoMean(), metric.getKoMinTime(),
          metric.getKoMaxTime(), koPercentiles.values(), metric::getKoPercentile);


  metric.getErrors().forEach((error, count) -> addErrorMetric(transaction, error.getResponseCode(),
              error.getResponseMessage(), count));
}

С глобальной статистической точки зрения вот статистические результаты работы JMeter:

  • К метрике добавляются такие данные, как общий запрос транзакции, отправленные и полученные байты, среднее значение, максимальное значение, минимальное значение и т. д.
  • В то же время к метрике также добавляется информация об успешной/неудачной транзакции.

Больше дополненийmetricПосмотреть шагиJMeterисточниккодInfluxdbBackendListenerClient.java

После сохранения метрики используйте InfluxdbMetricsSender, чтобы отправить ее в Influxdb:

Язык кода:javascript
копировать
   @Override
    public void writeAndSendMetrics() {
 ........
        if (!copyMetrics.isEmpty()) {
            try {
                if(httpRequest == null) {
                    httpRequest = createRequest(url);
                }
                StringBuilder sb = new StringBuilder(copyMetrics.size()*35);
                for (MetricTuple metric : copyMetrics) {
                    // Add TimeStamp in nanosecond from epoch ( default in InfluxDB )
                    sb.append(metric.measurement)
                        .append(metric.tag)
                        .append(" ") //$NON-NLS-1$
                        .append(metric.field)
                        .append(" ")
                        .append(metric.timestamp+"000000") 
                        .append("\n"); //$NON-NLS-1$
                }


                StringEntity entity = new StringEntity(sb.toString(), StandardCharsets.UTF_8);
                
                httpRequest.setEntity(entity);
                lastRequest = httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() {
                    @Override
                    public void completed(final HttpResponse response) {
                        int code = response.getStatusLine().getStatusCode();
                        /*
                         * HTTP response summary 2xx: If your write request received
                         * HTTP 204 No Content, it was a success! 4xx: InfluxDB
                         * could not understand the request. 5xx: The system is
                         * overloaded or significantly impaired.
                         */
                        if (MetricUtils.isSuccessCode(code)) {
                            if(log.isDebugEnabled()) {
                                log.debug("Success, number of metrics written: {}", copyMetrics.size());
                            } 
                        } else {
                            log.error("Error writing metrics to influxDB Url: {}, responseCode: {}, responseBody: {}", url, code, getBody(response));
                        }
                    }
                    @Override
                    public void failed(final Exception ex) {
                        log.error("failed to send data to influxDB server : {}", ex.getMessage());
                    }
                    @Override
                    public void cancelled() {
                        log.warn("Request to influxDB server was cancelled");
                    }
                });               
 ........
            }
        }
    }

Через writeAndSendMetrics все сохраненные метрики отправляются в InfluxDB.

5 Структура хранения InfluxDB

Как InfluxDB хранит:

Язык кода:javascript
копировать
> show databases
name: databases
name
----
_internal
jmeter

> use jmeter
Using database jmeter


> show MEASUREMENTS
name: measurements
name
----
events
jmeter

> select * from events where application='7ddemo'
name: events
time                application text                title
----                ----------- ----                -----
1575255462806000000 7ddemo      Test Cycle1 started ApacheJMeter
1575256463820000000 7ddemo      Test Cycle1 ended   ApacheJMeter
..............

> select * from jmeter where application='7ddemo' limit 10
name: jmeter
time                application avg                count countError endedT hit max maxAT meanAT min minAT pct90.0            pct95.0           pct99.0 rb responseCode responseMessage sb startedT statut transaction
----                ----------- ---                ----- ---------- ------ --- --- ----- ------ --- ----- -------            -------           ------- -- ------------ --------------- -- -------- ------ -----------
1575255462821000000 7ddemo                                          0              0     0          0                                                                                     0               internal
1575255467818000000 7ddemo      232.82352941176472 17    0                 17  849              122       384.9999999999996  849               849     0                               0           all    all
1575255467824000000 7ddemo      232.82352941176472 17                          849              122       384.9999999999996  849               849     0                               0           all    0_openIndexPage
1575255467826000000 7ddemo      232.82352941176472 17                          849              122       384.9999999999996  849               849                                                 ok     0_openIndexPage
1575255467829000000 7ddemo                                          0              1     1          1                                                                                     1               internal
1575255472811000000 7ddemo      205.4418604651163  26    0                 26  849              122       252.6              271.4             849     0                               0           all    all
1575255472812000000 7ddemo                                          0              1     1          1                                                                                     1               internal
1575255472812000000 7ddemo      205.4418604651163  26                          849              122       252.6              271.4             849                                                 ok     0_openIndexPage
1575255472812000000 7ddemo      205.4418604651163  26                          849              122       252.6              271.4             849     0                               0           all    0_openIndexPage
1575255477811000000 7ddemo      198.2142857142857  27    0                 27  849              117       263.79999999999995 292.3500000000001 849     0                               0           all    all

Создайте два ИЗМЕРЕНИЯ в InfluxDB:

  • events
  • jmeter

Эти два хранят данные соответственно, а теги testtile и eventTags, настроенные в интерфейсе, помещаются в ИЗМЕРЕНИЯ событий. Эти два значения пока не используются в шаблоне.

В ИЗМЕРЕНИЯХ jmeter вы можете увидеть статистическую информацию о приложении и транзакциях. Эти значения соответствуют консольным.

При отображении в Grafana данные берутся из этой таблицы и на основе временного ряда строится кривая.

6 Размещение графаны

После отправки данных JMeter в InfluxDB вам необходимо настроить отображение Grafana.

6.1 Настройка источника данных InfluxDB

Настройте здесь URL-адрес, базу данных, пользователя и пароль и нажмите «Сохранить».

6.2 Добавьте панель мониторинга JMeter

Обычно используемая панель мониторинга — это официальный шаблон Grafana с идентификатором 5496. После импорта выберите соответствующий источник данных:

Вы увидите интерфейс:

На данный момент данных нет. Позже я приведу пример, чтобы увидеть, как данные JMeter соответствуют данным интерфейса.

7 Сравнение данных

На рисунке показаны два важных оператора запроса данных.

7.1 Кривая TPS

Язык кода:javascript
копировать
SELECT last("count") / $send_interval
FROM "$measurement_name"
WHERE ("transaction" =~ /^$transaction$/
       AND "statut" = 'ok')
       AND $timeFilter
       GROUP BY time($__interval)

Это общий TPS, называемый здесь пропускной способностью.

Здесь взяты данные обо всех транзакциях, имеющих успешный статус в ИЗМЕРЕНИЯХ.

7.2 Кривая времени отклика

Язык кода:javascript
копировать
SELECT mean("pct95.0")
FROM "$measurement_name"
WHERE ("application" =~ /^$application$/)
AND $timeFilter
GROUP BY "transaction", time($__interval) fill(null)

Это будет кривая, построенная с использованием времени отклика в пределах 95 pct.

7.3 Общий эффект отображения

7.4 Сценарий настройки JMeter

10 потоков, 10 итераций на поток и два HTTP-запроса:

Будет сгенерировано 10x10x2=200 запросов. JMeter работает:

Количество запросов соответствует ожиданиям. Посмотрите результаты, отображаемые Grafana:

Статистика по каждой транзакции:

7.5 Значение

Процесс презентации JMeter в Grafana завершен. Впредь:

  • Больше не нужно сохранять результаты выполнения JMeter
  • Не нужно ждать, пока JMeter выведет HTML.

8 node_exporter+Prometheus+логика отображения данных Grafana

Для тестирования производительности в широко используемой логике Grafana+Prometheus+Exporter первым шагом является просмотр ресурсов операционной системы.

Возьмите node_exporter в качестве примера, чтобы проиллюстрировать логику извлечения данных ОС, и посмотрите на источник данных мониторинга:

node_exporter может поддерживать множество ОС:

Конечно, вы также можете расширить свой собственный экспортер.

8.1 Настройка node_exporter

каталог node_exporter:

Язык кода:javascript
копировать
[root@7dgroup2 node_exporter-0.18.1.linux-amd64]# ll
total 16524
-rw-r--r-- 1 3434 3434    11357 Jun  5 00:50 LICENSE
-rwxr-xr-x 1 3434 3434 16878582 Jun  5 00:41 node_exporter
-rw-r--r-- 1 3434 3434      463 Jun  5 00:50 NOTICE

запускать:

Язык кода:javascript
копировать
./node_exporter --web.listen-address=:9200 &

8.2 Настройка Прометея

скачать:

Язык кода:javascript
копировать
wget -c https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz

Каталог после распаковки:

Язык кода:javascript
копировать
[root@ prometheus-2.11.1.linux-amd64]# ll
total 120288
drwxr-xr-x. 2 3434 3434     4096 Jul 10 23:26 console_libraries
drwxr-xr-x. 2 3434 3434     4096 Jul 10 23:26 consoles
drwxr-xr-x. 3 root root     4096 Nov 30 12:55 data
-rw-r--r--. 1 3434 3434    11357 Jul 10 23:26 LICENSE
-rw-r--r--. 1 root root       35 Aug  7 23:19 node.yml
-rw-r--r--. 1 3434 3434     2770 Jul 10 23:26 NOTICE
-rwxr-xr-x. 1 3434 3434 76328852 Jul 10 21:53 prometheus
-rw-r--r--  1 3434 3434     1864 Sep 21 09:36 prometheus.yml
-rwxr-xr-x. 1 3434 3434 46672881 Jul 10 21:54 promtool

существоватьprometheus.ymlДобавьте следующую конфигурацию,взятьданные:

Язык кода:javascript
копировать
  - job_name: 's1'
    static_configs:
    - targets: ['172.17.211.143:9200']

запускать:

Язык кода:javascript
копировать
./prometheus --config.file=prometheus.yml &

8.3 Размещение Графана

① Настройка источника данных
② Настройка шаблона node_exporter.

Если вы выберете отображение официального шаблона (ID: 11074):

8.4 Логика данных

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

Как показано на рисунке выше, нажмите «Изменить» в заголовке, чтобы увидеть выражение:

Язык кода:javascript
копировать
avg(irate(node_cpu_seconds_total{instance=~"$node",mode="system"}[30m])) by (instance)
avg(irate(node_cpu_seconds_total{instance=~"$node",mode="user"}[30m])) by (instance)
avg(irate(node_cpu_seconds_total{instance=~"$node",mode="iowait"}[30m])) by (instance)
1 - avg(irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[30m])) by (instance)

Они все взяты из Прометея.,SQLчитатьPrometheusсерединаnode_cpu_seconds_totalразличные модулиданные。

смотретьnode_exporterоткрытый счетчик:

Значение такое же, как и у верхнего,все из/proc/Оглавление。Следующееtopкомандующийданные:

Таким образом, логика значений мониторинга данных в ОС такова:

  • Получить значение из счетчика самой ОС
  • Пройти к Прометею
  • Затем найдите соответствующие данные из оператора запроса в Grafana.
  • Наконец представлено Grafana

9 Резюме

Зачем конкретно объяснять логику данных? Некоторые говорят, что с Prometheus+Grafana+Exportor нет необходимости вручную выполнять команды.

Однако все данные, полученные платформой мониторинга, должны быть данными, предоставленными отслеживаемым лицом. Данные мониторинга, которые может получить небольшой сборщик мониторинга, такой как node_exporter, — это не все данные о производительности всей системы, а только общие счетчики.

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

Как JMeter передает данные в Grafana?

1. Включите плагин в JMeter. Чтобы отправить данные JMeter в Grafana, вам необходимо включить плагин в JMeter. Найдите файл подключаемого модуля менеджера подключаемых модулей JMeter (JMeterPlugins-Manager.jar) в каталоге lib/ext JMeter и поместите его в этот каталог. После перезапуска JMeter нажмите «Диспетчер плагинов» в меню «Параметры» и выберите вкладку «Дополнительные плагины». Здесь выберите «grafana-backendlistener» и нажмите «Применить изменения».

2. Настройте Grafana. Откройте список источников данных в Grafana, выберите источник данных (например, InfluxDB) и создайте базу данных. Убедитесь, что имя базы данных, имя пользователя и пароль совпадают с именем, именем пользователя и паролем источника данных, подключенного к JMeter.

3. Добавьте внутренний прослушиватель в JMeter: добавьте внутренний прослушиватель в план тестирования JMeter. В свойствах внутреннего прослушивателя выберите «InfluxDBBackendListenerClient» в качестве реализации внутреннего прослушивателя и следуйте инструкциям на экране, чтобы установить сервер и порт для InfluxDB.

4. Просмотрите результаты теста в Grafana. Создайте панель мониторинга Grafana и выберите InfluxDB в качестве источника данных. Выберите панель на информационной панели и настройте ее для отображения данных результатов теста JMeter в Grafana.

Все они контролируют счетчики ОС. В чем разница между данными на платформе мониторинга и данными в команде мониторинга?

1. Платформа мониторинга представляет собой веб- или клиентскую платформу визуализации, которая может отображать показатели мониторинга ОС в режиме реального времени в виде диаграмм, таблиц и т. д., чтобы облегчить администраторам просмотр и анализ.

2. Команда мониторинга — это инструмент командной строки, который предоставляет богатые функции запроса и анализа индикаторов мониторинга ОС. Он получает и отображает различную системную статистику и показатели производительности в режиме реального времени путем ввода различных параметров команд в терминал. Он в основном используется специалистами по разработке, эксплуатации и техническому обслуживанию для диагностики и анализа.

3. Платформа мониторинга представляет собой настраиваемое и масштабируемое решение для мониторинга, которое может помочь администраторам контролировать сложные распределенные приложения. Команды мониторинга обычно могут отслеживать показатели только одной системы.

4. Платформа мониторинга обычно требует установки клиента для отправки данных на платформу. В команде мониторинга вы можете напрямую ввести команду в терминале для получения показателей мониторинга ОС.

Подводить итоги:

  • Платформа монитора предоставляет графический интерфейс,Администраторам легко просматривать и управлять показателями.
  • Команда монитора более гибкая.,Предоставьте более подробную информацию и конкретную информацию
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose