Como filtrar a coleta de logs no Container Insights
Este artigo descreve as diferentes opções de filtragem disponíveis no Container Insights. Os clusters do Kubernetes geram uma grande quantidade de dados que são coletados pelo Container Insights. Como você recebe cobranças pela ingestão e pela retenção desses dados, é possível reduzir significativamente os custos de monitoramento filtrando os dados desnecessários.
Importante
Este artigo descreve diferentes opções de filtragem que exigem que você modifique o DCR ou o ConfigMap para um cluster monitorado. Consulte Como configurar a coleta de logs no Container Insights para saber como realizar a configuração.
Como filtrar logs de contêiner
Os logs de contêiner stderr e stdout são gerados por contêineres no cluster Kubernetes. Esses logs são armazenados na tabela ContainerLogV2 no workspace do Log Analytics. Por padrão, todos os logs de contêiner são coletados, mas é possível filtrar os logs de namespaces específicos ou desabilitar completamente a coleta de logs de contêiner.
Com a DCR (regra de coleta de dados), é possível habilitar ou desabilitar os logs stdout e stderr e filtrar os namespaces específicos de cada um. As configurações para logs de contêiner e filtragem de namespace estão incluídas nas predefinições de custo configuradas no portal do Azure, e é possível definir esses valores individualmente com os outros métodos de configuração de DCR.
Usando o ConfigMap, é possível configurar a coleta dos logs stderr
e stdout
separadamente para o cluster, a fim de optar por habilitar um e não o outro.
O exemplo a seguir mostra as configurações do ConfigMap para coletar stdout e stderr, excluindo os namespaces kube-system
e gatekeeper-system
.
[log_collection_settings]
[log_collection_settings.stdout]
enabled = true
exclude_namespaces = ["kube-system","gatekeeper-system"]
[log_collection_settings.stderr]
enabled = true
exclude_namespaces = ["kube-system","gatekeeper-system"]
[log_collection_settings.enrich_container_logs]
enabled = true
Filtragem de logs da plataforma (namespaces do Kubernetes do sistema)
Por padrão, os logs de contêiner do namespace do sistema são excluídos da coleta para minimizar o custo do Log Analytics. Os logs de contêineres do sistema podem ser essenciais em cenários específicos de solução de problemas. Esse recurso é restrito aos seguintes namespaces do sistema: kube-system
, gatekeeper-system
, calico-system
, azure-arc
, kube-public
e kube-node-lease
.
Habilite os logs de plataforma usando o ConfigMap com a configuração collect_system_pod_logs
. Também é preciso verificar se o namespace do sistema não está na configuração exclude_namespaces
.
O exemplo a seguir mostra as configurações do ConfigMap para coletar os logs stdout e stderr do contêiner coredns
no namespace kube-system
.
[log_collection_settings]
[log_collection_settings.stdout]
enabled = true
exclude_namespaces = ["gatekeeper-system"]
collect_system_pod_logs = ["kube-system:coredns"]
[log_collection_settings.stderr]
enabled = true
exclude_namespaces = ["kube-system","gatekeeper-system"]
collect_system_pod_logs = ["kube-system:coredns"]
Filtragem baseada em anotação para cargas de trabalho
Com a filtragem baseada em anotação, é possível excluir a coleta de logs para determinados pods e contêineres anotando o pod. Isso pode reduzir significativamente o custo de ingestão de logs e permitir que você se concentre em informações relevantes, sem precisar filtrar o ruído.
Habilite a filtragem baseada em anotação usando o ConfigMap com as configurações a seguir.
[log_collection_settings.filter_using_annotations]
enabled = true
Também é preciso adicionar as anotações necessárias à especificação do pod da carga de trabalho. A tabela a seguir realça diferentes anotações possíveis de pod.
Anotação | Descrição |
---|---|
fluentbit.io/exclude: "true" |
Exclui fluxos stdout e stderr em todos os contêineres no Pod |
fluentbit.io/exclude_stdout: "true" |
Exclui apenas o fluxo stdout em todos os contêineres no Pod |
fluentbit.io/exclude_stderr: "true" |
Exclui apenas o fluxo stderr em todos os contêineres no Pod |
fluentbit.io/exclude_container1: "true" |
Excluir fluxos stdout e stderr somente para o contêiner1 no pod |
fluentbit.io/exclude_stdout_container1: "true" |
Excluir somente stdout para o contêiner1 no pod |
Observação
Essas anotações são baseadas em bit fluente. Se você usar sua própria solução de coleção de logs baseada em bit fluente com o filtro de plug-in do Kubernetes e a exclusão baseada em anotação, ela interromperá a coleta de logs do Container Insights e da sua solução.
Confira a seguir um exemplo de anotação fluentbit.io/exclude: "true"
em uma especificação de pod:
apiVersion: v1
kind: Pod
metadata:
name: apache-logs
labels:
app: apache-logs
annotations:
fluentbit.io/exclude: "true"
spec:
containers:
- name: apache
image: edsiper/apache_logs
Como filtrar variáveis de ambiente
Habilite a coleta de variáveis de ambiente em todos os pods e nós no cluster usando o ConfigMap com as configurações a seguir.
[log_collection_settings.env_var]
enabled = true
Se a coleção de variáveis de ambiente estiver habilitada globalmente, você poderá desabilitá-la para um contêiner específico definindo a variável de ambiente AZMON_COLLECT_ENV
como False
com uma configuração do Dockerfile ou no arquivo de configuração do pod na seção env:
. Se a coleta de variáveis de ambiente estiver desabilitada globalmente, você não poderá habilitá-la para um contêiner específico. A única substituição que pode ser aplicada no nível do contêiner é desabilitar a coleta quando ela já estiver habilitada globalmente.
Impacto nas visualizações e alertas
Se houver pastas de trabalho ou alertas personalizados que usem os dados do Container Insights, a modificação das configurações de coleta de dados poderá prejudicar essas experiências. Se você estiver excluindo namespaces ou reduzindo a frequência de coleta de dados, revise seus alertas, painéis e pastas de trabalho existentes usando esses dados.
Para verificar os alertas que fazem referência a essas tabelas, execute a seguinte consulta do Azure Resource Graph:
resources
| where type in~ ('microsoft.insights/scheduledqueryrules') and ['kind'] !in~ ('LogToMetric')
| extend severity = strcat("Sev", properties["severity"])
| extend enabled = tobool(properties["enabled"])
| where enabled in~ ('true')
| where tolower(properties["targetResourceTypes"]) matches regex 'microsoft.operationalinsights/workspaces($|/.*)?' or tolower(properties["targetResourceType"]) matches regex 'microsoft.operationalinsights/workspaces($|/.*)?' or tolower(properties["scopes"]) matches regex 'providers/microsoft.operationalinsights/workspaces($|/.*)?'
| where properties contains "Perf" or properties contains "InsightsMetrics" or properties contains "ContainerInventory" or properties contains "ContainerNodeInventory" or properties contains "KubeNodeInventory" or properties contains"KubePodInventory" or properties contains "KubePVInventory" or properties contains "KubeServices" or properties contains "KubeEvents"
| project id,name,type,properties,enabled,severity,subscriptionId
| order by tolower(name) asc
Próximas etapas
- Consulte Transformações de dados no Container Insights para adicionar transformações ao DCR que filtrarão ainda mais os dados com base nos critérios detalhados.