Skip to content

Commit aef61b0

Browse files
Implement OpenTelemetry (#47)
Implement OpenTelemetry Such that logs can be managed by Arc and integrated into Manage Application Insights.
1 parent 95fa43c commit aef61b0

8 files changed

Lines changed: 611 additions & 23 deletions

File tree

.env.development

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,8 @@ PACS_PORT=4244
1717
PACS_STORAGE_PATH=/var/lib/pacs/storage
1818
PACS_DB_PATH=/var/lib/pacs/pacs.db
1919

20+
# Azure Application Insights (leave unset to disable telemetry locally)
21+
# APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=...
22+
2023
# General Configuration
2124
LOG_LEVEL=INFO

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ dependencies = [
1515
"websockets==16.0",
1616
"requests>=2.32.0",
1717
"python-dotenv>=1.2.1",
18+
"azure-monitor-opentelemetry>=1.8.6",
1819
]
1920

2021
[dependency-groups]

src/mwl_main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
from dotenv import load_dotenv
77

88
from server import MWLServer
9+
from telemetry import configure_telemetry
910

1011
load_dotenv()
12+
configure_telemetry(service_name="mwl")
1113

1214

1315
def main():

src/pacs_main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
from dotenv import load_dotenv
77

88
from server import PACSServer
9+
from telemetry import configure_telemetry
910

1011
load_dotenv()
12+
configure_telemetry(service_name="pacs")
1113

1214

1315
def main():

src/relay_listener.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
from services.mwl.create_worklist_item import CreateWorklistItem
2323
from services.storage import MWLStorage
24+
from telemetry import configure_telemetry
2425

2526
load_dotenv()
2627

@@ -130,6 +131,7 @@ async def main():
130131
level=os.getenv("LOG_LEVEL", "INFO").upper(),
131132
format=os.getenv("LOG_FORMAT", "%(asctime)s - %(name)s - %(levelname)s - %(message)s"),
132133
)
134+
configure_telemetry(service_name="relay-listener")
133135

134136
logger.info("Socket Listener Starting...")
135137
storage = MWLStorage(db_path=DB_PATH)

src/telemetry.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import logging
2+
import os
3+
4+
logger = logging.getLogger(__name__)
5+
6+
7+
def configure_telemetry(service_name: str | None = None) -> None:
8+
"""Configure OpenTelemetry with Azure Monitor.
9+
10+
If APPLICATIONINSIGHTS_CONNECTION_STRING is not set, this is a no-op,
11+
so local development works without any Azure configuration.
12+
13+
Args:
14+
service_name: Identifies this service in Application Insights.
15+
"""
16+
if not os.getenv("APPLICATIONINSIGHTS_CONNECTION_STRING"):
17+
return
18+
19+
if service_name:
20+
os.environ.setdefault("OTEL_SERVICE_NAME", service_name)
21+
22+
from azure.monitor.opentelemetry import configure_azure_monitor
23+
24+
configure_azure_monitor()
25+
logger.info("Azure Monitor telemetry configured")

src/upload_main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
from services.dicom.upload_listener import UploadListener
1010
from services.dicom.upload_processor import UploadProcessor
1111
from services.storage import MWLStorage, PACSStorage
12+
from telemetry import configure_telemetry
1213

1314
load_dotenv()
15+
configure_telemetry(service_name="upload")
1416

1517

1618
def main():

uv.lock

Lines changed: 574 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)