Skip to content

Commit 8905a39

Browse files
committed
json: ser/de bytes as base64 strings not an array of bytes
1 parent 5b86b7f commit 8905a39

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

opentelemetry-otlp/tests/integration_test/expected/traces.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@
5757
"value": {
5858
"stringValue": "yes"
5959
}
60+
},
61+
{
62+
"key": "data",
63+
"value": {
64+
"bytesValue": "gICA"
65+
}
6066
}
6167
],
6268
"events": [

opentelemetry-proto/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ testing = ["opentelemetry/testing"]
4545

4646
# add ons
4747
with-schemars = ["schemars"]
48-
with-serde = ["serde", "hex"]
48+
with-serde = ["serde", "hex", "base64"]
4949
populate-logs-event-name = []
5050

5151
[dependencies]
@@ -56,6 +56,7 @@ opentelemetry_sdk = { version = "0.27", default-features = false, path = "../ope
5656
schemars = { version = "0.8", optional = true }
5757
serde = { workspace = true, optional = true, features = ["serde_derive"] }
5858
hex = { version = "0.4.3", optional = true }
59+
base64 = { version = "0.22.1", optional = true }
5960

6061
[dev-dependencies]
6162
opentelemetry = { features = ["testing"], path = "../opentelemetry" }

opentelemetry-proto/src/proto.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ pub(crate) mod serializers {
5656
map.serialize_entry("intValue", &i.to_string());
5757
map.end()
5858
}
59+
Some(Value::BytesValue(b)) => {
60+
let mut map = serializer.serialize_map(Some(1))?;
61+
map.serialize_entry("bytesValue", &base64::encode(b));
62+
map.end()
63+
}
5964
Some(value) => value.serialize(serializer),
6065
None => serializer.serialize_none(),
6166
}
@@ -127,8 +132,10 @@ pub(crate) mod serializers {
127132
value = Some(any_value::Value::KvlistValue(kv));
128133
}
129134
"bytesValue" => {
130-
let bytes = map.next_value()?;
131-
value = Some(any_value::Value::BytesValue(bytes));
135+
let base64: String = map.next_value()?;
136+
let decoded = base64::decode(base64.as_bytes())
137+
.map_err(|e| de::Error::custom(e))?;
138+
value = Some(any_value::Value::BytesValue(decoded));
132139
}
133140
_ => {
134141
//skip unknown keys, and handle error later.
@@ -182,6 +189,17 @@ pub(crate) mod serializers {
182189
let s: String = Deserialize::deserialize(deserializer)?;
183190
s.parse::<i64>().map_err(de::Error::custom)
184191
}
192+
193+
pub fn serialize_vec_u8_as_base64_string<S: Serializer>(v: &Vec<u8>, s: S) -> Result<S::Ok, S::Error> {
194+
let base64 = base64::encode(v);
195+
String::serialize(&base64, s)
196+
}
197+
198+
pub fn deserialize_base64_string_to_vec_u8<'de, D: Deserializer<'de>>(d: D) -> Result<Vec<u8>, D::Error> {
199+
let base64 = String::deserialize(d)?;
200+
base64::decode(base64.as_bytes())
201+
.map_err(|e| serde::de::Error::custom(e))
202+
}
185203
}
186204

187205
#[cfg(feature = "gen-tonic-messages")]

0 commit comments

Comments
 (0)