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 =
107            make_request_with_metadata(CreateSloRequest { slo: Some(slo) }, &self.metadata_map);
108        self.service_client
109            .lock()
110            .await
111            .create_slo(request)
112            .await
113            .map(|r| r.into_inner())
114            .map_err(|status| {
115                SdkError::ApiError(SdkApiError {
116                    status,
117                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/CreateServiceSlo"
118                        .to_string(),
119                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
120                })
121            })
122    }
123
124    /// Updates an existing SLO.
125    ///
126    /// # Arguments
127    /// * `slo` - The [`ServiceSlo`] to update.    
128    pub async fn update(&self, slo: Slo) -> Result<ReplaceSloResponse> {
129        let request =
130            make_request_with_metadata(ReplaceSloRequest { slo: Some(slo) }, &self.metadata_map);
131        self.service_client
132            .lock()
133            .await
134            .replace_slo(request)
135            .await
136            .map(|r| r.into_inner())
137            .map_err(|status| {
138                SdkError::ApiError(SdkApiError {
139                    status,
140                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/ReplaceServiceSlo"
141                        .to_string(),
142                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
143                })
144            })
145    }
146
147    /// Deletes a Service SLO.
148    ///
149    /// # Arguments
150    /// * `id` - The id of the Service SLO to delete.
151    pub async fn delete(&self, id: String) -> Result<DeleteSloResponse> {
152        let request = make_request_with_metadata(DeleteSloRequest { id }, &self.metadata_map);
153        self.service_client
154            .lock()
155            .await
156            .delete_slo(request)
157            .await
158            .map(|r| r.into_inner())
159            .map_err(|status| {
160                SdkError::ApiError(SdkApiError {
161                    status,
162                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/DeleteServiceSlo"
163                        .to_string(),
164                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
165                })
166            })
167    }
168
169    /// Get the Service SLO.
170    ///
171    /// # Arguments
172    /// * `id` - The ID of the Service SLO
173    pub async fn get(&self, id: String) -> Result<GetSloResponse> {
174        let request = make_request_with_metadata(GetSloRequest { id }, &self.metadata_map);
175
176        self.service_client
177            .lock()
178            .await
179            .get_slo(request)
180            .await
181            .map(|r| r.into_inner())
182            .map_err(|status| {
183                SdkError::ApiError(SdkApiError {
184                    status,
185                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/GetServiceSlo"
186                        .to_string(),
187                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
188                })
189            })
190    }
191
192    /// Get the Service SLO in bulk.
193    ///
194    /// # Arguments
195    /// * `ids` - The IDs of the Service SLO
196    pub async fn get_bulk(&self, ids: Vec<String>) -> Result<BatchGetSlosResponse> {
197        let request = make_request_with_metadata(BatchGetSlosRequest { ids }, &self.metadata_map);
198
199        self.service_client
200            .lock()
201            .await
202            .batch_get_slos(request)
203            .await
204            .map(|r| r.into_inner())
205            .map_err(|status| {
206                SdkError::ApiError(SdkApiError {
207                    status,
208                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/BatchGetServiceSlos"
209                        .to_string(),
210                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
211                })
212            })
213    }
214
215    /// List the Service SLOs.
216    ///
217    /// # Arguments
218    /// * `filter` - The [`SloFilters`] .
219    pub async fn list(&self, filters: Option<SloFilters>) -> Result<ListSlosResponse> {
220        let request = make_request_with_metadata(ListSlosRequest { filters }, &self.metadata_map);
221
222        self.service_client
223            .lock()
224            .await
225            .list_slos(request)
226            .await
227            .map(|r| r.into_inner())
228            .map_err(|status| {
229                SdkError::ApiError(SdkApiError {
230                    status,
231                    endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/ListServiceSlos"
232                        .to_string(),
233                    feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
234                })
235            })
236    }
237}