Skip to content

Commit

Permalink
datadog: acceptance testing working timeseries query verification udp…
Browse files Browse the repository at this point in the history
… + uds
  • Loading branch information
natemollica-nm committed Apr 12, 2024
1 parent e60a939 commit 13b7089
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 19 deletions.
18 changes: 18 additions & 0 deletions acceptance/tests/datadog/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,22 @@ global:
socketTransportType: "UDS"
dogstatsdAddr: "/var/run/datadog/dsd.socket"
dogstatsdTags: [ "source:consul","consul_service:consul-server" ]
```
* DogStatsD with UDP
```yaml
metrics:
enabled: true
enableAgentMetrics: true
datadog:
enabled: true
namespace: "datadog"
openMetricsPrometheus:
enabled: false
dogstatsd:
enabled: true
socketTransportType: "UDP"
dogstatsdAddr: "datadog.datadog.svc.cluster.local"
dogstatsdTags: [ "source:consul","consul_service:consul-server" ]
```
92 changes: 81 additions & 11 deletions acceptance/tests/datadog/datadog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,20 @@ import (

const (
maxDatadogAPIRetryAttempts = 20
consulDogstatsDMetricQuery = "consul.memberlist"
consulDogstatsDMetricQuery = "consul.memberlist.gossip.50percentile"
)

// Test that prometheus metrics, when enabled, are accessible from the
// endpoints that have been exposed on the server, client and gateways.
// TestDatadogDogstatsDUnixDomainSocket
// Acceptance test to verify e2e metrics configuration works as expected
// with live datadog API using histogram formatted metric
//
// Method: DogstatsD + Unix Domain Socket
func TestDatadogDogstatsDUnixDomainSocket(t *testing.T) {
env := suite.Environment()
cfg := suite.Config()
ctx := env.DefaultContext(t)
// ns := ctx.KubectlOptions(t).Namespace

acceptanceTestingTags := "acceptance_test:unix_domain_sockets"
helmValues := map[string]string{
"global.datacenter": "dc1",
"global.metrics.enabled": "true",
Expand All @@ -35,6 +38,9 @@ func TestDatadogDogstatsDUnixDomainSocket(t *testing.T) {
"global.metrics.datadog.namespace": "datadog",
"global.metrics.datadog.dogstatsd.enabled": "true",
"global.metrics.datadog.dogstatsd.socketTransportType": "UDS",
"global.metrics.datadog.dogstatsd.dogstatsdTags[0]": "source:consul",
"global.metrics.datadog.dogstatsd.dogstatsdTags[1]": "consul_service:consul-server",
"global.metrics.datadog.dogstatsd.dogstatsdTags[2]": acceptanceTestingTags,
}

datadogOperatorHelmValues := map[string]string{
Expand All @@ -55,8 +61,6 @@ func TestDatadogDogstatsDUnixDomainSocket(t *testing.T) {
logger.Log(t, fmt.Sprintf("deploying datadog-operator via helm | namespace: %s | release-name: %s", datadogNamespace, datadogOperatorRelease))
datadogCluster := datadog.NewDatadogCluster(t, ctx, cfg, datadogOperatorRelease, datadogNamespace, datadogOperatorHelmValues)
datadogCluster.Create(t)
//k8s.DeployKustomize(t, ctx.KubectlOptionsForNamespace(datadogNamespace), cfg.NoCleanupOnFailure, cfg.NoCleanup, cfg.DebugDirectory, "../fixtures/bases/datadog-operator")
//k8s.WaitForAllPodsToBeReady(t, ctx.KubernetesClient(t), datadogNamespace, "app.kubernetes.io/name=datadog-operator")

logger.Log(t, fmt.Sprintf("deploying datadog-agent | namespace: %s", datadogNamespace))
k8s.DeployKustomize(t, ctx.KubectlOptionsForNamespace(datadogNamespace), cfg.NoCleanupOnFailure, cfg.NoCleanup, cfg.DebugDirectory, "../fixtures/bases/datadog")
Expand All @@ -65,14 +69,80 @@ func TestDatadogDogstatsDUnixDomainSocket(t *testing.T) {
k8s.WaitForAllPodsToBeReady(t, ctx.KubernetesClient(t), datadogNamespace, "agent.datadoghq.com/component=agent")

datadogAPIClient := datadogCluster.DatadogClient(t)
response, fullResponse, err := datadog.SearchMetricsAPIWithRetry(datadogAPIClient, consulDogstatsDMetricQuery, maxDatadogAPIRetryAttempts, t)
response, fullResponse, err := datadog.ApiWithRetry(t, datadogAPIClient, datadog.MetricTimeSeriesQuery, acceptanceTestingTags, consulDogstatsDMetricQuery, maxDatadogAPIRetryAttempts)
if err != nil {
content, _ := json.MarshalIndent(response, "", " ")
content, _ := json.MarshalIndent(response.QueryResponse, "", " ")
fullContent, _ := json.MarshalIndent(fullResponse, "", " ")
logger.Logf(t, "Error when calling MetricsApi.ListMetris for %s: %v", consulDogstatsDMetricQuery, err)
logger.Logf(t, "Error when querying /v1/query endpoint for %s: %v", consulDogstatsDMetricQuery, err)
logger.Logf(t, "Response: %v", string(content))
logger.Logf(t, "Full Response: %v", string(fullContent))
}
content, _ := json.Marshal(response.Results)
require.Contains(t, string(content), `consul.memberlist.gossip.50percentile`)
content, _ := json.Marshal(response.QueryResponse)
require.Contains(t, string(content), consulDogstatsDMetricQuery)
}

// TestDatadogDogstatsDUDP
// Acceptance test to verify e2e metrics configuration works as expected
// with live datadog API using histogram formatted metric
//
// Method: DogstatsD + UDP to Kube Service DNS name on port 8125
func TestDatadogDogstatsDUDP(t *testing.T) {
env := suite.Environment()
cfg := suite.Config()
ctx := env.DefaultContext(t)

acceptanceTestingTags := "acceptance_test:dogstatsd_udp"
helmValues := map[string]string{
"global.datacenter": "dc1",
"global.metrics.enabled": "true",
"global.metrics.enableAgentMetrics": "true",
"global.metrics.disableAgentHostName": "true",
"global.metrics.enableHostMetrics": "true",
"global.metrics.datadog.enabled": "true",
"global.metrics.datadog.namespace": "datadog",
"global.metrics.datadog.dogstatsd.enabled": "true",
"global.metrics.datadog.dogstatsd.socketTransportType": "UDP",
"global.metrics.datadog.dogstatsd.dogstatsdAddr": "datadog-agent.datadog.svc.cluster.local",
"global.metrics.datadog.dogstatsd.dogstatsdTags[0]": "source:consul",
"global.metrics.datadog.dogstatsd.dogstatsdTags[1]": "consul_service:consul-server",
"global.metrics.datadog.dogstatsd.dogstatsdTags[2]": acceptanceTestingTags,
}

datadogOperatorHelmValues := map[string]string{
"replicaCount": "1",
"image.tag": datadog.DefaultHelmChartVersion,
"image.repository": "gcr.io/datadoghq/operator",
}

releaseName := helpers.RandomName()
datadogOperatorRelease := datadog.DatadogOperatorReleaseName

// Install the consul cluster in the default kubernetes ctx.
consulCluster := consul.NewHelmCluster(t, helmValues, ctx, cfg, releaseName)
consulCluster.Create(t)

// Deploy Datadog Agent via Datadog Operator and apply dogstatsd overlay
datadogNamespace := helmValues["global.metrics.datadog.namespace"]
logger.Log(t, fmt.Sprintf("deploying datadog-operator via helm | namespace: %s | release-name: %s", datadogNamespace, datadogOperatorRelease))
datadogCluster := datadog.NewDatadogCluster(t, ctx, cfg, datadogOperatorRelease, datadogNamespace, datadogOperatorHelmValues)
datadogCluster.Create(t)

logger.Log(t, fmt.Sprintf("deploying datadog-agent | namespace: %s", datadogNamespace))
k8s.DeployKustomize(t, ctx.KubectlOptionsForNamespace(datadogNamespace), cfg.NoCleanupOnFailure, cfg.NoCleanup, cfg.DebugDirectory, "../fixtures/bases/datadog")
logger.Log(t, fmt.Sprintf("applying dogstatd over unix domain sockets patch to datadog-agent | namespace: %s", datadogNamespace))
k8s.DeployKustomize(t, ctx.KubectlOptionsForNamespace(datadogNamespace), cfg.NoCleanupOnFailure, cfg.NoCleanup, cfg.DebugDirectory, "../fixtures/cases/datadog-dogstatsd-udp")
k8s.WaitForAllPodsToBeReady(t, ctx.KubernetesClient(t), datadogNamespace, "agent.datadoghq.com/component=agent")

datadogAPIClient := datadogCluster.DatadogClient(t)
response, fullResponse, err := datadog.ApiWithRetry(t, datadogAPIClient, datadog.MetricTimeSeriesQuery, acceptanceTestingTags, consulDogstatsDMetricQuery, maxDatadogAPIRetryAttempts)
if err != nil {
content, _ := json.MarshalIndent(response.QueryResponse, "", " ")
fullContent, _ := json.MarshalIndent(fullResponse, "", " ")
logger.Logf(t, "Error when querying /v1/query endpoint for %s: %v", consulDogstatsDMetricQuery, err)
logger.Logf(t, "Response: %v", string(content))
logger.Logf(t, "Full Response: %v", string(fullContent))
}
content, _ := json.MarshalIndent(response.QueryResponse, "", " ")
logger.Logf(t, "Response: %v", string(content))
require.Contains(t, string(content), consulDogstatsDMetricQuery)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: MPL-2.0
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../bases/datadog
patches:
- path: patch.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@ spec:
annotations:
'consul.hashicorp.com/connect-inject': 'false'
'consul.hashicorp.com/transparent-proxy': 'false'
volumes:
- hostPath:
path: /var/run/datadog/
name: dsdsocket
tolerations:
- operator: Exists
env:
Expand All @@ -54,7 +50,4 @@ spec:
- name: DD_DOGSTATSD_NON_LOCAL_TRAFFIC
value: "true"
- name: DD_USE_V2_API_SERIES
value: "true"
volumeMounts:
- name: dsdsocket
mountPath: /var/run/datadog
value: "true"

0 comments on commit 13b7089

Please sign in to comment.