TripPin часть 8. Добавление диагностика
Примечание.
В настоящее время это содержимое ссылается на содержимое из устаревшей реализации для диагностика в Visual Studio. Содержимое будет обновлено в ближайшем будущем, чтобы покрыть новый пакет SDK Power Query в Visual Studio Code.
В этом руководстве рассматривается создание нового расширения источника данных для Power Query. Это руководство предназначено для последовательного выполнения каждого урока— каждый урок, созданный на основе соединителя, созданного на предыдущих уроках, постепенно добавляя новые возможности в соединитель.
В этом уроке вы научитесь:
- Сведения о функции Diagnostics.Trace
- Использование вспомогательных функций диагностики для добавления сведений трассировки для отладки соединителя
Включение диагностика
Пользователи Power Query могут включить ведение журнала трассировки, выбрав поле проверка box в разделе "Параметры" | Диагностика.
После включения все последующие запросы вызывают передачу данных трассировки подсистеме 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.Error
TraceLevel.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-адресу:
Тип схемы:
Вы увидите сериализованную версию параметраtype
, а не то, что вы получаете при выполнении простого Text.FromValue
schema
значения типа (что приводит к типу).
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
ваши и исходные сведения об ошибке.
Не забудьте сбросить функцию в рабочее состояние, прежде чем продолжить работу со следующим руководством.
Заключение
В этом кратком уроке (но важно!) показано, как использовать вспомогательные функции диагностики для входа в файлы трассировки Power Query. При правильном использовании эти функции полезны при отладке проблем в соединителе.
Примечание.
Разработчик соединителя несет ответственность за то, чтобы вы не регистрировали конфиденциальную или личную информацию (PII) в рамках журнала диагностики. Кроме того, следует внимательно следить за тем, чтобы не выводить слишком много сведений трассировки, так как это может оказать негативное влияние на производительность.