add dependencies
toml
[dependencies]
opentelemetry-auto-span = "0.2"
annotate function
```rust use opentelemetryautospan::auto_span;
async fn getuser(
id: web::Path<(i64,)>,
db: web::Data
then, capture bellow information
get_user
start to end).await
span.await?
) and handle by ?
, logging the errorsqlx::query*
```rust
async fn getuser(
id: web::Path<(i64,)>,
db: web::Data
↓
``rust
async fn get_user(
id: web::Path<(i64,)>,
db: web::Data<sqlx::MySqlPool>,
) -> actix_web::Result<HttpResponse, Error> {
#[allow(unused_imports)]
use opentelemetry::trace::{Span, TraceContextExt, Tracer};
// make tracer
// tracer name can customize like
#[autospan(namedef="getname()")]
// Default name
&*TRACENAMEis intended to be defined in
lazystatic!`
let tracer = opentelemetry::global::tracer(&*TRACENAME);
// start function level span
let _ctx = opentelemetry::Context::currentwithspan(tracer.start("fn:getuser"));
let _guard = _ctx.clone().attach();
let _span = _ctx.span();
let user: User = {
// start sqlx `.await` span
let __ctx = opentelemetry::Context::current_with_span(__tracer.start("db"));
let __guard = __ctx.clone().attach();
let __span = __ctx.span();
__span.set_attribute(opentelemetry::KeyValue::new("aut_span.line", 57i64));
__span.set_attribute(opentelemetry::KeyValue::new(
"aut_span.code",
"let user: User = sqlx::query_as(\"SELECT * FROM users WHERE id = ?\")",
));
{
// capture SQL string
__span.set_attribute(opentelemetry::KeyValue::new(
"sql",
"SELECT * FROM users WHERE id = ?",
));
sqlx::query_as("SELECT * FROM users WHERE id = ?")
}
.bind(id.into_inner().0)
.fetch_one(&**db)
.await
}
// logging error
.map_err(|e| {
__span.set_status(
::opentelemetry::trace::StatusCode::Error,
format!(
"line {}, {}\n{}",
57i64, "let user: User = sqlx::query_as(\"SELECT * FROM users WHERE id = ?\")", e
),
);
e
})?;
Ok(HttpResponse::Ok().json(&user))
} ```
usage:
```rust
fn my_func() {} ```
| name | action |
|:--------------|:---------------------------------------------------------------------|
| name/namedef | Tracer name token. name
must be str, name_def
parse as rust expr |
| debug | Dump the migrated code to ./target/autospan or /tmp/autospan |
| nofuncspan | Not generate function level span split |
| allawait | Generate span for all await
|