1use pyo3::prelude::*;
2use scouter_types::PyHelperFuncs;
3use scouter_types::TransportType;
4use serde::{Serialize, Serializer};
5
6fn redact<S: Serializer>(_: &str, s: S) -> Result<S::Ok, S::Error> {
7 s.serialize_str("***")
8}
9
10#[pyclass]
11#[derive(Clone, Serialize)]
12pub struct GrpcConfig {
13 #[pyo3(get, set)]
14 pub server_uri: String,
15
16 #[pyo3(get, set)]
17 pub username: String,
18
19 #[pyo3(set)]
20 #[serde(serialize_with = "redact")]
21 pub password: String,
22
23 #[pyo3(get, set)]
24 pub timeout_secs: Option<u64>,
25
26 #[pyo3(get, set)]
27 pub connect_timeout_secs: Option<u64>,
28
29 #[pyo3(get, set)]
30 pub keep_alive_interval_secs: Option<u64>,
31
32 #[pyo3(get, set)]
33 pub keep_alive_timeout_secs: Option<u64>,
34
35 #[pyo3(get, set)]
36 pub keep_alive_while_idle: Option<bool>,
37
38 #[pyo3(get)]
39 pub transport_type: TransportType,
40}
41
42impl std::fmt::Debug for GrpcConfig {
43 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
44 f.debug_struct("GrpcConfig")
45 .field("server_uri", &self.server_uri)
46 .field("username", &self.username)
47 .field("password", &"***")
48 .field("timeout_secs", &self.timeout_secs)
49 .field("connect_timeout_secs", &self.connect_timeout_secs)
50 .field("keep_alive_interval_secs", &self.keep_alive_interval_secs)
51 .field("keep_alive_timeout_secs", &self.keep_alive_timeout_secs)
52 .field("keep_alive_while_idle", &self.keep_alive_while_idle)
53 .field("transport_type", &self.transport_type)
54 .finish()
55 }
56}
57
58#[pymethods]
59impl GrpcConfig {
60 #[new]
61 #[pyo3(signature = (
62 server_uri=None,
63 username=None,
64 password=None,
65 timeout_secs=None,
66 connect_timeout_secs=None,
67 keep_alive_interval_secs=None,
68 keep_alive_timeout_secs=None,
69 keep_alive_while_idle=None,
70 ))]
71 #[allow(clippy::too_many_arguments)]
72 pub fn new(
73 server_uri: Option<String>,
74 username: Option<String>,
75 password: Option<String>,
76 timeout_secs: Option<u64>,
77 connect_timeout_secs: Option<u64>,
78 keep_alive_interval_secs: Option<u64>,
79 keep_alive_timeout_secs: Option<u64>,
80 keep_alive_while_idle: Option<bool>,
81 ) -> Self {
82 let server_uri = server_uri.unwrap_or_else(|| {
83 std::env::var("SCOUTER_GRPC_URI")
84 .unwrap_or_else(|_| "http://localhost:50051".to_string())
85 });
86
87 let username = username.unwrap_or_else(|| {
88 std::env::var("SCOUTER_USERNAME").unwrap_or_else(|_| "guest".to_string())
89 });
90
91 let password = password.unwrap_or_else(|| {
92 std::env::var("SCOUTER_PASSWORD").unwrap_or_else(|_| "guest".to_string())
93 });
94
95 GrpcConfig {
96 server_uri,
97 username,
98 password,
99 timeout_secs,
100 connect_timeout_secs,
101 keep_alive_interval_secs,
102 keep_alive_timeout_secs,
103 keep_alive_while_idle,
104 transport_type: TransportType::Grpc,
105 }
106 }
107
108 pub fn __str__(&self) -> String {
109 PyHelperFuncs::__str__(self)
110 }
111}
112
113impl Default for GrpcConfig {
114 fn default() -> Self {
115 Self::new(None, None, None, None, None, None, None, None)
116 }
117}