Skip to main content

Resources

São dados encontrados em um span que não é um atributo.

Os atributos são particulares de cada span, portanto os atributos de uma chamada http, de uma chamada para o redis, kafka, database, etc, serão diferentes.

Falar de resources estamos descrevendo o ambiente eu que estamos executando. Todos os span do mesmo processo, não falamos de trace, provavelmente terão os mersmo resources.

Recursos poderiam ser:

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

Os resources irão nos ajudam com os metadados e com o ambiente e como podemos setar isso?

Na verdade já setamos 1 deles.

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

// codigo...
function start(serviceName: string) {
const resource = new Resource({
[ATTR_SERVICE_NAME]: serviceName,
});
// codigo...
const sdk = new NodeSDK({
resource, // E passamos aqui.
traceExporter,
instrumentations,
});
// codigo...
}
// codigo...

Temos duas opções:

  • Manualmente definido como fizemos acima
  • Pré definido

O que fizemos acima foi usar alterar uma pré definido. Vamos usar o autodetect para preencher aqueles que já existem e são detectados a partir de algumas fontes específicas e bem definidas:

Variáveis de ambiente OTEL_:

  • OTEL_SERVICE_NAME
  • OTEL_RESOURCE_ATTRIBUTES

Variáveis do ambiente de execução:

  • HOSTNAME
  • NODE_ENV
  • DEPLOYMENT_ENVIRONMENT

Variáveis específicas de ambiente de nuvem:

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

Variáveis de container/orquestração:

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

Para isso no nosso docker compose os servicos todos e o auth irão subir algumas variáveis de ambiente a partir de agora.

As variáveis de ambiente possíveis estão disponíveis em https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/. Vários coisas que iremos precisamor precisamos definir dentro de OTEL_RESOURCE_ATTRIBUTES que segue uma convenção

Vamos alterar o nosso compose para isso.

## 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...

Além dessas varmos criar outras manualmente do nosso interesse. Só para ilustrar vamos alterar assim.


function start(serviceName: string) {
// Define um resource com o nome do serviço - será usado tanto para traces quanto 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, //adicionado para procurar os padrões
traceExporter,
instrumentations,
});
}

Nesse caso o autodetect irá procurar nas variaveis de ambiente e setar para nós. Tentei seguir a documentação oficial, mas existe um convenção semântica sendo aprovado para criar um padrão de de nomemclatura para varíaveis que passaremos no OTEL_RESOURCE_ATTRIBUTES. Algumas eu consegui encontrar outras ainda estão em fase de aprovação. Não tome como verdade do modo que fiz, apenas leve como referência a idéia. Dentro do Jaeger essas coisas são mostradas em process ao invés de tags.

alt text

Variaveis de Ambiente Importantes

OTEL_LOG_LEVEL: pode receber NONE, ERROR, WARN, INFO, DEBUG, VERBOSE, ALL sendo o default INFO.

Se quiser desativar o Opentelemetry OTEL_SDK_DISABLE deve receber true

Muitas configurações que fizemos aqui poderiam ser passadas somente como variáveis de ambiente.

Dependendo da linguagem utilizada as variáveis de ambiente podem ser mais ou menos poderosas.