Внедрение OpenTelemetry в приложение Gin

OpenTelemetry можно использовать для отслеживания приложений Gin на предмет проблем с производительностью и ошибок. OpenTelemetry — это проект с открытым исходным кодом в рамках Cloud Native Computing Foundation (CNCF), целью которого является стандартизация генерации и сбора телеметрических данных. Телеметрические данные включают журналы, метрики и трассировки.

Gin — это HTTP веб-фреймворк, написанный на языке Go (Golang). В нем реализован API, похожий на Martini, с гораздо лучшей производительностью — до 40 раз быстрее.

Если вам нужна потрясающая производительность, купите себе Gin!

Фреймворк Gin имеет очень маленький размер и высокую скорость работы, потому что он построен на HttpRouter, легком, высокопроизводительном маршрутизаторе HTTP-запросов. HttpRouter и Gin используют радиксное дерево для быстрого разбора длинных и сложных маршрутных запросов.

Промежуточное ПО OpenTelemetry для Gin

В этом руководстве мы продемонстрируем, как использовать промежуточное ПО OpenTelemetry Gin для создания сквозной трассировки. Мы также настроим клиент базы данных GORM с помощью библиотек OpenTelemetry.

Прежде чем мы продемонстрируем, как реализовать библиотеки OpenTelemetry, давайте сделаем краткий обзор OpenTelemetry.

Что такое OpenTelemetry?

OpenTelemetry — это набор инструментов, API и SDK с открытым исходным кодом, не зависящий от производителя, используемый для инструментария приложений с целью создания и управления телеметрическими данными (журналы, метрики и трассировки). Его цель — сделать телеметрические данные (журналы, метрики и трассы) встроенной функцией облачных приложений.

Данные телеметрии затем отправляются в инструмент наблюдаемости для хранения и визуализации.

Библиотеки OpenTelemetry инструментируют код приложения для генерации телеметрических данных, которые затем отправляются в инструмент наблюдаемости для хранения и визуализации.

OpenTelemetry — это основа для создания системы наблюдаемости. Он также предоставляет вам свободу выбора бэкэнд-инструмента анализа по вашему усмотрению.

OpenTelemetry и SigNoz

В этой статье мы будем использовать SigNoz в качестве инструмента анализа бэкенда. SigNoz — это полнофункциональный APM-инструмент с открытым исходным кодом, который можно использовать для хранения и визуализации телеметрических данных, собранных с помощью OpenTelemetry. Он построен на базе OpenTelemetry и работает с форматами данных OTLP.

SigNoz предоставляет возможности запросов и визуализации для конечного пользователя и поставляется с готовыми диаграммами для метрик и трасс приложения.

Теперь перейдем к тому, как внедрить библиотеки OpenTelemetry Gin, а затем визуализировать собранные данные в SigNoz.

Запуск приложения Gin с OpenTelemetry

Шаг 1: Установите SigNoz

Сначала необходимо установить SigNoz, чтобы OpenTelemetry мог отправлять ему данные.

SigNoz можно установить на компьютерах с macOS или Linux всего за три шага с помощью простого сценария установки.

Сценарий установки автоматически устанавливает Docker Engine на Linux. Однако на macOS необходимо вручную установить Docker Engine перед запуском сценария установки.

git clone -b main <https://github.com/SigNoz/signoz.git>
cd signoz/deploy/
./install.sh
Вход в полноэкранный режим Выход из полноэкранного режима

Инструкции по установке SigNoz с помощью Docker Swarm и Helm Charts вы можете найти в нашей документации.

После завершения установки SigNoz вы можете получить доступ к пользовательскому интерфейсу по адресу http://localhost:3301.

Шаг 2: Получите образец приложения Gin на языке Golang

Образец приложения Go

Оно содержит пример кода-шаблона, который мы будем использовать.

Если вы хотите следовать руководству, то следуйте ветке without-instrumentation.

Шаг 3: Объявите несколько переменных для настройки OpenTelemetry

Объявите в файле main.go следующие переменные, которые мы будем использовать для настройки OpenTelemetry

var (
    serviceName  = os.Getenv("SERVICE_NAME")
    signozToken  = os.Getenv("SIGNOZ_ACCESS_TOKEN")
    collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
    insecure     = os.Getenv("INSECURE_MODE")
)
Войти в полноэкранный режим Выйти из полноэкранного режима

Шаг 4: Инструментируйте ваше приложение Gin с помощью OpenTelemetry

Чтобы настроить ваше приложение на отправку данных, нам понадобится функция для инициализации OpenTelemetry. Добавьте следующий фрагмент кода в ваш файл main.go.

import (
  .....

    "github.com/gin-gonic/gin"
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/attribute"
    "go.opentelemetry.io/otel/exporters/otlp/otlptrace"
    "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"

    "go.opentelemetry.io/otel/sdk/resource"
    sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

func initTracer() func(context.Context) error {

    headers := map[string]string{
        "signoz-access-token": signozToken,
    }

    secureOption := otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
    if len(insecure) > 0 {
        secureOption = otlptracegrpc.WithInsecure()
    }

    exporter, err := otlptrace.New(
        context.Background(),
        otlptracegrpc.NewClient(
            secureOption,
            otlptracegrpc.WithEndpoint(collectorURL),
            otlptracegrpc.WithHeaders(headers),
        ),
    )

    if err != nil {
        log.Fatal(err)
    }
    resources, err := resource.New(
        context.Background(),
        resource.WithAttributes(
            attribute.String("service.name", serviceName),
            attribute.String("library.language", "go"),
        ),
    )
    if err != nil {
        log.Printf("Could not set resources: ", err)
    }

    otel.SetTracerProvider(
        sdktrace.NewTracerProvider(
            sdktrace.WithSampler(sdktrace.AlwaysSample()),
            sdktrace.WithSpanProcessor(sdktrace.NewBatchSpanProcessor(exporter)),
            sdktrace.WithSyncer(exporter),
            sdktrace.WithResource(resources),
        ),
    )
    return exporter.Shutdown
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Шаг 5: Инициализация трассировщика в файле main.go

Измените функцию main для инициализации трассировщика в main.go.

func main() {
    cleanup := initTracer()
    defer cleanup(context.Background())

    ......
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Шаг 6: Добавьте промежуточное ПО OpenTelemetry Gin

Настройте Gin на использование промежуточного ПО, добавив следующие строки в main.go.

import (
    ....
  "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
)

func main() {
    ......
    r := gin.Default()
    r.Use(otelgin.Middleware(serviceName))
    ......
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Шаг 7: Установите переменные окружения и запустите ваше приложение Gin

Теперь, когда вы настроили ваше приложение Gin с помощью OpenTelemetry, вам нужно установить некоторые переменные окружения для отправки данных в бэкенд SigNoz:

OTEL_EXPORTER_OTLP_ENDPOINT: localhost:4317

Поскольку мы установили SigNoz на нашей локальной машине, мы используем вышеуказанный IP. Если вы установите SigNoz на другой машине, вы можете обновить его с соответствующим IP.

Таким образом, окончательная команда запуска выглядит следующим образом:

SERVICE_NAME=goGinApp INSECURE_MODE=true OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317 go run main.go
Войти в полноэкранный режим Выйти из полноэкранного режима

Шаг 8: Сгенерируйте некоторые данные

Для того чтобы отслеживать работу вашего приложения Gin с помощью SigNoz, вам сначала нужно сгенерировать некоторые данные.

  • Создайте книгу

    curl --location --request POST 'localhost:8091/books' 
    --header 'Content-Type: application/json' 
    --data-raw '{
        "title": "book 1",
        "author": "John Doe"
    }'
    

  • Проверьте список книг, выполнив следующий Curl

    curl --location --request GET 'localhost:8091/books'
    

Шаг 9: Визуализация собранных данных в SigNoz

Зайдите в пользовательский интерфейс signoz на сайте http://localhost:3301/application.

Перейдите в MetricsgoGinApp → вы сможете увидеть приборную панель

Вы можете отслеживать такие метрики приложения, как задержка приложения, запросы в секунду, процент ошибок и т.д. с помощью вкладки Metrics в SigNoz.

OpenTelemetry также собирает данные трассировки вашего приложения Gin. Данные трассировки могут помочь вам визуализировать выполнение пользовательских запросов в мультисервисном приложении.

На вкладке Traces в SigNoz вы можете анализировать данные трассировки, используя фильтры на основе тегов, кодов состояния, имен служб, операций и т.д.

Вы также можете визуализировать данные трассировки с помощью пламеграфов и диаграмм Ганта.

Вы также можете осуществлять мониторинг Gorm с помощью библиотек OpenTelemetry.

Мониторинг клиента базы данных GORM с помощью OpenTelemetry

Мы проинструктировали наш Gin, что поможет нам отследить HTTP-запросы, но мы можем захотеть отследить и вызовы БД.

OpenTelemetry предоставляет плагин otelgorm для мониторинга клиента базы данных GORM.

Вы можете выполнить следующие шаги, чтобы проинструментировать ваш клиент базы данных GORM с помощью OpenTelemetry.

Шаг 1: Инициализируйте GORM для использования OpenTelemetry путем обновления models/setup.go.

func ConnectDatabase() {
    .....
    DB = database
    if err := DB.Use(otelgorm.NewPlugin()); err != nil {
        panic(err)
    }
}  
Войдите в полноэкранный режим Выйти из полноэкранного режима

Шаг 2: Обновите все вызовы базы данных для использования контекста запроса, изменив controllers/books.go.

models.DB будет изменен на models.DB.WithContext(c.Request.Context())

func FindBooks(c *gin.Context) {
    .....
    models.DB.WithContext(c.Request.Context()).Find(&books)
    .....
}
Вход в полноэкранный режим Выход из полноэкранного режима

Приведенное выше изменение должно быть сделано для всех вызовов DB.

Теперь запустите ваше приложение и снова выполните запросы curl. Вы также сможете увидеть трассировку БД.

Заключение

Используя библиотеки OpenTelemetry, вы можете инструментировать свои Gin-приложения для сквозной трассировки. Затем вы можете использовать инструмент APM с открытым исходным кодом, такой как SigNoz, для обеспечения бесперебойной работы ваших приложений Gin.

OpenTelemetry — это будущее для настройки наблюдаемости для облачных нативных приложений. Она поддерживается огромным сообществом и охватывает широкий спектр технологий и фреймворков. Используя OpenTelemetry, инженерные команды могут спокойно инструментировать полиглотные и распределенные приложения.

SigNoz — это инструмент наблюдаемости с открытым исходным кодом, который работает по принципу SaaS. Вы можете попробовать SigNoz, посетив его репозиторий на GitHub 👇.

Если у вас возникнут какие-либо проблемы при опробовании SigNoz, вы можете обратиться с вопросами в канал #support 👇.


Дальнейшее чтение

Мониторинг приложения Golang с помощью OpenTelemetry и SigNoz

Почему распределенная трассировка необходима в приложениях на базе микросервисов?

Оцените статью
Procodings.ru
Добавить комментарий