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

Содержание

Overview

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

Prerequisites

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

Steps

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

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

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

  • Компонент runtime 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 Agent из образа на локальную систему:

      #!/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 "copy agent from $CONTAINERID"  
      mkdir -p agent  
      nerdctl cp $CONTAINERID:/opentelemetry-javaagent-ext.jar ./agent/opentelemetry-javaagent-ext.jar  
      nerdctl container stop $CONTAINERID  
  • Компонент runtime Docker

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

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

      #!/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 "copy agent from $CONTAINERID"  
      mkdir -p agent  
      docker cp $CONTAINERID:/opentelemetry-javaagent-ext.jar ./agent/opentelemetry-javaagent-ext.jar  
      docker container stop $CONTAINERID  

2. Распространите Java Agent на узлы с 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-адрес, доступный компоненту service 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

В namespace, где необходимо включить функцию трассируемости, создайте 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-сервис, чтобы изменения вступили в силу.