Skip to main content

Resources

Son datos encontrados en un span que no es un atributo.

Los atributos son particulares de cada span, por lo tanto los atributos de una llamada HTTP, de una llamada a Redis, Kafka, base de datos, etc., serán diferentes.

Cuando hablamos de resources estamos describiendo el entorno en el que estamos ejecutando. Todos los spans del mismo proceso, no hablamos de trace, probablemente tendrán los mismos resources.

Los recursos podrían ser:

  • Cloud provider (azure, aws, gcp ...)
  • Environment (staging, develop, production ...)
  • Deploy number
  • Pod ID
  • Container ID
  • Región (us-east-2, ca-central-1)
  • Zona de disponibilidad (A, B, C ...)
  • Cluster Name
  • Node Type

Los resources nos ayudarán con los metadatos y con el entorno, y ¿cómo podemos configurar esto?

En realidad ya configuramos 1 de ellos.

import { Resource } from "@opentelemetry/resources";

// código...
function start(serviceName: string) {
const resource = new Resource({
[ATTR_SERVICE_NAME]: serviceName,
});
// código...
const sdk = new NodeSDK({
resource, // Y lo pasamos aquí.
traceExporter,
instrumentations,
});
// código...
}
// código...

Tenemos dos opciones:

  • Definido manualmente como hicimos arriba
  • Predefinido

Lo que hicimos arriba fue modificar uno predefinido. Vamos a usar autodetect para llenar aquellos que ya existen y son detectados a partir de algunas fuentes específicas y bien definidas:

Variables de entorno OTEL_:

  • OTEL_SERVICE_NAME
  • OTEL_RESOURCE_ATTRIBUTES

Variables del entorno de ejecución:

  • HOSTNAME
  • NODE_ENV
  • DEPLOYMENT_ENVIRONMENT

Variables específicas de entorno de nube:

  • AWS: metadata de EC2, ECS, EKS
  • GCP: metadata de GCE, GKE
  • Azure: metadata de Azure VM, AKS

Variables de container/orquestación:

  • Kubernetes: namespace, pod name, container name
  • Docker: container ID, container name

Para esto en nuestro docker compose los servicios todos y auth levantarán algunas variables de entorno a partir de ahora.

Las variables de entorno posibles están disponibles en https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/. Varias cosas que necesitaremos definir dentro de OTEL_RESOURCE_ATTRIBUTES que sigue una convención

Vamos a cambiar nuestro compose para esto.

## Código....
auth:
build:
context: .
dockerfile: docker/Dockerfile.auth
volumes:
- .:/usr/src/app:rw
- /usr/src/app/node_modules
ports:
- 8080:8080
- 9464:9464
environment:
- OTEL_LOG_LEVEL=ERROR
- OTEL_SERVICE_NAME=auth-service
- OTEL_RESOURCE_ATTRIBUTES=service.namespace=tutorial,service.version=1.0,deployment.environment=study

depends_on:
- redis
- prometheus
- jaeger

todo:
build:
context: .
dockerfile: docker/Dockerfile.todo
volumes:
- .:/usr/src/app:rw
- /usr/src/app/node_modules
ports:
- 8081:8080
- 9465:9464
environment:
- OTEL_LOG_LEVEL=ERROR
- OTEL_SERVICE_NAME=todo-service
- OTEL_RESOURCE_ATTRIBUTES=service.namespace=tutorial,service.version=1.0,deployment.environment=study

depends_on:
- redis
- prometheus
- jaeger
# Código...

Además de estas crearemos otras manualmente de nuestro interés. Solo para ilustrar vamos a cambiar así.


function start(serviceName: string) {
// Define un resource con el nombre del servicio - será usado tanto para traces como para métricas
const resource = new Resource({
'team.ownner': "devsecops-team",
'repository': 'https://gitlab.com/davidpuziol/opentelemetry-project',
'site': 'https://devsecops.puziol.com.br',
});
// Código....
const sdk = new NodeSDK({
resource,
autoDetectResources: true, // añadido para buscar los patrones
traceExporter,
instrumentations,
});
}

En este caso el autodetect buscará en las variables de entorno y las configurará para nosotros. Intenté seguir la documentación oficial, pero existe una convención semántica que está siendo aprobada para crear un estándar de nomenclatura para variables que pasaremos en OTEL_RESOURCE_ATTRIBUTES. Algunas pude encontrar, otras aún están en fase de aprobación. No tome como verdad la forma en que lo hice, solo tome la idea como referencia. Dentro de Jaeger estas cosas se muestran en process en lugar de tags.

alt text

Variables de Entorno Importantes

OTEL_LOG_LEVEL: puede recibir NONE, ERROR, WARN, INFO, DEBUG, VERBOSE, ALL siendo el default INFO.

Si quiere desactivar OpenTelemetry OTEL_SDK_DISABLE debe recibir true

Muchas configuraciones que hicimos aquí podrían pasarse solo como variables de entorno.

Dependiendo del lenguaje utilizado, las variables de entorno pueden ser más o menos poderosas.