Обзор
В настоящее время почти весь персонал отдела исследований и разработок каждый день имеет дело с API: серверная часть постоянно создает API для реализации бизнеса, а клиентская часть постоянно вызывает API для реализации функций продукта. API стал мостом между интерфейсом и сервером, продуктами и продуктами, технической коммуникацией и деловым сотрудничеством между компаниями.
В микросервисах API — чуть ли не единственный канал взаимодействия между сервисами и внешним миром, а стабильность и надежность API-сервисов все больше становятся частью, которую нельзя игнорировать. Нам нужно понимать текущее состояние API в режиме реального времени (количество запросов, задержек, сбоев и т. д.), а также нам нужно понять, какие API имеют узкие места, путем анализа исторических данных для последующей оптимизации. Поэтому, чтобы гарантировать, что система хорошо предоставляет услуги, большинство микросервисных фреймворков также интегрируют компоненты мониторинга API.
Эта статья добавит функцию мониторинга API в сервис арифметических операций:Prometheus
В качестве компонента мониторинга,Grafana
В качестве средства визуализации оба проходятdocker-compose
Развертывание выполняется. go-kit уже обеспечиваетprometheus
компоненты (metric/prometheus
), поэтому интеграция становится очень легкой. Прежде чем начать, нам нужно понять необходимые точки знаний.
Prometheus
Prometheus (китайское название: PROMETHEUS) - это кадра сигнализации системы с открытым исходным кодом. В качестве нового поколения структуры мониторинга PROMETHEUS имеет следующие характеристики:
- Обеспечить мощные многомерные модели данных, такие как счетчик, датчик, гистограмма, сводка;
- Мощный и гибкий оператор запроса (PromQL), который может легко реализовать операции запроса и агрегирования данных временных рядов;
- Прост в управлении и эффективен;
- Обеспечьте режим извлечения и режим шлюза push для сбора данных временных рядов;
- Поддержка различных визуальных графических интерфейсов: Grafana, веб-интерфейс, клиенты API;
- Управление правилами тревог, обнаружение тревог и функции отправки тревог.
Grafana
Grafana — это кроссплатформенный инструмент для анализа и визуализации метрик с открытым исходным кодом, который может запрашивать собранные данные, а затем визуализировать их и своевременно уведомлять об этом. В основном он имеет следующие шесть характеристик:
- Метод отображения: быстрые и гибкие диаграммы на стороне клиента, плагины панели имеют множество различных способов отображения индикаторов и журналов, в официальной библиотеке есть множество плагинов панели мониторинга, таких как тепловые карты, линейные диаграммы, диаграммы и другие методы отображения. ;
- Источники данных: Graphite, InfluxDB, OpenTSDB, Prometheus, Elasticsearch, CloudWatch и KairosDB и др.;
- Напоминания об уведомлениях: визуально определите правила оповещения для наиболее важных показателей, Grafana будет постоянно рассчитывать и отправлять уведомления, а также получать уведомления через Slack, PagerDuty и т. д., когда данные достигают порогового значения;
- Смешанное отображение: смешивайте разные источники данных на одной диаграмме, вы можете указать источники данных на основе каждого запроса или даже настроить источники данных;
- Аннотации: добавляйте к диаграммам расширенные сведения о событиях из разных источников данных, при наведении указателя мыши на событие отображаются полные метаданные и теги события;
- Фильтры: Ad-HOC-фильтры позволяют динамическое создание новых фильтров ключа / значения, которые автоматически применяются ко всем запросам, используя этот источник данных.
В этом примере задание добавляется в Prometheus через конфигурационный файл, и, в частности, в этот пример службы периодически отправляются HTTP-запросы для мониторинга данных индикатора (то есть режим pull).
Практическая тренировка
Шаг 1: Подготовка среды
Поскольку установка докера на мой компьютер не удалась, я переключил операционную среду на ubuntu 18.04, а для разработки использовал Goland.
Если вы уже настроили docker и docker-compose, вы можете пропустить шаги 1 и 2;
- Следуйте официальному руководству по установке
docker-ce
.另外,为了提高镜像下载速度,可选择国内镜像修改方式如下:
# 打开(没有会新建)文件
sudo vim /etc/docker/daemon.json
# 设置以下内容
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
# 重启服务
sudo service docker restart
- Установите Docker-Compose. Официальный установит установочный пакет в AWS, что особенно медленно. Я первый на странице выпуска, чтобы загрузить последнюю версию, скопируйте ее.
usr/local/bin/docker-compose
; Затем установите разрешения для успешной установки. Действуйте следующим образом:
# 移动或复制文件到指定目录
sudo mv [your download file] /usr/local/bin/docker-compose
# 设置权限
sudo chmod +x /usr/local/bin/docker-compose
# 检查是否安装成功
docker-compose --version
- Скачайте последнюю версию клиента Prometheus
go get github.com/prometheus/client_golang/prometheus
- копировать каталог
arithmetic_rate_limit_demo
, переименован вarithmetic_monitor_dmeo
;
Шаг 2: Добавить индикатор для промежуточного программного обеспечения
Этот пример будет основан на«Микросервисы go-kit: ограничение тока»Код улучшен с использованием механизма промежуточного программного обеспечения go-kit в качествеService
Добавлена функция сбора индикаторов мониторинга Prometheus. существуетinstrument.go
Добавьте новый тип структуры в:
// metricMiddleware 定义监控中间件,嵌入Service
// 新增监控指标项:requestCount和requestLatency
type metricMiddleware struct {
Service
requestCount metrics.Counter
requestLatency metrics.Histogram
}
Затем создайте метод для инкапсуляции коллекции индикаторов для службы.Metric
, собрать два показателя: количество запросов и задержку запроса:
// Metrics 指标采集方法
func Metrics(requestCount metrics.Counter, requestLatency metrics.Histogram) ServiceMiddleware {
return func(next Service) Service {
return metricMiddleware{
next,
requestCount,
requestLatency}
}
}
Затем это согласуется с методами текущего ограничения и промежуточного программного обеспечения журнала.Поскольку интерфейс службы встроен, методы этого интерфейса должны быть реализованы по очереди.В качестве примера для иллюстрации возьмем «Добавить», и другие методы аналогичны.
- При каждом получении запроса количество запросов увеличивается на 1;
- Разница между временем окончания запроса и временем начала запроса (в секундах) используется в качестве задержки запроса;
func (mw metricMiddleware) Add(a, b int) (ret int) {
defer func(beign time.Time) {
lvs := []string{"method", "Add"}
mw.requestCount.With(lvs...).Add(1)
mw.requestLatency.With(lvs...).Observe(time.Since(beign).Seconds())
}(time.Now())
ret = mw.Service.Add(a, b)
return ret
}
Шаг 3: Откройте интерфейс коллекции индикаторов Prometheus
существуетtransport.go
Добавлен код для Prometheus для циклического извлечения индикаторов мониторинга и открытый интерфейс API./metrics
.
r.Path("/metrics").Handler(promhttp.Handler())
Шаг 4: Изменить main.go
Во-первых, создайте объекты коллекции индикаторов: коллекцию счетчиков запросов и объекты коллекции задержек запросов.
fieldKeys := []string{"method"}
requestCount := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "raysonxin",
Subsystem: "arithmetic_service",
Name: "request_count",
Help: "Number of requests received.",
}, fieldKeys)
requestLatency := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
Namespace: "raysonxin",
Subsystem: "arithemetic_service",
Name: "request_latency",
Help: "Total duration of requests in microseconds.",
}, fieldKeys)
использоватьMetrics
Метод инкапсулирует объект службы:
svc = Metrics(requestCount, requestLatency)(svc)
Из-за необходимости использовать Postman для тестирования интерфейса в конце, здесь я изменил мощность ограничителя тока на 100.
//add ratelimit,refill every second,set capacity 3
ratebucket := rate.NewLimiter(rate.Every(time.Second*1), 100)
endpoint = NewTokenBucketLimitterWithBuildIn(ratebucket)(endpoint)
Таким образом, модификация кода завершена, поgo build
Скомпилируйте и убедитесь, что проблем нет.
Шаг 5. Настройте образ докера
В этом примере используются официальные образы Docker Prometheus и Gafana (prom/prometheus и grafana/grafana) для создания среды с помощью docker-compose.
Во-первых, создайте файл конфигурации (docker/prometheus.yml) для Prometheus и создайте задание, которое регулярно каждые 5 секунд получает данные индикатора мониторинга из нашего микросервиса с именем Raysonxin. Этот файл конфигурации необходимо загрузить в образ во время выполнения.Обратите внимание, что в target задан адрес доступа службы арифметических операций, отступ информации о конфигурации файла yml.
global:
scrape_interval: 15s
external_labels:
monitor: 'raysonxin-monitor'
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
labels:
group: 'local'
- job_name: 'raysonxin'
scrape_interval: 5s
static_configs:
- targets: ['192.168.10.113:9000']
labels:
group: 'arithmetic'
Для образа Gafana в файле yml необходимо установить две конфигурации:
- Установите пароль для входа администратора через переменную среды
GF_SECURITY_ADMIN_PASSWORD
; - Создать тома, чтобы указать каталог хранения данных;
Затем создайте файл конфигурации, необходимый для запуска docker-compose: docker/docker-compose.yml со следующим содержимым:
version: '2'
services:
prometheus:
image: prom/prometheus
ports:
- 9090:9090
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- 3000:3000
environment:
- GF_SECURITY_ADMIN_PASSWORD=password
volumes:
- $PWD/extra/grafana_db:/var/lib/grafana grafana/grafana
Теперь вы можете запустить докер с помощью команды.
Шаг 6: Запустите
Все готово, кроме восточного ветра. Следующий шаг — запустить наш сервис, образы Prometheus и Grafana по очереди, а затем использовать Postman для тестирования.
- Запустите службу арифметических операций.
./arithmetic_monitor_demo
Http Server start at port:9000
- Запустите докер.
# 启动docker
docker-compose -f docker/docker-compose.yml up -d
# 查看运行状态
sudo docker-compose -f docker/docker-compose.yml ps
# 停止docker
sudo docker-compose -f docker/docker-compose.yml stop
По команде «проверить статус», чтобы увидеть следующее описание интерфейса, Prometheus и Grafana запущены и работают.
- Используйте Postman для вызова службы арифметических операций. Здесь используйте Postman's
Runner
функции (верхний левый угол интерфейса), сначала добавьте четыре запроса службы арифметических операций вCollection
в; затем создайтеEnvironment
(правый верхний угол интерфейса) с именемenv-gokit-article
; затем введитеRunner
-выберитеCollection
, после установки, как показано ниже, нажмите кнопкуRun demo1
Начал тест.
Шаг 7: Просмотр данных мониторинга
Первый раз захожу через браузерGrafana
Для просмотра данных мониторинга требуется несколько конфигураций. Это относительно просто. Шаги следующие:
- Войдите в Grafana: доступ через браузер
localhost:3000
, используя имя пользователяadmin
и настроенный пароль ymlpassword
Авторизоваться; - Создать источник данных: нажмите
create your first datasource
,выберитеPrometheus
, настроитьHTTP.URL
(рекомендуется установитьhttp://[IP]:[port]
, не используйте localhost), последнее сохранение выполнено успешно. - Создание приборной панели: нажмите
create your first dashboard
,выберитеGraph
, нажмитеTitle
в выпадающем менюEdit
, вы можете войти в следующий интерфейс (выберите параметр Metric):
Как показано на рисунке, введите в поле ввода запросаraysonxin
Вы можете увидеть четыре элемента индекса мониторинга, которые мы собрали, и вы можете просмотреть детали на диаграмме, выбрав один из них (пожалуйста, проверьте данные для анализа самостоятельно, эта статья не будет расширяться, потому что вы еще этого не понимаете) .
- Raysonxin_arithmetic_service_request_count;
- Raysonxin_arithmetic_service_request_latency;
- Raysonxin_arithmetic_service_request_latency_count;
- Raysonxin_arithmetic_service_request_latency_sum;
Суммировать
Сегодняшний пример добавляет функцию мониторинга API на основе Prometheus в вычислительную службу, собирает данные индикатора мониторинга вычислительной службы через Prometheus (официальный образ докера) и просматривает данные индикатора мониторинга через панель инструментов Grafana (официальный образ докера).
Поскольку сам go-kit инкапсулировал компоненты мониторинга Prometheus, работа по написанию кода относительно экономит время, и больше времени тратится на построение и тестирование среды.Конечно, эффективность значительно повысилась за счет использования технология докера.
В этой статье просто фиксируется мой процесс обучения наподобие текущего аккаунта, а не проводится глубокий анализ используемых в нем технологий и принципов.
Этот пример кода может передать мнеgithubПолучить его, если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение для обсуждения.
Ссылка в этой статье
- Сравнение образов домашних складов докеров
- Руководство по установке Ubuntu docker-ce
- Начало работы с Прометеем
- Micro-services Using go-kit: API Monitoring
Эта статья была впервые опубликована в моей публичной учетной записи WeChat [Xi Yiang Bar], пожалуйста, отсканируйте код, чтобы следовать!