Quick and easy install of Datadog Operator on a kind cluster.
Create a .env file with:
DD_API_KEY=<API key>
DD_APP_KEY=<app key>
DD_SITE=<Only if you want to override target site>
Quick and easy install of Datadog Operator on a kind cluster.
Create a .env file with:
DD_API_KEY=<API key>
DD_APP_KEY=<app key>
DD_SITE=<Only if you want to override target site>
| """Simple app to send DogStatsD metrics via UDS streams.""" | |
| import logging | |
| import os | |
| import random | |
| import threading | |
| import time | |
| from datadog.dogstatsd import DogStatsd | |
| logging.basicConfig( | |
| level=logging.DEBUG, | |
| format='%(asctime)s - %(name)s - %(levelname)s - %(funcName)s - %(message)s') | |
| class DDTester: | |
| """Class to send DogStatsD metrics via UDS streams.""" | |
| def __init__(self, dogstatsd: DogStatsd, tags: list = None): | |
| self.counter = 0 | |
| self.dogstatsd = dogstatsd | |
| self.tags = tags | |
| def submit_metrics(self, metric_prefix="test.qa", cardinality=None): | |
| """Submits all possible metrics types with the given prefix.""" | |
| logging.info("Getting ready to submit metrics with prefix '%s' and cardinality '%s'", metric_prefix, cardinality) | |
| counter = 0 | |
| while True: | |
| counter += 1 | |
| with self.dogstatsd.timed(f"{metric_prefix}.timer", tags=self.tags): | |
| logging.info("Submitting %s metrics", metric_prefix) | |
| self.dogstatsd.gauge(f"{metric_prefix}.gauge", counter, tags=self.tags, cardinality=cardinality) | |
| self.dogstatsd.increment(f"{metric_prefix}.counter_increment", tags=self.tags, cardinality=cardinality) | |
| self.dogstatsd.decrement(f"{metric_prefix}.counter_decrement", tags=self.tags, cardinality=cardinality) | |
| self.dogstatsd.histogram(f"{metric_prefix}.histogram", value=random.gauss(50, 15), tags=self.tags, cardinality=cardinality) | |
| self.dogstatsd.distribution(f"{metric_prefix}.distribution", value=random.gauss(50, 15), tags=self.tags, cardinality=cardinality) | |
| sleep_time = random.expovariate(1/15) # exponential distribution with mean of 15 seconds | |
| sleep_time = min(sleep_time, 60) # cap at 60 seconds | |
| time.sleep(sleep_time) | |
| if __name__ == "__main__": | |
| metric_tags = ["env:dev"] | |
| options = {} | |
| if os.environ.get("UNIXSTREAM_ENABLED", "false").lower() == "true": | |
| options["socket_path"] = "unixstream:///var/run/datadog/statsd-stream.sock" | |
| metric_tags.append("qa_socket:unixstream") | |
| elif os.environ.get("UDS_ENABLED", "false").lower() == "true": | |
| options["socket_path"] = "/var/run/datadog/dsd.socket" | |
| metric_tags.append("qa_socket:uds") | |
| else: | |
| metric_tags.append("qa_socket:udp") | |
| statsd_client = DogStatsd(**options) | |
| tester = DDTester(statsd_client, tags=metric_tags) | |
| metric_cardinality = os.environ.get("METRIC_CARDINALITY", None) | |
| t1 = threading.Thread(target=tester.submit_metrics, kwargs={"cardinality": metric_cardinality}) | |
| t1.start() | |
| t1.join() |
| --- | |
| apiVersion: apps/v1 | |
| kind: Deployment | |
| metadata: | |
| name: dogstatsd-py-app | |
| labels: | |
| environment: qa | |
| app.kubernetes.io/name: datadogpy-test | |
| app.kubernetes.io/instance: xxx | |
| app.kubernetes.io/version: "0.0.0-dev" | |
| app.kubernetes.io/managed-by: skaffold | |
| app.kubernetes.io/component: dogstatsd | |
| app.kubernetes.io/part-of: qa | |
| tags.datadoghq.com/env: qa | |
| tags.datadoghq.com/service: datadogpy-test | |
| tags.datadoghq.com/version: "0.0.0-dev" | |
| spec: | |
| replicas: 2 | |
| selector: | |
| matchLabels: | |
| app.kubernetes.io/name: datadogpy-test | |
| template: | |
| metadata: | |
| labels: | |
| app.kubernetes.io/name: datadogpy-test | |
| environment: qa | |
| app.kubernetes.io/instance: xxx | |
| app.kubernetes.io/version: "0.0.0-dev" | |
| app.kubernetes.io/managed-by: skaffold | |
| app.kubernetes.io/component: dogstatsd | |
| app.kubernetes.io/part-of: qa | |
| tags.datadoghq.com/env: qa | |
| tags.datadoghq.com/service: datadogpy-test | |
| tags.datadoghq.com/version: "0.0.0-dev" | |
| spec: | |
| containers: | |
| - name: dogstatsd-py-app | |
| image: skaffold-dogstatsd-unixstream | |
| env: | |
| # - name: UNIXSTREAM_ENABLED | |
| - name: UDS_ENABLED | |
| value: "true" | |
| - name: DD_ENV | |
| value: "qa" | |
| - name: DD_SERVICE | |
| value: "dogstatsd-qa" | |
| - name: METRIC_CARDINALITY | |
| value: "none" # "high" or "low" or "none" | |
| volumeMounts: | |
| - name: datadog-socket | |
| mountPath: /var/run/datadog | |
| readOnly: true | |
| volumes: | |
| - name: datadog-socket | |
| hostPath: | |
| path: /var/run/datadog | |
| type: Directory |
| --- | |
| apiVersion: datadoghq.com/v2alpha1 | |
| kind: DatadogAgent | |
| metadata: | |
| name: datadog | |
| spec: | |
| global: | |
| clusterName: my-qa-cluster | |
| site: datadoghq.eu | |
| logLevel: debug | |
| kubelet: | |
| tlsVerify: false | |
| credentials: | |
| apiSecret: | |
| secretName: my-datadog-operator-apikey | |
| keyName: api-key | |
| features: | |
| logCollection: | |
| enabled: true | |
| containerCollectAll: true | |
| dogstatsd: | |
| tagCardinality: high | |
| originDetectionEnabled: true | |
| unixDomainSocketConfig: | |
| enabled: true | |
| apm: | |
| enabled: true | |
| unixDomainSocketConfig: | |
| enabled: true | |
| override: | |
| clusterAgent: | |
| replicas: 1 | |
| nodeAgent: | |
| image: | |
| name: "gcr.io/datadoghq/agent:7.67.0-rc.5-full" | |
| env: | |
| - name: DD_HOSTNAME | |
| valueFrom: | |
| fieldRef: | |
| fieldPath: spec.nodeName |
| FROM python:3.11 | |
| WORKDIR /usr/src/app | |
| COPY requirements.txt ./ | |
| RUN pip install --no-cache-dir -r requirements.txt | |
| COPY app.py . | |
| CMD [ "python", "./app.py" ] |
| --- | |
| kind: Cluster | |
| apiVersion: kind.x-k8s.io/v1alpha4 | |
| name: test | |
| nodes: | |
| - role: control-plane | |
| - role: worker | |
| labels: | |
| env: test | |
| kube: kind | |
| - role: worker | |
| labels: | |
| env: qa | |
| kube: kind | |
| - role: worker | |
| labels: | |
| env: prod | |
| kube: kind |
| include .env | |
| CLI_ARCH := $(shell uname -m) | |
| DD_SITE ?= datadoghq.com | |
| ifeq ($(shell uname -m),aarch64) | |
| CLI_ARCH=arm64 | |
| endif | |
| ifeq ($(shell uname -s),Darwin) | |
| CLI_OS=darwin | |
| else | |
| CLI_OS=linux | |
| endif | |
| HELM_CLI ?= $(CURDIR)/bin/helm | |
| KUBECTL_CLI ?= $(CURDIR)/bin/kubectl | |
| KIND_CLI ?= $(CURDIR)/bin/kind | |
| SKAFFOLD_CLI ?= $(CURDIR)/bin/skaffold | |
| PACK_CLI ?= $(CURDIR)/bin/pack | |
| bin/helm : HELM_VERSION = v3.17.0 | |
| bin/helm : | |
| @(mkdir -p $(CURDIR)/bin) | |
| @(echo "Downloading https://get.helm.sh/helm-$(HELM_VERSION)-${CLI_OS}-${CLI_ARCH}.tar.gz{,.sha256sum}") | |
| @(curl -L --fail --remote-name-all https://get.helm.sh/helm-$(HELM_VERSION)-${CLI_OS}-${CLI_ARCH}.tar.gz{,.sha256sum}) | |
| @(shasum -a 256 -c helm-$(HELM_VERSION)-${CLI_OS}-${CLI_ARCH}.tar.gz.sha256sum) | |
| @tar -xzvf helm-$(HELM_VERSION)-$(CLI_OS)-$(CLI_ARCH).tar.gz --strip-components=1 -C $(CURDIR)/bin/ $(CLI_OS)-$(CLI_ARCH)/helm | |
| @(rm helm-$(HELM_VERSION)-$(CLI_OS)-$(CLI_ARCH).tar.*) | |
| @($(HELM_CLI) version) | |
| bin/kubectl : KUBECTL_VERSION = $(shell curl -L -s https://dl.k8s.io/release/stable.txt) | |
| bin/kubectl : | |
| @(mkdir -p $(CURDIR)/bin) | |
| @(echo "Downloading https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${CLI_OS}/${CLI_ARCH}/kubectl{,.sha256sum}") | |
| @(curl -L --fail --remote-name-all https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${CLI_OS}/${CLI_ARCH}/kubectl{,.sha256}) | |
| @(sed -i.bak 's/$$/ kubectl/' kubectl.sha256) | |
| @(shasum -a 256 -c kubectl.sha256) | |
| @(rm kubectl.sha256 kubectl.sha256.bak) | |
| @(mv kubectl $(CURDIR)/bin/) | |
| @(chmod +x $(CURDIR)/bin/kubectl) | |
| @($(KUBECTL_CLI) version --client) | |
| bin/kind : KIND_VERSION = v0.29.0 | |
| bin/kind : | |
| @(mkdir -p $(CURDIR)/bin) | |
| @(echo "Downloading https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-${CLI_OS}-${CLI_ARCH}{,.sha256sum}") | |
| @(curl -L --fail --remote-name-all https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-${CLI_OS}-${CLI_ARCH}{,.sha256sum}) | |
| @(shasum -a 256 -c kind-${CLI_OS}-${CLI_ARCH}.sha256sum) | |
| @(mv kind-${CLI_OS}-${CLI_ARCH} $(CURDIR)/bin/kind) | |
| @(rm kind-${CLI_OS}-${CLI_ARCH}.sha256sum) | |
| @(chmod +x $(CURDIR)/bin/kind) | |
| @($(KIND_CLI) version) | |
| bin/skaffold : SKAFFOLD_VERSION = v2.16.0 | |
| bin/skaffold : | |
| @(mkdir -p $(CURDIR)/bin) | |
| @(echo "Downloading https://github.com/GoogleContainerTools/skaffold/releases/download/${SKAFFOLD_VERSION}/skaffold-${CLI_OS}-${CLI_ARCH}") | |
| @(curl -L --fail --remote-name-all https://github.com/GoogleContainerTools/skaffold/releases/download/${SKAFFOLD_VERSION}/skaffold-${CLI_OS}-${CLI_ARCH}{,.sha256}) | |
| @(shasum -a 256 -c skaffold-${CLI_OS}-${CLI_ARCH}.sha256) | |
| @(mv skaffold-${CLI_OS}-${CLI_ARCH} $(CURDIR)/bin/skaffold) | |
| @(rm skaffold-${CLI_OS}-${CLI_ARCH}.sha256) | |
| @(chmod +x $(CURDIR)/bin/skaffold) | |
| @($(SKAFFOLD_CLI) version) | |
| bin/pack : PACK_VERSION = v0.37.0 | |
| bin/pack : | |
| @(mkdir -p $(CURDIR)/bin) | |
| @(echo "Downloading https://github.com/buildpacks/pack/releases/download/${PACK_VERSION}/pack-${PACK_VERSION}-${CLI_OS}-${CLI_ARCH}.tgz") | |
| @(curl -L --fail --remote-name-all https://github.com/buildpacks/pack/releases/download/${PACK_VERSION}/pack-${PACK_VERSION}-${CLI_OS}-${CLI_ARCH}.tgz{,.sha256}) | |
| @(shasum -a 256 -c pack-${PACK_VERSION}-${CLI_OS}-${CLI_ARCH}.tgz.sha256) | |
| @(tar -xvf pack-${PACK_VERSION}-${CLI_OS}-${CLI_ARCH}.tgz -C $(CURDIR)/bin/) | |
| @(rm pack-${PACK_VERSION}-${CLI_OS}-${CLI_ARCH}.tgz*) | |
| @($(PACK_CLI) version) | |
| .PHONY : install-tools | |
| install-tools : bin/helm | |
| install-tools : bin/kubectl | |
| install-tools : bin/kind | |
| install-tools : bin/skaffold | |
| install-tools : bin/pack | |
| .PHONY : setup | |
| setup : cluster/create | |
| .PHONY : cluster/create | |
| cluster/create : | |
| @($(KIND_CLI) create cluster --config=$(CURDIR)/kind-config.yaml) | |
| @($(KUBECTL_CLI) cluster-info --context kind-test) | |
| @($(KUBECTL_CLI) get svc,pods -A -o wide) | |
| .PHONY : cluster/destroy | |
| cluster/destroy : | |
| @($(KIND_CLI) delete cluster --name=test) | |
| .PHONY : datadog-operator/setup | |
| datadog-operator/setup : | |
| @($(HELM_CLI) repo add datadog https://helm.datadoghq.com) | |
| @($(HELM_CLI) repo update) | |
| @($(HELM_CLI) install my-datadog-operator datadog/datadog-operator \ | |
| --namespace datadog --create-namespace \ | |
| --set apiKey=$(DD_API_KEY) \ | |
| --set appKey=$(DD_APP_KEY) \ | |
| --set site=$(DD_SITE)) | |
| .PHONY : datadog-operator/agent | |
| datadog-operator/agent : | |
| @($(KUBECTL_CLI) apply \ | |
| -f $(CURDIR)/datadog-agent.yaml \ | |
| --namespace=datadog) | |
| .PHONY : debug | |
| debug : | |
| @echo "KIND_CLI: $(KIND_CLI)" | |
| @echo "KUBECTL_CLI: $(KUBECTL_CLI)" | |
| @echo "HELM_CLI: $(HELM_CLI)" | |
| @echo "CLI_OS: $(CLI_OS)" | |
| @echo "CLI_ARCH: $(CLI_ARCH)" | |
| @echo "DD_API_KEY: $(DD_API_KEY)" | |
| @echo "DD_APP_KEY: $(DD_APP_KEY)" | |
| @echo "DD_SITE: $(DD_SITE)" | |
| .PHONY : k/pods | |
| k/pods : | |
| @($(KUBECTL_CLI) get pods -A -o wide ${args}) |
| # datadog @ git+https://github.com/DataDog/datadogpy.git@8b86b83238f02d348f70845c4c769becb60b64f4 | |
| datadog @ git+https://github.com/DataDog/datadogpy.git@8c2f1fce980daead5afc0376bfa8bced2071abc5 |
| --- | |
| apiVersion: skaffold/v4beta13 | |
| kind: Config | |
| metadata: | |
| name: dogstatsd-py-app | |
| build: | |
| artifacts: | |
| - image: skaffold-dogstatsd-py-app | |
| docker: | |
| dockerfile: Dockerfile | |
| manifests: | |
| rawYaml: | |
| - app.yaml |