[Документация Yandex Cloud](../../../index.md) > [Monium](../../index.md) > Метрики > [Поставка и экспорт метрик](../index.md) > Поставка метрик пользовательских приложений

# Поставка метрик пользовательских приложений

Unified Agent собирает метрики в формате Prometheus и конвертирует их в формат Monium Metrics. При помощи Unified Agent вы сможете собирать метрики любых приложений, которые предоставляют метрики в формате Prometheus.

Для поставки в Monium Metrics метрик пользовательских приложений используется [вход metrics_pull](../../concepts/data-collection/unified-agent/configuration.md#metrics_pull_input), который периодически опрашивает приложение по HTTP, ожидая получить метрики в формате Prometheus.

Для примера рассмотрим поставку метрик тестового приложения на Python. Тестовое приложение и Unified Agent могут быть запущены как на разных виртуальных машинах, так и на одной. Если ВМ разные, используемые ими [группы безопасности](../../../vpc/concepts/security-groups.md) должны разрешать входящий и исходящий трафик на порт `8000` по протоколу `TCP`.

## Пример поставки метрик пользовательского приложения {#example}

Описанная методика может также применяться для поставки метрик любых пользовательских приложений, использующих [клиентские библиотеки Prometheus](https://prometheus.io/docs/instrumenting/clientlibs/).

1. Настройте сервисный аккаунт, от имени которого будут записываться метрики в Monium Metrics.

   1. [Создайте сервисный аккаунт](../../../iam/operations/sa/create.md) в каталоге, куда будут записываться метрики и [назначьте ему роль](../../../iam/operations/sa/assign-role-for-sa.md) `monitoring.editor`.

   1. [Привяжите сервисный аккаунт](../../../compute/operations/vm-connect/auth-inside-vm.md#link-sa-with-instance) к виртуальной машине, на которой будет установлен Unified Agent.

1. Запустите тестовое Python-приложение, предоставляющее метрики в формате Prometheus.

   1. Установите Python-библиотеку [prometheus_client](https://github.com/prometheus/client_python), выполнив следующие команды:

       ```bash
       sudo apt install python3-pip
       pip3 install prometheus_client
       ```

   1. Создайте тестовое Python-приложение, записав в файл **example.py** следующий код:

       **example.py:**
       ```python
       from prometheus_client import start_http_server, Summary
       import random
       import time

       # Создайте метрику для отслеживания количества запросов и времени их выполнения.
       REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')

       # Декорируйте функцию обработки запроса метрикой.
       @REQUEST_TIME.time()
       def process_request(t):
           """A dummy function that takes some time."""
           time.sleep(t)

       if __name__ == '__main__':
           # Запустите HTTP-сервер, чтобы приложение предоставило метрики.
           start_http_server(8000)
           # Сгенерируйте случайные запросы.
           while True:
               process_request(random.random())
       ```

   1. Запустите тестовое Python-приложение, выполнив следующую команду:

       ```bash
       python3 example.py
       ```

       Для успешной поставки метрик в Unified Agent тестовое приложение должно оставаться запущенным: не прерывайте его.

    1. Убедитесь, что приложение предоставляет метрики, выполнив команду с указанием публичного IP-адреса вашей ВМ с запущенным приложением:

        ```bash
        curl http://<публичный_адрес_ВМ>:8000
        ```

        Результат:

        ```text
        # HELP python_gc_objects_collected_total Objects collected during gc
        # TYPE python_gc_objects_collected_total counter
        python_gc_objects_collected_total{generation="0"} 362.0
        python_gc_objects_collected_total{generation="1"} 0.0
        python_gc_objects_collected_total{generation="2"} 0.0
        # HELP python_gc_objects_uncollectable_total Uncollectable object found during GC
        # TYPE python_gc_objects_uncollectable_total counter
        ```

1. Установите и настройте Unified Agent:

   1. При необходимости установите Docker:

      ```bash
      sudo apt-get install docker.io
      ```

   1. Создайте в домашнем каталоге файл **config.yml**.

       **config.yml:**
       ```yaml
        status:
          port: "16241"

        storages:
          - name: main
            plugin: fs
            config:
              directory: /var/lib/yandex/unified_agent/main
              max_partition_size: 100mb
              max_segment_size: 10mb

        channels:
          - name: cloud_monitoring
            channel:
              pipe:
                - storage_ref:
                    name: main
              output:
                plugin: yc_metrics
                config:
                  folder_id: "<идентификатор_каталога>"
                  iam:
                    cloud_meta: {}

        routes:
          - input:
              plugin: metrics_pull
              config:
                url: http://<публичный_адрес_ВМ>:8000/metrics
                metric_name_label: my_name  # необязательный, позволяет переименовать метку name вашего приложения, поскольку это имя зарезервировано агентом.
                format:
                  prometheus: {}
                namespace: app
            channel:
              pipe:
                - filter:
                    plugin: transform_metric_label
                    config:
                      label: name
                      rename_to: my_new_name
              channel_ref:
                name: cloud_monitoring

          - input:
              plugin: agent_metrics
              config:
                namespace: ua
            channel:
              pipe:
                - filter:
                    plugin: filter_metrics
                    config:
                      match: "{scope=health}"
              channel_ref:
                name: cloud_monitoring
       ```

       Где:

       * `folder_id` — идентификатор каталога, в который будут записываться метрики.
       * `url` — публичный адрес ВМ с тестовым приложением, предоставляющим метрики.
       * `metric_name_label` — определяет, в какую метку агент записывает название метрики для данных Prometheus. По умолчанию используется метка `name`, что может вызвать конфликт, если ваше приложение уже использует эту метку. В этом случае при записи метрик появляется ошибка:

         ```bash
         label name 'name' is reserved
         ```

       Чтобы избежать ошибки, укажите любое другое уникальное имя.
       * `transform_metric_label` — [фильтр](../../concepts/data-collection/unified-agent/filters.md#transform_metric_label_filter), который позволяет переименовать или добавить префикс к метке для метрики.
   1. Установите Unified Agent, выполнив в домашнем каталоге следующую команду:

      ```bash
      docker run \
      -p 16241:16241 -it --detach --uts=host \
      --name=ua \
      -v /proc:/ua_proc \
      -v $(pwd)/config.yml:/etc/yandex/unified_agent/conf.d/config.yml \
      -e PROC_DIRECTORY=/ua_proc \
      -e FOLDER_ID=<идентификатор_каталога> \
      cr.yandexcloud.kz/yc/unified-agent
      ```

      Где `FOLDER_ID` — идентификатор каталога, в который будут записываться метрики.
      
      Другие способы установки агента описаны в разделе [Установка и обновление Unified Agent](../../concepts/data-collection/unified-agent/installation.md).

 1. Убедитесь, что метрики поступают в Monium Metrics:

    1. На [главной странице](https://monium.yandex.cloud) сервиса Monium Metrics перейдите в раздел **Метрики**.

    1. В строке запроса выберите:
      - каталог, в который собираются метрики;
      - значение метки `Custom Metrics`;
      - имя метрики, начинающееся с префикса `app`.

#### Что дальше {#what-is-next}

- [Изучите концепции Unified Agent](../../concepts/data-collection/unified-agent/index.md)
- [Узнайте подробнее о конфигурировании Unified Agent](../../concepts/data-collection/unified-agent/configuration.md)
- [Ознакомьтесь с рекомендациями по эксплуатации Unified Agent](../../concepts/data-collection/unified-agent/best-practices.md)