BI Consult Desktop Logo BI Consult Mobile Logo
  • Russian BI Исследование российских bi
  • Перейти на Fine BI
  • Контакты
  • +7 812 334-08-01
    +7 499 608-13-06
  • Отправить сообщение
  • Главная
  • Продукты Эксперт-BI
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Сельское хозяйство
    • Энергетика
    • FMCG
    • Девелоперы
    • Маркетплейсы
    • Пищевая промышленность
    • Фармацевтика
    • Построение Data Platform
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и FP&A
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • IBP
    • ИТ (CIO)
    • Закупки
  • Платформы
    • Системы бизнес-анализа (BI)
    • Интегрированное бизнес-планирование (IBP)
    • Хранилища данных (DWH / Lakehouse)
    • Каталоги данных (Data Catalog)
    • Системы ETL и ELT
    • AI / Исскуственный интеллект
    • Шина данных (ESB)
    • Система управления мастер-данными (MDM)
    • Семантический слой
  • Услуги
    • Переход на отечественные BI и DWH системы
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений и DWH
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Курсы
    • Учебный курс Информационная грамотность (Data Literacy)
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Greenplum
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt (Data Build Tool)
  • Компания
    • Руководство
    • Новости
    • Клиенты
    • Карьера
    • Скачать
    • Контакты

BI

  • FineBI
  • FineReport
  • FineDataLink
  • FineChatBI (FineAI)
  • Коннекторы данных из 1С в BI
  • Airflow / Nifi
  • Visiology
  • PIX BI
  • Modus BI
  • Yandex.DataLens
  • Open-source BI: Superset/Metabase
  • Luxms BI
  • AW BI + Alpha BI
  • FlyBI + Форсайт. Аналитическая Платформа
  • Loginom
  • Триафлай
  • AI / Исскуственный интеллект
  • Optimacros
  • Навигатор BI
  • Семантический слой

СУБД

  • Arenadata
  • ClickHouse
  • Greenplum
  • Postgres Professional
  • TData

Другое

  • Построение Data Platform
    • Аналитическое хранилище данных
    • Data Lake и Data Engineering
    • Подробнее про Data Lake
    • Внедрение Lakehouse
      • Apache Doris
      • StarRocks
      • Trino
    • Миграция витрин из пропиетарных DWH на новый стек
    • Учебный курс "Современная архитектура хранилища данных"
Главная » Курсы по системам бизнес-анализа и методологии » Учебный курс Современная архитектура хранилища данных » Production-архитектура Prometheus: масштабирование и long-term storage » PromQL: язык запросов, основы агрегаций и функций

PromQL: язык запросов, основы агрегаций и функций

PromQL является фундаментальным инструментом для понимания состояния цифровой инфраструктуры в контексте Prometheus и связанных систем. В продакшн-архитектуре мониторинга PromQL определяет, как данные преобразуются в сигналы диагностики: от базовых выборок по метрикам до сложных агрегатов и временных окон. Глубокое знание языка позволяет не только строить точные и информативные запросы, но и проектировать архитектуру мониторинга так, чтобы поддерживать масштабирование, отказоустойчивость и оперативность эксплуатации больших платформ.

 

Краткое введение к главе

  • Рассматриваются базовые принципы PromQL: модель данных, синтаксис выражений, векторная семантика и примеры типовых запросов.
  • Раскрываются принципы агрегаций и функций: как правильно группировать метрики, работать с временными окнами и использовать субзапросы.
  • Обсуждаются аспекты производительности и оптимизации в контексте больших кластеров и интеграций с федерацией и удалённым хранением.
  • Предлагаются практические паттерны эксплуатации, включая дизайн лейблов, стратегию записи правил и подходы к мониторингу больших платформ.

     

Краткое содержание главы

  • Основы PromQL: модель данных, селекторы, векторная семантика и типы результатов.
  • Агрегации и функции: принципы вычислений, временные окна, субзапросы и практические примеры.
  • Выполнение запросов и производительность: планирование, потребление памяти и способы оптимизации.
  • Интеграции в масштабе: федерация, удалённое хранение и долгосрочное архивирование (Thanos, Cortex, Mimir).
  • Практические паттерны мониторинга больших платформ: проектирование лейблов, предиктивная агрегация и эксплуатационные практики.

     

Основы PromQL: модель данных и вычисления

PromQL оперирует двумя ключевыми понятиями: вектор и матрица. Вектор представляет собой множество значений для набора метрик на конкретном временном моменте времени, где каждый элемент содержит значение и набор лейблов. Матрица же - это диапазон значений одной и той же метрики по времени, получаемый при использовании range-вектора (например, metric[5m]). Результат любого выражения может быть вектором, скалярным значением или матрицей, и набор правил преобразования влияет на то, какие элементы остаются после применения операций.

  • Селекторы по метрикам и лейблам формируют начальный набор временных рядов. Пример простого селектора:

    up{job="apiserver"} 

    Этот запрос выбирает все временные ряды с метрикой up и лейблом job, равным "apiserver".

  • Операторы PromQL работают над векторами. Простейшее бинарное сложение выполняется по каждому соответствующему времени и соответствующим лейблам. Важное свойство: точное соответствие между лейблами влияет на результат. При бинарных операциях PromQL может использовать хитрую схему сопоставления: on, using, ignoring, group_left, group_right. Это позволяет управлять тем, как временные ряды совпадают между двумя операндами.

  • Типы результатов и поведение при отсутствии совпадений важны для корректной агрегации. Часто встречаются ситуации, когда один из операндов не имеет соответствия для некоторых лейблов; в таких случаях может быть использовано поведение безNan или специальная агрегация, чтобы не искажать итог.

- Примеры типовых выражений:

rate(http_requests_total[5m])
sum(rate(http_requests_total[5m])) by (service)
max_over_time(cpu_seconds_total[1h])

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

 

Селекторы и векторная семантика: принципы выбора

  • Точное соответствие лейблов: используйте операторы =, !=, =~ и !~ только тогда, когда уверены в диапазоне значений и регулярности изменений.
  • Применение by и without: группировка по выбранным лейблам через by позволяет аггрегировать данные по контекстам (например, по service или по страна), в то время как without исключает указанные лейблы из группировки.
  • Bool-режим: добавление ключевого слова bool к оператору позволяет сравнивать вектор с скаляром без побудительной фильтрации по лейблам, что полезно для некоторых условий фильтрации.

     

Операторы и типы результатов

  • Арифметические операции (+, -, *, /) применяются к соответствующим векторным элементам. При несовпадении лейблов результат может быть NaN; для избежания лишних срабатываний применяйте on/ignoring для точного управления сопоставлением.
  • Функции агрегации по времени и по лейблам: sum, avg, min, max, count, count_values - позволяют агрегировать данные по выбранной группировке или без нее.
  • Временные окна и функции: rate, irate, increase, delta, idelta - направлены на анализ изменения значений во времени. Для анализа распределений в окне применяются quantile_over_time, stddev_over_time, stdvar_over_time, avg_over_time, min_over_time, max_over_time.
  • Субзапросы: позволяют строить вложенные или каскадные вычисления с собственными окнами, например rate(http_requests_total[5m:1m]) для динамического шага обновления.

 

Примеры агрегаций и функций

sum(rate(http_requests_total[5m])) by (service)
quantile_over_time(0.95, latency_seconds[10m])
avg_over_time(memory_usage_bytes[1h])
stddev_over_time(cpu_usage_seconds_total[30m])

В продакшене особенно важна корректная трактовка временных окон. Например, quantile_over_time применяется к распределению задержек и позволяет оценивать долю запросов в рамках заданного порога. Встроенные функции stddev_over_time и stdvar_over_time помогают понять стабильность нагрузки на сервис и выявлять аномалии.

 

Субзапросы и гибкость анализа

Субзапросы вводят возможность динамического изменения диапазона входных данных без повторного запроса всей истории. Пример:

rate(http_requests_total[5m:1m])

Этот синтаксис позволяет получать серию значений для каждого шага обновления с шагом 1 минуту в окне 5 минут, что полезно для точного мониторинга пиков и провалов в реальном времени.

 

Выполнение запросов и производительность: принципы планирования и оптимизации

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

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

  • Экзекуция по времени: для range-векторов PromQL вычисление часто происходит по последовательности точек времени. В больших кластерах важно минимизировать объем данных, которые нужно извлечь из хранилища, применяя фильтры на уровне лейблов и используя агрегации в виде записывающих правил (recording rules).

  • Запросы и удалённое хранение: когда Prometheus собирается работать с удалённым хранилищем (через Thanos, Cortex, Mimir), задержки и пропускная способность сети становятся критическими факторами. В таких сценариях целесообразна реализация стратегий «pre-aggregation» и «downsampling» на уровне слоя хранения.

  • Планирование и оптимизация памяти: для больших наборов метрик важно мониторить потребление памяти и настроить параметры, связанные с хранением временных рядов, чтобы избежать переполнения памяти и свопов.

  • В прометей-архитектуре оптимизация часто достигается через:

    • разумное проектирование лейблов и минимизацию кардинальности;
    • использование Recording Rules для предвычисления сложных и часто используемых выражений;
    • оптимизацию под конкретные сценарии эксплуатации: быстрые промеры по SLA, детальный аудит топ-микросервисов, мониторинг инфраструктуры.
  • Пример простого, но эффективного подхода к запросу в большом кластере:

    • сначала ограничиваемся конкретным сервисом и environ, затем применяем rate и агрегируем по нужному уровню детализации.
      rate(http_requests_total{service="orders", environment="prod"}[5m])
      sum(rate(http_requests_total{service="orders", environment="prod"}[5m])) by (region)

      Этот подход уменьшает объем ненужной выборки и ускоряет последующую агрегацию по регионам.

       

Интеграции в масштабе: федерация, удалённое хранение и долгосрочное хранение

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

 

Федерация и cross-cluster запросы

Федерация Prometheus позволяет агрегировать данные из нескольких Prometheus-инстансов, давая единый обзор на уровне организации. В контексте PromQL это достигается через механизм federate endpoint и агрегирование по заданной схеме. Основные принципы:

  • агрегация на уровне федерации должна быть осмысленной: выбирать только те метрики и временные диапазоны, которые действительно нужны для центрального дашборда.
  • ограничение на объем данных, доступных через федерацию: применение фильтров по лейблам и выбор конкретных сервисов.
  • учет задержек обновления: федеративные источники могут иметь различное время актуальности; это следует учитывать в плане SLA и интервалов обновления.

     

Удалённое хранение и долгосрочное хранение (Thanos, Cortex, Mimir)

Удалённое хранение позволяет переносить старые данные в Object Storage и экономить ресурсы на локальных инстансах, сохраняя при этом возможность выполнения PromQL-запросов. Основные принципы:

  • remote_read и remote_write: Prometheus поддерживает чтение удалённых источников через remote_read, объединяя данные из локального хранилища и удалённого источника. При интеграции Thanos, Cortex или Mimir данные могут храниться на объектном хранилище (S3, GCS, Swift), а запросы могут выполняться через распределённые сервисы.
  • downsampling и хранение разных редукций: в Thanos и Cortex реализуется downsampling для долгосрочного хранения с приемлемой точностью, что существенно снижает нагрузку на сеть и хранилище.
  • консистентность и задержки: удалённое хранение вносит задержку доступа к данным по сравнению с локальным хранилищем; проектирование запросов и архитектуры следует учитывать, чтобы не перегружать сетевые каналы и не создавать узкие места в производительности.
  • интеграционные паттерны: минимальная связка включает Prometheus с удалённым хранением через remote_read, нередки подходы с центральной агрегацией и разнесением задач мониторинга по географии и средам.

     

Паттерны эксплуатации в больших платформах

  • проектирование лейблов и схемы именования: избегайте избыточной кардинальности и заранее документируйте назначения каждого лейбла, чтобы упрощать федерацию и агрегацию.
  • запись правил для предвычисления: нарастайте слой записывающих правил (recording rules) для часто используемых выражений и для консолидирования данных перед отправкой на удалённое хранение.
  • мониторинг задержек и доступности удалённых источников: настройте алерты на задержки репликации и на частоту обновлений для удалённых источников, чтобы своевременно реагировать на деградацию.
  • планирование хранения и бюджета: определяйте политики архивации, хранение в горячем и холодном слое, а также параметры ретенции в соответствии с требованиями регуляторики и бизнес-задач.

     

Практические паттерны мониторинга больших платформ

  • Лейблы и кардинальность: разумная структура лейблов минимизирует рост кардинальности - критически для производительности. Выносите высококардинальные признаки в внешние источники сигнала (например, сервисное имя или регион) и избегайте динамических значений, которые создают бесконечное множество временных рядов.
  • Записывающие правила: предварительная агрегация через recording rules уменьшает нагрузку на вычисления в режиме реального времени и позволяет ускорить дашборды.
  • Архитектурные решения для долгосрочного хранения: применяйте downsampling на уровне слоя хранения (например, в Thanos Store gateway или Cortex) и используйте federation для агрегации критичных метрик в реальном времени, оставляя детальный анализ на локальном уровне.
  • Эксплуатационная устойчивость: держите наготове несколько конфигураций при миграциях между системами хранения, тестируйте поведение запросов при отключении части удалённых источников, обеспечивая устойчивость к сетевым задержкам и сбоям.

     

Key takeaways

  • PromQL - это мощный язык с векторной семантикой и обширной функциональностью для агрегаций по времени.
  • Неправильное проектирование лейблов и кардинальности приводит к существенному ухудшению производительности; дизайн лейблов требует дисциплины и документированности.
  • Агрегации и функции PromQL позволяют строить информативные сигналы для SLA, SLO и бизнес-метрик, особенно при анализе задержек, спроса и устойчивости сервисов.
  • Субзапросы и временные окна расширяют аналитические возможности, но требуют внимательного анализа задержек и точности данных.
  • В масштабируемой архитектуре интеграции с Thanos, Cortex или Mimir и федерации особенно необходимы стратегии по удалённому хранению и предагрегации для поддержания производительности и управляемости данных.
  • Оптимизация запросов в больших кластерах достигается через предвычисление, ограничение кардинальности, аккуратное проектирование селекторов и разумное использование удалённого хранения.
  • Правильная эксплуатация мониторинга больших платформ строится на сочетании локального мониторинга, федерации и долгосрочного хранения с учётом задержек, доступности и затрат на хранение.

     

FAQ

  1. В чем разница между instant и range запросами в PromQL?
  • Instant запрос возвращает одно значение на заданный момент времени и применяется к вектору или скалярному выражению. Range запрос возвращает матрицу значений по последовательности временных точек, что позволяет анализировать динамику во времени. Разная семантика требует различной трактовки результатов и применимых функций (rate, increase для range-векторов).

 

  1. Как выбрать между rate и irate для анализа задержек?
  • rate рассчитывает среднюю скорость изменения за окно, что стабилизирует шумы в данных. irate более точен на коротких окнах и позволяет выявлять резкие изменения в наиболее свежих данных, но может быть шумным. В продакшне чаще используют rate для стабильных дашбордов, а irate - для детального расследования пиков.

 

  1. Какие принципы помогают избежать перегрузки при высокой кардинальности?
  • ограничивайте динамические лейблы;
  • используйте recording rules для предвычисления часто используемых сочетаний;
  • избегайте надмножества лейблов в запросах и применяйте фильтры по конкретным сервисам или окружениям;
  • планируйте хранение с учётом долголетности данных и используйте удалённое хранение для архивов.

 

  1. Что даёт субзапрос в PromQL и когда применять его?
  • субзапросы позволяют задавать собственное окно и шаг обновления, что обеспечивает гибкую настройку анализа без дублирования выражений. Применяйте их, когда нужно адаптировать анализ к изменяющимся потребностям или когда требуется более тонкая настройка окон.

 

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

 

  1. Какие риски связаны с удалённым хранением (remote storage) и как их минимизировать?
  • задержки доступа и задержки обновлений данных; риск несогласованности между локальным и удалённым хранилищем. Решения: использование предагрегации и downsampling, распределение запросов по кластерам, мониторинг задержек и доступности удалённых источников.

 

  1. Какие паттерны эксплуатации подходят для больших платформ?
  • политика минимизации кардинальности лейблов, предвычисление через recording rules, использование федерации для агрегирования по окружениям, стратегическое использование удалённого хранения, регулярное тестирование отказоустойчивости и сценариев миграции между слоями хранения.

 

  1. Какие практики следует применять при проектировании сигналов мониторинга для больших сервисов?
  • сначала определить критические сценарии (SLA/SLO), затем проектировать набор лейблов, обеспечивающих точную агрегацию по сервисам и регионам; далее - добавлять предвычисляемые правила и использовать PromQL-функции для оценки задержек, доступности и пропускной способности.

 

  1. Что важно знать о совместимости Prometheus, Thanos, Cortex и Mimir?
  • Prometheus обеспечивает локальный сбор и исполнение запросов; Thanos, Cortex и Mimir расширяют архитектуру за счёт удалённого хранения и горизонтального масштабирования. Взаимодействие требует аккуратной настройки remote_read/remote_write, согласованности схем лейблов и последовательного управления версиями.

 

  1. Какую роль играет PromQL в автоматизации мониторинга и эксплуатации?
  • PromQL позволяет строить точные сигналы тревог, гибкие дашборды и механизмы предиктивной диагностики. Комбинация PromQL, правил записи и интеграций с удалённым хранением даёт основу для устойчивого мониторинга больших цифровых платформ и своевременной реакции на инциденты.

 

← Предыдущая статья
Протоколы и форматы: exposition format, remote_write, remote_read
Следующая статья →
Модели хранения данных: локальное против удаленного

 

Узнать стоимость решенияЗапросить видео презентацию

Решения

Анализировать ФинансыУвеличивайте ПродажиОптимальный Склад и ЛогистикаМаркетинговые Метрики

Клиенты
  • «Балтийский лизинг» — первая компания в России, получившая лицензию № 0001 от Министерства экономики РФ на лизинговую деятельность, лицензия зарегистрирована 2 сентября 1996 года. «Балтийский лизинг» работает на российском рынке 33 года: компания представлена 79 филиалами по всей стране, сегодня в штате более 1300 сотрудников. За последние десять лет компания профинансировала имущество для 80 000 клиентов.

  • ЭГИС - международная фармацевтическая компания, основанная в 1907 году в Венгрии. Компания имеет представительства более чем в 60 странах мира, в том числе в России. Компания ЭГИС является одним из ведущих производителей дженерических лекарственных средств в Центральной и Восточной Европе. Её деятельность охватывает все звенья производственно-сбытовой фармацевтической цепочки.

  • НПФ «Будущее» — один из крупнейших негосударственных пенсионных фондов России, предоставляющий услуги по пенсионному обеспечению и накоплениям. Фонд активно внедряет цифровые технологии для повышения качества обслуживания клиентов.

  • Банк "Санкт-Петербург" - это универсальный коммерческий банк, предоставляющий полный спектр финансовых услуг для частных и корпоративных клиентов. Банк основан в 1990 году и имеет генеральную лицензию Банка России на осуществление банковских операций. Сеть банка включает более 170 офисов и отделений, а также свыше 1000 банкоматов и терминалов в Санкт-Петербурге, Москве и других регионах.

  • Решения
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Энергетика
    • Фармацевтика
  • Услуги
    • Переход на отечественные BI и DWH
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Техническая поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Платформы
    • FineBI
    • FineReport
    • FineDataLink
    • Коннекторы данных из 1С в BI
    • Airflow + NiFi
    • Visiology
    • Luxms BI
    • Modus BI
    • PIX BI
    • Arenadata
    • ClickHouse
    • Greenplum
    • Postgres Professional
    • Open-source BI: Superset/Metabase
    • Loginom
    • Yandex.DataLens
    • AI / Исскуственный интеллект
    • Optimacros
    • Шины данных
  • Курсы
    • Учебный курс Информационная грамотность
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt
  • Функциональные решения
    • Создание Data Lake
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и прогнозная аналитика
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • Сквозная аналитика
  • Компания
    • О нас
    • Руководство
    • Новости
    • Клиенты
    • Скачать
    • Контакты
    • Политика конфиденциальности
RutubeVkontakteLinkedInYouTube
ООО "Би Ай Консалт",
ИНН: 7811437757,
ОГРН: 1097847154184
199178, Россия,
Санкт-Петербург,
6-ая линия В.О., Д. 63, 4 этаж
Тел: +7 (812) 334-08-01
Тел: +7 (499) 608-13-06
E-mail: info@biconsult.ru

 

 

 

 

 

×

Пользуясь сайтом, вы соглашаетесь с использованием cookies и политикой конфиденциальности.