With the ESB Toolkit you get BAM out of the box. There are already two activity definitions created that give information about itineraries that are processed in BizTalk and about Exceptions that occur in BizTalk. You only have to deploy the definitions with the Bm.exe tool to enable BAM tracking so it’s very easy to use BAM with the ESB Toolkit.  
When you deploy the activity definitions are several BAM tables en views created in the BAMPrimaryImport database. They contain very valuable information but the strange thing is that you cannot link the Itineraries data to the Exceptions data. The data is stored in different tables and there is no foreign key to join the tables. This is very unfortunate because now you know for example that an error has occurred in an Itinerary Service but you don’t know in which itinerary. Also if you want to have an overview of the running itineraries you have to link the data because if an exception has occurred in an itinerary that itinerary is not running anymore but you don’t have information about that in the Itineraries data. How can you fix this? By creating a custom Foreign Key!

 

Creating a custom Foreign Key

In the bam_ItineraryServiceActivity_CompletedInstances view you have the InterchangeID that is set by the Messaging Engine for each message that arrives on the Server. In the bam_EsbExceptions_CompletedInstances view you don’t have it but you can use other fields to store it in. The FaultCode field is a suitable candidate because it has the same data type as the InterchangeID and you can set the FaultCode inside an Orchestration when an Exception occurs.

Use the following code to get the InterchangeID and to create a Fault message when an Exception occurs. The data of the Fault message is stored in the EsbExceptionDb database but also in the BAMPrimaryImport database.

// Get Context properties
interchangeID = msgInbound(BTS.InterchangeID);

// Create FaultMessage
msgFault = Microsoft.Practices.ESB.ExceptionHandling.ExceptionMgmt.CreateFaultMessage();

// Set Fault Message Properties
msgFault.Body.FaultCode = interchangeID;

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

 

 

 

 

 

 

 

 

 

 

Retrieving data from multiple tables with SQL Joins

Create a SQL query in SQL Server Management Studio on the BAM views in the BAMPrimaryImport database. Use the InterchangeID and FaultCode fields to link the views.

 

Itineraries With Errors

In the following example are the bam_ItineraryServiceActivity_CompletedInstances view bam_EsbExceptions_CompletedInstances view joined to get an overview of Itineraries with errors.

 

 

 

 
 

Running Itineraries

In the following example are the bam_ItineraryServiceActivity_CompletedInstances view bam_EsbExceptions_CompletedInstances view joined to get an overview of all the running Itineraries.

 

See Also

For more information see:

Using BAM in the ESB Toolkit