@@ -53,6 +53,49 @@ impl SinkBatchSettings for OpentelemetryDefaultBatchSettings {
53
53
const TIMEOUT_SECS : f64 = 1.0 ;
54
54
}
55
55
56
+ #[ derive( Debug ) ]
57
+ pub struct OpentelemetrySinkEndpointError {
58
+ message : String ,
59
+ }
60
+
61
+ impl OpentelemetrySinkEndpointError {
62
+ pub fn new ( msg : & str ) -> Self {
63
+ OpentelemetrySinkEndpointError {
64
+ message : String :: from ( msg) ,
65
+ }
66
+ }
67
+ }
68
+
69
+ impl From < InvalidUri > for OpentelemetrySinkEndpointError {
70
+ fn from ( error : InvalidUri ) -> Self {
71
+ Self :: new ( & error. to_string ( ) )
72
+ }
73
+ }
74
+
75
+ impl From < & str > for OpentelemetrySinkEndpointError {
76
+ fn from ( error : & str ) -> Self {
77
+ Self :: new ( error)
78
+ }
79
+ }
80
+
81
+ impl From < http:: Error > for OpentelemetrySinkEndpointError {
82
+ fn from ( error : http:: Error ) -> Self {
83
+ Self :: new ( & error. to_string ( ) )
84
+ }
85
+ }
86
+
87
+ impl std:: fmt:: Display for OpentelemetrySinkEndpointError {
88
+ fn fmt ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
89
+ write ! ( f, "{}" , self . message)
90
+ }
91
+ }
92
+
93
+ impl std:: error:: Error for OpentelemetrySinkEndpointError {
94
+ fn description ( & self ) -> & str {
95
+ & self . message
96
+ }
97
+ }
98
+
56
99
#[ derive( Clone , Debug , Default ) ]
57
100
pub struct OpentelemetryEndpoint {
58
101
healthcheck_uri : Uri ,
@@ -62,66 +105,69 @@ pub struct OpentelemetryEndpoint {
62
105
}
63
106
64
107
impl OpentelemetryEndpoint {
65
- pub fn new ( endpoint : Uri ) -> Self {
66
- let scheme = endpoint. scheme_str ( ) . unwrap ( ) ;
67
- let authority = endpoint. authority ( ) . map ( |a| a. as_str ( ) ) . unwrap ( ) ;
68
- let host = endpoint. host ( ) . unwrap ( ) . to_owned ( ) ;
108
+ pub fn healthcheck ( & self ) -> Uri {
109
+ self . healthcheck_uri . clone ( )
110
+ }
111
+
112
+ pub fn endpoint ( & self , model_type : OpentelemetryModelType ) -> Option < Uri > {
113
+ match model_type {
114
+ OpentelemetryModelType :: Logs => Some ( self . logs_uri . clone ( ) ) ,
115
+ OpentelemetryModelType :: Metrics => Some ( self . metrics_uri . clone ( ) ) ,
116
+ OpentelemetryModelType :: Traces => Some ( self . traces_uri . clone ( ) ) ,
117
+ OpentelemetryModelType :: Unknown => None ,
118
+ }
119
+ }
120
+ }
121
+
122
+ impl TryFrom < String > for OpentelemetryEndpoint {
123
+ type Error = OpentelemetrySinkEndpointError ;
124
+
125
+ fn try_from ( endpoint : String ) -> Result < Self , Self :: Error > {
126
+ let uri = endpoint
127
+ . parse :: < Uri > ( )
128
+ . map_err ( OpentelemetrySinkEndpointError :: from) ?;
129
+
130
+ let scheme = uri. scheme_str ( ) . ok_or ( "Endpoint scheme is invalid" ) ?;
131
+ let authority = uri
132
+ . authority ( )
133
+ . map ( |a| a. as_str ( ) )
134
+ . ok_or ( "Endpoint authority is invalid" ) ?;
135
+ let host = uri. host ( ) . ok_or ( "Endpoint host is invalid" ) ?;
69
136
70
137
let healthcheck_uri = Uri :: builder ( )
71
138
. scheme ( scheme)
72
- . authority ( host + ":" + OPENTELEMETRY_HEALTHCHECK_PORT )
139
+ . authority ( host. to_owned ( ) + ":" + OPENTELEMETRY_HEALTHCHECK_PORT )
73
140
. path_and_query ( "/" )
74
141
. build ( )
75
- . unwrap ( ) ;
142
+ . map_err ( OpentelemetrySinkEndpointError :: from ) ? ;
76
143
77
144
let logs_uri = Uri :: builder ( )
78
145
. scheme ( scheme)
79
146
. authority ( authority)
80
147
. path_and_query ( "/v1/logs" )
81
148
. build ( )
82
- . unwrap ( ) ;
149
+ . map_err ( OpentelemetrySinkEndpointError :: from ) ? ;
83
150
84
151
let metrics_uri = Uri :: builder ( )
85
152
. scheme ( scheme)
86
153
. authority ( authority)
87
154
. path_and_query ( "/v1/metrics" )
88
155
. build ( )
89
- . unwrap ( ) ;
156
+ . map_err ( OpentelemetrySinkEndpointError :: from ) ? ;
90
157
91
158
let traces_uri = Uri :: builder ( )
92
159
. scheme ( scheme)
93
160
. authority ( authority)
94
161
. path_and_query ( "/v1/traces" )
95
162
. build ( )
96
- . unwrap ( ) ;
163
+ . map_err ( OpentelemetrySinkEndpointError :: from ) ? ;
97
164
98
- Self {
165
+ Ok ( Self {
99
166
healthcheck_uri,
100
167
logs_uri,
101
168
metrics_uri,
102
169
traces_uri,
103
- }
104
- }
105
-
106
- pub fn healthcheck ( & self ) -> Uri {
107
- self . healthcheck_uri . clone ( )
108
- }
109
-
110
- pub fn endpoint ( & self , model_type : OpentelemetryModelType ) -> Uri {
111
- match model_type {
112
- OpentelemetryModelType :: Logs => self . logs_uri . clone ( ) ,
113
- OpentelemetryModelType :: Metrics => self . metrics_uri . clone ( ) ,
114
- OpentelemetryModelType :: Traces => self . traces_uri . clone ( ) ,
115
- }
116
- }
117
- }
118
-
119
- impl TryFrom < String > for OpentelemetryEndpoint {
120
- type Error = InvalidUri ;
121
-
122
- fn try_from ( endpoint : String ) -> Result < Self , Self :: Error > {
123
- let uri = endpoint. parse :: < Uri > ( ) ?;
124
- Ok ( Self :: new ( uri) )
170
+ } )
125
171
}
126
172
}
127
173
@@ -224,7 +270,7 @@ impl SinkConfig for OpentelemetrySinkConfig {
224
270
client,
225
271
auth,
226
272
} ,
227
- ctx. mezmo_ctx ,
273
+ ctx. mezmo_ctx . clone ( ) ,
228
274
) ) ;
229
275
230
276
let compression = self . compression ;
@@ -233,6 +279,7 @@ impl SinkConfig for OpentelemetrySinkConfig {
233
279
encoder : OpentelemetryEncoder ,
234
280
compression,
235
281
batcher_settings,
282
+ mezmo_ctx : ctx. mezmo_ctx ,
236
283
} ;
237
284
Ok ( ( VectorSink :: from_event_streamsink ( sink) , healthcheck) )
238
285
}
0 commit comments