Мониторинг Java приложений с помощью Proto Observability
На этой странице:
- Введение
- Установка Java трейсера ProtoOBP
- Поддерживаемые технологии
- Метрики JVM
Введение
Общий процесс подключения Java приложения на мониторинг:
- Установка ProtoOBP Агента
- Установка трейсера
- Конфигурация трейсера
Установка Java трейсера ProtoOBP
Общая инструкция по подключению трейсера к Java приложению. Может напрямую использоваться, если Java приложение запускается в Linux среде без контейнеризации. Для других случаев смотрите соответствующие инструкции - Docker, Kubernetes
-
Скачайте файл трейсера в архиве
pobp-java-agent.tar.gzcurl --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.jarLinux: В файл запуска 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. -
Добавьте файл с агентом в ваш контейнер
-
Укажите следующие пременные окружения:
POBP_AGENT_HOST– адрес Агента, на который будет отсылать данные трейсер:- если Агент запущен в Docker контейнере, укажите имя Docker контейнера Агента:
Убедитесь, что контейнер Агента и контейнер приложения находятся в одной Docker сети. Адрес агента должен быть доступен из Docker контейнера приложения.
ENV POBP_AGENT_HOST="protoobp-agent" - если Агент запущен на хосте как сервис (не в контейнере):
Убедитесь что в конфигурации Агента разрешен прием APM данных от контейнеров:
ENV POBP_AGENT_HOST="host.docker.internal"apm_config: apm_non_local_traffic: true
- если Агент запущен в Docker контейнере, укажите имя Docker контейнера Агента:
POBP_SERVICE– имя сервиса, которое будет отображаться в интерфейсе Proto OBP:ENV POBP_SERVICE="my_service_name"POBP_DOGSTATSD_NON_LOCAL_TRAFFIC– обязательно установите вtrueдля получения runtime метрикENV POBP_DOGSTATSD_NON_LOCAL_TRAFFIC="true"
-
К параметрам запуска вашего приложения добавьте:
-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
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 для получения этой метрики. |