diff --git a/docker-compose.yml b/docker-compose.yml index 06d15bbe..d9c6b4e1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -100,6 +100,8 @@ services: - DD_TRACE_ANALYTICS_ENABLED=true - DD_PROFILING_ENABLED=true - DD_APPSEC_ENABLED=true + - DD_VERSION=7 + - DD_ENV=dev build: context: ./services/ads/python command: flask run --port=${ADS_PORT} --host=0.0.0.0 # If using any other port besides the default 9292, overriding the CMD is required @@ -109,6 +111,8 @@ services: - "${ADS_PORT}:${ADS_PORT}" networks: - storedog-net + labels: + com.datadoghq.ad.logs: '[{"source": "python", "service": "ads"}]' discounts: depends_on: - postgres @@ -124,6 +128,8 @@ services: - DD_TRACE_ANALYTICS_ENABLED=true - DD_PROFILING_ENABLED=true - DD_APPSEC_ENABLED=true + - DD_VERSION=7 + - DD_ENV=dev build: context: ./services/discounts command: ./my-wrapper-script.sh ${DISCOUNTS_PORT} @@ -134,6 +140,8 @@ services: - "22:22" networks: - storedog-net + labels: + com.datadoghq.ad.logs: '[{"source": "python", "service": "discounts"}]' auth: depends_on: - postgres @@ -190,6 +198,8 @@ services: - "3030:8080" networks: - storedog-net + labels: + com.datadoghq.ad.logs: '[{"source": "java", "service": "ads-java"}]' attackbox: build: context: ./services/attackbox diff --git a/services/ads/python/ads.py b/services/ads/python/ads.py index 57575526..ef127883 100644 --- a/services/ads/python/ads.py +++ b/services/ads/python/ads.py @@ -9,39 +9,54 @@ from bootstrap import create_app from models import Advertisement, db +from ddtrace import patch; patch(logging=True) +import logging +from ddtrace import tracer + +FORMAT = ('%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] ' + '[dd.service=%(dd.service)s dd.env=%(dd.env)s dd.version=%(dd.version)s dd.trace_id=%(dd.trace_id)s dd.span_id=%(dd.span_id)s] ' + '- %(message)s') +logging.basicConfig(format=FORMAT) +log = logging.getLogger(__name__) +log.level = logging.INFO + app = create_app() CORS(app) app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +@tracer.wrap() @app.route('/') def hello(): - app.logger.info("home url for ads called") + log.info("home url for ads called") return Response({'Hello from Advertisements!': 'world'}, mimetype='application/json') +@tracer.wrap() @app.route('/banners/') def banner_image(banner): - app.logger.info(f"attempting to grab banner at {banner}") + log.info(f"attempting to grab banner at {banner}") return send_from_directory('ads', banner) +@tracer.wrap() @app.route('/weighted-banners/') def weighted_image(weight): - app.logger.info(f"attempting to grab banner weight of less than {weight}") + log.info(f"attempting to grab banner weight of less than {weight}") advertisements = Advertisement.query.all() for ad in advertisements: if ad.weight < weight: return jsonify(ad.serialize()) +@tracer.wrap() @app.route('/ads', methods=['GET', 'POST']) def status(): if flask_request.method == 'GET': try: advertisements = Advertisement.query.all() - app.logger.info(f"Total advertisements available: {len(advertisements)}") + log.info(f"Total advertisements available: {len(advertisements)}") return jsonify([b.serialize() for b in advertisements]) except: - app.logger.error("An error occurred while getting ad.") + log.error("An error occurred while getting ad.") err = jsonify({'error': 'Internal Server Error'}) err.status_code = 500 return err @@ -54,7 +69,7 @@ def status(): new_advertisement = Advertisement('Advertisement ' + str(discounts_count + 1), '/', random.randint(10,500)) - app.logger.info(f"Adding advertisement {new_advertisement}") + log.info(f"Adding advertisement {new_advertisement}") db.session.add(new_advertisement) db.session.commit() advertisements = Advertisement.query.all() @@ -63,7 +78,7 @@ def status(): except: - app.logger.error("An error occurred while creating a new ad.") + log.error("An error occurred while creating a new ad.") err = jsonify({'error': 'Internal Server Error'}) err.status_code = 500 return err diff --git a/services/ads/python/build.sh b/services/ads/python/build.sh deleted file mode 100755 index 3a5bbf20..00000000 --- a/services/ads/python/build.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# Set bash strict mode so we insta-fail on any errors -# -e: Exit immediately if a command has non-zero exit code, i.e. fails somehow. -# Otherwise bash is like a Python program that just swallows exceptions. -# -u: Exit with error message if code uses an undefined environment variable, -# instead of silently continuing with an empty string. -# -o pipefail: Like -e, except for piped commands. -set -euo pipefail - -# Enable Docker Buildkit -export DOCKER_BUILDKIT=1 - -# Build and tag image -docker image build --progress=plain --tag ddtraining/advertisements-fixed:latest . diff --git a/services/discounts/build.sh b/services/discounts/build.sh deleted file mode 100755 index cc5982ae..00000000 --- a/services/discounts/build.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# Set bash strict mode so we insta-fail on any errors -# -e: Exit immediately if a command has non-zero exit code, i.e. fails somehow. -# Otherwise bash is like a Python program that just swallows exceptions. -# -u: Exit with error message if code uses an undefined environment variable, -# instead of silently continuing with an empty string. -# -o pipefail: Like -e, except for piped commands. -set -euo pipefail - -# Enable Docker Buildkit -export DOCKER_BUILDKIT=1 - -# Build and tag image -docker image build --progress=plain --tag ddtraining/discounts-fixed:latest . diff --git a/services/discounts/discounts.py b/services/discounts/discounts.py index 406b0627..77645ae7 100644 --- a/services/discounts/discounts.py +++ b/services/discounts/discounts.py @@ -16,33 +16,46 @@ from bootstrap import create_app from models import Discount, DiscountType, db +from ddtrace import patch; patch(logging=True) +import logging +from ddtrace import tracer + +FORMAT = ('%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] ' + '[dd.service=%(dd.service)s dd.env=%(dd.env)s dd.version=%(dd.version)s dd.trace_id=%(dd.trace_id)s dd.span_id=%(dd.span_id)s] ' + '- %(message)s') +logging.basicConfig(format=FORMAT) +log = logging.getLogger(__name__) +log.level = logging.INFO + app = create_app() CORS(app) app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # Hello world +@tracer.wrap() @app.route('/') def hello(): return Response({'Hello from Discounts!': 'world'}, mimetype='application/json') +@tracer.wrap() @app.route('/discount', methods=['GET', 'POST']) def status(): if flask_request.method == 'GET': try: discounts = Discount.query.all() - app.logger.info(f"Discounts available: {len(discounts)}") + log.info(f"Discounts available: {len(discounts)}") influencer_count = 0 for discount in discounts: if discount.discount_type.influencer: influencer_count += 1 - app.logger.info(f"Total of {influencer_count} influencer specific discounts as of this request") + log.info(f"Total of {influencer_count} influencer specific discounts as of this request") return jsonify([b.serialize() for b in discounts]) except: - app.logger.error("An error occurred while getting discounts.") + log.error("An error occurred while getting discounts.") err = jsonify({'error': 'Internal Server Error'}) err.status_code = 500 return err @@ -59,7 +72,7 @@ def status(): words.get_random(random.randint(2,4)), random.randint(10,500), new_discount_type) - app.logger.info(f"Adding discount {new_discount}") + log.info(f"Adding discount {new_discount}") db.session.add(new_discount) db.session.commit() discounts = Discount.query.all() @@ -67,7 +80,7 @@ def status(): return jsonify([b.serialize() for b in discounts]) except: - app.logger.error("An error occurred while creating a new discount.") + log.error("An error occurred while creating a new discount.") err = jsonify({'error': 'Internal Server Error'}) err.status_code = 500 return err