Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,7 @@ workflows:
only:
- master
- production
- enable-otel
- install-node-packages:
requires:
- checkout-to-workspace
Expand All @@ -462,6 +463,7 @@ workflows:
only:
- master
- production
- enable-otel

# staging
- build-front:
Expand All @@ -473,6 +475,7 @@ workflows:
branches:
only:
- master
- enable-otel
- deploy:
name: deploy-staging
context: STAGING
Expand All @@ -483,6 +486,7 @@ workflows:
branches:
only:
- master
- enable-otel
- deploy-api:
name: deploy-api-staging
context: STAGING
Expand Down
42 changes: 42 additions & 0 deletions back/boxtribute_server/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from sentry_sdk.integrations.flask import FlaskIntegration

from .db import create_db_interface, db
from .utils import in_staging_environment


def create_app():
Expand Down Expand Up @@ -76,6 +77,7 @@ def before_sentry_send(event, hint): # pragma: no cover
)

app = create_app()
setup_opentelemetry(app)
configure_app(
app,
*blueprints,
Expand All @@ -91,3 +93,43 @@ def before_sentry_send(event, hint): # pragma: no cover
replica_socket=os.getenv("MYSQL_REPLICA_SOCKET"),
)
return app


def setup_opentelemetry(app):
if not in_staging_environment():
return

# https://cloud.google.com/stackdriver/docs/instrumentation/choose-approach#app_engine
# https://cloud.google.com/trace/docs/setup/python-ot
# https://github.com/GoogleCloudPlatform/opentelemetry-operations-python/blob/1f1775886d7314b113acd322633afb278f875687/samples/instrumentation-quickstart/setup_opentelemetry.py
# No permission for trace.googleapis.com
from opentelemetry import trace
from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
from opentelemetry.propagate import set_global_textmap
from opentelemetry.propagators.cloud_trace_propagator import (
CloudTraceFormatPropagator,
)
from opentelemetry.sdk.resources import SERVICE_INSTANCE_ID, Resource

# from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

resource = Resource.create(
attributes={
# Use the PID as the service.instance.id to avoid duplicate timeseries
# from different Gunicorn worker processes.
SERVICE_INSTANCE_ID: f"worker-{os.getpid()}",
}
)

provider = TracerProvider(resource=resource)
processor = BatchSpanProcessor(CloudTraceSpanExporter())
provider.add_span_processor(processor)

trace.set_tracer_provider(provider)
set_global_textmap(CloudTraceFormatPropagator())

from opentelemetry.instrumentation.flask import FlaskInstrumentor

FlaskInstrumentor().instrument_app(app)
4 changes: 4 additions & 0 deletions back/requirements-deploy.txt
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
google-cloud-logging==3.11.3
opentelemetry-sdk==1.27.0
opentelemetry-instrumentation-flask==0.48b0
opentelemetry-exporter-gcp-trace==1.7.0
opentelemetry-propagator-gcp==1.7.0