Interface web para consulta de indicadores de acessos e publicação das coleções da rede SciELO.
- Dockerfile: define a imagem para produção.
- Dockerfile-dev: define a imagem para desenvolvimento, com ferramentas adicionais e configuração para debug.
- docker-compose.yml: inicia todos os containers necessários para produção.
- docker-compose-dev.yml: inicia todos os containers necessários para desenvolvimento, incluindo Memcached, VPN, etc.
Para testes, é mais prático usar um ambiente virtual Python em vez de containers Docker.
- Instale a dependência de sistema
libmemcached-dev(no Ubuntu/Debian):
sudo apt install libmemcached-dev- Crie um ambiente virtual Python 3.13 (usando miniconda):
conda create -n scl-analytics python=3.13 -y
conda activate scl-analytics- Instale as dependências:
pip install deps/scielojcr-1.3.0-py2.py3-none-any.whl
pip install -r requirements.txt- Execute os testes de unidade:
python -m unittest discover -s tests
⚠️ Observação: fora do Docker, o Memcached deve estar rodando localmente (127.0.0.1:11211). Você pode iniciá-lo com:
docker run -d --name memcached-dev -p 11211:11211 memcached:latestO Analytics integra cinco serviços principais:
- Article Meta: GitHub
- Publication Stats: GitHub
- Access Stats: GitHub
- Bibliometrics: GitHub
- SUSHI API: GitHub
| Serviço | Host/Port | Observações |
|---|---|---|
| Article Meta | articlemeta.scielo.org:11621 | Thrift |
| Publication Stats | publication.scielo.org:11620 | Thrift |
| Access Stats | ratchet.scielo.org:11660 | Thrift |
| Bibliometrics | usa conexão do Article Meta | Thrift |
| SUSHI API | usage.apis.scielo.org | HTTP (não Thrift) |
⚠️ Importante: verifique a conectividade antes de instalar. Exemplo comtelnet:
telnet articlemeta.scielo.org 11621Se conectar, o host tem acesso à porta do serviço.
- Crie o arquivo
development.inia partir do template:
cp development.ini-TEMPLATE development.ini-
Certifique-se de que Memcached está acessível:
- Fora do Docker: use
docker run -d --name memcached-dev -p 11211:11211 memcached:latest - Dentro do Docker Compose: o serviço já estará configurado.
- Fora do Docker: use
-
Construir o container:
docker-compose -f docker-compose-dev.yml build --no-cache- Iniciar o container:
docker-compose -f docker-compose-dev.yml up-
Conectar-se à VPN SciELO (necessário para acessar alguns serviços).
-
Acessar a interface web:
http://0.0.0.0:6543
As rotas AJAX mais pesadas foram preparadas para reduzir latência de primeira carga e proteger o backend em cenários de degradação.
Com MEMCACHED_HOST configurado, o app usa dogpile.cache.pylibmc para cache compartilhado entre workers/instâncias.
Efeito prático:
- A primeira requisição para uma combinação de parâmetros (coleção, período, relatório, métrica etc.) consulta o backend externo.
- Requisições seguintes com a mesma chave servem do cache, inclusive para usuários diferentes.
- Nova consulta externa só ocorre em
cache missou após expiração.
Sem MEMCACHED_HOST, o app cai para dogpile.cache.memory (cache por processo).
No boot da aplicação, um prewarm assíncrono prepara dados base de coleção e agregações críticas da home.
Variáveis:
ENABLE_CACHE_PREWARM(default:1)PREWARM_DELAY_SECONDS(default:0)PREWARM_COLLECTION(default:scl)
Quando backend externo está lento/indisponível, endpoints críticos retornam payload válido vazio em tempo limitado, evitando travamento da home.
Variáveis:
BACKEND_TIMEOUT_SECONDS(default:8)PUBLICATION_AFFILIATIONS_TIMEOUT_SECONDS(default:4)PUBLICATION_AFFILIATIONS_TIMEOUT_POOL_SIZE(default:8)PUBLICATION_AFFILIATIONS_MAX_INFLIGHT(default: valor dePUBLICATION_AFFILIATIONS_TIMEOUT_POOL_SIZE)USAGE_REPORT_TIMEOUT_SECONDS(default:4)USAGE_YEARLY_TIMEOUT_SECONDS(default: usa valor deUSAGE_REPORT_TIMEOUT_SECONDS)USAGE_TIMEOUT_POOL_SIZE(default:8)USAGE_TIMEOUT_MAX_INFLIGHT(default: valor deUSAGE_TIMEOUT_POOL_SIZE)
Detalhes de comportamento:
- Endpoints de usage usam fallback de período por sessão (
range_start/range_end) quando os parâmetros não são enviados. - Os pools são isolados por backend (
usageepublication) para evitar contenção cruzada. - O limite de inflight aplica backpressure: quando saturado, retorna fallback sem disparar nova chamada de backend.
- Em timeout, a requisição em background recebe
cancel()(best effort), mantendo o retorno rápido ao usuário.
As chamadas para usage.apis.scielo.org usam circuit breaker para reduzir efeito cascata em falhas repetidas.
Variáveis:
USAGE_CIRCUIT_BREAKER_HOST(default:usage.apis.scielo.org)USAGE_CIRCUIT_BREAKER_FAILURE_THRESHOLD(default:3)USAGE_CIRCUIT_BREAKER_OPEN_SECONDS(default:90)
MEMCACHED_HOST=memcached:11211
MEMCACHED_EXPIRATION_TIME=2592000
ENABLE_CACHE_PREWARM=1
PREWARM_COLLECTION=scl
PREWARM_DELAY_SECONDS=2
BACKEND_TIMEOUT_SECONDS=8
PUBLICATION_AFFILIATIONS_TIMEOUT_SECONDS=4
PUBLICATION_AFFILIATIONS_TIMEOUT_POOL_SIZE=8
PUBLICATION_AFFILIATIONS_MAX_INFLIGHT=8
USAGE_REPORT_TIMEOUT_SECONDS=4
USAGE_YEARLY_TIMEOUT_SECONDS=4
USAGE_TIMEOUT_POOL_SIZE=8
USAGE_TIMEOUT_MAX_INFLIGHT=8
USAGE_CIRCUIT_BREAKER_HOST=usage.apis.scielo.org
USAGE_CIRCUIT_BREAKER_FAILURE_THRESHOLD=3
USAGE_CIRCUIT_BREAKER_OPEN_SECONDS=90Sempre que fizer alterações:
- Construir o container (
docker-compose build --no-cache) - Iniciar o container (
docker-compose up) - Conectar à VPN SciELO
- Acessar a interface web (
http://0.0.0.0:6543)
⚠️ Para desenvolvimento local fora do Docker, lembre-se de iniciar o Memcached local (127.0.0.1:11211) antes de rodar opserve.
Para adicionar ou atualizar strings de tradução, siga os passos abaixo.
Nos templates Mako (.mako), envolva as strings com ${_(u'texto para traduzir')}. Em arquivos Python (.py), use _('texto para traduzir') após importar o tradutor.
Execute o comando abaixo na raiz do projeto para extrair as strings marcadas para um arquivo de modelo (.pot):
python setup.py extract_messagesAtualize os arquivos de tradução (.po) de cada idioma com as novas strings do arquivo de modelo:
python setup.py update_catalogEdite os arquivos .po em analytics/locale/<idioma>/LC_MESSAGES/analytics.po e adicione as traduções para as strings com msgstr "".
Compile os arquivos .po para o formato binário (.mo), que é usado pela aplicação:
python setup.py compile_catalog