Удаление неиспользуемых подключений к данным
Преимущества:
- Сокращение времени вычисления правил безопасности для подключений к данным (повышение производительности)
- Сокращение объема работы по обслуживания системы
- Повышение концентрации внимания
- Устранение избыточности
Цель
Регулярное удаление неиспользуемых подключений к данным уменьшает беспорядок, повышает производительность и улучшает взаимодействие с пользователем. Цель этого раздела – оставить только те подключения к данным, которые необходимы для анализа.
Использование подключений к данным
Подключения к данным не так просто сопоставить со связанными ресурсами (приложениями, задачами и т.п.), поскольку они не сопоставляются напрямую в 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)
}






