Skip to content

Commit 896d514

Browse files
committed
api: Add GET /telemetry endpoint for querying events
Add paginated query endpoint for telemetry events with support for filtering by any field (kind, runtime, device_type, job_name, result, is_infra_error, etc.) plus time range via since/until parameters. Signed-off-by: Denys Fedoryshchenko <denys.f@collabora.com>
1 parent 364d604 commit 896d514

1 file changed

Lines changed: 46 additions & 0 deletions

File tree

api/main.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,52 @@ async def post_telemetry(
994994
return {"inserted": len(result.inserted_ids)}
995995

996996

997+
@app.get('/telemetry', response_model=PageModel, tags=["telemetry"])
998+
async def get_telemetry(request: Request):
999+
"""Query telemetry events with optional filters.
1000+
1001+
Supports filtering by any TelemetryEvent field, plus time range
1002+
via 'since' and 'until' parameters (ISO 8601 format).
1003+
Results are paginated (default limit=50).
1004+
"""
1005+
metrics.add('http_requests_total', 1)
1006+
query_params = dict(request.query_params)
1007+
1008+
for pg_key in ['limit', 'offset']:
1009+
query_params.pop(pg_key, None)
1010+
1011+
since = query_params.pop('since', None)
1012+
until = query_params.pop('until', None)
1013+
if since or until:
1014+
ts_filter = {}
1015+
if since:
1016+
ts_filter['$gte'] = datetime.fromisoformat(since)
1017+
if until:
1018+
ts_filter['$lte'] = datetime.fromisoformat(until)
1019+
query_params['ts'] = ts_filter
1020+
1021+
# Convert string 'true'/'false' for boolean fields
1022+
if 'is_infra_error' in query_params:
1023+
val = query_params['is_infra_error'].lower()
1024+
if val not in ['true', 'false']:
1025+
raise HTTPException(
1026+
status_code=status.HTTP_400_BAD_REQUEST,
1027+
detail="Invalid value for is_infra_error, must be 'true' or 'false'",
1028+
)
1029+
if val == 'true':
1030+
query_params['is_infra_error'] = True
1031+
else:
1032+
query_params['is_infra_error'] = False
1033+
1034+
paginated_resp = await db.find_by_attributes(
1035+
TelemetryEvent, query_params
1036+
)
1037+
paginated_resp.items = serialize_paginated_data(
1038+
TelemetryEvent, paginated_resp.items
1039+
)
1040+
return paginated_resp
1041+
1042+
9971043
# -----------------------------------------------------------------------------
9981044
# Nodes
9991045
def _get_node_event_data(operation, node, is_hierarchy=False):

0 commit comments

Comments
 (0)