[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-nablyudaemost-chto-takoe-micrometer-i-kak-ego-ispolzovat-v-spring-boot":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},761,"chto-takoe-micrometer-i-kak-ego-ispolzovat-v-spring-boot",20,"nablyudaemost","Наблюдаемость","📊","Что такое Micrometer и как его использовать в Spring Boot?","Micrometer — библиотека-фасад для сбора метрик в JVM-приложениях. По аналогии с SLF4J для логирования, Micrometer предоставляет единый API для работы с метриками, а конкретная реализация (backend) подключается отдельно.\n\n> **Аналогия из жизни:** Micrometer — это как универсальная розетка-переходник. Вы подключаете прибор (приложение) через один стандартный разъём, а на выходе можете подключить любую сеть — Prometheus, Datadog, CloudWatch.\n\n### Поддерживаемые бэкенды\n\nPrometheus, Datadog, New Relic, CloudWatch, InfluxDB, Graphite, StatsD, Dynatrace, Elastic, Wavefront, OpenTelemetry.\n\n### Подключение к Spring Boot\n\n```xml\n\u003C!-- pom.xml -->\n\u003Cdependency>\n    \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n    \u003CartifactId>spring-boot-starter-actuator\u003C\u002FartifactId>\n\u003C\u002Fdependency>\n\n\u003C!-- Для экспорта в Prometheus -->\n\u003Cdependency>\n    \u003CgroupId>io.micrometer\u003C\u002FgroupId>\n    \u003CartifactId>micrometer-registry-prometheus\u003C\u002FartifactId>\n\u003C\u002Fdependency>\n```\n\n```yaml\n# application.yml\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: health, info, metrics, prometheus\n  metrics:\n    tags:\n      application: ${spring.application.name}\n    distribution:\n      percentiles-histogram:\n        http.server.requests: true\n      sla:\n        http.server.requests: 100ms, 500ms, 1s\n```\n\n### MeterRegistry — центральный компонент\n\n`MeterRegistry` — интерфейс, через который регистрируются все метрики. Spring Boot автоматически создаёт и настраивает нужную реализацию.\n\n\u003Cdetails>\u003Csummary>Пример OrderMetrics с Counter, Timer, Gauge\u003C\u002Fsummary>\n\n```java\n@Component\npublic class OrderMetrics {\n    private final Counter createdOrders;\n    private final Timer orderProcessingTimer;\n    private final AtomicInteger pendingOrders = new AtomicInteger(0);\n\n    public OrderMetrics(MeterRegistry registry) {\n        this.createdOrders = Counter.builder(\"orders.created.total\")\n            .description(\"Total number of created orders\")\n            .register(registry);\n\n        this.orderProcessingTimer = Timer.builder(\"orders.processing.duration\")\n            .description(\"Order processing duration\")\n            .publishPercentiles(0.5, 0.95, 0.99)\n            .publishPercentileHistogram()\n            .register(registry);\n\n        Gauge.builder(\"orders.pending\", pendingOrders, AtomicInteger::get)\n            .description(\"Number of pending orders\")\n            .register(registry);\n    }\n\n    public void onOrderCreated() {\n        createdOrders.increment();\n        pendingOrders.incrementAndGet();\n    }\n\n    public void onOrderProcessed() {\n        pendingOrders.decrementAndGet();\n    }\n\n    public Timer getProcessingTimer() {\n        return orderProcessingTimer;\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Аннотация @Timed\n\n```java\n@RestController\n@RequestMapping(\"\u002Fapi\u002Forders\")\npublic class OrderController {\n\n    @Timed(value = \"orders.get.time\",\n           description = \"Time to get orders\",\n           percentiles = {0.5, 0.95, 0.99})\n    @GetMapping\n    public List\u003COrder> getOrders() {\n        return orderService.findAll();\n    }\n}\n```\n\nДля работы `@Timed` необходимо зарегистрировать `TimedAspect`:\n\n```java\n@Configuration\npublic class MetricsConfig {\n    @Bean\n    public TimedAspect timedAspect(MeterRegistry registry) {\n        return new TimedAspect(registry);\n    }\n}\n```\n\n### Тэги (Dimensions) — ключевая концепция\n\nТэги позволяют разбивать метрики по измерениям (dimensions). Одна метрика с разными тэгами даёт множество временных рядов.\n\n```java\nCounter.builder(\"http.requests\")\n    .tag(\"method\", \"GET\")\n    .tag(\"uri\", \"\u002Fapi\u002Forders\")\n    .tag(\"status\", \"200\")\n    .register(registry);\n```\n\n```java\n\u002F\u002F Общие тэги для всех метрик приложения\n@Bean\npublic MeterRegistryCustomizer\u003CMeterRegistry> commonTags() {\n    return registry -> registry.config()\n        .commonTags(\"service\", \"order-service\")\n        .commonTags(\"env\", \"production\")\n        .commonTags(\"region\", \"eu-west-1\");\n}\n```\n\n### Автоматические метрики Spring Boot\n\n| Группа | Метрики | Описание |\n|--------|---------|----------|\n| JVM | `jvm.memory.used`, `jvm.memory.max`, `jvm.gc.pause` | Память, GC, потоки |\n| HTTP | `http.server.requests` | Все HTTP-запросы (метод, URI, статус, время) |\n| HikariCP | `hikaricp.connections.active`, `hikaricp.connections.idle` | Пул соединений к БД |\n| Kafka | `kafka.consumer.records.consumed.total` | Метрики Kafka consumer\u002Fproducer |\n| Cache | `cache.gets`, `cache.puts`, `cache.evictions` | Метрики кэша |\n| Logback | `logback.events` | Количество лог-событий по уровням |\n| System | `system.cpu.usage`, `process.cpu.usage` | CPU, открытые файлы |\n\n\u003Cdetails>\u003Csummary>Кастомный MeterBinder\u003C\u002Fsummary>\n\n```java\n@Component\npublic class BusinessMetricsBinder implements MeterBinder {\n    private final OrderRepository orderRepository;\n\n    public BusinessMetricsBinder(OrderRepository orderRepository) {\n        this.orderRepository = orderRepository;\n    }\n\n    @Override\n    public void bindTo(MeterRegistry registry) {\n        Gauge.builder(\"orders.total.in.db\", orderRepository, OrderRepository::count)\n            .description(\"Total orders in database\")\n            .register(registry);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\u003Csummary>Пример Prometheus-выхода (\u002Factuator\u002Fprometheus)\u003C\u002Fsummary>\n\n```\n# HELP http_server_requests_seconds Duration of HTTP server request handling\n# TYPE http_server_requests_seconds histogram\nhttp_server_requests_seconds_bucket{method=\"GET\",status=\"200\",uri=\"\u002Fapi\u002Forders\",le=\"0.1\"} 450\nhttp_server_requests_seconds_bucket{method=\"GET\",status=\"200\",uri=\"\u002Fapi\u002Forders\",le=\"0.5\"} 498\nhttp_server_requests_seconds_bucket{method=\"GET\",status=\"200\",uri=\"\u002Fapi\u002Forders\",le=\"+Inf\"} 500\nhttp_server_requests_seconds_count{method=\"GET\",status=\"200\",uri=\"\u002Fapi\u002Forders\"} 500\nhttp_server_requests_seconds_sum{method=\"GET\",status=\"200\",uri=\"\u002Fapi\u002Forders\"} 12.35\n\n# HELP jvm_memory_used_bytes The amount of used memory\n# TYPE jvm_memory_used_bytes gauge\njvm_memory_used_bytes{area=\"heap\",id=\"G1 Eden Space\"} 1.2345678E7\n```\n\n\u003C\u002Fdetails>\n\n### Важное\n- Micrometer — **фасад**, а не реализация. Без подключённого registry (например, `micrometer-registry-prometheus`) метрики собираются, но никуда не экспортируются.\n- **Dimensional metrics** (тэги) — основа модели Micrometer. В отличие от hierarchical (Graphite-стиль `orders.eu.success`), тэги позволяют гибко фильтровать и агрегировать.\n- Spring Boot 3.x использует **Micrometer Observation API** — единый механизм для метрик и трейсов одновременно.\n\n### Частые ошибки\n- **Создание метрики при каждом вызове**: `Counter.builder(...).register(registry)` внутри метода — метрика должна создаваться один раз (в конструкторе или `@PostConstruct`).\n- **Динамические тэги с высокой кардинальностью**: `tag(\"userId\", userId)` создаёт отдельный time series для каждого пользователя.\n- **Забыть подключить TimedAspect**: без него аннотация `@Timed` на кастомных методах не работает (на контроллерах работает через WebMvcMetricsFilter).\n- **Не настроить exposure endpoints**: по умолчанию endpoint `\u002Factuator\u002Fprometheus` не доступен; нужно явно добавить в `management.endpoints.web.exposure.include`.\n\n### Как используется в 2026\n- **Micrometer Observation API** — унифицированный API, одно «наблюдение» автоматически создаёт и метрику, и span трейса.\n- **Micrometer Context Propagation** — автоматическая передача контекста (traceId, MDC) между потоками, включая реактивные цепочки и виртуальные потоки.\n- **Micrometer 2.x** с нативной поддержкой OpenTelemetry Protocol (OTLP) для экспорта метрик напрямую в OTel Collector.\n- Большинство Spring Boot-стартеров (Data, Security, Kafka, RabbitMQ) поставляются с автоматическими Observation-хуками.\n\n> **На собеседовании:** ключевой тезис — Micrometer является фасадом (как SLF4J для логов). Покажите, что умеете выбирать тип метрики (Counter vs Gauge vs Timer), знаете про ограничение кардинальности тэгов и понимаете разницу между `@Timed` и Observation API в Spring Boot 3.x.","","middle",[15],"observability",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Что такое Micrometer и как его использовать в Spring Boot? — Gymterview","Micrometer — библиотека-фасад для сбора метрик в JVM-приложениях. По аналогии с SLF4J для логирования, Micrometer предоставляет единый API для работы с метрикам","Micrometer — библиотека-фасад для сбора метрик в JVM-приложениях. По аналогии с SLF4J для логирования, Micrometer предос",[15,13],"Micrometer — библиотека-фасад для сбора метрик в JVM-приложениях. По аналогии с SLF4J для логирования, Micrometer предоставляет единый API для работы с метриками, а конкретная реализация (backend) подключается отдельно.",true]