Skip to content

Commit 75fe78b

Browse files
authored
chore(tests): Separate tracing tests from viz (#14547)
Now that the proxy has tracing configuration added to the proxy injector, we can decouple the tracing tests from the viz and jaeger extensions. This creates a new set of top-level tests for tracing and moves the existing one from the viz integration tests, with a few modifications now that it doesn't have to install the extensions. Signed-off-by: Scott Fleener <[email protected]>
1 parent e96bf57 commit 75fe78b

File tree

12 files changed

+297
-230
lines changed

12 files changed

+297
-230
lines changed

.github/workflows/integration.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ jobs:
266266
- default-policy-deny
267267
- external
268268
- rsa-ca
269+
- tracing
269270
- helm-upgrade
270271
- uninstall
271272
- upgrade-edge

.github/workflows/release.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ jobs:
8888
- cni-calico-deep
8989
- deep
9090
- viz
91+
- tracing
9192
- default-policy-deny
9293
- external
9394
- rsa-ca

bin/_test-helpers.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ testdir=$bindir/../test/integration
1212

1313
##### Test setup helpers #####
1414

15-
export default_test_names=(deep deep-native-sidecar viz external helm-upgrade uninstall upgrade-edge default-policy-deny rsa-ca)
15+
export default_test_names=(deep deep-native-sidecar viz tracing external helm-upgrade uninstall upgrade-edge default-policy-deny rsa-ca)
1616
export external_resource_test_names=(external-resources)
1717
# TODO(alpeb): add test cni-calico-deep-dual-stack
1818
export dual_stack_test_names=(deep-dual-stack)
@@ -473,6 +473,10 @@ run_rsa-ca_test() {
473473
run_test "$testdir/rsa-ca/..."
474474
}
475475

476+
run_tracing_test() {
477+
run_test "$testdir/tracing/..."
478+
}
479+
476480
run_external_test() {
477481
run_test "$testdir/external/..."
478482
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package deeptest
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
"github.com/linkerd/linkerd2/testutil"
9+
)
10+
11+
//////////////////////
12+
/// TEST SETUP ///
13+
//////////////////////
14+
15+
var (
16+
TestHelper *testutil.TestHelper
17+
)
18+
19+
func TestMain(m *testing.M) {
20+
TestHelper = testutil.NewTestHelper()
21+
os.Exit(m.Run())
22+
}
23+
24+
// TestInstall will install the linkerd control plane to be used in the rest of
25+
// the tracing suite tests.
26+
func TestInstall(t *testing.T) {
27+
err := TestHelper.InstallGatewayAPI()
28+
if err != nil {
29+
testutil.AnnotatedFatal(t, "failed to install gateway-api", err)
30+
}
31+
32+
// Install CRDs
33+
cmd := []string{
34+
"install",
35+
"--crds",
36+
"--controller-log-level", "debug",
37+
"--set", fmt.Sprintf("proxy.image.version=%s", TestHelper.GetVersion()),
38+
"--set", "heartbeatSchedule=1 2 3 4 5",
39+
"--values", "testdata/tracing-values.yaml",
40+
}
41+
42+
// Pipe cmd & args to `linkerd`
43+
out, err := TestHelper.LinkerdRun(cmd...)
44+
if err != nil {
45+
testutil.AnnotatedFatal(t, "'linkerd install' command failed", err)
46+
}
47+
48+
out, err = TestHelper.KubectlApplyWithArgs(out)
49+
if err != nil {
50+
testutil.AnnotatedFatalf(t, "'kubectl apply' command failed",
51+
"'kubectl apply' command failed\n%s", out)
52+
}
53+
54+
// Install control-plane
55+
cmd = []string{
56+
"install",
57+
"--controller-log-level", "debug",
58+
"--set", fmt.Sprintf("proxy.image.version=%s", TestHelper.GetVersion()),
59+
"--set", "heartbeatSchedule=1 2 3 4 5",
60+
"--values", "testdata/tracing-values.yaml",
61+
}
62+
63+
// Pipe cmd & args to `linkerd`
64+
out, err = TestHelper.LinkerdRun(cmd...)
65+
if err != nil {
66+
testutil.AnnotatedFatal(t, "'linkerd install' command failed", err)
67+
}
68+
69+
out, err = TestHelper.KubectlApplyWithArgs(out)
70+
if err != nil {
71+
testutil.AnnotatedFatalf(t, "'kubectl apply' command failed",
72+
"'kubectl apply' command failed\n%s", out)
73+
}
74+
75+
out, err = TestHelper.LinkerdRun("check", "--wait=3m")
76+
if err != nil {
77+
testutil.AnnotatedFatalf(t, "'linkerd check' command failed",
78+
"'linkerd check' command failed\n%s", out)
79+
}
80+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
proxy:
2+
tracing:
3+
enable: true
4+
collector:
5+
endpoint: otel-collector-opentelemetry-collector.tracing:4317
6+
meshIdentity:
7+
serviceAccountName: otel-collector-opentelemetry-collector.tracing

test/integration/viz/tracing/testdata/emojivoto.yaml renamed to test/integration/tracing/tracing/testdata/emojivoto.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
apiVersion: v1
2+
kind: Namespace
3+
metadata:
4+
name: tracing-test
5+
---
6+
apiVersion: v1
27
kind: ServiceAccount
38
metadata:
49
name: emoji
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
provisionDataStore:
2+
cassandra: false
3+
allInOne:
4+
enabled: true
5+
storage:
6+
type: memory
7+
agent:
8+
enabled: false
9+
collector:
10+
enabled: false
11+
query:
12+
enabled: false
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
mode: deployment
2+
image:
3+
repository: ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-k8s
4+
command:
5+
name: otelcol-k8s
6+
config:
7+
exporters:
8+
debug: { }
9+
otlp/jaeger:
10+
endpoint: http://jaeger-collector.tracing:4317
11+
tls:
12+
insecure: true
13+
service:
14+
pipelines:
15+
traces:
16+
exporters:
17+
- debug
18+
- otlp/jaeger
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
apiVersion: v1
2+
kind: Namespace
3+
metadata:
4+
name: tracing
5+
annotations:
6+
linkerd.io/inject: enabled
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package tracing
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"errors"
7+
"fmt"
8+
"os"
9+
"testing"
10+
"time"
11+
12+
"github.com/linkerd/linkerd2/testutil"
13+
)
14+
15+
type (
16+
traces struct {
17+
Data []trace `json:"data"`
18+
}
19+
20+
trace struct {
21+
Processes map[string]process `json:"processes"`
22+
}
23+
24+
process struct {
25+
ServiceName string `json:"serviceName"`
26+
}
27+
)
28+
29+
//////////////////////
30+
/// TEST SETUP ///
31+
//////////////////////
32+
33+
var TestHelper *testutil.TestHelper
34+
35+
func TestMain(m *testing.M) {
36+
TestHelper = testutil.NewTestHelper()
37+
// Block test execution until viz extension is running
38+
TestHelper.WaitUntilDeployReady(testutil.LinkerdDeployReplicasEdge)
39+
os.Exit(m.Run())
40+
}
41+
42+
//////////////////////
43+
/// TEST EXECUTION ///
44+
//////////////////////
45+
46+
func TestTracing(t *testing.T) {
47+
ctx := context.Background()
48+
49+
tracingNs := "tracing"
50+
installTracing(t, tracingNs)
51+
52+
TestHelper.WithDataPlaneNamespace(ctx, "tracing-test", map[string]string{}, t, func(t *testing.T, namespace string) {
53+
emojivotoYaml, err := testutil.ReadFile("testdata/emojivoto.yaml")
54+
if err != nil {
55+
testutil.AnnotatedFatalf(t, "failed to read emojivoto yaml",
56+
"failed to read emojivoto yaml\n%s\n", err)
57+
}
58+
59+
out, err := TestHelper.KubectlApply(emojivotoYaml, namespace)
60+
if err != nil {
61+
testutil.AnnotatedFatalf(t, "'kubectl apply' command failed",
62+
"'kubectl apply' command failed\n%s", out)
63+
}
64+
65+
// wait for deployments to start
66+
for _, deploy := range []struct {
67+
ns string
68+
name string
69+
}{
70+
{ns: namespace, name: "vote-bot"},
71+
{ns: namespace, name: "web"},
72+
{ns: namespace, name: "emoji"},
73+
{ns: namespace, name: "voting"},
74+
{ns: tracingNs, name: "otel-collector-opentelemetry-collector"},
75+
{ns: tracingNs, name: "jaeger"},
76+
} {
77+
if err := TestHelper.CheckPods(ctx, deploy.ns, deploy.name, 1); err != nil {
78+
var rce *testutil.RestartCountError
79+
if errors.As(err, &rce) {
80+
testutil.AnnotatedWarn(t, "CheckPods timed-out", rce)
81+
}
82+
}
83+
}
84+
85+
t.Run("expect full trace", func(t *testing.T) {
86+
timeout := 1 * time.Minute
87+
err = testutil.RetryFor(timeout, func() error {
88+
url, err := TestHelper.URLFor(ctx, tracingNs, "jaeger", 16686)
89+
if err != nil {
90+
return err
91+
}
92+
93+
tracesJSON, err := TestHelper.HTTPGetURL(url + "/api/traces?lookback=1h&service=linkerd-proxy")
94+
if err != nil {
95+
return err
96+
}
97+
traces := traces{}
98+
99+
err = json.Unmarshal([]byte(tracesJSON), &traces)
100+
if err != nil {
101+
return err
102+
}
103+
104+
if !hasTraceWithProcess(&traces, "linkerd-proxy") {
105+
return noProxyTraceFound{}
106+
}
107+
return nil
108+
})
109+
if err != nil {
110+
testutil.AnnotatedFatal(t, fmt.Sprintf("timed-out checking trace (%s)", timeout), err)
111+
}
112+
})
113+
})
114+
}
115+
116+
func installTracing(t *testing.T, namespace string) {
117+
tracingYaml, err := testutil.ReadFile("testdata/tracing.yaml")
118+
if err != nil {
119+
testutil.AnnotatedFatalf(t, "failed to read tracing yaml",
120+
"failed to read emojivoto yaml\n%s\n", err)
121+
}
122+
123+
out, err := TestHelper.KubectlApply(tracingYaml, namespace)
124+
if err != nil {
125+
testutil.AnnotatedFatalf(t, "'kubectl apply' command failed",
126+
"'kubectl apply' command failed\n%s", out)
127+
}
128+
129+
stdout, stderr, err := TestHelper.HelmRun("repo", "add", "jaegertracing", "https://jaegertracing.github.io/helm-charts")
130+
if err != nil {
131+
testutil.AnnotatedFatalf(t, "failed to add jaeger repository", "failed to add jaeger repository\n%s\n------\n%s\n", stdout, stderr)
132+
}
133+
stdout, stderr, err = TestHelper.HelmRun("repo", "add", "open-telemetry", "https://open-telemetry.github.io/opentelemetry-helm-charts")
134+
if err != nil {
135+
testutil.AnnotatedFatalf(t, "failed to add OpenTelemetry repository", "failed to add OpenTelemetry repository\n%s\n------\n%s\n", stdout, stderr)
136+
}
137+
stdout, stderr, err = TestHelper.HelmRun("install", "jaeger", "jaegertracing/jaeger", "--namespace=tracing", "--values=testdata/jaeger-aio-values.yaml")
138+
if err != nil {
139+
testutil.AnnotatedFatalf(t, "failed to install jaeger", "failed to install jaeger\n%s\n------\n%s\n", stdout, stderr)
140+
}
141+
stdout, stderr, err = TestHelper.HelmRun("install", "otel-collector", "open-telemetry/opentelemetry-collector", "--namespace=tracing", "--values=testdata/otel-values.yaml")
142+
if err != nil {
143+
testutil.AnnotatedFatalf(t, "failed to install OpenTelemetry", "failed to install OpenTelemetry\n%s\n------\n%s\n", stdout, stderr)
144+
}
145+
}
146+
147+
func hasTraceWithProcess(traces *traces, ps string) bool {
148+
for _, trace := range traces.Data {
149+
for _, process := range trace.Processes {
150+
if process.ServiceName == ps {
151+
return true
152+
}
153+
}
154+
}
155+
return false
156+
}
157+
158+
type noProxyTraceFound struct{}
159+
160+
func (e noProxyTraceFound) Error() string {
161+
return "no trace found with processes: linkerd-proxy"
162+
}

0 commit comments

Comments
 (0)