Использование OpenTelemetry для обеспечения трассируемости на неконтейнеризованных Java-сервисах

Содержание

Обзор

Это решение проведет вас через процесс модификации неконтейнеризованных Java-сервисов, развернутых на виртуальных или физических машинах, чтобы видеть их цепочки вызовов с контейнеризованными сервисами на платформе. Обратите внимание, что это решение предоставляет только функциональность трассируемости и не поддерживает просмотр логов.

Предварительные требования

  • Ваш Java-сервис развернут на виртуальных или физических машинах и требует функциональности трассируемости.
  • В кластере создан сервисный Mesh.
  • У вас есть доступ к узлам управления Kubernetes-кластера, и установлен инструмент kubectl.

Шаги

1. Скачайте и настройте Java-агент OpenTelemetry

Сначала вам необходимо скопировать jar-файл Java-агента OpenTelemetry в директорию ./agent на узле управления кластера, где был создан сервисный Mesh.

Выберите и выполните соответствующий скрипт в зависимости от компонентной базы кластера

  • Компонентная база Containerd

    1. Установите инструмент nerdctl на узле управления. Скачайте его, извлеките пакет, предоставьте разрешение на выполнение и скопируйте его в директорию /usr/local/bin:

      chmod +x nerdctl  
      cp ./nerdctl /usr/local/bin  
    2. Войдите в репозиторий образов, используемый кластером, заменив <image_registry_address> на фактический адрес:

      nerdctl login <image_registry_address>  
    3. Запустите следующий скрипт, чтобы скопировать jar-файл Java-агента из образа в локальную систему:

      #!/bin/sh  
      TAG=$(kubectl -n istio-system get cm otel-java-agent -oyaml | grep versions -A1 | grep -v versions | awk '{print substr($0, 7)}')  
      CONTAINERID=$(nerdctl run -d <image_registry_address>/asm/otel-java-instrumentation:$TAG sleep 9999)  
      echo "копируем агента из $CONTAINERID"  
      mkdir -p agent  
      nerdctl cp $CONTAINERID:/opentelemetry-javaagent-ext.jar ./agent/opentelemetry-javaagent-ext.jar  
      nerdctl container stop $CONTAINERID  
  • Компонентная база Docker

    1. Войдите в репозиторий образов, используемый кластером:

      docker login <image_registry_address>
    2. Запустите следующий скрипт, чтобы скопировать jar-файл Java-агента из образа в локальную систему:

      #!/bin/sh  
      TAG=$(kubectl -n istio-system get cm otel-java-agent -oyaml | grep versions -A1 | grep -v versions | awk '{print substr($0, 7)}')  
      CONTAINERID=$(docker run -d <image_registry_address>/asm/otel-java-instrumentation:$TAG sleep 9999)  
      echo "копируем агента из $CONTAINERID"  
      mkdir -p agent  
      docker cp $CONTAINERID:/opentelemetry-javaagent-ext.jar ./agent/opentelemetry-javaagent-ext.jar  
      docker container stop $CONTAINERID  

2. Распространите Java-агента на узлах Java-сервиса

Скопируйте opentelemetry-javaagent-ext.jar, полученный на шаге 1, в директорию ./agent на всех узлах, где работают Java-сервисы.

3. Установите переменные окружения

Настройте следующие переменные окружения на всех узлах Java-сервиса:

Переменная окруженияОписание
OTEL_PROPAGATORSФормат распространения для данных трассировки. Доступные значения: b3, b3multi. Несколько значений можно разделять запятыми.
OTEL_TRACES_EXPORTERЭкспортер данных трассировки. Значение должно быть otlp.
OTEL_EXPORTER_OTLP_ENDPOINTАдрес отправки OTLP-данных в формате http://<ASM_OTEL_COLLECTOR_IP>:4317, где ASM_OTEL_COLLECTOR_IP - это IP-адрес, доступный компонентам сервисного Mesh.
OTEL_RESOURCE_ATTRIBUTESПользовательские теги. Обязательные поля: service.name, vm.name. Например: service.name=myservice.ns,vm.name=vm-test. vm.name - это имя виртуальной машины, на которой размещен сервис, а service.name обозначает имя, отображаемое в цепочке вызовов. Вы можете добавить другие пользовательские теги, рекомендуется использовать префикс vm для идентификации VM-сервисов. Несколько пар ключ-значение можно разделять запятыми.

4. Измените скрипт запуска Java-сервиса

В скрипт запуска Java-сервиса добавьте следующий параметр:

-javaagent:{AGENT_PATH}/opentelemetry-javaagent-ext.jar

5. Создайте ConfigMap

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

apiVersion: v1
data:
  vms: |-
    - host: 192.168.189.136
      port: 8081
      serviceName: otel-demo-consumer-vm
    - host: 192.168.189.136
      port: 9081
      serviceName: otel-demo-provider-vm
kind: ConfigMap
metadata:
  labels:
    asm.cpaas.io/vm-config-enabled: "true"
  name: virtualmachine-config
NOTE
  • host, port и serviceName должны соответствовать адресу доступа, порту и имени сервиса неконтейнеризованных сервисов. serviceName должен совпадать с service.name, определенным в переменной окружения OTEL_RESOURCE_ATTRIBUTES.

6. Перезапустите Java-сервис

После применения вышеуказанных конфигураций перезапустите Java-сервис, чтобы изменения вступили в силу.