Skip to content

Commit 3926d15

Browse files
authored
Merge pull request #79 from DataDog/TRAIN-2466-dash-updates
updates to frontend, discounts, and ads
2 parents 27b8e84 + 77508a2 commit 3926d15

File tree

14 files changed

+164
-91
lines changed

14 files changed

+164
-91
lines changed

.github/CODEOWNERS

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# These owners will be the default owners for everything in
2+
# the repo. Any future lines will overwrite this default. The last pattern
3+
# that matches, will be the final pattern.
4+
# See https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
5+
6+
* @DataDog/training @DataDog/corpweb

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ services:
332332
ports:
333333
- '3030:8080'
334334
labels:
335-
com.datadoghq.ad.logs: '[{"source": "java", "service": "ads-java"}]'
335+
com.datadoghq.ad.logs: '[{"source": "java", "service": "store-ads-java"}]'
336336
com.datadoghq.tags.env: '${DD_ENV-dev}'
337337
com.datadoghq.tags.service: 'store-ads-java'
338338
com.datadoghq.tags.version: '${DD_VERSION-7}'

services/ads/java/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ dependencies {
1717
'commons-io:commons-io:2.4',
1818
'org.springframework.boot:spring-boot-starter-web'
1919
)
20+
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
21+
implementation 'net.logstash.logback:logstash-logback-encoder:7.0'
2022
testImplementation 'org.springframework.boot:spring-boot-starter-test'
2123
}
2224

services/ads/java/src/main/java/adsjava/AdsJavaApplication.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,35 +16,43 @@
1616
import java.util.concurrent.TimeoutException;
1717
import org.springframework.web.bind.annotation.RequestHeader;
1818

19+
import org.slf4j.Logger;
20+
import org.slf4j.LoggerFactory;
21+
1922

2023
@SpringBootApplication
2124
@RestController
2225
public class AdsJavaApplication {
2326

27+
private static final Logger logger = LoggerFactory.getLogger(AdsJavaApplication.class);
28+
29+
@RequestMapping("/")
30+
public String home() {
31+
logger.info("home url for ads called");
32+
return "Welcome to Java - Ads Service";
33+
}
34+
2435
@CrossOrigin(origins = {"*"})
2536
@RequestMapping(
2637
value = "/banners/{id}",
2738
produces = MediaType.IMAGE_JPEG_VALUE
2839
)
2940
public @ResponseBody byte[] getImageWithMediaType() throws IOException {
41+
logger.info("/banners/{id} called");
3042
int randomNum = ThreadLocalRandom.current().nextInt(1, 3 + 1);
3143
String imagePath = "/static/ads/ad" + randomNum + ".jpg";
3244
InputStream in = getClass()
3345
.getResourceAsStream(imagePath);
3446
return IOUtils.toByteArray(in);
3547
}
3648

37-
@RequestMapping("/")
38-
public String home() {
39-
return "Welcome to Java - Ads Service";
40-
}
41-
4249
@CrossOrigin(origins = {"*"})
4350
@RequestMapping(
4451
value = "/ads",
4552
produces = MediaType.APPLICATION_JSON_VALUE
4653
)
4754
public HashMap[] ads(@RequestHeader HashMap<String, String> headers) {
55+
logger.info("/ads called");
4856

4957
boolean errorFlag = false;
5058
if(headers.get("x-throw-error") != null) {
@@ -62,7 +70,7 @@ public HashMap[] ads(@RequestHeader HashMap<String, String> headers) {
6270
try {
6371
throw new TimeoutException("took too long to get a response");
6472
} catch (Exception e) {
65-
System.out.println("took too long to get a response");
73+
logger.error("Request failed, check the request headers.");
6674
throw new RuntimeException(e);
6775
}
6876
} else {
@@ -80,8 +88,8 @@ public HashMap[] ads(@RequestHeader HashMap<String, String> headers) {
8088
map3.put("id", "3");
8189
map3.put("name", "Nic Bags");
8290
map3.put("path", "3.jpg");
83-
System.out.println("ads called");
8491
HashMap[] myArr = { map1, map2, map3 };
92+
logger.info("Total responses available: " + myArr.length);
8593
return myArr;
8694
}
8795
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<configuration>
2+
3+
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
4+
<encoder>
5+
<pattern>
6+
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
7+
</pattern>
8+
</encoder>
9+
</appender>
10+
11+
<appender name="JSON_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
12+
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
13+
</appender>
14+
15+
<root level="INFO">
16+
<appender-ref ref="JSON_CONSOLE" />
17+
</root>
18+
19+
</configuration>

services/ads/python/ads.py

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import json_log_formatter
2+
from ddtrace import tracer
3+
import logging
14
import requests
25
import random
36
import time
@@ -11,10 +14,8 @@
1114
from bootstrap import create_app
1215
from models import Advertisement, db
1316

14-
from ddtrace import patch; patch(logging=True)
15-
import logging
16-
from ddtrace import tracer
17-
import json_log_formatter
17+
from ddtrace import patch
18+
patch(logging=True)
1819

1920
formatter = json_log_formatter.VerboseJSONFormatter()
2021
json_handler = logging.StreamHandler(sys.stdout)
@@ -27,36 +28,44 @@
2728
CORS(app)
2829
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
2930

30-
## Add filter to remove color-encoding from logs e.g. "[37mGET / HTTP/1.1 [0m" 200 -
31+
# Add filter to remove color-encoding from logs e.g. "[37mGET / HTTP/1.1 [0m" 200 -
32+
33+
3134
class NoEscape(logging.Filter):
3235
def __init__(self):
3336
self.regex = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]')
37+
3438
def strip_esc(self, s):
35-
try: # string-like
36-
return self.regex.sub('',s)
37-
except: # non-string-like
39+
try: # string-like
40+
return self.regex.sub('', s)
41+
except: # non-string-like
3842
return s
43+
3944
def filter(self, record):
4045
record.msg = self.strip_esc(record.msg)
4146
if type(record.args) is tuple:
4247
record.args = tuple(map(self.strip_esc, record.args))
4348
return 1
4449

45-
remove_color_filter =NoEscape()
50+
51+
remove_color_filter = NoEscape()
4652
logger.addFilter(remove_color_filter)
4753

54+
4855
@tracer.wrap()
4956
@app.route('/')
5057
def hello():
5158
logger.info("home url for ads called")
5259
return Response({'Hello from Advertisements!': 'world'}, mimetype='application/json')
5360

61+
5462
@tracer.wrap()
5563
@app.route('/banners/<path:banner>')
5664
def banner_image(banner):
5765
logger.info(f"attempting to grab banner at {banner}")
5866
return send_from_directory('ads', banner)
5967

68+
6069
@tracer.wrap()
6170
@app.route('/weighted-banners/<float:weight>')
6271
def weighted_image(weight):
@@ -66,6 +75,7 @@ def weighted_image(weight):
6675
if ad.weight < weight:
6776
return jsonify(ad.serialize())
6877

78+
6979
@tracer.wrap()
7080
@app.route('/ads', methods=['GET', 'POST'])
7181
def status():
@@ -90,29 +100,29 @@ def status():
90100
err = jsonify({'error': 'Internal Server Error'})
91101
err.status_code = 500
92102
return err
93-
103+
94104
else:
95105

96-
try:
97-
advertisements = Advertisement.query.all()
98-
logger.info(f"Total advertisements available: {len(advertisements)}")
99-
return jsonify([b.serialize() for b in advertisements])
106+
try:
107+
advertisements = Advertisement.query.all()
108+
logger.info(
109+
f"Total advertisements available: {len(advertisements)}")
110+
return jsonify([b.serialize() for b in advertisements])
100111

101-
except:
102-
logger.error("An error occurred while getting ad.")
103-
err = jsonify({'error': 'Internal Server Error'})
104-
err.status_code = 500
105-
return err
106-
112+
except:
113+
logger.error("An error occurred while getting ad.")
114+
err = jsonify({'error': 'Internal Server Error'})
115+
err.status_code = 500
116+
return err
107117

108118
elif flask_request.method == 'POST':
109119

110120
try:
111121
# create a new advertisement with random name and value
112122
advertisements_count = len(Advertisement.query.all())
113123
new_advertisement = Advertisement('Advertisement ' + str(advertisements_count + 1),
114-
'/',
115-
random.randint(10,500))
124+
'/',
125+
random.randint(10, 500))
116126
logger.info(f"Adding advertisement {new_advertisement}")
117127
db.session.add(new_advertisement)
118128
db.session.commit()
@@ -130,4 +140,4 @@ def status():
130140
else:
131141
err = jsonify({'error': 'Invalid request method'})
132142
err.status_code = 405
133-
return err
143+
return err

services/ads/python/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
certifi==2020.11.8
22
chardet==3.0.4
33
click==7.1.2
4-
ddtrace==1.7.2
4+
ddtrace==2.10.4
55
Flask==1.1.2
66
Flask-Cors==3.0.10
77
Flask-SQLAlchemy==2.4.4

0 commit comments

Comments
 (0)