Skip to content

Commit 776dd24

Browse files
committed
json: ser/de bytes as base64 strings not an array of bytes
1 parent b017c7b commit 776dd24

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
@@ -46,7 +46,7 @@ testing = ["opentelemetry/testing"]
4646
# add ons
4747
internal-logs = ["tracing"]
4848
with-schemars = ["schemars"]
49-
with-serde = ["serde", "hex"]
49+
with-serde = ["serde", "hex", "base64"]
5050

5151
[dependencies]
5252
tonic = { workspace = true, optional = true, features = ["codegen", "prost"] }
@@ -57,6 +57,7 @@ schemars = { version = "0.8", optional = true }
5757
serde = { workspace = true, optional = true, features = ["serde_derive"] }
5858
hex = { version = "0.4.3", optional = true }
5959
tracing = {workspace = true, optional = true} # optional for opentelemetry internal logging
60+
base64 = { version = "0.22.1", optional = true }
6061

6162
[dev-dependencies]
6263
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)