Skip to content

Commit c008ceb

Browse files
Merge branch 'main' into leo/ffe-eval-metric-allocation-key
2 parents f564d04 + cf61946 commit c008ceb

63 files changed

Lines changed: 1028 additions & 705 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/dd-ci-upload/action.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ runs:
4646
shell: bash
4747
run: go run ./.github/actions/add-codeowners/codeowners.go "${{ inputs.path }}"
4848

49+
- name: Fill the final_status property
50+
shell: bash
51+
run: |
52+
which xsltproc || sudo apt-get install -y xsltproc
53+
find "${{ inputs.path }}" -name '*.xml' | while read -r xml_file; do
54+
echo "Fixing $xml_file"
55+
tmp_file="$(mktemp)"
56+
xsltproc --output "$tmp_file" ".github/actions/dd-ci-upload/add_final_status.xsl" "$xml_file"
57+
mv "$tmp_file" "$xml_file"
58+
done
4959
- name: Upload the JUnit files
5060
shell: bash
5161
run: |
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
3+
4+
<!-- Identity transform: copy everything as-is by default -->
5+
<xsl:template match="@*|node()">
6+
<xsl:copy>
7+
<xsl:apply-templates select="@*|node()"/>
8+
</xsl:copy>
9+
</xsl:template>
10+
11+
<!-- For testcase elements missing dd_tags[test.final_status] inside their properties block -->
12+
<xsl:template match="testcase[not(properties/property[@name='dd_tags[test.final_status]'])]">
13+
<xsl:copy>
14+
<xsl:apply-templates select="@*"/>
15+
<xsl:variable name="status">
16+
<xsl:choose>
17+
<xsl:when test="failure or error">fail</xsl:when>
18+
<xsl:when test="skipped">skip</xsl:when>
19+
<xsl:otherwise>pass</xsl:otherwise>
20+
</xsl:choose>
21+
</xsl:variable>
22+
<xsl:choose>
23+
<xsl:when test="properties">
24+
<!-- Inject into existing properties block, preserving child order -->
25+
<xsl:for-each select="node()">
26+
<xsl:choose>
27+
<xsl:when test="self::properties">
28+
<properties>
29+
<xsl:apply-templates select="@*|node()"/>
30+
<property name="dd_tags[test.final_status]" value="{$status}"/>
31+
</properties>
32+
</xsl:when>
33+
<xsl:otherwise>
34+
<xsl:apply-templates select="."/>
35+
</xsl:otherwise>
36+
</xsl:choose>
37+
</xsl:for-each>
38+
</xsl:when>
39+
<xsl:otherwise>
40+
<!-- No properties block: create one before other children -->
41+
<properties>
42+
<property name="dd_tags[test.final_status]" value="{$status}"/>
43+
</properties>
44+
<xsl:apply-templates select="node()"/>
45+
</xsl:otherwise>
46+
</xsl:choose>
47+
</xsl:copy>
48+
</xsl:template>
49+
50+
</xsl:stylesheet>

.github/workflows/multios-unit-tests.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,12 @@ jobs:
8686
uses: ./.github/actions/codecov-upload
8787
with:
8888
codecov-token: ${{ secrets.CODECOV_TOKEN }}
89+
90+
- name: Upload Coverage to Datadog
91+
if: always()
92+
continue-on-error: true
93+
uses: DataDog/coverage-upload-github-action@9bbbf86d16f7db1b14c5b885e61cf0d96053686a
94+
with:
95+
api_key: ${{ secrets.DD_CI_API_KEY }}
96+
files: coverage.txt
97+
format: go-coverprofile

.github/workflows/unit-integration-tests.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,16 @@ jobs:
257257
with:
258258
codecov-token: ${{ secrets.CODECOV_TOKEN }}
259259

260+
- name: Upload Coverage to Datadog
261+
if: always()
262+
continue-on-error: true
263+
uses: DataDog/coverage-upload-github-action@9bbbf86d16f7db1b14c5b885e61cf0d96053686a
264+
with:
265+
api_key: ${{ secrets.DD_CI_API_KEY }}
266+
files: coverage.txt
267+
format: go-coverprofile
268+
flags: contrib
269+
260270
# Check for changes in the supported_configurations.json file
261271
- name: Supported Configurations Diff Check
262272
if: always()
@@ -420,6 +430,16 @@ jobs:
420430
with:
421431
codecov-token: ${{ secrets.CODECOV_TOKEN }}
422432

433+
- name: Upload Coverage to Datadog
434+
if: always()
435+
continue-on-error: true
436+
uses: DataDog/coverage-upload-github-action@9bbbf86d16f7db1b14c5b885e61cf0d96053686a
437+
with:
438+
api_key: ${{ secrets.DD_CI_API_KEY }}
439+
files: coverage.txt
440+
format: go-coverprofile
441+
flags: core
442+
423443
# Check for changes in the supported_configurations.json file
424444
- name: Supported Configurations Diff Check
425445
if: always()

code-coverage.datadog.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
schema-version: v1
2+
carryforward: true
3+
flags:
4+
core:
5+
carryforward: true
6+
contrib:
7+
carryforward: true

contrib/envoyproxy/go-control-plane/envoy_test.go

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,27 @@ import (
2828
"google.golang.org/grpc/metadata"
2929
)
3030

31+
// findSetHeader searches for a header by key name in a slice of HeaderValueOption,
32+
// returning (value, true) if found, or ("", false) if not found. This is
33+
// order-independent since http.Header iteration is non-deterministic.
34+
func findSetHeader(headers []*v3.HeaderValueOption, key string) (string, bool) {
35+
for _, h := range headers {
36+
if h.GetHeader().Key == key {
37+
return string(h.GetHeader().RawValue), true
38+
}
39+
}
40+
return "", false
41+
}
42+
43+
// requireSetHeader asserts that a header with the given key exists in headers
44+
// and that its value equals the expected value.
45+
func requireSetHeader(t *testing.T, headers []*v3.HeaderValueOption, key, expectedValue string) {
46+
t.Helper()
47+
val, ok := findSetHeader(headers, key)
48+
require.True(t, ok, "expected header %q to be present in SetHeaders", key)
49+
require.Equal(t, expectedValue, val, "unexpected value for header %q", key)
50+
}
51+
3152
func TestAppSec(t *testing.T) {
3253
t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/user_rules.json")
3354
t.Setenv("DD_APPSEC_WAF_TIMEOUT", "10ms")
@@ -98,8 +119,7 @@ func TestAppSec(t *testing.T) {
98119
require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse())
99120
require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status)
100121
require.Equal(t, envoytypes.StatusCode(403), res.GetImmediateResponse().GetStatus().Code)
101-
require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key)
102-
require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue))
122+
requireSetHeader(t, res.GetImmediateResponse().GetHeaders().SetHeaders, "Content-Type", "application/json")
103123
require.NoError(t, err)
104124

105125
err = stream.CloseSend()
@@ -130,8 +150,7 @@ func TestAppSec(t *testing.T) {
130150
require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse())
131151
require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status)
132152
require.Equal(t, envoytypes.StatusCode(418), res.GetImmediateResponse().GetStatus().Code)
133-
require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key)
134-
require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue))
153+
requireSetHeader(t, res.GetImmediateResponse().GetHeaders().SetHeaders, "Content-Type", "application/json")
135154
require.NoError(t, err)
136155

137156
err = stream.CloseSend()
@@ -162,8 +181,7 @@ func TestAppSec(t *testing.T) {
162181
require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse())
163182
require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status)
164183
require.Equal(t, envoytypes.StatusCode(418), res.GetImmediateResponse().GetStatus().Code)
165-
require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key)
166-
require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue))
184+
requireSetHeader(t, res.GetImmediateResponse().GetHeaders().SetHeaders, "Content-Type", "application/json")
167185
require.NoError(t, err)
168186

169187
err = stream.CloseSend()
@@ -223,8 +241,7 @@ func TestAppSec(t *testing.T) {
223241
require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse())
224242
require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status)
225243
require.Equal(t, envoytypes.StatusCode(403), res.GetImmediateResponse().GetStatus().Code)
226-
require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key)
227-
require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue))
244+
requireSetHeader(t, res.GetImmediateResponse().GetHeaders().SetHeaders, "Content-Type", "application/json")
228245
require.NoError(t, err)
229246

230247
err = stream.CloseSend()
@@ -392,8 +409,7 @@ func TestAppSecBodyParsingEnabled(t *testing.T) {
392409
require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse())
393410
require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status)
394411
require.Equal(t, envoytypes.StatusCode(403), res.GetImmediateResponse().GetStatus().Code)
395-
require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key)
396-
require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue))
412+
requireSetHeader(t, res.GetImmediateResponse().GetHeaders().SetHeaders, "Content-Type", "application/json")
397413
require.NoError(t, err)
398414

399415
err = stream.CloseSend()
@@ -425,9 +441,8 @@ func TestAppSecBodyParsingEnabled(t *testing.T) {
425441
require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse())
426442
require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status)
427443
require.Equal(t, envoytypes.StatusCode(418), res.GetImmediateResponse().GetStatus().Code) // 418 because of the rule file
428-
require.Len(t, res.GetImmediateResponse().GetHeaders().SetHeaders, 1)
429-
require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key)
430-
require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue))
444+
require.Len(t, res.GetImmediateResponse().GetHeaders().SetHeaders, 2)
445+
requireSetHeader(t, res.GetImmediateResponse().GetHeaders().SetHeaders, "Content-Type", "application/json")
431446
require.NoError(t, err)
432447

433448
err = stream.CloseSend()
@@ -478,9 +493,8 @@ func TestAppSecBodyParsingEnabled(t *testing.T) {
478493
require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse())
479494
require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status)
480495
require.Equal(t, envoytypes.StatusCode(418), res.GetImmediateResponse().GetStatus().Code) // 418 because of the rule file
481-
require.Len(t, res.GetImmediateResponse().GetHeaders().SetHeaders, 1)
482-
require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key)
483-
require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue))
496+
require.Len(t, res.GetImmediateResponse().GetHeaders().SetHeaders, 2)
497+
requireSetHeader(t, res.GetImmediateResponse().GetHeaders().SetHeaders, "Content-Type", "application/json")
484498
require.NoError(t, err)
485499

486500
err = stream.CloseSend()
@@ -545,8 +559,7 @@ func TestAppSecBodyParsingEnabled(t *testing.T) {
545559
require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse())
546560
require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status)
547561
require.Equal(t, envoytypes.StatusCode(403), res.GetImmediateResponse().GetStatus().Code)
548-
require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key)
549-
require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue))
562+
requireSetHeader(t, res.GetImmediateResponse().GetHeaders().SetHeaders, "Content-Type", "application/json")
550563
require.NoError(t, err)
551564

552565
err = stream.CloseSend()
@@ -615,8 +628,7 @@ func TestAppSecBodyParsingEnabled(t *testing.T) {
615628
require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse())
616629
require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status)
617630
require.Equal(t, envoytypes.StatusCode(403), res.GetImmediateResponse().GetStatus().Code)
618-
require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key)
619-
require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue))
631+
requireSetHeader(t, res.GetImmediateResponse().GetHeaders().SetHeaders, "Content-Type", "application/json")
620632
require.NoError(t, err)
621633
622634
err = stream.CloseSend()

contrib/google.golang.org/api/api_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,15 @@ func BenchmarkWrapRoundTripper(b *testing.B) {
212212
require.NoError(b, err)
213213

214214
b.ResetTimer()
215-
for i := 0; i < b.N; i++ {
215+
for b.Loop() {
216216
svc.Bookshelves.List("montana.banana").Do()
217217
}
218218
}
219219

220220
func BenchmarkInitApiEndpointsTree(b *testing.B) {
221221
b.ReportAllocs()
222222

223-
for i := 0; i < b.N; i++ {
223+
for b.Loop() {
224224
initAPIEndpointsTree()
225225
}
226226
}

contrib/google.golang.org/grpc/grpc_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -975,23 +975,23 @@ func BenchmarkUnaryServerInterceptor(b *testing.B) {
975975
b.Run("ok_no_metadata", func(b *testing.B) {
976976
b.ReportAllocs()
977977
b.ResetTimer()
978-
for i := 0; i < b.N; i++ {
978+
for b.Loop() {
979979
interceptor(ctx, "ignoredRequestValue", methodInfo, doNothingOKGRPCHandler)
980980
}
981981
})
982982

983983
b.Run("ok_with_metadata_no_parent", func(b *testing.B) {
984984
b.ReportAllocs()
985985
b.ResetTimer()
986-
for i := 0; i < b.N; i++ {
986+
for b.Loop() {
987987
interceptor(ctxWithMetadataNoParent, "ignoredRequestValue", methodInfo, doNothingOKGRPCHandler)
988988
}
989989
})
990990

991991
b.Run("ok_with_metadata_with_parent", func(b *testing.B) {
992992
b.ReportAllocs()
993993
b.ResetTimer()
994-
for i := 0; i < b.N; i++ {
994+
for b.Loop() {
995995
interceptor(ctxWithMetadataWithParent, "ignoredRequestValue", methodInfo, doNothingOKGRPCHandler)
996996
}
997997
})
@@ -1000,23 +1000,23 @@ func BenchmarkUnaryServerInterceptor(b *testing.B) {
10001000
b.Run("ok_no_metadata_with_analytics_rate", func(b *testing.B) {
10011001
b.ReportAllocs()
10021002
b.ResetTimer()
1003-
for i := 0; i < b.N; i++ {
1003+
for b.Loop() {
10041004
interceptorWithRate(ctx, "ignoredRequestValue", methodInfo, doNothingOKGRPCHandler)
10051005
}
10061006
})
10071007

10081008
b.Run("error_no_metadata", func(b *testing.B) {
10091009
b.ReportAllocs()
10101010
b.ResetTimer()
1011-
for i := 0; i < b.N; i++ {
1011+
for b.Loop() {
10121012
interceptor(ctx, "ignoredRequestValue", methodInfo, doNothingErrorGRPCHandler)
10131013
}
10141014
})
10151015
interceptorNoStack := UnaryServerInterceptor(NoDebugStack())
10161016
b.Run("error_no_metadata_no_stack", func(b *testing.B) {
10171017
b.ReportAllocs()
10181018
b.ResetTimer()
1019-
for i := 0; i < b.N; i++ {
1019+
for b.Loop() {
10201020
interceptorNoStack(ctx, "ignoredRequestValue", methodInfo, doNothingErrorGRPCHandler)
10211021
}
10221022
})

contrib/graphql-go/graphql/bench_test.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,10 @@ func BenchmarkGraphQL(b *testing.B) {
129129
b.Run("version_baseline", func(b *testing.B) {
130130
for name, tc := range testCases {
131131
b.Run(fmt.Sprintf("scenario_%s", name), func(b *testing.B) {
132-
b.StopTimer()
133132
b.ReportAllocs()
134133
schema, err := graphql.NewSchema(graphql.SchemaConfig{Query: rootQuery})
135134
require.NoError(b, err)
136-
for i := 0; i < b.N; i++ {
137-
b.StartTimer()
135+
for b.Loop() {
138136
resp := graphql.Do(graphql.Params{
139137
Schema: schema,
140138
RequestString: tc.query,
@@ -143,6 +141,7 @@ func BenchmarkGraphQL(b *testing.B) {
143141
})
144142
b.StopTimer()
145143
require.Empty(b, resp.Errors)
144+
b.StartTimer()
146145
}
147146
})
148147
}
@@ -151,7 +150,6 @@ func BenchmarkGraphQL(b *testing.B) {
151150
b.Run("version_dyngo", func(b *testing.B) {
152151
for name, tc := range testCases {
153152
b.Run(fmt.Sprintf("scenario_%s", name), func(b *testing.B) {
154-
b.StopTimer()
155153
b.ReportAllocs()
156154
opts := []Option{WithService("test-graphql-service")}
157155
schema, err := NewSchema(
@@ -162,8 +160,7 @@ func BenchmarkGraphQL(b *testing.B) {
162160
require.NoError(b, err)
163161
mt := mocktracer.Start()
164162
defer mt.Stop()
165-
for i := 0; i < b.N; i++ {
166-
b.StartTimer()
163+
for b.Loop() {
167164
resp := graphql.Do(graphql.Params{
168165
Schema: schema,
169166
RequestString: tc.query,
@@ -175,6 +172,7 @@ func BenchmarkGraphQL(b *testing.B) {
175172
spans := mt.FinishedSpans()
176173
require.Len(b, spans, 6)
177174
mt.Reset()
175+
b.StartTimer()
178176
}
179177
})
180178
}

contrib/hashicorp/consul/benchmark_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func BenchmarkKV(b *testing.B) {
3131
kv := client.KV()
3232
b.ResetTimer()
3333

34-
for i := 0; i < b.N; i++ {
34+
for b.Loop() {
3535
err = testFunc(kv)
3636
if err != nil {
3737
b.FailNow()
@@ -61,7 +61,7 @@ func BenchmarkTracedKV(b *testing.B) {
6161
kv := client.KV()
6262
b.ResetTimer()
6363

64-
for i := 0; i < b.N; i++ {
64+
for b.Loop() {
6565
testFunc(kv)
6666
}
6767
})

0 commit comments

Comments
 (0)