Мониторинг Java приложений с помощью Proto Observability
На этой странице:
- Введение
- Установка Java трейсера ProtoOBP
- Поддерживаемые технологии
- Метрики JVM
Введение
Общий процесс подключения Java приложения на мониторинг:
- Установка ProtoOBP Агента
- Установка трейсера
- Конфигурация трейсера
Установка Java трейсера ProtoOBP
Общая инструкция по подключению трейсера к Java приложению. Может напрямую использоваться, если Java приложение запускается в Linux среде без контейнеризации. Для других случаев смотрите соответствующие инструкции - Docker, Kubernetes
-
Скачайте файл трейсера в архиве
pobp-java-agent.tar.gz
curl --header "PRIVATE-TOKEN:<your_token>" \ "https://git.proto.group/api/v4/projects/125/packages/generic/protoobp-java-agent/v1.46.0/protoobp-java-agent-v1.46.0.tar.gz" \ --output protoobp-java-agent-v1.46.0.tar.gz tar -xzvf protoobp-java-agent-v1.46.0.tar.gz
Или сразу jar файл:
curl --header "PRIVATE-TOKEN:<your_token>" \ "https://git.proto.group/api/v4/projects/125/packages/generic/protoobp-java-agent/v1.46.0/protoobp-java-agent.jar" \ --output protoobp-java-agent.jar
-
К параметрам запуска вашего приложения добавьте:
-javaagent:/path/to/pobp-java-agent.jar
-Dpobp.service=my_service_name
- Имя сервиса, для отображениея в интерфейсе
Примеры для различных серверов приложений и сценариев:Если ваше приложение называется
my_app.jar
, создайте файлmy_app.conf
, содержащий:JAVA_OPTS=-javaagent:/path/to/pobp-java-agent.jar
Linux: В файл запуска Tomcat, например,
setenv.sh
, добавьте:CATALINA_OPTS="$CATALINA_OPTS -javaagent:/path/to/pobp-java-agent.jar"
Windows: В файл запуска Tomcat, например,
setenv.bat
, добавьте:set CATALINA_OPTS=%CATALINA_OPTS% -javaagent:"c:\path\to\pobp-java-agent.jar"
В
standalone
режиме на Linux: добавьте следующее вstandalone.conf
:JAVA_OPTS="$JAVA_OPTS -javaagent:/path/to/pobp-java-agent.jar"
В
standalone
режиме на Windows: добавьте следующее вstandalone.conf.bat
:set "JAVA_OPTS=%JAVA_OPTS% -javaagent:X:/path/to/pobp-java-agent.jar"
В
domain
режиме: добавьте строку в файлеdomain.xml
, в разделеserver-groups.server-group.jvm.jvm-options
:<option value="-javaagent:/path/to/pobp-java-agent.jar"/>
Исли используется
jetty.sh
для запуска Jetty как сервис, добавьте в этот файл:JAVA_OPTIONS="${JAVA_OPTIONS} -javaagent:/path/to/pobp-java-agent.jar"
Если используется
start.ini
для запуска Jetty, добавьте следующую строку (после--exec
или добавьте--exec
если такой строки нет):-javaagent:/path/to/pobp-java-agent.jar
Обратите внимание
Если вы добавляете аргумент
-javaagent
к командеjava -jar
, он должен быть добавлен перед аргументом-jar
– как аргумент JVM, а не как аргумент приложения. Например:java -javaagent:/path/to/pobp-java-agent.jar -jar my_app.jar
-
Перезапустите Java приложение.
Java приложение в Docker
Если Java приложение запускается в Docker контейнере.
-
Скачайте файл агента
pobp-java-agent.jar
. -
Добавьте файл с агентом в ваш контейнер
-
Укажите следующие пременные окружения:
ENV POBP_AGENT_HOST="proto-backend"
- Укажите IP адрес хоста, где запущен ProtoOBP агент, доступные из сети Docker контейнера. В случае если агент запускается в виде Docker контейнера, то достаточно указать имя контейнераENV POBP_SERVICE="my_service_name"
- Имя сервисаENV POBP_DOGSTATSD_NON_LOCAL_TRAFFIC="true"
- Обязательно для получения runtime метрик
-
К параметрам запуска вашего приложения добавьте:
-javaagent:/path/to/the/pobp-java-agent.jar
-
Запустите контейнер с приложением
Пример готового Dockerfile
FROM openjdk:8-jdk
EXPOSE 8080
WORKDIR /opt/shipping
# Переменные окружения ProtoOBP Java трейсера
ENV POBP_AGENT_HOST="protobp-agent" # - Имя ProtoOBP агента
ENV POBP_SERVICE="my_service_name" # - Имя сервиса
ENV POBP_DOGSTATSD_NON_LOCAL_TRAFFIC="true" # - Необходимо для runtime метрик JVM
ENV CART_ENDPOINT=cart:8080
ENV DB_HOST=mysql
COPY --from=build /opt/shipping/target/shipping-1.0.jar shipping.jar
COPY --from=build /opt/shipping/pobp-java-agent.jar pobp-java-agent.jar
CMD [ "java", "-Xmn256m","-javaagent:pobp-java-agent.jar", "-Xmx768m","-jar", "shipping.jar" ]
Java приложение в Kubernetes
Убедитесь, что у вас успешно установлен и настроен ProtoOBP Агент для Kubernetes.
Без использования автоматического подключения трейсера
Дополнительно необходимо передать поду переменную окружения POBP_AGENT_HOST
со значением IP адреса воркер-ноды, а также переменные окружения для связи трейсов с инфраструктурой (имя k8s кластера нужно задать вручную).
apiVersion: apps/v1
kind: Deployment
#(...)
spec:
containers:
- name: "<CONTAINER_NAME>"
image: "<CONTAINER_IMAGE>/<TAG>"
env:
- name: POBP_SERVICE # Имя сервиса в интерфейсе ProtoOBP
value: dispatch
- name: POBP_AGENT_HOST # Адрес агента
valueFrom:
fieldRef:
fieldPath: status.hostIP
С использованием автоматического подключения трейсера
Агент ProtoOBP в K8s кластере по умолчанию инструментирует Java приложения с лейблом: admission.proto.group/enabled: "true"
-
В спецификации пода приложения добавьте аннотацию и лейбл с версией Java трейсинг агента:
apiVersion: apps/v1 kind: Deployment metadata: labels: ... ... template: metadata: annotations: admission.proto.group/java-lib.version: "v1.46.0" creationTimestamp: null labels: admission.proto.group/enabled: "true" # Включение автоматической инструментации tags.proto.group/service: "my_service" # Имя сервиса в интерфейсе ProtoOBP service: my_service
-
В спецификации пода добавьте
imagePullSecrets
для доступа к Docker репозиторию ProtoOBP. Подробнее о добавление Secret указано в документации Установка агента в Kubernetes . В случае использования внутреннего репозитория, секрет указывать не требуется.apiVersion: apps/v1 kind: Deployment metadata: labels: ... ... template: metadata: annotations: admission.proto.group/java-lib.version: "v1.46.0" creationTimestamp: null labels: admission.proto.group/enabled: "true" # Включение автоматической инструментации tags.proto.group/service: "my_service" # Имя сервиса в интерфейсе ProtoOBP service: my_service spec: containers: ... ... imagePullSecrets: - name: protoobp-registry
Автоматическое подключение трейсера без использования лейблов
В конфигурации агента вы можете включить автоматическое подключение трейсера без использования лейблов.
Обратите внимание
При этом все равно необходимо добавлять аннотацию к поду, в которой указать версию образа библиотеки инструментации.Добавление тегов для приложений в Kubernetes
Дополнительно необходимо передать поду переменные окружения для связи трейсов с инфраструктурой (имя k8s кластера нужно задать вручную).
apiVersion: apps/v1
kind: Deployment
#(...)
spec:
containers:
- name: "<CONTAINER_NAME>"
image: "<CONTAINER_IMAGE>/<TAG>"
env:
- name: POBP_SERVICE
value: dispatch
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POBP_TAGS
value: "pod_name:$(POD_NAME),node:$(NODE_NAME),kube_namespace:$(POD_NAMESPACE),kube_cluster_name:<my_cluster_name>"
- name: POBP_DOGSTATSD_NON_LOCAL_TRAFFIC
value: true
Проверка успешного подключения трейсера
В случае успешного подключения трейсера:
- В логе приложения сразу после его запуска отобразится информации инициализации Java трейсере ProtoOBP, пример:
[pobp.trace 2025-02-25 10:23:51:374 +0000] [pobp-task-scheduler] INFO protoobp.trace.agent.core.StatusLogger - PROTOOBP TRACER CONFIGURATION {"version":"1.47.0-SNAPSHOT~709cd8ebbd","os_name":"Linux", "os_version":"5.15.0-131-generic", "architecture":"amd64","lang":"jvm", "lang_version":"1.8.0_342","jvm_vendor":"Oracle Corporation", "jvm_version":"25.342-b07","java_class_version":"52.0", "http_nonProxyHosts":"null","http_proxyHost":"null","enabled":true, "service":"shipping","agent_url":"http://protoobp-agent:8126", "agent_error":false,"debug":false,"trace_propagation_style_extract":["protoobp","tracecontext"], "trace_propagation_style_inject":["protoobp","tracecontext"],"analytics_enabled":false, "priority_sampling_enabled":true,"logs_correlation_enabled":true, "profiling_enabled":false,"remote_config_enabled":true,"debugger_enabled":false, "debugger_exception_enabled":false,"debugger_span_origin_enabled":false, "appsec_enabled":"ENABLED_INACTIVE","rasp_enabled":false,"telemetry_enabled":false, "telemetry_dependency_collection_enabled":false,"telemetry_log_collection_enabled":false, "pobp_version":"","health_checks_enabled":true,"configuration_file":"no config file present", "runtime_id":"1e6866ee-d537-4297-a9a5-be200d7d59f2", "logging_settings":{"levelInBrackets":false,"dateTimeFormat":"'[pobp.trace 'yyyy-MM-dd HH:mm:ss:SSS Z']'", "logFile":"System.err","configurationFile":"simplelogger.properties","showShortLogName":false, "showDateTime":true,"showLogName":true,"showThreadName":true,"defaultLogLevel":"INFO", "warnLevelString":"WARN","embedException":false},"cws_enabled":false,"cws_tls_refresh":5000, "protoobp_profiler_enabled":false,"protoobp_profiler_safe":false,"protoobp_profiler_enabled_overridden":false, "data_streams_enabled":false}
- В разделе
Приложения
>Сервисы
появится новый сервис с типом Java.
Поддерживаемые технологии
Версии Java
Версия Java | Операционная система | Поддержка |
---|---|---|
от 22 и выше | Windows (x86, x86-64) Linux (x86, x86-64) |
Предварительная |
от 18 до 21 | Windows (x86, x86-64) Linux (x86, x86-64) |
✅ |
от 8 to 17 | Windows (x86, x86-64) Linux (x86, x86-64) |
✅ |
Автоматическая инструментация библиотек и фреймворков
HTTP серверы и клиенты
Сервер | Версии | Поддержка | Имя компонента (интеграции) для конфигурации |
---|---|---|---|
Akka-Http Server | 10.0+ | ✅ | akka-http , akka-http-server |
Finatra Web | 2.9+ | ✅ | finatra |
Grizzly | 2.0+ | ✅ | grizzly |
Grizzly-HTTP | 2.3.20+ | ✅ | grizzly-filterchain |
Java Servlet Compatible | 2.3+, 3.0+ | ✅ | servlet , servlet-2 , servlet-3 |
Jax-RS Annotations | JSR311-API | ✅ | jax-rs , jaxrs , jax-rs-annotations , jax-rs-filter |
Jetty | 7.0-12.x | ✅ | jetty |
Micronaut HTTP Server | 2.x | ✅ | micronaut |
Mulesoft | 4.5.0+ | ✅ | mule |
Netty HTTP Server | 3.8+ | ✅ | netty , netty-3.8 , netty-4.0 , netty-4.1 |
Play | 2.3-2.8 | ✅ | play , play-action |
Ratpack | 1.5+ | ✅ | ratpack |
Restlet HTTP Server | 2.2 - 2.4 | ✅ | restlet-http . |
Spark Java | 2.3+ | Предварительная версия (отключено по умолчанию) | sparkjava (требует jetty ) |
Spring Boot | 1.5+ | ✅ | spring-web or spring-webflux |
Spring Web (MVC) | 4.0+ | ✅ | spring-web |
Spring WebFlux | 5.0+ | ✅ | spring-webflux |
Tomcat | 5.5+ | ✅ | tomcat |
Undertow | 2.0+ | ✅ | undertow |
Vert.x | 3.4+ | ✅ | vertx , vertx-3.4 , vertx-3.9 , vertx-4.0 |
Интеграции, отключенные по умолчанию
Инструментация следующих фрейморков отключена по умолчанию и может быть включена с помощью настроек ниже:
Инструментация | Для включения |
---|---|
Grizzly | -Dpobp.integration.grizzly-client.enabled=true |
Grizzly-HTTP | -Dpobp.integration.grizzly-filterchain.enabled=true |
Hazelcast (клиент) | -Dpobp.integration.hazelcast.enabled=true -Dpobp.integration.hazelcast_legacy.enabled=true |
Ignite | -Dpobp.integration.ignite.enabled=true |
JAX-WS | -Dpobp.integration.jax-ws.enabled=true |
JDBC Datasource | -Dpobp.integration.jdbc-datasource.enabled=true |
Kotlin Coroutines | -Dpobp.integration.kotlin_coroutine.experimental.enabled=true |
Mulesoft | -Dpobp.integration.mule.enabled=true |
Netty Promise | -Dpobp.integration.netty-promise.enabled=true |
Ning | -Dpobp.integration.ning.enabled=true |
Spark Java | -Dpobp.integration.sparkjava.enabled=true |
TIBCO BusinessWorks | -Dpobp.integration.tibco.enabled=true |
URL Connection | -Dpobp.integration.urlconnection.enabled=true -Dpobp.integration.httpurlconnection.enabled=true |
ZIO | -Dpobp.integration.zio.experimental.enabled=true |
Трейсинг сетевых запросов включает:
- время запроса до ответа
- тэги для запроса (например, код ответа)
- детали ошибки и стэктрейс
- распределенный трейсинг
Фреймворк | Версии | Поддержка | Имя компонента (интеграции) для конфигурации |
---|---|---|---|
Apache HTTP Client | 4.0+ | ✅ | httpclient , apache-httpclient , apache-http-client |
Apache HTTP Async Client | 4.0+ | ✅ | httpasyncclient , apache-httpasyncclient |
AWS Java SDK | 1.11+, 2.2+ | ✅ | aws-sdk |
Camel-OpenTelemetry | 3.12.0+ | Preview | [opentelemetry-1][5] |
Commons HTTP Client | 2.0+ | ✅ | commons-http-client |
Google HTTP Client | 1.19.0+ | ✅ | google-http-client |
Google Pub/Sub | 1.116.0+ | ✅ | google-pubsub |
Grizzly HTTP Client | 1.9+ | Предварительная версия (отключено по умолчанию) | grizzly-client |
gRPC | 1.5+ | ✅ | grpc , grpc-client , grpc-server |
HttpURLConnection | all | ✅ | httpurlconnection , urlconnection |
Kafka-Clients | 0.11+ | ✅ | kafka |
Kafka-Streams | 0.11+ | ✅ | kafka , kafka-streams |
Java RMI | all | Распределенный трейсинг не поддерживается | rmi , rmi-client , rmi-server |
Jax RS Clients | 2.0+ | ✅ | jax-rs , jaxrs , jax-rs-client |
Jersey Client | 1.9-2.29 | ✅ | jax-rs , jaxrs , jax-rs-client |
JMS / Jakarta JMS | 1-3.0+ | ✅ | jms , jms-1 , jms-2 , jakarta-jms |
Netty HTTP Client | 4.0+ | ✅ | netty , netty-4.0 , netty-4.1 |
Ning HTTP Client | 1.9.0+ | Предварительная версия (отключено по умолчанию) | ning |
OkHTTP | 2.2+ | ✅ | okhttp , okhttp-2 ,okhttp-3 |
Play WSClient | 1.0+ | ✅ | play-ws |
Rabbit AMQP | 2.7+ | ✅ | amqp , rabbitmq |
Spring SessionAwareMessageListener | 3.1+ | ✅ | spring-jms-3.1 |
Spring WebClient | 5.0+ | ✅ | spring-webflux , spring-webflux-client |
Хранилища данных
Трейсинг обращения к хранилищу включает:
- время запроса до ответа
- информацию о запросе (например, query string)
- детали ошибки и стэктрейс
Хранилище | Версии | Поддержка | Имя компонента (интеграции) для конфигурации |
---|---|---|---|
Aerospike | 4.0+ | ✅ | aerospike |
Couchbase | 2.0+ | ✅ | couchbase |
Cassandra | 3.0+ | ✅ | cassandra |
Elasticsearch Transport | 2.0+ | ✅ | elasticsearch , elasticsearch-transport , elasticsearch-transport-{2,5,6,7} (один из) |
Elasticsearch Rest | 5.0+ | ✅ | elasticsearch , elasticsearch-rest , elasticsearch-rest-{5,6,7} (один из) |
Ignite | 2.0-3.0 | Предварительная версия (отключено по умолчанию) | ignite |
JDBC | N/A | ✅ | jdbc , jdbc-datasource |
Jedis | 1.4+ | ✅ | jedis , redis |
Lettuce | 4.0+ | ✅ | lettuce , lettuce-4-async , lettuce-5-rx |
MongoDB | 3.0-4.0+ | ✅ | mongo |
OpenSearch Rest | 1.x-2.x | ✅ | opensearch , opensearch-rest |
OpenSearch Transport | 1.x-2.x | ✅ | opensearch , opensearch-transport |
RediScala | 1.5+ | ✅ | rediscala , redis |
Redisson | 2.x-3.x | ✅ | redisson , redis |
SpyMemcached | 2.12+ | ✅ | spymemcached |
Vert.x Cassandra Client | 3.9+ | ✅ | cassandra |
Vert.x Redis Client | 3.9 | ✅ | vertx-redis-client |
Vert.x MySQL Client | 3.9+ | ✅ | vertx-sql-client |
Агент совместим с основными JDBC драйверами, включая следующие:
- Apache Derby
- Firebird SQL
- H2 Database Engine
- HSQLDB
- IBM DB2
- MariaDB
- MSSQL (Microsoft SQL Server)
- MySQL
- Oracle
- Postgres SQL
- ScalikeJDBC
Инструментация следующих датасторов отключена по умолчанию и может быть включена с помощью настроек ниже:
Инструментация | Для включения |
---|---|
JDBC-Datasource | - System Property: -Dpobp.integration.jdbc-datasource.enabled=true - Переменная окружения: POBP_INTEGRATION_JDBC_DATASOURCE_ENABLED=true |
Прочие фреймворки
Фреймворк | Версии | Поддержка | Имя компонента (интеграции) для конфигурации |
---|---|---|---|
Apache CXF (Jax-WS) | 3.0+ | OpenTelemetry | cxf |
Datanucleus JDO | 4.0+ | ✅ | datanucleus |
Dropwizard Views | 0.7+ | ✅ | dropwizard , dropwizard-view |
GraphQL | 14.0+ | ✅ | graphql-java |
Hazelcast (client) | 3.6+ | Предварительная версия (отключено по умолчанию) | hazelcast , hazelcast_legacy |
Hibernate | 3.5+ | ✅ | hibernate , hibernate-core |
Hystrix | 1.4+ | ✅ | hystrix |
JSP Rendering | 2.3+ | ✅ | jsp , jsp-render , jsp-compile |
JUnit | 4.1+, 5.3+ | ✅ | junit , junit-4 , junit-5 |
Project Reactor | 3.1+ | ✅ | reactor-core |
Quartz | 2.x | ✅ | quartz |
RxJava | 2.x | ✅ | rxjava |
Spring Data | 1.8+ | ✅ | spring-data |
Spring Scheduling | 3.1+ | ✅ | spring-scheduling |
TIBCO BusinessWorks | 5.14.0+ | Предварительная версия (отключено по умолчанию) | tibco , tibco_bw |
Twilio SDK | < 8.0 | ✅ | twilio-sdk |
Включение и отключение инструментации конкретной библиотеки или фреймворка
Большинство интеграций включено по умолчанию. Следующие настройки позволяют изменить поведение по умолчанию для всех интеграций:
- System Property:
-Dpobp.integrations.enabled=false
- Переменная окружения:
POBP_INTEGRATIONS_ENABLED=false
Каждая интеграция может быть включена или отключена по отдельности (переопределяя поведение по умолчанию и настройку выше):
- System Property:
-Dpobp.integration.<INTEGRATION_NAME>.enabled=true
- Переменная окружения:
POBP_INTEGRATION_<INTEGRATION_NAME>_ENABLED=true
Метрики JVM
Для каждой JVM трейсер ProtoOBP собирает и отображает JVM runtime метрики. Посмотреть их можно выбрав Сервисы
> дашборд Java Сервиса, далее выбрать вкладку Инстансы
> инстанс сервиса с вызовами > вкладка JVM
.
Сбор метрик JVM включен по умолчанию. Он может быть отключен с помощью конфигурации:
- System Property:
-Dpobp.jmxfetch.enabled=false
- Переменная окружения:
POBP_JMXFETCH_ENABLED=false
илиPOBP_RUNTIME_METRICS_ENABLED=false
По умолчанию, JVM метрики из приложений отсылаются Агенту на порт 8125.
Если Агент работает в контейнере:
- убедитесь, что переменная
POBP_DOGSTATSD_NON_LOCAL_TRAFFIC
установлена в значениеtrue
, и что порт 8125 открыт на агенте; - дополнительно для Kubernetes - порт DogstatsD должен быть host port.
Список метрик JVM, собираемых Proto OBP
Для каждой JVM собираются следующие метрики после включения сбора JVM runtime метрик.
Имя метрики | Тип | Описание |
---|---|---|
jvm_heap_memory | gauge | Общее количество используемой памяти Java heap. Отображается в Мегабайтах. |
jvm_heap_memory_committed | gauge | Общее количество памяти Java heap, которое будет использовано. Отображается в Мегабайтах. |
jvm_heap_memory_init | gauge | Начальный размер выделенной памяти Java heap. Отображается в Мегабайтах. |
jvm_heap_memory_max | gauge | Максимальный доступный размер памяти Java heap. Отображается в Мегабайтах. |
jvm_non_heap_memory | gauge | Общее количество используемой памяти Java non-heap. Non-heap память рассчитывается как: Metaspace + CompressedClassSpace + CodeCache. Отображается в Мегабайтах. |
jvm_non_heap_memory_committed | gauge | Общее количество памяти Java non-heap, которое будет использовано. Отображается в Мегабайтах. |
jvm_non_heap_memory_init | gauge | Начальный размер выделенной памяти Java non-heap. Отображается в Мегабайтах. |
jvm_non_heap_memory_max | gauge | Максимальный доступный размер памяти Java non-heap. Отображается в Мегабайтах. |
jvm_thread_count | count | Количество активных потоков. Отображается как количество потоков. |
jvm_gc_cms_count | count | Общее количество выполненных сборок мусора. |
jvm_gc_major_collection_count | gauge | Частота выполнения основных сборок мусора. Установите new_gc_metrics: true для получения этой метрики. |
jvm_gc_minor_collection_count | gauge | Частота выполнения минорных сборок мусора. Установите new_gc_metrics: true для получения этой метрики. |
jvm_gc_parnew_time | gauge | Примерное накопленное время выполнения сборки мусора. Отображается в миллисекундах. |
jvm_gc_major_collection_time | gauge | Доля времени, затраченного на основную сборку мусора. Установите new_gc_metrics: true для получения этой метрики. |
jvm_gc_minor_collection_time | gauge | Доля времени, затраченного на минорную сборку мусора. Установите new_gc_metrics: true для получения этой метрики. |