La forma más fácil de enviar las métricas de tu aplicación personalizada a Datadog es enviarlas a DogStatsD, un servicio de agregación de métricas incluido con el Agente de Datadog. DogStatsD implementa el protocolo StatsD y añade algunas extensiones específicas de Datadog:
- Tipo de métrica de histograma
- Verificaciones de servicio
- Eventos
- Etiquetado
Cualquier cliente StatsD compatible funciona con DogStatsD y el Agente, pero no incluye las extensiones específicas de Datadog.
Nota: DogStatsD NO implementa temporizadores de StatsD como un tipo de métrica nativa (aunque los soporta a través de histogramas).
DogStatsD está disponible en el Registro de Contenedores de Datadog, GAR, ECR, Azure ACR y Docker Hub:
Docker Hub está sujeto a límites de tasa de descarga de imágenes. Si no eres cliente de Docker Hub, Datadog recomienda que utilices el Registro de Contenedores de Datadog o un registro de proveedor de nube en su lugar. Para instrucciones, consulta
Cómo cambiar tu registro de contenedores.
Cómo funciona
DogStatsD acepta Custom Metrics, eventos y verificaciones de servicio a través de UDP y las agrega y reenvía periódicamente a Datadog.
Debido a que utiliza UDP, tu aplicación puede enviar métricas a DogStatsD y continuar su trabajo sin esperar una respuesta. Si DogStatsD alguna vez se vuelve inaccesible, tu aplicación no experimenta una interrupción.
A medida que recibe datos, DogStatsD agrega múltiples puntos de datos para cada métrica única en un solo punto de datos durante un período de tiempo llamado el intervalo de vaciado. DogStatsD utiliza un intervalo de vaciado de 10 segundos.
Configuración
DogStatsD consiste en un servidor, que se incluye con el Agente de Datadog, y una biblioteca cliente, que está disponible en múltiples lenguajes. El servidor de DogStatsD está habilitado por defecto a través del puerto UDP 8125 para el Agente v6+. Puedes establecer un puerto personalizado para el servidor si es necesario. Configura tu cliente para que coincida con la dirección y el puerto del servidor DogStatsD del Agente de Datadog.
Servidor DogStatsD del Agente de Datadog
Si necesitas cambiar el puerto, configura la opción dogstatsd_port en el archivo principal de configuración del Agente, y reinicia el Agente. También puedes configurar DogStatsD para usar un socket de dominio UNIX.
Para habilitar un puerto UDP personalizado para el servidor DogStatsD del Agente:
Establece el parámetro dogstatsd_port:
## @param dogstatsd_port - integer - optional - default: 8125
## Override the Agent DogStatsD port.
## Note: Make sure your client is sending to the same UDP port.
#
dogstatsd_port: 8125
Reinicia tu Agente.
Por defecto, DogStatsD escucha en el puerto UDP 8125, por lo que necesitas vincular este puerto al puerto de tu host al ejecutar el Agente en un contenedor. Si tus métricas de StatsD provienen de fuera de localhost, debes establecer DD_DOGSTATSD_NON_LOCAL_TRAFFIC en true para permitir la recolección de métricas. Para ejecutar el Agente con el servidor DogStatsD activo, ejecuta el siguiente comando:
docker run -d --cgroupns host \
--pid host \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v /proc/:/host/proc/:ro \
-v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
-e DD_API_KEY=<DATADOG_API_KEY> \
-e DD_DOGSTATSD_NON_LOCAL_TRAFFIC="true" \
-p 8125:8125/udp \
registry.datadoghq.com/agent:latest
Si necesitas cambiar el puerto utilizado para recolectar métricas de StatsD, usa la variable de entorno DD_DOGSTATSD_PORT="<NEW_DOGSTATSD_PORT>. También puedes configurar DogStatsD para usar un socket de dominio UNIX.
La recolección de métricas de StatsD está habilitada por defecto en socket de dominio UNIX. Para comenzar a recolectar tus métricas de StatsD a través de UDP, necesitas activar la función DogStatsD en la configuración del Operador.
Agrega features.dogstatsd.hostPortConfig.enabled a tu datadog-agent.yaml manifiesto:
features:
dogstatsd:
hostPortConfig:
enabled: true
This is an example datadog-agent.yaml manifest:
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
global:
credentials:
apiSecret:
secretName: datadog-secret
keyName: api-key
features:
dogstatsd:
hostPortConfig:
enabled: true
This enables the Agent to collect StatsD metrics over UDP on port 8125.
Aplica el cambio:
kubectl apply -f datadog-agent.yaml
Advertencia: El parámetro features.dogstatsd.hostPortConfig.hostPort abre un puerto en tu host. Asegúrate de que tu firewall solo permita el acceso desde tus aplicaciones o fuentes de confianza. Si tu complemento de red no soporta hostPorts, agrega hostNetwork: true en las especificaciones de tu pod de Agent. Esto comparte el espacio de nombres de red de tu host con el Agente de Datadog. También significa que todos los puertos abiertos en el contenedor están abiertos en el host. Si un puerto se utiliza tanto en el host como en tu contenedor, hay un conflicto (ya que comparten el mismo espacio de nombres de red) y el pod no inicia. Algunas instalaciones de Kubernetes no permiten esto.
Envía métricas StatsD al Agente
Tu aplicación necesita una forma confiable de determinar la dirección IP de su host. Esto se simplifica en Kubernetes 1.7, que amplía el conjunto de atributos que puedes pasar a tus pods como variables de entorno. En versiones 1.7 y superiores, puedes pasar la IP del host a cualquier pod agregando una variable de entorno al PodSpec. Por ejemplo, tu manifiesto de aplicación podría verse así:
env:
- name: DD_AGENT_HOST
valueFrom:
fieldRef:
fieldPath: status.hostIP
Con esto, cualquier pod que ejecute tu aplicación puede enviar métricas de DogStatsD con el puerto 8125 en $DD_AGENT_HOST.
Nota: Como mejor práctica, Datadog recomienda usar unified service tagging al asignar atributos. El unified service tagging vincula la telemetría de Datadog a través del uso de tres etiquetas estándar: env, service y version. Para aprender cómo unificar tu entorno, consulta unified service tagging.
Para recopilar métricas personalizadas con DogStatsD usando helm:
Actualiza tu archivo datadog-values.yaml para habilitar DogStatsD:
dogstatsd:
port: 8125
useHostPort: true
nonLocalTraffic: true
Note: hostPort functionality requires a networking provider that adheres to the CNI specification, such as Calico, Canal, or Flannel. For more information, including a workaround for non-CNI network providers, see the Kubernetes documentation: HostPort services do not work.
Warning: The hostPort parameter opens a port on your host. Make sure your firewall only allows access from your applications or trusted sources. If your network plugin doesn’t support hostPorts, so add hostNetwork: true in your Agent pod specifications. This shares the network namespace of your host with the Datadog Agent. It also means that all ports opened on the container are opened on the host. If a port is used both on the host and in your container, they conflict (since they share the same network namespace) and the pod does not start. Some Kubernetes installations do not allow this.
Actualiza la configuración de tu Agente:
helm upgrade -f datadog-values.yaml <RELEASE_NAME> datadog/datadog
Actualiza tus pods de aplicación: Tu aplicación necesita una forma confiable de determinar la dirección IP de su host. Esto se simplifica en Kubernetes 1.7, que amplía el conjunto de atributos que puedes pasar a tus pods como variables de entorno. En versiones 1.7 y superiores, puedes pasar la IP del host a cualquier pod agregando una variable de entorno al PodSpec. Por ejemplo, tu manifiesto de aplicación podría verse así:
env:
- name: DD_AGENT_HOST
valueFrom:
fieldRef:
fieldPath: status.hostIP
With this, any pod running your application is able to send DogStatsD metrics through port 8125 on $DD_AGENT_HOST.
Detección de origen
El Agente de Datadog v6.10.0 soporta la detección de origen, lo que permite a DogStatsD detectar de dónde provienen las métricas del contenedor y etiquetar automáticamente las métricas. Cuando la detección de origen está habilitada, todas las métricas recibidas a través de UDP son etiquetadas por el mismo pod
etiquetas como métricas de Autodiscovery.
En un cliente de DogStatsD
La detección de origen está habilitada por defecto en todos los clientes de DogStatsD.
Para deshabilitar la detección de origen en un cliente, realiza una de las siguientes acciones:
En el Datadog Agent
La detección de origen no está habilitada por defecto en el Datadog Agent. Para habilitar la detección de origen en el Datadog Agent, establece la DD_DOGSTATSD_ORIGIN_DETECTION_CLIENT variable de entorno en true.
Establece shareProcessNamespace:true en la especificación del pod para ayudar al Datadog Agent en la detección de origen en EKS Fargate.
Cómo se detectan los orígenes
La detección de origen se puede lograr de varias maneras. La detección de origen a través de cgroups está habilitada por defecto. La detección de origen sobre UDP o DD_EXTERNAL_ENV requiere configuración.
En Linux, el ID del contenedor se puede extraer de las entradas procfs relacionadas con cgroups. El cliente lee de /proc/self/cgroup o /proc/self/mountinfo para intentar analizar el ID del contenedor.
En cgroup v2, el ID del contenedor se puede inferir resolviendo la ruta del cgroup desde /proc/self/cgroup, combinándola con el punto de montaje del cgroup desde /proc/self/mountinfo. El inode del directorio resultante se envía al Datadog Agent. Si el Datadog Agent está en el mismo nodo que el cliente, esta información se puede utilizar para identificar el UID del pod.
Para habilitar la detección de origen sobre UDP, agrega las siguientes líneas a tu manifiesto de aplicación:
env:
- name: DD_ENTITY_ID
valueFrom:
fieldRef:
fieldPath: metadata.uid
El cliente de DogStatsD adjunta una etiqueta interna, entity_id. El valor de esta etiqueta es el contenido de la DD_ENTITY_ID variable de entorno, que es el UID del pod.
Agrega la siguiente etiqueta a tu pod:
admission.datadoghq.com/enabled: "true"
Si tu pod tiene esta etiqueta, el Controlador de Admisiones inyecta una variable de entorno, DD_EXTERNAL_ENV. El valor de esta variable se envía en un campo con la métrica, que puede ser utilizado por el Datadog Agent para determinar el origen de la métrica.
Cardinalidad de etiquetas
Lee Asignación de Etiquetas: Cardinalidad de Etiquetas para más información sobre la cardinalidad de etiquetas.
Globalmente
Puedes especificar la cardinalidad de etiquetas globalmente configurando la variable de entorno DD_CARDINALITY, o pasando un campo 'cardinality' al constructor.
Por métrica
Puedes especificar la cardinalidad de etiquetas por métrica pasando el valor en el parámetro cardinality. Los valores válidos para este parámetro son "none", "low", "orchestrator" o "high".
Cliente DogStatsD
Instala la biblioteca del cliente DogStatsD para tu lenguaje preferido y configúralo para que coincida con la dirección y el puerto del servidor DogStatsD del Agente de Datadog.
Instala el cliente DogStatsD
Las bibliotecas oficiales del cliente Datadog-DogStatsD están disponibles para los siguientes lenguajes. Cualquier cliente StatsD compatible funciona con DogStatsD y el Agente, pero no incluye las características específicas de Datadog mencionadas anteriormente:
gem install dogstatsd-ruby
go get github.com/DataDog/datadog-go/v5/statsd
El Cliente Java DataDog StatsD se distribuye con maven central, y puede ser descargado desde Maven. Comienza agregando la siguiente configuración a tu pom.xml:
<dependency>
<groupId>com.datadoghq</groupId>
<artifactId>java-dogstatsd-client</artifactId>
<version>4.2.1</version>
</dependency>
Agrega lo siguiente a tu composer.json:
"datadog/php-datadogstatsd": "1.6.*"
Nota: La primera versión enviada en Composer es 0.0.3
O clona manualmente el repositorio en github.com/DataDog/php-datadogstatsd y configúralo con require './src/DogStatsd.php'.
Instancia el cliente DogStatsD
Una vez que tu cliente DogStatsD esté instalado, instáncialo en tu código:
from datadog import initialize, statsd
options = {
'statsd_host':'127.0.0.1',
'statsd_port':8125
}
initialize(**options)
Por defecto, las instancias del cliente DogStatsD de Python (incluyendo la
statsd instancia global) no pueden ser compartidas entre procesos, pero son seguras para hilos. Debido a esto, el proceso padre y cada proceso hijo deben crear sus propias instancias del cliente o el almacenamiento en búfer debe ser deshabilitado explícitamente configurando
disable_buffering a
True. Consulta la documentación en
datadog.dogstatsd para más detalles.
# Import the library
require 'datadog/statsd'
# Create a DogStatsD client instance.
statsd = Datadog::Statsd.new('localhost', 8125)
Si usas DogStatsD con el agente de contenedor o en Kubernetes, debes instanciar el servidor al que se envían las métricas de StatsD con la $DD_DOGSTATSD_SOCKET variable de entorno si usas un Socket de Dominio UNIX, o con la $DD_AGENT_HOST variable de entorno si estás usando el método de enlace de puerto del host.
dogstatsd_client, err := statsd.New("127.0.0.1:8125")
if err != nil {
log.Fatal(err)
}
Para más opciones, consulta GoDoc de Datadog.
import com.timgroup.statsd.NonBlockingStatsDClientBuilder;
import com.timgroup.statsd.StatsDClient;
public class DogStatsdClient {
public static void main(String[] args) throws Exception {
StatsDClient statsd = new NonBlockingStatsDClientBuilder()
.prefix("statsd")
.hostname("localhost")
.port(8125)
.build();
// alternatively
StatsDClient statsdAlt = new NonBlockingStatsDClient(
new NonBlockingStatsDClientBuilder(
.prefix("statsd")
.hostname("localhost")
.port(8125)
.resolve()));
}
}
Instancia un nuevo objeto DogStatsD usando composer:
<?php
require __DIR__ . '/vendor/autoload.php';
use DataDog\DogStatsd;
$statsd = new DogStatsd(
array('host' => '127.0.0.1',
'port' => 8125,
)
);
Configura la clase DogStatsd:
// The code is located under the StatsdClient namespace
using StatsdClient;
// ...
var dogstatsdConfig = new StatsdConfig
{
StatsdServerName = "127.0.0.1",
StatsdPort = 8125,
};
using (var dogStatsdService = new DogStatsdService())
{
if (!dogStatsdService.Configure(dogstatsdConfig))
throw new InvalidOperationException("Cannot initialize DogstatsD. Set optionalExceptionHandler argument in the `Configure` method for more information.");
// ...
} // Flush metrics not yet sent
Parámetros de instanciación del cliente
Nota: Como una buena práctica, Datadog recomienda usar unified service tagging al asignar etiquetas. El unified service tagging vincula la telemetría de Datadog a través del uso de tres etiquetas estándar: env, service y version. Para aprender cómo unificar tu entorno, consulta unified service tagging.
Además de la configuración requerida de DogStatsD (url y port), los siguientes parámetros opcionales están disponibles para su cliente DogStatsD:
| Parámetro | Tipo | Predeterminado | Descripción |
|---|
statsd_host | Cadena | localhost | El host de tu servidor DogStatsD. |
statsd_port | Entero | 8125 | El puerto de tu servidor DogStatsD. |
statsd_socket_path | Cadena | null | La ruta al socket de dominio UNIX de DogStatsD (anula host y port, solo compatible con el Datadog Agent v6+). |
statsd_constant_tags | Lista de cadenas | null | Etiquetas para aplicar a todas las métricas, eventos y verificaciones de servicio. |
statsd_namespace | Cadena | null | Espacio de nombres para prefijar todas las métricas, eventos y verificaciones de servicio. |
Para la lista completa de parámetros opcionales disponibles para datadog.initialize() así como parámetros disponibles solo al instanciar explícitamente instancias de datadog.dogstatsd.DogStatsd, consulte la biblioteca de Python de Datadog.
| Parámetro | Tipo | Predeterminado | Descripción |
|---|
host | Cadena | localhost | El host de tu servidor DogStatsD. |
port | Entero | 8125 | El puerto de tu servidor DogStatsD. |
socket_path | Cadena | null | La ruta al socket de dominio UNIX de DogStatsD (anula host y port, solo compatible con el Datadog Agent v6+). |
tags | Lista de cadenas | null | Etiquetas para aplicar a todas las métricas, eventos y verificaciones de servicio. |
namespace | Cadena | null | Espacio de nombres para prefijar a todas las métricas, eventos y verificaciones de servicio. |
single_thread | Booleano | false | Hace que el cliente envíe las métricas en el hilo principal cuando está habilitado en lugar de en un hilo secundario. |
Para la lista completa de parámetros opcionales, consulte el repositorio de dogstatsd-ruby en GitHub.
El cliente de Go tiene múltiples opciones para configurar el comportamiento de su cliente.
| Parámetro | Tipo | Descripción |
|---|
WithNamespace() | Cadena | Configure un espacio de nombres para prefijar a todas las métricas, eventos y verificaciones de servicio. |
WithTags() | Lista de cadenas | Etiquetas globales aplicadas a cada métrica, evento y verificación de servicio. |
Para todas las opciones disponibles, consulte GoDoc de Datadog.
A partir de la versión 2.10.0, la forma recomendada de instanciar el cliente es con el NonBlockingStatsDClientBuilder. Usted
puede utilizar los siguientes métodos de constructor para definir los parámetros del cliente.
| Método de Constructor | Tipo | Por defecto | Descripción |
|---|
prefix(String val) | Cadena | null | El prefijo que se aplicará a todas las métricas, eventos y verificaciones de servicio. |
hostname(String val) | Cadena | localhost | El nombre del host del servidor StatsD objetivo. |
port(int val) | Entero | 8125 | El puerto del servidor StatsD objetivo. |
constantTags(String... val) | Cadena varargs | null | Etiquetas globales que se aplicarán a cada métrica, evento y verificación de servicio. |
blocking(boolean val) | Booleano | falso | El tipo de cliente a instanciar: bloqueante vs no bloqueante. |
socketBufferSize(int val) | Entero | -1 | El tamaño del búfer de socket subyacente. |
enableTelemetry(boolean val) | Booleano | falso | Informe de telemetría del cliente. |
entityID(String val) | Cadena | null | ID de entidad para la detección de origen. |
errorHandler(StatsDClientErrorHandler val) | Entero | null | Manejador de errores en caso de un error interno del cliente. |
maxPacketSizeBytes(int val) | Entero | 8192/1432 | El tamaño máximo del paquete; 8192 sobre UDS, 1432 para UDP. |
processorWorkers(int val) | Entero | 1 | El número de hilos de trabajo del procesador que ensamblan los búferes para su envío. |
senderWorkers(int val) | Entero | 1 | El número de hilos de trabajo del remitente que envían los búferes al socket. |
poolSize(int val) | Entero | 512 | Tamaño del grupo de búferes de paquetes de red. |
queueSize(int val) | Entero | 4096 | Número máximo de mensajes no procesados en la cola. |
timeout(int val) | Entero | 100 | El tiempo de espera en milisegundos para operaciones bloqueantes. Aplica solo a sockets Unix. |
Para más información, busque el paquete Java DogStatsD package para la clase NonBlockingStatsDClient y la clase NonBlockingStatsDClientBuilder. Asegúrese de ver la versión que coincide con el lanzamiento de su cliente.
| Parámetro | Tipo | Por defecto | Descripción |
|---|
host | Cadena | localhost | El host de su servidor DogStatsD. Si esto no está configurado, el Agente revisa la variable de entorno DD_AGENT_HOST o DD_DOGSTATSD_URL. |
port | Entero | 8125 | El puerto de su servidor DogStatsD. Si esto no está configurado, el Agente revisa la variable de entorno DD_DOGSTATSD_PORT o DD_DOGSTATSD_URL. |
socket_path | Cadena | null | La ruta al socket de dominio UNIX de DogStatsD (anula host y port). Esto solo es compatible con el Agente v6 o superior. Si esto no está configurado, el Agente revisa la variable de entorno DD_DOGSTATSD_URL. |
global_tags | Lista de Cadenas | null | Etiquetas que se aplicarán a todas las métricas, eventos y verificaciones de servicio. La etiqueta @dd.internal.entity_id se agrega a global_tags de la variable de entorno DD_ENTITY_ID. |
origin_detection | Booleano | Verdadero | ¿Se deben agregar campos de detección de origen a cada métrica? |
container_id | Cadena | null | Un id de contenedor para etiquetar todas las métricas para la detección de origen. |
| Parámetro | Tipo | Por defecto | Descripción |
|---|
StatsdServerName | Cadena | localhost | El nombre del host del servidor StatsD objetivo. |
StatsdPort | Entero | 8125 | El puerto del servidor StatsD objetivo. |
Prefix | Cadena | null | Prefijo a aplicar a cada métrica, evento y verificación de servicio. |
ConstantTags | Lista de cadenas | null | Etiquetas globales que se aplicarán a cada métrica, evento y verificación de servicio. |
OriginDetection | Bool | Verdadero | ¿Se deben agregar campos de detección de origen a cada métrica? |
ContainerID | Cadena | null | Un id de contenedor para etiquetar todas las métricas para la detección de origen. |
Sumérgete en DogStatsD
DogStatsD y StatsD son ampliamente similares; sin embargo, DogStatsD contiene características avanzadas que son específicas de Datadog, incluyendo tipos de datos disponibles, eventos, verificaciones de servicio y etiquetas:
Más enlaces, artículos y documentación útiles:
Si está interesado en aprender más sobre el formato de datagrama utilizado por DogStatsD, o desea desarrollar su propia biblioteca de Datadog, consulte la sección de datagrama y uso de shell, que también explica cómo enviar métricas y eventos directamente desde la línea de comandos.
Lectura adicional
Más enlaces, artículos y documentación útiles: