11from flask import Flask , request
2- import sys
32
43from elasticapm .contrib .flask import ElasticAPM
5- import elasticapm
6- import logging
7- import redis
4+ import elasticapm
5+ import logging
6+ import redis
87import os
98import ecs_logging
109import datetime
1110import random
12- import time
11+ import time
1312
14- delay_time = os .environ .get (' TOGGLE_SERVICE_DELAY' )
15- if delay_time is "" or delay_time is None :
13+ delay_time = os .environ .get (" TOGGLE_SERVICE_DELAY" )
14+ if delay_time == "" or delay_time is None :
1615 delay_time = 0
1716delay_time = int (delay_time )
1817
19- redis_host = os .environ .get (' REDIS_HOST' ) or ' localhost'
20- redis_port = os .environ .get (' REDIS_PORT' ) or 6379
18+ redis_host = os .environ .get (" REDIS_HOST" ) or " localhost"
19+ redis_port = os .environ .get (" REDIS_PORT" ) or 6379
2120
22- application_port = os .environ .get (' APPLICATION_PORT' ) or 5000
21+ application_port = os .environ .get (" APPLICATION_PORT" ) or 5000
2322
24- service_name = os .environ .get (' ELASTIC_APM_SERVICE_NAME' ) or ' python-favorite-elastic-manual'
25- secret_token = os .environ .get (' ELASTIC_APM_SECRET_TOKEN' )
23+ service_name = os .environ .get (" ELASTIC_APM_SERVICE_NAME" ) or " python-favorite-elastic-manual"
24+ secret_token = os .environ .get (" ELASTIC_APM_SECRET_TOKEN" )
2625# fail if secret token not set
2726if secret_token is None :
28- raise Exception (' ELASTIC_APM_SECRET_TOKEN environment variable not set' )
29- server_url = os .environ .get (' ELASTIC_APM_SERVER_URL' )
27+ raise Exception (" ELASTIC_APM_SECRET_TOKEN environment variable not set" )
28+ server_url = os .environ .get (" ELASTIC_APM_SERVER_URL" )
3029# fail if server url not set
3130if server_url is None :
32- raise Exception (' ELASTIC_APM_SERVER_URL environment variable not set' )
33- environment = os .environ .get (' ENVIRONMENT' ) or ' dev'
31+ raise Exception (" ELASTIC_APM_SERVER_URL environment variable not set" )
32+ environment = os .environ .get (" ENVIRONMENT" ) or " dev"
3433
3534
3635app = Flask (__name__ )
37- app .config [' ELASTIC_APM' ] = {
38- ' SERVICE_NAME' : service_name ,
39- ' SECRET_TOKEN' : secret_token ,
40- ' SERVER_URL' : server_url ,
41- ' ENVIRONMENT' : environment
36+ app .config [" ELASTIC_APM" ] = {
37+ " SERVICE_NAME" : service_name ,
38+ " SECRET_TOKEN" : secret_token ,
39+ " SERVER_URL" : server_url ,
40+ " ENVIRONMENT" : environment ,
4241}
4342apm = ElasticAPM (app )
4443elasticapm .instrument ()
5150handler = logging .StreamHandler ()
5251handler .setFormatter (ecs_logging .StdlibFormatter ())
5352logger .addHandler (handler )
54- logging .getLogger (' werkzeug' ).setLevel (logging .ERROR )
55- logging .getLogger (' werkzeug' ).addHandler (handler )
53+ logging .getLogger (" werkzeug" ).setLevel (logging .ERROR )
54+ logging .getLogger (" werkzeug" ).addHandler (handler )
5655
5756r = redis .Redis (host = redis_host , port = redis_port , decode_responses = True )
5857
@@ -62,56 +61,67 @@ def after_request(response):
6261 print (response )
6362 # timestamp in iso8601
6463 timestamp = datetime .datetime .utcnow ().isoformat ()
65- logger .info ('%s %s %s %s %s %s' , timestamp , request .remote_addr , request .method , request .scheme , request .full_path , response .status , extra = {
66- "event.dataset" : "favorite.log" ,
67- "http.request.method" : request .method ,
68- "http.request.path" : request .full_path ,
69- "source.ip" : request .remote_addr ,
70- "http.response.status_code" : response .status
71- })
64+ logger .info (
65+ "%s %s %s %s %s %s" ,
66+ timestamp ,
67+ request .remote_addr ,
68+ request .method ,
69+ request .scheme ,
70+ request .full_path ,
71+ response .status ,
72+ extra = {
73+ "event.dataset" : "favorite.log" ,
74+ "http.request.method" : request .method ,
75+ "http.request.path" : request .full_path ,
76+ "source.ip" : request .remote_addr ,
77+ "http.response.status_code" : response .status ,
78+ },
79+ )
7280 return response
7381
74- @app .route ('/' )
82+
83+ @app .route ("/" )
7584def hello ():
76- logger .info ('Main request successfull' )
77- return 'Hello World!'
85+ logger .info ("Main request successfull" )
86+ return "Hello World!"
87+
7888
79- @app .route (' /favorites' , methods = [' GET' ])
89+ @app .route (" /favorites" , methods = [" GET" ])
8090def get_favorite_movies ():
8191 # add artificial delay if enabled
8292 if delay_time > 0 :
83- time .sleep (max (0 , random .gauss (delay_time / 1000 , delay_time / 1000 / 10 )))
93+ time .sleep (max (0 , random .gauss (delay_time / 1000 , delay_time / 1000 / 10 )))
8494
85- user_id = str (request .args .get ('user_id' ))
95+ user_id = str (request .args .get ("user_id" ))
96+
97+ logger .info (
98+ "Getting favorites for user " + user_id ,
99+ extra = {"event.dataset" : "favorite.log" , "user.id" : request .args .get ("user_id" )},
100+ )
86101
87- logger .info ('Getting favorites for user ' + user_id , extra = {
88- "event.dataset" : "favorite.log" ,
89- "user.id" : request .args .get ('user_id' )
90- })
91-
92102 favorites = r .smembers (user_id )
93-
103+
94104 # convert to list
95105 favorites = list (favorites )
96- logger .info ('User ' + user_id + ' has favorites: ' + str ( favorites ), extra = {
97- "event.dataset" : "favorite.log" ,
98- " user.id" : user_id
99- } )
100- return { "favorites" : favorites }
106+ logger .info (
107+ "User " + user_id + " has favorites : " + str ( favorites ) ,
108+ extra = { "event.dataset" : "favorite.log" , " user.id" : user_id },
109+ )
110+ return {"favorites" : favorites }
101111
102- @app .route ('/favorites' , methods = ['POST' ])
112+
113+ @app .route ("/favorites" , methods = ["POST" ])
103114def add_favorite_movie ():
104115 # add artificial delay if enabled
105116 if delay_time > 0 :
106- time .sleep (max (0 , random .gauss (delay_time / 1000 , delay_time / 1000 / 10 )))
117+ time .sleep (max (0 , random .gauss (delay_time / 1000 , delay_time / 1000 / 10 )))
107118
108- user_id = str (request .args .get (' user_id' ))
109- movie_id = request .json ['id' ]
119+ user_id = str (request .args .get (" user_id" ))
120+ movie_id = request .json ["id" ]
110121
111- logger .info ('Adding or removing favorites for user ' + user_id , extra = {
112- "event.dataset" : "favorite.log" ,
113- "user.id" : user_id
114- })
122+ logger .info (
123+ "Adding or removing favorites for user " + user_id , extra = {"event.dataset" : "favorite.log" , "user.id" : user_id }
124+ )
115125
116126 # add movie to the user's favorite list. If it already exists, remove it from the list
117127 redisRespone = r .srem (user_id , int (movie_id ))
@@ -122,32 +132,32 @@ def add_favorite_movie():
122132 # convert to list
123133 favorites = list (favorites )
124134
125- logger .info ('User ' + user_id + ' has favorites: ' + str ( favorites ), extra = {
126- "event.dataset" : "favorite.log" ,
127- " user.id" : user_id
128- } )
135+ logger .info (
136+ "User " + user_id + " has favorites : " + str ( favorites ) ,
137+ extra = { "event.dataset" : "favorite.log" , " user.id" : user_id },
138+ )
129139
130140 # if enabled, in 50% of the cases, sleep for 2 seconds
131- sleep_time = os .getenv (' TOGGLE_CANARY_DELAY' )
132- if sleep_time is None or sleep_time == "" :
141+ sleep_time = os .getenv (" TOGGLE_CANARY_DELAY" )
142+ if sleep_time is None or sleep_time == "" :
133143 sleep_time = 0
134-
144+
135145 sleep_time = int (sleep_time )
136146
137147 if sleep_time > 0 and random .random () < 0.5 :
138- time .sleep (max (0 , random .gauss (sleep_time / 1000 , sleep_time / 1000 / 10 )))
148+ time .sleep (max (0 , random .gauss (sleep_time / 1000 , sleep_time / 1000 / 10 )))
139149 # add label to transaction
140- logger .info (' Canary enabled' )
150+ logger .info (" Canary enabled" )
141151 elasticapm .label (quiz_solution = "correlations" )
142152 elasticapm .label (canary = "test-new-feature" )
143- if ( random .random () < float (os .getenv (' TOGGLE_CANARY_FAILURE' , 0 ) )):
153+ if random .random () < float (os .getenv (" TOGGLE_CANARY_FAILURE" , 0 )):
144154 # throw an exception in 50% of the cases
145- logger .error (' Something went wrong' )
146- raise Exception (' Something went wrong' )
147-
148- return { "favorites" : favorites }
155+ logger .error (" Something went wrong" )
156+ raise Exception (" Something went wrong" )
157+
158+ return {"favorites" : favorites }
149159
150160
151- logger .info (' App startup' )
152- app .run (host = ' 0.0.0.0' , port = application_port )
153- logger .info (' App Stopped' )
161+ logger .info (" App startup" )
162+ app .run (host = " 0.0.0.0" , port = application_port )
163+ logger .info (" App Stopped" )
0 commit comments