Name |
Date |
Size |
#Lines |
LOC |
||
---|---|---|---|---|---|---|
.. | - | - | ||||
.cargo/ | 12-May-2024 | - | 16 | 16 | ||
.config/ | 12-May-2024 | - | 12 | 11 | ||
.github/ | 12-May-2024 | - | 612 | 444 | ||
assets/ | 12-May-2024 | - | 5,608 | 5,598 | ||
bin/ | 12-May-2024 | - | 187 | 150 | ||
examples/ | 12-May-2024 | - | 3,058 | 2,229 | ||
tracing/ | 12-May-2024 | - | 11,701 | 7,199 | ||
tracing-appender/ | 12-May-2024 | - | 2,690 | 1,540 | ||
tracing-attributes/ | 12-May-2024 | - | 4,608 | 3,296 | ||
tracing-core/ | 12-May-2024 | - | 7,018 | 3,811 | ||
tracing-error/ | 12-May-2024 | - | 1,350 | 716 | ||
tracing-flame/ | 12-May-2024 | - | 868 | 559 | ||
tracing-futures/ | 12-May-2024 | - | 1,629 | 967 | ||
tracing-journald/ | 12-May-2024 | - | 1,082 | 755 | ||
tracing-log/ | 12-May-2024 | - | 2,439 | 1,685 | ||
tracing-macros/ | 12-May-2024 | - | 123 | 100 | ||
tracing-mock/ | 12-May-2024 | - | 1,519 | 1,331 | ||
tracing-opentelemetry/ | 12-May-2024 | - | 3,436 | 2,359 | ||
tracing-serde/ | 12-May-2024 | - | 883 | 570 | ||
tracing-subscriber/ | 12-May-2024 | - | 28,566 | 17,339 | ||
tracing-tower/ | 12-May-2024 | - | 781 | 670 | ||
.gitignore | D | 12-May-2024 | 1,012 | 53 | 40 | |
CONTRIBUTING.md | D | 12-May-2024 | 19.4 KiB | 460 | 347 | |
Cargo.toml | D | 12-May-2024 | 374 | 21 | 19 | |
LICENSE | D | 12-May-2024 | 1 KiB | 26 | 22 | |
OAT.xml | D | 12-May-2024 | 4.2 KiB | 67 | 13 | |
README.OpenSource | D | 12-May-2024 | 286 | 12 | 11 | |
README.md | D | 12-May-2024 | 20.6 KiB | 497 | 394 | |
clippy.toml | D | 12-May-2024 | 125 | 5 | 4 | |
netlify.toml | D | 12-May-2024 | 343 | 19 | 16 |
README.OpenSource
1[ 2 { 3 "Name": "tracing", 4 "License": "MIT", 5 "License File": "LICENSE-MIT", 6 "Version Number": "0.1.37", 7 "Owner": "xuelei3@huawei.com", 8 "Upstream URL": "https://github.com/tokio-rs/tracing", 9 "Description": "Application-level tracing for Rust." 10 } 11] 12
README.md
1![Tracing — Structured, application-level diagnostics][splash] 2 3[splash]: https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/splash.svg 4 5[![Crates.io][crates-badge]][crates-url] 6[![Documentation][docs-badge]][docs-url] 7[![Documentation (master)][docs-master-badge]][docs-master-url] 8[![MIT licensed][mit-badge]][mit-url] 9[![Build Status][actions-badge]][actions-url] 10[![Discord chat][discord-badge]][discord-url] 11 12[crates-badge]: https://img.shields.io/crates/v/tracing.svg 13[crates-url]: https://crates.io/crates/tracing 14[docs-badge]: https://docs.rs/tracing/badge.svg 15[docs-url]: https://docs.rs/tracing 16[docs-master-badge]: https://img.shields.io/badge/docs-master-blue 17[docs-master-url]: https://tracing-rs.netlify.com 18[mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg 19[mit-url]: LICENSE 20[actions-badge]: https://github.com/tokio-rs/tracing/workflows/CI/badge.svg 21[actions-url]:https://github.com/tokio-rs/tracing/actions?query=workflow%3ACI 22[discord-badge]: https://img.shields.io/discord/500028886025895936?logo=discord&label=discord&logoColor=white 23[discord-url]: https://discord.gg/EeF3cQw 24 25[Website](https://tokio.rs) | 26[Chat](https://discord.gg/EeF3cQw) | [Documentation (master branch)](https://tracing-rs.netlify.com/) 27 28## Overview 29 30`tracing` is a framework for instrumenting Rust programs to collect 31structured, event-based diagnostic information. `tracing` is maintained by the 32Tokio project, but does _not_ require the `tokio` runtime to be used. 33 34## Usage 35 36### In Applications 37 38In order to record trace events, executables have to use a `Subscriber` 39implementation compatible with `tracing`. A `Subscriber` implements a way of 40collecting trace data, such as by logging it to standard output. 41[`tracing-subscriber`][tracing-subscriber-docs]'s [`fmt` module][fmt] provides 42a subscriber for logging traces with reasonable defaults. Additionally, 43`tracing-subscriber` is able to consume messages emitted by `log`-instrumented 44libraries and modules. 45 46To use `tracing-subscriber`, add the following to your `Cargo.toml`: 47 48```toml 49[dependencies] 50tracing = "0.1" 51tracing-subscriber = "0.3" 52``` 53 54Then create and install a `Subscriber`, for example using [`init()`]: 55 56```rust 57use tracing::info; 58use tracing_subscriber; 59 60fn main() { 61 // install global subscriber configured based on RUST_LOG envvar. 62 tracing_subscriber::fmt::init(); 63 64 let number_of_yaks = 3; 65 // this creates a new event, outside of any spans. 66 info!(number_of_yaks, "preparing to shave yaks"); 67 68 let number_shaved = yak_shave::shave_all(number_of_yaks); 69 info!( 70 all_yaks_shaved = number_shaved == number_of_yaks, 71 "yak shaving completed." 72 ); 73} 74``` 75 76Using `init()` calls [`set_global_default()`] so this subscriber will be used 77as the default in all threads for the remainder of the duration of the 78program, similar to how loggers work in the `log` crate. 79 80[tracing-subscriber-docs]: https://docs.rs/tracing-subscriber/ 81[fmt]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/fmt/index.html 82[`set_global_default`]: https://docs.rs/tracing/latest/tracing/subscriber/fn.set_global_default.html 83 84 85For more control, a subscriber can be built in stages and not set globally, 86but instead used to locally override the default subscriber. For example: 87 88```rust 89use tracing::{info, Level}; 90use tracing_subscriber; 91 92fn main() { 93 let subscriber = tracing_subscriber::fmt() 94 // filter spans/events with level TRACE or higher. 95 .with_max_level(Level::TRACE) 96 // build but do not install the subscriber. 97 .finish(); 98 99 tracing::subscriber::with_default(subscriber, || { 100 info!("This will be logged to stdout"); 101 }); 102 info!("This will _not_ be logged to stdout"); 103} 104``` 105 106Any trace events generated outside the context of a subscriber will not be collected. 107 108This approach allows trace data to be collected by multiple subscribers 109within different contexts in the program. Note that the override only applies to the 110currently executing thread; other threads will not see the change from with_default. 111 112Once a subscriber has been set, instrumentation points may be added to the 113executable using the `tracing` crate's macros. 114 115[`tracing-subscriber`]: https://docs.rs/tracing-subscriber/ 116[fmt]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/fmt/index.html 117[`init()`]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/fmt/fn.init.html 118[`set_global_default()`]: https://docs.rs/tracing/latest/tracing/subscriber/fn.set_global_default.html 119 120### In Libraries 121 122Libraries should only rely on the `tracing` crate and use the provided macros 123and types to collect whatever information might be useful to downstream consumers. 124 125```rust 126use std::{error::Error, io}; 127use tracing::{debug, error, info, span, warn, Level}; 128 129// the `#[tracing::instrument]` attribute creates and enters a span 130// every time the instrumented function is called. The span is named after the 131// the function or method. Parameters passed to the function are recorded as fields. 132#[tracing::instrument] 133pub fn shave(yak: usize) -> Result<(), Box<dyn Error + 'static>> { 134 // this creates an event at the DEBUG level with two fields: 135 // - `excitement`, with the key "excitement" and the value "yay!" 136 // - `message`, with the key "message" and the value "hello! I'm gonna shave a yak." 137 // 138 // unlike other fields, `message`'s shorthand initialization is just the string itself. 139 debug!(excitement = "yay!", "hello! I'm gonna shave a yak."); 140 if yak == 3 { 141 warn!("could not locate yak!"); 142 // note that this is intended to demonstrate `tracing`'s features, not idiomatic 143 // error handling! in a library or application, you should consider returning 144 // a dedicated `YakError`. libraries like snafu or thiserror make this easy. 145 return Err(io::Error::new(io::ErrorKind::Other, "shaving yak failed!").into()); 146 } else { 147 debug!("yak shaved successfully"); 148 } 149 Ok(()) 150} 151 152pub fn shave_all(yaks: usize) -> usize { 153 // Constructs a new span named "shaving_yaks" at the TRACE level, 154 // and a field whose key is "yaks". This is equivalent to writing: 155 // 156 // let span = span!(Level::TRACE, "shaving_yaks", yaks = yaks); 157 // 158 // local variables (`yaks`) can be used as field values 159 // without an assignment, similar to struct initializers. 160 let span = span!(Level::TRACE, "shaving_yaks", yaks); 161 let _enter = span.enter(); 162 163 info!("shaving yaks"); 164 165 let mut yaks_shaved = 0; 166 for yak in 1..=yaks { 167 let res = shave(yak); 168 debug!(yak, shaved = res.is_ok()); 169 170 if let Err(ref error) = res { 171 // Like spans, events can also use the field initialization shorthand. 172 // In this instance, `yak` is the field being initialized. 173 error!(yak, error = error.as_ref(), "failed to shave yak!"); 174 } else { 175 yaks_shaved += 1; 176 } 177 debug!(yaks_shaved); 178 } 179 180 yaks_shaved 181} 182``` 183 184```toml 185[dependencies] 186tracing = "0.1" 187``` 188 189Note: Libraries should *NOT* install a subscriber by using a method that calls 190[`set_global_default()`], as this will cause conflicts when executables try to 191set the default later. 192 193### In Asynchronous Code 194 195To trace `async fn`s, the preferred method is using the [`#[instrument]`][instrument] attribute: 196 197```rust 198use tracing::{info, instrument}; 199use tokio::{io::AsyncWriteExt, net::TcpStream}; 200use std::io; 201 202#[instrument] 203async fn write(stream: &mut TcpStream) -> io::Result<usize> { 204 let result = stream.write(b"hello world\n").await; 205 info!("wrote to stream; success={:?}", result.is_ok()); 206 result 207} 208``` 209 210Special handling is needed for the general case of code using 211[`std::future::Future`][std-future] or blocks with `async`/`await`, as the 212following example _will not_ work: 213 214```rust 215async { 216 let _s = span.enter(); 217 // ... 218} 219``` 220 221The span guard `_s` will not exit until the future generated by the `async` block is complete. 222Since futures and spans can be entered and exited _multiple_ times without them completing, 223the span remains entered for as long as the future exists, rather than being entered only when 224it is polled, leading to very confusing and incorrect output. 225For more details, see [the documentation on closing spans][closing]. 226 227This problem can be solved using the [`Future::instrument`] combinator: 228 229```rust 230use tracing::Instrument; 231 232let my_future = async { 233 // ... 234}; 235 236my_future 237 .instrument(tracing::info_span!("my_future")) 238 .await 239``` 240 241`Future::instrument` attaches a span to the future, ensuring that the span's lifetime 242is as long as the future's. 243 244Under the hood, the [`#[instrument]`][instrument] macro performs the same explicit span 245attachment that `Future::instrument` does. 246 247[std-future]: https://doc.rust-lang.org/stable/std/future/trait.Future.html 248[closing]: https://docs.rs/tracing/latest/tracing/span/index.html#closing-spans 249[`Future::instrument`]: https://docs.rs/tracing/latest/tracing/trait.Instrument.html#method.instrument 250[instrument]: https://docs.rs/tracing/latest/tracing/attr.instrument.html 251 252## Supported Rust Versions 253 254Tracing is built against the latest stable release. The minimum supported 255version is 1.49. The current Tracing version is not guaranteed to build on Rust 256versions earlier than the minimum supported version. 257 258Tracing follows the same compiler support policies as the rest of the Tokio 259project. The current stable Rust compiler and the three most recent minor 260versions before it will always be supported. For example, if the current stable 261compiler version is 1.45, the minimum supported version will not be increased 262past 1.42, three minor versions prior. Increasing the minimum supported compiler 263version is not considered a semver breaking change as long as doing so complies 264with this policy. 265 266## Getting Help 267 268First, see if the answer to your question can be found in the API documentation. 269If the answer is not there, there is an active community in 270the [Tracing Discord channel][chat]. We would be happy to try to answer your 271question. Last, if that doesn't work, try opening an [issue] with the question. 272 273[chat]: https://discord.gg/EeF3cQw 274[issue]: https://github.com/tokio-rs/tracing/issues/new 275 276## Contributing 277 278:balloon: Thanks for your help improving the project! We are so happy to have 279you! We have a [contributing guide][guide] to help you get involved in the Tracing 280project. 281 282[guide]: CONTRIBUTING.md 283 284## Project layout 285 286The [`tracing`] crate contains the primary _instrumentation_ API, used for 287instrumenting libraries and applications to emit trace data. The [`tracing-core`] 288crate contains the _core_ API primitives on which the rest of `tracing` is 289instrumented. Authors of trace subscribers may depend on `tracing-core`, which 290guarantees a higher level of stability. 291 292Additionally, this repository contains several compatibility and utility 293libraries built on top of `tracing`. Some of these crates are in a pre-release 294state, and are less stable than the `tracing` and `tracing-core` crates. 295 296The crates included as part of Tracing are: 297 298* [`tracing-futures`]: Utilities for instrumenting `futures`. 299 ([crates.io][fut-crates]|[docs][fut-docs]) 300 301* [`tracing-macros`]: Experimental macros for emitting trace events (unstable). 302 303* [`tracing-attributes`]: Procedural macro attributes for automatically 304 instrumenting functions. ([crates.io][attr-crates]|[docs][attr-docs]) 305 306* [`tracing-log`]: Compatibility with the `log` crate (unstable). 307 308* [`tracing-opentelemetry`]: Provides a layer that connects spans from multiple 309 systems into a trace and emits them to [OpenTelemetry]-compatible distributed 310 tracing systems for processing and visualization. 311 ([crates.io][otel-crates]|[docs][otel-docs]) 312 313* [`tracing-serde`]: A compatibility layer for serializing trace data with 314 `serde` (unstable). 315 316* [`tracing-subscriber`]: Subscriber implementations, and utilities for 317 implementing and composing `Subscriber`s. 318 ([crates.io][sub-crates]|[docs][sub-docs]) 319 320* [`tracing-tower`]: Compatibility with the `tower` ecosystem (unstable). 321 322* [`tracing-appender`]: Utilities for outputting tracing data, including a file appender 323 and non-blocking writer. ([crates.io][app-crates]|[docs][app-docs]) 324 325* [`tracing-error`]: Provides `SpanTrace`, a type for instrumenting errors with 326 tracing spans 327 328* [`tracing-flame`]; Provides a layer for generating flame graphs based on 329 tracing span entry / exit events. 330 331* [`tracing-journald`]: Provides a layer for recording events to the 332 Linux `journald` service, preserving structured data. 333 334[`tracing`]: tracing 335[`tracing-core`]: tracing-core 336[`tracing-futures`]: tracing-futures 337[`tracing-macros`]: tracing-macros 338[`tracing-attributes`]: tracing-attributes 339[`tracing-log`]: tracing-log 340[`tracing-opentelemetry`]: tracing-opentelemetry 341[`tracing-serde`]: tracing-serde 342[`tracing-subscriber`]: tracing-subscriber 343[`tracing-tower`]: tracing-tower 344[`tracing-appender`]: tracing-appender 345[`tracing-error`]: tracing-error 346[`tracing-flame`]: tracing-flame 347[`tracing-journald`]: tracing-journald 348 349[fut-crates]: https://crates.io/crates/tracing-futures 350[fut-docs]: https://docs.rs/tracing-futures 351 352[attr-crates]: https://crates.io/crates/tracing-attributes 353[attr-docs]: https://docs.rs/tracing-attributes 354 355[sub-crates]: https://crates.io/crates/tracing-subscriber 356[sub-docs]: https://docs.rs/tracing-subscriber 357 358[otel-crates]: https://crates.io/crates/tracing-opentelemetry 359[otel-docs]: https://docs.rs/tracing-opentelemetry 360[OpenTelemetry]: https://opentelemetry.io/ 361 362[app-crates]: https://crates.io/crates/tracing-appender 363[app-docs]: https://docs.rs/tracing-appender 364 365## Related Crates 366 367In addition to this repository, here are also several third-party crates which 368are not maintained by the `tokio` project. These include: 369 370- [`tracing-timing`] implements inter-event timing metrics on top of `tracing`. 371 It provides a subscriber that records the time elapsed between pairs of 372 `tracing` events and generates histograms. 373- [`tracing-honeycomb`] Provides a layer that reports traces spanning multiple machines to [honeycomb.io]. Backed by [`tracing-distributed`]. 374- [`tracing-distributed`] Provides a generic implementation of a layer that reports traces spanning multiple machines to some backend. 375- [`tracing-actix-web`] provides `tracing` integration for the `actix-web` web framework. 376- [`tracing-actix`] provides `tracing` integration for the `actix` actor 377 framework. 378- [`tracing-gelf`] implements a subscriber for exporting traces in Greylog 379 GELF format. 380- [`tracing-coz`] provides integration with the [coz] causal profiler 381 (Linux-only). 382- [`tracing-bunyan-formatter`] provides a layer implementation that reports events and spans in [bunyan] format, enriched with timing information. 383- [`tide-tracing`] provides a [tide] middleware to trace all incoming requests and responses. 384- [`color-spantrace`] provides a formatter for rendering span traces in the 385 style of `color-backtrace` 386- [`color-eyre`] provides customized panic and eyre report handlers for 387 `eyre::Report` for capturing span traces and backtraces with new errors and 388 pretty printing them. 389- [`spandoc`] provides a proc macro for constructing spans from doc comments 390 _inside_ of functions. 391- [`tracing-wasm`] provides a `Subscriber`/`Layer` implementation that reports 392 events and spans via browser `console.log` and [User Timing API (`window.performance`)]. 393- [`tracing-web`] provides a layer implementation of level-aware logging of events 394 to web browsers' `console.*` and span events to the [User Timing API (`window.performance`)]. 395- [`test-log`] takes care of initializing `tracing` for tests, based on 396 environment variables with an `env_logger` compatible syntax. 397- [`tracing-unwrap`] provides convenience methods to report failed unwraps on `Result` or `Option` types to a `Subscriber`. 398- [`diesel-tracing`] provides integration with [`diesel`] database connections. 399- [`tracing-tracy`] provides a way to collect [Tracy] profiles in instrumented 400 applications. 401- [`tracing-elastic-apm`] provides a layer for reporting traces to [Elastic APM]. 402- [`tracing-etw`] provides a layer for emitting Windows [ETW] events. 403- [`sentry-tracing`] provides a layer for reporting events and traces to [Sentry]. 404- [`tracing-forest`] provides a subscriber that preserves contextual coherence by 405 grouping together logs from the same spans during writing. 406- [`tracing-loki`] provides a layer for shipping logs to [Grafana Loki]. 407- [`tracing-logfmt`] provides a layer that formats events and spans into the logfmt format. 408- [`tracing-chrome`] provides a layer that exports trace data that can be viewed in `chrome://tracing`. 409- [`reqwest-tracing`] provides a middleware to trace [`reqwest`] HTTP requests. 410 411(if you're the maintainer of a `tracing` ecosystem crate not in this list, 412please let us know!) 413 414[`tracing-timing`]: https://crates.io/crates/tracing-timing 415[`tracing-honeycomb`]: https://crates.io/crates/tracing-honeycomb 416[`tracing-distributed`]: https://crates.io/crates/tracing-distributed 417[honeycomb.io]: https://www.honeycomb.io/ 418[`tracing-actix`]: https://crates.io/crates/tracing-actix 419[`tracing-actix-web`]: https://crates.io/crates/tracing-actix-web 420[`tracing-gelf`]: https://crates.io/crates/tracing-gelf 421[`tracing-coz`]: https://crates.io/crates/tracing-coz 422[coz]: https://github.com/plasma-umass/coz 423[`tracing-bunyan-formatter`]: https://crates.io/crates/tracing-bunyan-formatter 424[`tide-tracing`]: https://crates.io/crates/tide-tracing 425[tide]: https://crates.io/crates/tide 426[bunyan]: https://github.com/trentm/node-bunyan 427[`color-spantrace`]: https://docs.rs/color-spantrace 428[`color-eyre`]: https://docs.rs/color-eyre 429[`spandoc`]: https://docs.rs/spandoc 430[`tracing-wasm`]: https://docs.rs/tracing-wasm 431[`tracing-web`]: https://crates.io/crates/tracing-web 432[`test-log`]: https://crates.io/crates/test-log 433[User Timing API (`window.performance`)]: https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API 434[`tracing-unwrap`]: https://docs.rs/tracing-unwrap 435[`diesel`]: https://crates.io/crates/diesel 436[`diesel-tracing`]: https://crates.io/crates/diesel-tracing 437[`tracing-tracy`]: https://crates.io/crates/tracing-tracy 438[Tracy]: https://github.com/wolfpld/tracy 439[`tracing-elastic-apm`]: https://crates.io/crates/tracing-elastic-apm 440[Elastic APM]: https://www.elastic.co/apm 441[`tracing-etw`]: https://github.com/microsoft/tracing-etw 442[ETW]: https://docs.microsoft.com/en-us/windows/win32/etw/about-event-tracing 443[`sentry-tracing`]: https://crates.io/crates/sentry-tracing 444[Sentry]: https://sentry.io/welcome/ 445[`tracing-forest`]: https://crates.io/crates/tracing-forest 446[`tracing-loki`]: https://crates.io/crates/tracing-loki 447[Grafana Loki]: https://grafana.com/oss/loki/ 448[`tracing-logfmt`]: https://crates.io/crates/tracing-logfmt 449[`tracing-chrome`]: https://crates.io/crates/tracing-chrome 450[`reqwest-tracing`]: https://crates.io/crates/reqwest-tracing 451[`reqwest`]: https://crates.io/crates/reqwest 452 453**Note:** that some of the ecosystem crates are currently unreleased and 454undergoing active development. They may be less stable than `tracing` and 455`tracing-core`. 456 457## External Resources 458 459This is a list of links to blog posts, conference talks, and tutorials about 460Tracing. 461 462#### Blog Posts 463 464* [Diagnostics with Tracing][tokio-blog-2019-08] on the Tokio blog, August 2019 465* [Production-Grade Logging in Rust Applications][production-logging-2020], November 2020 466* [Custom Logging in Rust using `tracing` and `tracing-subscriber`, part 1][custom-logging-part-1] and [part 2][custom-logging-part-2], October 2021 467 468[tokio-blog-2019-08]: https://tokio.rs/blog/2019-08-tracing/ 469 470#### Talks 471 472* [Bay Area Rust Meetup talk and Q&A][bay-rust-2019-03], March 2019 473* [RustConf 2019 talk][rust-conf-2019-08-video] and [slides][rust-conf-2019-08-slides], August 2019 474* [Are we observable yet? @ RustyDays talk][rusty-days-2020-08-video] and [slides][rusty-days-2020-08-slides], August 2020 475 476[bay-rust-2019-03]: https://www.youtube.com/watch?v=j_kXRg3zlec 477[rust-conf-2019-08-video]: https://www.youtube.com/watch?v=JjItsfqFIdo 478[rust-conf-2019-08-slides]: https://www.elizas.website/slides/rustconf-8-2019.pdf 479[rusty-days-2020-08-video]: https://youtu.be/HtKnLiFwHJM 480[rusty-days-2020-08-slides]: https://docs.google.com/presentation/d/1zrxJs7fJgQ29bKfnAll1bYTo9cYZxsCZUwDDtyp5Fak/edit?usp=sharing 481[production-logging-2020]: https://medium.com/better-programming/production-grade-logging-in-rust-applications-2c7fffd108a6 482[custom-logging-part-1]: https://burgers.io/custom-logging-in-rust-using-tracing 483[custom-logging-part-2]: https://burgers.io/custom-logging-in-rust-using-tracing-part-2 484 485Help us expand this list! If you've written or spoken about Tracing, or 486know of resources that aren't listed, please open a pull request adding them. 487 488## License 489 490This project is licensed under the [MIT license](LICENSE). 491 492### Contribution 493 494Unless you explicitly state otherwise, any contribution intentionally submitted 495for inclusion in Tracing by you, shall be licensed as MIT, without any additional 496terms or conditions. 497