diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a901ba9cad..76329c7171 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,4 @@ -# This file was automatically copied from notifications-utils@99.8.0 +# This file was automatically copied from notifications-utils@100.1.0 repos: - repo: https://github.com/pre-commit/pre-commit-hooks diff --git a/app/__init__.py b/app/__init__.py index f2ff0acc2f..b4bd9f74c3 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -26,6 +26,7 @@ from notifications_python_client.errors import HTTPError from notifications_utils import request_helper from notifications_utils.asset_fingerprinter import asset_fingerprinter +from notifications_utils.clients.otel.otel_client import init_otel_app from notifications_utils.eventlet import EventletTimeout from notifications_utils.formatters import ( formatted_list, @@ -179,6 +180,7 @@ def create_app(application): asset_fingerprinter._asset_root = application.config["ASSET_PATH"] init_app(application) + init_otel_app(application) if "extensions" not in application.jinja_options: application.jinja_options["extensions"] = [] diff --git a/app/config.py b/app/config.py index b2b1b38b2a..ea6e0fb721 100644 --- a/app/config.py +++ b/app/config.py @@ -1,8 +1,10 @@ import json import os +from notifications_utils.config import BaseConfig -class Config: + +class Config(BaseConfig): ADMIN_CLIENT_SECRET = os.environ.get("ADMIN_CLIENT_SECRET") API_HOST_NAME = os.environ.get("API_HOST_NAME") SECRET_KEY = os.environ.get("SECRET_KEY") @@ -15,6 +17,8 @@ class Config: TEMPLATE_PREVIEW_API_HOST = os.environ.get("TEMPLATE_PREVIEW_API_HOST", "http://localhost:6013") TEMPLATE_PREVIEW_API_KEY = os.environ.get("TEMPLATE_PREVIEW_API_KEY", "my-secret-key") + OTEL_EXPORT_TYPE = os.environ.get("OTEL_EXPORT_TYPE", "otlp").lower().strip() + # Logging DEBUG = False NOTIFY_REQUEST_LOG_LEVEL = os.getenv("NOTIFY_REQUEST_LOG_LEVEL", "INFO") diff --git a/requirements.in b/requirements.in index 2c423ef003..4595aedddf 100644 --- a/requirements.in +++ b/requirements.in @@ -17,7 +17,8 @@ notifications-python-client==10.0.0 fido2==1.1.3 # Run `make bump-utils` to update to the latest version -notifications-utils @ git+https://github.com/alphagov/notifications-utils.git@99.8.0 +notifications-utils[otel-flask,otel-requests,otel-redis,otel-botocore] @ git+https://github.com/alphagov/notifications-utils.git@c59a85f44ad83ee0d4e4f09499b5b58b5239cf2c +#notifications-utils @ ../notifications-utils govuk-frontend-jinja==3.6.0 diff --git a/requirements.txt b/requirements.txt index 8d07d5e5fa..6203b717b0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -31,6 +31,12 @@ click==8.1.3 # via flask cryptography==44.0.1 # via fido2 +deprecated==1.2.18 + # via + # opentelemetry-api + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-semantic-conventions dnspython==2.6.1 # via eventlet docopt==0.6.2 @@ -57,18 +63,26 @@ flask-wtf==1.2.1 # via -r requirements.in gds-metrics @ git+https://github.com/alphagov/gds_metrics_python.git@6f1840a57b6fb1ee40b7e84f2f18ec229de8aa72 # via -r requirements.in +googleapis-common-protos==1.70.0 + # via + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http govuk-bank-holidays==0.15 # via notifications-utils govuk-frontend-jinja==3.6.0 # via -r requirements.in greenlet==3.2.2 # via eventlet +grpcio==1.73.1 + # via opentelemetry-exporter-otlp-proto-grpc gunicorn==23.0.0 # via notifications-utils humanize==4.4.0 # via -r requirements.in idna==3.7 # via requests +importlib-metadata==8.6.1 + # via opentelemetry-api itsdangerous==2.2.0 # via # flask @@ -102,14 +116,91 @@ mistune==0.8.4 # via notifications-utils notifications-python-client==10.0.0 # via -r requirements.in -notifications-utils @ git+https://github.com/alphagov/notifications-utils.git@a97b36f6a32e7bb917152c8cd716fe65fa15ac9f +notifications-utils @ git+https://github.com/alphagov/notifications-utils.git@c59a85f44ad83ee0d4e4f09499b5b58b5239cf2c # via -r requirements.in openpyxl==3.1.5 # via pyexcel-xlsx +opentelemetry-api==1.33.1 + # via + # opentelemetry-distro + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-instrumentation + # opentelemetry-instrumentation-botocore + # opentelemetry-instrumentation-flask + # opentelemetry-instrumentation-redis + # opentelemetry-instrumentation-requests + # opentelemetry-instrumentation-wsgi + # opentelemetry-processor-baggage + # opentelemetry-propagator-aws-xray + # opentelemetry-sdk + # opentelemetry-semantic-conventions +opentelemetry-distro==0.54b1 + # via notifications-utils +opentelemetry-exporter-otlp==1.33.1 + # via notifications-utils +opentelemetry-exporter-otlp-proto-common==1.33.1 + # via + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http +opentelemetry-exporter-otlp-proto-grpc==1.33.1 + # via opentelemetry-exporter-otlp +opentelemetry-exporter-otlp-proto-http==1.33.1 + # via opentelemetry-exporter-otlp +opentelemetry-instrumentation==0.54b1 + # via + # opentelemetry-distro + # opentelemetry-instrumentation-botocore + # opentelemetry-instrumentation-flask + # opentelemetry-instrumentation-redis + # opentelemetry-instrumentation-requests + # opentelemetry-instrumentation-wsgi +opentelemetry-instrumentation-botocore==0.54b1 + # via notifications-utils +opentelemetry-instrumentation-flask==0.54b1 + # via notifications-utils +opentelemetry-instrumentation-redis==0.54b1 + # via notifications-utils +opentelemetry-instrumentation-requests==0.54b1 + # via notifications-utils +opentelemetry-instrumentation-wsgi==0.54b1 + # via opentelemetry-instrumentation-flask +opentelemetry-processor-baggage==0.54b1 + # via notifications-utils +opentelemetry-propagator-aws-xray==1.0.2 + # via opentelemetry-instrumentation-botocore +opentelemetry-proto==1.33.1 + # via + # opentelemetry-exporter-otlp-proto-common + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http +opentelemetry-sdk==1.33.1 + # via + # opentelemetry-distro + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-processor-baggage +opentelemetry-semantic-conventions==0.54b1 + # via + # opentelemetry-instrumentation + # opentelemetry-instrumentation-botocore + # opentelemetry-instrumentation-flask + # opentelemetry-instrumentation-redis + # opentelemetry-instrumentation-requests + # opentelemetry-instrumentation-wsgi + # opentelemetry-sdk +opentelemetry-util-http==0.54b1 + # via + # opentelemetry-instrumentation-flask + # opentelemetry-instrumentation-requests + # opentelemetry-instrumentation-wsgi ordered-set==4.1.0 # via notifications-utils packaging==23.1 - # via gunicorn + # via + # gunicorn + # opentelemetry-instrumentation + # opentelemetry-instrumentation-flask phonenumbers==8.13.50 # via notifications-utils pillow==11.2.1 @@ -118,6 +209,10 @@ prometheus-client==0.15.0 # via # -r requirements.in # gds-metrics +protobuf==5.29.5 + # via + # googleapis-common-protos + # opentelemetry-proto pycparser==2.21 # via cffi pyexcel==0.7.1 @@ -141,8 +236,10 @@ pyjwt==2.4.0 # via notifications-python-client pypdf==3.13.0 # via notifications-utils -python-dateutil==2.8.2 - # via botocore +python-dateutil==2.9.0.post0 + # via + # botocore + # notifications-utils python-json-logger==3.3.0 # via notifications-utils pytz==2024.2 @@ -156,6 +253,7 @@ requests==2.32.3 # govuk-bank-holidays # notifications-python-client # notifications-utils + # opentelemetry-exporter-otlp-proto-http s3transfer==0.10.1 # via boto3 segno==1.6.1 @@ -170,6 +268,8 @@ statsd==4.0.1 # via notifications-utils texttable==1.6.4 # via pyexcel +typing-extensions==4.14.0 + # via opentelemetry-sdk urllib3==1.26.19 # via # botocore @@ -179,9 +279,17 @@ werkzeug==3.1.3 # via # flask # flask-login +wrapt==1.17.2 + # via + # deprecated + # opentelemetry-instrumentation + # opentelemetry-instrumentation-redis + # opentelemetry-processor-baggage wtforms==3.1.0 # via flask-wtf xlrd==2.0.1 # via pyexcel-xls xlwt==1.3.0 # via pyexcel-xls +zipp==3.23.0 + # via importlib-metadata diff --git a/requirements_for_test.txt b/requirements_for_test.txt index 1447e42616..56ff4c61af 100644 --- a/requirements_for_test.txt +++ b/requirements_for_test.txt @@ -56,6 +56,13 @@ cryptography==44.0.1 # -r requirements.txt # fido2 # moto +deprecated==1.2.18 + # via + # -r requirements.txt + # opentelemetry-api + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-semantic-conventions dnspython==2.6.1 # via # -r requirements.txt @@ -96,6 +103,11 @@ freezegun==1.5.1 # via -r requirements_for_test_common.in gds-metrics @ git+https://github.com/alphagov/gds_metrics_python.git@6f1840a57b6fb1ee40b7e84f2f18ec229de8aa72 # via -r requirements.txt +googleapis-common-protos==1.70.0 + # via + # -r requirements.txt + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http govuk-bank-holidays==0.15 # via # -r requirements.txt @@ -106,6 +118,10 @@ greenlet==3.2.2 # via # -r requirements.txt # eventlet +grpcio==1.73.1 + # via + # -r requirements.txt + # opentelemetry-exporter-otlp-proto-grpc gunicorn==23.0.0 # via # -r requirements.txt @@ -118,6 +134,10 @@ idna==3.7 # via # -r requirements.txt # requests +importlib-metadata==8.6.1 + # via + # -r requirements.txt + # opentelemetry-api iniconfig==2.0.0 # via pytest itsdangerous==2.2.0 @@ -163,12 +183,107 @@ moto==5.1.0 # via -r requirements_for_test.in notifications-python-client==10.0.0 # via -r requirements.txt -notifications-utils @ git+https://github.com/alphagov/notifications-utils.git@a97b36f6a32e7bb917152c8cd716fe65fa15ac9f +notifications-utils @ git+https://github.com/alphagov/notifications-utils.git@c59a85f44ad83ee0d4e4f09499b5b58b5239cf2c # via -r requirements.txt openpyxl==3.1.5 # via # -r requirements.txt # pyexcel-xlsx +opentelemetry-api==1.33.1 + # via + # -r requirements.txt + # opentelemetry-distro + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-instrumentation + # opentelemetry-instrumentation-botocore + # opentelemetry-instrumentation-flask + # opentelemetry-instrumentation-redis + # opentelemetry-instrumentation-requests + # opentelemetry-instrumentation-wsgi + # opentelemetry-processor-baggage + # opentelemetry-propagator-aws-xray + # opentelemetry-sdk + # opentelemetry-semantic-conventions +opentelemetry-distro==0.54b1 + # via + # -r requirements.txt + # notifications-utils +opentelemetry-exporter-otlp==1.33.1 + # via + # -r requirements.txt + # notifications-utils +opentelemetry-exporter-otlp-proto-common==1.33.1 + # via + # -r requirements.txt + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http +opentelemetry-exporter-otlp-proto-grpc==1.33.1 + # via + # -r requirements.txt + # opentelemetry-exporter-otlp +opentelemetry-exporter-otlp-proto-http==1.33.1 + # via + # -r requirements.txt + # opentelemetry-exporter-otlp +opentelemetry-instrumentation==0.54b1 + # via + # -r requirements.txt + # opentelemetry-distro + # opentelemetry-instrumentation-botocore + # opentelemetry-instrumentation-flask + # opentelemetry-instrumentation-redis + # opentelemetry-instrumentation-requests + # opentelemetry-instrumentation-wsgi +opentelemetry-instrumentation-botocore==0.54b1 + # via -r requirements.txt +opentelemetry-instrumentation-flask==0.54b1 + # via -r requirements.txt +opentelemetry-instrumentation-redis==0.54b1 + # via -r requirements.txt +opentelemetry-instrumentation-requests==0.54b1 + # via -r requirements.txt +opentelemetry-instrumentation-wsgi==0.54b1 + # via + # -r requirements.txt + # opentelemetry-instrumentation-flask +opentelemetry-processor-baggage==0.54b1 + # via + # -r requirements.txt + # notifications-utils +opentelemetry-propagator-aws-xray==1.0.2 + # via + # -r requirements.txt + # opentelemetry-instrumentation-botocore +opentelemetry-proto==1.33.1 + # via + # -r requirements.txt + # opentelemetry-exporter-otlp-proto-common + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http +opentelemetry-sdk==1.33.1 + # via + # -r requirements.txt + # opentelemetry-distro + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-processor-baggage +opentelemetry-semantic-conventions==0.54b1 + # via + # -r requirements.txt + # opentelemetry-instrumentation + # opentelemetry-instrumentation-botocore + # opentelemetry-instrumentation-flask + # opentelemetry-instrumentation-redis + # opentelemetry-instrumentation-requests + # opentelemetry-instrumentation-wsgi + # opentelemetry-sdk +opentelemetry-util-http==0.54b1 + # via + # -r requirements.txt + # opentelemetry-instrumentation-flask + # opentelemetry-instrumentation-requests + # opentelemetry-instrumentation-wsgi ordered-set==4.1.0 # via # -r requirements.txt @@ -177,6 +292,8 @@ packaging==23.1 # via # -r requirements.txt # gunicorn + # opentelemetry-instrumentation + # opentelemetry-instrumentation-flask # pytest phonenumbers==8.13.50 # via @@ -190,6 +307,11 @@ prometheus-client==0.15.0 # via # -r requirements.txt # gds-metrics +protobuf==5.29.5 + # via + # -r requirements.txt + # googleapis-common-protos + # opentelemetry-proto pycparser==2.21 # via # -r requirements.txt @@ -236,12 +358,13 @@ pytest-testmon==2.1.1 # via -r requirements_for_test_common.in pytest-xdist==3.6.1 # via -r requirements_for_test_common.in -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via # -r requirements.txt # botocore # freezegun # moto + # notifications-utils python-json-logger==3.3.0 # via # -r requirements.txt @@ -266,6 +389,7 @@ requests==2.32.3 # moto # notifications-python-client # notifications-utils + # opentelemetry-exporter-otlp-proto-http # requests-mock # responses requests-mock==1.12.1 @@ -303,6 +427,10 @@ texttable==1.6.4 # via # -r requirements.txt # pyexcel +typing-extensions==4.14.0 + # via + # -r requirements.txt + # opentelemetry-sdk urllib3==1.26.19 # via # -r requirements.txt @@ -318,6 +446,13 @@ werkzeug==3.1.3 # flask # flask-login # moto +wrapt==1.17.2 + # via + # -r requirements.txt + # deprecated + # opentelemetry-instrumentation + # opentelemetry-instrumentation-redis + # opentelemetry-processor-baggage wtforms==3.1.0 # via # -r requirements.txt @@ -332,3 +467,7 @@ xlwt==1.3.0 # pyexcel-xls xmltodict==0.14.2 # via moto +zipp==3.23.0 + # via + # -r requirements.txt + # importlib-metadata diff --git a/requirements_for_test_common.in b/requirements_for_test_common.in index 8cf8bba786..b578361f62 100644 --- a/requirements_for_test_common.in +++ b/requirements_for_test_common.in @@ -1,4 +1,4 @@ -# This file was automatically copied from notifications-utils@99.8.0 +# This file was automatically copied from notifications-utils@100.1.0 beautifulsoup4==4.12.3 pytest==8.3.4 diff --git a/ruff.toml b/ruff.toml index 2ba4008f6b..6e1fb3adf5 100644 --- a/ruff.toml +++ b/ruff.toml @@ -1,4 +1,4 @@ -# This file was automatically copied from notifications-utils@99.8.0 +# This file was automatically copied from notifications-utils@100.1.0 extend-exclude = [ "migrations/versions/",