Qlik Sense User Selections
В статье мы расскажем, как фиксировать выбор пользователя в Qlik Sense Enterprise для Windows с помощью журналов и составлять отчеты об этом.
Почему?
Как разработчик Qlik Sense, мы привыкли получать запросы от бизнес-пользователей с просьбой добавить больше полей/визуализаций в приложения. Когда мы добавляем эти функции в приложения, мне нравится следить за ними, чтобы убедиться, что пользователи их используют. Мы можем использовать статистику использования листа, чтобы получить некоторую важную информацию. Но бывают случаи, когда вы хотите получить доступ к более детальным данным, например, для отладки проблемы или для отслеживания того, используют ли пользователи правильные фильтры и т.д. Это дает нам более подробное представление о том, как пользователи взаимодействуют с создаваемыми приложениями. Это может позволить нам точно настроить систему, чтобы обеспечить лучший пользовательский опыт, или просто отслеживать использование (или неправильное использование), или просто отлаживать проблему.
Как?
Небольшое предостережение, прежде чем мы перейдем к разделу "Как". Включение регистрации выбора пользователя в Qlik Sense может значительно улучшить использование хранилища журналов, особенно в сценариях развертывания с большим количеством пользователей/использования. Поэтому, пожалуйста, примите это во внимание, прежде чем включать.
Внимание: в многоузловых средах описанные ниже шаги необходимо повторить для каждого движка.
Теперь, когда мы знаем обо всех предостережениях, давайте рассмотрим шаги, необходимые для фиксации пользовательского выбора в Qlik Sense.
PS: Для некоторых шагов требуется доступ администратора к серверу Windows, на котором находится QSE.
- Откройте консоль управления Qlik Sense (QMC).
- Перейдите в Движки > Ведение журнала. В разделе «Отслеживание» установите для параметра «Уровень журнала аудита» значение «Информация».
- Перейдите на сервер Windows, на котором находится ядро Qlik Sense.
- Перейдите в следующее место –
%programdata%\Qlik\Sense\Engine
- Отредактируйте «settings.ini». Вы можете открыть этот файл в любом текстовом редакторе. Обязательно запустите редактор от имени администратора, так как вам нужно будет выполнить этот шаг имея права администратора.
- Добавьте в настройки следующее –
AuditLogAllSelection=1 AuditLogMessageLimit=10000 MaxCurSelEntries=10
PS: Пожалуйста, добавьте пустую строку после этого параметра в «settings.ini». например, нажмите «Enter» после последней строки. Параметр «MaxCurSelEntries» - это параметр, который устанавливает, сколько выбранных значений будет записано в журнал. Он просто регистрирует число (например, 17 вариантов выбора, 10 вариантов выбора и т. д.) Вместо значений, когда количество выбранных значений превышает это число.
- Перезапустите сервис движка.
- Перезапустите диспетчер служб.
Результат!
Выполнение описанных выше шагов включает ведение журнала выбора. Чтобы убедиться, что все работает, откройте приложение, выберите несколько вариантов, а затем перейдите в указанное ниже место и посмотрите файл "[SERVER_NAME]_Audit_Engine.txt».
%programdata%\Qlik\Sense\Log\Engine\Trace
Вы должны увидеть что-то похожее на представленный ниже пример.
[SERVER_NAME]_Audit_Engine.txt
В приведенном выше примере выбор сделан в полях с именами «Dim2», «AsciiAlpha» и т. д. Как вы можете понять, наблюдая за журналом, на самом деле он фиксирует гораздо больше, чем просто выбор. Вы также увидите множество сообщений об очистке выбора, наряду с другими системными полями и сообщениями, связанными с приложениями, в журнале. Чтобы сообщить о событиях, связанных с выбором пользователя, вам придется немного прибраться. Я потратил 5 минут и написал скрипт, который показывает, как это можно сделать. Этот скрипт можно расширить и добавить к другим уже используемым приложениям для мониторинга, чтобы улучшить их.
REM This load the latest data from the following location - "%programdata%\Qlik\Sense\Log\Engine\Trace\". Only need to load data form the "[SERVER_NAME]_Audit_Engine.txt" file. ==========================================================; SelectionTable: LOAD Sequence# AS [Action Order], DATE("Timestamp",'DD-MM-YYYY hh:mm:ss[.fff] TT') AS [Action Datetime], Message AS [Selections], ActiveUserDirectory, ActiveUserId AS User, Document AS [Application Id] FROM [$(liveLogConnection)/$(serverName)_Audit_Engine.txt] (txt, utf8, embedded labels, delimiter is '\t', msq) WHERE ProxySessionId 0 AND "Type"='Selection' // only interested in the selections for this application AND User 'Anonymous' // filtering out messages that are not related to QS users AND NOT WildMatch(Message,'*: Clear'); // filtering out the noise and other engine operations around clearing the selections
Ресурсы
Приведенный выше фрагмент сценария загрузит файлы журнала из каталога активного журнала. Но вы, вероятно, захотите загрузить данные из архива, если вы не перезагружаете приложение каждые 30 минут или около того. Вам также необходимо связать идентификаторы приложений с понятными именами приложений и связанными с ними потоками. Я расширил свой скрипт выше, чтобы сделать это, цель – помочь людям быстрее начать работу.
///$tab Load variables REM This section includes some variables used in the laod script. Please amend this variables to point the app to the correct connections for your environment, pointing to the log files. =================================================================================; SET liveLogConnection = '[YOUR_CONNECTION_NAME]'; SET serverName = '[YOUR_SERVER_NAME]'; SET liveLogLocation = '$(liveLogConnection)/$(serverName)_Audit_Engine.txt'; SET archivedLogLocation = 'lib://ArchivedLogsFolder/$(serverName)/Engine/Trace/$(serverName)_Audit_Engine_*.log'; ///$tab Subroutine REM Subroutine ot build the log table from archived and live locations. ===================================================================; SUB buildTable(dataSource,type) TRACE ** Loading SelectionTable from $(type) logs **; SelectionTable: LOAD Sequence# AS [Action Order], DATE("Timestamp",'DD-MM-YYYY hh:mm:ss[.fff] TT') AS [Action Datetime], Message AS [Selections], ActiveUserDirectory, ActiveUserId AS User, Document AS [Application Id] FROM [$(dataSource)] (txt, utf8, embedded labels, delimiter is '\t', msq) WHERE ProxySessionId <> 0 AND "Type"='Selection' // only interested in the selections AND User <> 'Anonymous' // filtering out messages that are not related to real QS users AND NOT WildMatch(Message,'*: Clear'); // filtering out the noise and other engine operation messages END SUB ///$tab Load log files REM This loads the latest data from the following location – "%programdata%\Qlik\Sense\Log\Engine\Trace\". Only need to load data form the "[SERVER_NAME]_Audit_Engine.txt" file. ==========================================================; CALL buildTable(liveLogLocation,'Live'); REM This loads the archived data from the existing "ArchivedLogsFolder" that comes as part of the default installation of Qlik Sense Enterprise for Windows and used in the monitor apps provided by Qlik. Please make sure you have updated the "Load variables" sheet. =====================================================; CALL buildTable(archivedLogLocation,'Archieved'); ///$tab Apps and Streams REM This loads list of app and their associated stream (where applicable) using the deault REST connection monitor app uses. These REST connections are usually part of the installation. =====================================================; LIB CONNECT TO 'monitor_apps_REST_app'; RestConnectorMasterTable: SQL SELECT "id" AS "id_u3", "name" AS "name_u2", "description", "__KEY_root", (SELECT "__KEY_customProperties", "__FK_customProperties", (SELECT "__KEY_definition", "__FK_definition" FROM "definition" PK "__KEY_definition" FK "__FK_definition") FROM "customProperties" PK "__KEY_customProperties" FK "__FK_customProperties"), (SELECT "name" AS "name_u1", "__FK_stream" FROM "stream" FK "__FK_stream") FROM JSON (wrap on) "root" PK "__KEY_root"; Application: LOAD [id_u3] AS [Application Id], [name_u2] AS [Application Name], [description] AS [Application Description], [__KEY_root] RESIDENT RestConnectorMasterTable WHERE NOT IsNull([__KEY_root]) AND EXISTS([Application Id],[id_u3]); Stream: LOAD [name_u1] AS [Stream], [__FK_stream] AS [__KEY_root] RESIDENT RestConnectorMasterTable WHERE NOT IsNull([__FK_stream]) AND EXISTS([__KEY_root]); DROP TABLE RestConnectorMasterTable;
Ну вот и все…
На сегодня все. Надеюсь, вы нашли этот пост полезным. Я хотел бы услышать, как люди могут использовать этот инструмент и как он может вписаться в контрольный журнал, поэтому не стесняйтесь оставлять комментарий или два. Спасибо за чтение и счастливого Qliking…