cx_sdk/client/
slos.rs

1// Copyright 2024 Coralogix Ltd.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use std::str::FromStr;
16
17use crate::error::{
18    SdkApiError,
19    SdkError,
20};
21use crate::{
22    auth::AuthContext,
23    error::Result,
24    metadata::CallProperties,
25    util::make_request_with_metadata,
26};
27
28pub use cx_api::proto::com::coralogixapis::slo::v1::{
29    IsFilterPredicate,
30    Metric,
31    RequestBasedMetricSli,
32    Slo,
33    SloConstantFilterField,
34    SloFilter,
35    SloFilterField,
36    SloFilterPredicate,
37    SloFilters,
38    SloTimeFrame,
39    WindowBasedMetricSli,
40    slo::{
41        Sli,
42        Window,
43    },
44    slo_filter_field::Field,
45    slo_filter_predicate::Predicate,
46};
47
48use cx_api::proto::com::coralogixapis::slo::v1::slos_service_client::SlosServiceClient;
49use cx_api::proto::com::coralogixapis::slo::v1::{
50    BatchGetSlosRequest,
51    BatchGetSlosResponse,
52    CreateSloRequest,
53    CreateSloResponse,
54    DeleteSloRequest,
55    DeleteSloResponse,
56    GetSloRequest,
57    GetSloResponse,
58    ListSlosRequest,
59    ListSlosResponse,
60    ReplaceSloRequest,
61    ReplaceSloResponse,
62};
63use tokio::sync::Mutex;
64use tonic::{
65    metadata::MetadataMap,
66    transport::{
67        Channel,
68        ClientTlsConfig,
69        Endpoint,
70    },
71};
72
73use crate::CoralogixRegion;
74
75const INFRA_MONITORING_FEATURE_GROUP_ID: &str = "infra-monitoring";
76
77/// The Service Line Objectives (SLO) client.
78/// Read more at <https://coralogix.com/docs/slo-management-api/>
79pub struct SloClient {
80    metadata_map: MetadataMap,
81    service_client: Mutex<SlosServiceClient<Channel>>,
82}
83
84impl SloClient {
85    /// Creates a new client for the SLO.
86    ///
87    /// # Arguments
88    /// * `auth_context` - The [`AuthContext`] to use for authentication.
89    /// * `region` - The [`CoralogixRegion`] to connect to.
90    pub fn new(auth_context: AuthContext, region: CoralogixRegion) -> Result<Self> {
91        let channel: Channel = Endpoint::from_str(region.grpc_endpoint().as_str())?
92            .tls_config(ClientTlsConfig::new().with_native_roots())?
93            .connect_lazy();
94        let request_metadata: CallProperties = (&auth_context.team_level_api_key).into();
95        Ok(Self {
96            metadata_map: request_metadata.to_metadata_map(),
97            service_client: Mutex::new(SlosServiceClient::new(channel)),
98        })
99    }
100
101    /// Creates a new Service SLO.
102    ///
103    /// # Arguments
104    /// * `slo` - The [`ServiceSlo`] to create.
105    pub async fn create(&self, slo: Slo) -> Result<CreateSloResponse> {
106        let request = make_request_with_metadata(
107            CreateSloRequest {
108                slo: Some(slo),
109                silence_data_validations: Some(true),
110            },
111            &self.metadata_map,
112        );
113        self.service_client
114            .lock()
115            .await
116            .create_slo(request)
117            .await
118            .map(|r| r.into_inner())
119            .map_err(|status| {
120                SdkError::ApiError(SdkApiError {
121                    status,
122                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/CreateServiceSlo"
123                        .to_string(),
124                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
125                })
126            })
127    }
128
129    /// Updates an existing SLO.
130    ///
131    /// # Arguments
132    /// * `slo` - The [`ServiceSlo`] to update.    
133    pub async fn update(&self, slo: Slo) -> Result<ReplaceSloResponse> {
134        let request = make_request_with_metadata(
135            ReplaceSloRequest {
136                slo: Some(slo),
137                silence_data_validations: Some(true),
138            },
139            &self.metadata_map,
140        );
141        self.service_client
142            .lock()
143            .await
144            .replace_slo(request)
145            .await
146            .map(|r| r.into_inner())
147            .map_err(|status| {
148                SdkError::ApiError(SdkApiError {
149                    status,
150                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/ReplaceServiceSlo"
151                        .to_string(),
152                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
153                })
154            })
155    }
156
157    /// Deletes a Service SLO.
158    ///
159    /// # Arguments
160    /// * `id` - The id of the Service SLO to delete.
161    pub async fn delete(&self, id: String) -> Result<DeleteSloResponse> {
162        let request = make_request_with_metadata(DeleteSloRequest { id }, &self.metadata_map);
163        self.service_client
164            .lock()
165            .await
166            .delete_slo(request)
167            .await
168            .map(|r| r.into_inner())
169            .map_err(|status| {
170                SdkError::ApiError(SdkApiError {
171                    status,
172                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/DeleteServiceSlo"
173                        .to_string(),
174                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
175                })
176            })
177    }
178
179    /// Get the Service SLO.
180    ///
181    /// # Arguments
182    /// * `id` - The ID of the Service SLO
183    pub async fn get(&self, id: String) -> Result<GetSloResponse> {
184        let request = make_request_with_metadata(GetSloRequest { id }, &self.metadata_map);
185
186        self.service_client
187            .lock()
188            .await
189            .get_slo(request)
190            .await
191            .map(|r| r.into_inner())
192            .map_err(|status| {
193                SdkError::ApiError(SdkApiError {
194                    status,
195                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/GetServiceSlo"
196                        .to_string(),
197                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
198                })
199            })
200    }
201
202    /// Get the Service SLO in bulk.
203    ///
204    /// # Arguments
205    /// * `ids` - The IDs of the Service SLO
206    pub async fn get_bulk(&self, ids: Vec<String>) -> Result<BatchGetSlosResponse> {
207        let request = make_request_with_metadata(BatchGetSlosRequest { ids }, &self.metadata_map);
208
209        self.service_client
210            .lock()
211            .await
212            .batch_get_slos(request)
213            .await
214            .map(|r| r.into_inner())
215            .map_err(|status| {
216                SdkError::ApiError(SdkApiError {
217                    status,
218                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/BatchGetServiceSlos"
219                        .to_string(),
220                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
221                })
222            })
223    }
224
225    /// List the Service SLOs.
226    ///
227    /// # Arguments
228    /// * `filter` - The [`SloFilters`] .
229    pub async fn list(&self, filters: Option<SloFilters>) -> Result<ListSlosResponse> {
230        let request = make_request_with_metadata(ListSlosRequest { filters }, &self.metadata_map);
231
232        self.service_client
233            .lock()
234            .await
235            .list_slos(request)
236            .await
237            .map(|r| r.into_inner())
238            .map_err(|status| {
239                SdkError::ApiError(SdkApiError {
240                    status,
241                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/ListServiceSlos"
242                        .to_string(),
243                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
244                })
245            })
246    }
247}