OpenTelemetry на Python — Полное руководство 2023

OpenTelemetry (OTel) – это платформа наблюдения с открытым исходным кодом, которая позволяет собирать данные телеметрии из облачных приложений. Она предлагает инструменты, API и SDK для сбора и генерации метрик, журналов и трассировок. OTel поддерживает несколько языков, включая Java, Python, Go, Ruby, C++ и Javascript.

В этом руководстве будет рассказано, как настроить OTel в вашем сервисе Python с помощью Jaeger, инструмента с открытым исходным кодом, первоначально разработанного Uber.

Если вы ищете такие возможности, как автоматический сбор данных, возможность воспроизведения скриптов несколькими щелчками мыши и создание тестов на основе трассировки, я рекомендую вам изучить возможность использования Helios. Ниже я включил раздел о том, как установить OTel с помощью Helios.

В чем уникальность Python?

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

Как и все другие библиотеки инструментария, OpenTelemetry работает путём объединения существующих реализаций функций и извлечения необходимых данных.

Сначала вы должны определить имя модуля, класс и функцию. После этого вы можете предоставить функцию wrapper с исходной реализацией в качестве аргумента. Например, если вы хотите использовать  kafka-python, стандартный клиент Kafka на Python, вам нужно перехватывать сообщения Kafka, отправленные функцией “send” класса KafkaProducer.

wrap_function_wrapper( 
  kafka.KafkaProducer, 
  "send", 
  _wrap_send(tracer, produce_hook) 
)

Начало работы с OTel на Python

Настройка OTel с помощью Python довольно проста. В этом примере я буду использовать простое приложение Flask, чтобы продемонстрировать этапы интеграции OTel в Python.

Шаг 1: Создание приложения на Python

Для начала установите  Flask framework с помощью команды pip3 install flask. Затем создайте файл с именем server.py и обновите его с помощью приведённого ниже кода:

from flask import Flask
 
app = Flask(name)
 
@app.route('/')
def index():
  return 'Hello World!'
 
app.run(host='0.0.0.0', port=8000)
Шаг 2: Установка библиотек OpenTelemetry

Установите библиотеки OpenTelemetry, необходимые для работы с приложениями Python. Здесь идёт речь о библиотеках opentelemetry-api и opentelemetry-sdk.

pip install opentelemetry-api 
pip install opentelemetry-sdk

Как только библиотеки будут установлены, вы сможете обновить server.py с помощью объекта трассировки, подобного следующему коду:

from flask import Flask
from opentelemetry import trace
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk.trace.export import ConsoleSpanExporter

provider = TracerProvider()
processor = BatchSpanProcessor(ConsoleSpanExporter())
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(name)

app = Flask(name)
 
@app.route('/')
def index():
  with tracer.start_as_current_span("server_request"):
    return 'Hello World!'
 
app.run(host='0.0.0.0', port=8000)

Теперь, если вы запустите приложение с помощью команды opentelemetry-instrument --traces_exporter console --metrics_exporter console flask --app server run , вы увидите вывод консоли с подробной информацией о трассировке и метриках.

Шаг 3: Установка Jaeger

Вы можете установить Jaeger для Python, используя приведённую ниже команду.

pip install opentelemetry-exporter-jaeger

Но перед этим убедитесь, что Jaeger запущен на вашем локальном компьютере. Вы можете легко настроить Jaeger локально, используя приведённую ниже команду Docker:

docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.23

Затем вы можете обновить механизм трассировки в вашем файле server.py с помощью Jaeger.

from flask import Flask
from opentelemetry import trace
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.resources import SERVICE_NAME, Resource

provider = TracerProvider()
processor = BatchSpanProcessor(ConsoleSpanExporter())
provider.add_span_processor(processor)
trace.set_tracer_provider(
  TracerProvider(
    resource=Resource.create({SERVICE_NAME: "my-python-service"})
  )
)
jaeger_exporter = JaegerExporter(
  agent_host_name="localhost",
  agent_port=6831,
)
trace.get_tracer_provider().add_span_processor(
  BatchSpanProcessor(jaeger_exporter)
)

tracer = trace.get_tracer(name)

app = Flask(name)
 
@app.route('/')
def index():
  with tracer.start_as_current_span("server_request"):
    return 'Hello World!'
 
app.run(host='0.0.0.0', port=8000)

Теперь вы можете повторно запустить приложение и отслеживать трассировки в Jaeger по адресу http://localhost:16686/.

OpenTelemetry на Python — Полное руководство 2023

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

Дополнительный функционал, предоставляемый OpenTelemetry

Как уже упоминалось, Jaeger предоставляет функции фильтрации сплошных трассировок. Но после установки OpenTelemetry вы сможете сделать гораздо больше.

Если вы развёртываете OpenTelemetry с Helios, вы можете использовать агент дистрибутива Helios OpenTelemetry Python для сбора дополнительных данных, таких как полезные нагрузки HTTP и обмена сообщениями, и легко просматривать карту вашего сервиса и каталог API.

Вот как это сделать:

Шаг 1: Используйте Helios в своих микросервисах Python

Вы можете напрямую установить Helios для своего сервиса Python с помощью приведённой ниже команды:

pip install helios-opentelemetry-sdk

Вы также можете использовать Helios со всеми основными веб-фреймворками Python, включая Django, Flask, and FastAPI.

Шаг 2: Настройка переменных окружения

После этого вам необходимо настроить агент Helios с переменными окружения при запуске сервиса:

# TODO: Variable should be set before process starts

export AUTOWRAPT_BOOTSTRAP=helios 

# TODO: Replace value with API token from Helios. 

export HS_TOKEN=<API_TOKEN>

# TODO: Replace value with service name.

export HS_SERVICE_NAME=<SERVICE_NAME>

# TODO: Replace value with service environment.

export HS_ENVIRONMENT="<ENVIRONMENT_NAME>"

Или же вы можете напрямую настроить Helios в настройках вашего проекта в файле init.py. :

from helios import initialize 

initialize( 
 api_token=<API_TOKEN>, # TODO: Insert API token from Helios. 
 service_name=<SERVICE_NAME>, # TODO: Insert service name. 
 enabled=True, # Defaults to False if omitted. 
 environment=<ENVIRONMENT>, # Defaults to os.environ.get('DEPLOYMENT_ENV') if omitted.      
 commit_hash=<COMMIT_HASH>, # Defaults to os.environ.get('COMMIT_HASH') if omitted. 

Вы можете найти дополнительные параметры конфигурации здесь.

Вот и всё! Теперь ваш сервис появится в Helios, где вы сможете использовать данные отслеживания из OpenTelemetry и использовать их для мониторинга ошибок и устранения неполадок.

OpenTelemetry на Python — Полное руководство 2023

C Helios вы можете:

  • Просматривать полезную нагрузку и данные об ошибках.
  • Воспроизводить прерывистые потоки несколькими щелчками мыши.
  • Уверенно разрабатывать и развертывать готовый к работе код, видя потоки данных, полезные нагрузки, зависимости и ошибки в вашей локальной среде.
  • Делиться и повторно использовать запросы и полезные нагрузки.
  • Автоматически генерировать тесты на основе трассировки и обеспечить наблюдаемость для ваших существующих тестовых запусков.

Подобно Python, вы можете легко использовать Helios для инструментирования во многих других языках и фреймворках, включая JavaScript, Node.js , Java, Ruby, .NET, Go, C++ и Collector. Итак, если вы ищете подробную информацию об отслеживании вашей распределённой системы, взгляните на Helios. Вы можете зарегистрироваться на бесплатном уровне Helios здесь.

+1
0
+1
0
+1
0
+1
0
+1
0

Один комментарий

  1. 1. Чем уникален python – абсолютно ненужный кусок руководства, зачем он? Набить объем текста?
    2. app = Flask(name) а name у нас это…. ?
    3. $opentelemetry-instrument –traces_exporter console ….
    zsh: command not found: opentelemetry-instrument

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *