Самая популярная логика мониторинга:
Только с помощью инструментов тестирования и мониторинга мы можем выполнить анализ производительности и выявить узкие места.
Независимо от того, в какой форме отображаются данные, самым важным является источник и значение данных для принятия правильных суждений.
Во время стресс-тестирования JMeter используйте консоль JMeter для просмотра результатов:
Или установите плагин, чтобы увидеть результаты:
Или JMeter генерирует HTML:
Инструмент стресса учитывает только три кривые: TPS (T определяется целью теста), время отклика и частоту ошибок. Коэффициент ошибок — это просто кривая, помогающая устранять проблемы. Когда проблем нет, мы смотрим только на TPS и время отклика.
Используйте Backend Listener JMeter для отправки данных в InfluxDB или Graphite в режиме реального времени. Серверный прослушиватель Graphite поддерживается в JMeter версии 2.13, а внутренний прослушиватель InfluxdDB поддерживается в JMeter 3.3. Оба отправляют данные асинхронно для просмотра.
С помощью данных, отправленных JMeter в InfluxDB, вы можете интуитивно увидеть тенденцию производительности системы, не просматривая данные HTML выше. Вам также будет легче сравнивать, когда вы прочтете это снова позже.
Пока JMeter передает нагрузку на сервер, он также подсчитывает TPS, время отклика, количество потоков, частоту ошибок и другую информацию.
По умолчанию он выводится на консоль каждые 30 секунд (можно контролировать параметр jmeter.properties #summariser.interval=30).
После настройки Backend Listener статистические результаты асинхронно отправляются в InfluxDB. Наконец настройте в Grafana:
Вы можете просматривать результаты теста JMeter в режиме реального времени, и данные, которые вы видите, такие же, как данные консоли.
Позвольте мне объяснить внутренний прослушиватель InfluxDB. Просто добавьте его в скрипт:
Сначала настройте URL-адрес influxdb, приложение и другую информацию. Конфигурацию приложения можно рассматривать как имя сцены.
Ключевой исходный код:
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:
@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.
Как InfluxDB хранит:
> 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:
Эти два хранят данные соответственно, а теги testtile и eventTags, настроенные в интерфейсе, помещаются в ИЗМЕРЕНИЯ событий. Эти два значения пока не используются в шаблоне.
В ИЗМЕРЕНИЯХ jmeter вы можете увидеть статистическую информацию о приложении и транзакциях. Эти значения соответствуют консольным.
При отображении в Grafana данные берутся из этой таблицы и на основе временного ряда строится кривая.
После отправки данных JMeter в InfluxDB вам необходимо настроить отображение Grafana.
Настройте здесь URL-адрес, базу данных, пользователя и пароль и нажмите «Сохранить».
Обычно используемая панель мониторинга — это официальный шаблон Grafana с идентификатором 5496. После импорта выберите соответствующий источник данных:
Вы увидите интерфейс:
На данный момент данных нет. Позже я приведу пример, чтобы увидеть, как данные JMeter соответствуют данным интерфейса.
На рисунке показаны два важных оператора запроса данных.
SELECT last("count") / $send_interval
FROM "$measurement_name"
WHERE ("transaction" =~ /^$transaction$/
AND "statut" = 'ok')
AND $timeFilter
GROUP BY time($__interval)
Это общий TPS, называемый здесь пропускной способностью.
Здесь взяты данные обо всех транзакциях, имеющих успешный статус в ИЗМЕРЕНИЯХ.
SELECT mean("pct95.0")
FROM "$measurement_name"
WHERE ("application" =~ /^$application$/)
AND $timeFilter
GROUP BY "transaction", time($__interval) fill(null)
Это будет кривая, построенная с использованием времени отклика в пределах 95 pct.
10 потоков, 10 итераций на поток и два HTTP-запроса:
Будет сгенерировано 10x10x2=200 запросов. JMeter работает:
Количество запросов соответствует ожиданиям. Посмотрите результаты, отображаемые Grafana:
Статистика по каждой транзакции:
Процесс презентации JMeter в Grafana завершен. Впредь:
Для тестирования производительности в широко используемой логике Grafana+Prometheus+Exporter первым шагом является просмотр ресурсов операционной системы.
Возьмите node_exporter в качестве примера, чтобы проиллюстрировать логику извлечения данных ОС, и посмотрите на источник данных мониторинга:
node_exporter может поддерживать множество ОС:
Конечно, вы также можете расширить свой собственный экспортер.
каталог node_exporter:
[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
запускать:
./node_exporter --web.listen-address=:9200 &
скачать:
wget -c https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz
Каталог после распаковки:
[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
Добавьте следующую конфигурацию,взятьданные:
- job_name: 's1'
static_configs:
- targets: ['172.17.211.143:9200']
запускать:
./prometheus --config.file=prometheus.yml &
Если вы выберете отображение официального шаблона (ID: 11074):
При тестировании и анализе производительности самое важное — знать источник и значение данных.
Как показано на рисунке выше, нажмите «Изменить» в заголовке, чтобы увидеть выражение:
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командующийданные:
Таким образом, логика значений мониторинга данных в ОС такова:
Зачем конкретно объяснять логику данных? Некоторые говорят, что с Prometheus+Grafana+Exportor нет необходимости вручную выполнять команды.
Однако все данные, полученные платформой мониторинга, должны быть данными, предоставленными отслеживаемым лицом. Данные мониторинга, которые может получить небольшой сборщик мониторинга, такой как node_exporter, — это не все данные о производительности всей системы, а только общие счетчики.
Независимо от того, используете ли вы команды для просмотра этих счетчиков или используете модные инструменты, само значение не изменится. Поэтому независимо от того, какие данные вы видите на платформе мониторинга или в командной строке, самое главное — знать значение и влияние изменений этих значений на следующий этап тестирования и анализа производительности.
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. Платформа мониторинга обычно требует установки клиента для отправки данных на платформу. В команде мониторинга вы можете напрямую ввести команду в терминале для получения показателей мониторинга ОС.
Подводить итоги: