Category: Sitecore

High memory utilization fix for xConnect server

We were seeing High memory utilization on the xConnect server and it coincides with when our monitoring service reports the site being down. Logs were particularly showing these two errors related to the xConnect –

Error #1:

System.OperationCanceledException: The operation was canceled.
at System.Threading.CancellationToken.ThrowOperationCanceledException()
at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.AuthenticationFilterResult.<ExecuteAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()

Error #2:

Sitecore.XConnect.Operations.SetFacetOperation`1[Sitecore.XConnect.Facet]: Sitecore.XConnect.Operations.FacetOperationException: Operation #0, AlreadyExists, Contact {32971b60-1245-0000-0000-0611bab4b38e}, Classification
[Error] ["XdbContextLoggingPlugin"] XdbContext Batch Execution Exception
Sitecore.XConnect.Operations.FacetOperationException: Operation #0, AlreadyExists, Contact {32971b60-1245-0000-0000-0611bab4b38e}, Classification
 [Error] XConnect Exception Filter OnException(), url - "https://prod9-xconnect.everence.com/odata/Contacts?%24filter=Identifiers%2fany(id:id%2fIdentifier+eq+'a5642a9a87ad41e1ab65a624b7d1b1f6'+and+id%2fSource+eq+'xDB.Tracker')&%24expand=Identifiers,MergeInfo,ConsentInformation,Classification,EngagementMeasures,ContactBehaviorProfile,Personal,KeyBehaviorCache,ListSubscriptions,AutomationPlanEnrollmentCache,AutomationPlanExit,TestCombinations"
System.OperationCanceledException: The operation was canceled.
at System.Threading.CancellationToken.ThrowOperationCanceledException()
at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.AuthenticationFilterResult.<ExecuteAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()

Investigation:

Created a dump using the Procdump tool. Here is the command I used for creating 18GB of the dump file 

procdump -m 18000 -ma [Name or PID]     

From reviewing the memory dump, we could see two SQL queries that have consumed 8GB and 6GB of memory in your XConnect instance. 

Both queries were running the [xdb_collection].[GetInteractionsByContactIds] stored procedure. This stored procedure retrieves interaction data for a contact.

The queries are attempting to retrieve the interactions for a specific Contact ID. After reviewing some of the retrieved interactions from this contact, we could see the User-Agent for this contact was

Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34

The above agent is Pingdom (It is a website monitoring and availability service) to have many interactions stored in XConnect. Although it’s a bot, it was considered a valid user and the interactions were being tracked.

Resolution:

In order to mitigate the interactions from Pingdom, we added the User-Agent of Pingdom to the <excludedUserAgents> configuration (Sitecore.Analytics.ExcludeRobots.config) so that future visits from Pingdom are treated as a bot and not saved to XConnect.

For more details, please see this article here: https://doc.sitecore.com/developers/90/sitecore-experience-platform/en/configure-robot-detection-functionality.html#idp23361

Thank you Sitecore Support for helping us figure out the issue.

Happy Sitecoring!

0

Bulk update fields using SPE

I came across a scenario, where I need to update the email field for all custom forms built with ‘EmailTemplate’. Since it’s going to be a bulk update, decided to do it in SPE(so powerful!)

Here is the script I wrote –

$path = "master:/sitecore/content/external_forms"
$templateName = "EmailTemplate"
$emailAddresses = "test@test.com"
$fieldName = "ToEmail"
$items = Get-ChildItem Path $path Recurse | Where-Object { $_.TemplateName -eq $templateName }
foreach($item in $items) {
if($item.Fields[$fieldName] -ne 'null'){
$item.Editing.BeginEdit()
$item.Fields[$fieldName].Value = $emailAddresses
$item.Editing.EndEdit()
Write-Host ($item.Name + ": " + $item.Fields[$fieldName].Value)
}
}

Hope this helps someone. Any questions, please leave a comment.

Happy Sitecoring!

0

My 2020 Reflections

2020 has been a rough ride, Covid-19 has changed our lives. Hope we all get vaccinated in the upcoming year. Stay home, stay safe.

Here are my contributions for the year –

Presentations:

  • Feb 11 – Sitecore 9.3 new features and live installation – SUG Pittsburgh
  • March 26 – Smart Experience Forms – SUG Pittsburgh
  • April 12 – Sitecore 9.3 new features and live installation – SUG Jordon
  • July 15 – What’s new in Sitecore 9.3 and Live Installation – SUG QueenCity

Blog Posts:

Podcast:

YouTube:

Conferences I attended:

  • Sitecore Symposium
  • All SUG Boston/ Pittsburgh/Queen City meetups.

Co-organized SUG-Pittsburgh Meetups :

Co-organized SUG-QueenCity Meetups :

Participation:

  • Sitecore Lunch
  • Hackathon

Plans for 2021 :

Learn and contribute:

  • Content Hub
  • Cortex
  • Sitecore AI Personalization
  • Sitecore Experience Forms
  • Docker Containers
  • Sitecore 10

Co-organize :

  • Monthly SUG-Pittsburgh meetup
  • Monthly SUG-QueenCity meetup

Presentations:

  • SUG Meetups
  • Sitecore SUGCON EU/Symposium

Happy Sitecoring!

0

Sitecore 10 SIF Installation Roadblocks

Sitecore_10_Installation_Roadblocks

Sitecore 10 was out a couple of months back. I installed it using SIF, hit a couple of roadblocks while installing and sharing the resolutions that helped resolve the issues.

If you haven’t installed Sitecore 10, here are some blogs that help you install.

Sitecore 10 using SIF: https://scorewow.wordpress.com/2020/08/05/install-sitecore-10-in-10-using-sif/

Sitecore 10 using SIA: https://madhuanbalagan.com/installing-sitecore-10-using-sia

 

Error # 1: Solr Port Issue

I have multiple Solr services running for different versions of Sitecore and here is the error I got while installing Sitecore 10.

“Port 8984 is already being used by another process. Please choose a different port”.

Run services.msc to check how many Solr’s are running on the machine.

Resolution:

If you have multiple instances of Solr running and you don’t know what port, it’s associated with. Here is a quick way to get the process name and kill if it’s is no longer needed.

Find which process using Solr port

 

Get-Process -Id (Get-NetTCPConnection -LocalPort $portNumber).OwningProcess

Sitecore_10_Installation_Find-_Which_Process_Using_Solr_Port

Also when installing the Solr, you can add the Port Name and Sitecore Version number or any information in the Description of Details tab.

This is life saver, do not need to worry about which Solr maps which port in the future!

 

Sitecore_10_Installation_NSSM_Service

 

Sitecore_10_Installation_Service_List

 

Error # 2: SQL User Issue

“msdeploy.exe : Error: .Net SqlClient Data Provider: Msg 12809, Level 16, State 1, Line 5 You must remove all users with password before setting the containment property to NONE.                                                            At C:\ProgramFiles\WindowsPowerShell\Modules\SitecoreInstallFramework\2.2.0\Public\Tasks\Invoke-CommandTask.ps1:31 char:13”  

                                                    

Resolution:

For some reason, the SC10 uninstall did not remove all the variables for failed instances. I removed the  ‘sc10_CollectionUser’ in local DB users, fixed the issue.

 

Sitecore_10_Installation_SQL_User_Issue_Resolution

 

 

Error # 3: Credential Issue

Sitecore_10_Installation_Error_Credential_Issue

“Install-SitecoreConfiguration: A parameter cannot be found that matches parameter name ‘Credential’. This error might have been caused by applying the default parameter binding. You can disable the default parameter binding in

$PSDefaultParameterValues by setting $PSDefaultParameterValues[“Disabled”] to be $true, and then trying again. The following default parameters were successfully bound for this cmdlet when the error occurred: -Debug -WarningAction

-Verbose -InformationAction -ErrorAction

At C:\ResourceFiles\XP0-SingleDeveloper.ps1:77 char:1

+ Install-SitecoreConfiguration @singleDeveloperParams *>&1 | Tee-Objec …

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException

+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Install-SitecoreConfiguration”

 

Resolution:

The SqlServer module wasn’t installed by default, so I had to do it manually.

Ran this on Powershell command fixed the issue.

Install-Module -Name SqlServer -AllowClobber

 

Hope this helps someone. Any issues, let me know in the comments section.

Happy Sitecoring!

0

Sitecore Horizon 10 Installation

I want to share my experience with the Installation of Sitecore Horizon 10. 

Prerequisites

Before you install Sitecore Horizon, you must:

After you install the tools, restart your machine.

SameSite cookies and custom domains:

The commonly-used browsers such as Chrome and Safari are changing how the browsers interpret the SameSite cookie. After the change takes effect, Horizon will only work if the Sitecore Horizon host instance, the Sitecore identity instance, and the Sitecore CM instance belong to the same site. 

Sitecore CM: https://cm.mycompany.com
Sitecore identity: https://si.mycompany.com
Horizon: https://horizon.mycompany.com

Installation

  • Download Horizon 10 from here. I downloaded the on-premises deployment.  

  • Extract the zip file and open InstallHorizon.ps1

  • Fill out the below parameters –

  • Run the InstallHorizon.ps1 in Adminstrator mode.



  • Once the installation is done (only takes 2 to 3 minutes), you will see a new Icon in Sitecore XP.



  • Clicking the Icon opens Horizon (yes, it’s separate IIS site) in a new tab and you can explore the new features!

Post Installation

To use the alignment and indentation features in the rich text editor in Horizon, make sure to add the below styles to your default style sheet (like default.css in your project).

.rte-indent-1 {
     padding-left: 40px;
}
 .rte-indent-2 {
     padding-left: 80px;
}
 .rte-indent-3 {
     padding-left: 120px;
}
 .rte-indent-4 {
     padding-left: 160px;
}
 .rte-indent-5 {
     padding-left: 200px;
}
 .rte-indent-6 {
     padding-left: 240px;
}
 .rte-indent-7 {
     padding-left: 280px;
}
 .rte-indent-8 {
     padding-left: 320px;
}
 .rte-align-center {
     text-align: center;
}
 .rte-align-justify {
     text-align: justify;
}
 .rte-align-right {
     text-align: right;
}

Hope this helps someone. Any issues, let me know in the comments section.

Happy Sitecoring!

0

Installing Sitecore 10 using SIA(Sitecore Install Assistant)

Sitecore 10 is out! I tried installing it using SIA(Sitecore Install Assistant) along with SXA and it installed smoothly without any errors!

Prerequisites: 

No need to install any prerequisites(includes Solr, SIF) manually, SIA will take care of it.

Preparation:

  • Download installation package (Graphical setup package XP Single) from here.

Installation:

  • Extract the file zip file downloaded and click on Setup.exe
  • Install the prerequisites to make sure the required SIF and Windows Server prerequisites are up to date.
  • Install Solr 8.4.0 by filling Port, Windows service path prefix and Install path and Install.

Note: Make sure the port number is different from earlier versions of Solr installed. 

  • Fill out site prefix, admin password (going with b, so easy to remember) and Confirm password (new to Sitecore 10), and license file path.
  • Fill out SQL server instance name, admin username and password.
  • Double-check the Solr URL (browse to make sure it’s running successfully), System root and Windows service name
  • Select optional module SXA if you need. I’m going for it, time to explore SXA! Would be nice if Horizon is listed here.
  • Review the summary to make sure the settings are correct.
  • SIA validates to make sure the files look good.
  • Install. This takes around 10 minutes (you can get a coffee!). If it errors out, check out the log.

Yayy!! It’s installed. Is it easy to install with SIA? It’s indeed a great tool!  

Check out the release notes for what’s new in Sitecore 10 here

Happy Sitecoring!

0

Sitecore Horizon 9.3 Install, Troubleshooting, and Uninstall

I want to share my experience on the Installation of Sitecore Horizon 9.3, Uninstallation, and the errors I faced during installation.

Prerequisites

  • Install Sitecore 9.3 
  • Ensure CMS site is accessible with https protocol
  • Ensure WebSocket Protocol enabled

After installing the tools, restart your machine.

Installation

  • Download Horizon 9.3 from here. I downloaded the on-premises deployment.
  • Extract the zip file and open Parameters.ps1
  • Fill out the below parameters –
  • Run install.ps1 in Powershell Administrator mode
  •   Once the installation is done (only takes 2 to 3 minutes), you will see a new Icon in Sitecore 
  •   Clicking the Icon opens Horizon (yes, it’s separate IIS site) and you can explore the new features!

Troubleshooting Error

I faced this error after the installation was successful. When I opened Horizon, here is the error message I got.

Failed to render a page: Failed to render the root extension, with error: Failed to render a fragment. Status code: InternalServerError, message:

I checked the logs (C:\inetpub\wwwroot\[Hoirzon Website\logs) and it showed below message

[1] Ensure that Node.js is installed and can be found in one of the PATH directories. Make sure the Node executable is in one of those directories, or update your PATH.

I verified that the Node.js path (C:\Users\manbalagan\AppData\Roaming\nvm\v10.16.0\) was accessible and PATH was correct.

Also, I uninstalled Node v10.16.0 and reinstalled. Restarted my machine. Nothing helped.

Finally, I resolved the issue by adding ‘Everyone‘ permission and allowed full control to NVM folder (C:\Users\manbalagan\AppData\Roaming\nvm) fixed the issue! IIS couldn’t access the folder without ‘Everyone’ permission.

Uninstall

If you want to uninstall the failed versions (to clean up IIS sites it created), here is how you can do it –

  • Uninstalling is straight forward – just need to run the uninstall.ps1 script 
  • After uninstalling, it didn’t remove the Horizon Icon in Desktop mode. Clicking on the icon goes to 404 page.  It would be clean if the icon is also removed.

Hope this helps someone. Any issues, let me know in comments section.

Happy Sitecoring!

0

5 Essential Sitecore Chrome Extensions

Browser Extensions are handy and easy to use without leaving the tab. Here are the top 5 Sitecore Chrome Extensions I use daily and it saves ton to time! 

Sitecore Author Tool Box

Author: Ugo Quaisse

This extension is a lifesaver and must have! Here is the set of handy tools into Content Editor. Favourites Bar, Desktop notifications, and Dark mode are my favorites.

Download link

 

Sitecore Extensions

Author: Alan Płócieniak

This tool is super helpful, has great features. You can just Ctrl+ Space to search for commands. 

Download here

Also when in the Web database, it shows the red bar on the top to make sure you are not editing in Web DB!

The latest version 3.3 is released, check out the new features here

 

Sitecore Icon Search

Author: Gabriel Streza

This is my favorite extension. You can search and add Sitecore icons without ever leaving the tab.

Download here

Once you choose the icon, it automatically sets the Icon field on the template, and the icon’s relative path is still be copied into the clipboard! 

 

Sitecore Developer Tool

Author: Vlad Shpak

This tool allows navigating to admin pages like cache, serialization, show config (I use this most of the time), etc.  Also, you can switch between databases or set a new database on the options page. 

Download here

Additional tip: If you want the pages to open in a new tab, you can set it in option page and also add any admin pages you want like below

 

Sitecore Analytics Testing Tools

Author: Derek Hunziker

This is a fantastic tool for testing GeoIP and Analytics.

You can clear analytics-related cookies and specify a forwarded IP address for GeoIP lookups.

Download here

 

Pro-Tip:

You can use the same extensions in Microsoft Edge by copy and pasting the same Chrome link in the Edge browser.

Select Allow extensions from other stores in the banner at the top of the page and confirm the popup.

Select the Add to Chrome button and the extension is now added to Edge.

Learn more from here.

 

Hope this helps. Any questions, leave a comment below.

Happy Sitecoring! 

0

Generic method to read values from any type of Form fields

Are you looking for a generic method to read the values from any type of Sitecore Form fields? Here is the solution.

         private static Dictionary<Guid, string> FormFieldsToDictionary(IList<IViewModel> fields)
		{
			Dictionary<Guid, string> fielDictionary = new Dictionary<Guid, string>();
			foreach (var field in fields)
			{
				fielDictionary.Add(Guid.Parse(field.ItemId), field.GetType().GetProperty("Value")?.GetValue(field, null)?.ToString() ?? string.Empty);
			}
			return fielDictionary;
		}
	private static string GetValue(IViewModel field)
		{
			if (field == null)
			{ return default(string); }


			if ((field as StringInputViewModel) != null)
			{
				return (string)(object)(field as StringInputViewModel).Value;
			}

			if (field is ListViewModel)
			{
				var listField = (ListViewModel)field;
				var array = listField?.Value?.ToArray();
				if (array == null)
				{
					return string.Empty;
				}
				return String.Join(",", array);
			}

			if (field is DateViewModel)
			{
				var dateField = (DateViewModel)field;
				return dateField.Value.HasValue ? dateField.Value.Value.ToShortDateString() : string.Empty;
			}

			if (field is NumberViewModel)
			{
				var numberField = (NumberViewModel)field;
				return numberField.Value.HasValue ? numberField.Value.ToString() : string.Empty;
			}

			if (field is TextViewModel)
			{
				var textField = (TextViewModel)field;
				return (string)(object)textField.Text;
			}

			if (field is CheckBoxViewModel)
			{
				var checkbox = (CheckBoxListViewModel)field;
				return (string)(object)checkbox.Value;
			}


			return default(string);
		}

Utilization:

protected override bool Execute(UpdateContactData data, FormSubmitContext formSubmitContext)
		{
			var fieldsDictionary = FormFieldsToDictionary(formSubmitContext.Fields);

           // From here you can create a model from fieldsDictionary, call any API and return call status

       }

Hope this helps someone. Any questions, leave a comment.

Happy Sitecoring!

0

What’s new in Sitecore Forms 9.3

You can now publish the forms within Forms Designer. No need to navigate to Content Editor to publish. This is pretty handy when developing forms.

Users can now delete submitted data for a particular form and specify a date range.​​

You can now use the Sitecore bot detection functionality to verify whether visitor is human. This removed the need for a Captcha element. Nice work Sitecore!

Now the forms element that allows you to add email confirmation to a form.​​

Users can now use the Redirect submit action to redirect to a URL and pass parameters to it.

To add file upload functionality to your forms, you can now use the File upload forms element. I use to utilize the Forms Extensions module(It’s very nice), it’s now included in forms element. 

 

Apart from these, there are bunch of enhancements made  – 
  • Improved database performance by increasing our ability to prevent deadlocks.​
  • You can now use the client-side API to retrieve form fields, for example when you build a custom submit action that needs to show all the form fields.
  • You no longer need to rebuild the master index after you install Sitecore XP.

 

Hope this helps. Any questions, leave a comment below.

Happy Sitecoring!

0