Este projeto implementa uma API FHIR para educação em enfermagem com sistema completo de observabilidade usando Grafana, Loki, Prometheus, Promtail e Jaeger.
-
API FHIR (FastAPI)
- Endpoints para casos clínicos, sessões de aprendizagem e avaliações
- Integração com IA para análise clínica
- Métricas customizadas para educação em enfermagem
-
Stack de Observabilidade
- Prometheus: Coleta de métricas
- Grafana: Dashboards e visualizações
- Loki: Agregação de logs
- Promtail: Coleta de logs
- Jaeger: Tracing distribuído
- AlertManager: Sistema de alertas
- Docker e Docker Compose instalados
- Python 3.8+ (para desenvolvimento)
- Portas disponíveis: 3000, 8000, 9090, 3100, 14268, 16686
cd observability
docker-compose up -d# Status dos containers
docker-compose ps
# Logs dos serviços
docker-compose logs -f grafana
docker-compose logs -f prometheus# Em outro terminal
cd ../fhir-nursing-api
python main.py| Serviço | URL | Descrição |
|---|---|---|
| API FHIR | http://localhost:8000 | API principal |
| Grafana | http://localhost:3000 | Dashboards (admin/admin) |
| Prometheus | http://localhost:9090 | Métricas e targets |
| Jaeger UI | http://localhost:16686 | Tracing distribuído |
| AlertManager | http://localhost:9093 | Gerenciar alertas |
- Métricas gerais da API
- Requisições por endpoint
- Latência e erros
- Casos clínicos ativos
- Scores por competência
- Progresso dos estudantes
- Análise de sessões de aprendizagem
- Performance da IA
- Acesse http://localhost:3000 (admin/admin)
- Vá para "+" → "Import"
- Cole o JSON dos dashboards (já configurados nos arquivos)
# Casos clínicos
fhir_metrics.clinical_cases_total
fhir_metrics.clinical_cases_created_total
# Sessões de aprendizagem
fhir_metrics.learning_sessions_active
fhir_metrics.learning_session_duration
# Competências
fhir_metrics.competency_scores
fhir_metrics.assessments_total
# IA
fhir_metrics.ai_inference_duration
fhir_metrics.ai_inferences_total# HTTP
fhir_metrics.http_requests_total
fhir_metrics.http_request_duration
# Ações dos estudantes
fhir_metrics.student_actions_total
fhir_metrics.student_action_duration- Requisições HTTP
- Operações de banco de dados
- Inferência de IA
- Avaliações de competência
- Acesse http://localhost:16686
- Procure por service "fhir-nursing-api"
- Analise latência e dependências
{
"timestamp": "2023-12-01T10:30:00Z",
"level": "INFO",
"message": "Learning session started",
"student_id": "student_123",
"session_id": "session_456",
"clinical_case_id": "case_001",
"trace_id": "abc123",
"event_type": "learning_session"
}learning_session: Início/fim de sessõesstudent_action: Ações dos estudantesai_inference: Processamento de IAcompetency_assessment: Avaliaçõesapi_request: Requisições HTTPsystem_event: Eventos do sistema
- Alta latência da API (>2s por 5min)
- Taxa de erro HTTP (>10% por 5min)
- Tempo de inferência IA (>10s por 5min)
- CPU alto (>80% por 10min)
- Memória alta (>80% por 10min)
- Espaço em disco (<10% disponível)
- Baixo score médio (<0.7 por 30min)
- Muitas sessões falhas (>5 por hora)
curl http://localhost:8000/healthcurl http://localhost:8000/metrics# Listar casos
curl http://localhost:8000/api/v1/clinical-cases
# Obter caso específico
curl http://localhost:8000/api/v1/clinical-cases/case_001curl -X POST http://localhost:8000/api/v1/learning-sessions \
-H "Content-Type: application/json" \
-d '{
"student_id": "student_123",
"clinical_case_id": "case_001"
}'curl -X POST http://localhost:8000/api/v1/student-actions \
-H "Content-Type: application/json" \
-d '{
"student_id": "student_123",
"session_id": "session_id_aqui",
"action_type": "assessment",
"node_name": "vital_signs",
"action_data": {"heart_rate": 80}
}'fhir-nursing-api/
├── main.py # Servidor principal
├── app/
│ └── monitoring/
│ ├── metrics.py # Métricas Prometheus
│ ├── logging.py # Logging estruturado
│ └── tracing.py # Tracing distribuído
├── observability/
│ ├── docker-compose.yml # Stack observabilidade
│ ├── prometheus.yml # Config Prometheus
│ ├── alert_rules.yml # Regras de alerta
│ ├── grafana/dashboards/ # Dashboards Grafana
│ └── loki-config.yaml # Config Loki
└── logs/ # Arquivos de log
# API
export API_HOST=0.0.0.0
export API_PORT=8000
export LOG_LEVEL=INFO
# Tracing
export JAEGER_ENDPOINT=http://localhost:14268/api/traces
export OTEL_SERVICE_NAME=fhir-nursing-api
# Métricas
export METRICS_ENABLED=true
export PROMETHEUS_PORT=9090# Verificar logs
docker-compose logs nome_do_servico
# Verificar portas
netstat -tulpn | grep :3000# Verificar targets no Prometheus
# http://localhost:9090/targets
# Verificar endpoint de métricas da API
curl http://localhost:8000/metrics# Verificar data sources
# http://localhost:3000/datasources
# Verificar se API está enviando métricas
curl http://localhost:8000/health# Verificar Promtail
docker-compose logs promtail
# Verificar arquivos de log
ls -la logs/- Docker Compose rodando
- Todos os containers healthy
- API respondendo no /health
- Métricas disponíveis no /metrics
- Grafana acessível (admin/admin)
- Dashboards importados
- Prometheus coletando métricas
- Jaeger recebendo traces
- Alertas configurados
- Logs sendo coletados
- Autenticação: Adicionar OAuth2/JWT
- Banco de Dados: Migrar para PostgreSQL/MongoDB
- IA Real: Integrar Ollama/OpenAI
- CI/CD: GitHub Actions para deploy
- Backup: Estratégia de backup dos dados
- Scaling: Múltiplas instâncias da API
- Segurança: HTTPS, rate limiting, validação
Para problemas ou dúvidas:
- Verificar logs da aplicação
- Consultar métricas no Grafana
- Analisar traces no Jaeger
- Revisar alertas no AlertManager