cx_sdk/client/
slos.rs
1use 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
77pub struct SloClient {
80 metadata_map: MetadataMap,
81 service_client: Mutex<SlosServiceClient<Channel>>,
82}
83
84impl SloClient {
85 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 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 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 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 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 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 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}