Skip to content

Commit 1eeca98

Browse files
OpenTelemetry monitoring (#348)
* perf: add telemetry * chore: update submodules * perf: add telemetry * chore: update submodules * fix: telemetry * fix: hanging docker stop * chore: update submodules * perf: enhance monitoring * chore(opentelemetry): update submodules
1 parent 27c9655 commit 1eeca98

File tree

5 files changed

+82
-40
lines changed

5 files changed

+82
-40
lines changed

app.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import os
23
from fastapi import FastAPI
34
from starlette.middleware import Middleware
45

@@ -64,16 +65,19 @@
6465
)
6566
from util import security, clean_up
6667
from middleware import log_storage
67-
from submodules.model import session
68+
from submodules.model import session, telemetry
6869
from controller.sums_table import manager as sums_table_manager
6970

7071
logging.basicConfig(level=logging.DEBUG)
7172
logger = logging.getLogger(__name__)
7273

74+
OTLP_GRPC_ENDPOINT = os.getenv("OTLP_GRPC_ENDPOINT", "tempo:4317")
75+
7376
init_config()
7477
migrate_kratos_users()
75-
fastapi_app = FastAPI()
7678

79+
app_name = "refinery-gateway"
80+
fastapi_app = FastAPI(title=app_name)
7781

7882
fastapi_app.include_router(
7983
org_router, prefix=PREFIX_ORGANIZATION, tags=["organization"]
@@ -116,7 +120,10 @@
116120
fastapi_app.include_router(
117121
playground_router, prefix=PREFIX_PLAYGROUND, tags=["playground"]
118122
)
119-
fastapi_app_internal = FastAPI()
123+
124+
app_name_internal = app_name + "-i"
125+
fastapi_app_internal = FastAPI(title=app_name_internal)
126+
120127
fastapi_app_internal.include_router(
121128
task_execution_router, prefix=PREFIX_TASK_EXECUTION, tags=["task-execution"]
122129
)
@@ -142,6 +149,31 @@
142149

143150
fastapi_app.middleware("http")(handle_db_session)
144151

152+
if telemetry.ENABLE_TELEMETRY:
153+
print("WARNING: Running telemetry.", flush=True)
154+
telemetry.setting_app_name(app_name)
155+
telemetry.setting_otlp(fastapi_app, app_name=app_name, endpoint=OTLP_GRPC_ENDPOINT)
156+
fastapi_app.add_middleware(telemetry.PrometheusMiddleware, app_name=app_name)
157+
fastapi_app.add_route("/metrics", telemetry.metrics)
158+
159+
# -------- internal --------
160+
app_name += "-i"
161+
telemetry.setting_otlp(
162+
fastapi_app_internal, app_name=app_name_internal, endpoint=OTLP_GRPC_ENDPOINT
163+
)
164+
fastapi_app_internal.add_middleware(
165+
telemetry.PrometheusMiddleware, app_name=app_name_internal
166+
)
167+
fastapi_app_internal.add_route("/metrics", telemetry.metrics)
168+
169+
# Filter out /metrics
170+
logging.getLogger("uvicorn.access").addFilter(
171+
lambda record: not any(
172+
item in record.getMessage()
173+
for item in ("GET /api/metrics", "GET /internal/api/metrics")
174+
)
175+
)
176+
145177
middleware = [Middleware(DatabaseSessionHandler)]
146178
app = Starlette(routes=routes, middleware=middleware)
147179

requirements.txt

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,21 @@ alembic==1.7.1
88
# via -r requirements/requirements.in
99
annotated-types==0.7.0
1010
# via
11-
# -r requirements/common-requirements.txt
11+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
1212
# pydantic
1313
anyio==4.11.0
1414
# via
15-
# -r requirements/common-requirements.txt
15+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
1616
# httpx
1717
# openai
1818
# starlette
1919
argon2-cffi==25.1.0
2020
# via
21-
# -r requirements/common-requirements.txt
21+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
2222
# minio
2323
argon2-cffi-bindings==25.1.0
2424
# via
25-
# -r requirements/common-requirements.txt
25+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
2626
# argon2-cffi
2727
asgiref==3.9.2
2828
# via
@@ -34,7 +34,7 @@ boto3==1.39.6
3434
# via -r requirements/common-requirements.txt
3535
botocore==1.39.17
3636
# via
37-
# -r requirements/common-requirements.txt
37+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
3838
# boto3
3939
# s3transfer
4040
catalogue==2.0.10
@@ -44,22 +44,22 @@ catalogue==2.0.10
4444
# thinc
4545
certifi==2025.8.3
4646
# via
47-
# -r requirements/common-requirements.txt
47+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
4848
# httpcore
4949
# httpx
5050
# minio
5151
# requests
5252
cffi==2.0.0
5353
# via
54-
# -r requirements/common-requirements.txt
54+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
5555
# argon2-cffi-bindings
5656
charset-normalizer==3.4.3
5757
# via
58-
# -r requirements/common-requirements.txt
58+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
5959
# requests
6060
click==8.3.0
6161
# via
62-
# -r requirements/common-requirements.txt
62+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
6363
# typer
6464
# uvicorn
6565
cloudpathlib==0.22.0
@@ -93,7 +93,7 @@ grpcio==1.75.0
9393
# opentelemetry-exporter-otlp-proto-grpc
9494
h11==0.16.0
9595
# via
96-
# -r requirements/common-requirements.txt
96+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
9797
# httpcore
9898
# uvicorn
9999
httpcore==1.0.9
@@ -102,7 +102,7 @@ httpx==0.28.1
102102
# via openai
103103
idna==3.10
104104
# via
105-
# -r requirements/common-requirements.txt
105+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
106106
# anyio
107107
# httpx
108108
# requests
@@ -114,7 +114,7 @@ jinja2==3.1.6
114114
# via spacy
115115
jmespath==1.0.1
116116
# via
117-
# -r requirements/common-requirements.txt
117+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
118118
# boto3
119119
# botocore
120120
langcodes==3.5.0
@@ -134,15 +134,15 @@ markupsafe==3.0.2
134134
mdurl==0.1.2
135135
# via markdown-it-py
136136
minio==7.2.15
137-
# via -r requirements/common-requirements.txt
137+
# via -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
138138
murmurhash==1.0.13
139139
# via
140140
# preshed
141141
# spacy
142142
# thinc
143143
numpy==1.26.2
144144
# via
145-
# -r requirements/common-requirements.txt
145+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
146146
# blis
147147
# pandas
148148
# spacy
@@ -210,7 +210,7 @@ packaging==25.0
210210
# thinc
211211
# weasel
212212
pandas==1.5.1
213-
# via -r requirements/common-requirements.txt
213+
# via -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
214214
preshed==3.0.10
215215
# via
216216
# spacy
@@ -226,16 +226,16 @@ psycopg2-binary==2.9.9
226226
# via -r requirements/common-requirements.txt
227227
pycparser==2.23
228228
# via
229-
# -r requirements/common-requirements.txt
229+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
230230
# cffi
231231
pycryptodome==3.23.0
232232
# via
233-
# -r requirements/common-requirements.txt
233+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
234234
# minio
235235
# rncryptor
236236
pydantic==2.7.4
237237
# via
238-
# -r requirements/common-requirements.txt
238+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
239239
# -r requirements/requirements.in
240240
# confection
241241
# fastapi
@@ -245,7 +245,7 @@ pydantic==2.7.4
245245
# weasel
246246
pydantic-core==2.18.4
247247
# via
248-
# -r requirements/common-requirements.txt
248+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
249249
# pydantic
250250
pygments==2.19.2
251251
# via rich
@@ -255,16 +255,16 @@ pyminizip==0.2.6
255255
# via -r requirements/requirements.in
256256
python-dateutil==2.9.0.post0
257257
# via
258-
# -r requirements/common-requirements.txt
258+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
259259
# botocore
260260
# pandas
261261
pytz==2025.2
262262
# via
263-
# -r requirements/common-requirements.txt
263+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
264264
# pandas
265265
requests==2.32.4
266266
# via
267-
# -r requirements/common-requirements.txt
267+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
268268
# docker
269269
# spacy
270270
# weasel
@@ -274,19 +274,19 @@ rncryptor==3.3.0
274274
# via -r requirements/requirements.in
275275
s3transfer==0.13.1
276276
# via
277-
# -r requirements/common-requirements.txt
277+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
278278
# boto3
279279
shellingham==1.5.4
280280
# via typer
281281
six==1.17.0
282282
# via
283-
# -r requirements/common-requirements.txt
283+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
284284
# python-dateutil
285285
smart-open==7.3.1
286286
# via weasel
287287
sniffio==1.3.1
288288
# via
289-
# -r requirements/common-requirements.txt
289+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
290290
# anyio
291291
# openai
292292
spacy[ja]==3.7.5
@@ -297,7 +297,7 @@ spacy-loggers==1.0.5
297297
# via spacy
298298
sqlalchemy==1.4.42
299299
# via
300-
# -r requirements/common-requirements.txt
300+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
301301
# alembic
302302
srsly==2.5.1
303303
# via
@@ -307,7 +307,7 @@ srsly==2.5.1
307307
# weasel
308308
starlette==0.47.3
309309
# via
310-
# -r requirements/common-requirements.txt
310+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
311311
# fastapi
312312
sudachidict-core==20250825
313313
# via spacy
@@ -327,7 +327,7 @@ typer==0.19.2
327327
# weasel
328328
typing-extensions==4.15.0
329329
# via
330-
# -r requirements/common-requirements.txt
330+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
331331
# anyio
332332
# fastapi
333333
# grpcio
@@ -343,13 +343,13 @@ typing-extensions==4.15.0
343343
# typer
344344
urllib3==2.5.0
345345
# via
346-
# -r requirements/common-requirements.txt
346+
# -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
347347
# botocore
348348
# docker
349349
# minio
350350
# requests
351351
uvicorn==0.35.0
352-
# via -r requirements/common-requirements.txt
352+
# via -r /Users/andhrelja/Projects/refinery-gateway/requirements/common-requirements.txt
353353
wasabi==1.1.3
354354
# via
355355
# spacy

requirements/requirements.in

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,11 @@ spacy[ja]==3.7.5
1010
pyminizip==0.2.6
1111
rncryptor==3.3.0
1212
pydantic==2.7.4
13-
openai==1.31.0
13+
openai==1.31.0
14+
opentelemetry-api==1.37.0
15+
opentelemetry-sdk==1.37.0
16+
opentelemetry-exporter-otlp-proto-grpc==1.37.0
17+
opentelemetry-instrumentation==0.58b0
18+
opentelemetry-instrumentation-fastapi==0.58b0
19+
opentelemetry-instrumentation-logging==0.58b0
20+
prometheus-client==0.23.1

start

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
DEBUG_MODE=false
44
DEBUG_PORT=15670
5+
ENABLE_TELEMETRY=false
56

6-
while getopts d flag
7+
while getopts dg flag
78
do
89
case "${flag}" in
910
d) DEBUG_MODE=true;;
11+
g) ENABLE_TELEMETRY=true;;
1012
esac
1113
done
1214

@@ -58,13 +60,13 @@ fi
5860

5961
MINIO_ENDPOINT="http://$HOST_IP:7053"
6062

61-
INFERENCE_DIR=${DEV_SETUP_DIR}inference/
62-
LOG_DIR=${DEV_SETUP_DIR}logs/
63+
INFERENCE_DIR=${DEV_SETUP_DIR}etc/inference/
64+
LOG_DIR=${DEV_SETUP_DIR}etc/logs/
6365

64-
CONFIG_DIR=${PWD%/*}/dev-setup/config/
66+
CONFIG_DIR=${PWD%/*}/dev-setup/etc/config/
6567
if [ ! -d "$CONFIG_DIR" ]
6668
then
67-
CONFIG_DIR=${PWD%/*/*}/dev-setup/config/
69+
CONFIG_DIR=${PWD%/*/*}/dev-setup/etc/config/
6870
if [ ! -d "$CONFIG_DIR" ]
6971
then
7072
# to include volume for local development, use the dev-setup inference folder:
@@ -120,6 +122,7 @@ docker run -d --rm \
120122
-e KERN_S3_ENDPOINT=${MINIO_ENDPOINT} \
121123
-e SMTP_HOST=mailhog \
122124
-e SMTP_PORT=1025 \
125+
-e ENABLE_TELEMETRY=$ENABLE_TELEMETRY \
123126
-v "$INFERENCE_DIR":/inference \
124127
-v "$LOG_DIR":/logs \
125128
-v "$CONFIG_DIR":/config \

0 commit comments

Comments
 (0)