Подробное объяснение использования мониторинга Spring Boot Actuator

Java

В приложениях корпоративного уровня недостаточно научиться разрабатывать приложения SpringBoot и писать модульные тесты и интеграционные тесты. Также необходим в реальной разработке программного обеспечения: мониторинг и управление приложениями. Модуль Actuator SpringBoot реализует мониторинг и управление приложениями.

Введение в привод

В производственных системах часто необходимо отслеживать и поддерживать фактическую работу системы (например, процессор, ввод-вывод, диск, базу данных, бизнес-функции и другие показатели). В проекте SpringBoot модуль Actuator предоставляет несколько конечных точек интерфейса HTTP (Endpoint) для предоставления информации о внутреннем состоянии во время работы приложения.

Модуль Actuator предоставляет модуль для мониторинга и управления производственной средой и может использовать http, jmx, ssh, telnet и т. д. для управления и мониторинга приложений. Включая аудит приложений (аудит), информацию о состоянии работоспособности (работоспособности), сбор данных (сбор метрик), статистику и другие функции мониторинга эксплуатации и обслуживания. В то же время он предоставляет настраиваемые индикаторы мониторинга, которые могут расширять конечную точку Actuator (конечную точку). Эти показатели представлены в виде данных интерфейса JSON.

Использование привода

Чтобы использовать Spring Boot Actuator, вам необходимо добавить следующие зависимости:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

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

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-actuator-autoconfigure</artifactId>
</dependency>

Среди них spring-boot-actuator — реализация функции, а spring-boot-actuator-autoconfigure — автоматическая конфигурация.

Примечание. Поскольку SpringBoot Actuator будет раскрывать сведения о службе, для обеспечения безопасности рекомендуется добавить соответствующую зависимость spring-boot-starter-security для контроля безопасности, чтобы при доступе к конечной точке мониторинга приложений вам необходимо было введите данные аутентификации. Требуемые зависимости следующие:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Что касается использования безопасности, то мы не будем здесь ее расширять, вы можете настроить соответствующий пароль доступа в файле приложения:

spring:
  security:
    user:
      name: admin
      password: admin

В следующем содержании для удобства мы пока не вводим безопасность.

После вышеперечисленных шагов запустите проект SpringBoot, и привод автоматически интегрируется и настраивается, доступ к которому можно получить через: http://localhost:8080/actuator, и результаты следующие:

{
    "_links": {
        "self": {
            "href": "http://localhost:8080/actuator",
            "templated": false
        },
        "health": {
            "href": "http://localhost:8080/actuator/health",
            "templated": false
        },
        "health-component": {
            "href": "http://localhost:8080/actuator/health/{component}",
            "templated": true
        },
        "health-component-instance": {
            "href": "http://localhost:8080/actuator/health/{component}/{instance}",
            "templated": true
        },
        "info": {
            "href": "http://localhost:8080/actuator/info",
            "templated": false
        }
    }
}

Поддерживаемые ссылки по умолчанию:

/actuator
/actuator/health
/health/{component}/{instance}
/health/{component}
/actuator/info

Вы можете настроить дополнительную информацию для мониторинга в файле конфигурации приложения:

management:
  endpoints:
    web:
      exposure:
        include: '*'
#      base-path: /monitor
  endpoint:
    health:
      show-details: always
    shutdown:
      enabled: true
  • management.endpoints.web.exposure.include='*', что означает включить весь мониторинг или настроить только тот мониторинг, который необходимо включить, например: management.endpoints.web.exposure.include=beans,trace.
  • management.endpoint.health.show-details=always, конечная точка работоспособности включена для отображения всех сведений. По умолчанию /actuator/health общедоступен, но не показывает подробности.
  • management.endpoints.web.base-path=/monitor, включите указанный URL-адрес для доступа к корневому пути, путь по умолчанию — /actuator/*, а путь доступа становится /monitor/* при включении.
  • management.endpoint.shutdown.enabled=true, разрешить интерфейсу завершать работу SpringBoot.

Если информация мониторинга должна передаваться между вызовами, ее можно поддерживать с помощью конфигурации CORS, которая по умолчанию отключена. Он включается после установки свойства management.endpoints.web.cors.allowed-origins.

Например, чтобы разрешить вызовы GET и POST из домена https://www.choupangxia.com:

management:
  endpoints:
    web:
      cors:
        allowed-origins: https://www.choupangxia.com
        allowed-methods: GET,POST

REST-интерфейс

Spring Boot Actuator предоставляет очень богатый интерфейс мониторинга, с помощью которого вы можете понять внутреннее состояние среды выполнения приложения. Actuator также поддерживает определяемое пользователем добавление конечных точек и может определять некоторые дополнительные индикаторы в соответствии с фактическими приложениями и отслеживать их во время выполнения.

HTTP-метод дорожка описывать
GET /auditevents Отображает информацию о событиях аудита для текущего приложения.
GET /beans Отображает полный список всех Spring Bean-компонентов в приложении.
GET
/conditions Отображает состояние классов конфигурации и автоконфигурации и почему они применяются или не применяются.
GET
/configprops
Отображает список всех @ConfigurationProperties
GET
/env
Отображает свойства из Spring ConfigurableEnvironment.
GET
/flyway Отображает путь миграции базы данных, если он есть.
GET
/health
Отображает информацию о работоспособности приложения (простой «статус» при доступе с использованием соединения без проверки подлинности, полная информация при доступе с использованием соединения с проверкой подлинности)
GET
/info
Отображение произвольной информации о приложении
GET
/liquibase
Показать любые пути миграции базы данных Liquibase, если таковые имеются
GET
/metrics
Отображение информации о метриках текущего приложения
GET
/mappings
Отображает список всех путей @RequestMapping.
GET
/scheduledtasks
Показывать запланированные задачи в приложении
GET
/sessions
Позволяет извлекать и удалять пользовательские сеансы из хранилища сеансов, поддерживаемого сеансом Spring. Недоступно при использовании поддержки Spring Session для реактивных веб-приложений.
POST
/shutdown
Позволяет приложениям корректно завершать работу (не включено по умолчанию)
GET
/threaddump
выполнить дамп потока

При использовании веб-приложения (Spring MVC, Spring WebFlux или Jersey) вы также можете использовать следующие интерфейсы:

HTTP-метод дорожка описывать
GET /heapdump Возвращает сжатый GZip файл дампа кучи hprof
GET /jolokia Предоставление JMX-бинов через HTTP (WebFlux недоступен, когда Jolokia находится в пути к классам)
GET /logfile Возвращает содержимое файла журнала (если установлено свойство logging.file или logging.path), поддерживает использование заголовка диапазона HTTP для получения частичной информации о содержимом файла журнала.
GET /prometheus Отображение информации о метриках в формате, который может быть очищен сервером Prometheus.

Подробный интерфейс

Health в основном используется для проверки рабочего состояния приложения, которое является наиболее часто используемой точкой мониторинга. Этот интерфейс обычно используется для отображения рабочего состояния экземпляра приложения и причин, по которым приложение не является «работоспособным», таких как подключение к базе данных, недостаточно места на диске и т. д.

По умолчанию статус работоспособности открыт.Посетите: http://localhost:8080/actuator/health, чтобы увидеть статус приложения.

{
    "status" : "UP"
}

Установите порядок кодов состояния: setStatusOrder(Status.DOWN,Status.OUTOFСЕРВИС, Статус.UP, Статус.НЕИЗВЕСТНО). Отфильтруйте нераспознанные коды состояния. Если код состояния отсутствует, состояние всего приложения SpringBoot — НЕИЗВЕСТНО. Отсортируйте все собранные коды состояния. Возвращает первый код состояния в упорядоченной последовательности кодов состояния как состояние всего приложения Spring Boot.

Health проверяет работоспособность приложения, объединяя несколько индексов работоспособности. SpringBoot Actuator автоматически настраивает следующее:

название описывать
CassandraHealthIndicator Убедитесь, что база данных Cassandra запущена.
CouchbaseHealthIndicator Убедитесь, что кластер Couchbase запущен.
DiskSpaceHealthIndicator Проверьте, недостаточно ли места на диске.
DataSourceHealthIndicator Проверьте, может ли быть установлено соединение с DataSource.
ElasticsearchHealthIndicator Убедитесь, что кластер Elasticsearch запущен.
InfluxDbHealthIndicator Убедитесь, что сервер InfluxDB работает.
JmsHealthIndicator Проверьте, запущен ли агент JMS.
MailHealthIndicator Убедитесь, что почтовый сервер запущен.
MongoHealthIndicator Проверьте, работает ли база данных Mongo.
Neo4jHealthIndicator Проверьте, запущен ли сервер Neo4j.
RabbitHealthIndicator Убедитесь, что сервер Rabbit запущен.
RedisHealthIndicator Проверьте, работает ли сервер Redis.
SolrHealthIndicator Убедитесь, что сервер Solr запущен.

Все можно отключить, установив свойство management.health.defaults.enabled.

собственная конечная точка

Существует три основных категории собственных конечных точек:

  • Класс конфигурации приложения: получите информацию о классе конфигурации, тесно связанную с приложениями Spring Boot, такую ​​как конфигурация приложения, переменные среды и автоматические отчеты о конфигурации, загруженные в приложение.
  • Класс метрик: Получите метрики, используемые для мониторинга во время работы приложения, такие как информация о памяти, информация о пуле потоков, статистика HTTP-запросов и т. д.
  • Класс управления операциями: предоставляет функции класса операций, такие как закрытие приложения.

Класс конфигурации приложения

/conditions: эта конечная точка используется для получения отчета о конфигурации автоматизации для приложения, который включает все варианты конфигурации автоматизации. В нем также указано, выполнены ли отдельные предварительные условия для каждой потенциальной конфигурации автоматизации. Эта конечная точка может помочь нам легко найти конкретные причины, по которым некоторые автоматические конфигурации не вступают в силу.

Содержимое отчета делит конфигурацию автоматизации на две части: PositiveMatches возвращает конфигурацию автоматизации с успешным сопоставлением условий, а негативные соответствия возвращает конфигурацию автоматизации с неудачным сопоставлением условий.

Часть кода выглядит следующим образом:

"contexts": {
        "application": {
            "positiveMatches": {
                "MsgAutoConfiguration": [
                    {
                        "condition": "OnClassCondition",
                        "message": "@ConditionalOnClass found required class 'com.secbro2.msg.MsgService'"
                    }
                ],
                "MsgAutoConfiguration#msgService": [
                    {
                        "condition": "OnPropertyCondition",
                        "message": "@ConditionalOnProperty (msg.enabled=true) matched"
                    },
                    {
                        "condition": "OnBeanCondition",
                        "message": "@ConditionalOnMissingBean (types: com.secbro2.msg.MsgService; SearchStrategy: all) did not find any beans"
                    }
                ],

/info: это информация, настроенная в файле конфигурации, начинающаяся с info, например, конфигурация:

info:
  app:
    name: spring-boot-actuator
    version: 1.0.0

Возвращаемый результат:

{
  "app":{
    "name":"spring-boot-actuator",
    "version":"1.0.0"
  }
}

Параметры, настроенные в информации, также могут поступать из узлов элементов в файле pom.xml через значения атрибутов, окруженные символами *@*. следующее:

info:
    build:
        artifact: @project.artifactId@
        name: @project.name@
        description: @project.description@
        ersion: @project.version@

Возвращаемый результат:

{
    "build": {
        "artifact": "spring-learn",
        "name": "spring-learn",
        "description": "Demo project for Spring Boot",
        "ersion": "0.0.1-SNAPSHOT"
    }
}

/beans: эта конечная точка используется для получения всех bean-компонентов, созданных в контексте приложения.

{
    "contexts": {
        "application": {
            "beans": {
                "endpointCachingOperationInvokerAdvisor": {
                    "aliases": [],
                    "scope": "singleton",
                    "type": "org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvokerAdvisor",
                    "resource": "class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/EndpointAutoConfiguration.class]",
                    "dependencies": ["environment"]
                },
                "defaultServletHandlerMapping": {
                    "aliases": [],
                    "scope": "singleton",
                    "type": "org.springframework.web.servlet.HandlerMapping",
                    "resource": "class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]",
                    "dependencies": []
                },
            },
            "parentId": null
        }
    }
}

Интерфейс показывает псевдоним бина, тип, является ли он синглтоном, адрес класса, зависимости и другую информацию.

/configprops: эта конечная точка используется для получения отчета о свойствах, настроенного в приложении.

{
    "spring.transaction-org.springframework.boot.autoconfigure.transaction.TransactionProperties": {
        "prefix": "spring.transaction",
        "properties": {}
    }
}

Информация о конфигурации для свойства TransactionProperties показана выше.

/mappings: эта конечная точка используется для возврата всех отчетов о сопоставлении контроллеров SpringMVC.

{
  "handler": "Actuator web endpoint 'beans'",
  "predicate": "{GET /actuator/beans, produces [application/vnd.spring-boot.actuator.v2+json || application/json]}",
  "details": {
    "handlerMethod": {
      "className": "org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping.OperationHandler",
      "name": "handle",
      "descriptor": "(Ljavax/servlet/http/HttpServletRequest;Ljava/util/Map;)Ljava/lang/Object;"
    },
    "requestMappingConditions": {
      "consumes": [],
      "headers": [],
      "methods": ["GET"],
      "params": [],
      "patterns": ["/actuator/beans"],
      "produces": [{
        "mediaType": "application/vnd.spring-boot.actuator.v2+json",
        "negated": false
      }, {
        "mediaType": "application/json",
        "negated": false
      }]
    }
  }
}

/env: эта конечная точка отличается от /configprops, она используется для получения отчета обо всех доступных свойствах среды для приложения. В том числе: переменные среды, свойства JVM, конфигурация конфигурации приложения, параметры в командной строке.

Метрический класс

Индикаторы, предоставляемые классом конфигурации приложения, являются статическими отчетами, в то время как содержимое отчетов, предоставляемое конечными точками класса метрик, является динамическим, предоставляя некоторую информацию о моментальных снимках приложения во время выполняемого процесса, например: использование памяти, статистика HTTP-запросов, индикаторы внешних ресурсов. , и т.д. Эти конечные точки очень полезны для создания систем мониторинга в микросервисной архитектуре.

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

{
    "names": [
        "jvm.memory.max",
        "jvm.threads.states",
        "http.server.requests",
        "process.files.max",
        "jvm.gc.memory.promoted",
        "system.load.average.1m",
        "jvm.memory.used",
        "jvm.gc.max.data.size",
        "jvm.gc.pause",
        "jvm.memory.committed",
        "system.cpu.count",
        "logback.events",
        "tomcat.global.sent",
        "jvm.buffer.memory.used",
        "tomcat.sessions.created",
        "jvm.threads.daemon",
        "system.cpu.usage",
        "jvm.gc.memory.allocated",
        "tomcat.global.request.max",
        "tomcat.global.request",
        "tomcat.sessions.expired",
        "jvm.threads.live",
        "jvm.threads.peak",
        "tomcat.global.received",
        "process.uptime",
        "tomcat.sessions.rejected",
        "process.cpu.usage",
        "tomcat.threads.config.max",
        "jvm.classes.loaded",
        "jvm.classes.unloaded",
        "tomcat.global.error",
        "tomcat.sessions.active.current",
        "tomcat.sessions.alive.max",
        "jvm.gc.live.data.size",
        "tomcat.threads.current",
        "process.files.open",
        "jvm.buffer.count",
        "jvm.buffer.total.capacity",
        "tomcat.sessions.active.max",
        "tomcat.threads.busy",
        "process.start.time"
    ]
}

Из приведенного выше примера есть следующие важные показатели:

  • Системная информация: включая количество процессоров, время работы безотказной работы и instance.uptime, а также среднюю загрузку системы systemload.average.
  • mem.*: сводная информация о памяти, включая общий объем памяти, выделенной приложению, и текущий объем свободной памяти. Эта информация поступает из java.lang.Runtime.
  • heap.*: использование памяти кучи. Эта информация поступает из java.lang.management.MemoryUsage, полученного методом getHeapMemoryUsage в интерфейсе java.lang.management.MemoryMXBean.
  • nonheap.*: Использование памяти без кучи. Эта информация поступает из java.lang.management.MemoryUsage, полученного методом getNonHeapMemoryUsage в интерфейсе java.lang.management.MemoryMXBean.
  • threads.*: использование потоков, включая количество потоков, количество потоков демона (daemon), пик потока (peak) и т. д. Все эти данные взяты из java.lang.management.ThreadMXBean.
  • классы.*: Статистика классов загружается и выгружается приложением. Эти данные взяты из java.lang.management.ClassLoadingMXBean.
  • gc.*: Подробная информация о сборщике мусора, включая количество сборок мусора gc.ps_scavenge.count, время использования сборки мусора gc.ps_scavenge.time, количество алгоритмов маркировки-очистки gc.ps_marksweep.count и время использования алгоритмов маркировки-развертки gc.ps_marksweep.time. Эти данные взяты из java.lang.management.GarbageCollectorMXBean.
  • httpssessions.*: Использование сеанса контейнера Tomcat. Включая максимальное количество сессий httpsessions.max и количество активных сессий httpsessions.active. Эта информация о метрике доступна только в том случае, если встроенный Tomcat представлен в качестве контейнера приложения.
  • Gauge.*: один из показателей производительности HTTP-запросов, в основном используется для отображения абсолютного значения. Например, Gauge.response.hello: 5 в приведенном выше примере означает, что время задержки последнего приветственного запроса составляет 5 миллисекунд.
  • counter.*: Один из показателей производительности HTTP-запросов, в основном используется как счетчик, фиксирующий увеличение и уменьшение. В приведенном выше примере counter.status.200.hello: 11 означает, что запрос hello возвращает статус 200 11 раз.

/threaddump: создает моментальный снимок активности текущего потока. Нам удобно просматривать ситуацию в потоке при ежедневном обнаружении проблем. В основном он отображает такую ​​информацию, как имя потока, идентификатор потока, статус потока, следует ли ждать блокировки ресурсов и т. д.

{
    "threads": [{
        "threadName": "Reference Handler",
        "threadId": 2,
        "blockedTime": -1,
        "blockedCount": 2,
        "waitedTime": -1,
        "waitedCount": 0,
        "lockName": null,
        "lockOwnerId": -1,
        "lockOwnerName": null,
        "daemon": true,
        "inNative": false,
        "suspended": false,
        "threadState": "RUNNABLE",
        "priority": 10,
        "stackTrace": [{
            "classLoaderName": null,
            "moduleName": "java.base",
            "moduleVersion": "11.0.4",
            "methodName": "waitForReferencePendingList",
            "fileName": "Reference.java",
            "lineNumber": -2,
            "className": "java.lang.ref.Reference",
            "nativeMethod": true
        }
  ...
  "lockedMonitors": [],
        "lockedSynchronizers": [{
            "className": "java.util.concurrent.locks.ReentrantLock$NonfairSync",
            "identityHashCode": 2060076420
        }],
        "lockInfo": null
  ...
  {
        "threadName": "DestroyJavaVM",
        "threadId": 42,
        "blockedTime": -1,
        "blockedCount": 0,
        "waitedTime": -1,
        "waitedCount": 0,
        "lockName": null,
        "lockOwnerId": -1,
        "lockOwnerName": null,
        "daemon": false,
        "inNative": false,
        "suspended": false,
        "threadState": "RUNNABLE",
        "priority": 5,
        "stackTrace": [],
        "lockedMonitors": [],
        "lockedSynchronizers": [],
        "lockInfo": null
    }]
}

/trace: эта конечная точка используется для возврата базовой информации о трассировке HTTP. По умолчанию информация об отслеживании хранится в формате .

Класс управления операциями

/shutdown: настройте эту функцию в файле конфигурации:

management.endpoint.shutdown.enabled=true

Используйте curl для имитации почтового запроса к этому интерфейсу:

curl -X POST "http://localhost:8080/actuator/shutdown"

Отображаемый результат:

{
    "message": "Shutting down, bye..."
}

резюме

В этой статье представлены основные функции и подробные объяснения мониторинга SpringBoot Actuator, а в следующей статье будет показано, как эта функция реализована в Spring Boot. Добро пожаловать в паблик-аккаунт "Program New Vision".

Оригинальная ссылка: "Подробное объяснение использования мониторинга Spring Boot Actuator


Программа Новые Горизонты: Захватывающие и растущие нельзя пропустить

程序新视界-微信公众号