├── Capitulo 1 └── Cliente-REST │ ├── .gitignore │ ├── pom.xml │ └── src │ └── main │ ├── java │ └── br │ │ └── com │ │ └── alexandreesl │ │ └── handson │ │ ├── Application.java │ │ ├── ApplicationConfig.java │ │ ├── domain │ │ └── Cliente.java │ │ └── rest │ │ └── ClienteRestService.java │ └── resources │ └── log4j2.xml ├── Capitulo 2 ├── Pedido-REST │ ├── .gitignore │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── br │ │ │ └── com │ │ │ └── alexandreesl │ │ │ └── handson │ │ │ ├── Application.java │ │ │ ├── ApplicationConfig.java │ │ │ ├── domain │ │ │ ├── ItemPedido.java │ │ │ ├── Pedido.java │ │ │ └── StatusPedido.java │ │ │ ├── dto │ │ │ └── ItemPedidoDTO.java │ │ │ └── rest │ │ │ └── PedidoRestService.java │ │ └── resources │ │ ├── application.properties │ │ └── log4j2.xml └── meupipeline.conf ├── Capitulo 3 ├── ScriptTestesClientes.jmx ├── ScriptTestesPedidos.jmx └── meupipeline.conf ├── Capitulo 5 └── Dockerfile ├── Capitulo 6 ├── comandoselasticsearch.txt └── twitterpipeline.conf └── README.md /Capitulo 1/Cliente-REST/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /Capitulo 1/Cliente-REST/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | br.com.alexandreesl.handson 5 | Cliente-REST 6 | 1.0 7 | jar 8 | 9 | 10 | org.springframework.boot 11 | spring-boot-starter-parent 12 | 1.2.0.RELEASE 13 | 14 | 15 | 16 | 17 | org.springframework.boot 18 | spring-boot-starter-web 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-starter-logging 23 | 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-log4j2 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-jersey 35 | 36 | 37 | 38 | org.slf4j 39 | jcl-over-slf4j 40 | 41 | 42 | org.slf4j 43 | jul-to-slf4j 44 | 45 | 46 | org.slf4j 47 | log4j-over-slf4j 48 | 49 | 50 | 51 | biz.paluch.logging 52 | logstash-gelf 53 | 1.7.0 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /Capitulo 1/Cliente-REST/src/main/java/br/com/alexandreesl/handson/Application.java: -------------------------------------------------------------------------------- 1 | package br.com.alexandreesl.handson; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | public static void main(String[] args) { 9 | SpringApplication.run(Application.class, args); 10 | } 11 | } -------------------------------------------------------------------------------- /Capitulo 1/Cliente-REST/src/main/java/br/com/alexandreesl/handson/ApplicationConfig.java: -------------------------------------------------------------------------------- 1 | package br.com.alexandreesl.handson; 2 | 3 | import javax.inject.Named; 4 | 5 | import org.glassfish.jersey.server.ResourceConfig; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class ApplicationConfig { 10 | 11 | @Named 12 | static class JerseyConfig extends ResourceConfig { 13 | public JerseyConfig() { 14 | this.packages("br.com.alexandreesl.handson.rest"); 15 | } 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /Capitulo 1/Cliente-REST/src/main/java/br/com/alexandreesl/handson/domain/Cliente.java: -------------------------------------------------------------------------------- 1 | package br.com.alexandreesl.handson.domain; 2 | 3 | public class Cliente { 4 | 5 | private long id; 6 | 7 | private String nome; 8 | 9 | private String email; 10 | 11 | public long getId() { 12 | return id; 13 | } 14 | 15 | public void setId(long id) { 16 | this.id = id; 17 | } 18 | 19 | public String getNome() { 20 | return nome; 21 | } 22 | 23 | public void setNome(String nome) { 24 | this.nome = nome; 25 | } 26 | 27 | public String getEmail() { 28 | return email; 29 | } 30 | 31 | public void setEmail(String email) { 32 | this.email = email; 33 | } 34 | 35 | @Override 36 | public boolean equals(Object obj) { 37 | 38 | Cliente cliente = (Cliente) obj; 39 | 40 | return id == cliente.getId() ? true : false; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /Capitulo 1/Cliente-REST/src/main/java/br/com/alexandreesl/handson/rest/ClienteRestService.java: -------------------------------------------------------------------------------- 1 | package br.com.alexandreesl.handson.rest; 2 | 3 | import java.util.Collection; 4 | import java.util.HashMap; 5 | import java.util.Map; 6 | 7 | import javax.inject.Named; 8 | import javax.ws.rs.Consumes; 9 | import javax.ws.rs.DELETE; 10 | import javax.ws.rs.GET; 11 | import javax.ws.rs.POST; 12 | import javax.ws.rs.PUT; 13 | import javax.ws.rs.Path; 14 | import javax.ws.rs.Produces; 15 | import javax.ws.rs.QueryParam; 16 | import javax.ws.rs.core.MediaType; 17 | 18 | import org.apache.logging.log4j.LogManager; 19 | import org.apache.logging.log4j.Logger; 20 | 21 | import br.com.alexandreesl.handson.domain.Cliente; 22 | 23 | @Named 24 | @Path("/") 25 | public class ClienteRestService { 26 | 27 | private static final Logger logger = LogManager.getLogger(ClienteRestService.class.getName()); 28 | 29 | private static Map clientes = new HashMap(); 30 | 31 | private static long contadorErroCaotico; 32 | 33 | static { 34 | 35 | Cliente cliente1 = new Cliente(); 36 | cliente1.setId(1); 37 | cliente1.setNome("Cliente 1"); 38 | cliente1.setEmail("customer1@gmail.com"); 39 | 40 | Cliente cliente2 = new Cliente(); 41 | cliente2.setId(2); 42 | cliente2.setNome("Cliente 2"); 43 | cliente2.setEmail("customer2@gmail.com"); 44 | 45 | Cliente cliente3 = new Cliente(); 46 | cliente3.setId(3); 47 | cliente3.setNome("Cliente 3"); 48 | cliente3.setEmail("customer3@gmail.com"); 49 | 50 | Cliente cliente4 = new Cliente(); 51 | cliente4.setId(4); 52 | cliente4.setNome("Cliente 4"); 53 | cliente4.setEmail("customer4@gmail.com"); 54 | 55 | Cliente cliente5 = new Cliente(); 56 | cliente5.setId(5); 57 | cliente5.setNome("Cliente 5"); 58 | cliente5.setEmail("customer5@gmail.com"); 59 | 60 | clientes.put(cliente1.getId(), cliente1); 61 | clientes.put(cliente2.getId(), cliente2); 62 | clientes.put(cliente3.getId(), cliente3); 63 | clientes.put(cliente4.getId(), cliente4); 64 | clientes.put(cliente5.getId(), cliente5); 65 | 66 | } 67 | 68 | @GET 69 | @Produces(MediaType.APPLICATION_JSON) 70 | public Collection getClientes() { 71 | 72 | logger.info("Foram buscados " + clientes.values().size() + " clientes"); 73 | 74 | return clientes.values(); 75 | } 76 | 77 | @GET 78 | @Path("cliente") 79 | @Produces(MediaType.APPLICATION_JSON) 80 | public Cliente getCliente(@QueryParam("id") long id) { 81 | 82 | Cliente cli = null; 83 | 84 | for (Cliente c : clientes.values()) { 85 | 86 | if (c.getId() == id) 87 | cli = c; 88 | 89 | } 90 | 91 | logger.info("foi buscado o cliente " + cli.getNome()); 92 | 93 | return cli; 94 | } 95 | 96 | @POST 97 | @Consumes(MediaType.APPLICATION_JSON) 98 | public void addCliente(Cliente cliente) { 99 | 100 | logger.warn("O cliente " + cliente.getId() + " foi inserido!"); 101 | 102 | clientes.put(cliente.getId(), cliente); 103 | 104 | } 105 | 106 | @PUT 107 | @Consumes(MediaType.APPLICATION_JSON) 108 | public void mergeCliente(Cliente cliente) { 109 | 110 | contadorErroCaotico++; 111 | 112 | if ((contadorErroCaotico) % 7 == 0) { 113 | throw new RuntimeException("Ocorreu um erro caótico!"); 114 | } 115 | 116 | 117 | logger.info("O cliente " + cliente.getId() + " foi alterado!"); 118 | 119 | Cliente temp = clientes.get(cliente.getId()); 120 | 121 | temp.setNome(cliente.getNome()); 122 | temp.setEmail(cliente.getEmail()); 123 | 124 | } 125 | 126 | @DELETE 127 | public void deleteCliente(@QueryParam("id") long id) { 128 | 129 | logger.info("O cliente " + id + " foi excluido!"); 130 | 131 | clientes.remove(id); 132 | } 133 | 134 | } 135 | -------------------------------------------------------------------------------- /Capitulo 1/Cliente-REST/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Capitulo 2/Pedido-REST/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /Capitulo 2/Pedido-REST/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | br.com.alexandreesl.handson 5 | Pedido-REST 6 | 1.0 7 | jar 8 | 9 | 10 | org.springframework.boot 11 | spring-boot-starter-parent 12 | 1.2.0.RELEASE 13 | 14 | 15 | 16 | 17 | org.springframework.boot 18 | spring-boot-starter-web 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-starter-logging 23 | 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-log4j2 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-jersey 35 | 36 | 37 | 38 | 39 | org.slf4j 40 | jcl-over-slf4j 41 | 42 | 43 | org.slf4j 44 | jul-to-slf4j 45 | 46 | 47 | org.slf4j 48 | log4j-over-slf4j 49 | 50 | 51 | 52 | biz.paluch.logging 53 | logstash-gelf 54 | 1.7.0 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /Capitulo 2/Pedido-REST/src/main/java/br/com/alexandreesl/handson/Application.java: -------------------------------------------------------------------------------- 1 | package br.com.alexandreesl.handson; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | public static void main(String[] args) { 9 | SpringApplication.run(Application.class, args); 10 | } 11 | } -------------------------------------------------------------------------------- /Capitulo 2/Pedido-REST/src/main/java/br/com/alexandreesl/handson/ApplicationConfig.java: -------------------------------------------------------------------------------- 1 | package br.com.alexandreesl.handson; 2 | 3 | import javax.inject.Named; 4 | 5 | import org.glassfish.jersey.server.ResourceConfig; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.web.client.RestTemplate; 9 | 10 | @Configuration 11 | public class ApplicationConfig { 12 | 13 | @Named 14 | static class JerseyConfig extends ResourceConfig { 15 | public JerseyConfig() { 16 | this.packages("br.com.alexandreesl.handson.rest"); 17 | } 18 | } 19 | 20 | @Bean 21 | public RestTemplate restTemplate() { 22 | RestTemplate restTemplate = new RestTemplate(); 23 | 24 | return restTemplate; 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /Capitulo 2/Pedido-REST/src/main/java/br/com/alexandreesl/handson/domain/ItemPedido.java: -------------------------------------------------------------------------------- 1 | package br.com.alexandreesl.handson.domain; 2 | 3 | public class ItemPedido { 4 | 5 | private long idProduto; 6 | 7 | private long quantidade; 8 | 9 | public long getIdProduto() { 10 | return idProduto; 11 | } 12 | 13 | public void setIdProduto(long idProduto) { 14 | this.idProduto = idProduto; 15 | } 16 | 17 | public long getQuantidade() { 18 | return quantidade; 19 | } 20 | 21 | public void setQuantidade(long quantidade) { 22 | this.quantidade = quantidade; 23 | } 24 | 25 | @Override 26 | public boolean equals(Object obj) { 27 | 28 | ItemPedido item = (ItemPedido) obj; 29 | 30 | return idProduto == item.getIdProduto() ? true : false; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /Capitulo 2/Pedido-REST/src/main/java/br/com/alexandreesl/handson/domain/Pedido.java: -------------------------------------------------------------------------------- 1 | package br.com.alexandreesl.handson.domain; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Date; 5 | import java.util.List; 6 | 7 | public class Pedido { 8 | 9 | private long id; 10 | 11 | private Date dataPedido; 12 | 13 | private long idCliente; 14 | 15 | private List items; 16 | 17 | private StatusPedido status; 18 | 19 | public StatusPedido getStatus() { 20 | return status; 21 | } 22 | 23 | public void setStatus(StatusPedido status) { 24 | this.status = status; 25 | } 26 | 27 | public long getId() { 28 | return id; 29 | } 30 | 31 | public void setId(long id) { 32 | this.id = id; 33 | } 34 | 35 | public Date getDataPedido() { 36 | return dataPedido; 37 | } 38 | 39 | public void setDataPedido(Date dataPedido) { 40 | this.dataPedido = dataPedido; 41 | } 42 | 43 | public long getIdCliente() { 44 | return idCliente; 45 | } 46 | 47 | public void setIdCliente(long idCliente) { 48 | this.idCliente = idCliente; 49 | } 50 | 51 | public List getItems() { 52 | 53 | if (items == null) { 54 | items = new ArrayList(); 55 | } 56 | 57 | return items; 58 | } 59 | 60 | public void setItems(List items) { 61 | this.items = items; 62 | } 63 | 64 | @Override 65 | public boolean equals(Object obj) { 66 | 67 | Pedido pedido = (Pedido) obj; 68 | 69 | return id == pedido.getId() ? true : false; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Capitulo 2/Pedido-REST/src/main/java/br/com/alexandreesl/handson/domain/StatusPedido.java: -------------------------------------------------------------------------------- 1 | package br.com.alexandreesl.handson.domain; 2 | 3 | public enum StatusPedido { 4 | 5 | ABERTO("ABERTO"), CONCLUIDO("CONCLUIDO"), CANCELADO("CANCELADO"); 6 | 7 | private final String status; 8 | 9 | private StatusPedido(String statusPedido) { 10 | status = statusPedido; 11 | } 12 | 13 | public String toString() { 14 | return this.status; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Capitulo 2/Pedido-REST/src/main/java/br/com/alexandreesl/handson/dto/ItemPedidoDTO.java: -------------------------------------------------------------------------------- 1 | package br.com.alexandreesl.handson.dto; 2 | 3 | import br.com.alexandreesl.handson.domain.ItemPedido; 4 | 5 | public class ItemPedidoDTO { 6 | 7 | private long idPedido; 8 | 9 | private long idCliente; 10 | 11 | private ItemPedido item; 12 | 13 | public long getIdCliente() { 14 | return idCliente; 15 | } 16 | 17 | public void setIdCliente(long idCliente) { 18 | this.idCliente = idCliente; 19 | } 20 | 21 | public long getIdPedido() { 22 | return idPedido; 23 | } 24 | 25 | public void setIdPedido(long idPedido) { 26 | this.idPedido = idPedido; 27 | } 28 | 29 | public ItemPedido getItem() { 30 | return item; 31 | } 32 | 33 | public void setItem(ItemPedido item) { 34 | this.item = item; 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /Capitulo 2/Pedido-REST/src/main/java/br/com/alexandreesl/handson/rest/PedidoRestService.java: -------------------------------------------------------------------------------- 1 | package br.com.alexandreesl.handson.rest; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Date; 5 | import java.util.List; 6 | 7 | import javax.inject.Named; 8 | import javax.ws.rs.Consumes; 9 | import javax.ws.rs.DELETE; 10 | import javax.ws.rs.GET; 11 | import javax.ws.rs.POST; 12 | import javax.ws.rs.PUT; 13 | import javax.ws.rs.Path; 14 | import javax.ws.rs.PathParam; 15 | import javax.ws.rs.Produces; 16 | import javax.ws.rs.core.MediaType; 17 | 18 | import org.apache.logging.log4j.LogManager; 19 | import org.apache.logging.log4j.Logger; 20 | 21 | import br.com.alexandreesl.handson.domain.Pedido; 22 | import br.com.alexandreesl.handson.domain.StatusPedido; 23 | import br.com.alexandreesl.handson.dto.ItemPedidoDTO; 24 | 25 | @Named 26 | @Path("/") 27 | public class PedidoRestService { 28 | 29 | private static List pedidosMock = new ArrayList(); 30 | 31 | private static final Logger logger = LogManager.getLogger(PedidoRestService.class.getName()); 32 | 33 | private static long contadorErroCaotico; 34 | 35 | @GET 36 | @Produces(MediaType.APPLICATION_JSON) 37 | public List buscarPedidos() { 38 | 39 | logger.info("foram buscados todos os pedidos!"); 40 | 41 | return pedidosMock; 42 | 43 | } 44 | 45 | @GET 46 | @Path("pedido/{idCliente}") 47 | @Produces(MediaType.APPLICATION_JSON) 48 | public List buscarPedidosPorCliente(@PathParam("idCliente") long idCliente) { 49 | 50 | List pedidos = new ArrayList(); 51 | 52 | for (Pedido pedido : pedidosMock) { 53 | 54 | if (pedido.getIdCliente() == idCliente) 55 | pedidos.add(pedido); 56 | } 57 | 58 | logger.info("cliente " + idCliente + " possui " + pedidos.size() + " pedidos"); 59 | 60 | return pedidos; 61 | 62 | } 63 | 64 | @POST 65 | @Path("item/adiciona") 66 | @Consumes(MediaType.APPLICATION_JSON) 67 | public void adicionaItemPedido(ItemPedidoDTO item) { 68 | 69 | contadorErroCaotico++; 70 | 71 | if ((contadorErroCaotico) % 7 == 0) { 72 | throw new RuntimeException("Ocorreu um erro caótico!"); 73 | } 74 | 75 | // se for pedido novo, cria, senao somente adiciona o item 76 | 77 | long idCliente = 0; 78 | 79 | boolean pedidoNovo = true; 80 | 81 | for (Pedido pedido : pedidosMock) { 82 | 83 | if (pedido.getId() == item.getIdPedido()) { 84 | pedido.getItems().add(item.getItem()); 85 | 86 | idCliente = pedido.getIdCliente(); 87 | 88 | pedidoNovo = false; 89 | } 90 | 91 | } 92 | 93 | if (pedidoNovo) { 94 | Pedido pedido = new Pedido(); 95 | 96 | idCliente = item.getIdCliente(); 97 | pedido.setId(item.getIdPedido()); 98 | pedido.setDataPedido(new Date()); 99 | pedido.setIdCliente(item.getIdCliente()); 100 | pedido.getItems().add(item.getItem()); 101 | pedido.setStatus(StatusPedido.ABERTO); 102 | 103 | pedidosMock.add(pedido); 104 | 105 | } 106 | 107 | logger.info("pedido " + item.getIdPedido() + " do cliente " + idCliente + " adicionou o produto " 108 | + item.getItem().getIdProduto()); 109 | 110 | } 111 | 112 | @POST 113 | @Path("item/remove") 114 | @Consumes(MediaType.APPLICATION_JSON) 115 | public void removeItemPedido(ItemPedidoDTO item) { 116 | 117 | long idCliente = 0; 118 | 119 | for (Pedido pedido : pedidosMock) { 120 | 121 | if (pedido.getId() == item.getIdPedido()) { 122 | 123 | pedido.getItems().remove(item.getItem()); 124 | 125 | idCliente = pedido.getIdCliente(); 126 | 127 | } 128 | 129 | } 130 | 131 | logger.info("pedido " + item.getIdPedido() + " do cliente " + idCliente + " removeu o produto " 132 | + item.getItem().getIdProduto()); 133 | 134 | } 135 | 136 | @PUT 137 | @Path("pedido/{idPedido}") 138 | public void pagaPedido(@PathParam("idPedido") long idPedido) { 139 | 140 | for (Pedido pedido : pedidosMock) { 141 | 142 | if (pedido.getId() == idPedido) { 143 | 144 | pedido.setStatus(StatusPedido.CONCLUIDO); 145 | 146 | } 147 | 148 | } 149 | 150 | logger.info("pedido " + idPedido + " efetivado"); 151 | 152 | } 153 | 154 | @DELETE 155 | @Path("pedido/{idPedido}") 156 | public void cancelaPedido(@PathParam("idPedido") long idPedido) { 157 | 158 | for (Pedido pedido : pedidosMock) { 159 | 160 | if (pedido.getId() == idPedido) { 161 | 162 | pedido.setStatus(StatusPedido.CANCELADO); 163 | 164 | } 165 | 166 | } 167 | 168 | logger.info("pedido " + idPedido + " cancelado"); 169 | 170 | } 171 | 172 | } 173 | -------------------------------------------------------------------------------- /Capitulo 2/Pedido-REST/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port = 8081 2 | -------------------------------------------------------------------------------- /Capitulo 2/Pedido-REST/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Capitulo 2/meupipeline.conf: -------------------------------------------------------------------------------- 1 | input { 2 | gelf{ 3 | 4 | } 5 | } 6 | 7 | filter { 8 | grok { 9 | match => [ "message" , "O cliente %{NUMBER:idCliente} foi %{WORD:acao}!" , 10 | "message", "cliente %{NUMBER:idCliente} possui %{NUMBER:qtdPedidos} pedidos", 11 | "message", "pedido %{NUMBER:idPedido} do cliente %{NUMBER:idCliente} %{WORD:acaoItemPedido} o produto %{NUMBER:idProdutoPedido}", 12 | "message", "pedido %{NUMBER:idPedido} %{WORD:acaoPedido}", 13 | "message" , "%{GREEDYDATA:logdefault}" ] 14 | } 15 | } 16 | 17 | output { 18 | stdout { codec => rubydebug } 19 | } 20 | -------------------------------------------------------------------------------- /Capitulo 3/ScriptTestesClientes.jmx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | false 7 | true 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | continue 16 | 17 | false 18 | 1 19 | 20 | 1 21 | 1 22 | 1445179949000 23 | 1445179949000 24 | false 25 | 26 | 27 | 28 | 29 | 30 | true 31 | 32 | 33 | 34 | false 35 | {"id":6,"nome":"Cliente 6","email":"customer6@gmail.com"} 36 | = 37 | 38 | 39 | 40 | localhost 41 | 8081 42 | 43 | 44 | 45 | 46 | 47 | POST 48 | true 49 | false 50 | true 51 | false 52 | HttpClient4 53 | false 54 | 55 | 56 | 57 | 58 | 59 | 60 | Content-Type 61 | application/json 62 | 63 | 64 | 65 | 66 | 67 | 68 | true 69 | 70 | 71 | 72 | false 73 | {"id":7,"nome":"Cliente 7","email":"customer7@gmail.com"} 74 | = 75 | 76 | 77 | 78 | localhost 79 | 8081 80 | 81 | 82 | 83 | 84 | 85 | POST 86 | true 87 | false 88 | true 89 | false 90 | HttpClient4 91 | false 92 | 93 | 94 | 95 | 96 | 97 | 98 | Content-Type 99 | application/json 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | continue 108 | 109 | false 110 | 50 111 | 112 | 1 113 | 1 114 | 1445183051000 115 | 1445183051000 116 | false 117 | 118 | 119 | 120 | 121 | 122 | true 123 | 124 | 125 | 126 | false 127 | {"id":6,"nome":"Cliente 6 abc","email":"customer6abc@gmail.com"} 128 | = 129 | 130 | 131 | 132 | localhost 133 | 8081 134 | 135 | 136 | 137 | 138 | 139 | PUT 140 | true 141 | false 142 | true 143 | false 144 | HttpClient4 145 | false 146 | 147 | 148 | 149 | 150 | 151 | 152 | Content-Type 153 | application/json 154 | 155 | 156 | 157 | 158 | 159 | 160 | true 161 | 162 | 163 | 164 | false 165 | {"id":6,"nome":"Cliente 6","email":"customer6abc@gmail.com"} 166 | = 167 | 168 | 169 | 170 | localhost 171 | 8081 172 | 173 | 174 | 175 | 176 | 177 | PUT 178 | true 179 | false 180 | true 181 | false 182 | HttpClient4 183 | false 184 | 185 | 186 | 187 | 188 | 189 | 190 | Content-Type 191 | application/json 192 | 193 | 194 | 195 | 196 | 197 | 198 | true 199 | 200 | 201 | 202 | false 203 | {"id":7,"nome":"Cliente 7 abc","email":"customer7abc@gmail.com"} 204 | = 205 | 206 | 207 | 208 | localhost 209 | 8081 210 | 211 | 212 | 213 | 214 | 215 | PUT 216 | true 217 | false 218 | true 219 | false 220 | HttpClient4 221 | false 222 | 223 | 224 | 225 | 226 | 227 | 228 | Content-Type 229 | application/json 230 | 231 | 232 | 233 | 234 | 235 | 236 | true 237 | 238 | 239 | 240 | false 241 | {"id":7,"nome":"Cliente 7","email":"customer7abc@gmail.com"} 242 | = 243 | 244 | 245 | 246 | localhost 247 | 8081 248 | 249 | 250 | 251 | 252 | 253 | PUT 254 | true 255 | false 256 | true 257 | false 258 | HttpClient4 259 | false 260 | 261 | 262 | 263 | 264 | 265 | 266 | Content-Type 267 | application/json 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | continue 276 | 277 | false 278 | 1 279 | 280 | 1 281 | 1 282 | 1445197879000 283 | 1445197879000 284 | false 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | false 294 | 6 295 | = 296 | true 297 | id 298 | 299 | 300 | 301 | localhost 302 | 8081 303 | 304 | 305 | 306 | 307 | 308 | DELETE 309 | true 310 | false 311 | true 312 | false 313 | HttpClient4 314 | false 315 | 316 | 317 | 318 | 319 | 320 | 321 | Content-Type 322 | application/json 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | false 333 | 7 334 | = 335 | true 336 | id 337 | 338 | 339 | 340 | localhost 341 | 8081 342 | 343 | 344 | 345 | 346 | 347 | DELETE 348 | true 349 | false 350 | true 351 | false 352 | HttpClient4 353 | false 354 | 355 | 356 | 357 | 358 | 359 | 360 | Content-Type 361 | application/json 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | -------------------------------------------------------------------------------- /Capitulo 3/ScriptTestesPedidos.jmx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | false 7 | true 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | continue 16 | 17 | false 18 | 1 19 | 20 | 1 21 | 3 22 | 1445185866000 23 | 1445185866000 24 | false 25 | 26 | 27 | 28 | 29 | 30 | true 31 | 32 | 33 | 34 | false 35 | { 36 | "idPedido": 1, 37 | "idCliente": 1, 38 | "item" : { 39 | "idProduto":1, 40 | "quantidade":3 41 | } 42 | 43 | } 44 | = 45 | 46 | 47 | 48 | localhost 49 | 8080 50 | 51 | 52 | 53 | 54 | item/adiciona 55 | POST 56 | true 57 | false 58 | true 59 | false 60 | HttpClient4 61 | false 62 | 63 | 64 | 65 | 66 | 67 | 68 | Content-Type 69 | application/json 70 | 71 | 72 | 73 | 74 | 75 | 76 | true 77 | 78 | 79 | 80 | false 81 | { 82 | "idPedido": 2, 83 | "idCliente": 2, 84 | "item" : { 85 | "idProduto":3, 86 | "quantidade":9 87 | } 88 | 89 | } 90 | = 91 | 92 | 93 | 94 | localhost 95 | 8080 96 | 97 | 98 | 99 | 100 | item/adiciona 101 | POST 102 | true 103 | false 104 | true 105 | false 106 | HttpClient4 107 | false 108 | 109 | 110 | 111 | 112 | 113 | 114 | Content-Type 115 | application/json 116 | 117 | 118 | 119 | 120 | 121 | 122 | true 123 | 124 | 125 | 126 | false 127 | { 128 | "idPedido": 3, 129 | "idCliente": 4, 130 | "item" : { 131 | "idProduto":1, 132 | "quantidade":5 133 | } 134 | 135 | } 136 | = 137 | 138 | 139 | 140 | localhost 141 | 8080 142 | 143 | 144 | 145 | 146 | item/adiciona 147 | POST 148 | true 149 | false 150 | true 151 | false 152 | HttpClient4 153 | false 154 | 155 | 156 | 157 | 158 | 159 | 160 | Content-Type 161 | application/json 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | continue 170 | 171 | false 172 | 40 173 | 174 | 1 175 | 1 176 | 1445196501000 177 | 1445196501000 178 | false 179 | 180 | 181 | 182 | 183 | 184 | true 185 | 186 | 187 | 188 | false 189 | { 190 | "idPedido": 1, 191 | "item" : { 192 | "idProduto":2, 193 | "quantidade":3 194 | } 195 | 196 | } 197 | = 198 | 199 | 200 | 201 | localhost 202 | 8080 203 | 204 | 205 | 206 | 207 | item/adiciona 208 | POST 209 | true 210 | false 211 | true 212 | false 213 | HttpClient4 214 | false 215 | 216 | 217 | 218 | 219 | 220 | 221 | Content-Type 222 | application/json 223 | 224 | 225 | 226 | 227 | 228 | 229 | true 230 | 231 | 232 | 233 | false 234 | { 235 | "idPedido": 1, 236 | "item" : { 237 | "idProduto":67, 238 | "quantidade":1 239 | } 240 | 241 | } 242 | = 243 | 244 | 245 | 246 | localhost 247 | 8080 248 | 249 | 250 | 251 | 252 | item/adiciona 253 | POST 254 | true 255 | false 256 | true 257 | false 258 | HttpClient4 259 | false 260 | 261 | 262 | 263 | 264 | 265 | 266 | Content-Type 267 | application/json 268 | 269 | 270 | 271 | 272 | 273 | 274 | true 275 | 276 | 277 | 278 | false 279 | { 280 | "idPedido": 1, 281 | "item" : { 282 | "idProduto":6, 283 | "quantidade":7 284 | } 285 | 286 | } 287 | = 288 | 289 | 290 | 291 | localhost 292 | 8080 293 | 294 | 295 | 296 | 297 | item/adiciona 298 | POST 299 | true 300 | false 301 | true 302 | false 303 | HttpClient4 304 | false 305 | 306 | 307 | 308 | 309 | 310 | 311 | Content-Type 312 | application/json 313 | 314 | 315 | 316 | 317 | 318 | 319 | true 320 | 321 | 322 | 323 | false 324 | { 325 | "idPedido": 1, 326 | "item" : { 327 | "idProduto":6 328 | } 329 | 330 | } 331 | = 332 | 333 | 334 | 335 | localhost 336 | 8080 337 | 338 | 339 | 340 | 341 | item/remove 342 | POST 343 | true 344 | false 345 | true 346 | false 347 | HttpClient4 348 | false 349 | 350 | 351 | 352 | 353 | 354 | 355 | Content-Type 356 | application/json 357 | 358 | 359 | 360 | 361 | 362 | 363 | true 364 | 365 | 366 | 367 | false 368 | { 369 | "idPedido": 2, 370 | "item" : { 371 | "idProduto":5, 372 | "quantidade":3 373 | } 374 | 375 | } 376 | = 377 | 378 | 379 | 380 | localhost 381 | 8080 382 | 383 | 384 | 385 | 386 | item/adiciona 387 | POST 388 | true 389 | false 390 | true 391 | false 392 | HttpClient4 393 | false 394 | 395 | 396 | 397 | 398 | 399 | 400 | Content-Type 401 | application/json 402 | 403 | 404 | 405 | 406 | 407 | 408 | true 409 | 410 | 411 | 412 | false 413 | { 414 | "idPedido": 2, 415 | "item" : { 416 | "idProduto":3, 417 | "quantidade":1 418 | } 419 | 420 | } 421 | = 422 | 423 | 424 | 425 | localhost 426 | 8080 427 | 428 | 429 | 430 | 431 | item/adiciona 432 | POST 433 | true 434 | false 435 | true 436 | false 437 | HttpClient4 438 | false 439 | 440 | 441 | 442 | 443 | 444 | 445 | Content-Type 446 | application/json 447 | 448 | 449 | 450 | 451 | 452 | 453 | true 454 | 455 | 456 | 457 | false 458 | { 459 | "idPedido": 2, 460 | "item" : { 461 | "idProduto":6, 462 | "quantidade":7 463 | } 464 | 465 | } 466 | = 467 | 468 | 469 | 470 | localhost 471 | 8080 472 | 473 | 474 | 475 | 476 | item/adiciona 477 | POST 478 | true 479 | false 480 | true 481 | false 482 | HttpClient4 483 | false 484 | 485 | 486 | 487 | 488 | 489 | 490 | Content-Type 491 | application/json 492 | 493 | 494 | 495 | 496 | 497 | 498 | true 499 | 500 | 501 | 502 | false 503 | { 504 | "idPedido": 2, 505 | "item" : { 506 | "idProduto":6 507 | } 508 | 509 | } 510 | = 511 | 512 | 513 | 514 | localhost 515 | 8080 516 | 517 | 518 | 519 | 520 | item/remove 521 | POST 522 | true 523 | false 524 | true 525 | false 526 | HttpClient4 527 | false 528 | 529 | 530 | 531 | 532 | 533 | 534 | Content-Type 535 | application/json 536 | 537 | 538 | 539 | 540 | 541 | 542 | true 543 | 544 | 545 | 546 | false 547 | { 548 | "idPedido": 3, 549 | "item" : { 550 | "idProduto":5, 551 | "quantidade":3 552 | } 553 | 554 | } 555 | = 556 | 557 | 558 | 559 | localhost 560 | 8080 561 | 562 | 563 | 564 | 565 | item/adiciona 566 | POST 567 | true 568 | false 569 | true 570 | false 571 | HttpClient4 572 | false 573 | 574 | 575 | 576 | 577 | 578 | 579 | Content-Type 580 | application/json 581 | 582 | 583 | 584 | 585 | 586 | 587 | true 588 | 589 | 590 | 591 | false 592 | { 593 | "idPedido": 3, 594 | "item" : { 595 | "idProduto":3, 596 | "quantidade":1 597 | } 598 | 599 | } 600 | = 601 | 602 | 603 | 604 | localhost 605 | 8080 606 | 607 | 608 | 609 | 610 | item/adiciona 611 | POST 612 | true 613 | false 614 | true 615 | false 616 | HttpClient4 617 | false 618 | 619 | 620 | 621 | 622 | 623 | 624 | Content-Type 625 | application/json 626 | 627 | 628 | 629 | 630 | 631 | 632 | true 633 | 634 | 635 | 636 | false 637 | { 638 | "idPedido": 3, 639 | "item" : { 640 | "idProduto":6, 641 | "quantidade":7 642 | } 643 | 644 | } 645 | = 646 | 647 | 648 | 649 | localhost 650 | 8080 651 | 652 | 653 | 654 | 655 | item/adiciona 656 | POST 657 | true 658 | false 659 | true 660 | false 661 | HttpClient4 662 | false 663 | 664 | 665 | 666 | 667 | 668 | 669 | Content-Type 670 | application/json 671 | 672 | 673 | 674 | 675 | 676 | 677 | true 678 | 679 | 680 | 681 | false 682 | { 683 | "idPedido": 3, 684 | "item" : { 685 | "idProduto":6 686 | } 687 | 688 | } 689 | = 690 | 691 | 692 | 693 | localhost 694 | 8080 695 | 696 | 697 | 698 | 699 | item/remove 700 | POST 701 | true 702 | false 703 | true 704 | false 705 | HttpClient4 706 | false 707 | 708 | 709 | 710 | 711 | 712 | 713 | Content-Type 714 | application/json 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | continue 723 | 724 | false 725 | 1 726 | 727 | 1 728 | 1 729 | 1445188787000 730 | 1445188787000 731 | false 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | localhost 741 | 8080 742 | 743 | 744 | 745 | 746 | pedido/1 747 | PUT 748 | true 749 | false 750 | true 751 | false 752 | HttpClient4 753 | false 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | localhost 762 | 8080 763 | 764 | 765 | 766 | 767 | pedido/2 768 | DELETE 769 | true 770 | false 771 | true 772 | false 773 | HttpClient4 774 | false 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | localhost 783 | 8080 784 | 785 | 786 | 787 | 788 | pedido/3 789 | PUT 790 | true 791 | false 792 | true 793 | false 794 | HttpClient4 795 | false 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | -------------------------------------------------------------------------------- /Capitulo 3/meupipeline.conf: -------------------------------------------------------------------------------- 1 | input { 2 | gelf{ 3 | 4 | } 5 | } 6 | 7 | filter { 8 | grok { 9 | match => [ "message" , "O cliente %{NUMBER:idCliente} foi %{WORD:acao}!" , 10 | "message", "cliente %{NUMBER:idCliente} possui %{NUMBER:qtdPedidos} pedidos", 11 | "message", "pedido %{NUMBER:idPedido} do cliente %{NUMBER:idCliente} %{WORD:acaoItemPedido} o produto %{NUMBER:idProdutoPedido}", 12 | "message", "pedido %{NUMBER:idPedido} %{WORD:acaoPedido}", 13 | "message" , "%{GREEDYDATA:logdefault}" ] 14 | } 15 | mutate { "convert" => [ "idCliente" , "integer" ] } 16 | mutate { "convert" => [ "qtdPedidos" , "integer" ] } 17 | mutate { "convert" => [ "idPedido" , "integer" ] } 18 | mutate { "convert" => [ "idProdutoPedido" , "integer" ] } 19 | } 20 | 21 | output { 22 | stdout { codec => rubydebug } 23 | elasticsearch { 24 | hosts => [ "localhost:9200" ] 25 | index => "casadocodigo-%{+YYYY.MM.dd}" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Capitulo 5/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM kibana:5.1.2 2 | RUN su - kibana -c "/usr/share/kibana/bin/kibana-plugin install x-pack" 3 | -------------------------------------------------------------------------------- /Capitulo 6/comandoselasticsearch.txt: -------------------------------------------------------------------------------- 1 | # mapeamentos 2 | 3 | curl -XPUT 'localhost:9200/loja/categoria/_mapping' -d '{ 4 | "categoria" : { 5 | "properties" : { 6 | "nome" : {"type" : "string"} 7 | } 8 | } }' 9 | 10 | curl -XPUT 'localhost:9200/loja/produto/_mapping' -d '{ 11 | "produto" : { 12 | "_parent" : { "type" : "categoria" }, 13 | "properties" : { 14 | "sku" : {"type" : "integer"}, 15 | "nome" : {"type" : "string"}, 16 | "descricao" : {"type" : "string"}, 17 | "marca" : {"type" : "string"}, 18 | "estoque" : {"type" : "integer"} 19 | } 20 | } }' 21 | 22 | #categorias 23 | 24 | curl -XPOST 'localhost:9200/loja/categoria/Geladeiras?routing=Eletro' -d '{ "nome" : "Geladeiras" }' 25 | curl -XPOST 'localhost:9200/loja/categoria/Fogões?routing=Eletro' -d '{ "nome" : "Fogões" }' 26 | curl -XPOST 'localhost:9200/loja/categoria/Ar-condicionados?routing=Eletro' -d '{ "nome" : "Ar-condicionados" }' 27 | curl -XPOST 'localhost:9200/loja/categoria/Aspiradores?routing=Eletro' -d '{ "nome" : "Aspiradores" }' 28 | curl -XPOST 'localhost:9200/loja/categoria/Masculino?routing=Vestuário' -d '{ "nome" : "Masculino" }' 29 | curl -XPOST 'localhost:9200/loja/categoria/Feminino?routing=Vestuário' -d '{ "nome" : "Feminino" }' 30 | curl -XPOST 'localhost:9200/loja/categoria/Lar?routing=Lar' -d '{ "nome" : "Lar" }' 31 | 32 | #produtos 33 | 34 | curl -XPOST 'localhost:9200/loja/produto?parent=Geladeiras&routing=Eletro' -d '{ "sku" : 234565678,"nome":"produto 1", "marca": "marcaA","descricao":"esta é a descrição do produto 1","estoque":23 }' 35 | curl -XPOST 'localhost:9200/loja/produto?parent=Fogões&routing=Eletro' -d '{ "sku" : 234567288,"nome":"produto 12", "marca": "marcaA","descricao":"esta é a descrição do produto 12","estoque":3 }' 36 | curl -XPOST 'localhost:9200/loja/produto?parent=Fogões&routing=Eletro' -d '{ "sku" : 234567289,"nome":"produto 13", "marca": "marcaB","descricao":"esta é a descrição do produto 13","estoque":7 }' 37 | curl -XPOST 'localhost:9200/loja/produto?parent=Fogões&routing=Eletro' -d '{ "sku" : 234567290,"nome":"produto 14", "marca": "marcaC","descricao":"esta é a descrição do produto 14","estoque":11 }' 38 | curl -XPOST 'localhost:9200/loja/produto?parent=Fogões&routing=Eletro' -d '{ "sku" : 234567291,"nome":"produto 15", "marca": "marcaB","descricao":"esta é a descrição do produto 15","estoque":16 }' 39 | curl -XPOST 'localhost:9200/loja/produto?parent=Fogões&routing=Eletro' -d '{ "sku" : 234567292,"nome":"produto 16", "marca": "marcaA","descricao":"esta é a descrição do produto 16","estoque":20 }' 40 | curl -XPOST 'localhost:9200/loja/produto?parent=Fogões&routing=Eletro' -d '{ "sku" : 234567293,"nome":"produto 17", "marca": "marcaA","descricao":"esta é a descrição do produto 17","estoque":33 }' 41 | 42 | 43 | curl -XPOST 'localhost:9200/loja/produto?parent=Aspiradores&routing=Eletro' -d '{ "sku" : 147567288,"nome":"produto 33", "marca": "marcaA","descricao":"esta é a descrição do produto 33","estoque":67 }' 44 | curl -XPOST 'localhost:9200/loja/produto?parent=Aspiradores&routing=Eletro' -d '{ "sku" : 147567289,"nome":"produto 34", "marca": "marcaA","descricao":"esta é a descrição do produto 34","estoque":23 }' 45 | curl -XPOST 'localhost:9200/loja/produto?parent=Aspiradores&routing=Eletro' -d '{ "sku" : 147567290,"nome":"produto 35", "marca": "marcaA","descricao":"esta é a descrição do produto 35","estoque":53 }' 46 | curl -XPOST 'localhost:9200/loja/produto?parent=Ar-condicionados&routing=Eletro' -d '{ "sku" : 234561828,"nome":"produto 4", "marca": "marcaB","descricao":"esta é a descrição do produto 4","estoque":3 }' 47 | curl -XPOST 'localhost:9200/loja/produto?parent=Masculino&routing=Vestuário' -d '{ "sku" : 231007288,"nome":"produto 5", "marca": "marcaF","descricao":"esta é a descrição do produto 5","estoque":35 }' 48 | curl -XPOST 'localhost:9200/loja/produto?parent=Lar&routing=Lar' -d '{ "sku" : 234567900,"nome":"produto 6", "marca": "marcaH","descricao":"esta é a descrição do produto 6","estoque":89 }' 49 | -------------------------------------------------------------------------------- /Capitulo 6/twitterpipeline.conf: -------------------------------------------------------------------------------- 1 | 2 | input { 3 | twitter { 4 | consumer_key => "..." 5 | consumer_secret => "..." 6 | keywords => ["coca cola","java","elasticsearch","amazon"] 7 | oauth_token => "..." 8 | oauth_token_secret => "..." 9 | } 10 | } 11 | 12 | output { 13 | stdout { codec => rubydebug } 14 | elasticsearch { 15 | hosts => [ "localhost:9200" ] 16 | index => "twitter-%{+YYYY.MM.dd}" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # livro-elasticsearch 2 | --------------------------------------------------------------------------------