Skip to content

Commit faaf94c

Browse files
authored
Updated OTLP integration. (#239)
1 parent d7e7f15 commit faaf94c

File tree

5 files changed

+66
-83
lines changed

5 files changed

+66
-83
lines changed

fastapi_template/template/{{cookiecutter.project_name}}/conditional_files.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,7 @@
205205
"Opentelemetry support": {
206206
"enabled": "{{cookiecutter.otlp_enabled}}",
207207
"resources": [
208-
"deploy/docker-compose.otlp.yml",
209-
"deploy/otel-collector-config.yml"
208+
"deploy/docker-compose.otlp.yml"
210209
]
211210
},
212211
"SQLite DB": {

fastapi_template/template/{{cookiecutter.project_name}}/deploy/docker-compose.otlp.yml

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@ services:
44
# Adds opentelemetry endpoint.
55
{{cookiecutter.project_name | upper}}_OPENTELEMETRY_ENDPOINT: "http://otel-collector:4317"
66

7-
otel-collector:
8-
image: otel/opentelemetry-collector-contrib:0.53.0
9-
volumes:
10-
# Adds config for opentelemetry.
11-
- ./deploy/otel-collector-config.yml:/config.yml
12-
command: --config config.yml
13-
ports:
14-
# Collector's endpoint
15-
- "4317:4317"
7+
{%- if cookiecutter.enable_taskiq == "True" %}
8+
taskiq-worker:
9+
environment:
10+
# Adds opentelemetry endpoint.
11+
{{cookiecutter.project_name | upper}}_OPENTELEMETRY_ENDPOINT: "http://otel-collector:4317"
12+
{%- endif %}
1613

17-
jaeger:
18-
image: jaegertracing/all-in-one:1.35
19-
hostname: jaeger
14+
otel-stack:
15+
image: grafana/otel-lgtm
16+
hostname: "otel-collector"
2017
ports:
21-
# Jaeger UI
22-
- 16686:16686
23-
18+
# Collector's GRPC endpoint
19+
- "4317:4317"
20+
# Collector's HTTP endpoint
21+
- "4318:4318"
22+
# Grafana UI
23+
- "3000:3000"

fastapi_template/template/{{cookiecutter.project_name}}/deploy/otel-collector-config.yml

Lines changed: 0 additions & 33 deletions
This file was deleted.

fastapi_template/template/{{cookiecutter.project_name}}/pyproject.toml

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -108,25 +108,22 @@ dependencies = [
108108
"sentry-sdk>=2.19.2,<3",
109109
{%- endif %}
110110
{%- if cookiecutter.otlp_enabled == "True" %}
111-
"opentelemetry-api>=1.29.0,<2",
112-
"opentelemetry-sdk>=1.29.0,<2",
113-
"opentelemetry-exporter-otlp>=1.29.0,<2",
114-
"opentelemetry-instrumentation>=0.50b0,<1",
115-
"opentelemetry-instrumentation-fastapi>=0.50b0,<1",
116-
{%- if cookiecutter.enable_loguru != "True" %}
117-
"opentelemetry-instrumentation-logging>=0.50b0,<1",
118-
{%- endif %}
111+
"opentelemetry-api>=1.38.0,<2",
112+
"opentelemetry-sdk>=1.38.0,<2",
113+
"opentelemetry-exporter-otlp>=1.38.0,<2",
114+
"opentelemetry-instrumentation>=0.59b0,<1",
115+
"opentelemetry-instrumentation-fastapi>=0.59b0,<1",
119116
{%- if cookiecutter.enable_redis == "True" %}
120-
"opentelemetry-instrumentation-redis>=0.50b0,<1",
117+
"opentelemetry-instrumentation-redis>=0.59b0,<1",
121118
{%- endif %}
122119
{%- if cookiecutter.db_info.name == "postgresql" and cookiecutter.orm in ["ormar", "tortoise"] %}
123-
"opentelemetry-instrumentation-asyncpg>=0.50b0,<1",
120+
"opentelemetry-instrumentation-asyncpg>=0.59b0,<1",
124121
{%- endif %}
125122
{%- if cookiecutter.orm == "sqlalchemy" %}
126-
"opentelemetry-instrumentation-sqlalchemy>=0.50b0,<1",
123+
"opentelemetry-instrumentation-sqlalchemy>=0.59b0,<1",
127124
{%- endif %}
128125
{%- if cookiecutter.enable_rmq == "True" %}
129-
"opentelemetry-instrumentation-aio-pika>=0.50b0,<1",
126+
"opentelemetry-instrumentation-aio-pika>=0.59b0,<1",
130127
{%- endif %}
131128
{%- endif %}
132129
{%- if cookiecutter.enable_loguru == "True" %}
@@ -197,7 +194,7 @@ warn_unused_ignores = false
197194
warn_return_any = false
198195
namespace_packages = true
199196
{%- if cookiecutter.api_type == "graphql" %}
200-
plugins = ["strawberry.ext.mypy_plugin"]
197+
plugins = []
201198
{%- endif %}
202199

203200
{%- if cookiecutter.enable_redis == "True" %}

fastapi_template/template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/web/lifespan.py

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,19 @@
4848
{%- endif %}
4949

5050
{%- if cookiecutter.otlp_enabled == "True" %}
51+
from opentelemetry import metrics, trace
52+
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter
53+
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
5154
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
5255
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
5356
from opentelemetry.sdk.resources import (DEPLOYMENT_ENVIRONMENT, SERVICE_NAME,
5457
TELEMETRY_SDK_LANGUAGE, Resource)
5558
from opentelemetry.sdk.trace import TracerProvider
5659
from opentelemetry.sdk.trace.export import BatchSpanProcessor
57-
from opentelemetry.trace import set_tracer_provider
60+
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
61+
from opentelemetry.sdk.metrics import MeterProvider
62+
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
63+
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
5864

5965
{%- if cookiecutter.enable_redis == "True" %}
6066
from opentelemetry.instrumentation.redis import RedisInstrumentor
@@ -164,24 +170,44 @@ def setup_opentelemetry(app: FastAPI) -> None: # pragma: no cover
164170
if not settings.opentelemetry_endpoint:
165171
return
166172

167-
tracer_provider = TracerProvider(
168-
resource=Resource(
169-
attributes={
170-
SERVICE_NAME: "{{cookiecutter.project_name}}",
171-
TELEMETRY_SDK_LANGUAGE: "python",
172-
DEPLOYMENT_ENVIRONMENT: settings.environment,
173-
}
174-
)
173+
otlp_resource = Resource(
174+
attributes={
175+
SERVICE_NAME: "{{cookiecutter.project_name}}",
176+
TELEMETRY_SDK_LANGUAGE: "python",
177+
DEPLOYMENT_ENVIRONMENT: settings.environment,
178+
}
175179
)
176180

181+
182+
tracer_provider = TracerProvider(resource=otlp_resource)
183+
177184
tracer_provider.add_span_processor(
178185
BatchSpanProcessor(
179186
OTLPSpanExporter(
180187
endpoint=settings.opentelemetry_endpoint,
181-
insecure=True,
182188
)
183189
)
184190
)
191+
trace.set_tracer_provider(tracer_provider=tracer_provider)
192+
193+
meter_provider = MeterProvider(
194+
resource=otlp_resource,
195+
metric_readers=[
196+
(PeriodicExportingMetricReader(OTLPMetricExporter(endpoint=settings.opentelemetry_endpoint))),
197+
],
198+
)
199+
metrics.set_meter_provider(meter_provider)
200+
201+
logger_provider = LoggerProvider(resource=otlp_resource)
202+
logger_provider.add_log_record_processor(
203+
BatchLogRecordProcessor(OTLPLogExporter(endpoint=settings.opentelemetry_endpoint)),
204+
)
205+
logging.getLogger().addHandler(
206+
LoggingHandler(
207+
level=logging.NOTSET,
208+
logger_provider=logger_provider,
209+
),
210+
)
185211

186212
excluded_endpoints = [
187213
app.url_path_for('health_check'),
@@ -220,22 +246,13 @@ def setup_opentelemetry(app: FastAPI) -> None: # pragma: no cover
220246
tracer_provider=tracer_provider,
221247
)
222248
{%- endif %}
223-
{%- if cookiecutter.enable_loguru != "True" %}
224-
LoggingInstrumentor().instrument(
225-
tracer_provider=tracer_provider,
226-
set_logging_format=True,
227-
log_level=logging.getLevelName(settings.log_level.value),
228-
)
229-
{%- endif %}
230249
{%- if cookiecutter.enable_taskiq == "True" %}
231-
TaskiqInstrumentor.instrument_broker(
250+
TaskiqInstrumentor().instrument_broker(
232251
broker,
233252
tracer_provider=tracer_provider,
234253
)
235254
{%- endif %}
236255

237-
set_tracer_provider(tracer_provider=tracer_provider)
238-
239256

240257
def stop_opentelemetry(app: FastAPI) -> None: # pragma: no cover
241258
"""
@@ -259,6 +276,9 @@ def stop_opentelemetry(app: FastAPI) -> None: # pragma: no cover
259276
{%- if cookiecutter.enable_rmq == "True" %}
260277
AioPikaInstrumentor().uninstrument()
261278
{%- endif %}
279+
{%- if cookiecutter.enable_taskiq == "True" %}
280+
TaskiqInstrumentor().uninstrument_broker(broker)
281+
{%- endif %}
262282

263283
{%- endif %}
264284

0 commit comments

Comments
 (0)