Backend logging: - Centralized JSON logging config with LOG_LEVEL env var - Request logging middleware: user, method, path, status, duration, request_id - Fixed all 9 silent except:pass blocks to log warnings with tracebacks - Celery workers use same structured JSON format Infrastructure: - Loki 3.3.2 for log storage (30-day retention) - Promtail 3.3.2 for Docker container log shipping - Grafana 10.3.1 with auto-provisioned Loki datasource - Grafana on port 3002 (admin/pedshub_grafana) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
48 lines
1.4 KiB
YAML
48 lines
1.4 KiB
YAML
server:
|
|
http_listen_port: 9080
|
|
grpc_listen_port: 0
|
|
|
|
positions:
|
|
filename: /positions/positions.yaml
|
|
|
|
clients:
|
|
- url: http://loki:3100/loki/api/v1/push
|
|
|
|
scrape_configs:
|
|
- job_name: docker
|
|
docker_sd_configs:
|
|
- host: unix:///var/run/docker.sock
|
|
refresh_interval: 5s
|
|
relabel_configs:
|
|
# Keep only quiz-* containers
|
|
- source_labels: ['__meta_docker_container_name']
|
|
regex: '.*quiz.*'
|
|
action: keep
|
|
# Extract container name as label
|
|
- source_labels: ['__meta_docker_container_name']
|
|
regex: '/?(.*)'
|
|
target_label: container
|
|
# Extract compose service name
|
|
- source_labels: ['__meta_docker_container_label_com_docker_compose_service']
|
|
target_label: service
|
|
pipeline_stages:
|
|
# Docker JSON log wrapper
|
|
- docker: {}
|
|
# Try to parse structured JSON logs from backend/celery
|
|
- match:
|
|
selector: '{service=~"backend|celery"}'
|
|
stages:
|
|
- json:
|
|
expressions:
|
|
level: levelname
|
|
logger: name
|
|
msg: message
|
|
request_id: request_id
|
|
method: method
|
|
path: path
|
|
status: status
|
|
duration_ms: duration_ms
|
|
user: user
|
|
- labels:
|
|
level:
|
|
logger:
|