Задачи отчетности (Reporting Tasks)
В первой статье мы рассмотрели вопросы мониторинга потоков данных и состояния системы средствами GUI NiFi. Теперь рассмотрим, как передать необходимые метрики и отчеты об ошибках и состоянии кластера во внешние системы. NiFi предоставляет возможность сообщать о состоянии, статистике, показателях и информации мониторинга внешним службам с помощью интерфейса задач отчетности (Reporting Task).
Apache NiFi предоставляет несколько вариантов задач отчетности для поддержки внешних систем мониторинга, таких как Ambari, Grafana, Prometheus и т. д. Разработчик может создать пользовательскую задачу отчетности или настроить встроенные задачи для отправки метрик NiFi во внешние системы мониторинга.
Задачи отчетности:
PrometheusReportingTask – отчеты о метриках в формате Prometheus путем создания endpoint /metrics, которую можно использовать для внешнего мониторинга приложения;
AmbariReportingTask – для настройки службы метрик Ambari для NiFi;
MetricsReportingTask – эта задача создания отчетов передает набор показателей, касающихся JVM и экземпляра NiFi, для отчета, предоставляемого сервисом MetricReporterService;
ScriptedReportingTask – предоставляет отчеты и информацию о состоянии для последующего процессинга в скрипте;
ControllerStatusReportingTask – записывает 5-минутную статистику, которая отображается на сводной странице NiFi для процессоров и подключений;
MonitorDiskUsage – предоставляет отчет и предупреждения об использовании дискового пространства;
MonitorMemory – для мониторинга объема Java heap, используемого в пуле памяти Java JVM;
DataDogReportingTask – публикует метрики из NiFi в платформа мониторинга и аналитики для крупномасштабных приложений Datadog;
StandardGangliaReporter – предоставляет метрики в Ganglia для внешнего мониторинга приложения.
Задачи отчетности выполняются в фоновом режиме для предоставления статистических отчетов о том, что происходит в экземпляре NiFi. DFM (DataFlow manager) добавляет и настраивает задачи создания отчетов аналогично процессу для служб контроллеров. Чтобы добавить задачу создания отчетов, выберите «Настройки контроллера» в глобальном меню:
Отобразится окно настроек NiFi. Выберите вкладку “Reporting Tasks” и нажмите кнопку + в правом верхнем углу, чтобы создать новую “Reporting Task”.
После добавления задачи создания отчетов DFM может настроить ее, нажав кнопку «Изменить» в крайнем правом столбце. Другие кнопки в этом столбце включают «Пуск», «Удалить», «Состояние» и «Политики доступа».
Вы можете получить информацию о задачах создания отчетов, нажав кнопки «Просмотр сведений», «Использование» и «Оповещения» в левом столбце.
Когда DFM нажимает кнопку «Редактировать», открывается окно «Настройка задачи создания отчетов». В окне есть три вкладки: «Настройки», «Свойства» и «Комментарии». Это окно аналогично окну «Настройка процессора». На вкладке «Настройки» DFM может присвоить задаче создания отчетов уникальное имя (при желании). Он также содержит информацию об UUID, типе и пакете для задачи и предоставляет настройки для стратегии планирования задачи и расписания выполнения (аналогично тем же настройкам в процессоре). DFM может навести указатель мыши на значок вопросительного знака, чтобы увидеть больше информации о каждом свойстве настройки.
На вкладке «Свойства» перечислены различные свойства, которые можно настроить для задачи.
Вкладка «Комментарии» — это просто открытое текстовое поле, в котором DFM может хранить комментарии к задаче. После настройки задачи создания отчетов нажмите «Применить» ("Apply"), чтобы сохранить конфигурацию и закрыть окно, или нажмите «Отмена» ("Cancel"), чтобы отменить изменения и закрыть окно.
Если вы хотите запустить задачу создания отчетов, нажмите кнопку «Пуск» ("Start" ).
PrometheusReportingTask
Отчеты о метриках в формате Prometheus путем создания конечной точки http/metrics, которую можно использовать для внешнего мониторинга приложения. Задача создания отчетов сообщает набор показателей, касающихся JVM (необязательно) и экземпляра NiFi.
Описание параметров
Название | Значение по умолчанию | Допустимые значения | Описание |
Prometheus Metrics Endpoint Port | 9092 | Порт, через который можно получить доступ к метрикам prometheus | |
Instance ID | ${hostname(true)} | Идентификатор экземпляра NiFi, который будет включен в метрики, отправляемые в Prometheus | |
Metrics Reporting Strategy | All Components | * Root Process Group * All Process Groups * All Components | Степень детализации отчетов о метриках. Параметры включают только корневую группу процессов, все группы процессов или все компоненты |
Send JVM metrics | false | * true * false | Отправлять метрики JVM в дополнение к метрикам NiFi |
SSL Context Service | Controller Service API: RestrictedSSLContextService | Служба контекста SSL, используемая для защиты сервера. Если указано, сервер будет принимать только HTTPS-запросы.В противном случае сервер будет принимать только HTTP-запросы | |
Client Authentication | No Authentication | * No Authentication * Want Authentication * Need Authentication | Указывает, должна ли задача создания отчетов выполнять аутентификацию клиентов. Это значение игнорируется, если свойство <SSL Context Service> не указано или предоставленный контекст SSL использует только KeyStore, а не TrustStore |
Для настройки prometheus на наш NiFi необходимо добавить в конфигурационный файл prometheus.yml следующую секцию:
- job_name: "nifi"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["10.3.100.4:9092"]
В GUI Prometheus в меню “Status” необходимо выбрать “Targets” и убедиться, что наш адрес добавлен и активен.
Как пример средства для визуализации мониторинга можно использовать Grafana.
Первым шагом добавим Prometheus в качестве источника данных:
PrometheusReportingTask позволяет собирать следующие метрики:
№ | Название метрики | Описание |
1 | nifi_total_bytes_written | Текущее общее количество байтов, записанных компонентом |
2 | nifi_total_bytes_read | Текущее общее количество байтов, прочитанных компонентом |
3 | nifi_total_bytes_sent | Текущее общее количество байтов, отправленных компонентом |
4 | nifi_total_bytes_received | Текущее общее количество байтов, полученных компонентом |
5 | nifi_amount_bytes_written | Общее количество байтов, записанных компонентом |
6 | nifi_amount_bytes_read | Общее количество байтов, прочитанных компонентом |
7 | nifi_amount_bytes_transferred | Общее количество байтов, переданных компонентом |
8 | nifi_amount_bytes_sent | Общее количество байтов, отправленных компонентом |
9 | nifi_amount_bytes_received | Общее количество байтов, отправленных компонентом |
10 | nifi_amount_threads_terminated | Общее количество потоков, прерванных для компонента |
11 | nifi_total_task_duration | Продолжительность потоков в миллисекундах, которые компонент использовал для выполнения своих задач за последние 5 минут |
12 | nifi_average_lineage_duration | Средняя продолжительность очереди (в миллисекундах) для всех потоковых файлов, обработанных этим компонентом. |
13 | nifi_amount_threads_active | Общее количество потоков, активных для компонента |
14 | nifi_amount_flowfiles_received | Общее количество FlowFile, полученных компонентом |
15 | nifi_amount_flowfiles_sent | Общее количество FlowFile, отправленных компонентом |
16 | nifi_amount_flowfiles_transferred | Общее количество FlowFiles, переданных компонентом |
17 | nifi_amount_flowfiles_removed | Общее количество FlowFiles, удаленных компонентом |
18 | nifi_amount_items_output | Общее количество элементов, выводимых компонентом |
19 | nifi_amount_items_queued | Общее количество элементов, поставленных компонентом в очередь |
20 | nifi_amount_items_input | Общее количество элементов, введенных компонентом |
21 | nifi_size_content_output_total | Общий размер контента, выводимого компонентом |
22 | nifi_size_content_input_total | Общий размер контента, принимаемого компонентом |
23 | nifi_size_content_queued_total | Общий размер контента, поставленного в очередь в компонент |
24 | nifi_transmitting | Передает ли этот компонент данные. Значения 0 или 1 |
25 | nifi_backpressure_object_threshold | Количество потоковых файлов, которые можно поставить в очередь, прежде чем будет применено обратное давление |
26 | nifi_backpressure_bytes_threshold | Количество байтов, которое может быть поставлено в очередь до применения обратного давления |
27 | nifi_backpressure_enabled | Было ли применено обратное давление для этого компонента. Значения 0 или 1 |
28 | nifi_percent_used_count | Процент заполнения соединений на основе количества FlowFile. |
29 | nifi_percent_used_bytes | Процент заполнения соединений, на основе байтов содержимого |
30 | nifi_active_remote_port_count | Количество активных удаленных портов, связанных с этим компонентом |
31 | nifi_inactive_remote_port_count | Количество неактивных удаленных портов, связанных с этим компонентом |
Метрики JVM | ||
32 | nifi_jvm_heap_used | Размер используемой кучи NiFi JVM |
33 | nifi_jvm_heap_usage | % использования кучи NiFi JVM |
34 | nifi_jvm_heap_non_usage | Куча NiFi JVM не используется |
35 | nifi_jvm_file_descriptor_usage | Использование файловых дескрипторов NiFi JVM |
36 | nifi_jvm_daemon_thread_count | Количество запущенных потоков демона NiFi JVM |
37 | nifi_jvm_thread_count | Количество запущенных потоков NiFi JVM |
38 | nifi_jvm_gc_runs | NiFi JVM GC количество прогонов |
39 | nifi_jvm_gc_time | NiFi JVM GC время в миллисекундах |
40 | nifi_jvm_uptime | Время безотказной работы NiFi JVM |
Далее, базируясь на метриках, собираемых PrometheusReportingTask, построим дашборд для мониторинга:
AmbariReportingTask
Публикует метрики из NiFi в службу метрик Ambari (AMS). Из-за того, как работает служба метрик Ambari, эта задача создания отчетов должна запускаться каждые 60 секунд. На каждой итерации задача будет отправлять метрики из предыдущей итерации и вычислять текущие метрики, которые будут отправлены на следующей итерации. Планирование этой задачи создания отчетов с периодичностью, отличной от 60 секунд, может привести к неожиданным результатам.
Настройки задачи отчетности указаны ниже в таблице:
Свойство | Значение по умолчанию | Описание |
Metrics Collector URL | http://localhost:6188/ws/v1/timeline/metrics | URL-адрес службы сбора метрик Ambari |
Application ID | nifi | Идентификатор приложения, который будет включен в метрики, отправляемые в Ambari |
Hostname | ${hostname(true)} | Имя хоста этого экземпляра NiFi, которое будет включено в метрики, отправляемые в Ambari |
Process Group ID |
| Если указано, задача создания отчетов будет отправлять метрики только для этой группы процессов. Если нет, используется корневая группа процессов и отправляются глобальные метрики |
Задача отчетности отправляет в Ambari следующие показатели:
№ | Название показателя | Описание | |
1 | FlowFilesReceivedLast5Minutes | Количество FlowFiles, полученных за последние 5 минут | |
2 | BytesReceivedLast5Minutes | Количество байт, полученных за последние 5 минут | |
3 | FlowFilesSentLast5Minutes | Количество файлов FlowFiles, отправленных за последние 5 минут | |
4 | BytesSentLast5Minutes | Количество байт, отправленных за последние 5 минут | |
5 | FlowFilesQueued | Количество FlowFiles в очереди | |
6 | BytesQueued | Количество байт в очереди | |
7 | BytesReadLast5Minutes | Количество байт, прочитанных за последние 5 минут | |
8 | BytesWrittenLast5Minutes | Количество байт, записанных за последние 5 минут | |
9 | ActiveThreads | Количество активных потоков | |
10 | TotalTaskDurationSeconds | Общее количество потоков в секундах, которые компонент использовал для выполнения своих задач | |
Метрики JVM | |||
1 | jvm.uptime | Отображает, как долго выполняется процесс Java. Вы можете использовать эту метрику для отслеживания продолжительности жизни процесса Java и любых неожиданных перезапусков | |
2 | jvm.heap_used | Отображает объем памяти, используемый процессом JVM. Для NiFi конфигурация по умолчанию составляет 512 МБ | |
3 | jvm.heap_usage | Процент используемой кучи JVM | |
4 | jvm.non_heap_usage | Процент, используемый JVM (память вне кучи) | |
5 | jvm.thread_states.runnable | Количество запущенных потоков в JVM | |
6 | jvm.thread_states.blocked | Количество заблокированных потоков в JVM | |
7 | jvm.thread_states.timed_waiting | Количество ожидающих по времени потоков в JVM | |
8 | jvm.thread_states.terminated | Количество прекращенных потоков в JVM | |
9 | jvm.thread_count | Количество потоков в JVM | |
10 | jvm.daemon_thread_count | Отображает количество запущенных потоков демона. Поток демона — это поток, который не препятствует выходу JVM после завершения программы, даже если поток все еще выполняется | |
11 | jvm.file_descriptor_usage | Показывает количество подключений к операционной системе. Вы можете отслеживать этот показатель, чтобы убедиться, что ваши файловые дескрипторы JVM или соединения открываются и закрываются по мере выполнения задач | |
12 | jvm.gc.runs | количество запусков сборщика мусора (GC) garbage collector | |
13 | jvm.gc.time | GC время в миллисекундах |
Чтобы использовать эти показатели в Ambari, необходимо создать и установить службу NIFI в Ambari. Пожалуйста, обратитесь к документации Ambari и NiFi для получения дополнительной информации. Рекомендую ознакомиться со статьей Пьера Вилларда [2].
MetricsReportingTask
Эта задача создания отчетов передает набор показателей, касающихся JVM и экземпляра NiFi, для отчета, предоставляемого сервисом MetricReporterService.
При необходимости его можно использовать для определенной группы процессов, если указано свойство с идентификатором группы.
Свойство | Допустимые значения | Описание |
Metric Reporter Service | Controller Service API: Implementation: | Сервис, предоставляющий отчет для собранных метрик |
Process Group ID |
| Идентификатор группы процессов для отчета. Если не указано, выводятся метрики корневой группы процессов |
Для работы данной задачи отчётности необходимо настроить службу контроллера GraphiteMetricReporterService, которая передает метрические отчеты для Graphite.
Graphite — это корпоративный инструмент мониторинга, который одинаково хорошо работает как на дешевом оборудовании, так и на облачной инфраструктуре. Команды используют Graphite для отслеживания производительности своих веб-сайтов, приложений, бизнес-служб и сетевых серверов. Graphite относится к новому поколению инструментов мониторинга, упрощающих хранение, извлечение, совместное использование и визуализацию данных временных рядов.
Свойство | Значение по умолчанию | Описание |
Host |
| Имя хоста прослушивателя carbon |
Port |
| Имя порта прослушивателя carbon |
Charset | UTF-8 | Кодировка, используемая сервером graphite |
Metric Name Prefix | nifi | Префикс, который будет использоваться для всех имен метрик, отправляемых генераторами отчетов, предоставляемыми этой службой |
ScriptedReportingTask
Предоставляет отчеты и информацию о состоянии для дальнейшего процессинга в скрипте. Объекты ReportingContext, ComponentLog и VirtualMachineMetrics становятся доступными в виде переменных (context, log и vmMetrics – соответственно) в скрипте для дальнейшей обработки. Context делает доступной различную информацию, такую как события, происхождение, бюллетени, службы контроллера, группы процессов, метрики виртуальной машины Java и т. д.
Свойство | Значение по умолчанию | Допустимые значения | Описание |
Script Engine | Clojure | * Clojure * ECMAScript * Groovy * lua * python * ruby | Движок для выполнения скриптов |
Script File |
|
| Путь к файлу скрипта для выполнения. Можно использовать только одно свойство или Script File или Script Body |
Script Body |
|
| Содержимое скрипта для выполнения. Можно использовать только одно свойство или Script File или Script Body |
Module Directory |
|
| Разделенный запятыми список путей к файлам и/или каталогам, которые содержат модули, требуемые для скрипта |
ControllerStatusReportingTask
Задача отчетности записывает пятиминутную статистику, которая отображается на сводной странице NiFi для процессоров и подключений, а также при необходимости регистрирует дельты между предыдущей и текущей итерацией.
Статистика процессоров регистрируется с помощью регистратора org.apache.nifi.controller.ControllerStatusReportingTask.Processors, а статистика соединений регистрируется с помощью регистратора org.apache.nifi.controller.ControllerStatusReportingTask.Connections. При желании их можно настроить в конфигурации ведения журнала NiFi для записи в разные файлы.
Свойство | Значение по умолчанию | Допустимые значения | Описание |
Show Deltas | true | * true * false | Указывает, показывать ли разницу в значениях между текущим статусом и предыдущим статусом |
Reporting Granularity | Five Minutes | * Five Minutes * One Second | Интервал отчетности. По умолчанию пять минут |
Задача отчетности создает сообщение журнала для каждого процессора и каждого соединения в потоке. Для процессоров включена следующая информация (отсортированная по убыванию времени обработки):
Параметр | Описание |
Processor Name | Имя процессора |
Processor ID | Идентификатор процессора |
Processor Type | Тип процессора |
Run Status | Статус выполнения |
Flow Files In (5 mins) | Количество Flow Files на вход (за 5 мин.) |
FlowFiles Out (5 mins) | Количество Flow Files на выход (за 5 мин.) |
Bytes Read from Disk (5 mins) | Количество байт, прочитанные с диска (за 5 мин.) |
Bytes Written to Disk (5 mins) | Количество байт, записанных на диск (за 5 мин.) |
Number of Tasks Completed (5 mins) | Количество выполненных задач (5 мин.) |
Processing Time (5 mins) | Время обработки (5 минут) |
Для соединений включена следующая информация (отсортированная по убыванию размера FlowFiles в очереди):
Параметр | Описание |
Connection Name | Название соединения |
Connection ID | Идентификатор соединения |
Source Component Name | Имя исходного компонента |
Destination Component Name | Имя целевого компонента |
Flow Files In (5 mins) | Количество Flow Files на вход (за 5 мин.) |
FlowFiles Out (5 mins) | Количество Flow Files на выход (за 5 мин.) |
FlowFiles Queued | Количество FlowFiles в очереди |
Может оказаться удобным перенаправить вывод журнала этой задачи отчетности в отдельный файл журнала, а не в обычный журнал приложения.
Этого можно добиться, изменив файл logback.xml в каталоге NiFi conf/ таким образом, чтобы регистратор с именем org.apache.nifi.controller.ControllerStatusReportingTask был настроен на запись в отдельный журнал.
Кроме того, можно отключить ведение журнала для процессоров или соединений, либо разделить их на отдельные файлы журналов. Для этой цели следует использовать регистраторы с именами org.apache.nifi.controller.ControllerStatusReportingTask.Processors и org.apache.nifi.controller.ControllerStatusReportingTask.Connections – соответственно.
MonitorDiskUsage
Проверяет объем дискового пространства, доступного для указанного каталога, и предупреждает (через запись сообщения в журнал и бюллетень системного уровня), если раздел, в котором он находится, превышает некоторый настраиваемый порог дискового пространства.
Свойство | Значение по умолчанию | Описание |
Threshold | 80% | В случае превышения указанной величины будет создан бюллетень |
Directory Location |
| Путь к каталогу контролируемого раздела |
Directory Display Name | Un-Named | Имя, отображаемое для каталога в предупреждениях. |
MonitorMemory
Проверяет объем кучи Java, доступный в JVM для определенного пула памяти JVM. Если объем используемого пространства превышает некоторый настраиваемый порог, выдается предупреждение (через запись сообщения в журнал и вывода бюллетеня системного уровня), что пул памяти превышает этот порог.
Свойство | Значение по умолчанию | Описание |
Memory Pool |
| Имя пула памяти JVM для мониторинга |
Usage Threshold | 65% | Указывает порог, при котором должны генерироваться предупреждения |
Reporting Interval |
| Указывает, как часто эта задача создания отчетов должна отправлять бюллетени, когда использование памяти превышает настроенный порог |
DataDogReportingTask
Публикует метрики из NiFi в Datadog – службу наблюдения за облачными приложениями, обеспечивающая мониторинг серверов баз данных, инструментов и служб – с помощью платформы анализа данных на основе SaaS. Для точной и информативной отчетности компоненты должны иметь уникальные имена.
Получить подробную информацию про систему Datadog можно на официальном сайте https://www.datadoghq.com/
Свойство | Значение по умолчанию | Допустимые значения | Описание |
Metrics prefix | nifi |
| Префикс, который нужно добавить перед каждой метрикой |
Environment | dev |
| Среда, в которой выполняется поток данных. Это свойство будет включено в качестве тега метрики. |
API key |
|
| API-ключ Datadog. Если указано значение «агент», будет использоваться локальный агент Datadog. |
Datadog transport | Datadog HTTP | * Datadog Agent * Datadog HTTP | Транспорт, через который метрики будут отправляться в Datadog |
StandardGangliaReporter
Сообщает метрики в Ganglia для внешнего мониторинга приложения. Ganglia – масштабируемая распределённая система мониторинга кластеров параллельных и распределённых вычислений и облачных систем с иерархической структурой (http://ganglia.sourceforge.net). Позволяет отслеживать статистику и историю (загруженность процессоров, сети) вычислений в реальном времени для каждого из наблюдаемых узлов.
Для работы задачи нужно настроить следующие свойства:
Свойство | Значение по умолчанию | Допустимые значения | Описание |
Hostname | localhost |
| Полное имя хоста, на котором работает Ganglia |
Port | 8649 |
| Порт, на котором Ganglia прослушивает входящие соединения |
Send JVM Metrics | false | * true | Указывает, следует ли собирать и отправлять метрики JVM в дополнение к метрикам, специфичным для NiFi |
Задача отчетности сообщает следующий набор метрик на сервер Ganglia:
№ | Метрика | Описание |
1 | FlowFiles In (5 мин) | количество FlowFiles, полученных через Site-to-Site за последние пять минут |
2 | Bytes In (5 mins) | количество байтов, полученных через Site-to-Site за последние пять минут |
3 | FlowFiles Out (5 mins) | количество файлов FlowFiles, извлеченных из портов вывода через Site-to-Site за последние пять минут |
4 | Bytes Out (5 mins) | количество байтов, извлеченных из портов вывода через Site-to-Site за последние пять минут |
5 | Прочитано байтов (5 mins) | количество байтов, прочитанных с диска программой NiFi за последние пять минут |
6 | Bytes Written (5 mins) | количество байтов, записанных на диск NiFi за последние пять минут |
7 | FlowFiles Queued | общее количество FlowFiles, находящихся в настоящее время в очереди в системе на момент запуска задачи создания отчетов |
8 | Active Threads | количество потоков, активно работающих в момент времени, когда выполняется задача создания отчетов |
Заключение
В статье были продемонстрированы широкие возможности задач отчетности NiFi. Рассмотрены примеры сбора метрик и визуализации при помощи таких популярных систем, как Prometheus и Grafana.
Спроектировав хорошую систему мониторинга, можно значительно повысить уровень работы команд поддержки и сопровождения, скорость локализации и решения проблем.
Среди положительных сторон мониторинга средствами NiFi и визуализации с помощью Grafana следует выделить максимальную оперативность получения данных, наглядность и отсутствие необходимости писать программный код.
Список использованной литературы
https://nifi.apache.org/docs/nifi-docs/
https://pierrevillard.com/2017/05/16/monitoring-nifi-ambari-grafana/
https://pierrevillard.com/2017/05/17/monitoring-nifi-scripted-reporting-task