Fim de uma Era: Log Analytics Agent da Azure Monitor foi Descontinuado em 31 de Agosto de 2024, e agora?

Para coletar custom logs de uma VM gerida pelo Azure, recomenda-se a utilização do Azure Monitor e do Azure Agent Monitor (AMA). O Agente do Azure Monitor é o sucessor do Agente de Análise de Log, que foi descontinuado em 31 de agosto de 2024. Atualmente, existem problemas associados ao fornecedor azurerm em relação ao Azure Monitor.

Abaixo encontram-se Links para algumas das capacidades abordadas neste post:

Problema

Atualmente, o método recomendado para coletar logs e armazená-los com o Azure Monitor baseia-se na seguinte configuração:

  • Configurar Log Analytics Workspace
  • Criar Log Analytics Workspace Table para armazenar logs
  • Instalar os agentes corretos na VM
  • Configurar uma regra de recolha de dados (DCR)
  • Configurar Data Collection Endpoint
  • Criar Data Collection Association entre a Regra de Coleta de Dados e a VM

De acordo com a documentação do Azure, aconselha-se a criação de uma tabela no Log Analytics Workspace para armazenar os registos personalizados. Anteriormente, os programadores podiam criar a tabela quando configuravam o Log Analytics Workspace.

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "West Europe"
}

resource "azurerm_log_analytics_workspace" "example" {
  name                = "acctest-01"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  sku                 = "PerGB2018"
  retention_in_days   = 30
}

resource "azurerm_log_analytics_workspace_table" "container_logs" {
  name         = "ContainerLog"
  workspace_id = azurerm_log_analytics_workspace.example.id

  plan              = "Basic" # or "Analytics"
  retention_in_days = 7 # per docs, setting to null defaults to workspace default
}

O recurso azurerm_log_analytics_workspace_table foi descontinuado. Atualmente, não há forma de criar a tabela do espaço de trabalho de análise de registos utilizando o fornecedor azurerm.

A solução alternativa

Isto é feito utilizando a AzAPI para criar Log Analytics Workspace Table. O esquema da tabela deve corresponder ao formato dos seus registos.

Para ativar a AzAPI, tem de a incluir na sua configuração do terraform da seguinte forma:

terraform {
required_providers {
    azapi = {
      source  = "Azure/azapi"
      version = "~> 1.8.0"
    }
  }
}
resource "azapi_resource" "data_collection_logs_table" {
  name      = "Example_CL"
  parent_id = azurerm_log_analytics_workspace.example.id
  type      = "Microsoft.OperationalInsights/workspaces/tables@2022-10-01"
  body = jsonencode(
    {
      "properties" : {
        "schema" : {
          "name" : "Example_CL",
          "columns" : [
            {
              "name" : "TimeGenerated",
              "type" : "datetime",
              "description" : "The time at which the data was generated"
            },
            {
              "name" : "Level",
              "type" : "string",
              "description" : "Log level"
            },
            {
              "name" : "Logger",
              "type" : "string",
              "description" : "Logger name"
            },
            {
              "name" : "Context",
              "type" : "string",
              "description" : "Context of the log line"
            },
            {
              "name" : "Message",
              "type" : "string",
              "description" : "Log message"
            },
            {
              "name" : "AdditionalContext",
              "type" : "string",
              "description" : "Additional context of the log line"
            }
          ]
        },
        "retentionInDays" : 30,
        "totalRetentionInDays" : 30
      }
    }
  )
}

Este bloco HCL criará a tabela Log Analytics Workspace associado usando o esquema definido. Os detalhes das opções de esquema podem ser encontrados na documentação.

Documentação

O próximo passo será configurar a Regra de Recolha de Dados (DCR)

resource "azurerm_monitor_data_collection_rule" "example" {
  name                        = "dcr-example"
  resource_group_name         = azurerm_resource_group.example.name
  location                    = azurerm_resource_group.example.location
  data_collection_endpoint_id = azurerm_monitor_data_collection_endpoint.example.id


  data_sources {
    log_file {
      name          = "example-logfile"
      format        = "text"
      streams       = ["Custom-${azapi_resource.data_collection_logs_table.name}"]
      file_patterns = ["/var/log/example/*.log"]
      settings {
        text {
          record_start_timestamp_format = "ISO 8601"
        }
      }
    }
  }
  destinations {
    log_analytics {
      name                  = local.log_analytics_destination
      workspace_resource_id = azurerm_log_analytics_workspace.example.id
    }
  }
  data_flow {
    streams       = ["Custom-${azapi_resource.data_collection_logs_table.name}"]
    destinations  = [local.log_analytics_destination]
    output_stream = "Custom-${azapi_resource.data_collection_logs_table.name}"
  }
  stream_declaration {
    stream_name = "Custom-${azapi_resource.data_collection_logs_table.name}"
    column {
      name = "TimeGenerated"
      type = "datetime"
    }
    column {
      name = "Level"
      type = "string"
    }
    column {
      name = "Logger"
      type = "string"
    }
    column {
      name = "Context"
      type = "string"
    }
    column {
      name = "Message"
      type = "string"
    }
    column {
      name = "AdditionalContext"
      type = "string"
    }
  }
}

Este bloco HCL configurará a Regra de Coleta de Dados. A declaração de fluxo DCR deve espelhar o esquema usado no bloco de recursos AzAPI usado para criar Log Analytics Workspace Table. Os recursos finais que sua configuração deve ter são:

  • Log Analytics Workspace
  • Data Collection Endpoint
  • Azure Monitor Agent Extension
  • Data Collection Rule Association
resource "azurerm_log_analytics_workspace" "example" {
  name                = "example"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  sku                 = "PerGB2018"
  retention_in_days   = 30
}

resource "azurerm_monitor_data_collection_endpoint" "example" {
  name                          = "mdce"
  resource_group_name           = azurerm_resource_group.example.name
  location                      = azurerm_resource_group.example.location
  kind                          = "Linux"
}

resource "azurerm_virtual_machine_extension" "ama" {
  name                       = "AzureMonitorLinuxAgent"
  virtual_machine_id         = azurerm_virtual_machine.example.id
  publisher                  = "Microsoft.Azure.Monitor"
  type                       = "AzureMonitorLinuxAgent"
  type_handler_version       = "1.0"
}

resource "azurerm_monitor_data_collection_rule_association" "dcr" {
  name                    = "dcr"
  target_resource_id      = azurerm_virtual_machine.example.id
  data_collection_rule_id = azurerm_monitor_data_collection_rule.example.id
}

Depois de aplicar a configuração do terraform, pode ver a tabela através do seu Log Analytics Workspace.