mirror of
https://github.com/weaveworks/scope.git
synced 2026-05-19 07:37:07 +00:00
The link returned by service metrics is now built by looking up the deployment name in `report.Report` instead of assuming the service and the deployment have the same name.
123 lines
4.2 KiB
Go
123 lines
4.2 KiB
Go
package detailed_test
|
|
|
|
import (
|
|
"net/url"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/weaveworks/scope/probe/docker"
|
|
"github.com/weaveworks/scope/probe/kubernetes"
|
|
"github.com/weaveworks/scope/render/detailed"
|
|
"github.com/weaveworks/scope/report"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
const (
|
|
sampleMetricsGraphURL = "/prom/:orgID/notebook/new"
|
|
)
|
|
|
|
var (
|
|
sampleUnknownNode = report.MakeNode("???").WithTopology("foo")
|
|
samplePodNode = report.MakeNode("noo").
|
|
WithTopology(report.Pod).
|
|
WithLatests(map[string]string{kubernetes.Namespace: "noospace"})
|
|
sampleContainerNode = report.MakeNode("coo").
|
|
WithTopology(report.Container).
|
|
WithLatests(map[string]string{docker.ContainerName: "cooname"})
|
|
sampleMetrics = []report.MetricRow{
|
|
{ID: docker.MemoryUsage},
|
|
{ID: docker.CPUTotalUsage},
|
|
}
|
|
)
|
|
|
|
func nodeSummaryWithMetrics(label string, metrics []report.MetricRow) detailed.NodeSummary {
|
|
return detailed.NodeSummary{
|
|
BasicNodeSummary: detailed.BasicNodeSummary{
|
|
Label: label,
|
|
},
|
|
Metrics: metrics,
|
|
}
|
|
}
|
|
|
|
func TestRenderMetricURLs_Disabled(t *testing.T) {
|
|
s := nodeSummaryWithMetrics("foo", sampleMetrics)
|
|
result := detailed.RenderMetricURLs(s, samplePodNode, report.MakeReport(), "")
|
|
|
|
assert.Empty(t, result.Metrics[0].URL)
|
|
assert.Empty(t, result.Metrics[1].URL)
|
|
}
|
|
|
|
func TestRenderMetricURLs_UnknownTopology(t *testing.T) {
|
|
s := nodeSummaryWithMetrics("foo", sampleMetrics)
|
|
result := detailed.RenderMetricURLs(s, sampleUnknownNode, report.MakeReport(), sampleMetricsGraphURL)
|
|
|
|
assert.Empty(t, result.Metrics[0].URL)
|
|
assert.Empty(t, result.Metrics[1].URL)
|
|
}
|
|
|
|
func TestRenderMetricURLs_Pod(t *testing.T) {
|
|
s := nodeSummaryWithMetrics("foo", sampleMetrics)
|
|
result := detailed.RenderMetricURLs(s, samplePodNode, report.MakeReport(), sampleMetricsGraphURL)
|
|
|
|
checkURL(t, result.Metrics[0].URL, sampleMetricsGraphURL,
|
|
[]string{"container_memory_usage_bytes", `pod_name=\"foo\"`, `namespace=\"noospace\"`})
|
|
checkURL(t, result.Metrics[1].URL, sampleMetricsGraphURL,
|
|
[]string{"container_cpu_usage_seconds", `pod_name=\"foo\"`, `namespace=\"noospace\"`})
|
|
}
|
|
|
|
func TestRenderMetricURLs_Container(t *testing.T) {
|
|
s := nodeSummaryWithMetrics("foo", sampleMetrics)
|
|
result := detailed.RenderMetricURLs(s, sampleContainerNode, report.MakeReport(), sampleMetricsGraphURL)
|
|
|
|
checkURL(t, result.Metrics[0].URL, sampleMetricsGraphURL,
|
|
[]string{"container_memory_usage_bytes", `name=\"cooname\"`})
|
|
checkURL(t, result.Metrics[1].URL, sampleMetricsGraphURL,
|
|
[]string{"container_cpu_usage_seconds", `name=\"cooname\"`})
|
|
}
|
|
|
|
func TestRenderMetricURLs_EmptyMetrics(t *testing.T) {
|
|
result := detailed.RenderMetricURLs(detailed.NodeSummary{}, samplePodNode, report.MakeReport(), sampleMetricsGraphURL)
|
|
|
|
m := result.Metrics[0]
|
|
assert.Equal(t, docker.CPUTotalUsage, m.ID)
|
|
assert.Equal(t, "CPU", m.Label)
|
|
assert.NotEmpty(t, m.URL)
|
|
assert.True(t, m.ValueEmpty)
|
|
assert.Equal(t, float64(1), m.Priority)
|
|
|
|
m = result.Metrics[1]
|
|
assert.NotEmpty(t, m.URL)
|
|
assert.True(t, m.ValueEmpty)
|
|
assert.Equal(t, float64(2), m.Priority)
|
|
}
|
|
|
|
func TestRenderMetricURLs_CombinedEmptyMetrics(t *testing.T) {
|
|
s := nodeSummaryWithMetrics("foo", []report.MetricRow{{ID: docker.MemoryUsage, Priority: 1}})
|
|
result := detailed.RenderMetricURLs(s, samplePodNode, report.MakeReport(), sampleMetricsGraphURL)
|
|
|
|
assert.NotEmpty(t, result.Metrics[0].URL)
|
|
assert.False(t, result.Metrics[0].ValueEmpty)
|
|
|
|
assert.NotEmpty(t, result.Metrics[1].URL)
|
|
assert.True(t, result.Metrics[1].ValueEmpty)
|
|
assert.Equal(t, float64(2), result.Metrics[1].Priority) // first empty metric starts at non-empty prio + 1
|
|
}
|
|
|
|
func TestRenderMetricURLs_QueryReplacement(t *testing.T) {
|
|
s := nodeSummaryWithMetrics("foo", sampleMetrics)
|
|
result := detailed.RenderMetricURLs(s, samplePodNode, report.MakeReport(), "http://example.test/?q=:query")
|
|
|
|
checkURL(t, result.Metrics[0].URL, "http://example.test/?q=",
|
|
[]string{"container_memory_usage_bytes", `pod_name="foo"`, `namespace="noospace"`})
|
|
checkURL(t, result.Metrics[1].URL, "http://example.test/?q=",
|
|
[]string{"container_cpu_usage_seconds", `pod_name="foo"`, `namespace="noospace"`})
|
|
}
|
|
|
|
func checkURL(t *testing.T, u string, prefix string, contains []string) {
|
|
assert.True(t, strings.HasPrefix(u, prefix))
|
|
for _, contain := range contains {
|
|
assert.Contains(t, u, url.QueryEscape(contain))
|
|
}
|
|
}
|