Funções do collector
- Agent - As instâncias de agent coletam dados na borda, por exemplo, em servidores ou nós do Kubernetes, ou recebem eventos diretamente de aplicações instrumentadas com um SDK do OpenTelemetry. Neste último caso, a instância de agent é executada junto com a aplicação ou no mesmo host da aplicação (como um sidecar ou um Conjunto de Daemon). Os agents podem enviar seus dados diretamente para o ClickHouse ou para uma instância de gateway. Quando isso ocorre no primeiro caso, ele é chamado de padrão de implantação de Agent.
- Gateway - As instâncias de gateway fornecem um serviço independente (por exemplo, uma Implantação no Kubernetes), normalmente por cluster, por data center ou por região. Elas recebem eventos de aplicações (ou de outros collectors atuando como agents) por meio de um único endpoint OTLP. Normalmente, um conjunto de instâncias de gateway é implantado, com um balanceador de carga pronto para uso sendo utilizado para distribuir a carga entre elas. Se todos os agents e aplicações enviarem seus sinais para esse único endpoint, isso costuma ser chamado de padrão de implantação de Gateway.
Implantação do collector
- Managed ClickStack
- ClickStack Open Source
Recomendamos usar a distribuição oficial do coletor do ClickStack (/clickstack/deployment/hyperdx-only#otel-collector) na função de gateway ao enviar para o Managed ClickStack, sempre que possível. Se você optar por trazer o seu próprio, certifique-se de que ele inclua o exportador ClickHouse.O collector pode ser implantado via Helm (recomendado para Kubernetes) ou via Docker. O chart do Helm do ClickStack oficial incorpora o chart do Helm do OpenTelemetry Collector upstream como um subchart com a imagem da distribuição ClickStack pré-configurada — consulte o guia de implantação do ClickStack via Helm se quiser instalar a stack completa, incluindo o HyperDX. Para uma implantação standalone do collector, o chart upstream pode ser usado diretamente com a imagem do ClickStack, conforme mostrado abaixo.A instância de destino do ClickHouse é configurada por meio das variáveis de ambiente A distribuição ClickStack do OTel collector oferece suporte à extensão da configuração básica por meio da montagem de um arquivo de configuração personalizado e da definição de uma variável de ambiente.Para adicionar receivers, processors ou pipelines personalizados:Implante com o collector independente:Para configurações mais complexas, consulte a configuração padrão do collector do ClickStack e a documentação do exporter do ClickHouse.Para saber mais sobre a configuração de OTel collectors, incluindo
- Helm
- Docker
Adicione o repositório upstream do Helm do OpenTelemetry:Crie um Instale o chart:Para implantações em produção, recomendamos armazenar
values.yaml para configurar a imagem do ClickStack e as credenciais do Managed ClickStack:CLICKHOUSE_PASSWORD em um Secret do Kubernetes e referenciá-lo via extraEnvsFrom, em vez de inserir o valor diretamente.CLICKHOUSE_ENDPOINT, CLICKHOUSE_USERNAME e CLICKHOUSE_PASSWORD. O CLICKHOUSE_ENDPOINT deve ser o endpoint HTTP completo do ClickHouse Cloud, incluindo o protocolo e a porta — por exemplo, https://99rr6dm6v3.us-central1.gcp.clickhouse.cloud:8443.Para obter detalhes sobre como recuperar suas credenciais do Managed ClickStack, consulte aqui.Usuário de produçãoVocê deve usar um usuário com as credenciais adequadas em produção.
Modificando a configuração
Configuração da instância Managed ClickStack
O OpenTelemetry collector pode ser configurado para usar uma instância do Managed ClickStack por meio das variáveis de ambienteCLICKHOUSE_ENDPOINT, CLICKHOUSE_USERNAME e CLICKHOUSE_PASSWORD. A forma como essas variáveis são definidas depende do método de implantação utilizado:- Helm
- Docker
Sobrescreva as entradas relevantes em
extraEnvs no seu values.yaml e, em seguida, atualize o lançamento:Estendendo a configuração do collector
- Crie um arquivo de configuração personalizado com as configurações adicionais
- Monte o arquivo em
/etc/otelcol-contrib/custom.config.yaml - Defina a variável de ambiente
CUSTOM_OTELCOL_CONFIG_FILE=/etc/otelcol-contrib/custom.config.yaml
Na configuração personalizada, você define apenas novos receivers, processors e pipelines. Os processors base (
memory_limiter, batch) e os exporters (clickhouse) já estão definidos — referencie-os pelo nome. A configuração personalizada é mesclada à configuração base e não pode sobrescrever componentes existentes.Estrutura da configuração
receivers, operators e processors, recomendamos a documentação oficial do OpenTelemetry Collector.Docker Compose
No Docker Compose, modifique a configuração do collector usando as mesmas variáveis de ambiente mencionadas acima:Proteção do collector
- ClickStack gerenciado
- ClickStack Open Source
Por padrão, o ClickStack OpenTelemetry collector não fica protegido quando implantado fora das distribuições open source e não exige autenticação em suas portas OTLP.Para proteger a ingestão, especifique um token de autenticação ao implantar o collector usando a variável de ambiente Além disso, recomendamos:Isso pressupõe que o collector tenha sido configurado para usar o banco de dados
OTLP_AUTH_TOKEN. A forma de configurar isso depende do seu método de implantação:- Helm
- Docker
Adicione Para implantações em produção, recomendamos armazenar
OTLP_AUTH_TOKEN a extraEnvs no seu values.yaml e, em seguida, atualize a release:OTLP_AUTH_TOKEN e CLICKHOUSE_PASSWORD em um Secret do Kubernetes e referenciá-los por meio de extraEnvsFrom.- Configurar o collector para se comunicar com o ClickHouse via HTTPS.
- Criar um usuário dedicado para ingestão com permissões limitadas — veja abaixo.
- Habilitar TLS para o endpoint OTLP, garantindo comunicação criptografada entre SDKs/agentes e o collector. Isso pode ser configurado por meio de uma configuração personalizada do collector.
Criando um usuário de ingestão
Recomendamos criar um banco de dados e um usuário dedicados para o OTel collector para ingestão no Managed ClickStack. Esse usuário deve ter permissão para criar e inserir nas tabelas criadas e usadas pelo ClickStack.otel. Isso pode ser controlado pela variável de ambiente HYPERDX_OTEL_EXPORTER_CLICKHOUSE_DATABASE. Passe essa variável para o collector de forma semelhante às outras variáveis de ambiente.Processamento - filtragem, transformação e enriquecimento
- Implantar sua própria versão do OTel collector para realizar filtragem e processamento, enviando eventos para o ClickStack collector via OTLP para ingestão no ClickHouse.
- Implantar sua própria versão do OTel collector e enviar eventos diretamente ao ClickHouse usando o ClickHouse exporter.
-
Processors - Os processors recebem os dados coletados pelos receivers e os modificam ou transformam antes de enviá-los aos exporters. Os processors são aplicados na ordem configurada na seção
processorsda configuração do collector. Eles são opcionais, mas o conjunto mínimo normalmente é recomendado. Ao usar um OTel collector com o ClickHouse, recomendamos limitar os processors a: - Um memory_limiter é usado para evitar situações de falta de memória no collector. Consulte Estimating Resources para recomendações.
- Qualquer processor que faça enriquecimento com base em contexto. Por exemplo, o Kubernetes Attributes Processor permite definir automaticamente atributos de resource de spans, metrics e logs com metadados de k8s, por exemplo, enriquecendo eventos com o ID do pod de origem.
- Tail ou head sampling, se necessário para traces.
- Filtragem básica - descarte de eventos desnecessários, se isso não puder ser feito via operator (veja abaixo).
- Batching - essencial ao trabalhar com o ClickHouse para garantir que os dados sejam enviados em batches. Consulte “Optimizing inserts”.
- Operators - Operators fornecem a unidade mais básica de processamento disponível no receiver. Há suporte a parsing básico, permitindo definir campos como Severity e Timestamp. Também há suporte a parsing de JSON e regex, além de filtragem de eventos e transformações básicas. Recomendamos realizar a filtragem de eventos aqui.
Exemplo
regex_parser) e filtrar eventos, além de um processor para agrupar eventos e limitar o uso de memória.
file=code_snippets/ClickStack/config-unstructured-logs-with-processor.yaml
Otimizando inserções
Agrupamento em lotes
- (1) Se o nó que recebe os dados tiver problemas, a consulta de inserção atingirá o tempo limite (ou retornará um erro mais específico), e o remetente não receberá uma confirmação.
- (2) Se os dados tiverem sido gravados pelo nó, mas a confirmação não puder ser retornada ao remetente da consulta devido a interrupções de rede, o remetente receberá um timeout ou um erro de rede.
timeout do batch processor seja atingido, garantindo que a latência de ponta a ponta do pipeline permaneça baixa e que os lotes tenham um tamanho consistente.
Use inserções assíncronas
timeout do batch processor expira. Isso pode causar problemas e é nesses casos que as inserções assíncronas se tornam necessárias. Esse problema é raro se você estiver enviando dados para o ClickStack collector atuando como gateway — como ele agrega os dados, esse problema é mitigado. Consulte Funções do collector.
Se não for possível garantir lotes grandes, você pode delegar o batching ao ClickHouse usando Inserções assíncronas. Com inserções assíncronas, os dados são inseridos primeiro em um buffer e depois gravados no armazenamento do banco de dados posteriormente, de forma assíncrona.
Com inserções assíncronas habilitadas, quando o ClickHouse ① recebe uma consulta de INSERT, os dados da consulta são ② gravados imediatamente em um buffer na memória. Quando ③ ocorre o próximo flush do buffer, os dados do buffer são ordenados e gravados como uma parte no armazenamento do banco de dados. Observe que os dados não podem ser consultados antes de serem gravados no armazenamento do banco de dados; o flush do buffer é configurável.
Para habilitar inserções assíncronas para o collector, adicione async_insert=1 à string de conexão. Recomendamos que os usuários usem wait_for_async_insert=1 (o padrão) para obter garantias de entrega — consulte aqui para mais detalhes.
Os dados de uma inserção assíncrona são inseridos quando o buffer do ClickHouse é descarregado. Isso ocorre quando async_insert_max_data_size é excedido ou após async_insert_busy_timeout_ms milissegundos desde a primeira consulta de INSERT. Se async_insert_stale_timeout_ms estiver definido com um valor diferente de zero, os dados serão inseridos após async_insert_stale_timeout_ms milissegundos desde a última consulta. Você pode ajustar essas configurações para controlar a latência fim a fim do pipeline. Outras configurações que podem ser usadas para ajustar o flush do buffer estão documentadas aqui. Em geral, os valores padrão são adequados.
Considere inserções assíncronas adaptativasNos casos em que há poucos agents em uso, com baixo throughput, mas requisitos rigorosos de latência fim a fim, inserções assíncronas adaptativas podem ser úteis. Em geral, elas não se aplicam a casos de uso de observabilidade com alto throughput, como os vistos no ClickHouse.
async_insert_deduplicate.
Os detalhes completos sobre como configurar esse recurso podem ser encontrados nesta página da documentação ou neste post de blog com uma análise aprofundada.
Escalonamento
Adicionando Kafka
Configuração do OTel collectorA distribuição do ClickStack OpenTelemetry collector pode ser configurada com Kafka usando a configuração personalizada do collector.
Estimando recursos
| Taxa de logs | Recursos para o collector agent |
|---|---|
| 1k/segundo | 0.2CPU, 0.2GiB |
| 5k/segundo | 0.5 CPU, 0.5GiB |
| 10k/segundo | 1 CPU, 1GiB |
Escolha de esquema: Map vs JSON
Map(LowCardinality(String), String) por padrão. Esse é o esquema recomendado para workloads de observabilidade. Um esquema do tipo JSON está disponível em beta para avaliação em workloads com um conjunto pequeno e estável de chaves de atributo.
Para ver a comparação completa, quando cada um é mais apropriado, as variáveis de ambiente necessárias para habilitar o esquema do tipo JSON e o passo a passo da migração, consulte Map vs JSON type.