Skip to content

Commit 0180a99

Browse files
committed
adding version 0.0.2 feature
1 parent 9c9f0c1 commit 0180a99

File tree

12 files changed

+246
-75
lines changed

12 files changed

+246
-75
lines changed

README.adoc

Lines changed: 84 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ maven { url "https://dl.bintray.com/m2/release"}
1313
## Dependencies
1414

1515
```
16-
compile ("io.devxchange:logmetrics:0.0.1")
16+
compile ("io.devxchange:logmetrics:0.0.2")
1717

1818
```
1919

@@ -25,6 +25,10 @@ compile ("io.devxchange:logmetrics:0.0.1")
2525
logmetrics.logging.enabled=true
2626
logmetrics.logging.request.enabled=true
2727
logmetrics.logging.response.enabled=true
28+
logmetrics.logging.obfuscate.enabled=false
29+
logmetrics.logging.obfuscate.md5.fields= #comma seperated fields
30+
logmetrics.logging.obfuscate.sha256.fields= #comma seperated fields
31+
logmetrics.logging.obfuscate.fields= #comma seperated fields
2832

2933
```
3034

@@ -42,18 +46,96 @@ public class AppConfig extends WebMvcConfigurerAdapter
4246
@Override
4347
public void addInterceptors(InterceptorRegistry registry)
4448
{
45-
registry.addInterceptor(new RestTransactionInterceptor(logWriterManager));
49+
registry.addInterceptor(new FrontendRestInterceptor(logWriterManager));
4650
}
4751
}
4852

4953
```
5054

55+
### logmetrics json schema
56+
57+
```
58+
{
59+
"$schema": "http://json-schema.org/draft-04/schema#",
60+
"type": "LogMetrics",
61+
"properties": {
62+
"Node": {
63+
"type": "string",
64+
"description": "Application Host IP Address"
65+
},
66+
"message_type": {
67+
"type": "string",
68+
"description": "Logmetrics message type",
69+
"value": "LOGMETRICS_MESSAGE"
70+
},
71+
"Duration": {
72+
"type": "integer",
73+
"description": "Response time of the API"
74+
},
75+
"Host": {
76+
"type": "string",
77+
"description": "Application Host Name"
78+
},
79+
"Fault": {
80+
"type": "boolean",
81+
"description": "API Success or Failed status "
82+
},
83+
"Method": {
84+
"type": "string",
85+
"description": "API Method name"
86+
},
87+
"ResponseBody": {
88+
"type": "string",
89+
"description": "API Response Body"
90+
},
91+
"StartDateTime": {
92+
"type": "string",
93+
"description": "API Start Time"
94+
},
95+
"EndDateTime": {
96+
"type": "string",
97+
"description": "API End time"
98+
},
99+
"HttpMethod": {
100+
"type": "string",
101+
"description": "Http Method Type"
102+
},
103+
"RequestBody": {
104+
"type": "string",
105+
"description": "API Request Body"
106+
}
107+
}
108+
}
109+
110+
111+
```
112+
113+
### sample logmetrics message
114+
```
115+
{
116+
"Node": "127.0.0.1",
117+
"message_type": "LOGMETRICS_MESSAGE",
118+
"Duration": 106,
119+
"Host": "hostname",
120+
"Fault": false,
121+
"Method": "/user-service/api/v1/user/{id}",
122+
"ResponseBody": "{\"id\":1,\"name\":\"02adcec2263d2127269fcd769c33f029\",\"age\":\"35135aaa6cc23891b40cb3f378c53a17a1127210ce60e125ccf03efcfdaec458\",\"salary\":\"********\"}",
123+
"StartDateTime": "Tue Nov 26 23:22:54 EST 2019",
124+
"EndDateTime": "Tue Nov 26 23:22:54 EST 2019",
125+
"HttpMethod": "GET",
126+
"RequestBody": ""
127+
}
128+
```
129+
51130
### Demo Project
52131

53132
https://github.com/devxchange-blog/logmetrics-demo.git[logmetrics-demo]
54133

55134
## Release History
56135

136+
** 0.0.2
137+
* adding request and response payload obfuscation (masking sensitive information)
138+
57139
** 0.0.1
58140
* logging rest verb & payload to console.
59141
* feature to enable/disable payload logging

build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,19 @@ apply plugin: 'com.jfrog.bintray'
2222

2323

2424
group 'io.devxchange'
25-
version '0.0.1'
25+
version '0.0.2'
2626

2727
repositories {
2828
mavenCentral()
2929
maven { url "https://repo.spring.io/snapshot" }
3030
maven { url "https://repo.spring.io/milestone" }
31+
maven { url "https://dl.bintray.com/m2/release/"}
32+
3133
}
3234

3335
dependencies {
3436
compile gradleApi()
37+
compile ("io.devxchange:obfuscator:0.0.1")
3538
compile group: 'org.springframework', name: 'spring-webmvc', version: '4.3.2.RELEASE'
3639
compile("javax.servlet:javax.servlet-api:3.1.0")
3740
compile group: 'commons-io', name: 'commons-io', version: '2.4'

src/main/java/io/devxchange/logmetrics/interceptor/RestPayloadInterceptor.java renamed to src/main/java/io/devxchange/logmetrics/interceptor/FrontendRestInterceptor.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,36 +11,29 @@
1111
import org.slf4j.LoggerFactory;
1212
import org.springframework.beans.factory.annotation.Autowired;
1313
import org.springframework.beans.factory.annotation.Qualifier;
14-
import org.springframework.beans.factory.annotation.Value;
1514
import org.springframework.stereotype.Component;
1615
import org.springframework.web.context.request.RequestContextHolder;
1716
import org.springframework.web.context.request.ServletRequestAttributes;
1817
import org.springframework.web.servlet.HandlerMapping;
1918
import org.springframework.web.servlet.ModelAndView;
2019
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
2120

22-
import io.devxchange.logmetrics.types.PayloadMessageBuilder;
21+
import io.devxchange.logmetrics.types.LogMetricsBuilder;
2322
import io.devxchange.logmetrics.util.LogUtil;
2423
import io.devxchange.logmetrics.writer.LogWriterManager;
2524

2625
/**
2726
* Created by devxchange.io on 2/10/17.
2827
*/
2928
@Component
30-
public class RestPayloadInterceptor extends HandlerInterceptorAdapter {
29+
public class FrontendRestInterceptor extends HandlerInterceptorAdapter {
3130

32-
Logger log = LoggerFactory.getLogger(RestPayloadInterceptor.class);
31+
Logger log = LoggerFactory.getLogger(FrontendRestInterceptor.class);
3332

3433
private LogWriterManager logWriter;
3534

36-
@Value("${io.oneclicklabs.logging.request.obfuscated.fields}")
37-
private String[] requestObfuscation;
38-
39-
@Value("${io.oneclicklabs.logging.response.obfuscated.fields}")
40-
private String[] responseObfuscation;
41-
4235
@Autowired
43-
public RestPayloadInterceptor(@Qualifier("manager.logwriter") LogWriterManager logWriter) {
36+
public FrontendRestInterceptor(@Qualifier("manager.logwriter") LogWriterManager logWriter) {
4437

4538
this.logWriter = logWriter;
4639
}
@@ -77,7 +70,7 @@ private void logTransactions(HttpServletRequest servletRequest, HttpServletRespo
7770
Date endDateTime = new Date((Long) servletRequest.getAttribute("ENDTIME"));
7871
long duration = ((Long) servletRequest.getAttribute("ENDTIME")
7972
- (Long) servletRequest.getAttribute("STARTTIME"));
80-
PayloadMessageBuilder messageBuilder = new PayloadMessageBuilder(hostname, node, null, getServiceOperation(),
73+
LogMetricsBuilder messageBuilder = new LogMetricsBuilder(hostname, node, null, getServiceOperation(),
8174
servletRequest.getMethod(), duration);
8275
messageBuilder.aspects(null).query(servletRequest.getQueryString()).startDateTime(startDateTime)
8376
.endDateTime(endDateTime).requestBody(requestPayload).contentType(servletRequest.getContentType())

src/main/java/io/devxchange/logmetrics/types/PayloadMessage.java renamed to src/main/java/io/devxchange/logmetrics/types/LogMetrics.java

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,23 @@
33
import java.util.Date;
44
import java.util.HashMap;
55
import java.util.Map;
6+
import java.util.Set;
67

78
import com.google.gson.GsonBuilder;
9+
import io.devxchange.logmetrics.util.Validation;
10+
import io.devxchange.obfuscator.Obfuscator;
811

912
/**
1013
* Created by devxchange.io on 2/10/17.
1114
*/
12-
public class PayloadMessage {
15+
public class LogMetrics {
1316

1417
public enum params {
1518
messageType("message_type"), duration("Duration"), host("Host"), level("Level"), method("Method"), node(
1619
"Node"), service("Service"), system("System"), serviceVersion("ServiceVersion"), startDateTime(
1720
"StartDateTime"), endDateTime("EndDateTime"), error("Fault"), errorCode(
1821
"FaultCode"), errorMessage(
19-
"FaultString"), aspects("Aspects"), requestBody("RequestBody"), responseBody(
22+
"FaultString"), aspects("Aspects"), requestBody("RequestBody"), responseBody(
2023
"ResponseBody"), applicationName("ApplicationName"), httpMethod(
2124
"HttpMethod"), query("Query"), contentType("ContentType");
2225

@@ -53,12 +56,12 @@ public String getKeyName() {
5356
private final String query;
5457
private final String contentType;
5558

56-
public PayloadMessage(String message_type, Long duration, String host, String level, String method, String node,
57-
String service, String system,
59+
public LogMetrics(String message_type, Long duration, String host, String level, String method, String node,
60+
String service, String system,
5861

59-
String serviceVersion, Date startDateTime, Date endDateTime, Boolean error, String errorCode,
60-
String errorMessage, Map<String, String> aspects, String requestBody, String responseBody,
61-
String applicationName, String httpMethod, String query, String contentType) {
62+
String serviceVersion, Date startDateTime, Date endDateTime, Boolean error, String errorCode,
63+
String errorMessage, Map<String, String> aspects, String requestBody, String responseBody,
64+
String applicationName, String httpMethod, String query, String contentType) {
6265
this.message_type = message_type;
6366
this.duration = duration;
6467
this.host = host;
@@ -119,6 +122,31 @@ public String toJson(boolean includeReq, boolean includeResp) {
119122
return this.toJson(map);
120123
}
121124

125+
public String toJson(boolean includeReq, boolean includeResp, boolean obfuscate, Map<String, Set<String>> fields) {
126+
Map<String, Object> originalMap = this.toMap();
127+
HashMap<String, Object> map = new HashMap<>();
128+
map.putAll(originalMap);
129+
if (!includeReq) {
130+
map.remove(params.requestBody.keyName);
131+
}else if(obfuscate){
132+
String payload = (String) originalMap.get(params.requestBody.keyName);
133+
if(payload!=null && Validation.isJson(payload))
134+
map.put(params.requestBody.keyName,Obfuscator.obfuscateJsonString(payload,fields));
135+
else if(payload!=null)
136+
map.put(params.requestBody.keyName, Obfuscator.obfuscateXmlString(payload, fields));
137+
}
138+
if (!includeResp)
139+
map.remove(params.responseBody.keyName);
140+
else if(obfuscate){
141+
String payload = (String) originalMap.get(params.responseBody.keyName);
142+
if(payload!=null && Validation.isJson(payload))
143+
map.put(params.responseBody.keyName,Obfuscator.obfuscateJsonString(payload,fields));
144+
else if(payload!=null)
145+
map.put(params.responseBody.keyName, Obfuscator.obfuscateXmlString(payload, fields));
146+
}
147+
return this.toJson(map);
148+
}
149+
122150
public String toJson(Map<String, Object> map) {
123151
return new GsonBuilder().disableHtmlEscaping().setDateFormat("EEE MMM dd HH:mm:ss zzz yyyy").create()
124152
.toJson(map);

0 commit comments

Comments
 (0)