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.
Перейдите в Metrics
→ goGinApp
→ вы сможете увидеть приборную панель
Вы можете отслеживать такие метрики приложения, как задержка приложения, запросы в секунду, процент ошибок и т.д. с помощью вкладки 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
Почему распределенная трассировка необходима в приложениях на базе микросервисов?