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

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

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

Введение

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

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

Proto Observability Platform поддерживает следующие трейсеры для Java:

Трейсер ProtoOBP для Java — основной способ инструментации, описанный на этой странице. Следуйте инструкции Установка Java трейсера ProtoOBP ниже.

Proto Observability Platform принимает трейсы от трейсера Datadog для Java (dd-java-agent). Установите трейсер по официальной документации Datadog и направьте телеметрию на Агент ProtoOBP.

Этот вариант предназначен для миграции приложений, уже инструментированных агентом New Relic: их распределённые трейсы направляются в Proto Observability Platform без изменения кода. Для новых приложений он не рекомендуется — используйте один из трейсеров, рекомендованных на этой странице.

Подробнее: Подключение приложений с трейсерами New Relic.

  1. Выполните шаги, указанные на странице подключения инструментации OpenTelemetry для Java:

    https://opentelemetry.io/docs/languages/java/

  2. Выполните шаги, указанные на странице настройки OpenTelemetry в Proto Observability Platform.

Установка 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. Укажите следующие пременные окружения:

    • POBP_AGENT_HOST – адрес Агента, на который будет отсылать данные трейсер:
      • если Агент запущен в Docker контейнере, укажите имя Docker контейнера Агента:
        ENV POBP_AGENT_HOST="protoobp-agent"
        
        Убедитесь, что контейнер Агента и контейнер приложения находятся в одной Docker сети. Адрес агента должен быть доступен из Docker контейнера приложения.
      • если Агент запущен на хосте как сервис (не в контейнере):
        ENV POBP_AGENT_HOST="host.docker.internal"
        
        Убедитесь что в конфигурации Агента разрешен прием APM данных от контейнеров:
        apm_config:
          apm_non_local_traffic: true
        
    • POBP_SERVICE – имя сервиса, которое будет отображаться в интерфейсе Proto OBP:
      ENV POBP_SERVICE="my_service_name"
      
    • POBP_DOGSTATSD_NON_LOCAL_TRAFFIC – обязательно установите в true для получения runtime метрик
      ENV POBP_DOGSTATSD_NON_LOCAL_TRAFFIC="true"
      
  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

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 до 21Windows (x86, x86-64)
Linux (x86, x86-64)
от 8 to 17Windows (x86, x86-64)
Linux (x86, x86-64)

Автоматическая инструментация библиотек и фреймворков

HTTP серверы и клиенты

СерверВерсииПоддержкаИмя компонента (интеграции) для конфигурации
Akka-Http Server10.0+akka-http, akka-http-server
Finatra Web2.9+finatra
Grizzly2.0+grizzly
Grizzly-HTTP2.3.20+grizzly-filterchain
Java Servlet Compatible2.3+, 3.0+servlet, servlet-2, servlet-3
Jax-RS AnnotationsJSR311-APIjax-rs, jaxrs, jax-rs-annotations, jax-rs-filter
Jetty7.0-12.xjetty
Micronaut HTTP Server2.xmicronaut
Mulesoft4.5.0+mule
Netty HTTP Server3.8+netty, netty-3.8, netty-4.0, netty-4.1
Play2.3-2.8play, play-action
Ratpack1.5+ratpack
Restlet HTTP Server2.2 - 2.4restlet-http.
Spark Java2.3+Предварительная версия (отключено по умолчанию)sparkjava (требует jetty)
Spring Boot1.5+spring-web or spring-webflux
Spring Web (MVC)4.0+spring-web
Spring WebFlux5.0+spring-webflux
Tomcat5.5+tomcat
Undertow2.0+undertow
Vert.x3.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 Client4.0+httpclient, apache-httpclient, apache-http-client
Apache HTTP Async Client4.0+httpasyncclient, apache-httpasyncclient
AWS Java SDK1.11+, 2.2+aws-sdk
Camel-OpenTelemetry3.12.0+Preview[opentelemetry-1][5]
Commons HTTP Client2.0+commons-http-client
Google HTTP Client1.19.0+google-http-client
Google Pub/Sub1.116.0+google-pubsub
Grizzly HTTP Client1.9+Предварительная версия (отключено по умолчанию)grizzly-client
gRPC1.5+grpc, grpc-client, grpc-server
HttpURLConnectionallhttpurlconnection, urlconnection
Kafka-Clients0.11+kafka
Kafka-Streams0.11+kafka, kafka-streams
Java RMIallРаспределенный трейсинг не поддерживаетсяrmi, rmi-client, rmi-server
Jax RS Clients2.0+jax-rs, jaxrs, jax-rs-client
Jersey Client1.9-2.29jax-rs, jaxrs, jax-rs-client
JMS / Jakarta JMS1-3.0+jms, jms-1, jms-2, jakarta-jms
Netty HTTP Client4.0+netty, netty-4.0, netty-4.1
Ning HTTP Client1.9.0+Предварительная версия (отключено по умолчанию)ning
OkHTTP2.2+okhttp, okhttp-2,okhttp-3
Play WSClient1.0+play-ws
Rabbit AMQP2.7+amqp, rabbitmq
Spring SessionAwareMessageListener3.1+spring-jms-3.1
Spring WebClient5.0+spring-webflux, spring-webflux-client

Хранилища данных

Трейсинг обращения к хранилищу включает:

  • время запроса до ответа
  • информацию о запросе (например, query string)
  • детали ошибки и стэктрейс
ХранилищеВерсииПоддержкаИмя компонента (интеграции) для конфигурации
Aerospike4.0+aerospike
Couchbase2.0+couchbase
Cassandra3.0+cassandra
Elasticsearch Transport2.0+elasticsearch, elasticsearch-transport, elasticsearch-transport-{2,5,6,7} (один из)
Elasticsearch Rest5.0+elasticsearch, elasticsearch-rest, elasticsearch-rest-{5,6,7} (один из)
Ignite2.0-3.0Предварительная версия (отключено по умолчанию)ignite
JDBCN/Ajdbc, jdbc-datasource
Jedis1.4+jedis, redis
Lettuce4.0+lettuce, lettuce-4-async, lettuce-5-rx
MongoDB3.0-4.0+mongo
OpenSearch Rest1.x-2.xopensearch, opensearch-rest
OpenSearch Transport1.x-2.xopensearch, opensearch-transport
RediScala1.5+rediscala, redis
Redisson2.x-3.xredisson, redis
SpyMemcached2.12+spymemcached
Vert.x Cassandra Client3.9+cassandra
Vert.x Redis Client3.9vertx-redis-client
Vert.x MySQL Client3.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+OpenTelemetrycxf
Datanucleus JDO4.0+datanucleus
Dropwizard Views0.7+dropwizard, dropwizard-view
GraphQL14.0+graphql-java
Hazelcast (client)3.6+Предварительная версия (отключено по умолчанию)hazelcast, hazelcast_legacy
Hibernate3.5+hibernate, hibernate-core
Hystrix1.4+hystrix
JSP Rendering2.3+jsp, jsp-render, jsp-compile
JUnit4.1+, 5.3+junit, junit-4, junit-5
Project Reactor3.1+reactor-core
Quartz2.xquartz
RxJava2.xrxjava
Spring Data1.8+spring-data
Spring Scheduling3.1+spring-scheduling
TIBCO BusinessWorks5.14.0+Предварительная версия (отключено по умолчанию)tibco, tibco_bw
Twilio SDK< 8.0twilio-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_memorygaugeОбщее количество используемой памяти Java heap. Отображается в Мегабайтах.
jvm_heap_memory_committedgaugeОбщее количество памяти Java heap, которое будет использовано. Отображается в Мегабайтах.
jvm_heap_memory_initgaugeНачальный размер выделенной памяти Java heap. Отображается в Мегабайтах.
jvm_heap_memory_maxgaugeМаксимальный доступный размер памяти Java heap. Отображается в Мегабайтах.
jvm_non_heap_memorygaugeОбщее количество используемой памяти Java non-heap. Non-heap память рассчитывается как: Metaspace + CompressedClassSpace + CodeCache. Отображается в Мегабайтах.
jvm_non_heap_memory_committedgaugeОбщее количество памяти Java non-heap, которое будет использовано. Отображается в Мегабайтах.
jvm_non_heap_memory_initgaugeНачальный размер выделенной памяти Java non-heap. Отображается в Мегабайтах.
jvm_non_heap_memory_maxgaugeМаксимальный доступный размер памяти Java non-heap. Отображается в Мегабайтах.
jvm_thread_countcountКоличество активных потоков. Отображается как количество потоков.
jvm_gc_cms_countcountОбщее количество выполненных сборок мусора.
jvm_gc_major_collection_countgaugeЧастота выполнения основных сборок мусора. Установите new_gc_metrics: true для получения этой метрики.
jvm_gc_minor_collection_countgaugeЧастота выполнения минорных сборок мусора. Установите new_gc_metrics: true для получения этой метрики.
jvm_gc_parnew_timegaugeПримерное накопленное время выполнения сборки мусора. Отображается в миллисекундах.
jvm_gc_major_collection_timegaugeДоля времени, затраченного на основную сборку мусора. Установите new_gc_metrics: true для получения этой метрики.
jvm_gc_minor_collection_timegaugeДоля времени, затраченного на минорную сборку мусора. Установите new_gc_metrics: true для получения этой метрики.