|
23 | 23 | import logging
|
24 | 24 | import os
|
25 | 25 | import re
|
| 26 | +import sys |
26 | 27 | from shutil import make_archive, rmtree
|
27 | 28 | from typing import (
|
28 | 29 | TYPE_CHECKING,
|
|
40 | 41 |
|
41 | 42 | import dateutil.parser
|
42 | 43 | from dateutil import tz
|
| 44 | +from fastapi import FastAPI |
43 | 45 | from fastapi.responses import StreamingResponse
|
| 46 | +from opentelemetry import metrics, trace |
| 47 | +from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter |
| 48 | +from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter |
| 49 | +from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor |
| 50 | +from opentelemetry.sdk.metrics import MeterProvider |
| 51 | +from opentelemetry.sdk.metrics._internal.export import PeriodicExportingMetricReader |
| 52 | +from opentelemetry.sdk.resources import SERVICE_NAME, Resource |
| 53 | +from opentelemetry.sdk.trace import TracerProvider |
| 54 | +from opentelemetry.sdk.trace.export import BatchSpanProcessor |
44 | 55 | from shapely.geometry import Polygon, shape
|
45 | 56 |
|
46 | 57 | import eodag
|
|
69 | 80 | UnsupportedProductType,
|
70 | 81 | ValidationError,
|
71 | 82 | )
|
| 83 | +from eodag.utils.instrumentation.eodag import EODAGInstrumentor |
72 | 84 |
|
73 | 85 | if TYPE_CHECKING:
|
74 | 86 | from io import BufferedReader
|
@@ -1088,3 +1100,41 @@ def eodag_api_init() -> None:
|
1088 | 1100 | # pre-build search plugins
|
1089 | 1101 | for provider in eodag_api.available_providers():
|
1090 | 1102 | next(eodag_api._plugins_manager.get_search_plugins(provider=provider))
|
| 1103 | + |
| 1104 | + |
| 1105 | +def telemetry_init(fastapi_app: FastAPI = None): |
| 1106 | + """Init telemetry |
| 1107 | +
|
| 1108 | + :param fastapi_app: FastAPI to automatically instrument. |
| 1109 | + :type fastapi_app: FastAPI""" |
| 1110 | + |
| 1111 | + if not os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT"): |
| 1112 | + return None |
| 1113 | + if "opentelemetry" not in sys.modules: |
| 1114 | + return None |
| 1115 | + |
| 1116 | + # Start OTLP exporter |
| 1117 | + resource = Resource(attributes={SERVICE_NAME: "eodag-serve-rest"}) |
| 1118 | + # trace |
| 1119 | + tracer_provider = TracerProvider(resource=resource) |
| 1120 | + processor = BatchSpanProcessor(OTLPSpanExporter()) |
| 1121 | + tracer_provider.add_span_processor(processor) |
| 1122 | + trace.set_tracer_provider(tracer_provider) |
| 1123 | + # metrics |
| 1124 | + reader = PeriodicExportingMetricReader(OTLPMetricExporter()) |
| 1125 | + meter_provider = MeterProvider(resource=resource, metric_readers=[reader]) |
| 1126 | + metrics.set_meter_provider(meter_provider) |
| 1127 | + |
| 1128 | + # Auto instrumentation |
| 1129 | + if fastapi_app: |
| 1130 | + logger.debug("Instrument FastAPI app") |
| 1131 | + FastAPIInstrumentor.instrument_app( |
| 1132 | + app=fastapi_app, |
| 1133 | + tracer_provider=tracer_provider, |
| 1134 | + meter_provider=meter_provider, |
| 1135 | + ) |
| 1136 | + logger.debug("Instrument EODAG app") |
| 1137 | + EODAGInstrumentor(eodag_api).instrument( |
| 1138 | + tracer_provider=tracer_provider, |
| 1139 | + meter_provider=meter_provider, |
| 1140 | + ) |
0 commit comments