Changed history module
Updated Spring Boot version to 2.7.11 Fixed Loombok to cooperate with Mapstruct
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-parent</artifactId>
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
<version>2.3.1.RELEASE</version>
|
<version>2.7.11</version>
|
||||||
<relativePath/> <!-- lookup parent from repository -->
|
<relativePath/> <!-- lookup parent from repository -->
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
@@ -18,9 +18,10 @@
|
|||||||
<jedis.version>3.3.0</jedis.version>
|
<jedis.version>3.3.0</jedis.version>
|
||||||
<logback-redis-appender.version>1.1.6</logback-redis-appender.version>
|
<logback-redis-appender.version>1.1.6</logback-redis-appender.version>
|
||||||
<assertj.version>3.16.1</assertj.version>
|
<assertj.version>3.16.1</assertj.version>
|
||||||
<mapstruct.version>1.3.1.Final</mapstruct.version>
|
<mapstruct.version>1.5.5.Final</mapstruct.version>
|
||||||
<docker.image.prefix>Release11</docker.image.prefix>
|
<docker.image.prefix>Release11</docker.image.prefix>
|
||||||
<docker.image.name>${project.artifactId}</docker.image.name>
|
<docker.image.name>${project.artifactId}</docker.image.name>
|
||||||
|
<lombok.version>1.18.26</lombok.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@@ -57,21 +58,6 @@
|
|||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>com.cwbase</groupId>
|
|
||||||
<artifactId>logback-redis-appender</artifactId>
|
|
||||||
<version>${logback-redis-appender.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>redis.clients</groupId>
|
|
||||||
<artifactId>jedis</artifactId>
|
|
||||||
<version>${jedis.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.codehaus.jettison</groupId>
|
|
||||||
<artifactId>jettison</artifactId>
|
|
||||||
<version>1.4.1</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@@ -101,6 +87,11 @@
|
|||||||
<artifactId>lombok</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
<version>${lombok.version}</version>
|
<version>${lombok.version}</version>
|
||||||
</path>
|
</path>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok-mapstruct-binding</artifactId>
|
||||||
|
<version>0.2.0</version>
|
||||||
|
</dependency>
|
||||||
</annotationProcessorPaths>
|
</annotationProcessorPaths>
|
||||||
<compilerArgs>
|
<compilerArgs>
|
||||||
<compilerArg>-Amapstruct.defaultComponentModel=spring</compilerArg>
|
<compilerArg>-Amapstruct.defaultComponentModel=spring</compilerArg>
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
package com.r11.tools.config;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.context.annotation.PropertySource;
|
|
||||||
import org.springframework.core.env.Environment;
|
|
||||||
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
|
|
||||||
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
|
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
|
||||||
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
|
|
||||||
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
|
|
||||||
import redis.clients.jedis.JedisPool;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class containing configuration for Redis db client
|
|
||||||
* @author Rafał Żukowicz
|
|
||||||
*/
|
|
||||||
@Configuration
|
|
||||||
@EnableRedisRepositories
|
|
||||||
@PropertySource("classpath:data-access.properties")
|
|
||||||
public class RedisConfig {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private Environment environment;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bean of JedisPool - the Redis client. It stores requests in "the pool" and then fires them at Redis.
|
|
||||||
* It's considered super lightweight and fast client variant
|
|
||||||
* @return lightweight client of the Redis - the JedisPool
|
|
||||||
*/
|
|
||||||
@Bean
|
|
||||||
JedisPool jedisPool(){
|
|
||||||
final JedisPool pool = new JedisPool(environment.getProperty("redis.host"),
|
|
||||||
Integer.parseInt(environment.getProperty("redis.port")));
|
|
||||||
return pool;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bean of a factory for connenction object.
|
|
||||||
* It's initialized with Redis db url property and is fed to other methods.
|
|
||||||
* @return the factory for RedisTemplates
|
|
||||||
*/
|
|
||||||
@Bean
|
|
||||||
JedisConnectionFactory jedisConnectionFactory() {
|
|
||||||
RedisStandaloneConfiguration redisStandaloneConfiguration =
|
|
||||||
new RedisStandaloneConfiguration(Objects.requireNonNull(environment.getProperty("redis.host")),
|
|
||||||
Integer.parseInt(Objects.requireNonNull(environment.getProperty("redis.port"))));
|
|
||||||
return new JedisConnectionFactory(redisStandaloneConfiguration);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* RedisTemplate is the tool to store and retrieve given type (object) of hash from the database.
|
|
||||||
* It's like you could store your Java object by just naming it inside database. You might thing about it
|
|
||||||
* as of DAO.
|
|
||||||
* @return RedisTemplate the redis dao.
|
|
||||||
*/
|
|
||||||
@Bean
|
|
||||||
public RedisTemplate<String, Object> redisTemplate() {
|
|
||||||
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
|
|
||||||
redisTemplate.setConnectionFactory(jedisConnectionFactory());
|
|
||||||
redisTemplate.setExposeConnection(true);
|
|
||||||
redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
|
|
||||||
return redisTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.r11.tools.configuration;
|
||||||
|
|
||||||
|
import com.r11.tools.interceptor.IncomingMockRequestInterceptor;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class WebConfig implements WebMvcConfigurer{
|
||||||
|
|
||||||
|
private final IncomingMockRequestInterceptor requestInterceptor;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
|
registry.addInterceptor( requestInterceptor )
|
||||||
|
.addPathPatterns("/api/mock/r/**");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
package com.r11.tools.controller;
|
|
||||||
|
|
||||||
import com.r11.tools.model.EventRequestDto;
|
|
||||||
import com.r11.tools.service.EtrackService;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* It's the REST api for {@link com.r11.tools.model.Event}
|
|
||||||
* @author Gabriel Modzelewski
|
|
||||||
*/
|
|
||||||
@RestController
|
|
||||||
@RequestMapping(path = "/api/event")
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class EventController {
|
|
||||||
private final EtrackService service;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the list of Events in given time bracket.
|
|
||||||
* The list of objects is received via {@link EventRequestDto}, which contains time brackets,
|
|
||||||
* as well as the key - uuid.
|
|
||||||
* @param event EventRequestDto object that contains data needed to query the database
|
|
||||||
* @return list of {@link com.r11.tools.model.Event}
|
|
||||||
*/
|
|
||||||
@PostMapping
|
|
||||||
public ResponseEntity filterHistory(@RequestBody EventRequestDto event){
|
|
||||||
return new ResponseEntity(service.getEventsByDateTimeAndBusinessKeys(event), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the list of Events of last 24h from given date.
|
|
||||||
* @param uuid unique id of message list
|
|
||||||
* @param messageId unique id of message in message list
|
|
||||||
* @return list of {@link com.r11.tools.model.Event}
|
|
||||||
*/
|
|
||||||
@GetMapping(path = "/{uuid}/{messageId}")
|
|
||||||
public ResponseEntity getLastDay(@PathVariable UUID uuid,
|
|
||||||
@PathVariable Integer messageId){
|
|
||||||
LocalDateTime requestTime = LocalDateTime.now();
|
|
||||||
LocalDateTime dayBeforeRequest = requestTime.minusDays(1L);
|
|
||||||
EventRequestDto eventRequestDto = EventRequestDto.builder()
|
|
||||||
.clientUUID(uuid)
|
|
||||||
.mockedResponseId(messageId)
|
|
||||||
.localDateTimeFrom(dayBeforeRequest)
|
|
||||||
.localDateTimeTo(requestTime)
|
|
||||||
.build();
|
|
||||||
return new ResponseEntity(service.getEventsByDateTimeAndBusinessKeys(eventRequestDto), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -3,13 +3,14 @@ package com.r11.tools.controller;
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.r11.tools.model.MockedMessageDto;
|
import com.r11.tools.model.MockedMessageDto;
|
||||||
import com.r11.tools.service.KlausService;
|
import com.r11.tools.service.KlausService;
|
||||||
import com.r11.tools.utilis.BusinessKey;
|
|
||||||
import com.r11.tools.utilis.TrackingClient;
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.springframework.http.*;
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
@@ -18,6 +19,7 @@ import java.util.*;
|
|||||||
/**
|
/**
|
||||||
* Returns the homepage and provides the api for javascript async requests.
|
* Returns the homepage and provides the api for javascript async requests.
|
||||||
* @author Gabriel Modzelewski
|
* @author Gabriel Modzelewski
|
||||||
|
* @author Mikołaj Widła
|
||||||
*/
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping(path = "/api/mock")
|
@RequestMapping(path = "/api/mock")
|
||||||
@@ -28,7 +30,7 @@ public class MockController {
|
|||||||
|
|
||||||
@ExceptionHandler(Exception.class)
|
@ExceptionHandler(Exception.class)
|
||||||
public void errorHandler(Exception ex){
|
public void errorHandler(Exception ex){
|
||||||
log.error(ex.getStackTrace());
|
log.error(Arrays.toString(ex.getStackTrace()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -175,22 +177,14 @@ public class MockController {
|
|||||||
/**
|
/**
|
||||||
* It's one of the most important features - the bread and butter of the Mocked Service. It's link that allows
|
* It's one of the most important features - the bread and butter of the Mocked Service. It's link that allows
|
||||||
* to receive mocked response from the server and use it to mock!
|
* to receive mocked response from the server and use it to mock!
|
||||||
* @param requestEntity Logs the data of request
|
|
||||||
* @param clientUUID the key-uuid of given set of messages
|
* @param clientUUID the key-uuid of given set of messages
|
||||||
* @param mockedResponseId unique id of given message
|
* @param mockedResponseId unique id of given message
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping(value = "/r/{clientUUID}/{mockedResponseId}")
|
@GetMapping(value = "/r/{clientUUID}/{mockedResponseId}")
|
||||||
public ResponseEntity getMockedResponse(RequestEntity<String> requestEntity,
|
public ResponseEntity getMockedResponse(
|
||||||
@PathVariable UUID clientUUID,
|
@PathVariable UUID clientUUID,
|
||||||
@PathVariable int mockedResponseId) {
|
@PathVariable int mockedResponseId) {
|
||||||
TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "getMockedResponse - request",
|
|
||||||
BusinessKey.CLIENT_UUID, String.valueOf(clientUUID),
|
|
||||||
BusinessKey.MESSAGE_ID, String.valueOf(mockedResponseId)));
|
|
||||||
// log.info(requestEntity.toString().replaceAll("\"", "\\\\\"").substring(1).replaceAll("\n",""));
|
|
||||||
TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "getMockedResponse - response",
|
|
||||||
BusinessKey.CLIENT_UUID, String.valueOf(clientUUID),
|
|
||||||
BusinessKey.MESSAGE_ID, String.valueOf(mockedResponseId)));
|
|
||||||
MockedMessageDto mockedMessageDto = klausService.getMockedResponse(clientUUID, mockedResponseId);
|
MockedMessageDto mockedMessageDto = klausService.getMockedResponse(clientUUID, mockedResponseId);
|
||||||
HttpHeaders httpHeaders = new HttpHeaders();
|
HttpHeaders httpHeaders = new HttpHeaders();
|
||||||
if (mockedMessageDto.getHttpHeaders() != null) mockedMessageDto.getHttpHeaders().forEach(httpHeaders::set);
|
if (mockedMessageDto.getHttpHeaders() != null) mockedMessageDto.getHttpHeaders().forEach(httpHeaders::set);
|
||||||
|
|||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package com.r11.tools.controller;
|
||||||
|
|
||||||
|
import com.r11.tools.mappers.RequestHistoryMapper;
|
||||||
|
import com.r11.tools.model.HistoryRequestModel;
|
||||||
|
import com.r11.tools.model.RequestHistory;
|
||||||
|
import com.r11.tools.model.RequestHistoryDTO;
|
||||||
|
import com.r11.tools.service.RequestHistoryService;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* It's the REST api for {@link RequestHistory}
|
||||||
|
* @author Gabriel Modzelewski
|
||||||
|
* @author Mikołaj Widła
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping(path = "/api/event")
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class RequestHistoryController {
|
||||||
|
private final RequestHistoryService service;
|
||||||
|
private final RequestHistoryMapper mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of Events in given time bracket.
|
||||||
|
* The list of objects is received via {@link RequestHistoryDTO}, which contains time brackets,
|
||||||
|
* as well as the key - uuid.
|
||||||
|
* @param historyRequestModel EventRequestDto object that contains data needed to query the database
|
||||||
|
* @return list of {@link RequestHistory}
|
||||||
|
*/
|
||||||
|
@PostMapping
|
||||||
|
public ResponseEntity<List<RequestHistoryDTO>> filterHistory(@RequestBody HistoryRequestModel historyRequestModel){
|
||||||
|
return ResponseEntity.ok(
|
||||||
|
service.getHistoryRecordsBetweenDatesAndByUUIDAndMessageId(historyRequestModel)
|
||||||
|
.stream()
|
||||||
|
.map(mapper::requestHistoryToRequestHistoryDTO)
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of Events of last 24h from given date.
|
||||||
|
* @param uuid unique id of message list
|
||||||
|
* @param messageId unique id of message in message list
|
||||||
|
* @return list of {@link RequestHistory}
|
||||||
|
*/
|
||||||
|
@GetMapping(path = "/{uuid}/{messageId}")
|
||||||
|
public ResponseEntity<List<RequestHistoryDTO>> getLastDay(@PathVariable UUID uuid,
|
||||||
|
@PathVariable Integer messageId){
|
||||||
|
LocalDateTime requestTime = LocalDateTime.now();
|
||||||
|
LocalDateTime dayBeforeRequest = requestTime.minusDays(1L);
|
||||||
|
List<RequestHistoryDTO> requestHistory = service.getHistoryRecordsBetweenDatesAndByUUIDAndMessageId(
|
||||||
|
HistoryRequestModel.builder()
|
||||||
|
.localDateTimeFrom(dayBeforeRequest)
|
||||||
|
.localDateTimeTo(requestTime)
|
||||||
|
.clientUUID(uuid)
|
||||||
|
.mockedResponseId(messageId)
|
||||||
|
.build()
|
||||||
|
).stream()
|
||||||
|
.map(mapper::requestHistoryToRequestHistoryDTO)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
return ResponseEntity.ok(requestHistory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package com.r11.tools.interceptor;
|
||||||
|
|
||||||
|
import com.r11.tools.model.RequestHistoryDTO;
|
||||||
|
import com.r11.tools.service.RequestHistoryService;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.servlet.HandlerInterceptor;
|
||||||
|
import org.springframework.web.servlet.HandlerMapping;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class IncomingMockRequestInterceptor implements HandlerInterceptor {
|
||||||
|
|
||||||
|
private final RequestHistoryService historyService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean preHandle(HttpServletRequest httpRequest, HttpServletResponse response, Object handler){
|
||||||
|
Map<String,String> headers = getHeadersFromHttpRequest(httpRequest);
|
||||||
|
Map<String,String> pathVariable = getPathVariablesFromHttpRequest(httpRequest);
|
||||||
|
|
||||||
|
RequestHistoryDTO historyDTO = RequestHistoryDTO.builder()
|
||||||
|
.httpMethod(HttpMethod.valueOf(httpRequest.getMethod()))
|
||||||
|
.headers( headers )
|
||||||
|
.messageID(Integer.valueOf(pathVariable.get("mockedResponseId")))
|
||||||
|
.clientUUID(UUID.fromString(pathVariable.get("clientUUID")))
|
||||||
|
.dateTimeStamp(LocalDateTime.now())
|
||||||
|
.build();
|
||||||
|
historyService.saveRequest(historyDTO);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String,String> getHeadersFromHttpRequest( HttpServletRequest httpRequest ){
|
||||||
|
Set<String> headersName = StreamSupport.stream(
|
||||||
|
Spliterators.spliteratorUnknownSize(
|
||||||
|
httpRequest.getHeaderNames().asIterator(),
|
||||||
|
Spliterator.ORDERED
|
||||||
|
), false
|
||||||
|
).collect(Collectors.toSet());
|
||||||
|
|
||||||
|
return headersName.stream()
|
||||||
|
.collect(Collectors.toMap(
|
||||||
|
value -> value,
|
||||||
|
httpRequest::getHeader
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String,String> getPathVariablesFromHttpRequest( HttpServletRequest httpRequest ){
|
||||||
|
return (Map<String, String>) httpRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.r11.tools.mappers;
|
||||||
|
|
||||||
|
import com.r11.tools.model.RequestHistory;
|
||||||
|
import com.r11.tools.model.RequestHistoryDTO;
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface RequestHistoryMapper {
|
||||||
|
RequestHistory requestHistoryDTOToRequestHistory(RequestHistoryDTO requestHistoryDTO);
|
||||||
|
RequestHistoryDTO requestHistoryToRequestHistoryDTO(RequestHistory requestHistory);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
package com.r11.tools.model;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import lombok.*;
|
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
|
||||||
import org.springframework.lang.Nullable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pojo class for Event entity
|
|
||||||
* @author Rafał Żukowicz
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@ToString
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class Event implements Comparable<Event>{
|
|
||||||
|
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss")
|
|
||||||
private LocalDateTime dateTimeStamp;
|
|
||||||
@Nullable
|
|
||||||
private String interfaceName;
|
|
||||||
@Nullable
|
|
||||||
private String clientUUID;
|
|
||||||
@Nullable
|
|
||||||
private Integer messageId;
|
|
||||||
private String thread;
|
|
||||||
private String level;
|
|
||||||
@Nullable
|
|
||||||
private String message;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(Event o) {
|
|
||||||
return this.getDateTimeStamp().compareTo(o.getDateTimeStamp()) * -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,22 +1,19 @@
|
|||||||
package com.r11.tools.model;
|
package com.r11.tools.model;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.UUID;
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
/**
|
import java.time.LocalDateTime;
|
||||||
* Pojo for history query request. Contains information necessary to obtain {@link Event} list
|
import java.util.UUID;
|
||||||
* @author Rafał Żukowicz
|
|
||||||
*/
|
|
||||||
@Data
|
@Data
|
||||||
@Builder
|
@Builder
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class EventRequestDto {
|
public class HistoryRequestModel {
|
||||||
|
|
||||||
private UUID clientUUID;
|
private UUID clientUUID;
|
||||||
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
|
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package com.r11.tools.model;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.springframework.data.annotation.Id;
|
||||||
|
import org.springframework.data.redis.core.RedisHash;
|
||||||
|
import org.springframework.data.redis.core.index.Indexed;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pojo class for Event entity
|
||||||
|
* @author Rafał Żukowicz
|
||||||
|
* @author Mikołaj Widła
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@RedisHash("mockHistory")
|
||||||
|
public class RequestHistory implements Comparable<RequestHistory>, Serializable {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private String id;
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss")
|
||||||
|
private LocalDateTime dateTimeStamp;
|
||||||
|
@Indexed
|
||||||
|
private String clientUUID;
|
||||||
|
@Indexed
|
||||||
|
private Integer messageID;
|
||||||
|
private Map<String,String> headers;
|
||||||
|
private HttpMethod httpMethod;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(RequestHistory o) {
|
||||||
|
return this.getDateTimeStamp().compareTo(o.getDateTimeStamp()) * -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package com.r11.tools.model;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pojo for history query request. Contains information necessary to obtain {@link RequestHistory} list
|
||||||
|
* @author Rafał Żukowicz
|
||||||
|
* @author Mikołaj Widła
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class RequestHistoryDTO {
|
||||||
|
|
||||||
|
private UUID clientUUID;
|
||||||
|
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
|
||||||
|
private LocalDateTime dateTimeStamp;
|
||||||
|
private Integer messageID;
|
||||||
|
private Map<String,String> headers;
|
||||||
|
private HttpMethod httpMethod;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package com.r11.tools.repository;
|
|
||||||
|
|
||||||
import com.r11.tools.model.Event;
|
|
||||||
import com.r11.tools.utilis.BusinessKey;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Event entity dao interface
|
|
||||||
* @author Rafał Żukowicz
|
|
||||||
*/
|
|
||||||
@Repository
|
|
||||||
@Transactional
|
|
||||||
public interface EventRepository {
|
|
||||||
List<Event> findEvents(LocalDateTime localDateTimeFrom, LocalDateTime localDateTimeTo,
|
|
||||||
Map<BusinessKey, String> businessKeys);
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
package com.r11.tools.repository;
|
|
||||||
|
|
||||||
import static com.r11.tools.utilis.RedisAppender.LOG_PREFIX;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
import com.r11.tools.model.Event;
|
|
||||||
import com.r11.tools.utilis.BusinessKey;
|
|
||||||
import java.time.LocalDate;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.time.LocalTime;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
import redis.clients.jedis.Jedis;
|
|
||||||
import redis.clients.jedis.JedisPool;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builds Event list based on logs created via {@link com.r11.tools.utilis.TrackingClient} and {@link com.r11.tools.utilis.RedisAppender}
|
|
||||||
* @author Rafał Żukowicz
|
|
||||||
*/
|
|
||||||
@Repository
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class EventRepositoryImpl implements EventRepository {
|
|
||||||
private final JedisPool jedisPool;
|
|
||||||
private final ObjectMapper objectMapper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates list of {@link Event} based on {@link com.r11.tools.model.EventRequestDto} data via searching logs
|
|
||||||
* @param localDateTimeFrom date from which logs are retrieved
|
|
||||||
* @param localDateTimeTo date to which logs are retrieved
|
|
||||||
* @param businessKeys set keys for redis values
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public List<Event> findEvents(LocalDateTime localDateTimeFrom, LocalDateTime localDateTimeTo,
|
|
||||||
Map<BusinessKey, String> businessKeys) {
|
|
||||||
List<String> eventStrings = findEventsBetweenDates(localDateTimeFrom.toLocalDate(), localDateTimeTo.toLocalDate());
|
|
||||||
if (businessKeys.size() > 0) {
|
|
||||||
eventStrings = businessKeysFilter(eventStrings, businessKeys);
|
|
||||||
}
|
|
||||||
List<Event> events = parseEvents(eventStrings);
|
|
||||||
if (localDateTimeFrom.toLocalTime() != LocalTime.MIN) {
|
|
||||||
events = events.stream().filter(event -> event.getDateTimeStamp().compareTo(localDateTimeFrom) >= 0)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
return events.stream().filter(event -> event.getDateTimeStamp().compareTo(localDateTimeTo) <= 0)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns logs between given dates
|
|
||||||
* @param localDateFrom date from which logs are retrieved
|
|
||||||
* @param localDateTo date to which logs are retrieved
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private List<String> findEventsBetweenDates(LocalDate localDateFrom, LocalDate localDateTo) {
|
|
||||||
try (Jedis jedis = jedisPool.getResource()) {
|
|
||||||
return localDateFrom.datesUntil(localDateTo.plusDays(1)).map(day -> LOG_PREFIX + day.toString())
|
|
||||||
.map(key -> jedis.lrange(key, 0, -1)).flatMap(Collection::stream).collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Filters keys so only the ones queried are retirned
|
|
||||||
* @param events list of logs
|
|
||||||
* @param businessKeys set keys for redis values
|
|
||||||
* @return filtered list of logs
|
|
||||||
*/
|
|
||||||
private List<String> businessKeysFilter(List<String> events, Map<BusinessKey, String> businessKeys) {
|
|
||||||
for (Map.Entry<BusinessKey, String> entry : businessKeys.entrySet()) {
|
|
||||||
String stringPattern = entry.getKey().getReasonPhrase()+ "\"" + ":" + "\"" + entry.getValue() + "\"";
|
|
||||||
events = events.stream().filter(s -> s.contains(stringPattern)).collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses list of logs into list of {@link Event}
|
|
||||||
* @param eventStrings list of logs
|
|
||||||
* @return list of {@link Event}
|
|
||||||
*/
|
|
||||||
private List<Event> parseEvents(List<String> eventStrings) {
|
|
||||||
List<Event> events = new ArrayList<>();
|
|
||||||
for (String eventString : eventStrings) {
|
|
||||||
eventString = eventString.replaceAll("\\R", "");
|
|
||||||
try {
|
|
||||||
events.add(objectMapper.readValue(eventString, Event.class));
|
|
||||||
} catch (JsonProcessingException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.r11.tools.repository;
|
||||||
|
|
||||||
|
import com.r11.tools.model.RequestHistory;
|
||||||
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event entity dao interface
|
||||||
|
* @author Rafał Żukowicz
|
||||||
|
*/
|
||||||
|
@Repository
|
||||||
|
@Transactional
|
||||||
|
public interface RequestHistoryRepository extends CrudRepository<RequestHistory,String> {
|
||||||
|
List<RequestHistory> findAllByClientUUIDAndMessageID(
|
||||||
|
String clientUUID,
|
||||||
|
Integer messageID);
|
||||||
|
}
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package com.r11.tools.service;
|
|
||||||
|
|
||||||
import com.r11.tools.model.Event;
|
|
||||||
import com.r11.tools.model.EventRequestDto;
|
|
||||||
import java.util.List;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Spring service interface for {@link com.r11.tools.controller.EventController}
|
|
||||||
* @author Rafał Żukowicz
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
public interface EtrackService {
|
|
||||||
/**
|
|
||||||
* Searches for {@link Event} objects between date brackets
|
|
||||||
* @param eventsDto object containing required data for request
|
|
||||||
* @return list of {@link Event}
|
|
||||||
*/
|
|
||||||
List<Event> getEventsByDateTimeAndBusinessKeys(EventRequestDto eventsDto);
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
package com.r11.tools.service;
|
|
||||||
|
|
||||||
import com.r11.tools.model.Event;
|
|
||||||
import com.r11.tools.model.EventRequestDto;
|
|
||||||
import com.r11.tools.repository.EventRepository;
|
|
||||||
import com.r11.tools.utilis.BusinessKey;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Spring Service for {@link com.r11.tools.controller.EventController}. Contains logic required for quering
|
|
||||||
* the database for {@link Event} objects
|
|
||||||
* @author Rafał Żukowicz
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class EtrackServiceImpl implements EtrackService {
|
|
||||||
|
|
||||||
private final EventRepository eventRepository;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds {@link BusinessKey} to {@link EventRequestDto}
|
|
||||||
* in order to create query via{@link com.r11.tools.repository.EventRepositoryImpl}
|
|
||||||
* @param eventsDto object containing required data for request
|
|
||||||
* @return list of {@link Event}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public List<Event> getEventsByDateTimeAndBusinessKeys(EventRequestDto eventsDto) {
|
|
||||||
Map<BusinessKey, String> businessKeys = new HashMap<>();
|
|
||||||
businessKeys.put(BusinessKey.CLIENT_UUID, eventsDto.getClientUUID().toString());
|
|
||||||
if (eventsDto.getMockedResponseId() != null){
|
|
||||||
businessKeys.put(BusinessKey.MESSAGE_ID, String.valueOf(eventsDto.getMockedResponseId()));
|
|
||||||
}
|
|
||||||
List<Event> events = eventRepository.findEvents(eventsDto.getLocalDateTimeFrom(), eventsDto.getLocalDateTimeTo(),
|
|
||||||
businessKeys);
|
|
||||||
Collections.sort(events);
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.r11.tools.service;
|
||||||
|
|
||||||
|
import com.r11.tools.controller.RequestHistoryController;
|
||||||
|
import com.r11.tools.model.HistoryRequestModel;
|
||||||
|
import com.r11.tools.model.RequestHistory;
|
||||||
|
import com.r11.tools.model.RequestHistoryDTO;
|
||||||
|
import java.util.List;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spring service interface for {@link RequestHistoryController}
|
||||||
|
* @author Rafał Żukowicz
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public interface RequestHistoryService {
|
||||||
|
/**
|
||||||
|
* Searches for {@link RequestHistory} objects between date brackets
|
||||||
|
* @param historyRequestModel object containing required data for request
|
||||||
|
* @return list of {@link RequestHistory}
|
||||||
|
*/
|
||||||
|
List<RequestHistory> getHistoryRecordsBetweenDatesAndByUUIDAndMessageId(HistoryRequestModel historyRequestModel);
|
||||||
|
void saveRequest(RequestHistoryDTO requestDTO);
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package com.r11.tools.service;
|
||||||
|
|
||||||
|
import com.r11.tools.controller.RequestHistoryController;
|
||||||
|
import com.r11.tools.mappers.RequestHistoryMapper;
|
||||||
|
import com.r11.tools.model.HistoryRequestModel;
|
||||||
|
import com.r11.tools.model.RequestHistory;
|
||||||
|
import com.r11.tools.model.RequestHistoryDTO;
|
||||||
|
import com.r11.tools.repository.RequestHistoryRepository;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spring Service for {@link RequestHistoryController}. Contains logic required for quering
|
||||||
|
* the database for {@link RequestHistory} objects
|
||||||
|
* @author Rafał Żukowicz
|
||||||
|
* @author Mikołaj Widła
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class RequestHistoryServiceImpl implements RequestHistoryService {
|
||||||
|
|
||||||
|
private final RequestHistoryRepository repository;
|
||||||
|
private final RequestHistoryMapper requestMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* f
|
||||||
|
* in order to create query via{@link com.r11.tools.repository.RequestHistoryRepository}
|
||||||
|
* @param historyRequestModel object containing required data for request
|
||||||
|
* @return list of {@link RequestHistory}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<RequestHistory> getHistoryRecordsBetweenDatesAndByUUIDAndMessageId(HistoryRequestModel historyRequestModel) {
|
||||||
|
List<RequestHistory> history = repository.findAllByClientUUIDAndMessageID(
|
||||||
|
historyRequestModel.getClientUUID().toString(),
|
||||||
|
historyRequestModel.getMockedResponseId()
|
||||||
|
);
|
||||||
|
Collections.sort(history);
|
||||||
|
|
||||||
|
return history.stream()
|
||||||
|
.filter( historyRecord -> historyRecord
|
||||||
|
.getDateTimeStamp()
|
||||||
|
.isAfter(historyRequestModel.getLocalDateTimeFrom())
|
||||||
|
).filter(
|
||||||
|
historyRecord-> historyRecord
|
||||||
|
.getDateTimeStamp()
|
||||||
|
.isBefore(historyRequestModel.getLocalDateTimeTo())
|
||||||
|
)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveRequest(RequestHistoryDTO requestDTO) {
|
||||||
|
repository.save(requestMapper.requestHistoryDTOToRequestHistory(requestDTO));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
package com.r11.tools.utilis;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enum of keys for redis database.
|
|
||||||
* @author Rafał Żukowicz
|
|
||||||
*/
|
|
||||||
@AllArgsConstructor
|
|
||||||
public enum BusinessKey {
|
|
||||||
INTERFACE_NAME("interfaceName"),
|
|
||||||
CLIENT_UUID("clientUUID"),
|
|
||||||
MESSAGE_ID("messageId");
|
|
||||||
|
|
||||||
private final String phrase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns string value of given enum variant
|
|
||||||
* @return string value of enum
|
|
||||||
*/
|
|
||||||
public String getReasonPhrase() {
|
|
||||||
return this.phrase;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,235 +0,0 @@
|
|||||||
package com.r11.tools.utilis;
|
|
||||||
|
|
||||||
import ch.qos.logback.classic.spi.ILoggingEvent;
|
|
||||||
import ch.qos.logback.core.Layout;
|
|
||||||
import ch.qos.logback.core.UnsynchronizedAppenderBase;
|
|
||||||
import com.cwbase.logback.AdditionalField;
|
|
||||||
import com.cwbase.logback.JSONEventLayout;
|
|
||||||
import java.time.LocalDate;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
|
|
||||||
import redis.clients.jedis.Jedis;
|
|
||||||
import redis.clients.jedis.JedisPool;
|
|
||||||
import redis.clients.jedis.Protocol;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class is used to insert logs directly to Redis. {@link com.release11.klaus.repository.EventRepositoryImpl} is using those logs.
|
|
||||||
* @author Rafał Żukowicz
|
|
||||||
* @author Gabriel Modzelewski
|
|
||||||
*/
|
|
||||||
public class RedisAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
|
|
||||||
|
|
||||||
JedisPool pool;
|
|
||||||
JSONEventLayout jsonlayout;
|
|
||||||
Layout<ILoggingEvent> layout;
|
|
||||||
String host = "localhost";
|
|
||||||
int port = Protocol.DEFAULT_PORT;
|
|
||||||
String key = null;
|
|
||||||
int timeout = Protocol.DEFAULT_TIMEOUT;
|
|
||||||
String password = null;
|
|
||||||
int database = Protocol.DEFAULT_DATABASE;
|
|
||||||
|
|
||||||
public static final String LOG_PREFIX = "logstash_";
|
|
||||||
|
|
||||||
|
|
||||||
public RedisAppender() {
|
|
||||||
jsonlayout = new JSONEventLayout();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends JedisPool by another log
|
|
||||||
* @param event object containing log info
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void append(ILoggingEvent event) {
|
|
||||||
Jedis client = pool.getResource();
|
|
||||||
try {
|
|
||||||
String json = layout == null ? jsonlayout.doLayout(event) : layout.doLayout(event);
|
|
||||||
key = LOG_PREFIX + LocalDate.now();
|
|
||||||
client.rpush(key, json);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} finally {
|
|
||||||
if (client != null) {
|
|
||||||
client.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public String getSource() {
|
|
||||||
return jsonlayout.getSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public void setSource(String source) {
|
|
||||||
jsonlayout.setSource(source);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public String getSourceHost() {
|
|
||||||
return jsonlayout.getSourceHost();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public void setSourceHost(String sourceHost) {
|
|
||||||
jsonlayout.setSourceHost(sourceHost);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public String getSourcePath() {
|
|
||||||
return jsonlayout.getSourcePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public void setSourcePath(String sourcePath) {
|
|
||||||
jsonlayout.setSourcePath(sourcePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public String getTags() {
|
|
||||||
if (jsonlayout.getTags() != null) {
|
|
||||||
Iterator<String> i = jsonlayout.getTags().iterator();
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
while (i.hasNext()) {
|
|
||||||
sb.append(i.next());
|
|
||||||
if (i.hasNext()) {
|
|
||||||
sb.append(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public void setTags(String tags) {
|
|
||||||
if (tags != null) {
|
|
||||||
String[] atags = tags.split(",");
|
|
||||||
jsonlayout.setTags(Arrays.asList(atags));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public String getType() {
|
|
||||||
return jsonlayout.getType();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public void setType(String type) {
|
|
||||||
jsonlayout.setType(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getHost() {
|
|
||||||
return host;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHost(String host) {
|
|
||||||
this.host = host;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getPort() {
|
|
||||||
return port;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPort(int port) {
|
|
||||||
this.port = port;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getKey() {
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setKey(String key) {
|
|
||||||
this.key = key;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTimeout() {
|
|
||||||
return timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTimeout(int timeout) {
|
|
||||||
this.timeout = timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPassword() {
|
|
||||||
return password;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPassword(String password) {
|
|
||||||
this.password = password;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getDatabase() {
|
|
||||||
return database;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDatabase(int database) {
|
|
||||||
this.database = database;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public void setMdc(boolean flag) {
|
|
||||||
jsonlayout.setProperties(flag);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public boolean getMdc() {
|
|
||||||
return jsonlayout.getProperties();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public void setLocation(boolean flag) {
|
|
||||||
jsonlayout.setLocationInfo(flag);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public boolean getLocation() {
|
|
||||||
return jsonlayout.getLocationInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public void setCallerStackIndex(int index) {
|
|
||||||
jsonlayout.setCallerStackIdx(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public int getCallerStackIndex() {
|
|
||||||
return jsonlayout.getCallerStackIdx();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public void addAdditionalField(AdditionalField p) {
|
|
||||||
jsonlayout.addAdditionalField(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Layout<ILoggingEvent> getLayout() {
|
|
||||||
return layout;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLayout(Layout<ILoggingEvent> layout) {
|
|
||||||
this.layout = layout;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Starts new instance of JedisPool
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void start() {
|
|
||||||
super.start();
|
|
||||||
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
|
|
||||||
config.setTestOnBorrow(true);
|
|
||||||
pool = new JedisPool(config, host, port, timeout, password, database);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops and destroys JedisPool object
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void stop() {
|
|
||||||
super.stop();
|
|
||||||
pool.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
package com.r11.tools.utilis;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
import org.slf4j.MDC;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This static class has one purpose and one purpose only. It logs data about incomming requests.
|
|
||||||
* The data from logs is received via {@link com.release11.klaus.repository.EventRepositoryImpl}
|
|
||||||
* @author Rafał Żukowski
|
|
||||||
*/
|
|
||||||
public final class TrackingClient {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs data inside the given map
|
|
||||||
* @param businessKeysMap map containing all the information about incomming request
|
|
||||||
*/
|
|
||||||
public static void setBusinessKeys(Map<BusinessKey, String> businessKeysMap){
|
|
||||||
for (Map.Entry<BusinessKey, String> entry : businessKeysMap.entrySet()) {
|
|
||||||
MDC.put(entry.getKey().getReasonPhrase(), entry.getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
#environment:
|
#environment:
|
||||||
server.port = 8097
|
server.port = 8097
|
||||||
|
spring.redis.host=redis
|
||||||
|
spring.redis.port=6379
|
||||||
spring.application.name = klaus
|
spring.application.name = klaus
|
||||||
spring.mvc.view.suffix=.html
|
spring.mvc.view.suffix=.html
|
||||||
logging.level.root=INFO
|
logging.level.root=INFO
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
redis.host = redis
|
|
||||||
redis.port = 6379
|
|
||||||
@@ -2,25 +2,8 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<include resource="org/springframework/boot/logging/logback/base.xml"/>
|
<include resource="org/springframework/boot/logging/logback/base.xml"/>
|
||||||
<property name="HOME_LOG" value="/log/mockServices.log"/>
|
<property name="HOME_LOG" value="/log/mockServices.log"/>
|
||||||
<!--https://github.com/kmtong/logback-redis-appender-->
|
|
||||||
<appender name="LOGSTASH" class="com.r11.tools.utilis.RedisAppender">
|
|
||||||
<host>redis</host>
|
|
||||||
<port>6379</port>
|
|
||||||
<key>logstash</key>
|
|
||||||
<layout class="ch.qos.logback.classic.PatternLayout">
|
|
||||||
<!--https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html-->
|
|
||||||
<Pattern>
|
|
||||||
{"dateTimeStamp" : "%d{yyyy-MM-dd}T%d{HH:mm:ss}", "eventId":"%X{eventId}", "interfaceName":"%X{interfaceName}", "clientUUID":"%X{clientUUID}", "messageId":"%X{messageId}", "thread":"%t","level":"%-5level", "message":"%msg"}%n
|
|
||||||
</Pattern>
|
|
||||||
</layout>
|
|
||||||
</appender>
|
|
||||||
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
|
|
||||||
<appender-ref ref="LOGSTASH" />
|
|
||||||
</appender>
|
|
||||||
|
|
||||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
<file>${HOME_LOG}</file>
|
<file>${HOME_LOG}</file>
|
||||||
|
|
||||||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
<fileNamePattern>logs/mockServices.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
<fileNamePattern>logs/mockServices.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||||
<maxFileSize>10MB</maxFileSize>
|
<maxFileSize>10MB</maxFileSize>
|
||||||
@@ -34,7 +17,6 @@
|
|||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<root level="DEBUG">
|
<root level="DEBUG">
|
||||||
<appender-ref ref="ASYNC" />
|
|
||||||
<appender-ref ref="CONSOLE" />
|
<appender-ref ref="CONSOLE" />
|
||||||
<appender-ref ref="FILE" />
|
<appender-ref ref="FILE" />
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
Reference in New Issue
Block a user