🔨 Add OTel/Jeager to start HTTP/SQL requests monitoring

This commit is contained in:
2023-05-02 23:02:09 +02:00
parent 07d43bfcb4
commit 6aa28f7bfb
4 changed files with 98 additions and 1 deletions

33
backend/main.py Normal file → Executable file
View File

@@ -1,12 +1,26 @@
#!/usr/bin/env python3
import logging
from collections import defaultdict
from datetime import datetime
from os import environ, EX_USAGE
from typing import Sequence
import uvicorn
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.logging import LoggingInstrumentor
from opentelemetry.sdk.resources import Resource as OtResource
from opentelemetry.sdk.trace import TracerProvider as OtTracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from rich import print
from starlette.types import ASGIApp
from backend.db import db
from backend.idfm_interface import Destinations as IdfmDestinations, IdfmInterface
@@ -26,6 +40,11 @@ if API_KEY is None:
print('No "API_KEY" environment variable set... abort.')
exit(EX_USAGE)
APP_NAME = environ.get("APP_NAME", "app")
MODE = environ.get("MODE", "grpc")
COLLECTOR_ENDPOINT_GRPC_ENDPOINT = environ.get(
"COLLECTOR_ENDPOINT_GRPC_ENDPOINT", "127.0.0.1:14250" # "jaeger-collector:14250"
)
# TODO: Remove postgresql+asyncpg from environ variable
DB_PATH = "postgresql+asyncpg://cer_user:cer_password@127.0.0.1:5438/cer_db"
@@ -42,6 +61,14 @@ app.add_middleware(
allow_headers=["*"],
)
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(OTLPSpanExporter()))
tracer = trace.get_tracer(APP_NAME)
with tracer.start_as_current_span("foo"):
print("Hello world!")
idfm_interface = IdfmInterface(API_KEY, db)
@@ -247,3 +274,9 @@ async def get_stop_shape(stop_id: int) -> StopShapeSchema | None:
msg = f"No shape found for stop {stop_id}"
raise HTTPException(status_code=404, detail=msg)
FastAPIInstrumentor.instrument_app(app)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=4443, ssl_certfile="./config/cert.pem")