Spec-Zone.ru › MySQL Connectors 1.0

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.
https://docs.oracle.com/cd/E17952_01/connector-python-en/connector-python-opentelemetry.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API