From 1f7c1e0b4f1a82db2ab4141d99c1573275bad840 Mon Sep 17 00:00:00 2001 From: Philippe GUEMKAM Date: Sat, 10 Aug 2024 16:52:56 +0200 Subject: [PATCH] Logs auto instrumentation --- Dockerfile | 14 +++-- app/__init__.py | 139 ++++++++++++++++++++++++------------------------ 2 files changed, 79 insertions(+), 74 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8d152ca..4f501aa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.8 +FROM python:3.10 WORKDIR /app @@ -11,7 +11,7 @@ COPY . /app/ RUN pip install --no-cache-dir -r requirements.txt # Install OpenTelemetry dependencies -RUN pip install opentelemetry-distro opentelemetry-exporter-otlp opentelemetry-instrumentation-flask +RUN pip install opentelemetry-api opentelemetry-distro opentelemetry-exporter-otlp opentelemetry-instrumentation-flask RUN opentelemetry-bootstrap -a install # Make sure entrypoint.sh is executable @@ -19,14 +19,18 @@ RUN chmod 755 entrypoint.sh EXPOSE 5000 -# Set environment variables for OpenTelemetry +# Set environment variables for OpenTelemetry (https://opentelemetry-python-contrib.readthedocs.io/en/latest/instrumentation/logging/logging.html) ENV OTEL_SERVICE_NAME=sandbox-provisioner-${PROFILE} -ENV OTEL_LOGS_EXPORTER=otlp,console + ENV OTEL_PYTHON_LOG_CORRELATION=true ENV OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true -ENV OTEL_LOG_LEVEL="DEBUG" +ENV OTEL_PYHTON_LOG_LEVEL=debug + +ENV OTEL_LOGS_EXPORTER=otlp + ENV OTEL_TRACES_EXPORTER=otlp ENV OTEL_METRICS_EXPORTER=otlp + ENV OTEL_EXPORTER_OTLP_ENDPOINT=http://otelcol-opentelemetry-collector.monitoring.svc.cluster.local:4317 # Set entrypoint diff --git a/app/__init__.py b/app/__init__.py index 84939f0..cc05560 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,6 +1,8 @@ import os import logging +from opentelemetry import trace + from flask import Flask, request from app.utils import create_keycloak_user, apply_k8s_config, delete_keycloak_user, delete_k8s_namespace, \ @@ -8,99 +10,98 @@ app = Flask(__name__) logger = logging.getLogger(__name__) +# logging.basicConfig(level=logging.DEBUG) +tracer = trace.get_tracer_provider().get_tracer(__name__) +with tracer.start_as_current_span("provisioner-flask-endpoint"): + logger.info("Provisioning flask endpoint.") + @app.route('/') + def home(): + return "Hello" -@app.route('/') -def home(): - return "Hello" - - -@app.route('/provisioner', methods=['POST']) -def provisioner(): - token = request.headers.get('Authorization') - expected_token = os.environ.get('VERIFICATION_TOKEN') + @app.route('/provisioner', methods=['POST']) + def provisioner(): + token = request.headers.get('Authorization') - if token != expected_token: - return {'message': 'Please submit a valid token'}, 401 + expected_token = os.environ.get('VERIFICATION_TOKEN') - data = request.get_json() - email = data.get('email') - full_name = data.get('full_name') + if token != expected_token: + return {'message': 'Please submit a valid token'}, 401 - username = None + data = request.get_json() + email = data.get('email') + full_name = data.get('full_name') - if not email: + username = None - if not full_name: + if not email and not full_name: return {'message': 'Email address and full name are missing'}, 400 - username = make_username(email, full_name) + username = make_username(email, full_name) + logger.info(f"will attempt to create sandbox with username : {username}") - print(username) + user_data = create_keycloak_user(username, email) - user_data = create_keycloak_user(username, email) + if user_data == "CREATED": + return {'message': "USER ALREADY EXIST"}, 500 - if user_data == "CREATED": - return {'message': "USER ALREADY EXIST"}, 500 + user_id, password = user_data - user_id, password = user_data - - try: - apply_k8s_config(username, user_id) - except: - delete_keycloak_user(username) - return {'message': "Can't create k8s user"}, 500 + try: + apply_k8s_config(username, user_id) + except: + delete_keycloak_user(username) + return {'message': "Can't create k8s user"}, 500 - try: - create_grafana_user(username, email, password) - except: - delete_keycloak_user(username) - delete_k8s_namespace(username) - return {'message': "Can't create grafana user"}, 500 + try: + create_grafana_user(username, email, password) + except: + delete_keycloak_user(username) + delete_k8s_namespace(username) + return {'message': "Can't create grafana user"}, 500 - return { - 'message': 'User has been successfully created', - 'user_id': user_id, - 'password': password, - 'username': username - } + return { + 'message': 'User has been successfully created', + 'user_id': user_id, + 'password': password, + 'username': username + } -@app.route('/provisioner', methods=['DELETE']) -def provisioner_clean(): - token = request.headers.get('Authorization') + @app.route('/provisioner', methods=['DELETE']) + def provisioner_clean(): + token = request.headers.get('Authorization') - expected_token = os.environ.get('VERIFICATION_TOKEN') + expected_token = os.environ.get('VERIFICATION_TOKEN') - if token != expected_token: - return {'message': 'Please submit a valid token'}, 401 + if token != expected_token: + return {'message': 'Please submit a valid token'}, 401 - data = request.get_json() - email = data.get("email") - full_name = data.get('full_name') + data = request.get_json() + email = data.get("email") + full_name = data.get('full_name') - if not email: - if not full_name: + if not email and not full_name: return {'message': 'Email address and full name are missing'}, 400 - usernames = make_usernames(email, full_name) - - for username in usernames: - try: - delete_k8s_namespace(username) - user_id = delete_keycloak_user(username) - delete_grafana_user(username) - return { - 'message': 'User has been deleted successfully', - 'user_id': user_id, - 'username': username - } - except Exception as e: - logger.error(f"Failed to delete with this username : {username} : {e}", exc_info=True) - - return {"Failed to delete user and related resources, it may not exist."}, 500 - + usernames = make_usernames(email, full_name) + + for username in usernames: + try: + logger.info(f"Attempting to delete sandbox with username : {username}") + delete_k8s_namespace(username) + user_id = delete_keycloak_user(username) + delete_grafana_user(username) + return { + 'message': 'User has been deleted successfully', + 'user_id': user_id, + 'username': username + } + except Exception as e: + logger.error(f"Failed to delete with this username : {username} : {e}", exc_info=True) + + return {"Failed to delete user and related resources, it may not exist."}, 500 if __name__ == '__main__': app.run()