From 76b2033315524d7c6d56f8884dfd577f0733f7c3 Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Wed, 5 Feb 2025 08:20:47 +0100 Subject: [PATCH 1/4] fixed tracing setup --- .../src/servicelib/fastapi/tracing.py | 15 ++++----------- .../core/application.py | 10 ++++------ 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/packages/service-library/src/servicelib/fastapi/tracing.py b/packages/service-library/src/servicelib/fastapi/tracing.py index 04e20b84e57..9a0d0cb05f9 100644 --- a/packages/service-library/src/servicelib/fastapi/tracing.py +++ b/packages/service-library/src/servicelib/fastapi/tracing.py @@ -3,10 +3,8 @@ """ import logging -from collections.abc import AsyncIterator from fastapi import FastAPI -from fastapi_lifespan_manager import State from httpx import AsyncClient, Client from opentelemetry import trace from opentelemetry.exporter.otlp.proto.http.trace_exporter import ( @@ -17,7 +15,6 @@ from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor -from servicelib.fastapi.lifespan_utils import LifespanGenerator from servicelib.logging_utils import log_context from settings_library.tracing import TracingSettings from yarl import URL @@ -134,14 +131,10 @@ def setup_tracing( RequestsInstrumentor().instrument() -def get_lifespan_tracing( - tracing_settings: TracingSettings, service_name: str -) -> LifespanGenerator: - async def _(app: FastAPI) -> AsyncIterator[State]: - setup_tracing(app, tracing_settings, service_name) - yield {} - - return _ +def initialize_tracing( + app: FastAPI, tracing_settings: TracingSettings, service_name: str +): + setup_tracing(app, tracing_settings, service_name) def setup_httpx_client_tracing(client: AsyncClient | Client): diff --git a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py index a7f54a1411c..f2bde3bfd88 100644 --- a/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py +++ b/services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/core/application.py @@ -9,7 +9,7 @@ initialize_prometheus_instrumentation, lifespan_prometheus_instrumentation, ) -from servicelib.fastapi.tracing import get_lifespan_tracing +from servicelib.fastapi.tracing import initialize_tracing from .._meta import ( API_VERSION, @@ -59,11 +59,6 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: if app_settings.DYNAMIC_SCHEDULER_PROMETHEUS_INSTRUMENTATION_ENABLED: lifespans.append(lifespan_prometheus_instrumentation) - if app_settings.DYNAMIC_SCHEDULER_TRACING: - lifespans.append( - get_lifespan_tracing(app_settings.DYNAMIC_SCHEDULER_TRACING, APP_NAME) - ) - app = FastAPI( title=f"{PROJECT_NAME} web API", description=SUMMARY, @@ -87,6 +82,9 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: initialize_frontend(app) + if app_settings.DYNAMIC_SCHEDULER_TRACING: + initialize_tracing(app, app_settings.DYNAMIC_SCHEDULER_TRACING, APP_NAME) + if app_settings.DYNAMIC_SCHEDULER_PROFILING: initialize_profiler(app) From 6654d4adf81b9a37140631b580adad03e26a21a5 Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Wed, 5 Feb 2025 08:28:28 +0100 Subject: [PATCH 2/4] renamed --- .../src/servicelib/fastapi/tracing.py | 8 +------- .../service-library/tests/fastapi/test_tracing.py | 12 ++++++------ .../src/simcore_service_agent/core/application.py | 4 ++-- .../simcore_service_api_server/core/application.py | 4 ++-- .../simcore_service_autoscaling/core/application.py | 4 ++-- .../src/simcore_service_catalog/core/application.py | 4 ++-- .../core/application.py | 4 ++-- .../core/application.py | 4 ++-- .../simcore_service_director_v2/core/application.py | 4 ++-- .../src/simcore_service_director/core/application.py | 4 ++-- .../core/application.py | 6 ++++-- .../simcore_service_efs_guardian/core/application.py | 4 ++-- .../simcore_service_invitations/core/application.py | 4 ++-- .../src/simcore_service_payments/core/application.py | 4 ++-- .../core/application.py | 4 ++-- 15 files changed, 35 insertions(+), 39 deletions(-) diff --git a/packages/service-library/src/servicelib/fastapi/tracing.py b/packages/service-library/src/servicelib/fastapi/tracing.py index 9a0d0cb05f9..e26cc367064 100644 --- a/packages/service-library/src/servicelib/fastapi/tracing.py +++ b/packages/service-library/src/servicelib/fastapi/tracing.py @@ -61,7 +61,7 @@ HAS_REQUESTS = False -def setup_tracing( +def initialize_tracing( app: FastAPI, tracing_settings: TracingSettings, service_name: str ) -> None: if ( @@ -131,11 +131,5 @@ def setup_tracing( RequestsInstrumentor().instrument() -def initialize_tracing( - app: FastAPI, tracing_settings: TracingSettings, service_name: str -): - setup_tracing(app, tracing_settings, service_name) - - def setup_httpx_client_tracing(client: AsyncClient | Client): HTTPXClientInstrumentor.instrument_client(client) diff --git a/packages/service-library/tests/fastapi/test_tracing.py b/packages/service-library/tests/fastapi/test_tracing.py index 412b59b116d..a7a1afb4ba7 100644 --- a/packages/service-library/tests/fastapi/test_tracing.py +++ b/packages/service-library/tests/fastapi/test_tracing.py @@ -11,7 +11,7 @@ import pytest from fastapi import FastAPI from pydantic import ValidationError -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from settings_library.tracing import TracingSettings @@ -54,13 +54,13 @@ async def test_valid_tracing_settings( uninstrument_opentelemetry: Iterator[None], ): tracing_settings = TracingSettings() - setup_tracing( + initialize_tracing( mocked_app, tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest", ) # idempotency - setup_tracing( + initialize_tracing( mocked_app, tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest", @@ -92,7 +92,7 @@ async def test_invalid_tracing_settings( app = mocked_app with pytest.raises((BaseException, ValidationError, TypeError)): # noqa: PT012 tracing_settings = TracingSettings() - setup_tracing( + initialize_tracing( app, tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest", @@ -146,13 +146,13 @@ async def test_tracing_setup_package_detection( importlib.import_module(package_name) # tracing_settings = TracingSettings() - setup_tracing( + initialize_tracing( mocked_app, tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest", ) # idempotency - setup_tracing( + initialize_tracing( mocked_app, tracing_settings=tracing_settings, service_name="Mock-Openetlemetry-Pytest", diff --git a/services/agent/src/simcore_service_agent/core/application.py b/services/agent/src/simcore_service_agent/core/application.py index b0cfa8720e4..b4a5ce8cd48 100644 --- a/services/agent/src/simcore_service_agent/core/application.py +++ b/services/agent/src/simcore_service_agent/core/application.py @@ -5,7 +5,7 @@ get_common_oas_options, override_fastapi_openapi_method, ) -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from servicelib.logging_utils import config_all_loggers from .._meta import ( @@ -64,7 +64,7 @@ def create_app() -> FastAPI: setup_rpc_api_routes(app) if settings.AGENT_TRACING: - setup_tracing(app, settings.AGENT_TRACING, APP_NAME) + initialize_tracing(app, settings.AGENT_TRACING, APP_NAME) async def _on_startup() -> None: print(APP_STARTED_BANNER_MSG, flush=True) # noqa: T201 diff --git a/services/api-server/src/simcore_service_api_server/core/application.py b/services/api-server/src/simcore_service_api_server/core/application.py index 19323b4e001..cde8280313a 100644 --- a/services/api-server/src/simcore_service_api_server/core/application.py +++ b/services/api-server/src/simcore_service_api_server/core/application.py @@ -5,7 +5,7 @@ from models_library.basic_types import BootModeEnum from packaging.version import Version from servicelib.fastapi.profiler import initialize_profiler -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from servicelib.logging_utils import config_all_loggers from .. import exceptions @@ -84,7 +84,7 @@ def init_app(settings: ApplicationSettings | None = None) -> FastAPI: setup_rabbitmq(app) if settings.API_SERVER_TRACING: - setup_tracing(app, settings.API_SERVER_TRACING, APP_NAME) + initialize_tracing(app, settings.API_SERVER_TRACING, APP_NAME) if settings.API_SERVER_WEBSERVER: webserver.setup( diff --git a/services/autoscaling/src/simcore_service_autoscaling/core/application.py b/services/autoscaling/src/simcore_service_autoscaling/core/application.py index 6261232bce5..f70a8be583c 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/core/application.py +++ b/services/autoscaling/src/simcore_service_autoscaling/core/application.py @@ -1,7 +1,7 @@ import logging from fastapi import FastAPI -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from .._meta import ( API_VERSION, @@ -71,7 +71,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_auto_scaler_background_task(app) setup_buffer_machines_pool_task(app) if app.state.settings.AUTOSCALING_TRACING: - setup_tracing(app, app.state.settings.AUTOSCALING_TRACING, APP_NAME) + initialize_tracing(app, app.state.settings.AUTOSCALING_TRACING, APP_NAME) # ERROR HANDLERS diff --git a/services/catalog/src/simcore_service_catalog/core/application.py b/services/catalog/src/simcore_service_catalog/core/application.py index 72ecc8ba0ba..95a2a836c5d 100644 --- a/services/catalog/src/simcore_service_catalog/core/application.py +++ b/services/catalog/src/simcore_service_catalog/core/application.py @@ -9,7 +9,7 @@ from servicelib.fastapi.prometheus_instrumentation import ( setup_prometheus_instrumentation, ) -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from starlette.middleware.base import BaseHTTPMiddleware from .._meta import API_VERSION, API_VTAG, APP_NAME, PROJECT_NAME, SUMMARY @@ -47,7 +47,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: app.state.settings = settings if settings.CATALOG_TRACING: - setup_tracing(app, settings.CATALOG_TRACING, APP_NAME) + initialize_tracing(app, settings.CATALOG_TRACING, APP_NAME) # STARTUP-EVENT app.add_event_handler("startup", create_on_startup(app)) diff --git a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py index ac3955a3f25..ad354a2c8b1 100644 --- a/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py +++ b/services/clusters-keeper/src/simcore_service_clusters_keeper/core/application.py @@ -4,7 +4,7 @@ from servicelib.fastapi.prometheus_instrumentation import ( setup_prometheus_instrumentation, ) -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from .._meta import ( API_VERSION, @@ -45,7 +45,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI: if app.state.settings.CLUSTERS_KEEPER_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) if app.state.settings.CLUSTERS_KEEPER_TRACING: - setup_tracing( + initialize_tracing( app, app.state.settings.CLUSTERS_KEEPER_TRACING, APP_NAME, diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py index d653dc6a090..9b037edacbd 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py @@ -6,7 +6,7 @@ from servicelib.fastapi.prometheus_instrumentation import ( setup_prometheus_instrumentation, ) -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from servicelib.logging_utils import config_all_loggers from .._meta import API_VERSION, API_VTAG, APP_NAME @@ -70,7 +70,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: if app.state.settings.DATCORE_ADAPTER_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) if app.state.settings.DATCORE_ADAPTER_TRACING: - setup_tracing( + initialize_tracing( app, app.state.settings.DATCORE_ADAPTER_TRACING, APP_NAME, diff --git a/services/director-v2/src/simcore_service_director_v2/core/application.py b/services/director-v2/src/simcore_service_director_v2/core/application.py index acb2abe4b69..c53c841183e 100644 --- a/services/director-v2/src/simcore_service_director_v2/core/application.py +++ b/services/director-v2/src/simcore_service_director_v2/core/application.py @@ -7,7 +7,7 @@ override_fastapi_openapi_method, ) from servicelib.fastapi.profiler import initialize_profiler -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from servicelib.logging_utils import config_all_loggers from .._meta import API_VERSION, API_VTAG, APP_NAME, PROJECT_NAME, SUMMARY @@ -145,7 +145,7 @@ def init_app(settings: AppSettings | None = None) -> FastAPI: substitutions.setup(app) if settings.DIRECTOR_V2_TRACING: - setup_tracing(app, settings.DIRECTOR_V2_TRACING, APP_NAME) + initialize_tracing(app, settings.DIRECTOR_V2_TRACING, APP_NAME) if settings.DIRECTOR_V0.DIRECTOR_ENABLED: director_v0.setup( diff --git a/services/director/src/simcore_service_director/core/application.py b/services/director/src/simcore_service_director/core/application.py index 86031f0d935..252bb25f061 100644 --- a/services/director/src/simcore_service_director/core/application.py +++ b/services/director/src/simcore_service_director/core/application.py @@ -3,7 +3,7 @@ from fastapi import FastAPI from servicelib.async_utils import cancel_sequential_workers -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from .._meta import ( API_VERSION, @@ -51,7 +51,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_api_routes(app) if app.state.settings.DIRECTOR_TRACING: - setup_tracing(app, app.state.settings.DIRECTOR_TRACING, APP_NAME) + initialize_tracing(app, app.state.settings.DIRECTOR_TRACING, APP_NAME) # replace by httpx client setup_client_session(app) diff --git a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py index 58c5495563f..22e8c4729ed 100644 --- a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py +++ b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py @@ -9,7 +9,7 @@ get_common_oas_options, override_fastapi_openapi_method, ) -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from servicelib.logging_utils import config_all_loggers from simcore_sdk.node_ports_common.exceptions import NodeNotFound @@ -193,7 +193,9 @@ def create_app(): setup_prometheus_metrics(app) if application_settings.DYNAMIC_SIDECAR_TRACING: - setup_tracing(app, application_settings.DYNAMIC_SIDECAR_TRACING, PROJECT_NAME) + initialize_tracing( + app, application_settings.DYNAMIC_SIDECAR_TRACING, PROJECT_NAME + ) # ERROR HANDLERS ------------ app.add_exception_handler( diff --git a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py index 217a3d0a1bd..956a3c891de 100644 --- a/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py +++ b/services/efs-guardian/src/simcore_service_efs_guardian/core/application.py @@ -1,7 +1,7 @@ import logging from fastapi import FastAPI -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from .._meta import ( API_VERSION, @@ -43,7 +43,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: app.state.settings = app_settings assert app.state.settings.API_VERSION == API_VERSION # nosec if app.state.settings.EFS_GUARDIAN_TRACING: - setup_tracing(app, app.state.settings.EFS_GUARDIAN_TRACING, APP_NAME) + initialize_tracing(app, app.state.settings.EFS_GUARDIAN_TRACING, APP_NAME) # PLUGINS SETUP setup_rabbitmq(app) diff --git a/services/invitations/src/simcore_service_invitations/core/application.py b/services/invitations/src/simcore_service_invitations/core/application.py index 98b798862c1..b3f96c07a82 100644 --- a/services/invitations/src/simcore_service_invitations/core/application.py +++ b/services/invitations/src/simcore_service_invitations/core/application.py @@ -3,7 +3,7 @@ from servicelib.fastapi.prometheus_instrumentation import ( setup_prometheus_instrumentation, ) -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from .._meta import ( API_VERSION, @@ -41,7 +41,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: if app.state.settings.INVITATIONS_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) if app.state.settings.INVITATIONS_TRACING: - setup_tracing(app, app.state.settings.INVITATIONS_TRACING, APP_NAME) + initialize_tracing(app, app.state.settings.INVITATIONS_TRACING, APP_NAME) # ERROR HANDLERS exceptions_handlers.setup(app) diff --git a/services/payments/src/simcore_service_payments/core/application.py b/services/payments/src/simcore_service_payments/core/application.py index c85c7f91420..6bfaf9b2dec 100644 --- a/services/payments/src/simcore_service_payments/core/application.py +++ b/services/payments/src/simcore_service_payments/core/application.py @@ -3,7 +3,7 @@ from servicelib.fastapi.prometheus_instrumentation import ( setup_prometheus_instrumentation, ) -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from .._meta import ( API_VERSION, @@ -71,7 +71,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: if app.state.settings.PAYMENTS_PROMETHEUS_INSTRUMENTATION_ENABLED: setup_prometheus_instrumentation(app) if app.state.settings.PAYMENTS_TRACING: - setup_tracing(app, app.state.settings.PAYMENTS_TRACING, APP_NAME) + initialize_tracing(app, app.state.settings.PAYMENTS_TRACING, APP_NAME) # ERROR HANDLERS # ... add here ... diff --git a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py index 7299703a6bd..ca07c55f20c 100644 --- a/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py +++ b/services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/core/application.py @@ -2,7 +2,7 @@ from fastapi import FastAPI from servicelib.fastapi.openapi import override_fastapi_openapi_method -from servicelib.fastapi.tracing import setup_tracing +from servicelib.fastapi.tracing import initialize_tracing from .._meta import ( API_VERSION, @@ -67,7 +67,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI: setup_process_message_running_service(app) # Requires Rabbit if app.state.settings.RESOURCE_USAGE_TRACKER_TRACING: - setup_tracing( + initialize_tracing( app, app.state.settings.RESOURCE_USAGE_TRACKER_TRACING, app.state.settings.APP_NAME, From faa1ee3dbd951ec04c3299fecf1deb44ed255515 Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Wed, 5 Feb 2025 09:17:25 +0100 Subject: [PATCH 3/4] attempt ot fix issue --- .github/workflows/ci-testing-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-testing-pull-request.yml b/.github/workflows/ci-testing-pull-request.yml index f1ed7df378c..ebdfc2604ac 100644 --- a/.github/workflows/ci-testing-pull-request.yml +++ b/.github/workflows/ci-testing-pull-request.yml @@ -59,7 +59,7 @@ jobs: - name: check api-server backwards compatibility run: | ./scripts/openapi-diff.bash breaking --fail-on ERR\ - https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/${{ github.event.after }}/services/api-server/openapi.json \ + https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}${{ github.event.after }}/services/api-server/openapi.json \ /specs/services/api-server/openapi.json all-oas-breaking: @@ -78,5 +78,5 @@ jobs: - name: Check openapi-specs backwards compatibility run: | ./ci/github/helpers/openapi-specs-diff.bash breaking \ - https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/${{ github.event.after }} \ + https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}${{ github.event.after }} \ . From fd8d858a52d730e0da90a218157ec9d1786431a1 Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Wed, 5 Feb 2025 09:21:26 +0100 Subject: [PATCH 4/4] revert change --- .github/workflows/ci-testing-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-testing-pull-request.yml b/.github/workflows/ci-testing-pull-request.yml index ebdfc2604ac..f1ed7df378c 100644 --- a/.github/workflows/ci-testing-pull-request.yml +++ b/.github/workflows/ci-testing-pull-request.yml @@ -59,7 +59,7 @@ jobs: - name: check api-server backwards compatibility run: | ./scripts/openapi-diff.bash breaking --fail-on ERR\ - https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}${{ github.event.after }}/services/api-server/openapi.json \ + https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/${{ github.event.after }}/services/api-server/openapi.json \ /specs/services/api-server/openapi.json all-oas-breaking: @@ -78,5 +78,5 @@ jobs: - name: Check openapi-specs backwards compatibility run: | ./ci/github/helpers/openapi-specs-diff.bash breaking \ - https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}${{ github.event.after }} \ + https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/${{ github.event.after }} \ .