[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-nablyudaemost-chto-takoe-metriki-i-kakie-tipy-metrik-sushchestvuyut":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},760,"chto-takoe-metriki-i-kakie-tipy-metrik-sushchestvuyut",20,"nablyudaemost","Наблюдаемость","📊","Что такое метрики и какие типы метрик существуют?","Метрика — числовое значение, измеряемое в определённый момент времени, которое агрегируется и хранится как временной ряд (time series). Каждый временной ряд идентифицируется именем и набором лейблов (меток).\n\n```\nhttp_server_requests_seconds_count{method=\"GET\", uri=\"\u002Fapi\u002Forders\", status=\"200\"} 1523\n│                                  │                                                │\n│ имя метрики                      │ лейблы (dimensions)                            │ значение\n```\n\n### Основные типы метрик\n\n| Тип | Описание | Примеры | Функции PromQL |\n|-----|----------|---------|----------------|\n| Counter | Монотонно возрастающее значение (сбрасывается в 0 при перезапуске) | Количество HTTP-запросов, число ошибок | `rate()`, `increase()` |\n| Gauge | Значение, которое может увеличиваться и уменьшаться | Активные подключения, размер очереди, heap usage | `avg()`, `min()`, `max()` |\n| Histogram | Распределение значений по бакетам | Время ответа, размер запроса | `histogram_quantile()` |\n| Timer | Counter + Histogram для измерения длительности | Время обработки заказа | `rate()`, `histogram_quantile()` |\n\n\u003Cdetails>\u003Csummary>Примеры кода для каждого типа\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Counter\nCounter orderCounter = Counter.builder(\"orders.created\")\n    .description(\"Total number of created orders\")\n    .tag(\"region\", \"eu\")\n    .register(meterRegistry);\norderCounter.increment();\n\n\u002F\u002F Gauge\nGauge.builder(\"queue.size\", queue, Queue::size)\n    .description(\"Current queue size\")\n    .register(meterRegistry);\n\n\u002F\u002F Histogram (DistributionSummary)\nDistributionSummary summary = DistributionSummary.builder(\"order.amount\")\n    .description(\"Order amounts distribution\")\n    .baseUnit(\"rubles\")\n    .publishPercentiles(0.5, 0.95, 0.99)\n    .publishPercentileHistogram()\n    .register(meterRegistry);\nsummary.record(orderAmount);\n\n\u002F\u002F Timer\nTimer timer = Timer.builder(\"order.processing.time\")\n    .description(\"Time to process an order\")\n    .publishPercentiles(0.5, 0.95, 0.99)\n    .register(meterRegistry);\ntimer.record(() -> processOrder(order));\n```\n\n\u003C\u002Fdetails>\n\n### Методологии выбора метрик\n\n**RED-метод** — для сервисов (запрос-ответ):\n- **R**ate — количество запросов в секунду\n- **E**rrors — количество неудачных запросов в секунду\n- **D**uration — распределение времени ответа (гистограмма)\n\n**USE-метод** — для ресурсов (CPU, память, диск, сеть):\n- **U**tilization — процент использования ресурса\n- **S**aturation — степень перегрузки (очередь ожидания)\n- **E**rrors — количество ошибок ресурса\n\n### Бизнес-метрики vs Технические метрики\n\n| Бизнес-метрики | Технические метрики |\n|---------------|-------------------|\n| Количество заказов в минуту | CPU utilization |\n| Конверсия корзины | JVM heap usage |\n| Среднее время доставки | HTTP response time |\n| Выручка в реальном времени | Connection pool utilization |\n| Количество активных пользователей | GC pause duration |\n\n\u003Cdetails>\u003Csummary>Пример бизнес-метрики\u003C\u002Fsummary>\n\n```java\n@Service\npublic class PaymentService {\n    private final Counter successPayments;\n    private final Counter failedPayments;\n    private final DistributionSummary paymentAmount;\n\n    public PaymentService(MeterRegistry registry) {\n        this.successPayments = Counter.builder(\"payments.success\")\n            .tag(\"provider\", \"stripe\")\n            .register(registry);\n        this.failedPayments = Counter.builder(\"payments.failed\")\n            .tag(\"provider\", \"stripe\")\n            .register(registry);\n        this.paymentAmount = DistributionSummary.builder(\"payments.amount\")\n            .baseUnit(\"kopecks\")\n            .publishPercentiles(0.5, 0.95)\n            .register(registry);\n    }\n\n    public PaymentResult pay(PaymentRequest request) {\n        try {\n            PaymentResult result = processPayment(request);\n            successPayments.increment();\n            paymentAmount.record(request.getAmount());\n            return result;\n        } catch (PaymentException e) {\n            failedPayments.increment();\n            throw e;\n        }\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Важное\n- **Counter** нельзя использовать для значений, которые уменьшаются (например, количество активных сессий — это Gauge).\n- При работе с Counter в Prometheus всегда используйте функцию `rate()` или `increase()`, а не абсолютное значение.\n- **Перцентили** нельзя агрегировать между инстансами: p99 от 5 инстансов — это **не** p99 системы. Для агрегации используйте гистограммы.\n- Лейблы с высокой кардинальностью (userId, requestId) **убивают** производительность Prometheus. Используйте лейблы с ограниченным набором значений.\n\n### Частые ошибки\n- **Использование Gauge вместо Counter** для подсчёта событий: при перезапуске теряется контекст, а `rate()` не работает корректно.\n- **Высокая кардинальность лейблов**: добавление `userId` или `orderId` как лейбла создаёт миллионы time series и перегружает хранилище.\n- **Отсутствие бизнес-метрик**: техническая команда мониторит только инфраструктуру, но не понимает, влияет ли деградация на бизнес.\n- **Неправильный выбор бакетов гистограммы**: дефолтные бакеты могут не подходить для конкретного SLA. Настраивайте `serviceLevelObjectives()`.\n\n### Как используется в 2026\n- **Micrometer 1.13+\u002F2.x** — стандарт для метрик в Spring-экосистеме, с нативной поддержкой OpenTelemetry.\n- **Exemplars** — связь метрик с трейсами. Prometheus поддерживает exemplars, позволяя «кликнуть» на spike в графике и перейти к конкретному трейсу.\n- **Prometheus Native Histograms** — новый формат гистограмм с автоматическим выбором бакетов и экономией места.\n- **PromQL** остаётся основным языком запросов; Grafana поддерживает визуальный query builder.\n\n> **На собеседовании:** важно не просто перечислить Counter\u002FGauge\u002FHistogram, а объяснить, когда какой тип применять. Покажите знание RED\u002FUSE-методологий и упомяните, что бизнес-метрики часто важнее технических. Классическая ловушка — забыть про ограничение кардинальности лейблов.","","junior",[15],"observability",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Что такое метрики и какие типы метрик существуют? — Gymterview","Метрика — числовое значение, измеряемое в определённый момент времени, которое агрегируется и хранится как временной ряд (time series). Каждый временной ряд иде","Метрика — числовое значение, измеряемое в определённый момент времени, которое агрегируется и хранится как временной ряд",[15,13],"Метрика — числовое значение, измеряемое в определённый момент времени, которое агрегируется и хранится как временной ряд (time series). Каждый временной ряд идентифицируется именем и набором лейблов (меток).",true]