opendal/layers/
fastrace.rs1use std::fmt::Debug;
19use std::future::Future;
20use std::sync::Arc;
21
22use fastrace::prelude::*;
23
24use crate::raw::*;
25use crate::*;
26
27pub struct FastraceLayer;
107
108impl<A: Access> Layer<A> for FastraceLayer {
109 type LayeredAccess = FastraceAccessor<A>;
110
111 fn layer(&self, inner: A) -> Self::LayeredAccess {
112 FastraceAccessor { inner }
113 }
114}
115
116#[derive(Debug)]
117pub struct FastraceAccessor<A> {
118 inner: A,
119}
120
121impl<A: Access> LayeredAccess for FastraceAccessor<A> {
122 type Inner = A;
123 type Reader = FastraceWrapper<A::Reader>;
124 type Writer = FastraceWrapper<A::Writer>;
125 type Lister = FastraceWrapper<A::Lister>;
126 type Deleter = FastraceWrapper<A::Deleter>;
127
128 fn inner(&self) -> &Self::Inner {
129 &self.inner
130 }
131
132 #[trace]
133 fn info(&self) -> Arc<AccessorInfo> {
134 self.inner.info()
135 }
136
137 #[trace(enter_on_poll = true)]
138 async fn create_dir(&self, path: &str, args: OpCreateDir) -> Result<RpCreateDir> {
139 self.inner.create_dir(path, args).await
140 }
141
142 #[trace(enter_on_poll = true)]
143 async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
144 self.inner.read(path, args).await.map(|(rp, r)| {
145 (
146 rp,
147 FastraceWrapper::new(
148 Span::enter_with_local_parent(Operation::Read.into_static()),
149 r,
150 ),
151 )
152 })
153 }
154
155 #[trace(enter_on_poll = true)]
156 async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::Writer)> {
157 self.inner.write(path, args).await.map(|(rp, r)| {
158 (
159 rp,
160 FastraceWrapper::new(
161 Span::enter_with_local_parent(Operation::Write.into_static()),
162 r,
163 ),
164 )
165 })
166 }
167
168 #[trace(enter_on_poll = true)]
169 async fn copy(&self, from: &str, to: &str, args: OpCopy) -> Result<RpCopy> {
170 self.inner().copy(from, to, args).await
171 }
172
173 #[trace(enter_on_poll = true)]
174 async fn rename(&self, from: &str, to: &str, args: OpRename) -> Result<RpRename> {
175 self.inner().rename(from, to, args).await
176 }
177
178 #[trace(enter_on_poll = true)]
179 async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
180 self.inner.stat(path, args).await
181 }
182
183 #[trace(enter_on_poll = true)]
184 async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
185 self.inner.delete().await.map(|(rp, r)| {
186 (
187 rp,
188 FastraceWrapper::new(
189 Span::enter_with_local_parent(Operation::Delete.into_static()),
190 r,
191 ),
192 )
193 })
194 }
195
196 #[trace(enter_on_poll = true)]
197 async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
198 self.inner.list(path, args).await.map(|(rp, s)| {
199 (
200 rp,
201 FastraceWrapper::new(
202 Span::enter_with_local_parent(Operation::List.into_static()),
203 s,
204 ),
205 )
206 })
207 }
208
209 #[trace(enter_on_poll = true)]
210 async fn presign(&self, path: &str, args: OpPresign) -> Result<RpPresign> {
211 self.inner.presign(path, args).await
212 }
213}
214
215pub struct FastraceWrapper<R> {
216 span: Span,
217 inner: R,
218}
219
220impl<R> FastraceWrapper<R> {
221 fn new(span: Span, inner: R) -> Self {
222 Self { span, inner }
223 }
224}
225
226impl<R: oio::Read> oio::Read for FastraceWrapper<R> {
227 #[trace(enter_on_poll = true)]
228 async fn read(&mut self) -> Result<Buffer> {
229 self.inner.read().await
230 }
231}
232
233impl<R: oio::Write> oio::Write for FastraceWrapper<R> {
234 fn write(&mut self, bs: Buffer) -> impl Future<Output = Result<()>> + MaybeSend {
235 let _g = self.span.set_local_parent();
236 let _span = LocalSpan::enter_with_local_parent(Operation::Write.into_static());
237 self.inner.write(bs)
238 }
239
240 fn abort(&mut self) -> impl Future<Output = Result<()>> + MaybeSend {
241 let _g = self.span.set_local_parent();
242 let _span = LocalSpan::enter_with_local_parent(Operation::Write.into_static());
243 self.inner.abort()
244 }
245
246 fn close(&mut self) -> impl Future<Output = Result<Metadata>> + MaybeSend {
247 let _g = self.span.set_local_parent();
248 let _span = LocalSpan::enter_with_local_parent(Operation::Write.into_static());
249 self.inner.close()
250 }
251}
252
253impl<R: oio::List> oio::List for FastraceWrapper<R> {
254 #[trace(enter_on_poll = true)]
255 async fn next(&mut self) -> Result<Option<oio::Entry>> {
256 self.inner.next().await
257 }
258}
259
260impl<R: oio::Delete> oio::Delete for FastraceWrapper<R> {
261 fn delete(&mut self, path: &str, args: OpDelete) -> Result<()> {
262 let _g = self.span.set_local_parent();
263 let _span = LocalSpan::enter_with_local_parent(Operation::Delete.into_static());
264 self.inner.delete(path, args)
265 }
266
267 #[trace(enter_on_poll = true)]
268 async fn flush(&mut self) -> Result<usize> {
269 self.inner.flush().await
270 }
271}