Ingestão de Dados e Backend de Armazenamento
O Priax suporta diferentes backends de armazenamento para Traces, Logs e Métricas coletados e podendo trabalhar com Opensearch, ou Elasticsearch. Para que os dados sejam injetados nessas bases de dados, utilizamos o OpenTelemetry Collector, e pode ser combinado ou não com outras tecnologias de transporte e transformação de dados como o Data Prepper e o Kafka.
Apresentaremos aqui os conceitos básicos do Collector e cenários práticos de implantação para utilização destas tecnologias com o Priax.
Data Collector
O Collector oferece uma implementação independente de fornecedor para receber, processar e exportar dados de telemetria. Ele elimina a necessidade de operar e manter múltiplos agentes/coletores. O Collector funciona com escalabilidade aprimorada e suporta formatos de dados de observabilidade de código aberto (por exemplo, Jaeger, Prometheus, Fluent Bit, etc.), enviando para um ou mais backends de código aberto ou comerciais. O agente Collector local é o destino padrão para o qual as bibliotecas de instrumentação exportam seus dados de telemetria.
Objetivos
- Usabilidade: Configuração padrão prática, suporta protocolos populares, funciona e coleta dados imediatamente.
- Desempenho: Altamente estável e eficiente sob diferentes cargas e configurações.
- Observabilidade: Um exemplo de serviço observável.
- Extensibilidade: Personalizável sem necessidade de alterar o código principal.
- Unificação: Base de código única, implantável como agente ou coletor, com suporte para rastros, métricas e logs.
Em abbientes de desenvolvimento ou testes e para ter resultados rápido com a observabilidade de maneira pontual é possível enviar seus dados diretamente de sua aplicação para um backend. Em ambientes de produção, no entanto, recomendamos usar um coletor junto com seus serviços, pois ele permite que o serviço descarregue dados rapidamente, realize cache quando necessário e, além disso, o coletor pode lidar com tarefas adicionais, como tentativas de reenvio, agrupamento, criptografia ou até mesmo filtragem de dados sensíveis.
O Collector facilita a unificação de dados, visto que suporta diversas formas de ingestão (Receivers) e diversas formas de exportação de dados (Exporters). Abaixo podemos ver como o Collector trabalha e como ele pode ser utilizado para enviar dados para os Backends de Armazenamento compatíveis com o Priax.
Como se pode observar o Collector pode receber dados diretamente das aplicações instrumentadas, de outros sistemas de observabilidade como o Prometheus ou o Jaeger mas também pode receber dados de outros Collectors ou buscar dados em sistemas Kafka, que podem ter sido alimentados por outros Collectors. Dessa forma pode-se criar um layout de implantação flexível onde os Collectors podem atuar como gateways concentradores ou como agentes de simples transmissão de dados para os BackEnds de Armazenamento.
Para compreender mais sobre os layouts de implantação do Data Collectos, consulte a página do OpenTelemetry que trata sobre o assunto.
Instalação e Configuração dos Collectors
A instalação dos Collectors é relativamente simples e pode ser realizada diretamente sobre os sistemas operacionais Windows ou Linux ou ainda utilizando Docker ou Kubernetes. As instruções para instalação podem ser consultadas na página de instalação do Collector do OpenTelemetry.
A Configuração completa do Collector pode ser consultada na extensa documentação fornecida pelo OpenTelemetry porém aqui apresentamos alguns cenários tipicamente utilizados.
Configuração Simples do Collector
receivers:
otlp:
protocols:
http:
#include_metadata: true
cors:
allowed_origins: ["http://*"]
allowed_headers: ["*"]
#max_age: 7200
#endpoint: 127.0.0.1:4318
kafka:
protocol_version: 3.3.0
group_id: priaxapm1
encoding: otlp_proto
brokers:
- priax-teste-01.servicebus.windows.net:9093
topic: priax
auth:
sasl:
username: $$ConnectionString
password: Endpoint=sb://kafkaAzure.servicebus.windows.net/;SharedAccessKeyName=teste-priax;SharedAccessKey=z5kREHICeAw0EEMySt7cP2kgh4XGb/zh4+AEhMe7r0g=;EntityPath=priax
mechanism: PLAIN
tls:
insecure: true
processors:
batch: {}
k8sattributes:
extract:
metadata:
- k8s.namespace.name
- k8s.deployment.name
- k8s.statefulset.name
- k8s.daemonset.name
- k8s.cronjob.name
- k8s.job.name
- k8s.node.name
- k8s.pod.name
- k8s.pod.uid
- k8s.pod.start_time
passthrough: false
pod_association:
- sources:
- from: resource_attribute
name: k8s.pod.ip
- sources:
- from: resource_attribute
name: k8s.pod.uid
- sources:
- from: connection
memory_limiter:
check_interval: 5s
limit_percentage: 80
spike_limit_percentage: 25
resource:
attributes:
- action: insert
from_attribute: k8s.pod.uid
key: service.instance.id
exporters:
debug:
verbosity: detailed
otlp/data-prepper:
endpoint: data-prepper:21890
tls:
insecure: true
opensearch:
http:
endpoint: https://opensearchserver:9200
auth:
authenticator: basicauth/client
tls:
insecure: false
logs_index: otel-logs
extensions:
health_check:
pprof:
zpages:
endpoint: ":55679"
basicauth/client:
client_auth:
username: ingester
password: ingesterpass
service:
extensions: [health_check, pprof, zpages]
pipelines:
traces:
receivers: [otlp]
processors: [k8sattributes,memory_limiter,resource,batch]
exporters: [debug,opensearch]
metrics:
receivers: [kafka,otlp]
processors: [k8sattributes,memory_limiter,resource,batch]
exporters: [debug,otlp/data-prepper]
logs:
receivers: [kafka,otlp]
processors: [k8sattributes,memory_limiter,resource,batch]
exporters: [debug,otlp/data-prepper]