9.2 Поддержка телеметрии
MySQL Server добавил поддержку OpenTelemetry в MySQL Enterprise Edition версии 8.1.0, которая является коммерческим продуктом. Поддержка отслеживания OpenTelemetry была добавлена в Connector/Python 8.1.0.
Введение в OpenTelemetry
OpenTelemetry — это фреймворк и набор инструментов для наблюдаемости, предназначенные для создания и управления данными телеметрии, такими как трассировки, метрики и журналы. Посетите Что такое OpenTelemetry?, чтобы узнать о возможностях OpenTelemetry.
Connector/Python поддерживает только трассировку, поэтому в этом руководстве отсутствует информация о сигналах метрик и журналов.
Установка поддержки телеметрии
Установите пакеты OpenTelemetry API, SDK и OTLP Exporter на систему вместе с Connector/Python. При необходимости используйте сокращение [telemetry] при установке пакета mysql-connector-python pip, чтобы получить определённые версии OpenTelemetry, как задано подключением.
Ручная установка:
pip install opentelemetry-api
pip install opentelemetry-sdk
pip install opentelemetry-exporter-otlp-proto-http
pip install mysql-connector-python
Или передайте [telemetry] при установке Connector/Python, чтобы выполнить те же действия, но установить конкретную и проверенную версию OpenTelemetry, которая для Connector/Python 9.0.0 составляет OpenTelemetry v1.18.0:
pip install mysql-connector-python[telemetry]
Connector/Python 8.1.0 до 8.4.0 включал опцию [opentelemetry], которая устанавливала свёрнутую версию библиотек SDK/API OpenTelemetry. В этих версиях это не рекомендовалось.
Инструментирование
Для инструментирования приложения Connector/Python использует официальный SDK OpenTelemetry для инициализации OpenTelemetry и официальный API OpenTelemetry для инструментирования кода приложения. Это генерирует телеметрию из приложения и используемых библиотек, которые включают инструментирование.
Приложение можно инструментировать, как показано в этом общем примере:
from opentelemetry import trace
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__)
with tracer.start_as_current_span("app"):
my_app()
Чтобы лучше понять и начать использовать отслеживание OpenTelemetry для Python, ознакомьтесь с официальным руководством Инструментирование OpenTelemetry для Python.
MySQL Connector/Python
Connector/Python включает инструментировщик MySQL для инструментирования подключений MySQL. Этот инструментировщик предоставляет API и использование, аналогичное собственному пакету OpenTelemetry под названием opentelemetry-instrumentation-mysql.
Если система не поддерживает OpenTelemetry, при попытке использовать инструментировщик возникает исключение.
Пример, который использует SDK/API OpenTelemetry системы и реализует отслеживание с MySQL Connector/Python:
import os
import mysql.connector
# An instrumentor that comes with mysql-connector-python
from mysql.connector.opentelemetry.instrumentation import (
MySQLInstrumentor as OracleMySQLInstrumentor,
)
# Loading SDK from the system
from opentelemetry import trace
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__)
config = {
"host": "127.0.0.1",
"user": "root",
"password": os.environ.get("password"),
"use_pure": True,
"port": 3306,
"database": "test",
}
# Global instrumentation: all connection objects returned by
# mysql.connector.connect will be instrumented.
OracleMySQLInstrumentor().instrument()
with tracer.start_as_current_span("client_app"):
with mysql.connector.connect(**config) as cnx:
with cnx.cursor() as cur:
cur.execute("SELECT @@version")
_ = cur.fetchall()
Морфология сгенерированных трассировок
Трассировка, сгенерированная инструментировщиком Connector/Python, содержит один span подключения и ноль или более spans запросов, как описано в остальной части этого раздела.
Span подключения
Время от инициализации подключения до момента завершения подключения. Span называется
connection.Если приложение не предоставляет span, сгенерированный span подключения является ROOT span, исходящий от подключение.
Если приложение предоставляет span, сгенерированный span запроса является CHILD span, исходящий от подключение.
Span запроса
Время от момента запроса SQL-запроса (со стороны подключение) до момента завершения обработки подключением ответа сервера на этот запрос.
Для каждого запроса, отправленного серверу, создаётся span запроса. Если приложение не предоставляет span, сгенерированный span запроса является ROOT span, исходящий от подключение.
Если приложение предоставляет span, сгенерированный span запроса является CHILD span, исходящий от подключение.
Span запроса связан с существующим span подключения подключения, в котором был выполнен запрос.
Поддержка атрибутов запросов с подготовленными запросами доступна начиная с MySQL Enterprise Edition 8.3.0.
Поддержка spans запросов для объекта подключения доступна начиная с Connector/Python 8.3.0, которая включает методы, такие как commit(), rollback() и cmd_change_user().
Распространение контекста
По умолчанию контекст трассировки текущего span (если он есть) распространяется на MySQL-сервер.
Распространение не имеет эффекта, когда MySQL-сервер отключил или не поддерживает OpenTelemetry (контекст трассировки игнорируется сервером), однако, при подключении к серверу с включенным и настроенным OpenTelemetry, сервер обрабатывает распространённые трассировки и создаёт родительско-дочерние связи между spans от подключение и теми, которые исходят от сервера. Другими словами, это обеспечивает непрерывность трассировки.
Распространение контекста с подготовленными запросами поддерживается начиная с MySQL Enterprise Edition 8.3.0.
-
Контекст трассировки распространяется для заявлений с определёнными атрибутами запроса в MySQL-клиентском/серверном протоколе, таких как COM_QUERY.
Контекст трассировки не распространяется для заявлений без определённых атрибутов запроса в MySQL-клиентском/серверном протоколе, таких как COM_PING.
-
Распространение контекста трассировки осуществляется через атрибуты запроса, где определяется новый атрибут «traceparent». Его значение основано на текущем контексте span. Для получения подробностей о том, как вычисляется это значение, ознакомьтесь со спецификацией заголовка traceparent W3C.
Если атрибут запроса «traceparent» задаётся вручную для запроса, он не перезаписывается подключением; предполагается, что он предоставляет контекст OTel, предназначенный для передачи на сервер.
Отключение распространения контекста трассировки
Логическая свойство подключения с именем otel_context_propagation по умолчанию True. Установка его в False отключает распространение контекста.
Поскольку otel_context_propagation — это свойство подключения, которое можно изменить после установления подключения (объект подключения создан), установка такого свойства в False не влияет на spans, сгенерированные во время фазы подключения. Другими словами, spans, сгенерированные во время фазы подключения, всегда распространяются, поскольку otel_context_propagation по умолчанию True.
Эта реализация отличается от реализации, предоставленной через MySQL-библиотеку клиента (или связанный telemetry_client плагин клиентской стороны).
© 2025 Oracle
Licensed under the GPLv2 License.