Удаление неиспользуемых подключений к данным
Преимущества:
- Сокращение времени вычисления правил безопасности для подключений к данным (повышение производительности)
- Сокращение объема работы по обслуживания системы
- Повышение концентрации внимания
- Устранение избыточности
Цель
Регулярное удаление неиспользуемых подключений к данным уменьшает беспорядок, повышает производительность и улучшает взаимодействие с пользователем. Цель этого раздела – оставить только те подключения к данным, которые необходимы для анализа.
Использование подключений к данным
Подключения к данным не так просто сопоставить со связанными ресурсами (приложениями, задачами и т.п.), поскольку они не сопоставляются напрямую в QRS с приложениями, которые их используют. Подключения к данным указываются в скрипте и используются во время обновления данных.
Есть два основных варианта сопоставления подключений к данным с ресурсами:
- Компонент lineage приложения, который доступен:
- через компонент lineage Qlik Engine REST API (с версии June 2019 и выше) и
- через Qlik Engine API.
- Анализ логов выполнения обновления данных приложений, как продемонстрировано в разделе «Анализатор подключений к данным».
Плюсы и минусы опции lineage :
Плюсы |
Минусы |
---|---|
Простая итерация (опция RESTful) из скрипта загрузки Qlik. |
Возвращает полные абсолютные пути к папкам, так что они не могут быть должным образом сопоставлены с соответствующими подключениями lib:// - и в конечном итоге не позволяет сопоставлять любые подключения с папками. |
Быстро и эффективно |
Результат может быть сложно проанализировать |
Включает загрузки INLINE и AUTOGENERATE |
Не включает историю – только самую последнюю перезагрузку. |
|
Не дает понять, какой пользователь их использовал, и когда |
|
Не дает информацию о том, сколько раз они использовались |
Плюсы и минусы опции «Анализатор подключения к данным»:
Плюсы |
Минусы |
---|---|
Надежная логика для обработки всех типов подключений к данным, включая подключения к папкам |
Первый запуск может занять много часов, так как может потребоваться проанализировать тысячи файлов логов. |
Имеет возможность анализировать журналы за все время |
Потенциально может привести к ложным срабатываниям для неиспользуемых подключений к данным (подробности см. в документации к приложению) |
Может использоваться для комплексного аудита |
|
Отслеживает, какие подключения использовали пользователи, и когда |
|
Отслеживает, сколько раз были запущены подключения к данным |
|
Отслеживает источник перезагрузки: хаб, планировщик или ODAG (api) |
|
Неиспользуемые подключения к данным
Для захвата неиспользуемых подключений к данным можно использовать любой из двух вариантов из раздела «Использование подключения к данным» выше. Если вы используете опцию lineage, полученные подключения необходимо будет сопоставить с существующими подключениями в QRS. Обратите внимание на проблему с подключениями к этому компоненту (lineage), описанную выше.
В этом разделе будет использоваться приложение «Data Connection Analyzer» (Анализатор подключения к данным).
В этом приложении следует сосредоточить внимание на двух листах:
-
Used Connections That Have Not Been Used Within 90 Days (используемые подключения, которые не использовались в течение 90 дней)
- На этом листе показаны подключения, которые в какой-то момент были активными, но не использовались в течение последних 90 дней. Это означает, что в настоящее время нет приложений, которые используют их, хотя эти приложения могут все еще существовать, если они перезагружаются с частотой > 90 дней. Эта переменная настраивается в скрипте загрузки и должна быть установлена в соответствии с корпоративной политикой. SET vNumDaysForUsedDataConnectionToBeConsideredUnused = 90;
-
Unused Connection Analysis (анализ неиспользуемых подключений)
- На этом листе показаны подключения, которые использовались ранее, но единственные приложения, которые когда-либо их использовали, были удалены, а также подключения, которые никогда не использовались.
Рекомендуемые действия
Рекомендуется удалить подключения к данным вручную, и чтобы все подключения к данным были проверены владельцем перед удалением. Анализатор подключений к данным в значительной степени точен, но его не следует рассматривать как 100% точный инструмент, поэтому проверка должна проводиться совместно с пользователями. Также рекомендуется сначала поместить подключения к данным в карантин перед их удалением.
Помещение подключений в карантин
Последовательность действий при «помещение в карантин» подключения к данным:
- Переименуйте подключение к данным, добавив префикс «QUARANTINED - » к его имени. Например, «My Data Connection (directory_owner)»станет «QUARANTINED - My Data Connection (directory_owner)».
- Измените владельца подключения к данным на sa_repository
- Создайте настраиваемое свойство с именем QuarantinedDataConnection , в котором значение true применяется к любому подключению, помещенному в карантин.
- Измените любые существующие настраиваемые правила безопасности для подключений к данным, используя настраиваемое свойство QuarantinedDataConnection , чтобы отменить их. Например, ((user.group="YourGroup")) превращается в ((user.group="YourGroup" and resource.@QuarantinedDataConnection.Empty())).
Это изменение имени гарантирует, что в существующих приложениях планировщик не сможет использовать это подключение, потому что в скриптах прописано предыдущее наименование. Смена владельца подтверждает, что первоначальный владелец пользователя больше не может читать подключение с помощью правила безопасности по умолчанию OwnerRead. А изменения правил безопасности гарантируют, что пользователи не будут видеть подключения к данным, если у последних есть значение в настраиваемом свойстве QuarantinedDataConnection .
Приоритет
-
Подключения, которые никогда не использовались, особенно подключения, которые созданы давно. Чаще всего такие подключения когда-то использовались для проверки подключения, после чего об их существовании забыли.
Но недавно созданные соединения, которые никогда не использовались, пользователи, возможно, просто еще не успели использовать, поэтому их не следует удалять. - Подключения, использовавшиеся в приложениях, которые сейчас удалены.
- Используемые подключения для передачи данных, которые не использовались в течение «x» дней.
Резервное копирование подключений к данным
Возможно, это не самая плохая идея – сделать скриншот всех подключений к данным перед удалением на случай, если потребуется воссоздать одно из них. Подключения к данным, как правило, не сложно настроить, но на всякий случай неплохо иметь бэкап.
Скрипты для управления неиспользуемыми подключениями к данным
Примечание
Настоятельно рекомендуется удалять подключения к данным вручную только после согласования с владельцами этих подключений. См. Раздел «Рекомендуемые действия» выше. В приведенных ниже сценариях показано, как можно выполнить резервное копирование подключений к данным и пометить их программно. Пометка (добавление значения настраиваемого свойства) позволяет администратору временно «изолировать» – поместить в карантин – подключения перед удалением.
Скрипт ДЛЯ РЕЗЕРВНОГО КОПИРОВАНИЯ ВСЕХ ПОДКЛЮЧЕНИЙ к ДАННЫМ
# Script to backup data connections to json # Parameters # Assumes default credentials are used for the Qlik CLI for Windows Connection $computerName = '<machine-name>' # leave empty if windows auth is on default VP $virtualProxyPrefix = '/default' # directory for the output file $outFilePath = 'C:\' # desired filename of the output file $outFileName = 'flagged_unused_connections' ################ ##### Main ##### ################ # set the output file path $outFile = ($outFilePath + $outFileName + '.json') # set the computer name for the Qlik connection call $computerNameFull = ($computerName + $virtualProxyPrefix).ToString() # connect to Qlik Connect-Qlik -ComputerName $computerNameFull -UseDefaultCredentials -TrustAllCerts # GET all data connection's full JSON elements and write them to a file Get-QlikDataConnection -raw -full | ConvertTo-Json | Set-Content $outFile
Скрипт для добавления значения настраиваемого свойства к подключению (загрузка из Excel-таблицы)
Предполагается, что столбец «Data Connection ID» (идентификатор подключения к данным) добавлен в таблицу в «Анализаторе подключений к данным» и экспортирован в Excel. Затем на этот файл ссылаются в приведенном ниже скрипте.
# Script to import data connection ids from excel and add a custom property value to them, # as well as optionally change name and ownership. # If the custom property doesn't exist, it will be created. # Assumes the ImportExcel module: `Install-Module -Name ImportExcel`. # GUID validation code referenced from: # https://pscustomobject.github.io/powershell/functions/PowerShell-Validate-Guid-copy/ # Parameters # Assumes default credentials are used for the Qlik CLI for Windows Connection $computerName = '<machine-name>' # leave empty if windows auth is on default VP $virtualProxyPrefix = '/default' # fully qualified path to excel file with data connection ids $inputXlsxPath = '<fully qualified directory>\<filename>.xlsx' # column number of data connection id column in Excel file $dataConnectionIdColumnNumber = '12' # name of the custom property to put on unused data connections--if it doesn't exist it will be created $customPropertyName = 'QuarantinedDataConnection' # 1 for true and 0 for false -- changes the owner to sa_repository $changeOwner = 1 # 1 for true and 0 for false -- prefixes the name with 'QUARANTINED - ' $changeName = 1 # directory for the output file $outFilePath = 'C:\' # desired filename of the output file $outFileName = 'flagged_unused_connections' ################ ##### Main ##### ################ # set the output file path $outFile = ($outFilePath + $outFileName + '.csv') # set the computer name for the Qlik connection call $computerNameFull = ($computerName + $virtualProxyPrefix).ToString() # if the output file already exists, remove it if (Test-Path $outFile) { Remove-Item $outFile } # function to validate GUIDs function Test-IsGuid { [OutputType([bool])] param ( [Parameter(Mandatory = $true)] [string]$ObjectGuid ) [regex]$guidRegex = '(?im)^[{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?$' return $ObjectGuid -match $guidRegex } # import data connection ids from excel $data = Import-Excel $inputXlsxPath -DataOnly -StartColumn $dataConnectionIdColumnNumber ` -EndColumn $($dataConnectionIdColumnNumber + 1) # validate GUIDs and only use those (handles nulls/choosing wrong column) $dataConnectionIds = $data | foreach { $_.psobject.Properties } | where Value -is string ` | foreach { If(Test-IsGuid -ObjectGuid $_.Value) {$_.Value} } # connect to Qlik Connect-Qlik -ComputerName $computerNameFull -UseDefaultCredentials -TrustAllCerts # GET the sa_repository user $sa_repository = Get-QlikUser -filter "userId eq 'sa_repository' and userDirectory eq 'INTERNAL'" # GET the custom property to use for unused data connections $dataConnectionCustomProperty = Get-QlikCustomProperty -filter "name eq '$customPropertyName'" -raw # GET the id of the custom property $dataConnectionCustomPropertyId = $dataConnectionCustomProperty.id # if the custom property doesn't exist, create it ($customPropertyName) if (!$dataConnectionCustomProperty) { $dataConnectionCustomProperty = New-QlikCustomProperty -name "$customPropertyName" ` -objectType "DataConnection" -choiceValues "true" -raw # GET the id of the custom property $dataConnectionCustomPropertyId = $dataConnectionCustomProperty.id } # for each data connection id foreach ($dataConnection in $dataConnectionIds) { # GET the existing data connection's full JSON $resp = Get-QlikDataConnection -id $dataConnection -raw # store the current name of the data connection $dataConnectionName = $resp.name # get the current custom properties assigned to the data connection, if any $currentCustomProperties = $resp.customProperties # set a flag to check if the custom property already is assigned to the data connection $dataConnectionPropAlreadyThere = $false # for each custom property in the data connection's current custom propertys foreach ($customProperty in $currentCustomProperties) { # if the custom property is already there, set the flag to "true" if ($customProperty.definition.id -eq $dataConnectionCustomPropertyId) { $dataConnectionPropAlreadyThere = $true break } } # if the custom property isn't already there, # create the JSON element for it and add it to the array if (!$dataConnectionPropAlreadyThere) { $newCustomProp = @{ value = "true" definition = @{ id = "$dataConnectionCustomPropertyId" } } $resp.customProperties += $newCustomProp } # change the name of the data connection, set by the $changeName flag if ($changeName) {$resp.name = $('QUARANTINED - ' ` + $resp.name.Replace('QUARANTINED - ',''))} # change the owner of the data connection, set by the $changeOwner flag if ($changeOwner) {$resp.owner = $sa_repository} # convert the response to JSON $resp = $resp | ConvertTo-Json -depth 10 # PUT the new data connection Invoke-QlikPut -path /qrs/dataconnection/$dataConnection -body $resp # logging 'PUT: ' + $dataConnectionName + ',' + $dataConnection Add-Content -Path $outFile -Value $($dataConnectionName + ',' + $dataConnection) }