mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-17 21:51:06 +00:00
update mick jaeger and add some sanity unit tests (#5067)
* test: verify identifier generation is correct in jaeger * bump mick jaeger to 0.1.8 Fixes the trace endianness issue. * more docs, extra traceID field for CandidateHash as extra tag * chore: spellcheck * fix assert statement
This commit is contained in:
committed by
GitHub
parent
3a11be1683
commit
9369dd3384
Generated
+2
-2
@@ -4456,9 +4456,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mick-jaeger"
|
name = "mick-jaeger"
|
||||||
version = "0.1.7"
|
version = "0.1.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fd2c2cc134e57461f0898b0e921f0a7819b5e3f3a4335b9aa390ce81a5f36fb9"
|
checksum = "69672161530e8aeca1d1400fbf3f1a1747ff60ea604265a4e906c2442df20532"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.3.21",
|
"futures 0.3.21",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ description = "Polkadot Jaeger primitives"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
async-std = "1.8.0"
|
async-std = "1.8.0"
|
||||||
mick-jaeger = "0.1.7"
|
mick-jaeger = "0.1.8"
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
parking_lot = "0.12.0"
|
parking_lot = "0.12.0"
|
||||||
polkadot-primitives = { path = "../../primitives" }
|
polkadot-primitives = { path = "../../primitives" }
|
||||||
|
|||||||
@@ -92,6 +92,21 @@ impl Jaeger {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Provide a no-thrills test setup helper.
|
||||||
|
#[cfg(test)]
|
||||||
|
pub fn test_setup() {
|
||||||
|
let mut instance = INSTANCE.write();
|
||||||
|
match *instance {
|
||||||
|
Self::Launched { .. } => {},
|
||||||
|
_ => {
|
||||||
|
let (traces_in, _traces_out) = mick_jaeger::init(mick_jaeger::Config {
|
||||||
|
service_name: "polkadot-jaeger-test".to_owned(),
|
||||||
|
});
|
||||||
|
*instance = Self::Launched { traces_in };
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Spawn the background task in order to send the tracing information out via UDP
|
/// Spawn the background task in order to send the tracing information out via UDP
|
||||||
#[cfg(not(target_os = "unknown"))]
|
#[cfg(not(target_os = "unknown"))]
|
||||||
pub fn launch<S: SpawnNamed>(self, spawner: S) -> result::Result<(), JaegerError> {
|
pub fn launch<S: SpawnNamed>(self, spawner: S) -> result::Result<(), JaegerError> {
|
||||||
@@ -133,6 +148,10 @@ impl Jaeger {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a span, but defer the evaluation/transformation into a `TraceIdentifier`.
|
||||||
|
///
|
||||||
|
/// The deferral allows to avoid the additional CPU runtime cost in case of
|
||||||
|
/// items that are not a pre-computed hash by themselves.
|
||||||
pub(crate) fn span<F>(&self, lazy_hash: F, span_name: &'static str) -> Option<mick_jaeger::Span>
|
pub(crate) fn span<F>(&self, lazy_hash: F, span_name: &'static str) -> Option<mick_jaeger::Span>
|
||||||
where
|
where
|
||||||
F: Fn() -> TraceIdentifier,
|
F: Fn() -> TraceIdentifier,
|
||||||
|
|||||||
@@ -177,6 +177,10 @@ pub(crate) type TraceIdentifier = u128;
|
|||||||
fn hash_to_identifier(hash: Hash) -> TraceIdentifier {
|
fn hash_to_identifier(hash: Hash) -> TraceIdentifier {
|
||||||
let mut buf = [0u8; 16];
|
let mut buf = [0u8; 16];
|
||||||
buf.copy_from_slice(&hash.as_ref()[0..16]);
|
buf.copy_from_slice(&hash.as_ref()[0..16]);
|
||||||
|
// The slice bytes are copied in reading order, so if interpreted
|
||||||
|
// in string form by a human, that means lower indices have higher
|
||||||
|
// values and hence corresponds to BIG endian ordering of the individual
|
||||||
|
// bytes.
|
||||||
u128::from_be_bytes(buf) as TraceIdentifier
|
u128::from_be_bytes(buf) as TraceIdentifier
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,12 +238,21 @@ impl LazyIdent for CandidateHash {
|
|||||||
|
|
||||||
fn extra_tags(&self, span: &mut Span) {
|
fn extra_tags(&self, span: &mut Span) {
|
||||||
span.add_string_fmt_debug_tag("candidate-hash", &self.0);
|
span.add_string_fmt_debug_tag("candidate-hash", &self.0);
|
||||||
|
// A convenience for usage with the grafana tempo UI,
|
||||||
|
// not a technical requirement. It merely provides an easy anchor
|
||||||
|
// where the true trace identifier of the span is not based on
|
||||||
|
// a candidate hash (which it should be!), but is required to
|
||||||
|
// continue investigating.
|
||||||
|
span.add_string_tag("traceID", self.eval().to_string());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Span {
|
impl Span {
|
||||||
/// Creates a new span builder based on anything that can be lazily evaluated
|
/// Creates a new span builder based on anything that can be lazily evaluated
|
||||||
/// to and identifier.
|
/// to and identifier.
|
||||||
|
///
|
||||||
|
/// Attention: The primary identifier will be used for identification
|
||||||
|
/// and as such should be
|
||||||
pub fn new<I: LazyIdent>(identifier: I, span_name: &'static str) -> Span {
|
pub fn new<I: LazyIdent>(identifier: I, span_name: &'static str) -> Span {
|
||||||
let mut span = INSTANCE
|
let mut span = INSTANCE
|
||||||
.read_recursive()
|
.read_recursive()
|
||||||
@@ -412,6 +425,14 @@ impl Span {
|
|||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Obtain the trace identifier for this set of spans.
|
||||||
|
pub fn trace_id(&self) -> Option<TraceIdentifier> {
|
||||||
|
match self {
|
||||||
|
Span::Enabled(inner) => Some(inner.trace_id().get()),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Debug for Span {
|
impl std::fmt::Debug for Span {
|
||||||
@@ -435,3 +456,46 @@ impl From<mick_jaeger::Span> for Span {
|
|||||||
Self::Enabled(src)
|
Self::Enabled(src)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use crate::Jaeger;
|
||||||
|
|
||||||
|
// make sure to not use `::repeat_*()` based samples, since this does not verify endianness
|
||||||
|
const RAW: [u8; 32] = [
|
||||||
|
0xFF, 0xAA, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x78, 0x89, 0x9A, 0xAB, 0xBC, 0xCD, 0xDE,
|
||||||
|
0xEF, 0x00, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
|
||||||
|
0x0E, 0x0F,
|
||||||
|
];
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hash_derived_identifier_is_leading_16bytes() {
|
||||||
|
let candidate_hash = dbg!(Hash::from(&RAW));
|
||||||
|
let trace_id = dbg!(hash_to_identifier(candidate_hash));
|
||||||
|
for (idx, (a, b)) in candidate_hash
|
||||||
|
.as_bytes()
|
||||||
|
.iter()
|
||||||
|
.take(16)
|
||||||
|
.zip(trace_id.to_be_bytes().iter())
|
||||||
|
.enumerate()
|
||||||
|
{
|
||||||
|
assert_eq!(*a, *b, "Index [{}] does not match: {} != {}", idx, a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn extra_tags_do_not_change_trace_id() {
|
||||||
|
Jaeger::test_setup();
|
||||||
|
let candidate_hash = dbg!(Hash::from(&RAW));
|
||||||
|
let trace_id = hash_to_identifier(candidate_hash);
|
||||||
|
|
||||||
|
let span = Span::new(candidate_hash, "foo");
|
||||||
|
|
||||||
|
assert_eq!(span.trace_id(), Some(trace_id));
|
||||||
|
|
||||||
|
let span = span.with_int_tag("tag", 7i64);
|
||||||
|
|
||||||
|
assert_eq!(span.trace_id(), Some(trace_id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user