Métricas do Arah

Este documento descreve todas as métricas coletadas pelo sistema Arah.

📊 Visão Geral

O Arah utiliza Prometheus para coleta de métricas e OpenTelemetry para instrumentação. As métricas são expostas no endpoint /metrics e podem ser coletadas por Prometheus para visualização em dashboards (Grafana).


🔧 Configuração

Prometheus

As métricas são expostas automaticamente no endpoint /metrics na porta configurada (padrão: 9090).

Configuração (appsettings.json):

{
  "Metrics": {
    "Prometheus": {
      "Port": 9090
    }
  }
}

OpenTelemetry

OpenTelemetry está configurado para coletar:

  • Tracing: HTTP requests, database queries, eventos
  • Metrics: HTTP automáticas, métricas de negócio, métricas de sistema

📈 Métricas de Negócio

Posts Criados

  • Nome: Arah.posts.created
  • Tipo: Counter
  • Unidade: count
  • Descrição: Total de posts criados
  • Tags: territory_id

Exemplo:

Arah.posts.created{territory_id="123e4567-e89b-12d3-a456-426614174000"} 42

Eventos Criados

  • Nome: Arah.events.created
  • Tipo: Counter
  • Unidade: count
  • Descrição: Total de eventos criados
  • Tags: territory_id

Membros Criados

  • Nome: Arah.memberships.created
  • Tipo: Counter
  • Unidade: count
  • Descrição: Total de memberships criados
  • Tags: territory_id

Territórios Criados

  • Nome: Arah.territories.created
  • Tipo: Counter
  • Unidade: count
  • Descrição: Total de territórios criados

Relatórios Criados

  • Nome: Arah.reports.created
  • Tipo: Counter
  • Unidade: count
  • Descrição: Total de relatórios de moderação criados
  • Tags: territory_id

Solicitações de Entrada Criadas

  • Nome: Arah.join_requests.created
  • Tipo: Counter
  • Unidade: count
  • Descrição: Total de solicitações de entrada criadas
  • Tags: territory_id

💾 Métricas de Cache

Cache Hits

  • Nome: Arah.cache.hits
  • Tipo: Counter
  • Unidade: count
  • Descrição: Total de cache hits

Cache Misses

  • Nome: Arah.cache.misses
  • Tipo: Counter
  • Unidade: count
  • Descrição: Total de cache misses

Cálculo de Hit Rate:

hit_rate = Arah.cache.hits / (Arah.cache.hits + Arah.cache.misses)

⚡ Métricas de Concorrência

Conflitos de Concorrência

  • Nome: Arah.concurrency.conflicts
  • Tipo: Counter
  • Unidade: count
  • Descrição: Total de conflitos de concorrência detectados (RowVersion mismatch)

📨 Métricas de Processamento de Eventos

Eventos Processados

  • Nome: Arah.events.processed
  • Tipo: Counter
  • Unidade: count
  • Descrição: Total de eventos processados com sucesso

Eventos Falhados

  • Nome: Arah.events.failed
  • Tipo: Counter
  • Unidade: count
  • Descrição: Total de eventos que falharam após todas as tentativas (moved to dead letter queue)

Duração de Processamento de Eventos

  • Nome: Arah.events.processing.duration
  • Tipo: Histogram
  • Unidade: ms
  • Descrição: Duração do processamento de eventos em milissegundos

🗄️ Métricas de Banco de Dados

Duração de Queries

  • Nome: Arah.database.query.duration
  • Tipo: Histogram
  • Unidade: ms
  • Descrição: Duração de queries do banco de dados em milissegundos

Coletado automaticamente via OpenTelemetry EntityFrameworkCore Instrumentation.


As seguintes métricas são coletadas automaticamente via prometheus-net.AspNetCore:

  • http_requests_received_total: Total de requisições HTTP recebidas
  • http_requests_duration_seconds: Duração de requisições HTTP
  • http_requests_active: Requisições HTTP ativas
  • http_request_size_bytes: Tamanho das requisições HTTP
  • http_response_size_bytes: Tamanho das respostas HTTP

📊 Como Usar

Visualizar Métricas

  1. Endpoint Prometheus: http://localhost:9090/metrics
  2. Grafana: Configure Prometheus como data source e crie dashboards
  3. Application Insights: Se configurado, métricas são enviadas automaticamente
  1. Alta Taxa de Erros: rate(http_requests_received_total{code=~"5.."}[5m]) > 0.05
  2. Alta Latência: histogram_quantile(0.95, http_requests_duration_seconds) > 1
  3. Cache Hit Rate Baixo: rate(Arah.cache.hits[5m]) / (rate(Arah.cache.hits[5m]) + rate(Arah.cache.misses[5m])) < 0.7
  4. Muitos Conflitos de Concorrência: rate(Arah.concurrency.conflicts[5m]) > 10
  5. Eventos Falhando: rate(Arah.events.failed[5m]) > 5