Skip to content

Commit bd69642

Browse files
authored
Implement Display trait for Key and Value types (#353)
1 parent 5cf034c commit bd69642

File tree

9 files changed

+51
-38
lines changed

9 files changed

+51
-38
lines changed

opentelemetry-contrib/src/trace/exporter/datadog/model/v03.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,8 @@ pub(crate) fn encode(service_name: &str, spans: Vec<trace::SpanData>) -> Result<
6363
rmp::encode::write_str(&mut encoded, "meta")?;
6464
rmp::encode::write_map_len(&mut encoded, span.attributes.len() as u32)?;
6565
for (key, value) in span.attributes.iter() {
66-
let value_string: String = value.into();
6766
rmp::encode::write_str(&mut encoded, key.as_str())?;
68-
rmp::encode::write_str(&mut encoded, value_string.as_str())?;
67+
rmp::encode::write_str(&mut encoded, value.as_str().as_ref())?;
6968
}
7069
}
7170

opentelemetry-contrib/src/trace/exporter/datadog/model/v05.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,8 @@ fn encode_spans(
111111
rmp::encode::write_i32(&mut encoded, span.status_code as i32)?;
112112
rmp::encode::write_map_len(&mut encoded, span.attributes.len() as u32)?;
113113
for (key, value) in span.attributes.iter() {
114-
let value_string: String = value.into();
115114
rmp::encode::write_u32(&mut encoded, interner.intern(key.as_str()))?;
116-
rmp::encode::write_u32(&mut encoded, interner.intern(value_string.as_str()))?;
115+
rmp::encode::write_u32(&mut encoded, interner.intern(value.as_str().as_ref()))?;
117116
}
118117
rmp::encode::write_map_len(&mut encoded, 0)?;
119118
rmp::encode::write_u32(&mut encoded, span_type)?;

opentelemetry-jaeger/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ impl Into<jaeger::Tag> for KeyValue {
486486
Value::Bool(b) => jaeger::Tag::new(key.into(), jaeger::TagType::Bool, None, None, Some(b), None, None),
487487
Value::I64(i) => jaeger::Tag::new(key.into(), jaeger::TagType::Long, None, None, None, Some(i), None),
488488
// TODO: better Array handling, jaeger thrift doesn't support arrays
489-
v @ Value::Array(_) => jaeger::Tag::new(key.into(), jaeger::TagType::String, Some(v.into()), None, None, None, None),
489+
v @ Value::Array(_) => jaeger::Tag::new(key.into(), jaeger::TagType::String, Some(v.to_string()), None, None, None, None),
490490
}
491491
}
492492
}

opentelemetry-prometheus/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ fn build_histogram(
394394
fn build_label_pair(label: KeyValue) -> prometheus::proto::LabelPair {
395395
let mut lp = prometheus::proto::LabelPair::new();
396396
lp.set_name(label.key.into());
397-
lp.set_value(label.value.into());
397+
lp.set_value(label.value.to_string());
398398

399399
lp
400400
}

opentelemetry-zipkin/src/model/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ where
138138
{
139139
let mut map: HashMap<String, String> = HashMap::new();
140140
for kv in kvs {
141-
map.insert(kv.key.into(), kv.value.into());
141+
map.insert(kv.key.into(), kv.value.to_string());
142142
}
143143
map
144144
}

opentelemetry/src/api/baggage.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,8 @@ impl Baggage {
211211
if !key.as_str().is_ascii() {
212212
return false;
213213
}
214-
let value = String::from(value);
215-
if key_value_metadata_bytes_size(key.as_str(), value.as_str(), metadata.as_str())
214+
let value = value.as_str();
215+
if key_value_metadata_bytes_size(key.as_str(), value.as_ref(), metadata.as_str())
216216
< MAX_BYTES_FOR_ONE_PAIR
217217
{
218218
match self.inner.get(key) {
@@ -234,7 +234,7 @@ impl Baggage {
234234
metadata.as_str().len() + value.len() + key.as_str().len()
235235
}
236236
Some((old_value, old_metadata)) => {
237-
let old_value = String::from(old_value);
237+
let old_value = old_value.as_str();
238238
if self.kv_content_len - old_metadata.as_str().len() - old_value.len()
239239
+ metadata.as_str().len()
240240
+ value.len()

opentelemetry/src/api/core.rs

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@ impl From<Key> for String {
8787
}
8888
}
8989

90+
impl fmt::Display for Key {
91+
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
92+
self.0.fmt(fmt)
93+
}
94+
}
95+
9096
/// Array of homogeneous values
9197
#[cfg_attr(feature = "serialize", derive(Deserialize, Serialize))]
9298
#[derive(Clone, Debug, PartialEq)]
@@ -180,6 +186,21 @@ pub enum Value {
180186
Array(Array),
181187
}
182188

189+
impl Value {
190+
/// String representation of the `Value`
191+
///
192+
/// This will allocate iff the underlying value is not a `String`.
193+
pub fn as_str(&self) -> Cow<'_, str> {
194+
match self {
195+
Value::Bool(v) => format!("{}", v).into(),
196+
Value::I64(v) => format!("{}", v).into(),
197+
Value::F64(v) => format!("{}", v).into(),
198+
Value::String(v) => Cow::Borrowed(v.as_ref()),
199+
Value::Array(v) => format!("{}", v).into(),
200+
}
201+
}
202+
}
203+
183204
macro_rules! from_values {
184205
(
185206
$(
@@ -217,30 +238,14 @@ impl From<String> for Value {
217238
}
218239
}
219240

220-
impl From<Value> for String {
221-
/// Convert `Value` types to `String` for use by exporters that only use
222-
/// `String` values.
223-
fn from(value: Value) -> Self {
224-
match value {
225-
Value::Bool(value) => value.to_string(),
226-
Value::I64(value) => value.to_string(),
227-
Value::F64(value) => value.to_string(),
228-
Value::String(value) => value.into_owned(),
229-
Value::Array(value) => value.to_string(),
230-
}
231-
}
232-
}
233-
234-
impl From<&Value> for String {
235-
/// Convert `&Value` types to `String` for use by exporters that only use
236-
/// `String` values.
237-
fn from(value: &Value) -> Self {
238-
match value {
239-
Value::Bool(value) => value.to_string(),
240-
Value::I64(value) => value.to_string(),
241-
Value::F64(value) => value.to_string(),
242-
Value::String(value) => value.to_string(),
243-
Value::Array(value) => value.to_string(),
241+
impl fmt::Display for Value {
242+
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
243+
match self {
244+
Value::Bool(v) => fmt.write_fmt(format_args!("{}", v)),
245+
Value::I64(v) => fmt.write_fmt(format_args!("{}", v)),
246+
Value::F64(v) => fmt.write_fmt(format_args!("{}", v)),
247+
Value::String(v) => fmt.write_fmt(format_args!("{}", v)),
248+
Value::Array(v) => fmt.write_fmt(format_args!("{}", v)),
244249
}
245250
}
246251
}

opentelemetry/src/api/labels/encoder.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{Key, Value};
2-
use std::fmt;
2+
use std::fmt::{self, Write};
33
use std::sync::atomic::{AtomicUsize, Ordering};
44

55
static ENCODER_ID_COUNTER: AtomicUsize = AtomicUsize::new(0);
@@ -39,12 +39,22 @@ impl Encoder for DefaultLabelEncoder {
3939
labels
4040
.enumerate()
4141
.fold(String::new(), |mut acc, (idx, (key, value))| {
42+
let offset = acc.len();
4243
if idx > 0 {
4344
acc.push(',')
4445
}
45-
acc.push_str(key.as_str());
46+
47+
if write!(acc, "{}", key).is_err() {
48+
acc.truncate(offset);
49+
return acc;
50+
}
51+
4652
acc.push('=');
47-
acc.push_str(String::from(value).as_str());
53+
if write!(acc, "{}", value).is_err() {
54+
acc.truncate(offset);
55+
return acc;
56+
}
57+
4858
acc
4959
})
5060
}

opentelemetry/src/sdk/propagation/baggage.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ impl TextMapPropagator for BaggagePropagator {
123123
let metadata_prefix = if metadata_str.is_empty() { "" } else { ";" };
124124
utf8_percent_encode(name.as_str().trim(), FRAGMENT)
125125
.chain(iter::once("="))
126-
.chain(utf8_percent_encode(String::from(value).trim(), FRAGMENT))
126+
.chain(utf8_percent_encode(value.as_str().trim(), FRAGMENT))
127127
.chain(iter::once(metadata_prefix))
128128
.chain(iter::once(metadata_str))
129129
.collect()

0 commit comments

Comments
 (0)