Как стать автором
Обновить
Neoflex
Создаем ИТ-платформы для цифровой трансформации

Мониторинг в Apache NiFi. Часть вторая

Время на прочтение14 мин
Количество просмотров7.3K

Задачи отчетности (Reporting Tasks)

В первой статье мы рассмотрели вопросы мониторинга потоков данных и состояния системы средствами GUI NiFi. Теперь рассмотрим, как передать необходимые метрики и отчеты об ошибках и состоянии кластера во внешние системы. NiFi предоставляет возможность сообщать о состоянии, статистике, показателях и информации мониторинга внешним службам с помощью интерфейса задач отчетности (Reporting Task).

Apache NiFi предоставляет несколько вариантов задач отчетности для поддержки внешних систем мониторинга, таких как Ambari, Grafana, Prometheus и т. д. Разработчик может создать пользовательскую задачу отчетности или настроить встроенные задачи для отправки метрик NiFi во внешние системы мониторинга.

Задачи отчетности:

  1. PrometheusReportingTask – отчеты о метриках в формате Prometheus путем создания endpoint /metrics, которую можно использовать для внешнего мониторинга приложения;

  2. AmbariReportingTask – для настройки службы метрик Ambari для NiFi;

  3. MetricsReportingTask – эта задача создания отчетов передает набор показателей, касающихся JVM и экземпляра NiFi, для отчета, предоставляемого сервисом MetricReporterService;

  4. ScriptedReportingTask – предоставляет отчеты и информацию о состоянии для последующего процессинга в скрипте;

  5. ControllerStatusReportingTask – записывает 5-минутную статистику, которая отображается на сводной странице NiFi для процессоров и подключений;

  6. MonitorDiskUsage – предоставляет отчет и предупреждения об использовании дискового пространства;

  7. MonitorMemory – для мониторинга объема Java heap, используемого в пуле памяти Java JVM;

  8. DataDogReportingTask – публикует метрики из NiFi в платформа мониторинга и аналитики для крупномасштабных приложений Datadog;

  9. StandardGangliaReporter – предоставляет метрики в Ganglia для внешнего мониторинга приложения.

Задачи отчетности выполняются в фоновом режиме для предоставления статистических отчетов о том, что происходит в экземпляре NiFi. DFM (DataFlow manager) добавляет и настраивает задачи создания отчетов аналогично процессу для служб контроллеров. Чтобы добавить задачу создания отчетов, выберите «Настройки контроллера» в глобальном меню:

Рис. 1. Меню NiFi - “Controller Settings”
Рис. 1. Меню NiFi - “Controller Settings”

Отобразится окно настроек NiFi. Выберите вкладку “Reporting Tasks” и нажмите кнопку + в правом верхнем углу, чтобы создать новую “Reporting Task”.

Рис. 2. Добавление задачи отчетности
Рис. 2. Добавление задачи отчетности

После добавления задачи создания отчетов DFM может настроить ее, нажав кнопку «Изменить» в крайнем правом столбце. Другие кнопки в этом столбце включают «Пуск», «Удалить», «Состояние» и «Политики доступа».

Рис. 3. Панель управления задачами отчетности
Рис. 3. Панель управления задачами отчетности

Вы можете получить информацию о задачах создания отчетов, нажав кнопки «Просмотр сведений», «Использование» и «Оповещения» в левом столбце.

Рис. 4. Информация о задаче отчетности
Рис. 4. Информация о задаче отчетности

Когда DFM нажимает кнопку «Редактировать», открывается окно «Настройка задачи создания отчетов». В окне есть три вкладки: «Настройки», «Свойства» и «Комментарии». Это окно аналогично окну «Настройка процессора». На вкладке «Настройки» DFM может присвоить задаче создания отчетов уникальное имя (при желании). Он также содержит информацию об UUID, типе и пакете для задачи и предоставляет настройки для стратегии планирования задачи и расписания выполнения (аналогично тем же настройкам в процессоре). DFM может навести указатель мыши на значок вопросительного знака, чтобы увидеть больше информации о каждом свойстве настройки.

Рис. 5. Настройка задачи отчетности –вкладка «Настройки»
Рис. 5. Настройка задачи отчетности –вкладка «Настройки»

На вкладке «Свойства» перечислены различные свойства, которые можно настроить для задачи.

Рис. 6. Настройка задачи отчетности – вкладка «Свойства»
Рис. 6. Настройка задачи отчетности – вкладка «Свойства»

Вкладка «Комментарии» — это просто открытое текстовое поле, в котором DFM может хранить комментарии к задаче. После настройки задачи создания отчетов нажмите «Применить» ("Apply"), чтобы сохранить конфигурацию и закрыть окно, или нажмите «Отмена» ("Cancel"), чтобы отменить изменения и закрыть окно.

Если вы хотите запустить задачу создания отчетов, нажмите кнопку «Пуск» ("Start" ).

PrometheusReportingTask

Отчеты о метриках в формате Prometheus путем создания конечной точки http/metrics, которую можно использовать для внешнего мониторинга приложения. Задача создания отчетов сообщает набор показателей, касающихся JVM (необязательно) и экземпляра NiFi.

Рис. 7. Задачи отчетности PrometheusReportingTask
Рис. 7. Задачи отчетности PrometheusReportingTask
Рис. 8. Свойства задачи PrometheusReportingTask
Рис. 8. Свойства задачи PrometheusReportingTask

Описание параметров

Название

Значение по умолчанию

Допустимые значения

Описание

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
Implementation: StandardRestrictedSSLContextService

Служба контекста SSL, используемая для защиты сервера. Если указано, сервер будет принимать только HTTPS-запросы.В противном случае сервер будет принимать только HTTP-запросы

Client Authentication

No Authentication

* No Authentication

* Want Authentication

* Need Authentication

Указывает, должна ли задача создания отчетов выполнять аутентификацию клиентов. Это значение игнорируется, если свойство <SSL Context Service> не указано или предоставленный контекст SSL использует только KeyStore, а не TrustStore

Рис. 9. Запуск PrometheusReportingTask
Рис. 9. Запуск PrometheusReportingTask

Для настройки 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” и убедиться, что наш адрес добавлен и активен.

Рис. 10. Подменю Targets меню Status Prometheus
Рис. 10. Подменю Targets меню Status Prometheus

Как пример средства для визуализации мониторинга можно использовать Grafana.

Первым шагом добавим Prometheus в качестве источника данных:

Рис. 11. Настройка источника Prometheus в Grafana
Рис. 11. Настройка источника Prometheus в Grafana

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, построим дашборд для мониторинга:

Рис. 12. Пример дашборда Prometheus в Grafana
Рис. 12. Пример дашборда Prometheus в Grafana

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
MetricReporterService

Implementation
GraphiteMetricReporterService

Сервис, предоставляющий отчет для собранных метрик

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
* false

Указывает, следует ли собирать и отправлять метрики 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 следует выделить максимальную оперативность получения данных, наглядность и отсутствие необходимости писать программный код. 

Список использованной литературы

  1. https://nifi.apache.org/docs/nifi-docs/

  2. https://pierrevillard.com/2017/05/16/monitoring-nifi-ambari-grafana/

  3. https://pierrevillard.com/2017/05/17/monitoring-nifi-scripted-reporting-task

 

Теги:
Хабы:
Всего голосов 3: ↑3 и ↓0+3
Комментарии7

Публикации

Информация

Сайт
www.neoflex.ru
Дата регистрации
Дата основания
Численность
1 001–5 000 человек
Местоположение
Россия

Истории