diff --git a/opentelemetry-proto/Cargo.toml b/opentelemetry-proto/Cargo.toml index ff7e428405..7925e53826 100644 --- a/opentelemetry-proto/Cargo.toml +++ b/opentelemetry-proto/Cargo.toml @@ -46,7 +46,7 @@ testing = ["opentelemetry/testing"] # add ons internal-logs = ["tracing"] with-schemars = ["schemars"] -with-serde = ["serde", "hex"] +with-serde = ["serde", "hex", "base64"] [dependencies] tonic = { workspace = true, optional = true, features = ["codegen", "prost"] } @@ -57,6 +57,7 @@ schemars = { version = "0.8", optional = true } serde = { workspace = true, optional = true, features = ["serde_derive"] } hex = { version = "0.4.3", optional = true } tracing = {workspace = true, optional = true} # optional for opentelemetry internal logging +base64 = { version = "0.22.1", optional = true } [dev-dependencies] opentelemetry = { features = ["testing"], path = "../opentelemetry" } diff --git a/opentelemetry-proto/src/proto.rs b/opentelemetry-proto/src/proto.rs index 792e1fc945..13a28ce2a4 100644 --- a/opentelemetry-proto/src/proto.rs +++ b/opentelemetry-proto/src/proto.rs @@ -56,6 +56,11 @@ pub(crate) mod serializers { map.serialize_entry("intValue", &i.to_string()); map.end() } + Some(Value::BytesValue(b)) => { + let mut map = serializer.serialize_map(Some(1))?; + map.serialize_entry("bytesValue", &base64::encode(b)); + map.end() + } Some(value) => value.serialize(serializer), None => serializer.serialize_none(), } @@ -127,8 +132,10 @@ pub(crate) mod serializers { value = Some(any_value::Value::KvlistValue(kv)); } "bytesValue" => { - let bytes = map.next_value()?; - value = Some(any_value::Value::BytesValue(bytes)); + let base64: String = map.next_value()?; + let decoded = base64::decode(base64.as_bytes()) + .map_err(|e| de::Error::custom(e))?; + value = Some(any_value::Value::BytesValue(decoded)); } _ => { //skip unknown keys, and handle error later. diff --git a/opentelemetry-proto/tests/json_serde.rs b/opentelemetry-proto/tests/json_serde.rs index 389541cce7..a6552d6570 100644 --- a/opentelemetry-proto/tests/json_serde.rs +++ b/opentelemetry-proto/tests/json_serde.rs @@ -274,12 +274,20 @@ mod json_serde { kind: 2, start_time_unix_nano: 1544712660000000000, end_time_unix_nano: 1544712661000000000, - attributes: vec![KeyValue { + attributes: vec![ + KeyValue { key: String::from("my.span.attr"), value: Some(AnyValue { value: Some(Value::StringValue(String::from("some value"))), }), - }], + }, + KeyValue { + key: String::from("my.span.bytes.attr"), + value: Some(AnyValue { + value: Some(Value::BytesValue(vec![0x80, 0x80, 0x80])), + }), + }, + ], dropped_attributes_count: 1, events: vec![Event { time_unix_nano: 1544712660500000000, @@ -369,6 +377,12 @@ mod json_serde { "value": { "stringValue": "some value" } + }, + { + "key": "my.span.bytes.attr", + "value": { + "bytesValue": "gICA" + } } ], "droppedAttributesCount": 1,