Skip to content

Commit

Permalink
add prometheus to golang app, fix yml for prometheus to scrape
Browse files Browse the repository at this point in the history
  • Loading branch information
skripov-ds-ai committed Oct 23, 2022
1 parent cb06c54 commit 14b5a06
Show file tree
Hide file tree
Showing 9 changed files with 551 additions and 37 deletions.
45 changes: 32 additions & 13 deletions README_OLD.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,19 @@

## Описание задания

Необходимо разработать приложение, предоставляющее HTTP API для получения данных о парковках такси в г. Москва. Данные необходимо брать с [этой страницы][dataset_link] ("Актуальная версия").
Необходимо разработать приложение, предоставляющее HTTP API для получения данных
о парковках такси в г. Москва. Данные необходимо брать с [этой страницы][dataset_link]
("Актуальная версия").

## Описание необходимого функционала

Приложение должно реализовывать:

- Функционал загрузки данных из файла _(локального и/или по ссылке)_ в хранилище данных _(данные на источнике могут как удаляться, так и добавляться)_;
- Функционал загрузки данных из файла _(локального и/или по ссылке)_ в
хранилище данных _(данные на источнике могут как удаляться, так и добавляться)_;
- Обслуживание HTTP запросов к API-endpoints, которые реализуют поиск по хранимым данным;
- Обслуживание HTTP запросов к роуту, возвращающему метрические данные (в [формате prometheus][prometheus_format]) работы приложения.
- Обслуживание HTTP запросов к роуту, возвращающему метрические данные
[формате prometheus][prometheus_format]) работы приложения.

> Обновление данных в хранилище должно происходить без остановки обслуживания HTTP запросов к API с учетом того, что их объем может быть _очень_ большим _(и маппинг данных на источнике может изменяться)_.
Expand All @@ -31,36 +35,51 @@
Метрические данные должны включать в себя как минимум следующие метрики:

- Общее количество обработанных запросов к API-endpoints;
- Количество ошибок обработки HTTP запросов к API-endpoints _(плюсом будет "разведение" по различным кодам ответов)_;
- Количество ошибок обработки HTTP запросов к API-endpoints
_(плюсом будет "разведение" по различным кодам ответов)_;
- Данные по времени обработки HTTP запросов к API-endpoint;
- Дополнительные метрики, на ваше усмотрение.

## Требования к реализации

- В качестве хранилища данных необходимо использовать Redis;
- Все функции _(экспортируемые и не экспортируемые)_ должны сопровождаться понятным комментарием (если возможно - на английском языке);
- Не стоит излишне сокращать имена переменных и констант - код пишется для людей, и он должен быть максимально простым и понятным;
- Все функции _(экспортируемые и не экспортируемые)_ должны
сопровождаться понятным комментарием (если возможно - на английском языке);
- Не стоит излишне сокращать имена переменных и констант -
код пишется для людей, и он должен быть максимально простым и понятным;
- Можно использовать любые сторонние пакеты, но не использовать какой-либо фреймворк;
- Весь ключевой функционал должен быть зафиксирован unit-тестами;
- После завершения работы над заданием необходимо написать сопроводительную документацию по работе с приложением в файле `README.md` в корне репозитория;
- Конфигурация параметров подключения к хранилищу данных должна иметь возможность управляться как флагами запуска, так и переменными окружения. Возможности конфигурирования должны быть описаны в файле `README.md` вашего репозитория.
- После завершения работы над заданием необходимо написать
сопроводительную документацию по работе с приложением в файле `README.md` в корне репозитория;
- Конфигурация параметров подключения к хранилищу данных должна
иметь возможность управляться как флагами запуска, так и переменными окружения.
Возможности конфигурирования должны быть описаны в файле `README.md` вашего репозитория.

## Плюсами будут являться

- Настройка CI _(силами GitHub actions, TravisCI, etc)_ выполняющая запуск тестов и сборки на каждый коммит;
- Настройка CI _(силами GitHub actions, TravisCI, etc)_ выполняющая запуск тестов и
сборки на каждый коммит;
- Автоматическая сборка Docker-образа с приложением;
- Интуитивно-понятное разбитие коммитов - одной конкретной задаче - один коммит или PR (её правки - отдельный коммит или PR);
- Интуитивно-понятное разбитие коммитов - одной
конкретной задаче - один коммит или PR (её правки - отдельный коммит или PR);
- Написание всех текстов коммитов - на английском языке.

## Как начать выполнение тестового задания?

Для выполнения задания лучше всего использовать данный репозиторий как шаблон, для чего просто перейдите по [**этой ссылке**][use_this_repo_template].
Для выполнения задания лучше всего использовать данный репозиторий как шаблон,
для чего просто перейдите по [**этой ссылке**][use_this_repo_template].

Данный репозиторий уже содержит `Dockerfile`, `docker-compose.yml` и `Makefile` для быстрого запуска приложения силами `docker` _(нет необходимости устанавливать golang, redis и пр. локально)_. Всё, что необходимо - это установленные локально `docker` и `docker-compose`. После клонирования репозитория просто выполните `docker-compose up -d` - и можно приступать к написанию полезного кода.
Данный репозиторий уже содержит `Dockerfile`,
`docker-compose.yml` и `Makefile` для быстрого запуска приложения силами
`docker` _(нет необходимости устанавливать golang, redis и пр. локально)_.
Всё, что необходимо - это установленные локально `docker` и `docker-compose`.
После клонирования репозитория просто выполните `docker-compose up -d` - и
можно приступать к написанию полезного кода.

## Результат выполнения

Ссылку на репозиторий с вашей реализацией необходимо отправить нашему HR или TeamLead, от которого вы получили ссылку на данный репозиторий.
Ссылку на репозиторий с вашей реализацией необходимо отправить нашему HR или TeamLead, от
которого вы получили ссылку на данный репозиторий.

Приложение должно успешно запускаться после выполнения:

Expand Down
8 changes: 5 additions & 3 deletions db_processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"crypto/md5"
"errors"
"fmt"
"github.com/go-redis/redis/v8"
"golang-developer-test-task/infrastructure/redclient"
"golang-developer-test-task/structs"
"html/template"
Expand Down Expand Up @@ -50,7 +51,7 @@ func NewDBProcessor(client *redclient.RedisClient, logger *zap.Logger) *DBProces
// saveInfo is method for info saving to DB
func (d *DBProcessor) saveInfo(info structs.Info) {
err := d.client.AddValue(context.Background(), info)
if err != nil {
if err != nil && err != redis.Nil {
d.logger.Error("error inside processJSONs in goroutine",
zap.Error(err))
return
Expand Down Expand Up @@ -142,12 +143,13 @@ func (d *DBProcessor) MethodMiddleware(handler Handler, validMethod string) Hand
func (d *DBProcessor) HandleLoadFile(w http.ResponseWriter, r *http.Request) {
err := r.ParseMultipartForm(32 << 20)
if err != nil {
d.logger.Error("error during file parsing in HandleLoadFile", zap.Error(err))
w.WriteHeader(http.StatusInternalServerError)
return
}
err = d.processFileFromRequest(r, "uploadFile", d.jsonProcessor)
if err != nil {
d.logger.Error("error during file processing", zap.Error(err))
d.logger.Error("error during file processing in HandleLoadFile", zap.Error(err))
w.WriteHeader(http.StatusInternalServerError)
return
}
Expand Down Expand Up @@ -223,7 +225,7 @@ func (d *DBProcessor) HandleSearch(w http.ResponseWriter, r *http.Request) {
return
}

ctx := r.Context()
ctx := context.Background()
paginationObj := structs.PaginationObject{}
paginationObj.Offset = int64(searchObj.Offset)
var paginationSize int64 = 5
Expand Down
16 changes: 8 additions & 8 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ services:
env_file:
- .env
ports:
- 8080:3000
- 8080:8080
depends_on:
- redis

Expand All @@ -32,25 +32,25 @@ services:
# --requirepass ${REDIS_PASSWORD}
# env_file:
# - .env
volumes:
- redis-data:/data:cached
# volumes:
# - redis-data:/data:cached
ports:
# - 6379
- '6379:6379/tcp'

prometheus:
image: prom/prometheus:v2.38.0
ports:
- 9090:9090
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

grafana:
image: grafana/grafana:9.1.2
ports:
- 3000:3000
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=secret
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning
- ./grafana/dashboards:/var/lib/grafana/dashboards
# volumes:
# - ./grafana/provisioning:/etc/grafana/provisioning
# - ./grafana/dashboards:/var/lib/grafana/dashboards
Loading

0 comments on commit 14b5a06

Please sign in to comment.