Runtime interface to add support for tracing from wasm (#6381)

* Add span recording to tracing implementation

* Add tracing proxy

* switch to rustc_hash::FxHashMap

* Replace lazy_static and hashmap with thread_local and vec.

* fix marking valid span as invalid while removing invalid spans

* refactor, add wasm_tracing module in `support`

* update registered spans

* tidy up

* typos

* refactor

* update flag name to signal lost trace - `is_valid_trace`

* update flag name to signal lost trace - `is_valid_trace`

* update docs

* update docs

* Use tracing Field recording to store the actual `name` and `target`
from wasm traces.

* fix debug log in subscriber + small refactor

* add tests

* handle misuse in case trying to exit span not held

* Implement filter for wasm traces, simplify field recording for primitive types

* remove superfluous warning

* update docs

* Update primitives/tracing/src/proxy.rs

Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>

* update docs, apply suggestions

* move Proxy from thread_local to `Extension`, rename macro

* fix test

* unify native & wasm span macro calls

* implement wasm tracing control facility in primitives and frame

* add cli flag `--wasm-tracing`

* fix

* switch to `Option<u4>` (possible performance degradation), switch
to static mut bool

* performance improvement using u64 vs Option<u64>

* performance improvement moving concat to client

* update docs

* Update client/cli/src/params/import_params.rs

Co-authored-by: Cecile Tonglet <cecile@parity.io>

* performance improvement

* Revert "performance improvement"

This reverts commit 55ff8817a86302cd93bb6197eb4ca5bc7f4fb524.

* small refactor

* formatting

* bump impl_version

* Update client/cli/src/config.rs

Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>

* update docs

* small fixes, remove pub static

* nit

* add integration tests and refactor Subscriber

* tests

* revert formatting

* try fix test that works locally but not in CI

* try fix test that works locally but not in CI

* debug test that works locally but not in CI

* fix test that works locally but not in CI

* remove pub visibility from bool in runtime

* make TracingSpanGuard #[cfg(not(feature = "std"))], update docs, comments

* make TracingProxy drop implementation conditional on !empty state

* add docs for TraceHandler

* remove blank line

* update expect message

* update tests

* rename cli option to tracing_enable_wasm

* rename cli option to tracing_enable_wasm

* fix

* ensure wasm-tracing features are wasm only

* bump impl_version

* bump impl_version

* add `"pallet-scheduler/std"` to `[features]` `std` in node/runtime

* refactor service to remove sp_tracing dependency

* refactor: line width, trait bounds

* improve LogTraceHandler output

* fix test

* improve tracing log output

* Apply suggestions from code review

* Apply suggestions from code review

Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>

* swap wasm indication from trace name to a separate value

* Update client/tracing/src/lib.rs

* add docs

* remove runtime features

remove wasm_tracing option from CLI

remove wasm_tracing flag from ProfilingSubscriber

Co-authored-by: Matt Rutherford <mattrutherford@users.noreply.github.com>
Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
Co-authored-by: Cecile Tonglet <cecile@parity.io>
This commit is contained in:
mattrutherford
2020-06-18 08:44:03 +01:00
committed by GitHub
parent bd5ad9fd6d
commit 74a989f353
12 changed files with 562 additions and 86 deletions
+51 -1
View File
@@ -216,7 +216,7 @@ pub trait DefaultChildStorage {
/// Clear a child storage key.
///
/// For the default child storage at `storage_key`, clear value at `key`.
fn clear (
fn clear(
&mut self,
storage_key: &[u8],
key: &[u8],
@@ -965,6 +965,55 @@ pub trait Logging {
}
}
#[cfg(feature = "std")]
sp_externalities::decl_extension! {
/// Extension to allow running traces in wasm via Proxy
pub struct TracingProxyExt(sp_tracing::proxy::TracingProxy);
}
/// Interface that provides functions for profiling the runtime.
#[runtime_interface]
pub trait WasmTracing {
/// To create and enter a `tracing` span, using `sp_tracing::proxy`
/// Returns 0 value to indicate that no further traces should be attempted
fn enter_span(&mut self, target: &str, name: &str) -> u64 {
if sp_tracing::wasm_tracing_enabled() {
match self.extension::<TracingProxyExt>() {
Some(proxy) => return proxy.enter_span(target, name),
None => {
if self.register_extension(TracingProxyExt(sp_tracing::proxy::TracingProxy::new())).is_ok() {
if let Some(proxy) = self.extension::<TracingProxyExt>() {
return proxy.enter_span(target, name);
}
} else {
log::warn!(
target: "tracing",
"Unable to register extension: TracingProxyExt"
);
}
}
}
}
log::debug!(
target: "tracing",
"Notify to runtime that tracing is disabled."
);
0
}
/// Exit a `tracing` span, using `sp_tracing::proxy`
fn exit_span(&mut self, id: u64) {
if let Some(proxy) = self.extension::<TracingProxyExt>() {
proxy.exit_span(id)
} else {
log::warn!(
target: "tracing",
"Unable to load extension: TracingProxyExt"
);
}
}
}
/// Wasm-only interface that provides functions for interacting with the sandbox.
#[runtime_interface(wasm_only)]
pub trait Sandbox {
@@ -1111,6 +1160,7 @@ pub type SubstrateHostFunctions = (
storage::HostFunctions,
default_child_storage::HostFunctions,
misc::HostFunctions,
wasm_tracing::HostFunctions,
offchain::HostFunctions,
crypto::HostFunctions,
hashing::HostFunctions,