Skip to content

Commit b844376

Browse files
committed
Merge branch 'feature/logger' into develop
2 parents da293d8 + b0dc616 commit b844376

File tree

10 files changed

+69
-36
lines changed

10 files changed

+69
-36
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Test the image:
2020

2121
Push to Kubernetes:
2222

23-
kubectl create -f service.yaml
23+
kubectl apply -f service.yaml
2424

2525

2626
## How to contrib

project/__init__.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# encoding: utf-8
22

3+
import logging
34
import os
45

56
from flasgger import Swagger
@@ -9,13 +10,17 @@
910

1011
from project.config import CONFIG
1112
from pyms.healthcheck import healthcheck_blueprint
13+
from pyms.logger import CustomJsonFormatter
1214
from pyms.models import db
1315
from pyms.tracer.main import TracerModule
1416

1517
__author__ = "Alberto Vara"
1618
__email__ = "[email protected]"
1719
__version__ = "0.0.1"
1820

21+
logger = logging.getLogger('jaeger_tracing')
22+
logger.setLevel(logging.DEBUG)
23+
1924
ENVIRONMENT = os.environ.get("ENVIRONMENT", "default")
2025

2126
SWAGGER_CONFIG = {
@@ -107,10 +112,19 @@ def create_app():
107112
app.register_blueprint(views_blueprint)
108113
app.register_blueprint(healthcheck_blueprint)
109114

115+
# Inject Modules
110116
# Inject Modules
111117
if not app.config["TESTING"] and not app.config["DEBUG"]:
112-
injector = Injector([TracerModule(app)])
118+
log_handler = logging.StreamHandler()
119+
formatter = CustomJsonFormatter('(timestamp) (level) (name) (module) (funcName) (lineno) (message)')
120+
formatter.add_service_name(app.config["APP_NAME"])
121+
tracer = TracerModule(app)
122+
injector = Injector([tracer])
113123
FlaskInjector(app=app, injector=injector)
124+
formatter.add_trace_span(tracer.tracer)
125+
log_handler.setFormatter(formatter)
126+
app.logger.addHandler(log_handler)
127+
app.logger.setLevel(logging.INFO)
114128

115129
with app.test_request_context():
116130
db.create_all()

project/tests/test_views.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ def test_home(self):
2525
response = self.client.get('/')
2626
self.assertEqual(response.status_code, 404)
2727

28+
def test_healthcheck(self):
29+
response = self.client.get('/healthcheck')
30+
self.assertEqual(response.status_code, 200)
31+
2832
def test_list_view(self):
2933
response = self.client.get('{base_url}/'.format(base_url=self.base_url))
3034
self.assertEqual(response.status_code, 200)

project/views/views.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# encoding: utf-8
22
from __future__ import absolute_import, print_function, unicode_literals
33

4-
from flask import request, jsonify
4+
from flask import request, jsonify, current_app
55

66
from pyms.models import db
77
from project.models.models import Colors
@@ -57,7 +57,7 @@ def list_view():
5757
]
5858
}]
5959
"""
60-
60+
current_app.logger.info("Return all color list")
6161
query = Colors.query.all()
6262

6363
return jsonify([i.serialize for i in query])
@@ -107,6 +107,7 @@ def create_view():
107107
]
108108
}
109109
"""
110+
current_app.logger.info("Create color")
110111
color = Colors(name=request.form["name"])
111112
db.session.add(color)
112113
db.session.commit()

pyms/healthcheck/healthcheck.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,6 @@
1-
import opentracing
2-
import requests
3-
from flask_opentracing import FlaskTracer
4-
51
from pyms.healthcheck import healthcheck_blueprint
62

73

84
@healthcheck_blueprint.route('/healthcheck', methods=['GET'])
9-
def healthcheck(tracer: FlaskTracer):
10-
span = tracer.get_span()
11-
headers = {}
12-
tracer._tracer.inject(span, opentracing.Format.HTTP_HEADERS, headers)
13-
result = requests.post(url="http://localhost:8081/oauth/login", data={
14-
"username": "test",
15-
"password": "1234"
16-
}, headers=headers)
17-
return result.content
5+
def healthcheck():
6+
return "OK"

pyms/logger/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from pyms.logger.logger import CustomJsonFormatter

pyms/logger/logger.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import datetime
2+
3+
import opentracing
4+
from flask_opentracing import FlaskTracer
5+
from pythonjsonlogger import jsonlogger
6+
7+
8+
class CustomJsonFormatter(jsonlogger.JsonFormatter):
9+
service_name = ""
10+
tracer = ""
11+
12+
def add_fields(self, log_record, record, message_dict):
13+
super(CustomJsonFormatter, self).add_fields(log_record, record, message_dict)
14+
if not log_record.get('timestamp'):
15+
# this doesn't use record.created, so it is slightly off
16+
now = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ')
17+
log_record['timestamp'] = now
18+
if log_record.get('level'):
19+
log_record['severity'] = log_record['level'].upper()
20+
else:
21+
log_record['severity'] = record.levelname
22+
log_record["service"] = self.service_name
23+
24+
# Add traces
25+
if self.tracer:
26+
span = self.tracer.get_span()
27+
headers = {}
28+
self.tracer._tracer.inject(span, opentracing.Format.HTTP_HEADERS, headers)
29+
log_record["trace"] = headers.get('X-B3-TraceId', '')
30+
log_record["span"] = headers.get('X-B3-SpanId', '')
31+
log_record["parent"] = headers.get('X-B3-ParentSpanId', '')
32+
33+
def add_service_name(self, project_name):
34+
self.service_name = project_name.lower()
35+
36+
def add_trace_span(self, tracer: FlaskTracer):
37+
self.tracer = tracer

pyms/tracer/main.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,18 @@ def init_jaeger_tracer(service_name='your-app-name'):
1010
:return: opentracing.Tracer
1111
"""
1212
config = Config(config={
13+
# 'propagation': 'b3',
1314
'sampler': {'type': 'const', 'param': 1}, 'logging': True,
1415
}, service_name=service_name)
1516
return config.initialize_tracer()
1617

1718

1819
class TracerModule(Module):
20+
tracer = ""
21+
1922
def __init__(self, app):
2023
self.app = app
2124

2225
def configure(self, binder):
23-
tracer = init_jaeger_tracer(self.app.config["APP_NAME"])
24-
binder.bind(FlaskTracer, to=FlaskTracer(tracer, True, self.app))
26+
self.tracer = FlaskTracer(init_jaeger_tracer(self.app.config["APP_NAME"]), True, self.app)
27+
binder.bind(FlaskTracer, to=self.tracer)

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ Flask-Injector==0.10.1
55
Flask-OpenTracing==0.1.8
66
Flask-Script==2.0.6
77
Flask-SQLAlchemy==2.3.2
8-
Flask-Testing==0.7.1
98
SQLAlchemy==1.2.5
9+
python-json-logger==0.1.8
1010
requests==2.18.4

service.yaml

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# interno
21
kind: Service
32
apiVersion: v1
43
metadata:
@@ -11,21 +10,6 @@ spec:
1110
port: 80
1211
targetPort: 5000
1312
---
14-
# externo
15-
apiVersion: v1
16-
kind: Service
17-
metadata:
18-
name: template-external
19-
spec:
20-
ports:
21-
- port: 80
22-
targetPort: 5000
23-
selector:
24-
app: template
25-
type: LoadBalancer
26-
loadBalancerSourceRanges:
27-
- 62.82.24.134/32
28-
---
2913
apiVersion: extensions/v1beta1
3014
kind: Deployment
3115
metadata:

0 commit comments

Comments
 (0)