danielgtaylor / danielgtaylor/python-betterproto

Cast "oneOf" value to a single value when converting to dict/JSON

Offen
#388 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Python
Sterne
1.8k
Forks
234
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

I am currently consuming metrics exposed by an OpenTelemetry agent, but when I try to convert the Protobuf metrics to JSON, the "oneOf" occurences are being translated to a dict instead of a single value. Is there any way to change this behavior to only display a single string value?

An example of what is happening:

The proto definitions (the original *.proto* files can be found [here](https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/common/v1/common.proto)):
```proto
syntax = "proto3";

message AnyValue {
oneof value {
string string_value = 1;
bool bool_value = 2;
int64 int_value = 3;
double double_value = 4;
ArrayValue array_value = 5;
KeyValueList kvlist_value = 6;
bytes bytes_value = 7;
}
}

message ArrayValue {
repeated AnyValue values = 1;
}

message KeyValueList {
repeated KeyValue values = 1;
}

message KeyValue {
string key = 1;
AnyValue value = 2;
}
```

The dataclasses generated:
```python
@dataclass
class KeyValue(betterproto.Message):
key: str = betterproto.string_field(1)
value: "AnyValue" = betterproto.message_field(2)

@dataclass
class AnyValue(betterproto.Message):
string_value: str = betterproto.string_field(1, group="value")
bool_value: bool = betterproto.bool_field(2, group="value")
int_value: int = betterproto.int64_field(3, group="value")
double_value: float = betterproto.double_field(4, group="value")
array_value: "ArrayValue" = betterproto.message_field(5, group="value")
kvlist_value: "KeyValueList" = betterproto.message_field(6, group="value")
bytes_value: bytes = betterproto.bytes_field(7, group="value")
```

The current conversion:
```json
{"key": "process.pid", "value": {"intValue": "275"}}
```

What I would like to have:
```json
{"key": "process.pid", "value": "275"}
```

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Keine Repository-Datei und kein Test werden genannt. Beginne damit, die dict/JSON-Konvertierung für die generierten AnyValue- und KeyValue-Klassen zu reproduzieren, und verfolge dann, wie oneof-Gruppen serialisiert werden. Fertig ist die Arbeit, wenn skalare oneof-Werte den angeforderten einzelnen Wert erzeugen und gleichzeitig die passende Behandlung für message-, array-, map- und bytes-Varianten erhalten bleibt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
tooling
Issue-Typ
Feature
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.