| from base64 import b64encode |
|
|
| from fastapi import FastAPI |
| from open_webui.env import ( |
| ENABLE_OTEL_METRICS, |
| ENABLE_OTEL_TRACES, |
| OTEL_BASIC_AUTH_PASSWORD, |
| OTEL_BASIC_AUTH_USERNAME, |
| OTEL_EXPORTER_OTLP_ENDPOINT, |
| OTEL_EXPORTER_OTLP_INSECURE, |
| OTEL_OTLP_SPAN_EXPORTER, |
| OTEL_SERVICE_NAME, |
| ) |
| from open_webui.utils.telemetry.instrumentors import Instrumentor |
| from open_webui.utils.telemetry.metrics import setup_metrics |
| from opentelemetry import trace |
| from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter |
| from opentelemetry.exporter.otlp.proto.http.trace_exporter import ( |
| OTLPSpanExporter as HttpOTLPSpanExporter, |
| ) |
| from opentelemetry.sdk.resources import SERVICE_NAME, Resource |
| from opentelemetry.sdk.trace import TracerProvider |
| from opentelemetry.sdk.trace.export import BatchSpanProcessor |
| from sqlalchemy import Engine |
|
|
|
|
| def setup(app: FastAPI, db_engine: Engine): |
| |
| resource = Resource.create(attributes={SERVICE_NAME: OTEL_SERVICE_NAME}) |
| if ENABLE_OTEL_TRACES: |
| trace.set_tracer_provider(TracerProvider(resource=resource)) |
|
|
| |
| headers = [] |
| if OTEL_BASIC_AUTH_USERNAME and OTEL_BASIC_AUTH_PASSWORD: |
| auth_string = f'{OTEL_BASIC_AUTH_USERNAME}:{OTEL_BASIC_AUTH_PASSWORD}' |
| auth_header = b64encode(auth_string.encode()).decode() |
| headers = [('authorization', f'Basic {auth_header}')] |
|
|
| |
| if OTEL_OTLP_SPAN_EXPORTER == 'http': |
| exporter = HttpOTLPSpanExporter( |
| endpoint=OTEL_EXPORTER_OTLP_ENDPOINT, |
| headers=headers, |
| ) |
| else: |
| exporter = OTLPSpanExporter( |
| endpoint=OTEL_EXPORTER_OTLP_ENDPOINT, |
| insecure=OTEL_EXPORTER_OTLP_INSECURE, |
| headers=headers, |
| ) |
| trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(exporter)) |
| Instrumentor(app=app, db_engine=db_engine).instrument() |
|
|
| |
| if ENABLE_OTEL_METRICS: |
| setup_metrics(app, resource, db_engine) |
|
|