Мониторинг Java приложений с помощью Proto Observability

Подключение трейсинга и сбора метрик для Java приложений.

На этой странице:

Введение

Общий процесс подключения Java приложения на мониторинг:

  1. Установка ProtoOBP Агента
  2. Установка трейсера
  3. Конфигурация трейсера

Установка Java трейсера ProtoOBP

Общая инструкция по подключению трейсера к Java приложению. Может напрямую использоваться, если Java приложение запускается в Linux среде без контейнеризации. Для других случаев смотрите соответствующие инструкции - Docker, Kubernetes

  1. Скачайте файл трейсера в архиве 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
    
  2. К параметрам запуска вашего приложения добавьте:

    • -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
    
  3. Перезапустите Java приложение.

Java приложение в Docker

Если Java приложение запускается в Docker контейнере.

  1. Скачайте файл агента pobp-java-agent.jar.

  2. Добавьте файл с агентом в ваш контейнер

  3. Укажите следующие пременные окружения:

    • ENV POBP_AGENT_HOST="proto-backend" - Укажите IP адрес хоста, где запущен ProtoOBP агент, доступные из сети Docker контейнера. В случае если агент запускается в виде Docker контейнера, то достаточно указать имя контейнера
    • ENV POBP_SERVICE="my_service_name" - Имя сервиса
    • ENV POBP_DOGSTATSD_NON_LOCAL_TRAFFIC="true" - Обязательно для получения runtime метрик
  4. К параметрам запуска вашего приложения добавьте:

    -javaagent:/path/to/the/pobp-java-agent.jar
    
  5. Запустите контейнер с приложением

Пример готового 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"

  1. В спецификации пода приложения добавьте аннотацию и лейбл с версией 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
    
  2. В спецификации пода добавьте 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            
            

Проверка успешного подключения трейсера

В случае успешного подключения трейсера:

  1. В логе приложения сразу после его запуска отобразится информации инициализации 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}
    
  2. В разделе Приложения > Сервисы появится новый сервис с типом 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 для получения этой метрики.