Skip to content

Commit 0205ce5

Browse files
dalpassoalambare
authored andcommitted
feat: init OpenTelemetry metrics in server mode
The env var OTEL_EXPORTER_OTLP_ENDPOINT must be set to init the metrics
1 parent 6ed6056 commit 0205ce5

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

eodag/rest/server.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
get_stac_extension_oseo,
6161
get_stac_item_by_id,
6262
search_stac_items,
63+
telemetry_init,
6364
)
6465
from eodag.utils import DEFAULT_ITEMS_PER_PAGE, parse_header, update_nested_dict
6566
from eodag.utils.exceptions import (
@@ -725,3 +726,4 @@ def stac_search(
725726

726727

727728
app.include_router(router)
729+
telemetry_init(app)

eodag/rest/utils.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import logging
2424
import os
2525
import re
26+
import sys
2627
from shutil import make_archive, rmtree
2728
from typing import (
2829
TYPE_CHECKING,
@@ -40,7 +41,17 @@
4041

4142
import dateutil.parser
4243
from dateutil import tz
44+
from fastapi import FastAPI
4345
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
4455
from shapely.geometry import Polygon, shape
4556

4657
import eodag
@@ -69,6 +80,7 @@
6980
UnsupportedProductType,
7081
ValidationError,
7182
)
83+
from eodag.utils.instrumentation.eodag import EODAGInstrumentor
7284

7385
if TYPE_CHECKING:
7486
from io import BufferedReader
@@ -1088,3 +1100,41 @@ def eodag_api_init() -> None:
10881100
# pre-build search plugins
10891101
for provider in eodag_api.available_providers():
10901102
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

Comments
 (0)