laravel twit application where users create accounts and post, edit posts, add images to posts, and comments. Reactjs, Laravel, Docker,docker compose ,nginx , Inertiajs, Mysql.Monitoring with prometheus , mysql exporter, node exporter , black box exporter and grafana
Мое приложение - это клон социальных сетей, приложение crud, в котором пользователи создают учетные записи и публикуют, редактируют посты, добавляют изображения к постам и комментарии.
Пользователь может зарегистрироваться на веб-сайте, и он увидит все сообщения от других пользователей, и он может сделать Post (Twit).
он может просмотреть свой пост, отредактировать его или удалить. а также он может прокомментировать любой Post.Пользователь также может видеть комментарии к своему посту, которые пришли от других пользователей,
и он может ответить на этот комментарий.
Построенный с
Php 8
Laravel 10
ReactJs
Mysql
Docker & docker compose
Prometheus Custom metrics
Prometheus Alertmanager
Node exporter
Blackbox exporte
Mysql exporter
Nginx
Объяснение
. Prometheus
Prometheus является системой мониторинга с открытым исходным кодом, предназначенной для сбора и анализа метрик из различных систем и приложений. Он позволяет получить информацию о производительности и состоянии системы.Прометей следует модели пассивного мониторинга, периодически запрашивая данные метрик из настроенных источников, таких как серверы, контейнеры или сервисы. Эти источники предоставляют метрики в специальном формате (обычно в формате Prometheus экспозиции), который Прометей может интерпретировать.Собранные метрики хранятся Прометеем в базе данных временных рядов и позволяют выполнять запросы и анализ через мощный язык запросов PromQL (Prometheus Query Language). Этот язык позволяет пользователям создавать сложные запросы и выражения для фильтрации, агрегации и манипуляции собранными метриками.
. Node Exporter
Node Exporter - это инструмент, который позволяет Прометею собирать информацию о системе и ресурсах хоста, таких как процессор, память, дисковое пространство и сетевые интерфейсы. Он предоставляет метрики, связанные с работой самого узла, которые затем можно использовать для мониторинга и анализа.
. Blackbox Exporter
Blackbox Exporter - это компонент Прометея, который позволяет выполнять активное мониторинговые проверки различных сетевых служб и протоколов, таких как HTTP, DNS, TCP и других. Он позволяет проверять доступность сервисов, проверять работу определенных эндпоинтов и возвращать соответствующие метрики, которые затем могут быть использованы для оповещения и анализа состояния сети.
. Mysql Exporter
MySQL Exporter - это экспортер Прометея, который позволяет собирать метрики и статистику производительности из базы данных MySQL. Он предоставляет информацию о запросах, подключениях, потоках, кэше и других аспектах работы MySQL. Эти метрики могут быть использованы для отслеживания производительности базы данных и выявления проблем.
. Grafana
это инструмент визуализации данных и построения графиков, который часто используется в сочетании с Прометеем. Он позволяет создавать красочные и информативные дашборды, настраивать графики и панели инструментов на основе собранных метрик Прометея. Grafana предлагает широкий спектр визуальных возможностей, которые помогают пользователю легко интерпретировать и анализировать данные мониторинга.
Создайте Middleware для считать запроса (Request metrics )
class CountRequestsMiddleware
{
private CollectorRegistry $registry;
public function__construct(CollectorRegistry$registry)
{
$this->registry = $registry;
}
/*** @throws MetricsRegistrationException
*/
public functionhandle(Request$request, Closure $next)
{
$startTime = microtime(true);$response = $next($request);$duration = microtime(true) - $startTime;$path = $request->getPathInfo();
$method = $request->getMethod();
$statusCode = $response->getStatusCode();
$content = $response->getContent();
$requestCounter = $this->registry->getOrRegisterCounter(
'app',
'request_count',
'Total number of requests',
['path', 'method', 'status_code']
);$requestCounter->incBy(1, [$path, $method, (string) $statusCode]);$requestDuration = $this->registry->getOrRegisterHistogram(
'app',
'request_duration_seconds',
'Request duration in seconds',
['path', 'method', 'status_code'],
[0.01, 0.1, 1, 5] // Adjust the buckets as per your needs
);$requestDuration->observe($duration, [$path, $method, (string) $statusCode]);$requestSize = $this->registry->getOrRegisterHistogram(
'app',
'request_size_bytes',
'Request size in bytes',
['path', 'method']
);$requestSize->observe(strlen($content), [$path, $method]);return$response;
}
}
Шаг 8
Создайте контроллер для всех metrics
class MetricsController extends Controller
{
public functiongetMetrics(Request$request)
{
DB::connection()->enableQueryLog();
$collectorRegistry = app(CollectorRegistry::class);
//memory usage metric
$memoryUsage = memory_get_usage(true);$gauge = $collectorRegistry->getOrRegisterGauge('app', 'memory_usage_bytes', 'Memory usage in bytes');$gauge->set($memoryUsage);
// Count the number of registered users
$usersRegistered = User::count();
$gauge = $collectorRegistry->getOrRegisterGauge(
'app',
'users_registered_total',
'Total number of registered users'
);$gauge->set($usersRegistered);
// Count the number of Twits
$twitsCount = Twit::count();
$twitsCounter = $collectorRegistry->getOrRegisterGauge(
'app',
'twits_total',
'Total number of Twits'
);$twitsCounter->set($twitsCount);
// Count the number of comments posted on Twits
$commentsCount = Comment::count();
$commentsCounter = $collectorRegistry->getOrRegisterGauge(
'app',
'comments_total',
'Total number of comments posted on Twits'
);$commentsCounter->set($commentsCount);
// Count the number of likes
$likesCount = Like::count();
$likesCounter = $collectorRegistry->getOrRegisterGauge(
'app',
'likes_total',
'Total number of likes'
);$likesCounter->set($likesCount);
// Count the number of Twit deletions
$twitDeletionsCount = Twit::onlyTrashed()->count();
$twitDeletionsCounter = $collectorRegistry->getOrRegisterGauge(
'app',
'twit_deletions_total',
'Total number of Twit deletions'
);$twitDeletionsCounter->set($twitDeletionsCount);
// Count the number of Twit updates
$twitUpdatesCount = Twit::whereNotNull('updated_at')->count();
$twitUpdatesCounter = $collectorRegistry->getOrRegisterGauge(
'app',
'twit_updates_total',
'Total number of Twit updates'
);$twitUpdatesCounter->set($twitUpdatesCount);
// Count the number of comment deletions
$commentDeletionsCount = Comment::onlyTrashed()->count();
$commentDeletionsCounter = $collectorRegistry->getOrRegisterGauge(
'app',
'comment_deletions_total',
'Total number of comment deletions'
);$commentDeletionsCounter->set($commentDeletionsCount);
// Count the number of comment replies
$commentRepliesCount = Comment::whereNotNull('parent_id')->count();
$commentRepliesCounter = $collectorRegistry->getOrRegisterGauge(
'app',
'comment_replies_total',
'Total number of comment replies'
);$commentRepliesCounter->set($commentRepliesCount);
// Track cache hits and misses
$cacheHits = Cache::get('cache_hits', 0);$cacheMisses = Cache::get('cache_misses', 0);$cacheHitsCounter = $collectorRegistry->getOrRegisterCounter(
'app',
'cache_hits_total',
'Total number of cache hits'
);$cacheHitsCounter->incBy($cacheHits);$cacheMissesCounter = $collectorRegistry->getOrRegisterCounter(
'app',
'cache_misses_total',
'Total number of cache misses'
);$cacheMissesCounter->incBy($cacheMisses);
// $exceptionRate = $this->getExceptionRate();
// $exceptionRateGauge = $collectorRegistry->getOrRegisterGauge(
// 'app',
// 'exception_rate',
// 'Exception rate per minute'
// );
// $exceptionRateGauge->set($exceptionRate);$renderer = new RenderTextFormat();
$result = $renderer->render($collectorRegistry->getMetricFamilySamples());
return response($result, 200)->header('Content-Type', RenderTextFormat::MIME_TYPE);
}
}