fiberplane_models/providers/
data.rs

1use crate::{events::Event, timestamps::Timestamp};
2#[cfg(feature = "fp-bindgen")]
3use fp_bindgen::prelude::Serializable;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6use std::collections::BTreeMap;
7use typed_builder::TypedBuilder;
8
9/// A single event that is used within providers.
10///
11/// Events occur at a given time and optionally last until a given end time.
12/// They may contain both event-specific metadata as well as OpenTelemetry
13/// metadata.
14#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
15#[cfg_attr(
16    feature = "fp-bindgen",
17    derive(Serializable),
18    fp(rust_module = "fiberplane_models::providers")
19)]
20#[non_exhaustive]
21#[serde(rename_all = "camelCase")]
22pub struct ProviderEvent {
23    pub time: Timestamp,
24    #[builder(default)]
25    #[serde(default, skip_serializing_if = "Option::is_none")]
26    pub end_time: Option<Timestamp>,
27
28    #[builder(default)]
29    #[serde(flatten)]
30    pub otel: OtelMetadata,
31
32    pub title: String,
33
34    #[builder(default)]
35    #[serde(default, skip_serializing_if = "Option::is_none")]
36    pub description: Option<String>,
37
38    #[builder(default)]
39    #[serde(default, skip_serializing_if = "Option::is_none")]
40    pub severity: Option<OtelSeverityNumber>,
41
42    #[builder(default)]
43    pub labels: BTreeMap<String, String>,
44}
45
46/// A single metric value.
47///
48/// Metric values are taken at a specific timestamp and contain a floating-point
49/// value as well as OpenTelemetry metadata.
50#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, TypedBuilder)]
51#[cfg_attr(
52    feature = "fp-bindgen",
53    derive(Serializable),
54    fp(rust_module = "fiberplane_models::providers")
55)]
56#[non_exhaustive]
57#[serde(rename_all = "camelCase")]
58pub struct Metric {
59    pub time: Timestamp,
60
61    #[serde(flatten)]
62    pub otel: OtelMetadata,
63
64    pub value: f64,
65}
66
67/// Metadata following the OpenTelemetry metadata spec.
68#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize, TypedBuilder)]
69#[cfg_attr(
70    feature = "fp-bindgen",
71    derive(Serializable),
72    fp(rust_module = "fiberplane_models::providers")
73)]
74#[non_exhaustive]
75#[serde(rename_all = "camelCase")]
76pub struct OtelMetadata {
77    pub attributes: BTreeMap<String, Value>,
78
79    pub resource: BTreeMap<String, Value>,
80
81    #[serde(default, skip_serializing_if = "Option::is_none")]
82    pub trace_id: Option<OtelTraceId>,
83
84    #[serde(default, skip_serializing_if = "Option::is_none")]
85    pub span_id: Option<OtelSpanId>,
86}
87
88/// SeverityNumber, as specified by OpenTelemetry:
89///  https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#field-severitynumber
90#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
91#[cfg_attr(
92    feature = "fp-bindgen",
93    derive(Serializable),
94    fp(rust_module = "fiberplane_models::providers")
95)]
96#[non_exhaustive]
97#[serde(rename_all = "camelCase")]
98pub struct OtelSeverityNumber(pub u8);
99
100/// Span ID, as specified by OpenTelemetry:
101///  https://opentelemetry.io/docs/reference/specification/overview/#spancontext
102#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
103#[cfg_attr(
104    feature = "fp-bindgen",
105    derive(Serializable),
106    fp(rust_module = "fiberplane_models::providers")
107)]
108#[non_exhaustive]
109#[serde(rename_all = "camelCase")]
110pub struct OtelSpanId(pub [u8; 8]);
111
112impl OtelSpanId {
113    pub fn new(data: [u8; 8]) -> Self {
114        Self(data)
115    }
116}
117
118/// Trace ID, as specified by OpenTelemetry:
119///  https://opentelemetry.io/docs/reference/specification/overview/#spancontext
120#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
121#[cfg_attr(
122    feature = "fp-bindgen",
123    derive(Serializable),
124    fp(rust_module = "fiberplane_models::providers")
125)]
126#[non_exhaustive]
127#[serde(rename_all = "camelCase")]
128pub struct OtelTraceId(pub [u8; 16]);
129
130impl OtelTraceId {
131    pub fn new(data: [u8; 16]) -> Self {
132        Self(data)
133    }
134}
135
136/// A timeline of events. It is shown split by days, so we store
137/// events days as an array of day strings in the format "YYYY-MM-DD"
138/// and a map of day strings to  all events that happen that day.
139#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize, TypedBuilder)]
140#[cfg_attr(
141    feature = "fp-bindgen",
142    derive(Serializable),
143    fp(rust_module = "fiberplane_models::providers")
144)]
145#[non_exhaustive]
146#[serde(rename_all = "camelCase")]
147pub struct Timeline {
148    pub days: Vec<String>,
149    pub events_by_day: BTreeMap<String, Vec<Event>>,
150    #[serde(flatten)]
151    pub otel: OtelMetadata,
152}
153
154/// A series of metrics over time, with metadata.
155#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize, TypedBuilder)]
156#[cfg_attr(
157    feature = "fp-bindgen",
158    derive(Serializable),
159    fp(rust_module = "fiberplane_models::providers")
160)]
161#[non_exhaustive]
162#[serde(rename_all = "camelCase")]
163pub struct Timeseries {
164    pub name: String,
165    pub labels: BTreeMap<String, String>,
166    pub metrics: Vec<Metric>,
167    #[serde(flatten)]
168    pub otel: OtelMetadata,
169
170    /// Whether the series should be rendered. Can be toggled by the user.
171    #[serde(default)]
172    pub visible: bool,
173}