Skip to content

Conversation

@cdav
Copy link

@cdav cdav commented Oct 31, 2025

Fixes Issue

Closes #838

Changes proposed

Fixed (start.sh) APM boolean logic. The previous condition required OPAL_ENABLE_DATADOG_APM to be empty AND set to "true". Now dd-trace is added to the client run command.

Updated apm.py for compatibility with dd-trace 2.0>.

  • Replaced deprecated FILTERS parameter with trace_processors
  • Renamed and improved trace filter class:
    • FilterRootPathTraces → DropRootPathTraces
    • Improved error handling in URL parsing with fail-open approach

Check List (Check all the applicable boxes)

  • I sign off on contributing this submission to open-source
  • My code follows the code style of this project.
  • My change requires changes to the documentation.
  • I have updated the documentation accordingly.
  • All new and existing tests passed.
  • This PR does not contain plagiarized content.
  • The title of my pull request is a short description of the requested changes.

Screenshots

Client Before:

  docker compose -f docker-compose-example.yml up opal_client
[+] Running 1/1
 ✔ Container opal-example-opal_client-1  Recreated                                                                                                                                                                                                                                                                          0.1s 
Attaching to opal_client-1
opal_client-1  | + exec gunicorn -b 0.0.0.0:7000 -k uvicorn.workers.UvicornWorker --workers=1 -c ./gunicorn_conf.py opal_client.main:app -t 30 --keep-alive 5
opal_client-1  | [2025-10-30 15:44:38 +0000] [7] [INFO] Starting gunicorn 23.0.0

Client After:

  docker-compose -f docker-compose-example.yml up opal_client
[+] Running 2/2
 ✔ Container opal-example-broadcast_channel-1  Running                                                                                                                                                                                                                                                                                                                                         0.0s 
 ✔ Container opal-example-opal_server-1        Running                                                                                                                                                                                                                                                                                                                                         0.0s 
Attaching to opal_client-1
opal_client-1  | + exec ddtrace-run gunicorn -b 0.0.0.0:7000 -k uvicorn.workers.UvicornWorker --workers=1 -c ./gunicorn_conf.py opal_client.main:app -t 30 --keep-alive 5

Server Before:

 docker-compose -f docker-compose-example.yml up
[+] Running 2/2
 ✔ opal_client Pulled                                                                                                                                                                                                                                                                                                       2.0s 
 ✔ opal_server Pulled                                                                                                                                                                                                                                                                                                       2.1s 
[+] Running 2/2
 ✔ Container opal-example-opal_server-1  Recreated                                                                                                                                                                                                                                                                          0.1s 
 ✔ Container opal-example-opal_client-1  Recreated                                                                                                                                                                                                                                                                          0.2s 
Attaching to broadcast_channel-1, opal_client-1, opal_server-1
broadcast_channel-1  | 
broadcast_channel-1  | PostgreSQL Database directory appears to contain a database; Skipping initialization
broadcast_channel-1  | 
broadcast_channel-1  | 2025-10-30 15:37:20.109 UTC [1] LOG:  starting PostgreSQL 18.0 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 14.2.0) 14.2.0, 64-bit
broadcast_channel-1  | 2025-10-30 15:37:20.112 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
broadcast_channel-1  | 2025-10-30 15:37:20.112 UTC [1] LOG:  listening on IPv6 address "::", port 5432
broadcast_channel-1  | 2025-10-30 15:37:20.116 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
broadcast_channel-1  | 2025-10-30 15:37:20.121 UTC [32] LOG:  database system was shut down at 2025-10-30 15:05:36 UTC
broadcast_channel-1  | 2025-10-30 15:37:20.128 UTC [1] LOG:  database system is ready to accept connections
opal_server-1        | + exec gunicorn -b 0.0.0.0:7002 -k uvicorn.workers.UvicornWorker --workers=4 -c ./gunicorn_conf.py opal_server.main:app -t 30 --keep-alive 5
opal_server-1        | [2025-10-30 15:37:20 +0000] [7] [INFO] Starting gunicorn 23.0.0
opal_server-1        | [2025-10-30 15:37:20 +0000] [7] [INFO] Listening at: http://0.0.0.0:7002 (7)
opal_server-1        | [2025-10-30 15:37:20 +0000] [7] [INFO] Using worker: uvicorn.workers.UvicornWorker
opal_server-1        | 2025-10-30 15:37:21.001 | WARNING  | __config__:when_ready:17 - Finished pre loading scopes...
opal_server-1        | [2025-10-30 15:37:21 +0000] [11] [INFO] Booting worker with pid: 11
opal_server-1        | [2025-10-30 15:37:21 +0000] [13] [INFO] Booting worker with pid: 13
opal_server-1        | [2025-10-30 15:37:21 +0000] [15] [INFO] Booting worker with pid: 15
opal_server-1        | 2025-10-30T15:37:21.154122+0000 | 11 | opal_common.monitoring.apm              | INFO  | Enabling DataDog APM
opal_server-1        | [2025-10-30 15:37:21 +0000] [11] [ERROR] Exception in worker process
opal_server-1        | Traceback (most recent call last):
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/gunicorn/arbiter.py", line 608, in spawn_worker
opal_server-1        |     worker.init_process()
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/gunicorn/workers/base.py", line 135, in init_process
opal_server-1        |     self.load_wsgi()
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/gunicorn/workers/base.py", line 147, in load_wsgi
opal_server-1        |     self.wsgi = self.app.wsgi()
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/gunicorn/app/base.py", line 66, in wsgi
opal_server-1        |     self.callable = self.load()
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/gunicorn/app/wsgiapp.py", line 57, in load
opal_server-1        |     return self.load_wsgiapp()
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/gunicorn/app/wsgiapp.py", line 47, in load_wsgiapp
opal_server-1        |     return util.import_app(self.app_uri)
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/gunicorn/util.py", line 370, in import_app
opal_server-1        |     mod = importlib.import_module(module)
opal_server-1        |   File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
opal_server-1        |     return _bootstrap._gcd_import(name[level:], package, level)
opal_server-1        |   File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
opal_server-1        |   File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
opal_server-1        |   File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
opal_server-1        |   File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/ddtrace/internal/module.py", line 313, in _exec_module
opal_server-1        |     self.loader.exec_module(module)
opal_server-1        |   File "<frozen importlib._bootstrap_external>", line 883, in exec_module
opal_server-1        |   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/opal_server-0.0.0-py3.10.egg/opal_server/main.py", line 8, in <module>
opal_server-1        |     app = create_app()
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/opal_server-0.0.0-py3.10.egg/opal_server/main.py", line 4, in create_app
opal_server-1        |     server = OpalServer(*args, **kwargs)
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/opal_server-0.0.0-py3.10.egg/opal_server/server.py", line 108, in __init__
opal_server-1        |     self._configure_monitoring()
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/opal_server-0.0.0-py3.10.egg/opal_server/server.py", line 211, in _configure_monitoring
opal_server-1        |     apm.configure_apm(opal_server_config.ENABLE_DATADOG_APM, "opal-server")
opal_server-1        |   File "/usr/local/lib/python3.10/site-packages/opal_common-0.0.0-py3.10.egg/opal_common/monitoring/apm.py", line 37, in configure_apm
opal_server-1        |     tracer.configure(
opal_server-1        | TypeError: Tracer.configure() got an unexpected keyword argument 'settings'

Server After:

 docker-compose -f docker-compose-example.yml up opal_server
[+] Running 2/2
 ✔ Container opal-example-broadcast_channel-1  Running                                                                                                                                                                                                                                                                                                                                         0.0s 
 ✔ Container opal-example-opal_server-1        Recreated                                                                                                                                                                                                                                                                                                                                       0.1s 
Attaching to opal_server-1
opal_server-1  | + exec ddtrace-run gunicorn -b 0.0.0.0:7002 -k uvicorn.workers.UvicornWorker --workers=4 -c ./gunicorn_conf.py opal_server.main:app -t 30 --keep-alive 5
opal_server-1  | [2025-10-31 14:39:36 +0000] [7] [INFO] Starting gunicorn 23.0.0
opal_server-1  | [2025-10-31 14:39:36 +0000] [7] [INFO] Listening at: http://0.0.0.0:7002 (7)
opal_server-1  | [2025-10-31 14:39:36 +0000] [7] [INFO] Using worker: uvicorn.workers.UvicornWorker
opal_server-1  | 2025-10-31 14:39:36.375 | WARNING  | __config__:when_ready:17 - Finished pre loading scopes...
opal_server-1  | [2025-10-31 14:39:36 +0000] [17] [INFO] Booting worker with pid: 17
opal_server-1  | [2025-10-31 14:39:36 +0000] [22] [INFO] Booting worker with pid: 22
opal_server-1  | 2025-10-31T14:39:36.515437+0000 | 17 | opal_common.monitoring.apm              | INFO  | Enabling Datadog APM
opal_server-1  | 2025-10-31T14:39:36.516385+0000 | 17 | opal_common.monitoring.metrics          | INFO  | DogStatsD metrics disabled

Note to reviewers

@netlify
Copy link

netlify bot commented Oct 31, 2025

Deploy Preview for opal-docs canceled.

Name Link
🔨 Latest commit 74772bb
🔍 Latest deploy log https://app.netlify.com/projects/opal-docs/deploys/6904e5627174e900082f0c60

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

OPAL does not send datadog metrics when enabling OPAL_ENABLE_DATADOG_APM

1 participant