Enviar logs de aplicativo do Azure Databricks para o Azure Monitor

Observação

Este artigo se baseia em uma biblioteca de código aberto hospedada no GitHub em: https://github.com/mspnp/spark-monitoring.

A biblioteca original dá suporte ao Azure Databricks Runtimes 10.x (Spark 3.2.x) e versões anteriores.

O Databricks contribuiu com uma versão atualizada para dar suporte ao Azure Databricks Runtimes 11.0 (Spark 3.3.x) e superior na l4jv2 ramificação em: https://github.com/mspnp/spark-monitoring/tree/l4jv2.

Observe que a versão 11.0 não é compatível com versões anteriores devido aos diferentes sistemas de log usados nos Databricks Runtimes. Certifique-se de usar a compilação correta para o Databricks Runtime. A biblioteca e o repositório do GitHub estão em modo de manutenção. Não há planos para lançamentos futuros, e o suporte a problemas será apenas de melhor esforço. Para quaisquer perguntas adicionais sobre a biblioteca ou o roteiro para monitoramento e registro em log de seus ambientes do Azure Databricks, entre em contato com azure-spark-monitoring-help@databricks.com.

Este artigo mostra como enviar métricas e logs do aplicativo do Azure Databricks para um workspace do Log Analytics. Ele usa a Biblioteca de Monitoramento do Azure Databricks, que está disponível no GitHub.

Pré-requisitos

Configure seu cluster do Azure Databricks para usar a biblioteca de monitoramento, conforme descrito no Leiame do GitHub.

Observação

A biblioteca de monitoramento transmite os eventos no nível do Apache Spark e as métricas do Streaming Estruturado do Spark dos trabalhos para o Azure Monitor. Você não precisa fazer nenhuma alteração no código do aplicativo para esses eventos e para essas métricas.

Enviar métricas do aplicativo usando o Dropwizard

O Spark usa um sistema configurável de métricas baseado na biblioteca de métricas do Dropwizard. Para obter mais informações, confira Métricas na documentação do Spark.

Para enviar métricas de aplicativo do código do aplicativo do Azure Databricks para o Azure Monitor, siga estas etapas:

  1. Crie o arquivo JAR spark-listeners-loganalytics-1.0-SNAPSHOT.jar, conforme descrito no Leiame do GitHub.

  2. Crie medidores ou contadores do Dropwizard no código do aplicativo. Você pode usar a classe UserMetricsSystem definida na biblioteca de monitoramento. O exemplo a seguir cria um contêiner chamado counter1.

    import org.apache.spark.metrics.UserMetricsSystems
    import org.apache.spark.sql.SparkSession
    
    object StreamingQueryListenerSampleJob  {
    
      private final val METRICS_NAMESPACE = "samplejob"
      private final val COUNTER_NAME = "counter1"
    
      def main(args: Array[String]): Unit = {
    
        val spark = SparkSession
          .builder
          .getOrCreate
    
        val driverMetricsSystem = UserMetricsSystems
            .getMetricSystem(METRICS_NAMESPACE, builder => {
              builder.registerCounter(COUNTER_NAME)
            })
    
        driverMetricsSystem.counter(COUNTER_NAME).inc(5)
      }
    }
    

    A biblioteca de monitoramento inclui um aplicativo de exemplo que demonstra como usar a classe UserMetricsSystem.

Enviar logs do aplicativo usando Log4j

Para enviar seus logs do aplicativo do Azure Databricks para o Azure Log Analytics usando o appender Log4j na biblioteca, siga estas etapas:

  1. Crie os arquivos JAR spark-listeners-1.0-SNAPSHOT.jar e spark-listeners-loganalytics-1.0-SNAPSHOT.jar, conforme descrito no Leiame do GitHub.

  2. Crie um arquivo de configuraçãolog4j.properties para seu aplicativo. Inclua as propriedades de configuração a seguir. Substitua o nome do pacote de aplicativos e o nível de log quando indicado:

    log4j.appender.A1=com.microsoft.pnp.logging.loganalytics.LogAnalyticsAppender
    log4j.appender.A1.layout=com.microsoft.pnp.logging.JSONLayout
    log4j.appender.A1.layout.LocationInfo=false
    log4j.additivity.<your application package name>=false
    log4j.logger.<your application package name>=<log level>, A1
    

    Você pode encontrar um arquivo de configuração de exemplo aqui.

  3. No código do aplicativo, inclua o projeto spark-listeners-loganalytics e importe com.microsoft.pnp.logging.Log4jconfiguration ao código do seu aplicativo.

    import com.microsoft.pnp.logging.Log4jConfiguration
    
  4. Configure Log4j usando o arquivo log4j.properties criado na etapa 3:

    getClass.getResourceAsStream("<path to file in your JAR file>/log4j.properties") {
          stream => {
            Log4jConfiguration.configure(stream)
          }
    }
    
  5. Adicione mensagens de log do Apache Spark ao nível apropriado no seu código conforme necessário. Por exemplo, use o método logDebug para enviar uma mensagem de log de depuração. Para obter mais informações, confira Registrar em log na documentação do Spark.

    logTrace("Trace message")
    logDebug("Debug message")
    logInfo("Info message")
    logWarning("Warning message")
    logError("Error message")
    

Observação

Se você estiver usando a biblioteca e tiver o Apache Spark Notebooks, todos os logs gerados pelo Spark durante a execução do bloco de anotações serão automaticamente direcionados para a Análise de Logs.

Há uma limitação para o Python oferecer suporte a mensagens de log personalizadas usando o Log4j configurado pelo Spark. Os logs só podem ser enviados do nó do driver porque os nós executores não têm acesso à Java Virtual Machine a partir do Python.

Executar o aplicativo de exemplo

A biblioteca de monitoramento inclui um aplicativo de exemplo que demonstra como enviar as métricas e os logs do aplicativo para o Azure Monitor. Para executar o exemplo:

  1. Crie o projeto spark-jobs na biblioteca de monitoramento, conforme descrito no Leiame do GitHub.

  2. Navegue até o workspace do Databricks e crie um trabalho, conforme descrito aqui.

  3. Na página de detalhes do trabalho, selecione Definir JAR.

  4. Carregue o arquivo JAR de /src/spark-jobs/target/spark-jobs-1.0-SNAPSHOT.jar.

  5. Para a Classe principal, insira com.microsoft.pnp.samplejob.StreamingQueryListenerSampleJob.

  6. Selecione um cluster já configurado para usar a biblioteca de monitoramento. Confira Configurar o Azure Databricks para enviar métricas para o Azure Monitor.

Quando o trabalho é executado, você pode exibir as métricas e os logs do aplicativo no seu workspace do Log Analytics.

Os logs do aplicativo aparecem em SparkLoggingEvent_CL:

SparkLoggingEvent_CL | where logger_name_s contains "com.microsoft.pnp"

As métricas do aplicativo aparecem em SparkMetric_CL:

SparkMetric_CL | where name_s contains "rowcounter" | limit 50

Importante

Depois de verificar se as métricas são exibidas, interrompa o trabalho do aplicativo de exemplo.

Próximas etapas

Implante o painel de monitoramento de desempenho que acompanha essa biblioteca de códigos para solucionar problemas de desempenho em suas cargas de trabalho de produção do Azure Databricks.