логотип PurpleSchool
логотип PurpleSchool

Мониторинг Golang приложений с помощью Prometheus

Автор

Олег Марков

Введение

Мониторинг приложений — важная часть разработки современных программных продуктов. Внедрение систем мониторинга позволяет выявлять и решать проблемы производительности и надежности на ранних стадиях. Prometheus — это одна из самых популярных систем для мониторинга приложений с открытым исходным кодом. Она предоставляет мощные инструменты для сбора и анализа данных о работе вашего кода.

В этой статье мы обсудим, как использовать Prometheus для мониторинга Golang приложений. Мы займемся интеграцией этой системы в ваш проект, чтобы вы смогли легко отслеживать ключевые метрики и быть уверенными в стабильной работе вашего приложения.

Установка и настройка Prometheus

Перед тем как начать интеграцию, необходимо установить и настроить Prometheus. Для этого выполните следующие шаги:

  1. Скачайте Prometheus с официального сайта.
  2. Разархивируйте скачанный файл в удобное для вас место.
  3. Создайте конфигурационный файл prometheus.yml. Он потребуется для определения, какие данные вы хотите собирать и откуда. Пример простейшего файла конфигурации:
# Здесь мы определяем, откуда Prometheus будет забирать данные
scrape_configs:
  - job_name: 'your_golang_app'
    static_configs:
      - targets: ['localhost:9090'] # Замените на фактический адрес и порт вашего приложения

Интеграция Prometheus с Golang приложением

Чтобы Prometheus мог собирать метрики с вашего приложения, его нужно интегрировать в код. Воспользуемся пакетом prometheus/client_golang, который предоставляет все необходимые инструменты.

Установка библиотеки

Начнем с установки библиотеки prometheus/client_golang:

go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp

Настройка метрик

Теперь, когда библиотека установлена, давайте создадим несколько метрик в вашем приложении. Метрик может быть много — от временных задержек до количества запросов. Для простоты начнем с простой метрики, которая считает количество HTTP-запросов:

package main

import (
    "net/http"

    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

// Создание счетчика HTTP-запросов
var httpRequestsTotal = prometheus.NewCounterVec(
    prometheus.CounterOpts{
        Name: "http_requests_total",
        Help: "Total number of HTTP requests",
    },
    []string{"path"}, // Лейблы для метрики
)

func main() {
    // Регистрируем метрику в Prometheus
    prometheus.MustRegister(httpRequestsTotal)

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        httpRequestsTotal.WithLabelValues(r.URL.Path).Inc() // Увеличиваем счетчик при каждом запросе
        w.Write([]byte("Hello, world!"))
    })

    // Настраиваем обработчик для /metrics
    http.Handle("/metrics", promhttp.Handler())

    // Запуск HTTP-сервера
    http.ListenAndServe(":9090", nil)
}

В этом коде мы создаем счетчик HTTP-запросов, который увеличивается при каждом обращении к приложению. Обратите внимание, как мы используем promhttp.Handler() для обработки запросов к /metrics. Этот обработчик автоматически экспортирует все зарегистрированные метрики, готовые для сбора Prometheus.

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

Теперь пришло время запустить как ваше приложение, так и Prometheus. Для этого откройте терминал и выполните следующие команды:

  1. Запустите ваше Golang приложение: bash go run main.go

  2. Запустите Prometheus: bash ./prometheus --config.file=prometheus.yml

Prometheus должен начать собирать данные с вашего приложения. Вы можете убедиться в этом, открыв интерфейс Prometheus по адресу http://localhost:9090 и перейдя в раздел "Graph", где можно выполнить запрос http_requests_total и увидеть график с количеством запросов.

Заключение

Теперь вы знаете, как интегрировать Prometheus в ваше Golang приложение для сбора метрик. Мы рассмотрели установку и настройку Prometheus, а также создание и регистрацию метрик в вашем приложении. С Prometheus у вас есть мощный инструмент для мониторинга, который поможет вам отслеживать ключевые метрики и обеспечивать стабильную работу вашего кода. Не стесняйтесь экспериментировать и добавлять больше метрик для более глубокого анализа работы вашего приложения. Удачи!

Стрелочка влевоРабота с пакетом S3 в GolangОптимизация проектов на GoСтрелочка вправо

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРегистры в GoРабота с cookie в GolangКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний