@@ -949,37 +949,94 @@ func TestShutdownExporter(t *testing.T) {
949
949
950
950
func TestExemplars (t * testing.T ) {
951
951
attrsOpt := otelmetric .WithAttributes (
952
- attribute .Key ("A" ).String ("B" ),
953
- attribute .Key ("C" ).String ("D" ),
954
- attribute .Key ("E" ).Bool (true ),
955
- attribute .Key ("F" ).Int (42 ),
952
+ attribute .Key ("A.1 " ).String ("B" ),
953
+ attribute .Key ("C.2 " ).String ("D" ),
954
+ attribute .Key ("E.3 " ).Bool (true ),
955
+ attribute .Key ("F.4 " ).Int (42 ),
956
956
)
957
+ expectedNonEscapedLabels := map [string ]string {
958
+ traceIDExemplarKey : "01000000000000000000000000000000" ,
959
+ spanIDExemplarKey : "0100000000000000" ,
960
+ "A.1" : "B" ,
961
+ "C.2" : "D" ,
962
+ "E.3" : "true" ,
963
+ "F.4" : "42" ,
964
+ }
965
+ expectedEscapedLabels := map [string ]string {
966
+ traceIDExemplarKey : "01000000000000000000000000000000" ,
967
+ spanIDExemplarKey : "0100000000000000" ,
968
+ "A_1" : "B" ,
969
+ "C_2" : "D" ,
970
+ "E_3" : "true" ,
971
+ "F_4" : "42" ,
972
+ }
957
973
for _ , tc := range []struct {
958
974
name string
959
975
recordMetrics func (ctx context.Context , meter otelmetric.Meter )
960
976
expectedExemplarValue float64
977
+ expectedLabels map [string ]string
978
+ escapingScheme model.EscapingScheme
979
+ validationScheme model.ValidationScheme
961
980
}{
962
981
{
963
- name : "counter" ,
982
+ name : "escaped counter" ,
964
983
recordMetrics : func (ctx context.Context , meter otelmetric.Meter ) {
965
984
counter , err := meter .Float64Counter ("foo" )
966
985
require .NoError (t , err )
967
986
counter .Add (ctx , 9 , attrsOpt )
968
987
},
969
988
expectedExemplarValue : 9 ,
989
+ expectedLabels : expectedEscapedLabels ,
990
+ escapingScheme : model .UnderscoreEscaping ,
991
+ validationScheme : model .LegacyValidation ,
970
992
},
971
993
{
972
- name : "histogram" ,
994
+ name : "escaped histogram" ,
973
995
recordMetrics : func (ctx context.Context , meter otelmetric.Meter ) {
974
996
hist , err := meter .Int64Histogram ("foo" )
975
997
require .NoError (t , err )
976
998
hist .Record (ctx , 9 , attrsOpt )
977
999
},
978
1000
expectedExemplarValue : 9 ,
1001
+ expectedLabels : expectedEscapedLabels ,
1002
+ escapingScheme : model .UnderscoreEscaping ,
1003
+ validationScheme : model .LegacyValidation ,
1004
+ },
1005
+ {
1006
+ name : "non-escaped counter" ,
1007
+ recordMetrics : func (ctx context.Context , meter otelmetric.Meter ) {
1008
+ counter , err := meter .Float64Counter ("foo" )
1009
+ require .NoError (t , err )
1010
+ counter .Add (ctx , 9 , attrsOpt )
1011
+ },
1012
+ expectedExemplarValue : 9 ,
1013
+ expectedLabels : expectedNonEscapedLabels ,
1014
+ escapingScheme : model .NoEscaping ,
1015
+ validationScheme : model .UTF8Validation ,
1016
+ },
1017
+ {
1018
+ name : "non-escaped histogram" ,
1019
+ recordMetrics : func (ctx context.Context , meter otelmetric.Meter ) {
1020
+ hist , err := meter .Int64Histogram ("foo" )
1021
+ require .NoError (t , err )
1022
+ hist .Record (ctx , 9 , attrsOpt )
1023
+ },
1024
+ expectedExemplarValue : 9 ,
1025
+ expectedLabels : expectedNonEscapedLabels ,
1026
+ escapingScheme : model .NoEscaping ,
1027
+ validationScheme : model .UTF8Validation ,
979
1028
},
980
1029
} {
981
1030
t .Run (tc .name , func (t * testing.T ) {
982
- t .Setenv ("OTEL_GO_X_EXEMPLAR" , "true" )
1031
+ originalEscapingScheme := model .NameEscapingScheme
1032
+ originalValidationScheme := model .NameValidationScheme
1033
+ model .NameEscapingScheme = tc .escapingScheme
1034
+ model .NameValidationScheme = tc .validationScheme
1035
+ // Restore original value after the test is complete
1036
+ defer func () {
1037
+ model .NameEscapingScheme = originalEscapingScheme
1038
+ model .NameValidationScheme = originalValidationScheme
1039
+ }()
983
1040
// initialize registry exporter
984
1041
ctx := context .Background ()
985
1042
registry := prometheus .NewRegistry ()
@@ -1044,17 +1101,9 @@ func TestExemplars(t *testing.T) {
1044
1101
}
1045
1102
require .NotNil (t , exemplar )
1046
1103
require .Equal (t , tc .expectedExemplarValue , exemplar .GetValue ())
1047
- expectedLabels := map [string ]string {
1048
- traceIDExemplarKey : "01000000000000000000000000000000" ,
1049
- spanIDExemplarKey : "0100000000000000" ,
1050
- "A" : "B" ,
1051
- "C" : "D" ,
1052
- "E" : "true" ,
1053
- "F" : "42" ,
1054
- }
1055
- require .Equal (t , len (expectedLabels ), len (exemplar .GetLabel ()))
1104
+ require .Equal (t , len (tc .expectedLabels ), len (exemplar .GetLabel ()))
1056
1105
for _ , label := range exemplar .GetLabel () {
1057
- val , ok := expectedLabels [label .GetName ()]
1106
+ val , ok := tc . expectedLabels [label .GetName ()]
1058
1107
require .True (t , ok )
1059
1108
require .Equal (t , label .GetValue (), val )
1060
1109
}
0 commit comments