Send Azure Databricks application logs to Azure Monitor (Enviar registos de aplicações do Azure Databricks para o Azure Monitor)

Nota

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

A biblioteca original suporta o Azure Databricks Runtimes 10.x (Spark 3.2.x) e 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 registro usados no Databricks Runtimes. Certifique-se de usar a compilação correta para seu Databricks Runtime. A biblioteca e o repositório GitHub estão em modo de manutenção. Não há planos para novos lançamentos, e o suporte a problemas será apenas o 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 logs e métricas de aplicativos do Azure Databricks para um espaço de trabalho 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.

Nota

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

Enviar métricas de aplicativos usando o Dropwizard

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

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

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

  2. Crie medidores ou contadores do Dropwizard no código do seu aplicativo. Você pode usar a UserMetricsSystem classe definida na biblioteca de monitoramento. O exemplo a seguir cria um contador 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 UserMetricsSystem classe.

Enviar logs de aplicativos usando o Log4j

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

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

  2. Crie um arquivo de configuração log4j.properties para seu aplicativo. Inclua as seguintes propriedades de configuração. Substitua o nome do pacote do aplicativo e o nível de log onde 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 para o código do aplicativo.

    import com.microsoft.pnp.logging.Log4jConfiguration
    
  4. Configure o 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 no nível apropriado em seu código, conforme necessário. Por exemplo, use o logDebug método para enviar uma mensagem de log de depuração. Para obter mais informações, consulte Registro em log na documentação do Spark.

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

Nota

Se você estiver usando a biblioteca e tiver o Apache Spark Notebooks, todos os logs que o Spark gerar durante a execução do bloco de anotações serão automaticamente direcionados para o Log Analytics.

Há uma limitação para o Python suportar 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 à máquina virtual Java a partir do Python.

Executar o exemplo de aplicação

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

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

  2. Navegue até seu espaço de trabalho Databricks e crie um novo trabalho, conforme descrito em Criar e executar trabalhos do Azure Databricks.

  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. Em Classe principal, insira com.microsoft.pnp.samplejob.StreamingQueryListenerSampleJob.

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

Quando o trabalho é executado, você pode exibir os logs e as métricas do aplicativo no espaço de trabalho 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 aparecem, pare o trabalho de aplicativo de exemplo.

Próximos passos

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.

Use dashboards to visualize Azure Databricks metrics (Utilizar dashboards para visualizar as métricas do Azure Databricks)