Olá! Como parte do processo de seleção da Xerpa, gostaríamos que você fizesse uma pequena tarefa. Você pode fazer o teste com a linguagem que estiver mais confortável. Aqui na Xerpa usamos principalmente Elixir, Erlang e Clojure.
A ideia é olhar como é seu estilo de programação e quais decisões você toma ao resolver um problema. Para isso, crie um projeto no seu Github para podermos acompanhar a árvore de commits!
Sinta-se à vontade para criar em cima do problema abaixo. Caso algo não esteja claro, pode assumir o que for para você, apenas indique suas suposições em documentação. A especificação é bem simples e, portanto, caso queira expandir a solução para algo maior, fique à vontade: por exemplo, pode criar um serviço web e adaptar as entradas e saídas, criar uma interface gráfica, etc.
Qualquer dúvida maior pode nos perguntar, mas no geral, divirta-se!
Numa aplicação rodando em produção, é imprescindível conseguir ter métricas para entender o que está acontecendo. Um jeito de fazer isso é criar eventos da aplicação que representam medições e agregá-los para ter visibilidade.
Você deverá criar um programa que recebe esses eventos e retorna as seguintes métricas para cada tipo de evento, agregadas por minuto:
- Média
- Mediana
- Mínimo
- Máximo
Os tipos de evento são:
- request_duration
- request_count
- user_signup
- user_logged
Os eventos possuem os seguintes campos:
Campo | Conteúdo |
type | Um dos tipos acima |
timestamp | Data da ocorrência |
value | Valor inteiro positivo |
tags | Lista de tags associadas |
Para entrada e saída, o caso mais básico é uma aplicação CLI que recebe um evento por linha até encontrar EOF. A aplicação escreve em STDOUT os valores agregados sempre que possível. Os eventos recebidos são ordenados por timestamp.
A entrada será um evento por linha em formatação JSON. Os eventos sempre estão ordenados por timestamp crescente.
A saída deverá contar uma linha para cada conjunto de agregações feitos. O conjunto de agregações junta todas as métricas de todos os tipos de evento para um intervalo de tempo.
{ "type": "request_duration", "value": 10, "timestamp": "2017-01-03T15:53:01.494821Z", "tags": "company:1,sburbles:barf" }
{ "type": "request_duration", "value": 20, "timestamp": "2017-01-03T15:53:05.494122Z", "tags": "company:2,sburbles:barf" }
{ "type": "request_duration", "value": 30, "timestamp": "2017-01-03T15:53:17.494145Z", "tags": "company:3,sburbles:borf" }
{ "type": "request_duration", "value": 40, "timestamp": "2017-01-03T15:53:42.000000Z", "tags": "company:1,sburbles:borf" }
{ "aggs": [ {"name": "request_duration", "min": 10, "max": 40, "mean": 25, "median": 25 } ], "period_start": "2017-01-03T15:53:00.000000Z", "period_end": "2017-01-03T15:54:00.000000Z" }