Skip to content

Commit b0476a3

Browse files
committed
add NameStringValuePair
Signed-off-by: alex boten <[email protected]>
1 parent 2400992 commit b0476a3

File tree

4 files changed

+105
-1
lines changed

4 files changed

+105
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
1717
- Add unmarshaling and validation for `BatchLogRecordProcessor`, `BatchSpanProcessor`, and `PeriodicMetricReader` to v1.0.0 model in `go.opentelemetry.io/contrib/otelconf`. (#8049)
1818
- Add unmarshaling and validation for `TextMapPropagator` to v1.0.0 model in `go.opentelemetry.io/contrib/otelconf`. (#8052)
1919
- Add unmarshaling and validation for `OTLPHttpExporter`, `OTLPGrpcExporter`, `OTLPGrpcMetricExporter` and `OTLPHttpMetricExporter` to v1.0.0 model in `go.opentelemetry.io/contrib/otelconf`. (#8112)
20-
- Add unmarshaling and validation for `AttributeType`, `AttributeNameValue`, `SimpleSpanProcessor`, `SimpleLogRecordProcessor`, `ZipkinSpanExporter` to v1.0.0 model in `go.opentelemetry.io/contrib/otelconf`. (#8127)
20+
- Add unmarshaling and validation for `AttributeType`, `AttributeNameValue`, `SimpleSpanProcessor`, `SimpleLogRecordProcessor`, `ZipkinSpanExporter`, `NameStringValuePair` to v1.0.0 model in `go.opentelemetry.io/contrib/otelconf`. (#8127)
2121

2222
### Changed
2323

otelconf/config_json.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,3 +608,32 @@ func (j *ZipkinSpanExporter) UnmarshalJSON(b []byte) error {
608608
*j = ZipkinSpanExporter(sh.Plain)
609609
return nil
610610
}
611+
612+
// UnmarshalJSON implements json.Unmarshaler.
613+
func (j *NameStringValuePair) UnmarshalJSON(b []byte) error {
614+
type Plain NameStringValuePair
615+
type shadow struct {
616+
Plain
617+
Name json.RawMessage `json:"name"`
618+
Value json.RawMessage `json:"value"`
619+
}
620+
var sh shadow
621+
if err := json.Unmarshal(b, &sh); err != nil {
622+
return errors.Join(newErrUnmarshal(j), err)
623+
}
624+
if sh.Name == nil {
625+
return newErrRequired(j, "name")
626+
}
627+
if err := json.Unmarshal(sh.Name, &sh.Plain.Name); err != nil {
628+
return errors.Join(newErrUnmarshal(j), err)
629+
}
630+
if sh.Value == nil {
631+
return newErrRequired(j, "value")
632+
}
633+
if err := json.Unmarshal(sh.Value, &sh.Plain.Value); err != nil {
634+
return errors.Join(newErrUnmarshal(j), err)
635+
}
636+
637+
*j = NameStringValuePair(sh.Plain)
638+
return nil
639+
}

otelconf/config_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,3 +1210,59 @@ func TestUnmarshalAttributeNameValueType(t *testing.T) {
12101210
})
12111211
}
12121212
}
1213+
1214+
func TestUnmarshalNameStringValuePairType(t *testing.T) {
1215+
for _, tt := range []struct {
1216+
name string
1217+
yamlConfig []byte
1218+
jsonConfig []byte
1219+
wantErrT error
1220+
wantNameStringValuePair NameStringValuePair
1221+
}{
1222+
{
1223+
name: "invalid data",
1224+
jsonConfig: []byte(`{:2000}`),
1225+
yamlConfig: []byte("name: []\nvalue: true\ntype: bool\n"),
1226+
wantErrT: newErrUnmarshal(&NameStringValuePair{}),
1227+
},
1228+
{
1229+
name: "missing required name field",
1230+
jsonConfig: []byte(`{}`),
1231+
yamlConfig: []byte("{}"),
1232+
wantErrT: newErrRequired(&NameStringValuePair{}, "name"),
1233+
},
1234+
{
1235+
name: "missing required value field",
1236+
jsonConfig: []byte(`{"name":"test"}`),
1237+
yamlConfig: []byte("name: test"),
1238+
wantErrT: newErrRequired(&NameStringValuePair{}, "value"),
1239+
},
1240+
{
1241+
name: "valid string value",
1242+
jsonConfig: []byte(`{"name":"test", "value": "test-val", "type": "string"}`),
1243+
yamlConfig: []byte("name: test\nvalue: test-val\ntype: string\n"),
1244+
wantNameStringValuePair: NameStringValuePair{
1245+
Name: "test",
1246+
Value: ptr("test-val"),
1247+
},
1248+
},
1249+
{
1250+
name: "invalid string_array value",
1251+
jsonConfig: []byte(`{"name":"test", "value": ["test-val", "test-val-2"], "type": "string_array"}`),
1252+
yamlConfig: []byte("name: test\nvalue: [test-val, test-val-2]\ntype: string_array\n"),
1253+
wantErrT: newErrUnmarshal(&NameStringValuePair{}),
1254+
},
1255+
} {
1256+
t.Run(tt.name, func(t *testing.T) {
1257+
val := NameStringValuePair{}
1258+
err := val.UnmarshalJSON(tt.jsonConfig)
1259+
assert.ErrorIs(t, err, tt.wantErrT)
1260+
assert.Equal(t, tt.wantNameStringValuePair, val)
1261+
1262+
val = NameStringValuePair{}
1263+
err = yaml.Unmarshal(tt.yamlConfig, &val)
1264+
assert.ErrorIs(t, err, tt.wantErrT)
1265+
assert.Equal(t, tt.wantNameStringValuePair, val)
1266+
})
1267+
}
1268+
}

otelconf/config_yaml.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,3 +361,22 @@ func (j *ZipkinSpanExporter) UnmarshalYAML(node *yaml.Node) error {
361361
*j = ZipkinSpanExporter(plain)
362362
return nil
363363
}
364+
365+
// UnmarshalYAML implements yaml.Unmarshaler.
366+
func (j *NameStringValuePair) UnmarshalYAML(node *yaml.Node) error {
367+
if !hasYAMLMapKey(node, "name") {
368+
return newErrRequired(j, "name")
369+
}
370+
if !hasYAMLMapKey(node, "value") {
371+
return newErrRequired(j, "value")
372+
}
373+
374+
type Plain NameStringValuePair
375+
var plain Plain
376+
if err := node.Decode(&plain); err != nil {
377+
return errors.Join(newErrUnmarshal(j), err)
378+
}
379+
380+
*j = NameStringValuePair(plain)
381+
return nil
382+
}

0 commit comments

Comments
 (0)