Поделиться через


TripPin часть 8. Добавление диагностика

Примечание.

В настоящее время это содержимое ссылается на содержимое из устаревшей реализации для диагностика в Visual Studio. Содержимое будет обновлено в ближайшем будущем, чтобы покрыть новый пакет SDK Power Query в Visual Studio Code.

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

В этом уроке вы научитесь:

  • Сведения о функции Diagnostics.Trace
  • Использование вспомогательных функций диагностики для добавления сведений трассировки для отладки соединителя

Включение диагностика

Пользователи Power Query могут включить ведение журнала трассировки, выбрав поле проверка box в разделе "Параметры" | Диагностика.

Включите трассировку в Power Query.

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

При выполнении запросов M из пакета SDK Power Query трассировка включена на уровне проекта. На странице свойств проекта существует три параметра, связанных с трассировкой:

  • Очистка журнала— если задано значение true, журнал будет сбрасываться или очищаться при выполнении запросов. Мы рекомендуем сохранить этот набор true.
  • Отображение трассировок ядра— этот параметр управляет выходными данными встроенных трассировок из подсистемы M. Эти трассировки полезны только членам команды Power Query, поэтому обычно этот набор falseтребуется сохранить.
  • Отображение трассировки пользователей— этот параметр управляет выводом сведений о трассировки соединителем. Вы хотите задать для этого значение true.

Свойства проекта.

После включения вы увидите записи журнала в окне вывода запроса M на вкладке "Журнал".

Diagnostics.Trace

Функция Diagnostics.Trace используется для записи сообщений в журнал трассировки подсистемы M.

Diagnostics.Trace = (traceLevel as number, message as text, value as any, optional delayed as nullable logical as any) => ...

Внимание

M — это функциональный язык с отложенной оценкой. При использовании Diagnostics.Traceследует помнить, что функция будет вызываться только в том случае, если выражение, которое оно является частью, на самом деле вычисляется. Примеры этого можно найти далее в этом руководстве.

Параметр traceLevel может быть одним из следующих значений (в порядке убывания):

  • TraceLevel.Critical
  • TraceLevel.Error
  • TraceLevel.Warning
  • TraceLevel.Information
  • TraceLevel.Verbose

Если трассировка включена, пользователь может выбрать максимальный уровень сообщений, которые они хотели бы просмотреть. Все сообщения трассировки этого уровня и ниже будут выводиться в журнал. Например, если пользователь выбирает уровень "Предупреждение", сообщения TraceLevel.Warningтрассировки и TraceLevel.ErrorTraceLevel.Critical будут отображаться в журналах.

Параметр message — это фактический текст, который будет выводиться в файл трассировки. Текст не будет содержать value параметр, если его явно не включить в текст.

Параметр value — это то, что функция вернет. delayed Если параметр заданtrue, будет нулевым параметром, value возвращающим фактическое значение, которое вы оцениваете. Если delayed задано falseзначение , value будет фактическим значением. Ниже приведен пример работы.

Использование диагностики. Трассировка в соединителе TripPin

Для практического примера использования Diagnostics.Trace и влияния delayed параметра обновите функцию соединителя GetSchemaForEntity TripPin, чтобы упаковать error исключение:

GetSchemaForEntity = (entity as text) as type =>
    try
        SchemaTable{[Entity=entity]}[Type]
    otherwise
        let
            message = Text.Format("Couldn't find entity: '#{0}'", {entity})
        in
            Diagnostics.Trace(TraceLevel.Error, message, () => error message, true);

Вы можете принудительно заставить ошибку во время оценки (в целях тестирования!), передав недопустимое имя сущности в функцию GetEntity . Здесь вы измените withData строку в TripPinNavTable функции, заменив [Name] на "DoesNotExist".

TripPinNavTable = (url as text) as table =>
    let
        // Use our schema table as the source of top level items in the navigation tree
        entities = Table.SelectColumns(SchemaTable, {"Entity"}),
        rename = Table.RenameColumns(entities, {{"Entity", "Name"}}),
        // Add Data as a calculated column
        withData = Table.AddColumn(rename, "Data", each GetEntity(url, "DoesNotExist"), type table),
        // Add ItemKind and ItemName as fixed text values
        withItemKind = Table.AddColumn(withData, "ItemKind", each "Table", type text),
        withItemName = Table.AddColumn(withItemKind, "ItemName", each "Table", type text),
        // Indicate that the node should not be expandable
        withIsLeaf = Table.AddColumn(withItemName, "IsLeaf", each true, type logical),
        // Generate the nav table
        navTable = Table.ToNavigationTable(withIsLeaf, {"Name"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        navTable;

Включите трассировку проекта и запустите тестовые запросы. На вкладке вы увидите Errors текст возникной ошибки:

Сообщение об ошибке.

Кроме того, на вкладке Log должно появиться то же сообщение. Если вы используете разные значения для message и value параметров, они будут отличаться.

Журнал ошибок.

Также обратите внимание, что Action поле сообщения журнала содержит имя (тип источника данных) расширения (в данном случае Engine/Extension/TripPin). Это упрощает поиск сообщений, связанных с расширением, при включении трассировки нескольких запросов и (или) системной трассировки (подсистемы mashup).

Отложенная оценка

В качестве примера работы delayed параметра вы внесите некоторые изменения и снова запустите запросы.

Сначала задайте delayed для значения значение false, но оставьте value параметр как есть:

Diagnostics.Trace(TraceLevel.Error, message, () => error message, false);

При выполнении запроса вы получите сообщение об ошибке", что "Мы не можем преобразовать значение функции типа в тип", а не фактическую ошибку, которую вы вызвали. Это связано с тем, что вызов теперь возвращает function значение, а не само значение.

Затем удалите функцию из value параметра:

Diagnostics.Trace(TraceLevel.Error, message, error message, false);

При выполнении запроса вы получите правильную ошибку, но если вы проверка вкладку "Журнал", сообщения не будут. Это связано с тем, что error в конечном итоге возникает или оценивается во время вызова Diagnostics.Trace, поэтому сообщение никогда не выводится.

Теперь, когда вы понимаете влияние delayed параметра, обязательно сбросить соединитель обратно в рабочее состояние, прежде чем продолжить.

Вспомогательные функции диагностики в Diagnostics.pqm

Файл Diagnostics.pqm , включенный в этот проект, содержит множество вспомогательных функций, упрощающих трассировку. Как показано в предыдущем руководстве, этот файл можно включить в проект (не забудьте задать действие сборки для компиляции), а затем загрузить его в файл соединителя. В нижней части файла соединителя теперь должен выглядеть примерно следующий фрагмент кода. Вы можете изучить различные функции, которые предоставляет этот модуль, но в этом примере вы будете использовать Diagnostics.LogValue только функции и Diagnostics.LogFailure функции.

// Diagnostics module contains multiple functions. We can take the ones we need.
Diagnostics = Extension.LoadFunction("Diagnostics.pqm");
Diagnostics.LogValue = Diagnostics[LogValue];
Diagnostics.LogFailure = Diagnostics[LogFailure];

Diagnostics.LogValue

Функция Diagnostics.LogValue очень похожа Diagnostics.Traceи может быть использована для вывода значения того, что вы оцениваете.

Diagnostics.LogValue = (prefix as text, value as any) as any => ...

Параметр prefix добавляется в сообщение журнала. Это позволит выяснить, какой вызов выводит сообщение. Параметр value — это то, что функция вернет, а также будет записана в трассировку в виде текстового представления значения M. Например, если value равно столбцам table A и B, журнал будет содержать эквивалентное #table представление: #table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})

Примечание.

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

Примечание.

Большинство сред Power Query усечены сообщения трассировки до максимальной длины.

Например, вы обновите TripPin.Feed функцию для трассировки url аргументов, schema переданных в функцию.

TripPin.Feed = (url as text, optional schema as type) as table =>
    let
        _url = Diagnostics.LogValue("Accessing url", url),
        _schema = Diagnostics.LogValue("Schema type", schema),
        //result = GetAllPagesByNextLink(url, schema)
        result = GetAllPagesByNextLink(_url, _schema)
    in
        result;

Необходимо использовать новые _url и _schema значения в вызове GetAllPagesByNextLink. Если вы использовали исходные параметры функции, Diagnostics.LogValue вызовы никогда не будут оцениваться, что приведет к отсутствии сообщений, записанных в трассировку. Функциональное программирование весело!

При выполнении запросов вы увидите новые сообщения в журнале.

Доступ к URL-адресу:

Доступ к сообщению URL-адреса.

Тип схемы:

Сообщение типа схемы.

Вы увидите сериализованную версию параметраtype, а не то, что вы получаете при выполнении простого Text.FromValueschema значения типа (что приводит к типу).

Diagnostics.LogFailure

Функцию Diagnostics.LogFailure можно использовать для оболочки вызовов функций и записывать в трассировку, только если вызов функции завершается сбоем (то есть возвращает значение error).

Diagnostics.LogFailure = (text as text, function as function) as any => ...

Diagnostics.LogFailure Внутри этого вызова добавляется try операторfunction. Если вызов завершается ошибкой, text значение записывается в трассировку перед возвратом исходного error. function Если вызов выполнен успешно, результат возвращается без записи в трассировку. Так как ошибки M не содержат полную трассировку стека (т. е. обычно отображается только сообщение об ошибке), это может быть полезно, если вы хотите определить, где возникла ошибка.

В качестве примера (плохого) измените withData строку TripPinNavTable функции, чтобы снова вызвать ошибку:

withData = Table.AddColumn(rename, "Data", each Diagnostics.LogFailure("Error in GetEntity", () => GetEntity(url, "DoesNotExist")), type table),

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

Сообщение LogFailure.

Не забудьте сбросить функцию в рабочее состояние, прежде чем продолжить работу со следующим руководством.

Заключение

В этом кратком уроке (но важно!) показано, как использовать вспомогательные функции диагностики для входа в файлы трассировки Power Query. При правильном использовании эти функции полезны при отладке проблем в соединителе.

Примечание.

Разработчик соединителя несет ответственность за то, чтобы вы не регистрировали конфиденциальную или личную информацию (PII) в рамках журнала диагностики. Кроме того, следует внимательно следить за тем, чтобы не выводить слишком много сведений трассировки, так как это может оказать негативное влияние на производительность.

Следующие шаги

Часть 9 TripPin — тест Подключение ion