Skip to content

Instantly share code, notes, and snippets.

@nirev
Last active December 21, 2022 15:32
Show Gist options
  • Save nirev/e35c8aa8f5190925bb0917c528d45334 to your computer and use it in GitHub Desktop.
Save nirev/e35c8aa8f5190925bb0917c528d45334 to your computer and use it in GitHub Desktop.
Teste de Programação - Processador de Eventos

Teste de Programação - Backend - XERPA

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!

Processando Eventos

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:

  1. request_duration
  2. request_count
  3. user_signup
  4. 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.

ENTRADA

A entrada será um evento por linha em formatação JSON. Os eventos sempre estão ordenados por timestamp crescente.

SAÍDA

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.

Exemplos de Entrada e Saída:

Entrada de Teste:

{ "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" }

Saída esperada:

{ "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" }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment