Skip to main content

otelite_api/api/
resource_keys.rs

1use crate::server::AppState;
2use axum::{
3    extract::{Query, State},
4    http::StatusCode,
5    Json,
6};
7use otelite_core::api::ErrorResponse;
8use serde::{Deserialize, Serialize};
9
10/// Query parameters for the resource-keys endpoint
11#[derive(Debug, Deserialize)]
12pub struct ResourceKeysQuery {
13    /// Signal type: "logs", "spans", or "metrics"
14    pub signal: String,
15}
16
17/// Response containing distinct resource attribute keys
18#[derive(Debug, Serialize)]
19pub struct ResourceKeysResponse {
20    pub keys: Vec<String>,
21}
22
23/// Handler for GET /api/resource-keys?signal=<signal>
24pub async fn get_resource_keys(
25    State(state): State<AppState>,
26    Query(params): Query<ResourceKeysQuery>,
27) -> Result<Json<ResourceKeysResponse>, (StatusCode, Json<ErrorResponse>)> {
28    let keys = state
29        .storage
30        .distinct_resource_keys(&params.signal)
31        .await
32        .map_err(|e| {
33            (
34                StatusCode::INTERNAL_SERVER_ERROR,
35                Json(ErrorResponse::storage_error(format!(
36                    "distinct resource keys: {}",
37                    e
38                ))),
39            )
40        })?;
41
42    Ok(Json(ResourceKeysResponse { keys }))
43}