diff --git a/.github/workflows/nose-tests.yml b/.github/workflows/nose-tests.yml index 57abde6b49..c957f72348 100644 --- a/.github/workflows/nose-tests.yml +++ b/.github/workflows/nose-tests.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - python-version: [3.6, 3.8] + python-version: [3.8] steps: - uses: actions/checkout@v2 @@ -43,7 +43,7 @@ jobs: strategy: matrix: - python-version: [3.6, 3.8] + python-version: [3.8] steps: - uses: actions/checkout@v2 @@ -79,7 +79,7 @@ jobs: strategy: matrix: - python-version: [3.6] + python-version: [3.8] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: matrix: - python-version: [3.6, 3.8] + python-version: [3.8] steps: - uses: actions/checkout@v2 diff --git a/content_api/app/settings.py b/content_api/app/settings.py index bb3de978c0..4b9b198d24 100644 --- a/content_api/app/settings.py +++ b/content_api/app/settings.py @@ -18,6 +18,7 @@ from superdesk.default_settings import env, urlparse from superdesk.default_settings import ( # noqa + DEBUG, SECRET_KEY, MONGO_DBNAME, MONGO_URI, @@ -35,7 +36,8 @@ PAGINATION_LIMIT, APM_SERVER_URL, APM_SECRET_TOKEN, - DEBUG, + APM_SERVICE_NAME, + CLIENT_URL, ) CONTENTAPI_INSTALLED_APPS = [ diff --git a/prod_api/app/settings.py b/prod_api/app/settings.py index 0602f79a32..c8c4b3cd54 100644 --- a/prod_api/app/settings.py +++ b/prod_api/app/settings.py @@ -33,6 +33,8 @@ PAGINATION_LIMIT, APM_SERVER_URL, APM_SECRET_TOKEN, + APM_SERVICE_NAME, + CLIENT_URL, ) SECRET_KEY = env("PRODAPI_SECRET_KEY", "") diff --git a/setup.cfg b/setup.cfg index 729f7013d6..ca50e6f1ba 100644 --- a/setup.cfg +++ b/setup.cfg @@ -25,7 +25,7 @@ exclude-dir = prod_api/tests/ [mypy] mypy_path = ./stubs -python_version = 3.6 +python_version = 3.8 warn_unused_configs = True allow_untyped_globals = True exclude = env diff --git a/superdesk/default_settings.py b/superdesk/default_settings.py index 1bb9055b1c..951500dc54 100644 --- a/superdesk/default_settings.py +++ b/superdesk/default_settings.py @@ -1035,3 +1035,11 @@ def local_to_utc_hour(hour): #: APM_SERVER_URL = env("APM_SERVER_URL") APM_SECRET_TOKEN = env("APM_SECRET_TOKEN") + +#: Elastic APM Service name +#: +#: APM service name +#: +#: .. versionadded:: 2.4.1 +#: +APM_SERVICE_NAME = env("APM_SERVICE_NAME") diff --git a/superdesk/factory/elastic_apm.py b/superdesk/factory/elastic_apm.py index 005e4f47a7..92118b9ad4 100644 --- a/superdesk/factory/elastic_apm.py +++ b/superdesk/factory/elastic_apm.py @@ -1,19 +1,30 @@ -import sys +import re +import flask +from typing import Literal from elasticapm.contrib.flask import ElasticAPM -def setup_apm(app, name="Superdesk"): - in_celery = sys.argv and "worker" in sys.argv +def setup_apm(app: flask.Flask, service="Core API") -> None: if getattr(app, "apm", None) is None and app.config.get("APM_SERVER_URL") and app.config.get("APM_SECRET_TOKEN"): app.config["ELASTIC_APM"] = { + "DEBUG": app.debug, + "ENVIRONMENT": get_environment(app), "SERVER_URL": app.config["APM_SERVER_URL"], "SECRET_TOKEN": app.config["APM_SECRET_TOKEN"], "TRANSACTIONS_IGNORE_PATTERNS": ["^OPTIONS "], - "SERVICE_NAME": "{name} {service}".format( - name=name, - service="Celery" if in_celery else "Web", + "SERVICE_NAME": "{app} - {service}".format( + app=app.config.get("APM_SERVICE_NAME") or app.config.get("APPLICATION_NAME"), service=service ), } app.apm = ElasticAPM(app) + + +def get_environment(app: flask.Flask) -> Literal["testing", "staging", "production"]: + if app.config.get("CLIENT_URL"): + if "localhost" in app.config["CLIENT_URL"] or app.debug: + return "testing" + if re.search(r"-(dev|demo|test|staging)", app.config["CLIENT_URL"]): + return "staging" + return "production"