It is always good to know the contents that are being published especially if there are multiple automated jobs that publish items. It is also helpful to track the publish done by various content authors and it helps to quickly revert changes in case of an accidental publishing.

Currently, Sitecore does not provide out of the box feature to track publishing but there are various ways to track them using Sitecore’s pipeline.In this article, we shall discuss on how to track Sitecore publishing using Azure telemetry and creating Publishing reports. It is really useful if the Sitecore sites are hosted in Azure.
Azure Application Insights
Azure application insights is a feature in Azure to monitor your application. It is used to collect, store and analyze telemetry data from your Azure or On-premise application.

Normally, Azure application insights is created automatically in Azure when Sitecore’s ARM templates are used.

The Azure Application insights instrument key is required for the application to post data and it is actually stored in App_Config/ConnectionStrings.config

Tracking Publish using Azure Telemetry Client
Configure Microsoft.ApplicationInsights Nuget package in your project to utilize TelemetryClient. The Telemetry client api helps to track Views, Request, Exception, Metric, Events, Trace, Dependency etc.
In below code, you can notice that Publish end event pipleline in Sitecore is used to gather information regarding the published items and then the compiled information is posted to Azure App Insights as Metric and Event.
public class ItemPublishTracker
{
public void PublishEnd(object sender, EventArgs args)
{
try
{
Publisher publisher = Event.ExtractParameter(args, 0) as Publisher;
if (publisher == null)
{
Log.Info("PUBLISH TELEMETRY LOG: Cancel Process: Publisher Data is Null.", this);
}
// if publishing is not on Web Target than do nothing
if (publisher.Options == null ||
publisher.Options.TargetDatabase == null ||
string.IsNullOrEmpty(publisher.Options.TargetDatabase.Name))
{
Log.Info("PUBLISH TELEMETRY LOG: Cancel Process: Publisher.Options Data is Null.", this);
}
Item currentItem = publisher.Options.RootItem;
Job job = JobManager.GetJob(publisher.GetJobName());
var messages = job.Status.Messages;
//Record in Azure Telemetry
TrackPublishMetric(GetUnitsProcessedInfo(messages), publisher.Options.UserName, currentItem.ID.ToString(), publisher.Options.Mode.ToString(), publisher.Options.Deep.ToString(), currentItem.Database.Name, currentItem.Paths.FullPath, publisher.Options.Language.Name, publisher.Options.TargetDatabase.Name);
}
catch (Exception e)
{
Log.Error("PUBLISH TELEMETRY LOG: Could not correctly retrieve the published end item in Sitecore. " + e.ToString(), this);
}
}
private int GetUnitsProcessedInfo(System.Collections.Specialized.StringCollection Messages)
{
int processItems = 0;
foreach (var msg in Messages)
{
var result = Regex.Match(msg, @"\d+$").Value;
int processedNum = 0;
if (int.TryParse(result, out processedNum))
processItems += processedNum;
}
return processItems;
}
private void TrackPublishMetric(int value,string userName, string itemId, string publishMode, string subitems, string databaseName, string itemPath, string publishedLanguage, string targetDatabase)
{
TelemetryClient client = CustomTelemetryService.Initialize();
var publishMetric = new MetricTelemetry("sitecore:publishmetric", value);
publishMetric.Timestamp = DateTime.Now;
var properties = publishMetric.Context.Properties;
properties.Add("UserName", userName);
properties.Add("SitecoreItemID", itemId);
properties.Add("SitecoreItemPath", itemPath);
properties.Add("SitecoreItemLanguage", publishedLanguage);
properties.Add("PublishMode", publishMode);
properties.Add("SubItemsSelected", subitems);
properties.Add("DataBase", databaseName);
properties.Add("TargetDatabase", targetDatabase);
//Sitecore Instance Name
properties.Add("InstanceName", Sitecore.Configuration.Settings.InstanceName);
//Track Metric
client.TrackMetric(publishMetric);
//Track Event
client.TrackEvent("sitecore:publishevent", properties);
}
}
Custom service to initialize Telemetry client using appinsights instrumentation key.
public static class CustomTelemetryService
{
public static TelemetryClient Initialize()
{
TelemetryConfiguration configuration = TelemetryConfiguration.Active;
///Get the instrumentation key from Sitecore Connectionstring settings
configuration.InstrumentationKey = ConfigurationManager.ConnectionStrings["appinsights.instrumentationkey"].ConnectionString;
return new TelemetryClient(configuration);
}
}
Also make sure to register the pipeline.
<?xml version="1.0"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<events>
<event name="publish:end">
<handler type="RD.PublishTelemetry.Events.ItemPublishTracker, RD.PublishTelemetry" method="PublishEnd" />
</event>
</events>
</sitecore>
</configuration>
Metric contains a value parameter through which we can Track the number of items that are published. You can view the metrics using Metric tab in Azure App insights. Using the Metrics drop down, select the metric name provided in the code [ sitecore:publishmetric ]

Event contains a set of properties through which we can track number of publish events that have occurred in Sitecore. We track parameters like Username, Item ID , Item Path , Item Language, Publish Mode, Is Subitems Selected, Database , Target database and Instance Name in order to have complete understanding on publishing event.

Now you can clearly understand publishing activities happening in your Sitecore instance and there will not be any blame-game in case of a wrong publish 😉
In the second part of this article, we shall discuss on how to setup a reporting mechanism in Azure to send information about publishing.