|
20 | 20 | from __future__ import annotations |
21 | 21 |
|
22 | 22 | import logging |
23 | | -from typing import TYPE_CHECKING, Union |
| 23 | +from typing import Union |
24 | 24 |
|
| 25 | +from fastapi import FastAPI |
25 | 26 | from opentelemetry import metrics, trace |
26 | 27 | from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter |
27 | 28 | from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter |
28 | 29 | from opentelemetry.instrumentation.eodag import EODAGInstrumentor |
29 | 30 | from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor |
30 | 31 | from opentelemetry.sdk.metrics import MeterProvider |
31 | | -from opentelemetry.sdk.metrics._internal.aggregation import ( |
32 | | - ExplicitBucketHistogramAggregation, |
33 | | -) |
34 | 32 | from opentelemetry.sdk.metrics._internal.export import PeriodicExportingMetricReader |
35 | | -from opentelemetry.sdk.metrics._internal.view import View |
36 | | - |
37 | | -# See https://github.com/open-telemetry/opentelemetry-python/issues/4615 for the type ignore |
38 | | -from opentelemetry.sdk.resources import Resource # type: ignore[attr-defined] |
| 33 | +from opentelemetry.sdk.resources import Resource |
39 | 34 | from opentelemetry.sdk.trace import TracerProvider |
40 | 35 | from opentelemetry.sdk.trace.export import BatchSpanProcessor |
41 | | -from opentelemetry.semconv.resource import ResourceAttributes |
42 | 36 |
|
43 | | -if TYPE_CHECKING: |
44 | | - from fastapi import FastAPI |
| 37 | +logger = logging.getLogger(__name__) |
45 | 38 |
|
46 | | - from eodag import EODataAccessGateway |
47 | 39 |
|
| 40 | +def get_resource(app: FastAPI) -> Resource: |
| 41 | + """create opentelemetry resource""" |
| 42 | + if not getattr(app.state, "resource", None): |
| 43 | + app.state.otel_resource = Resource.create().merge(Resource.create({"service.name": "stac-fastapi-eodag"})) |
48 | 44 |
|
49 | | -logger = logging.getLogger(__name__) |
| 45 | + return app.state.otel_resource |
50 | 46 |
|
51 | 47 |
|
52 | | -def create_tracer_provider(resource: Resource) -> Union[TracerProvider, trace.TracerProvider]: |
| 48 | +def get_tracer_provider(resource: Resource) -> Union[TracerProvider, trace.TracerProvider]: |
53 | 49 | """create opentelemetry tracer provider""" |
54 | 50 | tracer_provider = trace.get_tracer_provider() |
55 | 51 | if tracer_provider and not isinstance(tracer_provider, trace.ProxyTracerProvider): |
56 | | - logger.debug("Tracer provider already set, skipping creation.") |
57 | 52 | return tracer_provider |
58 | 53 |
|
59 | 54 | tracer_provider = TracerProvider(resource=resource) |
60 | 55 | processor = BatchSpanProcessor(OTLPSpanExporter()) |
61 | 56 | tracer_provider.add_span_processor(processor) |
62 | 57 | trace.set_tracer_provider(tracer_provider) |
| 58 | + |
63 | 59 | return tracer_provider |
64 | 60 |
|
65 | 61 |
|
66 | | -def create_meter_provider(resource: Resource) -> Union[MeterProvider, metrics.MeterProvider]: |
| 62 | +def get_meter_provider(resource: Resource) -> Union[MeterProvider, metrics.MeterProvider]: |
67 | 63 | """create opentelemetry meter provider""" |
68 | 64 | meter_provider = metrics.get_meter_provider() |
69 | 65 | if meter_provider and not isinstance(meter_provider, metrics._internal._ProxyMeterProvider): |
70 | | - logger.debug("Meter provider already set, skipping creation.") |
71 | 66 | return meter_provider |
72 | 67 |
|
73 | 68 | reader = PeriodicExportingMetricReader(OTLPMetricExporter()) |
74 | | - view_histograms: View = View( |
75 | | - instrument_type=metrics.Histogram, |
76 | | - aggregation=ExplicitBucketHistogramAggregation( |
77 | | - boundaries=( |
78 | | - 0.25, |
79 | | - 0.50, |
80 | | - 0.75, |
81 | | - 1.0, |
82 | | - 1.5, |
83 | | - 2.0, |
84 | | - 3.0, |
85 | | - 4.0, |
86 | | - 5.0, |
87 | | - 6.0, |
88 | | - 7.0, |
89 | | - 8.0, |
90 | | - 9.0, |
91 | | - 10.0, |
92 | | - ) |
93 | | - ), |
94 | | - ) |
95 | | - view_overhead_histograms: View = View( |
96 | | - instrument_type=metrics.Histogram, |
97 | | - instrument_name="*overhead*", |
98 | | - aggregation=ExplicitBucketHistogramAggregation( |
99 | | - boundaries=( |
100 | | - 0.030, |
101 | | - 0.040, |
102 | | - 0.050, |
103 | | - 0.060, |
104 | | - 0.070, |
105 | | - 0.080, |
106 | | - 0.090, |
107 | | - 0.100, |
108 | | - 0.125, |
109 | | - 0.150, |
110 | | - 0.175, |
111 | | - 0.200, |
112 | | - 0.250, |
113 | | - 0.500, |
114 | | - ) |
115 | | - ), |
116 | | - ) |
117 | | - meter_provider = MeterProvider( |
118 | | - resource=resource, |
119 | | - metric_readers=[reader], |
120 | | - views=( |
121 | | - view_histograms, |
122 | | - view_overhead_histograms, |
123 | | - ), |
124 | | - ) |
| 69 | + meter_provider = MeterProvider(resource=resource, metric_readers=[reader]) |
125 | 70 | metrics.set_meter_provider(meter_provider) |
| 71 | + |
126 | 72 | return meter_provider |
127 | 73 |
|
128 | 74 |
|
129 | | -def instrument_fastapi( |
130 | | - fastapi_app: FastAPI, |
131 | | -) -> None: |
| 75 | +def instrument_fastapi(app: FastAPI): |
132 | 76 | """Instrument FastAPI app.""" |
133 | 77 | logger.info("Instrument FastAPI app") |
134 | | - resource = Resource(attributes={ResourceAttributes.SERVICE_NAME: "stac-fastapi-eodag"}) |
135 | | - tracer_provider = create_tracer_provider(resource) |
136 | | - meter_provider = create_meter_provider(resource) |
| 78 | + resource = get_resource(app) |
| 79 | + |
137 | 80 | FastAPIInstrumentor.instrument_app( |
138 | | - app=fastapi_app, |
139 | | - tracer_provider=tracer_provider, |
140 | | - meter_provider=meter_provider, |
| 81 | + app=app, |
| 82 | + tracer_provider=get_tracer_provider(resource), |
| 83 | + meter_provider=get_meter_provider(resource), |
141 | 84 | ) |
142 | 85 |
|
143 | 86 |
|
144 | | -def instrument_eodag(eodag_api: EODataAccessGateway): |
| 87 | +def instrument_eodag(app: FastAPI): |
145 | 88 | """Instrument EODAG app""" |
146 | 89 | logger.info("Instrument EODAG app") |
147 | | - resource = Resource(attributes={ResourceAttributes.SERVICE_NAME: "stac-fastapi-eodag"}) |
148 | | - tracer_provider = create_tracer_provider(resource) |
149 | | - meter_provider = create_meter_provider(resource) |
150 | | - EODAGInstrumentor(eodag_api).instrument( |
151 | | - tracer_provider=tracer_provider, |
152 | | - meter_provider=meter_provider, |
| 90 | + resource = get_resource(app) |
| 91 | + |
| 92 | + EODAGInstrumentor(app.state.dag).instrument( |
| 93 | + tracer_provider=get_tracer_provider(resource), |
| 94 | + meter_provider=get_meter_provider(resource), |
153 | 95 | ) |
0 commit comments