Манитон Docs

Мониторинг и наблюдаемость

Как мы следим за здоровьем платформы

Мониторинг и наблюдаемость

Для обеспечения надежности финансовой платформы мы используем комплексный подход к мониторингу.

Стек технологий

  • Prometheus: Сбор и хранение метрик.
  • Grafana: Визуализация данных и дашборды.
  • Loki: Централизованный сбор логов.
  • Jaeger: Распределенная трассировка запросов (Distributed Tracing).

Ключевые метрики

1. Инфраструктурные

  • Загрузка CPU/Memory по сервисам.
  • Состояние Kafka (consumer lag, throughput).
  • Статус узлов Besu (block height, peer count).

2. Бизнес-метрики

  • Количество успешных выпусков ЦФА.
  • Объем торгов в 24ч.
  • Время обработки платежа (latency).
  • Количество активных пользователей.

Логирование

Все логи микросервисов пишутся в формате JSON и включают:

  • trace_id / correlation_id
  • user_id
  • service_name
  • level (INFO, WARN, ERROR)

Это позволяет быстро находить причину сбоя в распределенной системе.

Дашборды

System Overview

Общий обзор состояния системы.

Панели:

  • System Health Score
  • Services Status
  • Resource Usage
  • Request Metrics
  • Error Rate
  • Latency (P50, P95, P99)

Services Health

Здоровье всех сервисов платформы.

Панели:

  • Auth Service
  • CFA Core Service
  • Ledger Service
  • Besu Connector
  • Payments Service
  • Market Service

Kafka Metrics

Метрики Kafka.

Панели:

  • Messages per second
  • Consumer lag
  • Broker health
  • Topic throughput

Database Performance

Производительность баз данных.

Панели:

  • Connection pool usage
  • Query latency
  • Slow queries
  • Lock contention

Blockchain Metrics

Метрики блокчейна.

Панели:

  • Block time
  • Transaction throughput
  • Gas usage
  • Validator health

Business Metrics

Бизнес-метрики платформы.

Панели:

  • Active users
  • Transactions per day
  • Trading volume
  • CFA-RUB supply

Алерты

High Error Rate

- alert: HighErrorRate
  expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.05
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: 'High error rate detected'

High Latency

- alert: HighLatency
  expr: histogram_quantile(0.95, http_request_duration_seconds_bucket) > 1
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: 'High latency detected'

Service Down

- alert: ServiceDown
  expr: up{job=~".*-service"} == 0
  for: 1m
  labels:
    severity: critical
  annotations:
    summary: 'Service is down'

Database Connection Pool High

- alert: DatabaseConnectionPoolHigh
  expr: pg_stat_activity_count / pg_settings_max_connections > 0.8
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: 'Database connection pool high'

Kafka Consumer Lag

- alert: KafkaConsumerLagHigh
  expr: kafka_consumer_lag > 1000
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: 'Kafka consumer lag is high'

Трейсинг

OpenTelemetry

import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
import { JaegerExporter } from '@opentelemetry/exporter-jaeger';

const provider = new NodeTracerProvider();
const exporter = new JaegerExporter({
  endpoint: 'http://jaeger:14268/api/traces',
});

provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
provider.register();

Интеграции

Slack

import axios from 'axios';

export async function sendSlackAlert(message: string, severity: 'info' | 'warning' | 'critical') {
  const webhookUrl = process.env.SLACK_WEBHOOK_URL;

  const colors = {
    info: '#36a64f',
    warning: '#ff9900',
    critical: '#ff0000',
  };

  await axios.post(webhookUrl, {
    attachments: [
      {
        color: colors[severity],
        text: message,
        ts: Math.floor(Date.now() / 1000),
      },
    ],
  });
}

PagerDuty

export async function sendPagerDutyAlert(
  summary: string,
  severity: 'critical' | 'error' | 'warning',
) {
  const apiKey = process.env.PAGERDUTY_API_KEY;

  await axios.post('https://events.pagerduty.com/v2/enqueue', {
    routing_key: apiKey,
    event_action: 'trigger',
    payload: {
      summary,
      severity,
      source: 'Maniton Platform',
      custom_details: {
        timestamp: new Date().toISOString(),
      },
    },
  });
}

Troubleshooting

Проблема: Метрики не собираются

Решение:

# Проверка endpoint
curl http://localhost:3001/metrics

# Проверка Prometheus конфигурации
kubectl get configmap prometheus -o yaml

# Перезапуск Prometheus
kubectl rollout restart deployment prometheus

Проблема: Алерты не отправляются

Решение:

# Проверка Alertmanager
curl http://localhost:9093/-/healthy

# Проверка webhook
curl -X POST https://hooks.slack.com/services/... -d '{"text":"test"}'

# Проверка конфигурации
kubectl get configmap alertmanager -o yaml

Проблема: Логи не отображаются

Решение:

# Проверка Loki
curl http://localhost:3100/ready

# Поиск логов
curl -G 'http://localhost:3100/loki/api/v1/query_range' \
  --data-urlencode 'query={job="auth-service"}' \
  --data-urlencode 'start=2024-01-01T00:00:00Z' \
  --data-urlencode 'end=2024-01-01T23:59:59Z'

Дополнительные ресурсы

On this page