Fun with BAM and orchestration execution time
Abstract: I’ve using BAM to measure execution time in some orchestrations. I cannot use HAT because I needed to do some calculations to rest waiting time of the external processes. It’s extremely easy. Things get funny when we needed to get more that one row per orchestration instance (because of loops which are there…)
Today I’ve doing this BAM at a customer’s. I’m going back home in a high velocity train, but it’s a long trip, so I think this post is going to get long… I’ll divide it in 2 parts:
Part 1- The easy sample
The scenario is quite simple: some orchestrations provide a synchronous web service façade for a legacy system. The logic for integration with lecagy includes files interchange, sockets comminications and some transformations from/to Xml and HL7 flat files.
What we want: stress the solution and get detailed information about orchestration execution time. This execution measured time should not include web service communications or file interchange with the legacy system, because the intention is to measure BizTalk performance, regardless of network bandwidth or external dependencies.
Here is the sample:
In the simplified sample (actual processes are a little more complex :-), we must measure time between start (Receive 1) and Send 1, and time between Receive 2 and last send back (Send 2). Time between Send 1 and Receive 2 must be taken away.
All this information is in tracking database, and can be queried at a basic level with HAT. Probably it’s not very complex to query the tracking database to get these values. Since each shape has a start and end time, it’s just a question of making the right queries.
Anyways, as I have only one working day to prepare the environment for the tests, I don’t have time to study the tracking DB internals. I’ve done the easy way: BAM milestones. It’s easy because there’s no need to know about BizTalk internals (tracking db design) and flexible because BAM definitions can be designed and deployed independently to the orchestration development.
So, I’ll show how to do it in just 10 minutes (for the above sample):
1- Create BAM definition with the BAM Structures Mega Designer (aka the little Excel sheet :-). These definitions include 4 Activity Items, all of them as milestones. I’ll not use duration view items to catch intervals, instead I’ll do a Transact/SQL DATEDIFF later.
Time estimated: 3 minutes
2- Export the BAM definition to an Xml file, and deploy it in the server with BAM Management Utility (bm.exe).
Use the Tracking Profile Editor to assign each activity item to orchestration shapes.
Don’t forget to assign an Activity Id, tipically an Id field takes from the message schema.
Deploy the profiles to the server.
Time estimated: 3 minutes
3- Only have 4 minutes left, so I’ll assume there is some test automation :-).
Launch the tests (with NUnit in my case).
Open SQL Server Query Analyzer, connect to the DB server, switch to the BAMPrimaryImport database and open the corresponding BAM view. There you can see the milestones catched.
Now you can calculate execution times with basic date adds and rests. It you want to do it with SQL DATEDIFFs, execute something like this:
SELECT [fields],
DATEDIFF(ms, [Milestone1], [Milestone2]) As Segment1,
DATEDIFF(ms, [Milestone3], [Milestone4]) As Segment2,
(Segment1+Segment2) As TotalTime
Time estimated: 5 minutes (ouch, 1 minute late!)
well, actually the last part is not true… you cannot use Segment1 and Segment2 aliases in the last line, so you’ll need to repeat the DATEDIFF statements. I've included in this way to improve readability.
Also, another nice way to do it is query the standard views with Excel and play with columns and formulas.
Now we are ready to launch stress tests and query orchestration execution times easily. The stress tests will be launched via Application Center Test, so we can control concurrent users, test timing, etc.
Part 2- I have a Loop and BAM Activity items cannot be assigned
The second orchestration has been more tricky. It’s a 1-to-many façade, so it has a loop to send many messages to the legacy systems. Something like:
The problem: Activity items cannot be assigned to shapes inside the loop. Why? because each activity item is a row, and the Activity Id is taken from a message field that is unique for the orchestration.
The solution: use the API to add new BAM rows for each loop iteration. The Activity Id of each child-row will be the parent Activity Id plus the counter of the loop, so they can be related easily in a query.
The BAM API is very straightforward. One object, three methods: The EventStream object is used to create a new activity (BeginActivity method), update rows (UpdateActivity) of close the activity (EndActivity).
You can use a DirectEventStream object that writes the data in the BAMPrimaryImport database directly. This can impact the performance because it’s synchronous.
You can either use the BufferedEventStream object that use a asynchronous store-and-forward. It does not guarantee that the event will be inserted in BAM immediately, but it does not affect caller performance.
Here is the tricky thing: There is a property called ConnectionString that points to the database. If you use the DirectEventStream, ConnectionString points to BAMPrimaryImport database. But if you use BufferedEventStream, its ConnectionString points to the MessageBox database, because it’s used for store-and-forward.
My code between the orchestration and a helper component does more or less the following:
For each loop iteration:
- Begin an new Activity, using [ActivityId].[LoopCounter]
- Update with a milestone before sending to legacy
- Update with a milestone after receiving from legacy
- Close the Activity
So, for each orchestration instance, I have in the BAM database:
- One row with
- Orchestration Activity Id
- Milestones for BeginOrch and EndOrch
- Many “child” rows (the loop) with
- Orchestration Activity Id + Counter
- Milestones for BeginSend and EndReceive
The query to aggregate everything (courtesy of eXtreme.net, because I don’t have quick Transact/SQL skills), return a single row with the calculated fields for TotalTime and TotalTimeWithoutLegacyStuff. It uses DATEDIFF for the differences, and SUBSTRING to relate different parent and child Activity IDs
Comments
Anonymous
September 09, 2005
Its good one. Are you maintining two activity tables (like parent and child) with two milestone or, only one activity with two milestone, where you update both parent and child rows in the same activity table.Anonymous
March 21, 2006
Your site is very informational for me. Nice work.Anonymous
April 17, 2006
Welcome!!! http://www.areaseo.com/contacts/">http://www.areaseo.com/contacts/ google pr. [URL=http://www.areaseo.com]pagerank 5[/URL]: Search Engine Optimization, Professional SEO, pagerank algorithm. Also [url=http://www.areaseo.com]online pr16[/url] from google pr .Anonymous
April 17, 2006
hello! http://www.areaseo.com/contacts/ google pr. Search Engine Optimization, Professional SEO, pagerank algorithm. From google pr .Anonymous
April 24, 2006
The comment has been removedAnonymous
April 24, 2006
The comment has been removedAnonymous
April 24, 2006
online directory mainAnonymous
June 04, 2006
i like your website very much but please do get us more information about itAnonymous
November 05, 2006
Really great site <a href="http://used-cars.ppkkj.info">used cars</a>Anonymous
November 15, 2006
BizTalk, EAI, BPM, SO/A and related technologies I do not agree. Go to http://www.bookshotel.info/polygeny_Germany/homicidal_Baden-W%C3%BCrttemberg/doyen_Stuttgart_1.htmlAnonymous
November 24, 2006
The comment has been removedAnonymous
December 04, 2006
BizTalk, EAI, BPM, SO/A and related technologies I do not agree. Go to http://www.hotelscare.info/virulent_United%20Kingdom/heliochromy_Wales/ordinand_Llandudno_1.htmlAnonymous
December 06, 2006
Nice site... http://cingular-wireless-customer-service.pivppp.info <a href=http://cingular-wireless-customer-service.pivppp.info > cingular wireless customer service </a> [url=http://cingular-wireless-customer-service.pivppp.info ] cingular wireless customer service [/url]Anonymous
December 11, 2006
Really great site <a href=" http://hosting.blogpostworld.org "> hosting</a>Anonymous
December 13, 2006
I just don't have much to say recently, but whatever. <a href='http://web-hosting.blogpostworld.org/best-web-hosting-company.html'>best web hosting company</a>Anonymous
December 17, 2006
When all else fails, read the instructions <a href=' http://astrology.blogpostworld.org/astrology-compatibility-chart.html '>astrology compatibility chart</a>[url=http://astrology.blogpostworld.org/astrology-compatibility-chart.html]astrology compatibility chart[/url]Anonymous
December 24, 2006
<a href=" http://groups-beta.google.com/group/bestpills/web/HoodiaDietPills.html ">Hoodia Diet Pills</a> [url=http://groups-beta.google.com/group/bestpills/web/HoodiaDietPills.html]Hoodia Diet Pills[/url]Anonymous
January 29, 2007
BizTalk, EAI, BPM, SO/A and related technologies I do not agree. Go to http://www.businesszs.info/unbraid_Greece/ore_Aegean%20Islands/stink_Thira_1.htmlAnonymous
February 13, 2007
Nice site <a href= http://tsbgyk3q.tripod.com/donate-used-car/car-donate-infocus-used.html >car donate infocus used</a>Anonymous
February 23, 2007
Nice site <a href= http://used-car-phoenix.cashwits.org/map.html >car used</a>Anonymous
March 21, 2007
BizTalk, EAI, BPM, SO/A and related technologies I do not agree. Go to http://www.jobznews.info/eldest_Czech%20Republic/astral_West%20Czech/yack_Prague_1.htmlAnonymous
March 28, 2007
BizTalk, EAI, BPM, SO/A and related technologies I do not agree. Go to http://www.globalworkz.info/wot_Republic%20of%20Ireland/guy_Munster/stroma_Limerick_1.htmlAnonymous
March 29, 2007
BizTalk, EAI, BPM, SO/A and related technologies I do not agree. Go to http://www.jobzworks.infoAnonymous
April 01, 2007
Nice site <a href="http://tradewits.org/dog-food-natural ">dog food natural</a>Anonymous
April 07, 2007
Nice site <a href=" http://zr2d4nmn.tripod.com/buy-online-wii "> buy online wii</a>Anonymous
April 15, 2007
Stupore! Amo questo luogo!:)))))))Anonymous
April 16, 2007
pagine piuttosto informative, piacevoli =)Anonymous
April 18, 2007
The Best Catalog. <a href=http://healthpiece.info/>Real">http://healthpiece.info/>Real Catalog</a>[url=http://healthpiece.info/]The Real Catalog[/url]Anonymous
April 18, 2007
The Best Catalog. <a href=http://healthpiece.info/>Real">http://healthpiece.info/>Real Catalog</a>[url=http://healthpiece.info/]The Real Catalog[/url]Anonymous
June 16, 2007
Hi everybody! Wanna see my cool pages? Visit my sites, please:Anonymous
December 29, 2007
PingBack from http://cars.oneadayvitamin.info/?p=635Anonymous
March 12, 2008
PingBack from http://boxingfightblog.info/david-hurtados-integration-traces-fun-with-bam-and-orchestration/Anonymous
March 12, 2008
PingBack from http://boxingcarsblog.info/david-hurtados-integration-traces-fun-with-bam-and-orchestration/Anonymous
March 16, 2008
PingBack from http://carsmaxblog.info/david-hurtados-integration-traces-fun-with-bam-and-orchestration/Anonymous
March 31, 2008
PingBack from http://collegefunfactsblog.info/david-hurtados-integration-traces-fun-with-bam-and-orchestration/Anonymous
August 03, 2008
<a href= http://index1.akkunt.com >2005 north carolina storm damage</a> <a href= http://index2.akkunt.com >golf at wailea emerald course</a> <a href= http://index3.akkunt.com >custom embroydery patches</a> <a href= http://index4.akkunt.com >george washington 500 000 loan from penn farmer</a> <a href= http://index5.akkunt.com >david horn</a>Anonymous
December 16, 2008
PingBack from http://www.baby-parenting.com/family/child_activity.htmlAnonymous
December 16, 2008
PingBack from http://www.baby-parenting.com/family/child_activity.htmlAnonymous
June 12, 2009
PingBack from http://greenteafatburner.info/story.php?id=870Anonymous
June 16, 2009
PingBack from http://fixmycrediteasily.info/story.php?id=11206