Merge branch 'feature/RES-718-add-azure-monitoring' into 'master'

RES-718: add azure tracing

See merge request knecon/research/pyinfra!85
This commit is contained in:
Julius Unverfehrt 2024-06-17 12:25:09 +02:00
commit 88fe7383f3
8 changed files with 1202 additions and 915 deletions

2058
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -45,7 +45,13 @@ webserver_validators = [
Validator("webserver.port", must_exist=True, is_type_of=int),
]
tracing_validators = [
Validator("tracing.enabled", must_exist=True, is_type_of=bool),
Validator("tracing.type", must_exist=True, is_type_of=str)
]
opentelemetry_validators = [
Validator("tracing.opentelemetry.endpoint", must_exist=True, is_type_of=str),
Validator("tracing.opentelemetry.service_name", must_exist=True, is_type_of=str),
Validator("tracing.opentelemetry.exporter", must_exist=True, is_type_of=str)
]

View File

@ -30,26 +30,26 @@ def start_standard_queue_consumer(
"""
validate_settings(settings, get_pyinfra_validators())
logger.info(f"Starting webserver and queue consumer...")
logger.info("Starting webserver and queue consumer...")
app = app or FastAPI()
queue_manager = QueueManager(settings)
if settings.metrics.prometheus.enabled:
logger.info(f"Prometheus metrics enabled.")
logger.info("Prometheus metrics enabled.")
app = add_prometheus_endpoint(app)
callback = make_prometheus_processing_time_decorator_from_settings(settings)(callback)
if settings.tracing.opentelemetry.enabled:
logger.info(f"OpenTelemetry tracing enabled.")
if settings.tracing.enabled:
setup_trace(settings)
instrument_pika()
instrument_app(app)
app = add_health_check_endpoint(app, queue_manager.is_ready)
webserver_thread = create_webserver_thread_from_settings(app, settings)
webserver_thread.start()
queue_manager.start_consuming(callback)
queue_manager.start_consuming(callback)

View File

@ -1,5 +1,6 @@
import json
from azure.monitor.opentelemetry import configure_azure_monitor
from dynaconf import Dynaconf
from fastapi import FastAPI
from opentelemetry import trace
@ -17,6 +18,7 @@ from opentelemetry.sdk.trace.export import (
from pyinfra.config.loader import validate_settings
from pyinfra.config.validators import opentelemetry_validators
from kn_utils.logging import logger
class JsonSpanExporter(SpanExporter):
@ -33,6 +35,20 @@ class JsonSpanExporter(SpanExporter):
def setup_trace(settings: Dynaconf, service_name: str = None, exporter: SpanExporter = None):
tracing_type = settings.tracing.type
if tracing_type == "azure_monitor":
# Configure OpenTelemetry to use Azure Monitor with the
# APPLICATIONINSIGHTS_CONNECTION_STRING environment variable.
logger.info("Azure Monitor tracing enabled.")
configure_azure_monitor()
elif tracing_type == "opentelemetry":
logger.info("OpenTelemetry tracing enabled.")
configure_opentelemtry_tracing(settings, service_name, exporter)
else:
raise Exception(f"Unknown tracing type: {tracing_type}")
def configure_opentelemtry_tracing(settings: Dynaconf, service_name: str = None, exporter: SpanExporter = None):
service_name = service_name or settings.tracing.opentelemetry.service_name
exporter = exporter or get_exporter(settings)

View File

@ -14,7 +14,7 @@ from pyinfra.utils.opentelemetry import instrument_app, setup_trace
def create_webserver_thread_from_settings(app: FastAPI, settings: Dynaconf) -> threading.Thread:
validate_settings(settings, validators=webserver_validators)
if settings.tracing.opentelemetry.enabled:
if settings.tracing.enabled:
return create_webserver_thread_with_tracing(app, settings)
return create_webserver_thread(app=app, port=settings.webserver.port, host=settings.webserver.host)

View File

@ -23,16 +23,17 @@ kn-utils = { version = "^0.2.7", source = "gitlab-research" }
fastapi = "^0.109.0"
uvicorn = "^0.26.0"
# [tool.poetry.group.telemetry.dependencies]
opentelemetry-instrumentation-pika = "^0.43b0"
opentelemetry-exporter-otlp = "^1.22.0"
opentelemetry-instrumentation = "^0.43b0"
opentelemetry-api = "^1.22.0"
opentelemetry-sdk = "^1.22.0"
opentelemetry-exporter-otlp-proto-http = "^1.22.0"
opentelemetry-instrumentation-flask = "^0.43b0"
opentelemetry-instrumentation-requests = "^0.43b0"
opentelemetry-instrumentation-fastapi = "^0.43b0"
opentelemetry-instrumentation-pika = "^0.46b0"
opentelemetry-exporter-otlp = "^1.25.0"
opentelemetry-instrumentation = "^0.46b0"
opentelemetry-api = "^1.25.0"
opentelemetry-sdk = "^1.25.0"
opentelemetry-exporter-otlp-proto-http = "^1.25.0"
opentelemetry-instrumentation-flask = "^0.46b0"
opentelemetry-instrumentation-requests = "^0.46b0"
opentelemetry-instrumentation-fastapi = "^0.46b0"
wcwidth = "<=0.2.12"
azure-monitor-opentelemetry = "^1.6.0"
[tool.poetry.group.dev.dependencies]
pytest = "^7"

View File

@ -12,7 +12,7 @@ def processor_mock(_data: dict, _message: dict) -> dict:
if __name__ == "__main__":
arguments = parse_settings_path()
settings = load_settings(arguments.settings_path)
settings = load_settings(arguments)
callback = make_download_process_upload_callback(processor_mock, settings)
start_standard_queue_consumer(callback, settings)

View File

@ -34,7 +34,7 @@ class TestOpenTelemetry:
# def test_webserver_requests_are_traced(self, settings):
# settings.tracing.opentelemetry.exporter = "console"
# settings.tracing.opentelemetry.enabled = True
# settings.tracing.enabled = True
#
# app = FastAPI()
#