Задача Azure DevOps для Azure Data Explorer

Azure DevOps Services включает инструменты для совместной работы в области разработки, в том числе высокопроизводительные конвейеры, бесплатные частные репозитории Git, настраиваемые канбан-доски, а также различные автоматизированные и непрерывно работающие инструменты тестирования. Azure Pipelines — это функционал Azure DevOps для управления непрерывной поставкой и интеграцией для развертывания кода с помощью высокопроизводительных конвейеров, работающих с любым языком, платформой и облаком. Azure Data Explorer — Pipeline Tools — это задача Azure Pipelines, позволяющая создавать конвейеры выпуска и развертывать изменения базы данных в базах данных Azure Data Explorer. Она доступна бесплатно в Visual Studio Marketplace. Это расширение включает 3 основные задачи:

  • Azure Data Explorer Command для запуска команд администрирования в кластере Azure Data Explorer

  • Azure Data Explorer Query — выполнение запросов в кластеру Azure Data Explorer и анализ результатов

  • Azure Data Explorer Query Server Gate — задача без агента для определения выпусков шлюзов в зависимости от результатов запроса

    Типы задач.

В этом документе описывается простой пример использования задачи Azure Data Explorer — Pipeline Tools для развертывания изменений схемы в базе данных. Полное описание конвейеров непрерывной поставки и непрерывной интеграции см. в документации по Azure DevOps.

Предварительные требования

Подготовка содержимого к выпуску

Существует три способа выполнения команд администрирования для кластера в задаче.

Параметры управления источником команд.

  • Использование шаблона поиска для получения нескольких командных файлов из локальной папки агента (источники сборки или артефакты выпуска)

    Вариант локальной папки.

  • Встроенные команды записи

    Вариант встроенной команды.

  • Укажите путь к файлу для получения файлов команд непосредственно из системы управления версиями Git (рекомендуется)

    Вариант файлов Git.

    Создайте в репозитории Git следующие образцы папок (Functions, Policies, Tables). Скопируйте файлы отсюда в соответствующие папки, как показано ниже, и зафиксируйте изменения. Примеры файлов предоставляются для выполнения следующего рабочего процесса.

    Создайте папки для репозитория.

    Совет

    При создании собственного рабочего процесса рекомендуется сделать код идемпотентным. Например, используйте .create-merge table вместо .create table и функцию.create-or-alter вместо функции .create.

Создание конвейера выпуска

  1. Войдите в организацию Azure DevOps.

  2. Откройте Конвейеры>Выпуски в меню слева и выберите Создать конвейер.

    Создать конвейер.

  3. Откроется окно Новый конвейер выпуска. На вкладке Конвейеры в области Выбор шаблона выберите Пустое задание.

    Выберите шаблон.

  4. Нажмите кнопку Этап. В области Этап добавьте Имя этапа. Щелкните Сохранить, чтобы сохранить конвейер.

    Присвойте имя этапу.

  5. Нажмите кнопку Добавить артефакт. В области Добавить артефакт выберите репозиторий, в котором находится ваш код, введите нужные сведения и нажмите кнопку Добавить. Щелкните Сохранить, чтобы сохранить конвейер.

    Добавьте артефакт.

  6. На вкладке Переменные выберите + Добавить, чтобы создать переменную для URL-адреса конечной точки, которая будет использоваться в задаче. Запишите Имя и Значение конечной точки. Щелкните Сохранить, чтобы сохранить конвейер.

    Создайте переменную.

    Чтобы найти Endpoint_URL, используйте URI кластера Azure Data Explorer на странице обзора Azure Data Explorer Cluster. Создайте URI в следующем формате https://<Azure Data Explorer cluster URI>?DatabaseName=<DBName>. Например https://kustodocs.westus.kusto.windows.net?DatabaseName=SampleDB.

    URI кластера Azure Data Explorer.

Создание задач для развертывания папок

  1. На вкладке Конвейер щелкните задание 1, задача 0, чтобы добавить задачи.

    Добавьте задачи.

  2. Повторите следующие шаги, чтобы создать задачи команд для развертывания файлов из папок Tables, Functions и Policies:

    Добавьте команды администратора.

    1. На вкладке Задачи выберите + от Задание агента и выполните поиск Azure Data Explorer.

    2. В разделе Запуск команды Azure Data Explorer выберите Добавить.

    3. Выберите Команда Kusto и обновите задачу, указав следующие сведения:

      • Отображаемое имя: имя задачи. Например, Deploy <FOLDER> где <FOLDER> — это имя папки для создаваемой задачи развертывания.

      • Путь к файлу: для каждой папки укажите путь, например */<FOLDER>/*.csl, где <FOLDER> — это соответствующая папка для задачи.

      • URL-адрес конечной точки: укажите переменную EndPoint URL, созданную на предыдущем шаге.

      • Использовать конечную точку службы: выберите этот параметр.

      • Конечная точка службы: выберите существующую конечную точку службы или создайте новую ( + Создать), указав следующие сведения в окне Добавление подключения к службе Azure Data Explorer:

        Параметр Рекомендуемое значение
        Имя соединения Введите имя для обозначения этой конечной точки службы
        URL-адрес кластера Значение можно найти в разделе обзорной информации о Azure Data Explorer Cluster на портале Azure
        Идентификатор субъекта-службы Введите Microsoft Entra идентификатор приложения (создан в качестве предварительного требования)
        Ключ приложения субъекта-службы Введите ключ приложения Microsoft Entra (созданный в качестве предварительного требования)
        Microsoft Entra идентификатор клиента Введите клиент Microsoft Entra (например, microsoft.com или contoso.com).

      Установите флажок Разрешить всем конвейерам использовать это подключение, а затем нажмите кнопку ОК.

      Добавьте подключение для службы.

  3. Выберите Сохранить, а затем на вкладке Задачи убедитесь в наличии трех задач: Развертывание таблиц, Развертывание функций и Развертывание политик.

    Разверните все папки.

Создание задачи запроса

При необходимости создайте задачу для выполнения запроса к кластеру. Выполнение запросов в конвейере сборки или выпуска можно использовать для проверки набора данных и успешного выполнения шага на основе результатов запроса. Критерии успешного выполнения задач могут быть основаны на пороговом значении счетчика строк или отдельном значении в зависимости от того, что возвращается в ответ на запрос.

  1. На вкладке Задачи выберите + от Задание агента и выполните поиск Azure Data Explorer.

  2. В разделе Запуск запроса Azure Data Explorer выберите Добавить.

  3. Выберите Команда Kusto и обновите задачу, указав следующие сведения:

    • Отображаемое имя: имя задачи. Например, Запрос кластера.
    • Тип: выберите Встроенный.
    • Запрос: введите запрос, который необходимо выполнить.
    • URL-адрес конечной точки: укажите переменную EndPoint URL, созданную ранее.
    • Использовать конечную точку службы: выберите этот параметр.
    • Конечная точка службы: выберите конечную точку службы.

    Выполните запрос команды.

  4. В разделе «Результаты задачи» выберите условия успешного выполнения задачи на основе результатов запроса следующим образом:

    • Если запрос возвращает строки, выберите Количество строк и укажите нужные критерии.

      Число строк для задачи запроса.

    • Если запрос возвращает значение, выберите Единственное значение и укажите ожидаемый результат.

      Единственное значение задачи запроса.

Создание задачи для шлюза сервера запросов

При необходимости создайте задачу для выполнения запроса к кластеру и отрегулируйте шлюз выполнения выпуска, ожидающий число строк в результатах запроса. Задача шлюза запросов сервера — это безагентное задание, означающее, что запрос выполняется непосредственно на Azure DevOps Server.

  1. На вкладке Задачи выберите + от Задание без агента и выполните поиск Azure Data Explorer.

  2. В разделе Запуск шлюза сервера запросов Azure Data Explorer выберите Добавить.

  3. Выберите Шлюз сервера запросов Kusto, а затем выберите Тест шлюза сервера.

    Выберите задачу шлюза сервера.

  4. Настройте задачу, указав следующие сведения:

    • Отображаемое имя: имя шлюза.
    • Конечная точка службы: выберите конечную точку службы.
    • Имя базы данных: укажите имя базы данных.
    • Тип: выберите Встроенный запрос.
    • Запрос: введите запрос, который необходимо выполнить.
    • Максимальное пороговое значение: укажите максимальное число строк для критериев успешного выполнения запроса.

    Настройте задачу для шлюза сервера.

Примечание

При запуске выпуска вы должны увидеть результаты, аналогичные приведенным ниже.

Выполните запрос задачи шлюза.

Запуск выпуска

  1. Чтобы создать выпуск, выберите + Выпуск>Создать выпуск.

    Создадите выпуск.

  2. На вкладке Журналы убедитесь в успешности выполнения развертывания.

    Развертывание выполнено успешно.

Вы завершили создание конвейера выпуска для развертывания в подготовительной среде.

Конфигурация конвейера Yaml

Задачи можно настроить как через веб-интерфейс Azure DevOps (как показано выше), так и с помощью кода Yaml в схеме конвейера

Использование образца команды администратора

steps:
- task: Azure-Kusto.PublishToADX.PublishToADX.PublishToADX@1
  displayName: '<Task Name>'
  inputs:
    script: '<inline Script>'
    waitForOperation: true
    kustoUrls: '$(CONNECTIONSTRING):443?DatabaseName=""'
    customAuth: true
    connectedServiceName: '<Service Endpoint Name>'
    serialDelay: 1000
  continueOnError: true
  condition: ne(variables['ProductVersion'], '') ## Custom condition Sample

Пример использования запроса

steps:
- task: Azure-Kusto.PublishToADX.ADXQuery.ADXQuery@1
  displayName: '<Task Display Name>'
  inputs:
    script: |  
     let badVer=
     RunnersLogs | where Timestamp > ago(30m)
         | where EventText startswith "$$runnerresult" and Source has "ShowDiagnostics"
         | extend State = extract(@"Status='(.*)', Duration.*",1, EventText)
         | where State == "Unhealthy"
         | extend Reason = extract(@'"NotHealthyReason":"(.*)","IsAttentionRequired.*',1, EventText)
         | extend Cluster = extract(@'Kusto.(Engine|DM|CM|ArmResourceProvider).(.*).ShowDiagnostics',2, Source)
         | where Reason != "Merge success rate past 60min is < 90%"
         | where Reason != "Ingestion success rate past 5min is < 90%"
         | where Reason != "Ingestion success rate past 5min is < 90%, Merge success rate past 60min is < 90%"
         | where isnotempty(Cluster)
         | summarize max(Timestamp) by Cluster,Reason 
         | order by  max_Timestamp desc      
         | where Reason startswith "Differe"
         | summarize by Cluster
     ;   
      DimClusters | where Cluster in (badVer)
     | summarize by Cluster , CmConnectionString , ServiceConnectionString ,DeploymentRing
     | extend ServiceConnectionString = strcat("#connect ", ServiceConnectionString)
     | where DeploymentRing == "$(DeploymentRing)"
    kustoUrls: 'https://<ClusterName>.kusto.windows.net?DatabaseName=<DataBaneName>'
    customAuth: true
    connectedServiceName: '<Service Endpoint Name>'
  continueOnError: true