diff --git a/release-notes/Cloud/DCP_change_log.md b/release-notes/Cloud/DCP_change_log.md index 0f08e69954..343e68e88a 100644 --- a/release-notes/Cloud/DCP_change_log.md +++ b/release-notes/Cloud/DCP_change_log.md @@ -9,10 +9,30 @@ The dataminer.services platform gets updated continuously. This change log can h > [!NOTE] > Many features on dataminer.services are dependent on DxMs. You can find the change logs for these under [DxM release notes](xref:DxM_RNs_index). +#### 17 September 2024 - Enhancement - Admin - Improved message when no usage data is found [ID 40796] + +Improved the message when no usage data is available yet for a given organization. + #### 17 September 2024 - Fix - Remote Access (automatic) login not working with special characters in DataMiner account configuration [ID 40788] If your DataMiner account contained one or more special characters, for example in the full name field, and you used Remote Access to the web apps (e.g. the Monitoring app via dataminer.services), it was not possible to log in or make use of the automatic login with a linked account. This has now been fixed. +#### 17 September 2024 - New feature - Admin - STaaS region registration and configuration tile [ID 40786] + +It is now possible to register your DataMiner system for STaaS through the Admin app. + +#### 17 September 2024 - Fix - Admin - Incorrect notation usage number [ID 40781] + +The notation of the number 400,000 has been changed from 0,4M to 400K. + +#### 17 September 2024 - Enhancement - Catalog - Catalog registration now only possible via API [ID 40772] + +It is now no longer possible to register Catalog items using the Catalog app. Registration should be done using the Catalog API instead. For detailed information, see [Registering a Catalog item](xref:Register_Catalog_Item). + +#### 17 September 2024 - Enhancement - Admin - 'Install latest available upgrades' button removed [ID 40768] + +In the Admin app, the button to install all available DxM updates at once for a node is no longer available. As its functionality could be inconsistent, an improved version of the feature will be introduced in a later UI update for this page. + #### 16 September 2024 - Fix - Catalog - Incorrect description shown for Catalog item [ID 40771] In case a connector Catalog item existed in the Catalog with the same name as another connector Catalog item, and that other item had a description available, it could occur that the description for the other item was shown for the first item. diff --git a/release-notes/Cube/Cube_Feature_Release_10.4/Cube_10.4.11.md b/release-notes/Cube/Cube_Feature_Release_10.4/Cube_10.4.11.md index b4c656b9de..a42c6bd36b 100644 --- a/release-notes/Cube/Cube_Feature_Release_10.4/Cube_10.4.11.md +++ b/release-notes/Cube/Cube_Feature_Release_10.4/Cube_10.4.11.md @@ -22,6 +22,12 @@ uid: Cube_Feature_Release_10.4.11 ### Enhancements +#### Visual Overview: All dynamic text in the KPI stencil will now automatically be truncated [ID 40545] + + + +All dynamic text in the KPI stencil will now automatically be truncated with "..." to prevent it from exceeded the dimensions of a shape. + #### System Center - Logging: Additional log files available in DataMiner tab [ID 40676] @@ -62,3 +68,9 @@ After you had opened a visual overview containing AlarmSummary shapes while bein When, in an embedded Spectrum Analysis component, you used an inline preset with a measurement point linked to a card variable, that measurement point would incorrectly not be loaded. + +#### Cube could leak memory each time you opened the 'Reports' page of a card [ID 40744] + + + +DataMiner Cube could leak memory each time you opened the *Reports* page of a card. diff --git a/release-notes/General/General_Feature_Release_10.4/General_Feature_Release_10.4.11.md b/release-notes/General/General_Feature_Release_10.4/General_Feature_Release_10.4.11.md index b8edae0a48..b4077a752c 100644 --- a/release-notes/General/General_Feature_Release_10.4/General_Feature_Release_10.4.11.md +++ b/release-notes/General/General_Feature_Release_10.4/General_Feature_Release_10.4.11.md @@ -36,6 +36,12 @@ Up to now, on systems that do not allow ping commands to be executed, in some ca From now on, when the virtual IP address check has concluded that the IP address is free after having executed the required number of ping commands, it will double-check by executing an arp command. +#### SLAnalytics - Behavioral anomaly detection: Enhanced variance increase detection [ID 40580] + + + +Because of a number of enhancements, variance increase detection has been improved. + #### Automation: Enhanced locking when calling 'SetParameter' and 'GetParameter' on an element [ID 40682] @@ -58,6 +64,18 @@ The following calls have been improved: - `GetParameterDisplayByPrimaryKey` - `IsMatrixCrosspointConnected` +#### SLAnalytics will now wait longer for a message from SLNet announcing that it has finished loading the configuration [ID 40729] + + + +When starting up, up to now, SLAnalytics would wait up to 400 seconds for a message from SLNet announcing that it has finished loading the configuration. From now on, it will wait up to 20 minutes. + +#### SLAnalytics: Maximum number of parameter changes processed by SLAnalytics will no longer be limited to 5000 per second [ID 40730] + + + +From now on, the maximum number of parameter changes processed by SLAnalytics will no longer be limited to 5000 per second. + ### Fixes #### ReIndexElasticSearchIndexes tool would incorrectly overwrite the existing mapping by the default mappings [ID 40073] diff --git a/release-notes/General/General_Main_Release_10.3/General_Main_Release_10.3.0_CU20.md b/release-notes/General/General_Main_Release_10.3/General_Main_Release_10.3.0_CU20.md index 541c5d539c..eabed2325a 100644 --- a/release-notes/General/General_Main_Release_10.3/General_Main_Release_10.3.0_CU20.md +++ b/release-notes/General/General_Main_Release_10.3/General_Main_Release_10.3.0_CU20.md @@ -42,6 +42,12 @@ The following calls have been improved: - `GetParameterDisplayByPrimaryKey` - `IsMatrixCrosspointConnected` +#### SLAnalytics will now wait longer for a message from SLNet announcing that it has finished loading the configuration [ID 40729] + + + +When starting up, up to now, SLAnalytics would wait up to 400 seconds for a message from SLNet announcing that it has finished loading the configuration. From now on, it will wait up to 20 minutes. + ### Fixes #### ReIndexElasticSearchIndexes tool would incorrectly overwrite the existing mapping by the default mappings [ID 40073] diff --git a/release-notes/General/General_Main_Release_10.4/General_Main_Release_10.4.0_CU8.md b/release-notes/General/General_Main_Release_10.4/General_Main_Release_10.4.0_CU8.md index 597a55c16f..8d72c7b120 100644 --- a/release-notes/General/General_Main_Release_10.4/General_Main_Release_10.4.0_CU8.md +++ b/release-notes/General/General_Main_Release_10.4/General_Main_Release_10.4.0_CU8.md @@ -42,6 +42,18 @@ The following calls have been improved: - `GetParameterDisplayByPrimaryKey` - `IsMatrixCrosspointConnected` +#### SLAnalytics will now wait longer for a message from SLNet announcing that it has finished loading the configuration [ID 40729] + + + +When starting up, up to now, SLAnalytics would wait up to 400 seconds for a message from SLNet announcing that it has finished loading the configuration. From now on, it will wait up to 20 minutes. + +#### SLAnalytics: Maximum number of parameter changes processed by SLAnalytics will no longer be limited to 5000 per second [ID 40730] + + + +From now on, the maximum number of parameter changes processed by SLAnalytics will no longer be limited to 5000 per second. + ### Fixes #### ReIndexElasticSearchIndexes tool would incorrectly overwrite the existing mapping by the default mappings [ID 40073] diff --git a/release-notes/General/General_Main_Release_10.5/General_Main_Release_10.5.0_changes.md b/release-notes/General/General_Main_Release_10.5/General_Main_Release_10.5.0_changes.md index c19a2e5795..9417180f96 100644 --- a/release-notes/General/General_Main_Release_10.5/General_Main_Release_10.5.0_changes.md +++ b/release-notes/General/General_Main_Release_10.5/General_Main_Release_10.5.0_changes.md @@ -703,6 +703,12 @@ From now on, SLSNMPManager will check whether the IP address of the trap matches > [!NOTE] > The IP address of a trap is either the source IP of the trap or the *agentaddress* binding (if the *useAgentBinding* communication option is being used). +#### SLAnalytics - Behavioral anomaly detection: Enhanced variance increase detection [ID 40580] + + + +Because of a number of enhancements, variance increase detection has been improved. + ### Fixes #### Storage as a Service: Resources would not always be released correctly [ID 38058] diff --git a/release-notes/Web_apps/Web_apps_Feature_Release_10.4/Web_apps_Feature_Release_10.4.11.md b/release-notes/Web_apps/Web_apps_Feature_Release_10.4/Web_apps_Feature_Release_10.4.11.md index c4144bbcab..8761c36462 100644 --- a/release-notes/Web_apps/Web_apps_Feature_Release_10.4/Web_apps_Feature_Release_10.4.11.md +++ b/release-notes/Web_apps/Web_apps_Feature_Release_10.4/Web_apps_Feature_Release_10.4.11.md @@ -56,6 +56,26 @@ From now on, the displayed date will still be in local format, but the date that A number of enhancements have been made with regard to the loading of user access data when configuring user access restrictions for dashboards or low-code apps. +#### Dashboards app: Enhanced 'Location' box in 'Create dashboard' and 'Dashboard settings' windows [ID 40692] + + + +In the *Create dashboard* and *Dashboard settings* windows, the *Location* box has been reworked. It will now take up less screen real estate. + +#### Dashboards/Low-Code Apps - Alarm table component: Enhanced performance when loading history alarms [ID 40696] + + + +Because of a number of enhancements, overall performance of the *Alarm table* component has increased when loading history alarms. + +#### Dashboards app: 'Preserve feed selections' option is now an advanced setting [ID 40709] + + + +Up to now, whether you added `showadvancedsettings=true` to the dashboard's URL or not, the *Create folder* window and the *Folder settings* window would always show the *Preserve feed selections* option. + +From now on, the *Preserve feed selections* option will only be visible when you add `showadvancedsettings=true` to the dashboard's URL. + ### Fixes #### Low-Code Apps - Form component: Dropdown fields containing elements, resources or service definitions would show an incorrect warning message [ID 40399] @@ -158,3 +178,27 @@ In some cases, a *Web* component would not render a web page correctly when the When you renamed a dashboard folder immediately after having renamed its parent folder, the folder would be renamed in the system but the UI would incorrectly still show the old name. + +#### Dashboards/Low-Code Apps - Maps component: Problem when refreshing a map [ID 40697] + + + +When a map was refreshed, in some cases, markers at the edges of the map would incorrectly disappear. + +#### Low-Code Apps: New draft would incorrectly be a copy of a draft you discarded earlier [ID 40706] + + + +When you discarded a draft of a published low-code app, and then created a new draft of that same app, the new draft would incorrectly not be a copy of the published low-code app. Instead, it would be a copy of the draft you discarded earlier. + +#### Dashboards/Low-Code Apps - Timeline component: Problem with 'Highlight time range' or 'Set viewport' actions when a default timezone had been set [ID 40722] + + + +When a default timezone had been set in the *C:\\Skyline DataMiner\\Users\\ClientSettings.json* file, in some cases, executing *Highlight time range* actions or *Set viewport* actions would have unexpected results. + +#### Dashboards app: Problem when changing the name of several dashboard folders in rapid succession [ID 40752] + + + +When you changed the name of several dashboard folders in rapid succession, in some cases, the Dashboards app could stop working. diff --git a/tutorials/Dashboards_Low_Code_Apps.md b/tutorials/Dashboards_Low_Code_Apps.md index cadc00a068..881e2110c4 100644 --- a/tutorials/Dashboards_Low_Code_Apps.md +++ b/tutorials/Dashboards_Low_Code_Apps.md @@ -50,7 +50,6 @@ keywords: low-code, low code, lowcode | [Creating a duration operator](xref:Creating_Duration_Operator) | Create a custom operator that calculates the duration based on two datetime values. | | [Optimizing your custom operator](xref:Custom_Operator_Tutorial) | Optimize your custom operator while keeping an eye out for common pitfalls. | | [Providing a custom sort order](xref:GQI_Redirect_Sort_Tutorial) | Implement a custom GQI column sort order using a custom operator. | -| [Forwarding dummy data to the GQI](xref:Ad_hoc_Tutorials) | Go through an example script that forwards dummy data to the GQI. | | [Building a GQI data source that fetches satellites](xref:Ad_hoc_Tutorials_Satellites) | Go through an example script that forwards satellites data to the GQI. | | [Creating a parameter table connected to an element feed](xref:Creating_a_parameter_table_connected_to_an_element_feed) | Create a parameter table connected to an element feed. | | [Building a GQI data source that retrieves data from a DMS](xref:Ad_hoc_Tutorials_GQIDMS) | Create an ad hoc data source to retrieve data from your DMS. | diff --git a/user-guide/Advanced_Functionality/DataMiner_Agents/Upgrading_a_DMA/Preparing_to_upgrade_a_DataMiner_Agent.md b/user-guide/Advanced_Functionality/DataMiner_Agents/Upgrading_a_DMA/Preparing_to_upgrade_a_DataMiner_Agent.md index 5fac95cbdb..3d4a4834db 100644 --- a/user-guide/Advanced_Functionality/DataMiner_Agents/Upgrading_a_DMA/Preparing_to_upgrade_a_DataMiner_Agent.md +++ b/user-guide/Advanced_Functionality/DataMiner_Agents/Upgrading_a_DMA/Preparing_to_upgrade_a_DataMiner_Agent.md @@ -39,7 +39,7 @@ To upload an upgrade package: > When you upload a package, several [prerequisite checks](#prerequisite-checks) will be executed, so that you will immediately get informed if certain conditions or requirements for the update are not met yet. > [!TIP] -> To be safe, upload the package at least a week before executing the upgrade. +> We recommend that you upload the package a few days before you execute the upgrade. This will allow you extra time to perform corrective actions in case any of the prerequisite checks fail. ### Have a backup at the ready diff --git a/user-guide/Advanced_Functionality/Databases/STaaS/STaaS.md b/user-guide/Advanced_Functionality/Databases/STaaS/STaaS.md index 69daeea3c1..10f6f65b7a 100644 --- a/user-guide/Advanced_Functionality/Databases/STaaS/STaaS.md +++ b/user-guide/Advanced_Functionality/Databases/STaaS/STaaS.md @@ -52,10 +52,20 @@ For a self-hosted DataMiner System, follow the steps below to set up STaaS. 1. Make sure you have at least **DataMiner CloudGateway 2.8.0** installed on the system. See [Upgrading nodes to the latest DxM versions](xref:Managing_cloud-connected_nodes#upgrading-nodes-to-the-latest-dxm-versions). -1. Contact your Skyline representative or to register your system to use STaaS. +1. Register your system to use STaaS: - > [!NOTE] - > If you have a specific preference with respect to the [data location and redundancy setup](#data-location-and-redundancy), let us know when you register your system. + 1. Go to the [Admin app](https://admin.dataminer.services). + + 1. In the sidebar on the left, go to *Organization* > *Overview*. + + 1. In the *DataMiner Systems* section, click the system you want to register. + + 1. At the top of the page, in the *Storage as a Service* box, click the button *Get Started with STaaS*. + + 1. Fill in your preferred region and click *Initialize*. + + > [!IMPORTANT] + > Only owners of a DataMiner System can register their system. 1. Wait until you receive confirmation that the **registration is completed**. diff --git a/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Ad_hoc_data/Ad_hoc_Tutorials.md b/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Ad_hoc_data/Forwarding_dummy_data_to_GQI.md similarity index 99% rename from user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Ad_hoc_data/Ad_hoc_Tutorials.md rename to user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Ad_hoc_data/Forwarding_dummy_data_to_GQI.md index 80607a27cf..ed0c9cb490 100644 --- a/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Ad_hoc_data/Ad_hoc_Tutorials.md +++ b/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Ad_hoc_data/Forwarding_dummy_data_to_GQI.md @@ -1,5 +1,5 @@ --- -uid: Ad_hoc_Tutorials +uid: Forwarding_dummy_data_to_GQI --- # Forwarding dummy data to the GQI diff --git a/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Ad_hoc_data/Scaling_Ad_hoc_Data_Source.md b/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Ad_hoc_data/Scaling_Ad_hoc_Data_Source.md new file mode 100644 index 0000000000..4f994e1058 --- /dev/null +++ b/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Ad_hoc_data/Scaling_Ad_hoc_Data_Source.md @@ -0,0 +1,233 @@ +--- +uid: Scaling_Ad_hoc_Data_Source +--- + +# Scaling an ad hoc data source + +Each time a query is executed, a new instance of the data source is created. This makes scalability crucial, especially when building the underlying data source is time-consuming or resource-intensive. Keep in mind that the code you are writing could be executed concurrently by many users. + +To optimize performance when real-time data is not required, implement caching where appropriate, using a static cache. When querying data through the DMS interface, ensure that data is stored on a security group basis. + +Be aware that multithreading affects both the static cache object and the cache itself. Use consistent locking mechanisms during heavy operations to prevent multiple costly computations from running simultaneously. + +If needed, consider adding a circuit breaker to the ad hoc data source to reset the cache when necessary. + +> [!NOTE] +> The code example below is incomplete. You will need to design the cache object to fit your specific requirements. + +```csharp +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Skyline.DataMiner.Analytics.GenericInterface; +using Skyline.DataMiner.Net.Messages; + +[GQIMetaData(Name = "Results")] +public class Results : IGQIDataSource, IGQIOnInit +{ + private static readonly GQIStringColumn _nameColumn = new GQIStringColumn("Name"); + private static readonly GQIStringColumn _kpiColumn = new GQIStringColumn("KPI"); + + private static readonly ConcurrentDictionary _groupToCache = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + private static readonly string _cacheBreakerPath = @"C:\Skyline DataMiner\Documents\Ad hoc cache\resultsCacheBreaker.txt"; + + private GQIDMS _dms; + private IGQILogger _logger; + + public OnInitOutputArgs OnInit(OnInitInputArgs args) + { + _dms = args.DMS; + _logger = args.Logger; + return default; + } + + public GQIColumn[] GetColumns() + { + return new GQIColumn[] + { + _nameColumn, + _kpiColumn, + }; + } + + public GQIPage GetNextPage(GetNextPageInputArgs args) + { + var results = GetResults(); + var rows = results.Select(v => + { + var cells = new GQICell[] + { + new GQICell() { Value = v.Identifier }, + new GQICell() { Value = v.Name }, + }; + return new GQIRow(v.Identifier, cells); + }).ToArray(); + + return new GQIPage(rows) { HasNextPage = false }; + } + + public IEnumerable GetResults() + { + var cache = GetCache(); + cache.EnsureInitialized(_dms, _logger); + cache.EnsureUpdated(_dms, _logger); + + return cache.Results; + } + + private Cache GetCache() + { + CheckCacheValidation(); + + var securityGroupKey = GetSecurityGroupKey(_dms, _logger); + if (!_groupToCache.TryGetValue(securityGroupKey, out var siteCache)) + { + lock (_groupToCache) + { + if (!_groupToCache.TryGetValue(securityGroupKey, out siteCache)) + { + siteCache = new Cache(securityGroupKey); + _groupToCache[securityGroupKey] = siteCache; + } + } + } + + return siteCache; + } + + private void CheckCacheValidation() + { + if (!File.Exists(_cacheBreakerPath)) + return; + + lock (_groupToCache) + { + try + { + _logger.Information("Going to remove cache."); + + if (!File.Exists(_cacheBreakerPath)) + return; + + _groupToCache.Clear(); + + File.Delete(_cacheBreakerPath); + + _logger.Information("Remove cache."); + } + catch (Exception ex) + { + _logger.Error(ex, "Could not delete cache."); + } + } + } + + private string GetSecurityGroupKey(GQIDMS dms, IGQILogger logger) + { + if (dms == null) + throw new ArgumentNullException(nameof(dms)); + if (logger == null) + throw new ArgumentNullException(nameof(logger)); + + var responses = dms.SendMessages(new DMSMessage[] { new GetUserFullNameMessage(), new GetInfoMessage(InfoType.SecurityInfo) }); + var userName = responses?.OfType().FirstOrDefault()?.User; + if (string.IsNullOrEmpty(userName)) + { + logger.Error("User not found."); + return null; + } + + var securityResponse = responses?.OfType().FirstOrDefault(); + var userGroups = securityResponse?.Users?.Where(u => u.Name == userName).FirstOrDefault()?.Groups?.OrderBy(x => x)?.ToArray() ?? new int[0]; + if (userGroups.Length == 0) + { + logger.Error("User is not part of any group."); + return null; + } + + return string.Join(";", userGroups); + } +} +``` + +```csharp +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using Skyline.DataMiner.Analytics.GenericInterface; + +public class Cache +{ + private const int TIMEOUT_SECONDS = 30; + private readonly string _securityKey; + private readonly object _lock = new object(); + private readonly ConcurrentDictionary _results = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + private bool _isInitialized; + + public Cache(string securityKey) + { + if (string.IsNullOrWhiteSpace(securityKey)) + throw new ArgumentException("SecurityKey can't be empty."); + + _securityKey = securityKey; + } + + public DateTime LastUpdate { get; private set; } + + public IEnumerable Results => _results.Values; + + internal void EnsureInitialized(GQIDMS dms, IGQILogger logger) + { + if (_isInitialized) + return; + + lock (_lock) + { + if (_isInitialized) + return; + + Initialize(dms, logger); + } + } + + internal void EnsureUpdated(GQIDMS dms, IGQILogger logger) + { + if (!_isInitialized) + return; + + if (LastUpdate > DateTime.UtcNow - TimeSpan.FromSeconds(TIMEOUT_SECONDS)) + return; + + lock (_lock) + { + if (LastUpdate > DateTime.UtcNow - TimeSpan.FromSeconds(TIMEOUT_SECONDS)) + return; + + UpdateData(dms, logger); + } + } + + private void UpdateData(GQIDMS dms, IGQILogger logger) + { + logger.Information($"{_securityKey} - Fetching update."); + + /* Fetch update */ + + logger.Information($"{_securityKey} - Fetching update done."); + LastUpdate = DateTime.UtcNow; + } + + private void Initialize(GQIDMS dms, IGQILogger logger) + { + logger.Information($"{_securityKey} - Initializing."); + + /* Initialize */ + + logger.Information($"{_securityKey} - Initializing done."); + + _isInitialized = true; + } +} +``` diff --git a/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Configuring_an_ad_hoc_data_source_in_a_query.md b/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Configuring_an_ad_hoc_data_source_in_a_query.md index 03d3793a23..f8a3e12bf9 100644 --- a/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Configuring_an_ad_hoc_data_source_in_a_query.md +++ b/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/Configuring_an_ad_hoc_data_source_in_a_query.md @@ -24,7 +24,7 @@ To use an ad hoc data source in a query: 1. Above the class, add the *GQIMetaData* attribute in order to configure the name of the data source as displayed in the Dashboards app. - For example (see [Example ad hoc data script](xref:Ad_hoc_Tutorials) for a full example): + For example (see [Example ad hoc data script](xref:Forwarding_dummy_data_to_GQI) for a full example): ```csharp using Skyline.DataMiner.Analytics.GenericInterface; diff --git a/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/GQI_Extensions_Best_Practices.md b/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/GQI_Extensions_Best_Practices.md index f68ee3a9de..616068b2b1 100644 --- a/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/GQI_Extensions_Best_Practices.md +++ b/user-guide/Advanced_Modules/Dashboards_and_Low_Code_Apps/GQI/Extensions/GQI_Extensions_Best_Practices.md @@ -9,6 +9,7 @@ When developing a GQI extension, keep the following in mind: - [Use DIS to create and publish extensions](#use-dis-to-create-and-publish-extensions) - [Do not use Skyline.DataMiner.Automation](#do-not-use-skylinedataminerautomation) - [Only use 64-bit assembly references](#only-use-64-bit-assembly-references) +- [Make your ad hoc data source scalable](#make-your-ad-hoc-data-source-scalable) ## Use DIS to create and publish extensions @@ -42,3 +43,10 @@ Types and methods in this namespace have no use in a GQI extension and, more imp ## Only use 64-bit assembly references GQI runs in a 64-bit process and cannot load any extensions that require 32-bit assemblies. You should therefore only use 64-bit assembly references. + +## Make your ad hoc data source scalable + +Each time a query is executed, a new instance of the data source is created. This makes scalability crucial, especially when building the underlying data source is time-consuming or resource-intensive. Keep in mind that the code you are writing could be executed concurrently by many users. + +> [!TIP] +> For an example of how to build a highly scalable data source capable of serving many concurrent users, see [Scaling an ad hoc data source](xref:Scaling_Ad_hoc_Data_Source). diff --git a/user-guide/Advanced_Modules/toc.yml b/user-guide/Advanced_Modules/toc.yml index 48172c3d2b..860396dc47 100644 --- a/user-guide/Advanced_Modules/toc.yml +++ b/user-guide/Advanced_Modules/toc.yml @@ -577,10 +577,14 @@ items: topicUid: Ad_hoc_Life_cycle - name: Linking rows to DataMiner objects topicUid: Ad_hoc_Metadata - - name: Tutorials + - name: Examples items: - name: Forwarding dummy data to the GQI - topicUid: Ad_hoc_Tutorials + topicUid: Forwarding_dummy_data_to_GQI + - name: Scaling an ad hoc data source + topicUid: Scaling_Ad_hoc_Data_Source + - name: Tutorials + items: - name: Building a GQI data source that fetches satellites topicUid: Ad_hoc_Tutorials_Satellites - name: Building a GQI data source that retrieves data from a DMS diff --git a/user-guide/Basic_Functionality/Visio/linking_shapes/Linking_a_shape_to_an_Automation_script.md b/user-guide/Basic_Functionality/Visio/linking_shapes/Linking_a_shape_to_an_Automation_script.md index 209ab8a19b..1e056672a9 100644 --- a/user-guide/Basic_Functionality/Visio/linking_shapes/Linking_a_shape_to_an_Automation_script.md +++ b/user-guide/Basic_Functionality/Visio/linking_shapes/Linking_a_shape_to_an_Automation_script.md @@ -8,7 +8,7 @@ When a shape is linked to an Automation script, by default this script will be e > [!NOTE] > -> - For an example, see [Ziine](xref:ZiineDemoSystem) > *Operations* > *Other* > *Visual Overview Design Examples* view > *[linking > EXE]* page. +> - For an example, see [Ziine](xref:ZiineDemoSystem) > *Solutions* > *Other* > *Visual Overview Design Examples* view > *[linking > EXE]* page. > - Aside from the default **Execute** shape data, you can also use **OnClose** shape data to link to a script. See [Specifying a script to be executed when the page is closed](#specifying-a-script-to-be-executed-when-the-page-is-closed). To link a shape to an Automation script: diff --git a/user-guide/Cloud_Platform/Catalog/About_the_Catalog_module.md b/user-guide/Cloud_Platform/Catalog/About_the_Catalog_module.md index ef76cc17bf..579665596c 100644 --- a/user-guide/Cloud_Platform/Catalog/About_the_Catalog_module.md +++ b/user-guide/Cloud_Platform/Catalog/About_the_Catalog_module.md @@ -10,12 +10,16 @@ As part of dataminer.services, the Catalog module allows Skyline customers and D ## Accessing the Catalog module -1. Go to , and [sign in](xref:Logging_on_to_the_DataMiner_Cloud_Platform). +There are several ways to access the Catalog module: -1. On the dataminer.services landing page, click *Catalog*. +- Go directly to . -> [!TIP] -> From DataMiner 10.2.9/10.3.0 onwards, you can navigate directly to the catalog from DataMiner Cube by selecting *Catalog* in the *Apps* pane. +- Go to , [sign in](xref:Logging_on_to_the_DataMiner_Cloud_Platform), and click *Catalog* on the landing page. + +- In DataMiner Cube, go to *Apps* > *Catalog* (from DataMiner 10.2.9/10.3.0 onwards). + +> [!NOTE] +> While you do not have to sign in to view Catalog items, not all functionality will be available if you are not signed in. To sign in, click the button in the top-right corner of the Catalog UI. ## About Catalog items