Skip to content

Commit 186e70d

Browse files
committed
chore(tests): Separate tracing tests from viz
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 6f465d5 commit 186e70d

File tree

12 files changed

+299
-230
lines changed

12 files changed

+299
-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: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
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+
// linkerd-jaeger extension
50+
tracingNs := "tracing"
51+
installTracing(t, tracingNs)
52+
53+
// wait for the jaeger extension
54+
TestHelper.WithDataPlaneNamespace(ctx, "tracing-test", map[string]string{}, t, func(t *testing.T, namespace string) {
55+
emojivotoYaml, err := testutil.ReadFile("testdata/emojivoto.yaml")
56+
if err != nil {
57+
testutil.AnnotatedFatalf(t, "failed to read emojivoto yaml",
58+
"failed to read emojivoto yaml\n%s\n", err)
59+
}
60+
61+
out, err := TestHelper.KubectlApply(emojivotoYaml, namespace)
62+
if err != nil {
63+
testutil.AnnotatedFatalf(t, "'kubectl apply' command failed",
64+
"'kubectl apply' command failed\n%s", out)
65+
}
66+
67+
// wait for deployments to start
68+
for _, deploy := range []struct {
69+
ns string
70+
name string
71+
}{
72+
{ns: namespace, name: "vote-bot"},
73+
{ns: namespace, name: "web"},
74+
{ns: namespace, name: "emoji"},
75+
{ns: namespace, name: "voting"},
76+
{ns: tracingNs, name: "otel-collector-opentelemetry-collector"},
77+
{ns: tracingNs, name: "jaeger"},
78+
} {
79+
if err := TestHelper.CheckPods(ctx, deploy.ns, deploy.name, 1); err != nil {
80+
var rce *testutil.RestartCountError
81+
if errors.As(err, &rce) {
82+
testutil.AnnotatedWarn(t, "CheckPods timed-out", rce)
83+
}
84+
}
85+
}
86+
87+
t.Run("expect full trace", func(t *testing.T) {
88+
timeout := 1 * time.Minute
89+
err = testutil.RetryFor(timeout, func() error {
90+
url, err := TestHelper.URLFor(ctx, tracingNs, "jaeger", 16686)
91+
if err != nil {
92+
return err
93+
}
94+
95+
tracesJSON, err := TestHelper.HTTPGetURL(url + "/jaeger/api/traces?lookback=1h&service=linkerd-proxy")
96+
if err != nil {
97+
return err
98+
}
99+
traces := traces{}
100+
101+
err = json.Unmarshal([]byte(tracesJSON), &traces)
102+
if err != nil {
103+
return err
104+
}
105+
106+
if !hasTraceWithProcess(&traces, "linkerd-proxy") {
107+
return noProxyTraceFound{}
108+
}
109+
return nil
110+
})
111+
if err != nil {
112+
testutil.AnnotatedFatal(t, fmt.Sprintf("timed-out checking trace (%s)", timeout), err)
113+
}
114+
})
115+
})
116+
}
117+
118+
func installTracing(t *testing.T, namespace string) {
119+
tracingYaml, err := testutil.ReadFile("testdata/tracing.yaml")
120+
if err != nil {
121+
testutil.AnnotatedFatalf(t, "failed to read tracing yaml",
122+
"failed to read emojivoto yaml\n%s\n", err)
123+
}
124+
125+
out, err := TestHelper.KubectlApply(tracingYaml, namespace)
126+
if err != nil {
127+
testutil.AnnotatedFatalf(t, "'kubectl apply' command failed",
128+
"'kubectl apply' command failed\n%s", out)
129+
}
130+
131+
stdout, stderr, err := TestHelper.HelmRun("repo", "add", "jaegertracing", "https://jaegertracing.github.io/helm-charts")
132+
if err != nil {
133+
testutil.AnnotatedFatalf(t, "failed to add jaeger repository", "failed to add jaeger repository\n%s\n------\n%s\n", stdout, stderr)
134+
}
135+
stdout, stderr, err = TestHelper.HelmRun("repo", "add", "open-telemetry", "https://open-telemetry.github.io/opentelemetry-helm-charts")
136+
if err != nil {
137+
testutil.AnnotatedFatalf(t, "failed to add OpenTelemetry repository", "failed to add OpenTelemetry repository\n%s\n------\n%s\n", stdout, stderr)
138+
}
139+
stdout, stderr, err = TestHelper.HelmRun("install", "jaeger", "jaegertracing/jaeger", "--namespace=tracing", "--values=testdata/jaeger-aio-values.yaml")
140+
if err != nil {
141+
testutil.AnnotatedFatalf(t, "failed to install jaeger", "failed to install jaeger\n%s\n------\n%s\n", stdout, stderr)
142+
}
143+
stdout, stderr, err = TestHelper.HelmRun("install", "otel-collector", "open-telemetry/opentelemetry-collector", "--namespace=tracing", "--values=testdata/otel-values.yaml")
144+
if err != nil {
145+
testutil.AnnotatedFatalf(t, "failed to install OpenTelemetry", "failed to install OpenTelemetry\n%s\n------\n%s\n", stdout, stderr)
146+
}
147+
}
148+
149+
func hasTraceWithProcess(traces *traces, ps string) bool {
150+
for _, trace := range traces.Data {
151+
for _, process := range trace.Processes {
152+
if process.ServiceName == ps {
153+
return true
154+
}
155+
}
156+
}
157+
return false
158+
}
159+
160+
type noProxyTraceFound struct{}
161+
162+
func (e noProxyTraceFound) Error() string {
163+
return "no trace found with processes: linkerd-proxy"
164+
}

0 commit comments

Comments
 (0)