// NewDatumValue creates new datapoint value referenced from a value of the datum protobuf func NewDatumValue(val *com_signalfx_metrics_protobuf.Datum) datapoint.Value { if val.DoubleValue != nil { return datapoint.NewFloatValue(val.GetDoubleValue()) } if val.IntValue != nil { return datapoint.NewIntValue(val.GetIntValue()) } return datapoint.NewStringValue(val.GetStrValue()) }
func TestNewProtobufDataPoint(t *testing.T) { protoDatapoint := &com_signalfx_metrics_protobuf.DataPoint{ Source: workarounds.GolangDoesnotAllowPointerToStringLiteral("asource"), Metric: workarounds.GolangDoesnotAllowPointerToStringLiteral("ametric"), Value: &com_signalfx_metrics_protobuf.Datum{IntValue: workarounds.GolangDoesnotAllowPointerToIntLiteral(2)}, Dimensions: []*com_signalfx_metrics_protobuf.Dimension{{ Key: workarounds.GolangDoesnotAllowPointerToStringLiteral("key"), Value: workarounds.GolangDoesnotAllowPointerToStringLiteral("value"), }}, } dp, err := NewProtobufDataPointWithType(protoDatapoint, com_signalfx_metrics_protobuf.MetricType_COUNTER) assert.Equal(t, "asource", dp.Dimensions["sf_source"], "Line should be invalid") assert.NoError(t, err) assert.Equal(t, datapoint.Count, dp.MetricType, "Line should be invalid") v := com_signalfx_metrics_protobuf.MetricType_CUMULATIVE_COUNTER protoDatapoint.MetricType = &v dp, err = NewProtobufDataPointWithType(protoDatapoint, com_signalfx_metrics_protobuf.MetricType_COUNTER) assert.NoError(t, err) assert.Equal(t, datapoint.Counter, dp.MetricType, "Line should be invalid") item := &BodySendFormatV2{ Metric: "ametric", Value: 3.0, } assert.Contains(t, item.String(), "ametric", "Should get metric name back") f, _ := ValueToValue(item.Value) assert.Equal(t, datapoint.NewFloatValue(3.0), f, "Should get value 3 back") item.Value = 3 i, _ := ValueToValue(item.Value) assert.Equal(t, datapoint.NewIntValue(3), i, "Should get value 3 back") item.Value = int64(3) ValueToValue(item.Value) item.Value = "abc" s, _ := ValueToValue(item.Value) assert.Equal(t, datapoint.NewStringValue("abc"), s, "Should get value abc back") item.Value = struct{}{} _, err = ValueToValue(item.Value) assert.Error(t, err) }
// ValueToValue converts the v2 JSON value to a core api Value func ValueToValue(v ValueToSend) (datapoint.Value, error) { f, ok := v.(float64) if ok { return datapoint.NewFloatValue(f), nil } i, ok := v.(int64) if ok { return datapoint.NewIntValue(i), nil } i2, ok := v.(int) if ok { return datapoint.NewIntValue(int64(i2)), nil } s, ok := v.(string) if ok { return datapoint.NewStringValue(s), nil } return nil, fmt.Errorf("unable to convert value: %s", v) }
func TestDatumForPoint(t *testing.T) { assert.Equal(t, int64(3), datumForPoint(datapoint.NewIntValue(3)).GetIntValue()) assert.Equal(t, 0.0, datumForPoint(datapoint.NewIntValue(3)).GetDoubleValue()) assert.Equal(t, .1, datumForPoint(datapoint.NewFloatValue(.1)).GetDoubleValue()) assert.Equal(t, "hi", datumForPoint(datapoint.NewStringValue("hi")).GetStrValue()) }