@@ -912,6 +912,42 @@ func TestConsumeTraces(t *testing.T) {
912
912
}
913
913
}
914
914
915
+ func TestCallsMetricsInitialise (t * testing.T ) {
916
+ traces := buildSampleTrace ()
917
+
918
+ p , err := newConnectorImp (stringp ("defaultNullValue" ), explicitHistogramsConfig , disabledExemplarsConfig , disabledEventsConfig , cumulative , 0 , []string {}, 1000 , clockwork .NewFakeClock ())
919
+ require .NoError (t , err )
920
+
921
+ ctx := metadata .NewIncomingContext (context .Background (), nil )
922
+ err = p .Start (ctx , componenttest .NewNopHost ())
923
+ defer func () { sdErr := p .Shutdown (ctx ); require .NoError (t , sdErr ) }()
924
+ require .NoError (t , err )
925
+
926
+ err = p .ConsumeTraces (ctx , traces )
927
+ assert .NoError (t , err )
928
+
929
+ verifyDataPointValue := func (t * testing.T , pmetrics pmetric.Metrics , value int64 ) {
930
+ assert .NotNil (t , pmetrics )
931
+ require .NotEmpty (t , pmetrics .ResourceMetrics ().Len ())
932
+ rm := pmetrics .ResourceMetrics ().At (0 )
933
+ require .NotEmpty (t , rm .ScopeMetrics ().Len ())
934
+ sm := rm .ScopeMetrics ().At (0 )
935
+ require .NotEmpty (t , sm .Metrics ().Len ())
936
+ m := sm .Metrics ().At (0 )
937
+ require .NotEmpty (t , m .Sum ().DataPoints ().Len ())
938
+ dp := m .Sum ().DataPoints ().At (0 )
939
+ require .Equal (t , value , dp .IntValue ())
940
+ }
941
+
942
+ // first call buildMetrics(), it will emit zero value
943
+ pmetrics := p .buildMetrics ()
944
+ verifyDataPointValue (t , pmetrics , 0 )
945
+
946
+ // second call buildMetrics(), it will emit actual value
947
+ pmetrics = p .buildMetrics ()
948
+ verifyDataPointValue (t , pmetrics , 1 )
949
+ }
950
+
915
951
func TestResourceMetricsCache (t * testing.T ) {
916
952
p , err := newConnectorImp (stringp ("defaultNullValue" ), explicitHistogramsConfig , disabledExemplarsConfig , disabledEventsConfig , cumulative , 0 , []string {}, 1000 , clockwork .NewFakeClock ())
917
953
require .NoError (t , err )
@@ -1372,7 +1408,7 @@ func TestConnector_initHistogramMetrics(t *testing.T) {
1372
1408
{
1373
1409
name : "initialize histogram with no config provided" ,
1374
1410
config : Config {},
1375
- want : metrics .NewExplicitHistogramMetrics (defaultHistogramBucketsMs , nil ),
1411
+ want : metrics .NewExplicitHistogramMetrics (defaultHistogramBucketsMs , nil , 0 ),
1376
1412
},
1377
1413
{
1378
1414
name : "Disable histogram" ,
@@ -1390,7 +1426,7 @@ func TestConnector_initHistogramMetrics(t *testing.T) {
1390
1426
Unit : metrics .Milliseconds ,
1391
1427
},
1392
1428
},
1393
- want : metrics .NewExplicitHistogramMetrics (defaultHistogramBucketsMs , nil ),
1429
+ want : metrics .NewExplicitHistogramMetrics (defaultHistogramBucketsMs , nil , 0 ),
1394
1430
},
1395
1431
{
1396
1432
name : "initialize explicit histogram with default bounds (seconds)" ,
@@ -1399,7 +1435,7 @@ func TestConnector_initHistogramMetrics(t *testing.T) {
1399
1435
Unit : metrics .Seconds ,
1400
1436
},
1401
1437
},
1402
- want : metrics .NewExplicitHistogramMetrics (defaultHistogramBucketsSeconds , nil ),
1438
+ want : metrics .NewExplicitHistogramMetrics (defaultHistogramBucketsSeconds , nil , 0 ),
1403
1439
},
1404
1440
{
1405
1441
name : "initialize explicit histogram with bounds (seconds)" ,
@@ -1414,7 +1450,7 @@ func TestConnector_initHistogramMetrics(t *testing.T) {
1414
1450
},
1415
1451
},
1416
1452
},
1417
- want : metrics .NewExplicitHistogramMetrics ([]float64 {0.1 , 1 }, nil ),
1453
+ want : metrics .NewExplicitHistogramMetrics ([]float64 {0.1 , 1 }, nil , 0 ),
1418
1454
},
1419
1455
{
1420
1456
name : "initialize explicit histogram with bounds (ms)" ,
@@ -1429,7 +1465,7 @@ func TestConnector_initHistogramMetrics(t *testing.T) {
1429
1465
},
1430
1466
},
1431
1467
},
1432
- want : metrics .NewExplicitHistogramMetrics ([]float64 {100 , 1000 }, nil ),
1468
+ want : metrics .NewExplicitHistogramMetrics ([]float64 {100 , 1000 }, nil , 0 ),
1433
1469
},
1434
1470
{
1435
1471
name : "initialize exponential histogram" ,
@@ -1441,7 +1477,7 @@ func TestConnector_initHistogramMetrics(t *testing.T) {
1441
1477
},
1442
1478
},
1443
1479
},
1444
- want : metrics .NewExponentialHistogramMetrics (10 , nil ),
1480
+ want : metrics .NewExponentialHistogramMetrics (10 , nil , 0 ),
1445
1481
},
1446
1482
{
1447
1483
name : "initialize exponential histogram with default max buckets count" ,
@@ -1451,7 +1487,7 @@ func TestConnector_initHistogramMetrics(t *testing.T) {
1451
1487
Exponential : & ExponentialHistogramConfig {},
1452
1488
},
1453
1489
},
1454
- want : metrics .NewExponentialHistogramMetrics (structure .DefaultMaxSize , nil ),
1490
+ want : metrics .NewExponentialHistogramMetrics (structure .DefaultMaxSize , nil , 0 ),
1455
1491
},
1456
1492
}
1457
1493
for _ , tt := range tests {
@@ -1975,36 +2011,42 @@ func TestConnectorWithCardinalityLimit(t *testing.T) {
1975
2011
1976
2012
// Create spans for the resources
1977
2013
traces := ptrace .NewTraces ()
2014
+
1978
2015
rspan1 := traces .ResourceSpans ().AppendEmpty ()
1979
2016
resource1 .CopyTo (rspan1 .Resource ())
1980
- ils := rspan1 .ScopeSpans ().AppendEmpty ()
2017
+ ils1 := rspan1 .ScopeSpans ().AppendEmpty ()
1981
2018
1982
2019
rspan2 := traces .ResourceSpans ().AppendEmpty ()
1983
2020
resource2 .CopyTo (rspan2 .Resource ())
1984
2021
ils2 := rspan2 .ScopeSpans ().AppendEmpty ()
1985
2022
1986
2023
// Add spans with different names to trigger overflow
1987
- for i := 0 ; i < 3 ; i ++ {
1988
- span := ils .Spans ().AppendEmpty ()
1989
- span .SetName (fmt .Sprintf ("operation%d" , i ))
1990
- span .SetKind (ptrace .SpanKindServer )
1991
- span .Attributes ().PutStr ("http.method" , "GET" )
2024
+ for i := 0 ; i < 5 ; i ++ {
2025
+ span1 := ils1 .Spans ().AppendEmpty ()
2026
+ span1 .SetName (fmt .Sprintf ("operation%d" , i ))
2027
+ span1 .SetKind (ptrace .SpanKindServer )
2028
+ span1 .Attributes ().PutStr ("http.method" , "GET" )
1992
2029
1993
2030
span2 := ils2 .Spans ().AppendEmpty ()
1994
2031
span2 .SetName (fmt .Sprintf ("operation%d" , i ))
1995
2032
span2 .SetKind (ptrace .SpanKindServer )
1996
2033
span2 .Attributes ().PutStr ("http.method" , "GET" )
1997
2034
}
1998
2035
2036
+ // Send two batches of spans to the connector to ensure it consumes more spans data,
2037
+ // avoiding potential edge-case traps.
2038
+ assert .NoError (t , connector .ConsumeTraces (context .Background (), traces ))
1999
2039
assert .NoError (t , connector .ConsumeTraces (context .Background (), traces ))
2000
2040
2001
- metrics := connector .buildMetrics ()
2041
+ // Ignore the first buildMetrics call, which emits zero datapoint values.
2042
+ _ = connector .buildMetrics ()
2002
2043
2003
- resourceMetrics := metrics .ResourceMetrics ()
2004
- assert .Equal (t , 2 , resourceMetrics .Len ()) // 2 resources
2044
+ pmetrics := connector .buildMetrics ()
2045
+ rmetrics := pmetrics .ResourceMetrics ()
2046
+ assert .Equal (t , 2 , rmetrics .Len ()) // 2 ResourceMetrics
2005
2047
2006
- for i := 0 ; i < resourceMetrics .Len (); i ++ {
2007
- rm := resourceMetrics .At (i )
2048
+ for i := 0 ; i < rmetrics .Len (); i ++ {
2049
+ rm := rmetrics .At (i )
2008
2050
serviceName , _ := rm .Resource ().Attributes ().Get ("service.name" )
2009
2051
2010
2052
// Each resource should have:
@@ -2013,11 +2055,13 @@ func TestConnectorWithCardinalityLimit(t *testing.T) {
2013
2055
metricCount := 0
2014
2056
overflowCount := 0
2015
2057
2016
- metrics := rm .ScopeMetrics ().At (0 ).Metrics ()
2017
- for j := 0 ; j < metrics .Len (); j ++ {
2018
- metric := metrics .At (j )
2058
+ assert .Equal (t , 1 , rm .ScopeMetrics ().Len ()) // one ScopeMetrics
2059
+ metricsSlice := rm .ScopeMetrics ().At (0 ).Metrics ()
2060
+ for j := 0 ; j < metricsSlice .Len (); j ++ {
2061
+ metric := metricsSlice .At (j )
2019
2062
if metric .Name () == buildMetricName (DefaultNamespace , metricNameCalls ) {
2020
2063
dps := metric .Sum ().DataPoints ()
2064
+ assert .Equal (t , 3 , dps .Len ()) // three DataPoints
2021
2065
for k := 0 ; k < dps .Len (); k ++ {
2022
2066
dp := dps .At (k )
2023
2067
if _ , exists := dp .Attributes ().Get (overflowKey ); exists {
@@ -2026,14 +2070,7 @@ func TestConnectorWithCardinalityLimit(t *testing.T) {
2026
2070
overflowVal , exists := attrs .Get (overflowKey )
2027
2071
assert .True (t , exists )
2028
2072
assert .True (t , overflowVal .Bool ())
2029
- _ , exists = attrs .Get ("region" )
2030
- assert .True (t , exists )
2031
- _ , exists = attrs .Get (spanNameKey )
2032
- assert .False (t , exists )
2033
- _ , exists = attrs .Get (spanKindKey )
2034
- assert .False (t , exists )
2035
- _ , exists = attrs .Get (statusCodeKey )
2036
- assert .False (t , exists )
2073
+ assert .Equal (t , int64 (6 ), dp .IntValue ()) // overflow datapoints have value of 6
2037
2074
} else {
2038
2075
metricCount ++
2039
2076
attrs := dp .Attributes ()
@@ -2047,6 +2084,37 @@ func TestConnectorWithCardinalityLimit(t *testing.T) {
2047
2084
assert .True (t , exists )
2048
2085
_ , exists = attrs .Get ("region" )
2049
2086
assert .True (t , exists )
2087
+ assert .Equal (t , int64 (2 ), dp .IntValue ()) // normal datapoints have value of 2
2088
+ }
2089
+ }
2090
+ }
2091
+ if metric .Name () == buildMetricName (DefaultNamespace , metricNameDuration ) {
2092
+ dps := metric .Histogram ().DataPoints ()
2093
+ assert .Equal (t , 3 , dps .Len ()) // three DataPoints
2094
+ for k := 0 ; k < dps .Len (); k ++ {
2095
+ assert .Equal (t , 3 , dps .Len ()) // three DataPoints
2096
+ for k := 0 ; k < dps .Len (); k ++ {
2097
+ dp := dps .At (k )
2098
+ if _ , exists := dp .Attributes ().Get (overflowKey ); exists {
2099
+ attrs := dp .Attributes ()
2100
+ overflowVal , exists := attrs .Get (overflowKey )
2101
+ assert .True (t , exists )
2102
+ assert .True (t , overflowVal .Bool ())
2103
+ assert .Equal (t , uint64 (6 ), dp .Count ()) // overflow datapoints have value of 6
2104
+ } else {
2105
+ attrs := dp .Attributes ()
2106
+ _ , exists := attrs .Get (serviceNameKey )
2107
+ assert .True (t , exists )
2108
+ _ , exists = attrs .Get (spanNameKey )
2109
+ assert .True (t , exists )
2110
+ _ , exists = attrs .Get (spanKindKey )
2111
+ assert .True (t , exists )
2112
+ _ , exists = attrs .Get (statusCodeKey )
2113
+ assert .True (t , exists )
2114
+ _ , exists = attrs .Get ("region" )
2115
+ assert .True (t , exists )
2116
+ assert .Equal (t , uint64 (2 ), dp .Count ()) // normal datapoints have value of 2
2117
+ }
2050
2118
}
2051
2119
}
2052
2120
}
@@ -2086,27 +2154,28 @@ func TestConnectorWithCardinalityLimitForEvents(t *testing.T) {
2086
2154
2087
2155
// Add 3 different events to trigger overflow
2088
2156
events := span .Events ()
2089
- for i := 0 ; i < 3 ; i ++ {
2157
+ for i := 0 ; i < 5 ; i ++ {
2090
2158
event := events .AppendEmpty ()
2091
2159
event .SetName (fmt .Sprintf ("event%d" , i ))
2092
2160
event .Attributes ().PutStr ("event.name" , fmt .Sprintf ("event%d" , i ))
2093
2161
}
2094
2162
2095
- // First consume to reach the limit
2163
+ // Send two batches of spans to the connector to ensure it consumes more spans data,
2164
+ // avoiding potential edge-case traps.
2096
2165
assert .NoError (t , connector .ConsumeTraces (context .Background (), traces ))
2097
-
2098
- // Second consume to trigger overflow
2099
2166
assert .NoError (t , connector .ConsumeTraces (context .Background (), traces ))
2100
2167
2101
- metrics := connector .buildMetrics ()
2168
+ // Ignore the first buildMetrics call, which emits zero datapoint values.
2169
+ _ = connector .buildMetrics ()
2170
+ pmetrics := connector .buildMetrics ()
2102
2171
2103
- resourceMetrics := metrics .ResourceMetrics ()
2104
- assert .Equal (t , 1 , resourceMetrics .Len ())
2172
+ rmetrics := pmetrics .ResourceMetrics ()
2173
+ assert .Equal (t , 1 , rmetrics .Len ())
2105
2174
2106
- rm := resourceMetrics .At (0 )
2107
- serviceName , _ := rm .Resource ().Attributes ().Get ("service.name" )
2175
+ rm := rmetrics .At (0 )
2108
2176
2109
2177
// Check events metric
2178
+ assert .Equal (t , 1 , rm .ScopeMetrics ().Len ())
2110
2179
metricsSlice := rm .ScopeMetrics ().At (0 ).Metrics ()
2111
2180
var eventsMetric pmetric.Metric
2112
2181
for i := 0 ; i < metricsSlice .Len (); i ++ {
@@ -2125,10 +2194,7 @@ func TestConnectorWithCardinalityLimitForEvents(t *testing.T) {
2125
2194
dp := dps .At (i )
2126
2195
if _ , exists := dp .Attributes ().Get (overflowKey ); exists {
2127
2196
overflowCount ++
2128
- // Verify overflow metric has service name
2129
- serviceNameAttr , ok := dp .Attributes ().Get (serviceNameKey )
2130
- assert .True (t , ok )
2131
- assert .Equal (t , serviceName .Str (), serviceNameAttr .Str ())
2197
+ assert .Equal (t , int64 (6 ), dp .IntValue ())
2132
2198
} else {
2133
2199
normalCount ++
2134
2200
// Verify normal metric has event name
@@ -2143,6 +2209,7 @@ func TestConnectorWithCardinalityLimitForEvents(t *testing.T) {
2143
2209
assert .True (t , exists )
2144
2210
_ , exists = attrs .Get (statusCodeKey )
2145
2211
assert .True (t , exists )
2212
+ assert .Equal (t , int64 (2 ), dp .IntValue ())
2146
2213
}
2147
2214
}
2148
2215
0 commit comments