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

    Содержание

    Overview

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

    Prerequisites

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

    Steps

    1. Загрузка и настройка OpenTelemetry Java Agent

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

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