DogStatsD ingestion
When accepting DogStatsD metrics over the UDP, Observability Platform requires you to run the Chronosphere Collector as a Kubernetes DaemonSet or as a sidecar.
All ingested DogStatsD metrics are subject to sanitization rules that follow the Datadog best practice guidelines (opens in a new tab). For example, Chronosphere Observability Platform converts all DogStatsD labels to lowercase.
For information on converting Datadog metrics and dashboards to Observability Platform, see the Datadog overview.
Beginning with v0.110.0, the Chronosphere Collector supports DogStatsD protocols v1.0 to v1.6, and aggregates timer and distribution metrics as delta exponential histograms. The configuration options documented on this page are available in v0.110.0 and later. Prior versions of the Chronosphere Collector don’t support all documented configuration options.
Deploy the Chronosphere Collector
Datadog metrics libraries primarily send metrics using the UDP protocol, which sends packets without reliability mechanisms, such as handshakes, retries, or acknowledgments. Using UDP to send data over the network increases the risk of losing metric data due to lost packets and other network issues.
Because local UDP communication is generally more stable, keeping communication on the same Kubernetes node reduces this risk.
Install Collector as a Kubernetes DaemonSet
To install the Chronosphere Collector, follow the steps described in Kubernetes Collector installation to retrieve metrics.
The manifest defines a ClusterRole with the permissions required to access the local
Kubelet API and mounts a volume to access the cgroups
directory on the node.
Configure DogStatsD ingestion
-
Use the configuration from the annotated manifest (opens in a new tab) in the Kubernetes Collector installation documentation as a starting point.
-
Add
hostPort
to the DaemonSetcontainters.ports
YAML collection to enable network communication on the host network.spec: template: spec: containers: ports: ... - containerPort: 8125 hostPort: 8125 # Add hostPort name: dogstatsd protocol: UDP
-
Enable DogStatsD mode under the
push.dogstatsd.enabled
YAML collection in the Collector manifest.push: dogstatsd: enabled: true
-
Modify additional DogStatsD configuration options under the
push.dogstatsd
YAML collection.
DogStatsD configuration options
You can configure the following options in the Collector manifest for DogStatsD.
-
listenAddress
: The address the server listens on. The default is0.0.0.0:8125
. Your DogStatsD client points to this address and port.When changing the default port, also update the container ports in the DaemonSet manifest to match.
-
listenProtocol
: The protocol the server listens on. The Chronosphere Collector supportsudp
,tcp,
ortcp/udp
(both protocols on the same port). The default isudp
.push: dogstatsd: enabled: true listenAddress: 0.0.0.0:8125 listenProtocol: udp
-
aggregation
: A YAML collection that defines how the Collector ingests a data sample. The Collector aggregates the data based on the metric type and sends a single data point to Observability Platform that represents the sample for the defined interval. These aggregations reduce network egress and processed writes to Observability Platform.The Collector aggregates data points based on the DogStatsD metric type as follows:
counters
: Sums all data point values for a time series and sends theSUM
as aDELTA COUNTER
. Not configurable.gauges
: Selects theLAST
value for a time series in the interval. Not configurable.timers
: Aggregates timer values into aDELTA EXPONENTIAL HISTOGRAM
, by default, including DogStatsD histograms and distributions.-
aggregationType
: Defines how the Collector aggregates timers. Defaults tohistogram
.The deprecated
tdigest
option provides backward compatibility for users of DogStatsD support in Collector versions prior to v0.110.0, and will be removed in future versions. Unlike histograms, t-digests require additional aggregation rules to calculate and persist a computed quantile, count, min, max, or average as agauge
in Observability Platform.
-
interval
: Defines the length of time before writing to Observability Platform. Set an interval value that aligns with your licensed persistent writes and cardinality ratio. A more frequent aggregation interval increases persisted writes.inactiveExpireAfter
: Determines the length of time before Chronosphere evicts unused aggregation keys from the local cache. Defaults to2m
.
-
labels
: Adds labels to all DogStatsD metrics pushed. Define each label as a key-value pair.For example, the default configuration adds the labels
env
andk8s_cluster_name
using environment variables for the values. -
prefix
: Adds a prefix to all DogStatsD metrics pushed.For example, setting this value to
qa
prefixes all metric names withqa
followed by `.`, the dot separator. A metric likebuild_info.ip
becomesqa.build_info.ip
and is normalized toqa_build_info_ip
. -
kubernetesMetadataAugmentation:
Defines the configuration and addition of Kubernetes metadata, labels, and annotations to be added to the time series.The Chronosphere Collector doesn’t support using node or namespace metadata as the source for label augmentation.
-
enabled
: A Boolean value that toggles augmentation. Defaults tofalse
. The Chronosphere Collector retrieves metadata from the local Kubelet API and doesn’t support other sources. -
kubelet
:kubeletNodeIP
: Defines the public IP address assigned to Kubelet. Defaults to the value of theKUBERNETES_NODE_IP
environment variable.kubeletNodePort
: Defines the port that Kubelet listens on for HTTP requests. Defaults to10250
.kubeletNodePodsEndpoint
: Overrides the URL of Kubelet’s/pods
endpoint, which by default is constructed fromkubeletNodePort
andkubeletNodeIP
ashttps://${kubeletNodePort}:${kubeletNodeIP}/pods
.kubeletNodeTLSInsecureSkipVerify
: Determines whether the Chronosphere Collector skips verification of Kubelet’s TLS certificate. Defaults totrue
.kubeletNodeBearerTokenFile
: Defines the path to the file containing Collector’s service account token. Defaults to/var/run/secrets/kubernetes.io/serviceaccount/token
.timeout
: Defines how long the Chronosphere Collector waits for a response from the metadata source. Defaults to1s
.refreshInterval
: Defines the interval between refreshes if a cache miss didn’t trigger a cache update from Kubelet. Defaults to10s
.
-
metadataToAugment
: Adds pod metadata from the associated Kubernetes Pod metadata from which the metrics are sent as labels to the time series. Supported metadata keys arename
andnamespace
. -
labelsToAugment
: Adds pod labels from the associated Kubernetes Pod metadata from which the metrics are sent as labels to the time series. Specify the source Kubernetes label by name, and provide a name for the label as it should appear on the resulting metric time series.For example, the default configuration uses the value from the Kubernetes Pod label
app
as the value for theservice_name
label on all metrics. -
annotationsToAugment
: Adds annotations from the associated Kubernetes Pod metadata from which the metrics are sent as labels to the time series. Specify the source Kubernetes annotation by name, and provide a name for the label as it should appear on the resulting metric time series.For example, the default configuration uses the Kubernetes Pod annotation
app.myorg.com/owner
value as the value for theteam_owner
label. -
cgroupRefreshInterval
: Defines how often to refresh the inode to cgroup mapping, if a cache miss didn’t trigger a lookup. Defaults to5m
.
-
-
stripContainerID
: Removes thecontainer_id
orc
label sent by the DogStatsD metrics client. Defaults totrue
.
Default configuration
The following example shows the default configuration for DogStatsD ingest:
push:
dogstatsd:
enabled: true
listenAddress: 0.0.0.0:8125
listenProtocol: tcp/udp
aggregation:
timers:
# Default is "histogram" - aggregation to exponential histograms.
# Valid values are "histogram" and "tdigest".
# Use `tdigest` only when upgrading from Collector versions prior
# to v0.110.0 with aggregations explicitly enabled.
aggregationType: histogram
interval: 60s
inactiveExpireAfter: "2m"
labels:
env: ${ENV:""}
k8s_cluster_name: ${KUBERNETES_CLUSTER_NAME:""}
# prefix: "qa"
kubernetesMetadataAugmentation:
enabled: true
kubelet:
kubeletNodeIP: ${KUBERNETES_NODE_IP}
kubeletNodePort: 10250
# kubeletNodePodsEndpoint: https://${KUBERNETES_NODE_IP}:10250/pods
kubeletNodeTLSInsecureSkipVerify: true
kubeletNodeBearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
refreshInterval: 10s
timeout: 1s
metadataToAugment:
pod: # map of metadata_keyname: label_name
name: kube_pod_name
namespace: kube_namespace
labelsToAugment:
pod: # map of pod_label: label_name
app: service_name
annotationsToAugment:
pod: # map of pod_annotation: label_name
"app.myorg.com/owner": owner_team
stripContainerID: true